summaryrefslogtreecommitdiff
path: root/src/chanserv.c
diff options
context:
space:
mode:
authorrob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-05-02 19:02:12 +0000
committerrob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864>2005-05-02 19:02:12 +0000
commite0583918834a3f8683e430adf3923ea89d2a449a (patch)
treeff36ada734c3874d3be1a806e3a2b994386b54ed /src/chanserv.c
parent49491770383e66f1b8074d8b0f80026e3086e9d8 (diff)
BUILD : 1.7.8 (753) BUGS : N/a NOTES : Merged anope-dev with trunk
git-svn-id: svn://svn.anope.org/anope/trunk@753 31f1291d-b8d6-0310-a050-a5561fc1590b git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@516 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/chanserv.c')
-rw-r--r--src/chanserv.c4064
1 files changed, 15 insertions, 4049 deletions
diff --git a/src/chanserv.c b/src/chanserv.c
index 6ee7d0056..4d197770e 100644
--- a/src/chanserv.c
+++ b/src/chanserv.c
@@ -102,7 +102,7 @@ LevelInfo levelinfo[] = {
{ CA_SAY, "SAY", CHAN_LEVEL_SAY },
{ -1 }
};
-static int levelinfo_maxwidth = 0;
+int levelinfo_maxwidth = 0;
CSModeUtil csmodeutils[] = {
{ "DEOP", "!deop", "-o", CI_OPNOTICE, CA_OPDEOP, CA_OPDEOPME },
@@ -116,207 +116,20 @@ CSModeUtil csmodeutils[] = {
{ NULL }
};
-int xop_msgs[4][14] = {
- { CHAN_AOP_SYNTAX,
- CHAN_AOP_DISABLED,
- CHAN_AOP_NICKS_ONLY,
- CHAN_AOP_ADDED,
- CHAN_AOP_MOVED,
- CHAN_AOP_NO_SUCH_ENTRY,
- CHAN_AOP_NOT_FOUND,
- CHAN_AOP_NO_MATCH,
- CHAN_AOP_DELETED,
- CHAN_AOP_DELETED_ONE,
- CHAN_AOP_DELETED_SEVERAL,
- CHAN_AOP_LIST_EMPTY,
- CHAN_AOP_LIST_HEADER,
- CHAN_AOP_CLEAR
- },
- { CHAN_SOP_SYNTAX,
- CHAN_SOP_DISABLED,
- CHAN_SOP_NICKS_ONLY,
- CHAN_SOP_ADDED,
- CHAN_SOP_MOVED,
- CHAN_SOP_NO_SUCH_ENTRY,
- CHAN_SOP_NOT_FOUND,
- CHAN_SOP_NO_MATCH,
- CHAN_SOP_DELETED,
- CHAN_SOP_DELETED_ONE,
- CHAN_SOP_DELETED_SEVERAL,
- CHAN_SOP_LIST_EMPTY,
- CHAN_SOP_LIST_HEADER,
- CHAN_SOP_CLEAR
- },
- { CHAN_VOP_SYNTAX,
- CHAN_VOP_DISABLED,
- CHAN_VOP_NICKS_ONLY,
- CHAN_VOP_ADDED,
- CHAN_VOP_MOVED,
- CHAN_VOP_NO_SUCH_ENTRY,
- CHAN_VOP_NOT_FOUND,
- CHAN_VOP_NO_MATCH,
- CHAN_VOP_DELETED,
- CHAN_VOP_DELETED_ONE,
- CHAN_VOP_DELETED_SEVERAL,
- CHAN_VOP_LIST_EMPTY,
- CHAN_VOP_LIST_HEADER,
- CHAN_VOP_CLEAR
- },
- { CHAN_HOP_SYNTAX,
- CHAN_HOP_DISABLED,
- CHAN_HOP_NICKS_ONLY,
- CHAN_HOP_ADDED,
- CHAN_HOP_MOVED,
- CHAN_HOP_NO_SUCH_ENTRY,
- CHAN_HOP_NOT_FOUND,
- CHAN_HOP_NO_MATCH,
- CHAN_HOP_DELETED,
- CHAN_HOP_DELETED_ONE,
- CHAN_HOP_DELETED_SEVERAL,
- CHAN_HOP_LIST_EMPTY,
- CHAN_HOP_LIST_HEADER,
- CHAN_HOP_CLEAR
- }
-};
-
/* *INDENT-ON* */
/*************************************************************************/
void alpha_insert_chan(ChannelInfo * ci);
-static ChannelInfo *makechan(const char *chan);
+ChannelInfo *makechan(const char *chan);
int delchan(ChannelInfo * ci);
void reset_levels(ChannelInfo * ci);
-static int is_identified(User * user, ChannelInfo * ci);
-static void make_unidentified(User * u, ChannelInfo * ci);
-
-static int do_help(User * u);
-static int do_register(User * u);
-static int do_identify(User * u);
-static int do_logout(User * u);
-static int do_drop(User * u);
-static int do_set(User * u);
-static int do_set_founder(User * u, ChannelInfo * ci, char *param);
-static int do_set_successor(User * u, ChannelInfo * ci, char *param);
-static int do_set_password(User * u, ChannelInfo * ci, char *param);
-static int do_set_desc(User * u, ChannelInfo * ci, char *param);
-static int do_set_url(User * u, ChannelInfo * ci, char *param);
-static int do_set_email(User * u, ChannelInfo * ci, char *param);
-static int do_set_entrymsg(User * u, ChannelInfo * ci, char *param);
-static int do_set_bantype(User * u, ChannelInfo * ci, char *param);
-static int do_set_mlock(User * u, ChannelInfo * ci, char *param);
-static int do_set_keeptopic(User * u, ChannelInfo * ci, char *param);
-static int do_set_topiclock(User * u, ChannelInfo * ci, char *param);
-static int do_set_private(User * u, ChannelInfo * ci, char *param);
-static int do_set_secureops(User * u, ChannelInfo * ci, char *param);
-static int do_set_securefounder(User * u, ChannelInfo * ci, char *param);
-static int do_set_restricted(User * u, ChannelInfo * ci, char *param);
-static int do_set_secure(User * u, ChannelInfo * ci, char *param);
-static int do_set_signkick(User * u, ChannelInfo * ci, char *param);
-static int do_set_opnotice(User * u, ChannelInfo * ci, char *param);
-static int do_set_xop(User * u, ChannelInfo * ci, char *param);
-static int do_set_peace(User * u, ChannelInfo * ci, char *param);
-static int do_set_noexpire(User * u, ChannelInfo * ci, char *param);
-static int do_xop(User * u, char *xname, int xlev, int *xmsgs);
-static int do_aop(User * u);
-static int do_hop(User * u);
-static int do_sop(User * u);
-static int do_vop(User * u);
-static int do_access(User * u);
-static int do_akick(User * u);
-static int do_info(User * u);
-static int do_list(User * u);
-static int do_invite(User * u);
-static int do_levels(User * u);
-static int do_util(User * u, CSModeUtil * util);
-static int do_op(User * u);
-static int do_deop(User * u);
-static int do_voice(User * u);
-static int do_devoice(User * u);
-static int do_halfop(User * u);
-static int do_dehalfop(User * u);
-static int do_protect(User * u);
-static int do_deprotect(User * u);
-static int do_owner(User * u);
-static int do_deowner(User * u);
-static int do_cs_kick(User * u);
-static int do_ban(User * u);
-static int do_cs_topic(User * u);
-static int do_unban(User * u);
-static int do_clear(User * u);
-static int do_getkey(User * u);
-static int do_getpass(User * u);
-static int do_sendpass(User * u);
-static int do_forbid(User * u);
-static int do_suspend(User * u);
-static int do_unsuspend(User * u);
-static int do_status(User * u);
+int is_identified(User * user, ChannelInfo * ci);
+
void moduleAddChanServCmds(void);
/*************************************************************************/
/* *INDENT-OFF* */
void moduleAddChanServCmds(void) {
- Command *c;
- c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("REGISTER", do_register, NULL, CHAN_HELP_REGISTER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("IDENTIFY", do_identify, NULL, CHAN_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("LOGOUT", do_logout, NULL, -1,CHAN_HELP_LOGOUT, -1,CHAN_SERVADMIN_HELP_LOGOUT, CHAN_SERVADMIN_HELP_LOGOUT); addCoreCommand(CHANSERV,c);
- c = createCommand("DROP", do_drop, NULL, -1,CHAN_HELP_DROP, -1,CHAN_SERVADMIN_HELP_DROP, CHAN_SERVADMIN_HELP_DROP); addCoreCommand(CHANSERV,c);
- c = createCommand("SET", do_set, NULL, CHAN_HELP_SET,-1, -1,CHAN_SERVADMIN_HELP_SET, CHAN_SERVADMIN_HELP_SET); addCoreCommand(CHANSERV,c);
- c = createCommand("SET FOUNDER", NULL, NULL, CHAN_HELP_SET_FOUNDER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET SUCCESSOR", NULL, NULL, CHAN_HELP_SET_SUCCESSOR, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET PASSWORD", NULL, NULL, CHAN_HELP_SET_PASSWORD, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET DESC", NULL, NULL, CHAN_HELP_SET_DESC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET URL", NULL, NULL, CHAN_HELP_SET_URL, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET EMAIL", NULL, NULL, CHAN_HELP_SET_EMAIL, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET ENTRYMSG", NULL, NULL, CHAN_HELP_SET_ENTRYMSG, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET BANTYPE", NULL, NULL, CHAN_HELP_SET_BANTYPE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET PRIVATE", NULL, NULL, CHAN_HELP_SET_PRIVATE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET KEEPTOPIC", NULL, NULL, CHAN_HELP_SET_KEEPTOPIC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET TOPICLOCK", NULL, NULL, CHAN_HELP_SET_TOPICLOCK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET MLOCK", NULL, NULL, CHAN_HELP_SET_MLOCK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET RESTRICTED", NULL, NULL, CHAN_HELP_SET_RESTRICTED, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET SECURE", NULL, NULL, CHAN_HELP_SET_SECURE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET SECUREOPS", NULL, NULL, CHAN_HELP_SET_SECUREOPS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET SECUREFOUNDER", NULL, NULL, CHAN_HELP_SET_SECUREFOUNDER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET SIGNKICK", NULL, NULL, CHAN_HELP_SET_SIGNKICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET OPNOTICE", NULL, NULL, CHAN_HELP_SET_OPNOTICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET XOP", NULL, NULL, CHAN_HELP_SET_XOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET PEACE", NULL, NULL, CHAN_HELP_SET_PEACE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1, -1,CHAN_SERVADMIN_HELP_SET_NOEXPIRE,CHAN_SERVADMIN_HELP_SET_NOEXPIRE); addCoreCommand(CHANSERV,c);
- c = createCommand("AOP", do_aop, NULL, CHAN_HELP_AOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("HOP", do_hop, NULL, CHAN_HELP_HOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SOP", do_sop, NULL, CHAN_HELP_SOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("VOP", do_vop, NULL, CHAN_HELP_VOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("ACCESS", do_access, NULL, CHAN_HELP_ACCESS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("ACCESS LEVELS", NULL, NULL, CHAN_HELP_ACCESS_LEVELS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("AKICK", do_akick, NULL, CHAN_HELP_AKICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("LEVELS", do_levels, NULL, CHAN_HELP_LEVELS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("INFO", do_info, NULL, CHAN_HELP_INFO,-1, CHAN_SERVADMIN_HELP_INFO, CHAN_SERVADMIN_HELP_INFO,CHAN_SERVADMIN_HELP_INFO); addCoreCommand(CHANSERV,c);
- c = createCommand("LIST", do_list, NULL, -1,CHAN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST,CHAN_SERVADMIN_HELP_LIST, CHAN_SERVADMIN_HELP_LIST); addCoreCommand(CHANSERV,c);
- c = createCommand("OP", do_op, NULL, CHAN_HELP_OP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("DEOP", do_deop, NULL, CHAN_HELP_DEOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("VOICE", do_voice, NULL, CHAN_HELP_VOICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("DEVOICE", do_devoice, NULL, CHAN_HELP_DEVOICE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("HALFOP", do_halfop, NULL, CHAN_HELP_HALFOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("DEHALFOP", do_dehalfop, NULL, CHAN_HELP_DEHALFOP, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("PROTECT", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("DEPROTECT",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("OWNER", do_owner, NULL, CHAN_HELP_OWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("DEOWNER", do_deowner, NULL, CHAN_HELP_DEOWNER, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("ADMIN", do_protect, NULL, CHAN_HELP_PROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("DEADMIN",do_deprotect,NULL, CHAN_HELP_DEPROTECT, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("KICK", do_cs_kick, NULL, CHAN_HELP_KICK, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("BAN", do_ban, NULL, CHAN_HELP_BAN, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("TOPIC", do_cs_topic, NULL, CHAN_HELP_TOPIC, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("INVITE", do_invite, NULL, CHAN_HELP_INVITE, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("UNBAN", do_unban, NULL, CHAN_HELP_UNBAN, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("CLEAR", do_clear, NULL, CHAN_HELP_CLEAR, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("GETKEY", do_getkey, NULL, CHAN_HELP_GETKEY, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("SENDPASS", do_sendpass, NULL, CHAN_HELP_SENDPASS, -1,-1,-1,-1); addCoreCommand(CHANSERV,c);
- c = createCommand("GETPASS", do_getpass, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_GETPASS, CHAN_SERVADMIN_HELP_GETPASS); addCoreCommand(CHANSERV,c);
- c = createCommand("FORBID", do_forbid, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_FORBID, CHAN_SERVADMIN_HELP_FORBID); addCoreCommand(CHANSERV,c);
- c = createCommand("SUSPEND", do_suspend, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_SUSPEND, CHAN_SERVADMIN_HELP_SUSPEND); addCoreCommand(CHANSERV,c);
- c = createCommand("UNSUSPEND",do_unsuspend, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_UNSUSPEND, CHAN_SERVADMIN_HELP_UNSUSPEND); addCoreCommand(CHANSERV,c);
- c = createCommand("STATUS", do_status, is_services_admin, -1, -1, -1, CHAN_SERVADMIN_HELP_STATUS, CHAN_SERVADMIN_HELP_STATUS); addCoreCommand(CHANSERV,c);
+ modules_core_init(ChanServCoreNumber, ChanServCoreModules);
}
/* *INDENT-ON* */
@@ -325,7 +138,7 @@ void moduleAddChanServCmds(void) {
/* Returns modes for mlock in a nice way. */
-static char *get_mlock_modes(ChannelInfo * ci, int complete)
+char *get_mlock_modes(ChannelInfo * ci, int complete)
{
static char res[BUFSIZE];
@@ -1739,18 +1552,21 @@ void record_topic(const char *chan)
if (readonly)
return;
+
c = findchan(chan);
if (!c || !(ci = c->ci))
return;
+
if (ci->last_topic)
free(ci->last_topic);
+
if (c->topic)
ci->last_topic = sstrdup(c->topic);
else
ci->last_topic = NULL;
+
strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX);
ci->last_topic_time = c->topic_time;
- send_event(EVENT_TOPIC_UPDATED, chan);
}
/*************************************************************************/
@@ -1883,7 +1699,7 @@ void expire_chans()
next = ci->next;
if (!ci->c && now - ci->last_used >= CSExpire
&& !(ci->flags & (CI_VERBOTEN | CI_NO_EXPIRE))) {
- send_event(EVENT_CHAN_EXPIRE, ci->name);
+ send_event(EVENT_CHAN_EXPIRE, 1, ci->name);
alog("Expiring channel %s (founder: %s)", ci->name,
(ci->founder ? ci->founder->display : "(none)"));
delchan(ci);
@@ -2092,7 +1908,7 @@ void alpha_insert_chan(ChannelInfo * ci)
* structure if the channel was successfully registered, NULL otherwise.
* Assumes channel does not already exist. */
-static ChannelInfo *makechan(const char *chan)
+ChannelInfo *makechan(const char *chan)
{
int i;
ChannelInfo *ci;
@@ -2322,7 +2138,7 @@ int is_real_founder(User * user, ChannelInfo * ci)
/* Has the given user password-identified as founder for the channel? */
-static int is_identified(User * user, ChannelInfo * ci)
+int is_identified(User * user, ChannelInfo * ci)
{
struct u_chaninfolist *c;
@@ -2437,29 +2253,6 @@ int get_idealban(ChannelInfo * ci, User * u, char *ret, int retlen)
/*************************************************************************/
-static void make_unidentified(User * u, ChannelInfo * ci)
-{
- struct u_chaninfolist *uci;
-
- if (!u || !ci)
- return;
-
- for (uci = u->founder_chans; uci; uci = uci->next) {
- if (uci->chan == ci) {
- if (uci->next)
- uci->next->prev = uci->prev;
- if (uci->prev)
- uci->prev->next = uci->next;
- else
- u->founder_chans = uci->next;
- free(uci);
- break;
- }
- }
-}
-
-/*************************************************************************/
-
char *cs_get_flood(ChannelInfo * ci)
{
if (!ci) {
@@ -2544,7 +2337,7 @@ void cs_set_key(ChannelInfo * ci, char *value)
if (value && *value != ':' && !strchr(value, ',')) {
ci->mlock_key = sstrdup(value);
} else {
- ci->mlock_on &= ~CMODE_k;
+ ci->mlock_on &= ~anope_get_key_mode();
ci->mlock_key = NULL;
}
}
@@ -2560,7 +2353,7 @@ void cs_set_limit(ChannelInfo * ci, char *value)
ci->mlock_limit = value ? strtoul(value, NULL, 10) : 0;
if (ci->mlock_limit <= 0)
- ci->mlock_on &= ~CMODE_l;
+ ci->mlock_on &= ~anope_get_limit_mode();
}
/*************************************************************************/
@@ -2634,1019 +2427,8 @@ char *get_xop_level(int level)
/*********************** ChanServ command routines ***********************/
/*************************************************************************/
-static int do_help(User * u)
-{
- char *cmd = strtok(NULL, "");
-
- if (!cmd) {
- notice_help(s_ChanServ, u, CHAN_HELP);
- if (ircd->extrahelp) {
- notice_help(s_ChanServ, u, ircd->extrahelp);
- }
- if (CSExpire >= 86400)
- notice_help(s_ChanServ, u, CHAN_HELP_EXPIRES,
- CSExpire / 86400);
- if (is_services_oper(u))
- notice_help(s_ChanServ, u, CHAN_SERVADMIN_HELP);
- moduleDisplayHelp(2, u);
- } else if (stricmp(cmd, "LEVELS DESC") == 0) {
- int i;
- notice_help(s_ChanServ, u, CHAN_HELP_LEVELS_DESC);
- if (!levelinfo_maxwidth) {
- for (i = 0; levelinfo[i].what >= 0; i++) {
- int len = strlen(levelinfo[i].name);
- if (len > levelinfo_maxwidth)
- levelinfo_maxwidth = len;
- }
- }
- for (i = 0; levelinfo[i].what >= 0; i++) {
- notice_help(s_ChanServ, u, CHAN_HELP_LEVELS_DESC_FORMAT,
- levelinfo_maxwidth, levelinfo[i].name,
- getstring(u->na, levelinfo[i].desc));
- }
- } else {
- mod_help_cmd(s_ChanServ, u, CHANSERV, cmd);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_register(User * u)
-{
- char *chan = strtok(NULL, " ");
- char *pass = strtok(NULL, " ");
- char *desc = strtok(NULL, "");
- NickCore *nc;
- Channel *c;
- ChannelInfo *ci;
- struct u_chaninfolist *uc;
- int is_servadmin = is_services_admin(u);
-#ifdef USE_ENCRYPTION
- char founderpass[PASSMAX + 1];
-#endif
-
- if (readonly) {
- notice_lang(s_ChanServ, u, CHAN_REGISTER_DISABLED);
- return MOD_CONT;
- }
-
- if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) {
- notice_lang(s_ChanServ, u, OPER_DEFCON_DENIED);
- return MOD_CONT;
- }
-
- if (!desc) {
- syntax_error(s_ChanServ, u, "REGISTER", CHAN_REGISTER_SYNTAX);
- } else if (*chan == '&') {
- notice_lang(s_ChanServ, u, CHAN_REGISTER_NOT_LOCAL);
- } else if (*chan != '#') {
- notice_lang(s_ChanServ, u, CHAN_SYMBOL_REQUIRED);
- } else if (!u->na || !(nc = u->na->nc)) {
- notice_lang(s_ChanServ, u, CHAN_MUST_REGISTER_NICK, s_NickServ);
- } else if (!nick_recognized(u)) {
- notice_lang(s_ChanServ, u, CHAN_MUST_IDENTIFY_NICK, s_NickServ,
- s_NickServ);
- } else if (!(c = findchan(chan))) {
- notice_lang(s_ChanServ, u, CHAN_REGISTER_NONE_CHANNEL, chan);
- } else if ((ci = cs_findchan(chan)) != NULL) {
- if (ci->flags & CI_VERBOTEN) {
- alog("%s: Attempt to register FORBIDden channel %s by %s!%s@%s", s_ChanServ, ci->name, u->nick, u->username, u->host);
- notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan);
- } else {
- notice_lang(s_ChanServ, u, CHAN_ALREADY_REGISTERED, chan);
- }
- } else if (!stricmp(chan, "#")) {
- notice_lang(s_ChanServ, u, CHAN_MAY_NOT_BE_REGISTERED, chan);
- } else if (!chan_has_user_status(c, u, CUS_OP)) {
- notice_lang(s_ChanServ, u, CHAN_MUST_BE_CHANOP);
-
- } else if (!is_servadmin && nc->channelmax > 0
- && nc->channelcount >= nc->channelmax) {
- notice_lang(s_ChanServ, u,
- nc->channelcount >
- nc->
- channelmax ? CHAN_EXCEEDED_CHANNEL_LIMIT :
- CHAN_REACHED_CHANNEL_LIMIT, nc->channelmax);
- } else if (stricmp(u->nick, pass) == 0
- || (StrictPasswords && strlen(pass) < 5)) {
- notice_lang(s_ChanServ, u, MORE_OBSCURE_PASSWORD);
- } else if (!(ci = makechan(chan))) {
- alog("%s: makechan() failed for REGISTER %s", s_ChanServ, chan);
- notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED);
-
-#ifdef USE_ENCRYPTION
- } else if (strscpy(founderpass, pass, PASSMAX + 1),
- encrypt_in_place(founderpass, PASSMAX) < 0) {
- alog("%s: Couldn't encrypt password for %s (REGISTER)",
- s_ChanServ, chan);
- notice_lang(s_ChanServ, u, CHAN_REGISTRATION_FAILED);
- delchan(ci);
-#endif
-
- } else {
- c->ci = ci;
- ci->c = c;
- ci->bantype = CSDefBantype;
- ci->flags = CSDefFlags;
- ci->mlock_on = ircd->defmlock;
- ci->memos.memomax = MSMaxMemos;
- ci->last_used = ci->time_registered;
- ci->founder = nc;
-#ifdef USE_ENCRYPTION
- if (strlen(pass) > PASSMAX)
- notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX);
- memset(pass, 0, strlen(pass));
- memcpy(ci->founderpass, founderpass, PASSMAX);
- ci->flags |= CI_ENCRYPTEDPW;
-#else
- if (strlen(pass) > PASSMAX - 1) /* -1 for null byte */
- notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX - 1);
- strscpy(ci->founderpass, pass, PASSMAX);
-#endif
- ci->desc = sstrdup(desc);
- if (c->topic) {
- ci->last_topic = sstrdup(c->topic);
- strscpy(ci->last_topic_setter, c->topic_setter, NICKMAX);
- ci->last_topic_time = c->topic_time;
- } else {
- /* Set this to something, otherwise it will maliform the topic */
- strscpy(ci->last_topic_setter, s_ChanServ, NICKMAX);
- }
- ci->bi = NULL;
- ci->botflags = BSDefFlags;
- ci->founder->channelcount++;
- alog("%s: Channel '%s' registered by %s!%s@%s", s_ChanServ, chan,
- u->nick, u->username, u->host);
- notice_lang(s_ChanServ, u, CHAN_REGISTERED, chan, u->nick);
-#ifndef USE_ENCRYPTION
- notice_lang(s_ChanServ, u, CHAN_PASSWORD_IS, ci->founderpass);
-#endif
- uc = scalloc(sizeof(*uc), 1);
- uc->next = u->founder_chans;
- uc->prev = NULL;
- if (u->founder_chans)
- u->founder_chans->prev = uc;
- u->founder_chans = uc;
- uc->chan = ci;
- /* Implement new mode lock */
- check_modes(c);
- /* On most ircds you do not receive the admin/owner mode till its registered */
- if (ircd->admin) {
- anope_cmd_mode(s_ChanServ, chan, "%s %s", ircd->adminset,
- u->nick);
- }
- if (ircd->owner && ircd->ownerset) {
- anope_cmd_mode(s_ChanServ, chan, "%s %s", ircd->ownerset,
- u->nick);
- }
- send_event(EVENT_CHAN_REGISTERED, chan);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_identify(User * u)
-{
- char *chan = strtok(NULL, " ");
- char *pass = strtok(NULL, " ");
- ChannelInfo *ci;
- struct u_chaninfolist *uc;
-
- if (!pass) {
- syntax_error(s_ChanServ, u, "IDENTIFY", CHAN_IDENTIFY_SYNTAX);
- } else if (!(ci = cs_findchan(chan))) {
- notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
- } else if (ci->flags & CI_VERBOTEN) {
- notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
- } else if (!nick_identified(u)) {
- notice_lang(s_ChanServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else if (is_founder(u, ci)) {
- notice_lang(s_ChanServ, u, NICK_ALREADY_IDENTIFIED);
- } else {
- int res;
-
- if ((res = check_password(pass, ci->founderpass)) == 1) {
- if (!is_identified(u, ci)) {
- uc = scalloc(sizeof(*uc), 1);
- uc->next = u->founder_chans;
- if (u->founder_chans)
- u->founder_chans->prev = uc;
- u->founder_chans = uc;
- uc->chan = ci;
- alog("%s: %s!%s@%s identified for %s", s_ChanServ, u->nick,
- u->username, u->host, ci->name);
- }
-
- notice_lang(s_ChanServ, u, CHAN_IDENTIFY_SUCCEEDED, chan);
- } else if (res < 0) {
- alog("%s: check_password failed for %s", s_ChanServ, ci->name);
- notice_lang(s_ChanServ, u, CHAN_IDENTIFY_FAILED);
- } else {
- alog("%s: Failed IDENTIFY for %s by %s!%s@%s",
- s_ChanServ, ci->name, u->nick, u->username, u->host);
- notice_lang(s_ChanServ, u, PASSWORD_INCORRECT);
- bad_password(u);
- }
-
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_logout(User * u)
-{
- char *chan = strtok(NULL, " ");
- char *nick = strtok(NULL, " ");
- ChannelInfo *ci;
- User *u2 = NULL;
- int is_servadmin = is_services_admin(u);
-
- if (!chan || (!nick && !is_servadmin)) {
- syntax_error(s_ChanServ, u, "LOGOUT",
- (!is_servadmin ? CHAN_LOGOUT_SYNTAX :
- CHAN_LOGOUT_SERVADMIN_SYNTAX));
- } else if (!(ci = cs_findchan(chan))) {
- notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
- } else if (!is_servadmin && (ci->flags & CI_VERBOTEN)) {
- notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
- } else if (nick && !(u2 = finduser(nick))) {
- notice_lang(s_ChanServ, u, NICK_X_NOT_IN_USE, nick);
- } else if (!is_servadmin && u2 != u && !is_real_founder(u, ci)) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else {
- if (u2) {
- make_unidentified(u2, ci);
- notice_lang(s_ChanServ, u, CHAN_LOGOUT_SUCCEEDED, nick, chan);
- alog("%s: User %s!%s@%s has been logged out of channel %s.",
- s_ChanServ, u2->nick, u2->username, u2->host, chan);
- } else {
- int i;
- for (i = 0; i < 1024; i++)
- for (u2 = userlist[i]; u2; u2 = u2->next)
- make_unidentified(u2, ci);
- notice_lang(s_ChanServ, u, CHAN_LOGOUT_ALL_SUCCEEDED, chan);
- alog("%s: All users identified have been logged out of channel %s.", s_ChanServ, chan);
- }
-
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_drop(User * u)
-{
- char *chan = strtok(NULL, " ");
- ChannelInfo *ci;
- int is_servadmin = is_services_admin(u);
-
- if (readonly && !is_servadmin) {
- notice_lang(s_ChanServ, u, CHAN_DROP_DISABLED);
- return MOD_CONT;
- }
-
- if (!chan) {
- syntax_error(s_ChanServ, u, "DROP", CHAN_DROP_SYNTAX);
- } else if (!(ci = cs_findchan(chan))) {
- notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
- } else if (!is_servadmin && (ci->flags & CI_VERBOTEN)) {
- notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
- } else if (!is_servadmin && (ci->flags & CI_SUSPENDED)) {
- notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
- } else if (!is_servadmin
- && (ci->
- flags & CI_SECUREFOUNDER ? !is_real_founder(u,
- ci) :
- !is_founder(u, ci))) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else {
- int level = get_access(u, ci);
-
- if (readonly) /* in this case we know they're a Services admin */
- notice_lang(s_ChanServ, u, READ_ONLY_MODE);
-
- if (ci->c) {
- if (ircd->regmode) {
- ci->c->mode &= ~ircd->regmode;
- anope_cmd_mode(whosends(ci), ci->name, "-r");
- }
- }
-
- if (ircd->chansqline && (ci->flags & CI_VERBOTEN)) {
- anope_cmd_unsqline(ci->name);
- }
-
- alog("%s: Channel %s dropped by %s!%s@%s (founder: %s)",
- s_ChanServ, ci->name, u->nick, u->username,
- u->host, (ci->founder ? ci->founder->display : "(none)"));
-
- delchan(ci);
-
- /* We must make sure that the Services admin has not normally the right to
- * drop the channel before issuing the wallops.
- */
- if (WallDrop && is_servadmin && level < ACCESS_FOUNDER)
- anope_cmd_global(s_ChanServ,
- "\2%s\2 used DROP on channel \2%s\2", u->nick,
- chan);
-
- notice_lang(s_ChanServ, u, CHAN_DROPPED, chan);
- send_event(EVENT_CHAN_DROP, chan);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-/* Main SET routine. Calls other routines as follows:
- * do_set_command(User *command_sender, ChannelInfo *ci, char *param);
- * The parameter passed is the first space-delimited parameter after the
- * option name, except in the case of DESC, TOPIC, and ENTRYMSG, in which
- * it is the entire remainder of the line. Additional parameters beyond
- * the first passed in the function call can be retrieved using
- * strtok(NULL, toks).
- */
-static int do_set(User * u)
-{
- char *chan = strtok(NULL, " ");
- char *cmd = strtok(NULL, " ");
- char *param;
- ChannelInfo *ci;
- int is_servadmin = is_services_admin(u);
-
- if (readonly) {
- notice_lang(s_ChanServ, u, CHAN_SET_DISABLED);
- return MOD_CONT;
- }
-
- if (cmd) {
- if (stricmp(cmd, "DESC") == 0 || stricmp(cmd, "ENTRYMSG") == 0)
- param = strtok(NULL, "");
- else
- param = strtok(NULL, " ");
- } else {
- param = NULL;
- }
-
- if (!param && (!cmd || (stricmp(cmd, "SUCCESSOR") != 0 &&
- stricmp(cmd, "URL") != 0 &&
- stricmp(cmd, "EMAIL") != 0 &&
- stricmp(cmd, "ENTRYMSG") != 0))) {
- syntax_error(s_ChanServ, u, "SET", CHAN_SET_SYNTAX);
- } else if (!(ci = cs_findchan(chan))) {
- notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
- } else if (ci->flags & CI_VERBOTEN) {
- notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, chan);
- } else if (!is_servadmin && !check_access(u, ci, CA_SET)) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else if (stricmp(cmd, "FOUNDER") == 0) {
- if (!is_servadmin
- && (ci->
- flags & CI_SECUREFOUNDER ? !is_real_founder(u,
- ci) :
- !is_founder(u, ci))) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else {
- do_set_founder(u, ci, param);
- }
- } else if (stricmp(cmd, "SUCCESSOR") == 0) {
- if (!is_servadmin
- && (ci->
- flags & CI_SECUREFOUNDER ? !is_real_founder(u,
- ci) :
- !is_founder(u, ci))) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else {
- do_set_successor(u, ci, param);
- }
- } else if (stricmp(cmd, "PASSWORD") == 0) {
- if (!is_servadmin
- && (ci->
- flags & CI_SECUREFOUNDER ? !is_real_founder(u,
- ci) :
- !is_founder(u, ci))) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else {
- do_set_password(u, ci, param);
- }
- } else if (stricmp(cmd, "DESC") == 0) {
- do_set_desc(u, ci, param);
- } else if (stricmp(cmd, "URL") == 0) {
- do_set_url(u, ci, param);
- } else if (stricmp(cmd, "EMAIL") == 0) {
- do_set_email(u, ci, param);
- } else if (stricmp(cmd, "ENTRYMSG") == 0) {
- do_set_entrymsg(u, ci, param);
- } else if (stricmp(cmd, "TOPIC") == 0) {
- notice_lang(s_ChanServ, u, OBSOLETE_COMMAND, "TOPIC");
- } else if (stricmp(cmd, "BANTYPE") == 0) {
- do_set_bantype(u, ci, param);
- } else if (stricmp(cmd, "MLOCK") == 0) {
- do_set_mlock(u, ci, param);
- } else if (stricmp(cmd, "KEEPTOPIC") == 0) {
- do_set_keeptopic(u, ci, param);
- } else if (stricmp(cmd, "TOPICLOCK") == 0) {
- do_set_topiclock(u, ci, param);
- } else if (stricmp(cmd, "PRIVATE") == 0) {
- do_set_private(u, ci, param);
- } else if (stricmp(cmd, "SECUREOPS") == 0) {
- do_set_secureops(u, ci, param);
- } else if (stricmp(cmd, "SECUREFOUNDER") == 0) {
- if (!is_servadmin
- && (ci->
- flags & CI_SECUREFOUNDER ? !is_real_founder(u,
- ci) :
- !is_founder(u, ci))) {
- notice_lang(s_ChanServ, u, ACCESS_DENIED);
- } else {
- do_set_securefounder(u, ci, param);
- }
- } else if (stricmp(cmd, "RESTRICTED") == 0) {
- do_set_restricted(u, ci, param);
- } else if (stricmp(cmd, "SECURE") == 0) {
- do_set_secure(u, ci, param);
- } else if (stricmp(cmd, "SIGNKICK") == 0) {
- do_set_signkick(u, ci, param);
- } else if (stricmp(cmd, "OPNOTICE") == 0) {
- do_set_opnotice(u, ci, param);
- } else if (stricmp(cmd, "XOP") == 0) {
- do_set_xop(u, ci, param);
- } else if (stricmp(cmd, "PEACE") == 0) {
- do_set_peace(u, ci, param);
- } else if (stricmp(cmd, "NOEXPIRE") == 0) {
- do_set_noexpire(u, ci, param);
- } else {
- notice_lang(s_ChanServ, u, CHAN_SET_UNKNOWN_OPTION, cmd);
- notice_lang(s_ChanServ, u, MORE_INFO, s_ChanServ, "SET");
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_founder(User * u, ChannelInfo * ci, char *param)
-{
- NickAlias *na = findnick(param);
- NickCore *nc, *nc0 = ci->founder;
-
- if (!na) {
- notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, param);
- return MOD_CONT;
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, param);
- return MOD_CONT;
- }
-
- nc = na->nc;
- if (nc->channelmax > 0 && nc->channelcount >= nc->channelmax
- && !is_services_admin(u)) {
- notice_lang(s_ChanServ, u, CHAN_SET_FOUNDER_TOO_MANY_CHANS, param);
- return MOD_CONT;
- }
-
- alog("%s: Changing founder of %s from %s to %s by %s!%s@%s",
- s_ChanServ, ci->name, ci->founder->display, nc->display, u->nick,
- u->username, u->host);
-
- /* Founder and successor must not be the same group */
- if (nc == ci->successor)
- ci->successor = NULL;
-
- nc0->channelcount--;
- ci->founder = nc;
- nc->channelcount++;
-
- notice_lang(s_ChanServ, u, CHAN_FOUNDER_CHANGED, ci->name, param);
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_successor(User * u, ChannelInfo * ci, char *param)
-{
- NickAlias *na;
- NickCore *nc;
-
- if (param) {
- na = findnick(param);
-
- if (!na) {
- notice_lang(s_ChanServ, u, NICK_X_NOT_REGISTERED, param);
- return MOD_CONT;
- }
- if (na->status & NS_VERBOTEN) {
- notice_lang(s_ChanServ, u, NICK_X_FORBIDDEN, param);
- return MOD_CONT;
- }
- if (na->nc == ci->founder) {
- notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_IS_FOUNDER, param,
- ci->name);
- return MOD_CONT;
- }
- nc = na->nc;
-
- } else {
- nc = NULL;
- }
-
- alog("%s: Changing successor of %s from %s to %s by %s!%s@%s",
- s_ChanServ, ci->name,
- (ci->successor ? ci->successor->display : "none"),
- (nc ? nc->display : "none"), u->nick, u->username, u->host);
-
- ci->successor = nc;
-
- if (nc)
- notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_CHANGED, ci->name,
- param);
- else
- notice_lang(s_ChanServ, u, CHAN_SUCCESSOR_UNSET, ci->name);
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_password(User * u, ChannelInfo * ci, char *param)
-{
- int len = strlen(param);
-
- if (stricmp(u->nick, param) == 0 || (StrictPasswords && len < 5)) {
- notice_lang(s_ChanServ, u, MORE_OBSCURE_PASSWORD);
- return MOD_CONT;
- }
-#ifdef USE_ENCRYPTION
- if (len > PASSMAX) {
- len = PASSMAX;
- param[len] = 0;
- notice_lang(s_ChanServ, u, PASSWORD_TRUNCATED, PASSMAX);
- }
-
- if (encrypt(param, len, ci->founderpass, PASSMAX) < 0) {
- memset(param, 0, strlen(param));
- alog("%s: Failed to encrypt password for %s (set)", s_ChanServ,
- ci->name);
- notice_lang(s_ChanServ, u, CHAN_SET_PASS