diff options
Diffstat (limited to 'src/operserv.c')
-rw-r--r-- | src/operserv.c | 3737 |
1 files changed, 50 insertions, 3687 deletions
diff --git a/src/operserv.c b/src/operserv.c index 42b1b94b5..08b42ad15 100644 --- a/src/operserv.c +++ b/src/operserv.c @@ -15,23 +15,16 @@ #include "services.h" #include "pseudo.h" -extern Module *mod_current_module; -extern int mod_current_op; -extern User *mod_current_user; -extern ModuleHash *MODULE_HASH[MAX_CMD_HASH]; /*************************************************************************/ -struct clone { - char *host; - long time; -}; + /* List of most recent users - statically initialized to zeros */ -static struct clone clonelist[CLONE_DETECT_SIZE]; +struct clone clonelist[CLONE_DETECT_SIZE]; /* Which hosts have we warned about, and when? This is used to keep us * from sending out notices over and over for clones from the same host. */ -static struct clone warnings[CLONE_DETECT_SIZE]; +struct clone warnings[CLONE_DETECT_SIZE]; /* List of Services administrators */ SList servadmins; @@ -42,8 +35,6 @@ SList akills, sglines, sqlines, szlines; /*************************************************************************/ -static void get_operserv_stats(long *nrec, long *memuse); - static int compare_adminlist_entries(SList * slist, void *item1, void *item2); static int compare_operlist_entries(SList * slist, void *item1, @@ -60,66 +51,20 @@ static void free_sqline_entry(SList * slist, void *item); static int is_szline_entry_equal(SList * slist, void *item1, void *item2); static void free_szline_entry(SList * slist, void *item); -static int do_help(User * u); -static int do_global(User * u); -static int do_stats(User * u); -static int do_admin(User * u); -static int do_oper(User * u); -static int do_os_mode(User * u); -static int do_clearmodes(User * u); -static int do_os_kick(User * u); -static int do_akill(User * u); -static int do_sgline(User * u); -static int do_sqline(User * u); -static int do_szline(User * u); -static int do_set(User * u); -static int do_noop(User * u); -static int do_jupe(User * u); -static int do_raw(User * u); -static int do_update(User * u); -static int do_reload(User * u); -static int do_os_quit(User * u); -static int do_shutdown(User * u); -static int do_restart(User * u); -static int do_ignorelist(User * u); -static int do_clearignore(User * u); -static int do_killclones(User * u); -static int do_chanlist(User * u); -static int do_userlist(User * u); -static int do_ignoreuser(User * u); -static int do_staff(User * u); -static int do_defcon(User * u); -static int do_chankill(User * u); -static void defcon_sendlvls(User * u); -char *defconReverseModes(const char *modes); -int DefConModesSet = 0; +void resetDefCon(int level); + time_t DefContimer; +int DefConModesSet = 0; void runDefCon(void); -void resetDefCon(int level); +char *defconReverseModes(const char *modes); void oper_global(char *nick, char *fmt, ...); -#ifdef USE_MODULES -int do_modload(User * u); -int do_modunload(User * u); -int do_modlist(User * u); -int do_modinfo(User * u); -static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name, - User * u); -static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name, - User * u); -#endif - -static int do_operumodes(User * u); -static int do_svsnick(User * u); -static int do_operoline(User * u); #ifdef DEBUG_COMMANDS static int send_clone_lists(User * u); static int do_matchwild(User * u); #endif -/* OperServ restart needs access to this if were gonna avoid sending ourself a signal */ -extern int do_restart_services(void); void moduleAddOperServCmds(void); /*************************************************************************/ @@ -140,70 +85,9 @@ SListOpts szopts = { 0, NULL, &is_szline_entry_equal, &free_szline_entry }; /* *INDENT-OFF* */ void moduleAddOperServCmds(void) { Command *c; - c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("GLOBAL", do_global, NULL, OPER_HELP_GLOBAL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("STATS", do_stats, NULL, OPER_HELP_STATS, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("UPTIME", do_stats, NULL, OPER_HELP_STATS, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - - /* Anyone can use the LIST option to the ADMIN and OPER commands; those - * routines check privileges to ensure that only authorized users - * modify the list. */ - c = createCommand("ADMIN", do_admin, NULL, OPER_HELP_ADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("OPER", do_oper, NULL, OPER_HELP_OPER, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("STAFF", do_staff, NULL, OPER_HELP_STAFF, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - /* Similarly, anyone can use *NEWS LIST, but *NEWS {ADD,DEL} are - * reserved for Services admins. */ - c = createCommand("LOGONNEWS", do_logonnews, NULL, NEWS_HELP_LOGON, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("OPERNEWS", do_opernews, NULL, NEWS_HELP_OPER, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RANDOMNEWS", do_randomnews, NULL, NEWS_HELP_RANDOM, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - - /* Commands for Services opers: */ - c = createCommand("MODE", do_os_mode, is_services_oper,OPER_HELP_MODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("CLEARMODES", do_clearmodes, is_services_oper,OPER_HELP_CLEARMODES, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("KICK", do_os_kick, is_services_oper,OPER_HELP_KICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("KILLCLONES", do_killclones, is_services_oper,OPER_HELP_KILLCLONES, -1,-1,-1, -1); addCoreCommand(OPERSERV,c); - c = createCommand("AKILL", do_akill, is_services_oper,OPER_HELP_AKILL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SGLINE", do_sgline, is_services_oper,OPER_HELP_SGLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SQLINE", do_sqline, is_services_oper,OPER_HELP_SQLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SZLINE", do_szline, is_services_oper,OPER_HELP_SZLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - - /* Commands for Services admins: */ - c = createCommand("SET", do_set, is_services_admin,OPER_HELP_SET, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET LIST", NULL, NULL,OPER_HELP_SET_LIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET READONLY", NULL, NULL,OPER_HELP_SET_READONLY, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET LOGCHAN", NULL, NULL,OPER_HELP_SET_LOGCHAN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET DEBUG", NULL, NULL,OPER_HELP_SET_DEBUG, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET NOEXPIRE", NULL, NULL,OPER_HELP_SET_NOEXPIRE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET IGNORE", NULL, NULL,OPER_HELP_SET_IGNORE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SET SUPERADMIN", NULL, NULL,OPER_HELP_SET_SUPERADMIN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); -#ifdef USE_MYSQL - c = createCommand("SET SQL", NULL, NULL,OPER_HELP_SET_SQL, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); -#endif - c = createCommand("SVSNICK", do_svsnick, is_services_admin,OPER_HELP_SVSNICK, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("UMODE", do_operumodes, is_services_admin,OPER_HELP_UMODE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("NOOP", do_noop, is_services_admin,OPER_HELP_NOOP, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("JUPE", do_jupe, is_services_admin,OPER_HELP_JUPE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RAW", do_raw, is_services_admin,OPER_HELP_RAW, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("IGNORE", do_ignoreuser, is_services_admin,OPER_HELP_IGNORE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("OLINE", do_operoline, is_services_admin,OPER_HELP_OLINE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("UPDATE", do_update, is_services_admin,OPER_HELP_UPDATE, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RELOAD", do_reload, is_services_admin,OPER_HELP_RELOAD, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("QUIT", do_os_quit, is_services_admin,OPER_HELP_QUIT, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SHUTDOWN", do_shutdown, is_services_admin,OPER_HELP_SHUTDOWN, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("RESTART", do_restart, is_services_admin,OPER_HELP_RESTART, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("SESSION", do_session, is_services_admin,OPER_HELP_SESSION, -1,-1,-1, -1); addCoreCommand(OPERSERV,c); - c = createCommand("EXCEPTION", do_exception, is_services_admin,OPER_HELP_EXCEPTION, -1,-1,-1, -1); addCoreCommand(OPERSERV,c); - c = createCommand("CHANLIST", do_chanlist, is_services_admin,OPER_HELP_CHANLIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("USERLIST", do_userlist, is_services_admin,OPER_HELP_USERLIST, -1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("DEFCON", do_defcon, is_services_admin, OPER_HELP_DEFCON,-1,-1,-1,-1); addCoreCommand(OPERSERV,c); - c = createCommand("CHANKILL", do_chankill, is_services_admin, OPER_HELP_CHANKILL,-1,-1,-1,-1); addCoreCommand(OPERSERV,c); - /* Commands for Services root: */ -#ifdef USE_MODULES - c = createCommand("MODLOAD", do_modload, is_services_root, -1,-1,-1,-1,OPER_HELP_MODLOAD); addCoreCommand(OPERSERV,c); - c = createCommand("MODUNLOAD", do_modunload, is_services_root, -1,-1,-1,-1,OPER_HELP_MODUNLOAD); addCoreCommand(OPERSERV,c); - c = createCommand("MODLIST", do_modlist, is_services_root, -1,-1,-1,-1,OPER_HELP_MODLIST); addCoreCommand(OPERSERV,c); - c = createCommand("MODINFO", do_modinfo, is_services_root, -1,-1,-1,-1,OPER_HELP_MODINFO); addCoreCommand(OPERSERV,c); -#endif + + modules_core_init(OperServCoreNumber, OperServCoreModules); + #ifdef DEBUG_COMMANDS c = createCommand("LISTTIMERS", send_timeout_list, is_services_root, -1,-1,-1,-1,-1); addCoreCommand(OPERSERV,c); c = createCommand("MATCHWILD", do_matchwild, is_services_root, -1,-1,-1,-1,-1); addCoreCommand(OPERSERV,c); @@ -278,88 +162,6 @@ void operserv(User * u, char *buf) } } -static void get_operserv_stats(long *nrec, long *memuse) -{ - int i; - long mem = 0, count = 0, mem2 = 0, count2 = 0; - Akill *ak; - SXLine *sx; - - if (CheckClones) { - mem = sizeof(struct clone) * CLONE_DETECT_SIZE * 2; - for (i = 0; i < CLONE_DETECT_SIZE; i++) { - if (clonelist[i].host) { - count++; - mem += strlen(clonelist[i].host) + 1; - } - if (warnings[i].host) { - count++; - mem += strlen(warnings[i].host) + 1; - } - } - } - - count += akills.count; - mem += akills.capacity; - mem += akills.count * sizeof(Akill); - - for (i = 0; i < akills.count; i++) { - ak = akills.list[i]; - mem += strlen(ak->user) + 1; - mem += strlen(ak->host) + 1; - mem += strlen(ak->by) + 1; - mem += strlen(ak->reason) + 1; - } - - if (ircd->sgline) { - count += sglines.count; - mem += sglines.capacity; - mem += sglines.count * sizeof(SXLine); - - for (i = 0; i < sglines.count; i++) { - sx = sglines.list[i]; - mem += strlen(sx->mask) + 1; - mem += strlen(sx->by) + 1; - mem += strlen(sx->reason) + 1; - } - } - if (ircd->sqline) { - count += sqlines.count; - mem += sqlines.capacity; - mem += sqlines.count * sizeof(SXLine); - - for (i = 0; i < sqlines.count; i++) { - sx = sqlines.list[i]; - mem += strlen(sx->mask) + 1; - mem += strlen(sx->by) + 1; - mem += strlen(sx->reason) + 1; - } - } - if (ircd->szline) { - count += szlines.count; - mem += szlines.capacity; - mem += szlines.count * sizeof(SXLine); - - for (i = 0; i < szlines.count; i++) { - sx = szlines.list[i]; - mem += strlen(sx->mask) + 1; - mem += strlen(sx->by) + 1; - mem += strlen(sx->reason) + 1; - } - } - - - get_news_stats(&count2, &mem2); - count += count2; - mem += mem2; - get_exception_stats(&count2, &mem2); - count += count2; - mem += mem2; - - *nrec = count; - *memuse = mem; -} - /*************************************************************************/ /**************************** Privilege checks ***************************/ /*************************************************************************/ @@ -915,73 +717,8 @@ static int send_clone_lists(User * u) /*********************** OperServ command functions **********************/ /*************************************************************************/ -/* HELP command. */ - -static int do_help(User * u) -{ - const char *cmd = strtok(NULL, ""); - - if (!cmd) { - notice_help(s_OperServ, u, OPER_HELP); - if (is_services_oper(u)) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD); - if (ircd->sgline || ircd->sqline || ircd->szline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_EXTRA); - } - if (ircd->sgline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_SGLINE); - } - if (ircd->sqline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_SQLINE); - } - if (ircd->szline) { - notice_help(s_OperServ, u, OPER_HELP_OPER_CMD_SZLINE); - } - } - if (is_services_admin(u)) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD); - if (ircd->svsnick || ircd->omode || ircd->umode) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_EXTRA); - } - if (ircd->svsnick) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_SVSNICK); - } - if (ircd->omode) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_OLINE); - } - if (ircd->umode) { - notice_help(s_OperServ, u, OPER_HELP_ADMIN_CMD_UMODE); - } - } -#ifdef USE_MODULES - if (is_services_root(u)) { - notice_help(s_OperServ, u, OPER_HELP_ROOT_CMD); - } -#endif - moduleDisplayHelp(5, u); - notice_help(s_OperServ, u, OPER_HELP_LOGGED); - } else { - mod_help_cmd(s_OperServ, u, OPERSERV, cmd); - } - return MOD_CONT; -} - /*************************************************************************/ -static int do_global(User * u) -{ - char *msg = strtok(NULL, ""); - - if (!msg) { - syntax_error(s_OperServ, u, "GLOBAL", OPER_GLOBAL_SYNTAX); - return MOD_CONT; - } - if (WallOSGlobal) - anope_cmd_global(s_OperServ, "\2%s\2 just used GLOBAL command.", - u->nick); - oper_global(u->nick, "%s", msg); - return MOD_CONT; -} Server *server_global(Server * s, char *msg) { @@ -1023,934 +760,10 @@ void oper_global(char *nick, char *fmt, ...) } -/*************************************************************************/ - -/* STATS command. */ - -static int do_stats(User * u) -{ - time_t uptime = time(NULL) - start_time; - char *extra = strtok(NULL, ""); - int days = uptime / 86400, hours = (uptime / 3600) % 24, - mins = (uptime / 60) % 60, secs = uptime % 60; - struct tm *tm; - char timebuf[64]; - - if (extra && stricmp(extra, "ALL") != 0) { - if (stricmp(extra, "AKILL") == 0) { - int timeout; - /* AKILLs */ - notice_lang(s_OperServ, u, OPER_STATS_AKILL_COUNT, - akills.count); - timeout = AutokillExpiry + 59; - if (timeout >= 172800) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_DAYS, - timeout / 86400); - else if (timeout >= 86400) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_DAY); - else if (timeout >= 7200) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_HOURS, - timeout / 3600); - else if (timeout >= 3600) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_HOUR); - else if (timeout >= 120) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_MINS, - timeout / 60); - else if (timeout >= 60) - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_MIN); - else - notice_lang(s_OperServ, u, OPER_STATS_AKILL_EXPIRE_NONE); - if (ircd->sgline) { - /* SGLINEs */ - notice_lang(s_OperServ, u, OPER_STATS_SGLINE_COUNT, - sglines.count); - timeout = SGLineExpiry + 59; - if (timeout >= 172800) - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_DAYS, - timeout / 86400); - else if (timeout >= 86400) - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_DAY); - else if (timeout >= 7200) - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_HOURS, - timeout / 3600); - else if (timeout >= 3600) - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_HOUR); - else if (timeout >= 120) - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_MINS, - timeout / 60); - else if (timeout >= 60) - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_MIN); - else - notice_lang(s_OperServ, u, - OPER_STATS_SGLINE_EXPIRE_NONE); - } - if (ircd->sqline) { - /* SQLINEs */ - notice_lang(s_OperServ, u, OPER_STATS_SQLINE_COUNT, - sqlines.count); - timeout = SQLineExpiry + 59; - if (timeout >= 172800) - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_DAYS, - timeout / 86400); - else if (timeout >= 86400) - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_DAY); - else if (timeout >= 7200) - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_HOURS, - timeout / 3600); - else if (timeout >= 3600) - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_HOUR); - else if (timeout >= 120) - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_MINS, - timeout / 60); - else if (timeout >= 60) - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_MIN); - else - notice_lang(s_OperServ, u, - OPER_STATS_SQLINE_EXPIRE_NONE); - } - if (ircd->szline) { - /* SZLINEs */ - notice_lang(s_OperServ, u, OPER_STATS_SZLINE_COUNT, - szlines.count); - timeout = SZLineExpiry + 59; - if (timeout >= 172800) - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_DAYS, - timeout / 86400); - else if (timeout >= 86400) - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_DAY); - else if (timeout >= 7200) - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_HOURS, - timeout / 3600); - else if (timeout >= 3600) - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_HOUR); - else if (timeout >= 120) - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_MINS, - timeout / 60); - else if (timeout >= 60) - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_MIN); - else - notice_lang(s_OperServ, u, - OPER_STATS_SZLINE_EXPIRE_NONE); - } - return MOD_CONT; - } else if (!stricmp(extra, "RESET")) { - if (is_services_admin(u)) { - maxusercnt = usercnt; - notice_lang(s_OperServ, u, OPER_STATS_RESET); - } else { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - } - return MOD_CONT; - } else { - notice_lang(s_OperServ, u, OPER_STATS_UNKNOWN_OPTION, extra); - } - } - - notice_lang(s_OperServ, u, OPER_STATS_CURRENT_USERS, usercnt, opcnt); - tm = localtime(&maxusertime); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_DATE_TIME_FORMAT, - tm); - notice_lang(s_OperServ, u, OPER_STATS_MAX_USERS, maxusercnt, timebuf); - if (days > 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_DHMS, - days, hours, mins, secs); - } else if (days == 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1DHMS, - days, hours, mins, secs); - } else { - if (hours > 1) { - if (mins != 1) { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HMS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_HM1S, - hours, mins, secs); - } - } else { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1MS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_H1M1S, - hours, mins, secs); - } - } - } else if (hours == 1) { - if (mins != 1) { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HMS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1HM1S, - hours, mins, secs); - } - } else { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1MS, - hours, mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1H1M1S, - hours, mins, secs); - } - } - } else { - if (mins != 1) { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_MS, - mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_M1S, - mins, secs); - } - } else { - if (secs != 1) { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1MS, - mins, secs); - } else { - notice_lang(s_OperServ, u, OPER_STATS_UPTIME_1M1S, - mins, secs); - } - } - } - } - - if (extra && stricmp(extra, "ALL") == 0 && is_services_admin(u)) { - long count, mem; - - notice_lang(s_OperServ, u, OPER_STATS_BYTES_READ, - total_read / 1024); - notice_lang(s_OperServ, u, OPER_STATS_BYTES_WRITTEN, - total_written / 1024); - - get_user_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_USER_MEM, count, - (mem + 512) / 1024); - get_channel_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_CHANNEL_MEM, count, - (mem + 512) / 1024); - get_core_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_GROUPS_MEM, count, - (mem + 512) / 1024); - get_aliases_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_ALIASES_MEM, count, - (mem + 512) / 1024); - get_chanserv_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_CHANSERV_MEM, count, - (mem + 512) / 1024); - get_botserv_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_BOTSERV_MEM, count, - (mem + 512) / 1024); - get_operserv_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_OPERSERV_MEM, count, - (mem + 512) / 1024); - get_session_stats(&count, &mem); - notice_lang(s_OperServ, u, OPER_STATS_SESSIONS_MEM, count, - (mem + 512) / 1024); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* make Services ignore users for a certain time */ - -static int do_ignoreuser(User * u) -{ - char *cmd = strtok(NULL, " "); - int t; - - if (!cmd) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; - } - - if (!stricmp(cmd, "ADD")) { - - char *time = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - char *rest = strtok(NULL, ""); - - if (!nick) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; - } else if (!time) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; - } else { - t = dotime(time); - rest = NULL; - - if (t <= -1) { - notice_lang(s_OperServ, u, OPER_IGNORE_VALID_TIME); - return MOD_CONT; - } else if (t == 0) { - t = 157248000; /* if 0 is given, we set time to 157248000 seconds == 5 years (let's hope the next restart will be before that time ;-)) */ - add_ignore(nick, t); - notice_lang(s_OperServ, u, OPER_IGNORE_PERM_DONE, nick); - } else { - add_ignore(nick, t); - notice_lang(s_OperServ, u, OPER_IGNORE_TIME_DONE, nick, - time); - } - } - } else if (!stricmp(cmd, "LIST")) { - do_ignorelist(u); - } - - else if (!stricmp(cmd, "DEL")) { - char *nick = strtok(NULL, " "); - if (!nick) { - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - } else { - if (get_ignore(nick) == 0) { - notice_lang(s_OperServ, u, OPER_IGNORE_LIST_NOMATCH, nick); - return MOD_CONT; - } else { - delete_ignore(nick); - notice_lang(s_OperServ, u, OPER_IGNORE_DEL_DONE, nick); - } - } - } else if (!stricmp(cmd, "CLEAR")) { - do_clearignore(u); - - } else - notice_lang(s_OperServ, u, OPER_IGNORE_SYNTAX); - return MOD_CONT; -} - -/*************************************************************************/ - -/* deletes a nick from the ignore list */ - -void delete_ignore(const char *nick) -{ - IgnoreData *ign, *prev; - IgnoreData **whichlist; - - if (!nick || !*nick) { - return; - } - - whichlist = &ignore[tolower(nick[0])]; - - for (ign = *whichlist, prev = NULL; ign; prev = ign, ign = ign->next) { - if (stricmp(ign->who, nick) == 0) - break; - } - if (prev) - prev->next = ign->next; - else - *whichlist = ign->next; - free(ign); - ign = NULL; -} - -/*************************************************************************/ - -/* shows the Services ignore list */ - -static int do_ignorelist(User * u) -{ - int sent_header = 0; - IgnoreData *id; - int i; - - for (i = 0; i < 256; i++) { - for (id = ignore[i]; id; id = id->next) { - if (!sent_header) { - notice_lang(s_OperServ, u, OPER_IGNORE_LIST); - sent_header = 1; - } - notice_user(s_OperServ, u, "%s", id->who); - } - } - if (!sent_header) - notice_lang(s_OperServ, u, OPER_IGNORE_LIST_EMPTY); - return MOD_CONT; -} - -/**************************************************************************/ -/* Cleares the Services ignore list */ - -static int do_clearignore(User * u) -{ - IgnoreData *id = NULL, *next = NULL; - int i; - for (i = 0; i < 256; i++) { - for (id = ignore[i]; id; id = next) { - next = id->next; - free(id); - if (!next) { - ignore[i] = NULL; - } - } - } - notice_lang(s_OperServ, u, OPER_IGNORE_LIST_CLEARED); - return MOD_CONT; -} - -/**************************************************************************/ - -/* Channel mode changing (MODE command). */ - -static int do_os_mode(User * u) -{ - int ac; - char **av; - char *chan = strtok(NULL, " "), *modes = strtok(NULL, ""); - Channel *c; - - if (!chan || !modes) { - syntax_error(s_OperServ, u, "MODE", OPER_MODE_SYNTAX); - return MOD_CONT; - } - - if (!(c = findchan(chan))) { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (c->bouncy_modes) { - notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE); - return MOD_CONT; - } else if ((ircd->adminmode) && (!is_services_admin(u)) - && (c->mode & ircd->adminmode)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } else { - anope_cmd_mode(s_OperServ, chan, "%s", modes); - - ac = split_buf(modes, &av, 1); - chan_set_modes(s_OperServ, c, ac, av, 0); - - if (WallOSMode) - anope_cmd_global(s_OperServ, "%s used MODE %s on %s", u->nick, - modes, chan); - } - return MOD_CONT; -} - -/**************************************************************************/ - -/** - * Change any user's UMODES - * - * modified to be part of the SuperAdmin directive -jester - * check user flag for SuperAdmin -rob - */ -static int do_operumodes(User * u) -{ - char *nick = strtok(NULL, " "); - char *modes = strtok(NULL, ""); - - User *u2; - - if (!ircd->umode) { - notice_lang(s_OperServ, u, OPER_UMODE_UNSUPPORTED); - return MOD_CONT; - } - - /* Only allow this if SuperAdmin is enabled */ - if (!u->isSuperAdmin) { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY); - return MOD_CONT; - } - - if (!nick || !modes) { - syntax_error(s_OperServ, u, "UMODE", OPER_UMODE_SYNTAX); - return MOD_CONT; - } - - /** - * Only accept a +/- mode string - *-rob - **/ - if ((modes[0] != '+') && (modes[0] != '-')) { - syntax_error(s_OperServ, u, "UMODE", OPER_UMODE_SYNTAX); - return MOD_CONT; - } - if (!(u2 = finduser(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); - } else { - anope_cmd_mode(s_OperServ, nick, "%s", modes); - - common_svsmode(u2, modes, NULL); - - notice_lang(s_OperServ, u, OPER_UMODE_SUCCESS, nick); - notice_lang(s_OperServ, u2, OPER_UMODE_CHANGED, u->nick); - - if (WallOSMode) - anope_cmd_global(s_OperServ, "\2%s\2 used UMODE on %s", - u->nick, nick); - } - return MOD_CONT; -} - /**************************************************************************/ -/** - * give Operflags to any user - * - * modified to be part of the SuperAdmin directive -jester - * check u-> for SuperAdmin -rob - */ - -static int do_operoline(User * u) -{ - char *nick = strtok(NULL, " "); - char *flags = strtok(NULL, ""); - User *u2 = NULL; - - if (!ircd->omode) { - notice_lang(s_OperServ, u, OPER_SVSO_UNSUPPORTED); - return MOD_CONT; - } - - /* Only allow this if SuperAdmin is enabled */ - if (!u->isSuperAdmin) { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY); - return MOD_CONT; - } - - if (!nick || !flags) { - syntax_error(s_OperServ, u, "OLINE", OPER_OLINE_SYNTAX); - return MOD_CONT; - } else { - u2 = finduser(nick); - -/* let's check whether the user is online */ - - if (!finduser(nick)) { - notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); - } else if (u2 && flags[0] == '+') { - anope_cmd_svso(s_OperServ, nick, flags); - anope_cmd_mode(s_OperServ, nick, "+o"); - common_svsmode(u2, "+o", NULL); - notice_lang(s_OperServ, u2, OPER_OLINE_IRCOP); - notice_lang(s_OperServ, u, OPER_OLINE_SUCCESS, flags, nick); - anope_cmd_global(s_OperServ, "\2%s\2 used OLINE for %s", - u->nick, nick); - } else if (u2 && flags[0] == '-') { - anope_cmd_svso(s_OperServ, nick, flags); - notice_lang(s_OperServ, u, OPER_OLINE_SUCCESS, flags, nick); - anope_cmd_global(s_OperServ, "\2%s\2 used OLINE for %s", - u->nick, nick); - } else - syntax_error(s_OperServ, u, "OLINE", OPER_OLINE_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* Clear all modes from a channel. */ - -static int do_clearmodes(User * u) -{ - char *s; - int i; - char *argv[2]; - char *chan = strtok(NULL, " "); - Channel *c; - int all = 0; - int count; /* For saving ban info */ - char **bans; /* For saving ban info */ - int exceptcount; /* For saving except info */ - char **excepts; /* For saving except info */ - int invitecount; /* For saving invite info */ - char **invites; /* For saving invite info */ - struct c_userlist *cu, *next; - - if (!chan) { - syntax_error(s_OperServ, u, "CLEARMODES", OPER_CLEARMODES_SYNTAX); - return MOD_CONT; - } else if (!(c = findchan(chan))) { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan); - return MOD_CONT; - } else if (c->bouncy_modes) { - notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE); - return MOD_CONT; - } else { - s = strtok(NULL, " "); - if (s) { - if (stricmp(s, "ALL") == 0) { - all = 1; - } else { - syntax_error(s_OperServ, u, "CLEARMODES", - OPER_CLEARMODES_SYNTAX); - return MOD_CONT; - } - } - - if (WallOSClearmodes) { - anope_cmd_global(s_OperServ, "%s used CLEARMODES%s on %s", - u->nick, all ? " ALL" : "", chan); - } - if (all) { - /* Clear mode +o */ - if (ircd->svsmode_ucmode) { - anope_cmd_svsmode_chan(c->name, "-o", NULL); - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_OP)) { - continue; - } - argv[0] = sstrdup("-o"); - argv[1] = cu->user->nick; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } else { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_OP)) - continue; - argv[0] = sstrdup("-o"); - argv[1] = cu->user->nick; - anope_cmd_mode(s_OperServ, c->name, "-o %s", - cu->user->nick); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } - - if (ircd->svsmode_ucmode) { - anope_cmd_svsmode_chan(c->name, "-v", NULL); - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_VOICE)) { - continue; - } - argv[0] = sstrdup("-v"); - argv[1] = cu->user->nick; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } else { - /* Clear mode +v */ - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_VOICE)) - continue; - argv[0] = sstrdup("-v"); - argv[1] = sstrdup(cu->user->nick); - anope_cmd_mode(s_OperServ, c->name, "-v %s", - cu->user->nick); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } - - /* Clear mode +h */ - if (ircd->svsmode_ucmode && ircd->halfop) { - anope_cmd_svsmode_chan(c->name, "-h", NULL); - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) { - continue; - } - argv[0] = sstrdup("-h"); - argv[1] = cu->user->nick; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } else { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) - continue; - argv[0] = sstrdup("-h"); - argv[1] = sstrdup(cu->user->nick); - anope_cmd_mode(s_OperServ, c->name, "-h %s", - cu->user->nick); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } - /* Clear mode Owners */ - if (ircd->svsmode_ucmode && ircd->owner) { - anope_cmd_svsmode_chan(c->name, ircd->ownerunset, NULL); - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) { - continue; - } - argv[0] = sstrdup(ircd->ownerunset); - argv[1] = cu->user->nick; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } else { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_OWNER)) - continue; - argv[0] = sstrdup(ircd->ownerunset); - argv[1] = sstrdup(cu->user->nick); - anope_cmd_mode(s_OperServ, c->name, "%s %s", - ircd->ownerunset, cu->user->nick); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } - /* Clear mode protected or admins */ - if (ircd->svsmode_ucmode && (ircd->protect || ircd->admin)) { - - anope_cmd_svsmode_chan(c->name, ircd->adminunset, NULL); - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_HALFOP)) { - continue; - } - argv[0] = sstrdup(ircd->adminunset); - argv[1] = cu->user->nick; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } else { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (!chan_has_user_status(c, cu->user, CUS_PROTECT)) - continue; - argv[0] = sstrdup(ircd->adminunset); - argv[1] = sstrdup(cu->user->nick); - anope_cmd_mode(s_OperServ, c->name, "%s %s", - ircd->adminunset, cu->user->nick); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - } - - - } - - if (c->mode) { - /* Clear modes the bulk of the modes */ - anope_cmd_mode(s_OperServ, c->name, "%s", ircd->modestoremove); - argv[0] = sstrdup(ircd->modestoremove); - chan_set_modes(s_OperServ, c, 1, argv, 0); - free(argv[0]); - - /* to prevent the internals from complaining send -k, -L, -f by themselves if we need - to send them - TSL */ - if (c->key) { - anope_cmd_mode(s_OperServ, c->name, "-k %s", c->key); - argv[0] = sstrdup("-k"); - argv[1] = c->key; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - if (ircd->Lmode && c->redirect) { - anope_cmd_mode(s_OperServ, c->name, "-L %s", c->redirect); - argv[0] = sstrdup("-L"); - argv[1] = c->redirect; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } - if (ircd->fmode && c->flood) { - if (flood_mode_char_remove) { - anope_cmd_mode(s_OperServ, c->name, "%s %s", - flood_mode_char_remove, c->flood); - argv[0] = sstrdup(flood_mode_char_remove); - argv[1] = c->flood; - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[0]); - } else { - if (debug) { - alog("debug: flood_mode_char_remove was not set unable to remove flood/throttle modes"); - } - } - } - } - - /* Clear bans */ - count = c->bancount; - bans = scalloc(sizeof(char *) * count, 1); - - for (i = 0; i < count; i++) - bans[i] = sstrdup(c->bans[i]); - - for (i = 0; i < count; i++) { - argv[0] = sstrdup("-b"); - argv[1] = bans[i]; - anope_cmd_mode(s_OperServ, c->name, "-b %s", argv[1]); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[1]); - free(argv[0]); - } - - free(bans); - - excepts = NULL; - - if (ircd->except) { - /* Clear excepts */ - exceptcount = c->exceptcount; - excepts = scalloc(sizeof(char *) * exceptcount, 1); - - for (i = 0; i < exceptcount; i++) - excepts[i] = sstrdup(c->excepts[i]); - - for (i = 0; i < exceptcount; i++) { - argv[0] = sstrdup("-e"); - argv[1] = excepts[i]; - anope_cmd_mode(s_OperServ, c->name, "-e %s", argv[1]); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[1]); - free(argv[0]); - } - if (excepts) { - free(excepts); - } - } - - if (ircd->invitemode) { - /* Clear invites */ - invitecount = c->invitecount; - invites = scalloc(sizeof(char *) * invitecount, 1); - - for (i = 0; i < invitecount; i++) - invites[i] = sstrdup(c->invite[i]); - - for (i = 0; i < invitecount; i++) { - argv[0] = sstrdup("-I"); - argv[1] = excepts[i]; - anope_cmd_mode(s_OperServ, c->name, "-I %s", argv[1]); - chan_set_modes(s_OperServ, c, 2, argv, 0); - free(argv[1]); - free(argv[0]); - } - - free(invites); - } - - } - - if (all) { - notice_lang(s_OperServ, u, OPER_CLEARMODES_ALL_DONE, chan); - } else { - notice_lang(s_OperServ, u, OPER_CLEARMODES_DONE, chan); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* Kick a user from a channel (KICK command). */ - -static int do_os_kick(User * u) -{ - char *argv[3]; - char *chan, *nick, *s; - Channel *c; - - chan = strtok(NULL, " "); - nick = strtok(NULL, " "); - s = strtok(NULL, ""); - if (!chan || !nick || !s) { - syntax_error(s_OperServ, u, "KICK", OPER_KICK_SYNTAX); - return MOD_CONT; - } - if (!(c = findchan(chan))) { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, chan); - } else if (c->bouncy_modes) { - notice_lang(s_OperServ, u, OPER_BOUNCY_MODES_U_LINE); - return MOD_CONT; - } - anope_cmd_kick(s_OperServ, chan, nick, "%s (%s)", u->nick, s); - if (WallOSKick) - anope_cmd_global(s_OperServ, "%s used KICK on %s/%s", u->nick, - nick, chan); - argv[0] = sstrdup(chan); - argv[1] = sstrdup(nick); - argv[2] = sstrdup(s); - do_kick(s_OperServ, 3, argv); - free(argv[2]); - free(argv[1]); - free(argv[0]); - return MOD_CONT; -} - -/*************************************************************************/ - -/* Forcefully change a user's nickname */ - -static int do_svsnick(User * u) -{ - char *nick = strtok(NULL, " "); - char *newnick = strtok(NULL, " "); - - NickAlias *na; - char *c; - - if (!ircd->svsnick) { - notice_lang(s_OperServ, u, OPER_SVSNICK_UNSUPPORTED); - return MOD_CONT; - } - - /* Only allow this if SuperAdmin is enabled */ - if (!u->isSuperAdmin) { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY); - return MOD_CONT; - } - - if (!nick || !newnick) { - syntax_error(s_OperServ, u, "SVSNICK", OPER_SVSNICK_SYNTAX); - return MOD_CONT; - } - - /* Truncate long nicknames to NICKMAX-2 characters */ - if (strlen(newnick) > (NICKMAX - 2)) { - notice_lang(s_NickServ, u, NICK_X_TRUNCATED, - newnick, NICKMAX - 2, newnick); - newnick[NICKMAX - 2] = '\0'; - } - - /* Check for valid characters */ - if (*newnick == '-' || isdigit(*newnick)) { - notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick); - return MOD_CONT; - } -#define isvalid(c) (((c) >= 'A' && (c) <= '~') || isdigit(c) || (c) == '-') - for (c = newnick; *c && (c - newnick) < NICKMAX; c++) { - if (!isvalid(*c) || isspace(*c)) { - notice_lang(s_OperServ, u, NICK_X_ILLEGAL, nick); - return MOD_CONT; - } - } - - /* Check for a nick in use or a forbidden/suspended nick */ - if (!finduser(nick)) { - notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick); - } else if (finduser(newnick)) { - notice_lang(s_NickServ, u, NICK_X_IN_USE, newnick); - } else if ((na = findnick(newnick)) && (na->status & NS_VERBOTEN)) { - notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, newnick); - } else { - notice_lang(s_OperServ, u, OPER_SVSNICK_NEWNICK, nick, newnick); - anope_cmd_global(s_OperServ, "%s used SVSNICK to change %s to %s", - u->nick, nick, newnick); - anope_cmd_svsnick(nick, newnick, time(NULL)); - } - return MOD_CONT; -} +/************************************************************************/ /*************************************************************************/ /* Adds an AKILL to the list. Returns >= 0 on success, -1 if it fails, -2 @@ -2176,313 +989,6 @@ static int is_akill_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an AKILL entry, prefixing it with the header if needed */ - -static int akill_list(int number, Akill * ak, User * u, int *sent_header) -{ - char mask[BUFSIZE]; - - if (!ak) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_AKILL_LIST_HEADER); - *sent_header = 1; - } - - snprintf(mask, sizeof(mask), "%s@%s", ak->user, ak->host); - notice_lang(s_OperServ, u, OPER_AKILL_LIST_FORMAT, number, mask, - ak->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int akill_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return akill_list(number, item, u, sent_header); -} - -/* Lists an AKILL entry, prefixing it with the header if needed */ - -static int akill_view(int number, Akill * ak, User * u, int *sent_header) -{ - char mask[BUFSIZE]; - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!ak) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_AKILL_VIEW_HEADER); - *sent_header = 1; - } - - snprintf(mask, sizeof(mask), "%s@%s", ak->user, ak->host); - tm = *localtime(&ak->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), ak->expires); - notice_lang(s_OperServ, u, OPER_AKILL_VIEW_FORMAT, number, mask, - ak->by, timebuf, expirebuf, ak->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int akill_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return akill_view(number, item, u, sent_header); -} - -/* Manage the AKILL list. */ - -static int do_akill(User * u) -{ - char *cmd = strtok(NULL, " "); - char breason[BUFSIZE]; - - if (!cmd) - cmd = ""; - - if (!stricmp(cmd, "ADD")) { - int deleted = 0; - char *expiry, *mask, *reason; - time_t expires; - - mask = strtok(NULL, " "); - if (mask && *mask == '+') { - expiry = mask; - mask = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : AutokillExpiry; - /* If the expiry given does not contain a final letter, it's in days, - * said the doc. Ah well. - */ - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - /* Do not allow less than a minute expiry time */ - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (mask && (reason = strtok(NULL, ""))) { - /* We first do some sanity check on the proposed mask. */ - if (strchr(mask, '!')) { - notice_lang(s_OperServ, u, OPER_AKILL_NO_NICK); - return MOD_CONT; - } - - if (!strchr(mask, '@')) { - notice_lang(s_OperServ, u, BAD_USERHOST_MASK); - return MOD_CONT; - } - - if (mask && strspn(mask, "~@.*?") == strlen(mask)) { - notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask); - return MOD_CONT; - } - - /** - * Changed sprintf() to snprintf()and increased the size of - * breason to match bufsize - * -Rob - **/ - if (AddAkiller) { - snprintf(breason, sizeof(breason), "[%s] %s", u->nick, - reason); - reason = sstrdup(breason); - } - - deleted = add_akill(u, mask, u->nick, expires, reason); - if (deleted < 0) - return MOD_CONT; - else if (deleted) - notice_lang(s_OperServ, u, OPER_AKILL_DELETED_SEVERAL, - deleted); - notice_lang(s_OperServ, u, OPER_AKILL_ADDED, mask); - - if (WallOSAkill) { - char buf[128]; - - if (!expires) { - strcpy(buf, "does not expire"); - } else { - int wall_expiry = expires - time(NULL); - char *s = NULL; - - if (wall_expiry >= 86400) { - wall_expiry /= 86400; - s = "day"; - } else if (wall_expiry >= 3600) { - wall_expiry /= 3600; - s = "hour"; - } else if (wall_expiry >= 60) { - wall_expiry /= 60; - s = "minute"; - } - - snprintf(buf, sizeof(buf), "expires in %d %s%s", - wall_expiry, s, - (wall_expiry == 1) ? "" : "s"); - } - - anope_cmd_global(s_OperServ, - "%s added an AKILL for %s (%s) (%s)", - u->nick, mask, reason, buf); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else { - syntax_error(s_OperServ, u, "AKILL", OPER_AKILL_SYNTAX); - } - - } else if (!stricmp(cmd, "DEL")) { - - char *mask; - int res = 0; - - mask = strtok(NULL, " "); - - if (!mask) { - syntax_error(s_OperServ, u, "AKILL", OPER_AKILL_SYNTAX); - return MOD_CONT; - } - - if (akills.count == 0) { - notice_lang(s_OperServ, u, OPER_AKILL_LIST_EMPTY); - return MOD_CONT; - } - - if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) { - /* Deleting a range */ - res = slist_delete_range(&akills, mask, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_AKILL_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_AKILL_DELETED_SEVERAL, - res); - } - } else { - if ((res = slist_indexof(&akills, mask)) == -1) { - notice_lang(s_OperServ, u, OPER_AKILL_NOT_FOUND, mask); - return MOD_CONT; - } - - slist_delete(&akills, res); - notice_lang(s_OperServ, u, OPER_AKILL_DELETED, mask); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else if (!stricmp(cmd, "LIST")) { - char *mask; - int res, sent_header = 0; - - if (akills.count == 0) { - notice_lang(s_OperServ, u, OPER_AKILL_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, " "); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&akills, mask, &akill_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH); - return MOD_CONT; - } else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Akill"); - } - } else { - int i; - char amask[BUFSIZE]; - - for (i = 0; i < akills.count; i++) { - snprintf(amask, sizeof(amask), "%s@%s", - ((Akill *) akills.list[i])->user, - ((Akill *) akills.list[i])->host); - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - akill_list(i + 1, akills.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH); - else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Akill"); - } - } - } else if (!stricmp(cmd, "VIEW")) { - char *mask; - int res, sent_header = 0; - - if (akills.count == 0) { - notice_lang(s_OperServ, u, OPER_AKILL_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, " "); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&akills, mask, &akill_view_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char amask[BUFSIZE]; - - for (i = 0; i < akills.count; i++) { - snprintf(amask, sizeof(amask), "%s@%s", - ((Akill *) akills.list[i])->user, - ((Akill *) akills.list[i])->host); - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - akill_view(i + 1, akills.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_AKILL_NO_MATCH); - } - } else if (!stricmp(cmd, "CLEAR")) { - slist_clear(&akills, 1); - notice_lang(s_OperServ, u, OPER_AKILL_CLEAR); - } else { - syntax_error(s_OperServ, u, "AKILL", OPER_AKILL_SYNTAX); - } - return MOD_CONT; -} /*************************************************************************/ @@ -2667,292 +1173,6 @@ static int is_sgline_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an SGLINE entry, prefixing it with the header if needed */ - -static int sgline_list(int number, SXLine * sx, User * u, int *sent_header) -{ - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_FORMAT, number, sx->mask, - sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sgline_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sgline_list(number, item, u, sent_header); -} - -/* Lists an SGLINE entry, prefixing it with the header if needed */ - -static int sgline_view(int number, SXLine * sx, User * u, int *sent_header) -{ - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SGLINE_VIEW_HEADER); - *sent_header = 1; - } - - tm = *localtime(&sx->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires); - notice_lang(s_OperServ, u, OPER_SGLINE_VIEW_FORMAT, number, sx->mask, - sx->by, timebuf, expirebuf, sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sgline_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sgline_view(number, item, u, sent_header); -} - - -/* Manage the SGLINE list. */ - -static int do_sgline(User * u) -{ - char *cmd = strtok(NULL, " "); - - if (!ircd->sgline) { - notice_lang(s_OperServ, u, OPER_SGLINE_UNSUPPORTED); - return MOD_CONT; - } - - if (!cmd) - cmd = ""; - - if (!stricmp(cmd, "ADD")) { - int deleted = 0; - char *expiry, *mask, *reason; - time_t expires; - - mask = strtok(NULL, ":"); - if (mask && *mask == '+') { - expiry = mask; - mask = strchr(expiry, ' '); - if (mask) { - *mask = 0; - mask++; - } - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : SGLineExpiry; - /* If the expiry given does not contain a final letter, it's in days, - * said the doc. Ah well. - */ - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - /* Do not allow less than a minute expiry time */ - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (mask && (reason = strtok(NULL, ""))) { - /* We first do some sanity check on the proposed mask. */ - - if (mask && strspn(mask, "*?") == strlen(mask)) { - notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask); - return MOD_CONT; - } - - deleted = add_sgline(u, mask, u->nick, expires, reason); - if (deleted < 0) - return MOD_CONT; - else if (deleted) - notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_SEVERAL, - deleted); - notice_lang(s_OperServ, u, OPER_SGLINE_ADDED, mask); - - if (WallOSSGLine) { - char buf[128]; - - if (!expires) { - strcpy(buf, "does not expire"); - } else { - int wall_expiry = expires - time(NULL); - char *s = NULL; - - if (wall_expiry >= 86400) { - wall_expiry /= 86400; - s = "day"; - } else if (wall_expiry >= 3600) { - wall_expiry /= 3600; - s = "hour"; - } else if (wall_expiry >= 60) { - wall_expiry /= 60; - s = "minute"; - } - - snprintf(buf, sizeof(buf), "expires in %d %s%s", - wall_expiry, s, - (wall_expiry == 1) ? "" : "s"); - } - - anope_cmd_global(s_OperServ, - "%s added an SGLINE for %s (%s)", u->nick, - mask, buf); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else { - syntax_error(s_OperServ, u, "SGLINE", OPER_SGLINE_SYNTAX); - } - - } else if (!stricmp(cmd, "DEL")) { - - char *mask; - int res = 0; - - mask = strtok(NULL, ""); - - if (!mask) { - syntax_error(s_OperServ, u, "SGLINE", OPER_SGLINE_SYNTAX); - return MOD_CONT; - } - - if (sglines.count == 0) { - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_EMPTY); - return MOD_CONT; - } - - if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) { - /* Deleting a range */ - res = slist_delete_range(&sglines, mask, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_SGLINE_DELETED_SEVERAL, - res); - } - } else { - if ((res = slist_indexof(&sglines, mask)) == -1) { - notice_lang(s_OperServ, u, OPER_SGLINE_NOT_FOUND, mask); - return MOD_CONT; - } - - slist_delete(&sglines, res); - notice_lang(s_OperServ, u, OPER_SGLINE_DELETED, mask); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else if (!stricmp(cmd, "LIST")) { - char *mask; - int res, sent_header = 0; - - if (sglines.count == 0) { - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, ""); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&sglines, mask, &sgline_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char *amask; - - for (i = 0; i < sglines.count; i++) { - amask = ((SXLine *) sglines.list[i])->mask; - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - sgline_list(i + 1, sglines.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH); - else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "SGLine"); - } - } - } else if (!stricmp(cmd, "VIEW")) { - char *mask; - int res, sent_header = 0; - - if (sglines.count == 0) { - notice_lang(s_OperServ, u, OPER_SGLINE_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, ""); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&sglines, mask, &sgline_view_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char *amask; - - for (i = 0; i < sglines.count; i++) { - amask = ((SXLine *) sglines.list[i])->mask; - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - sgline_view(i + 1, sglines.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_SGLINE_NO_MATCH); - } - } else if (!stricmp(cmd, "CLEAR")) { - slist_clear(&sglines, 1); - notice_lang(s_OperServ, u, OPER_SGLINE_CLEAR); - } else { - syntax_error(s_OperServ, u, "SGLINE", OPER_SGLINE_SYNTAX); - } - return MOD_CONT; -} - /*************************************************************************/ /* Adds an SQLINE to the list. Returns >= 0 on success, -1 if it failed, -2 if @@ -3174,294 +1394,6 @@ static int is_sqline_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an SQLINE entry, prefixing it with the header if needed */ - -static int sqline_list(int number, SXLine * sx, User * u, int *sent_header) -{ - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_FORMAT, number, sx->mask, - sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sqline_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sqline_list(number, item, u, sent_header); -} - -/* Lists an SQLINE entry, prefixing it with the header if needed */ - -static int sqline_view(int number, SXLine * sx, User * u, int *sent_header) -{ - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SQLINE_VIEW_HEADER); - *sent_header = 1; - } - - tm = *localtime(&sx->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires); - notice_lang(s_OperServ, u, OPER_SQLINE_VIEW_FORMAT, number, sx->mask, - sx->by, timebuf, expirebuf, sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int sqline_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return sqline_view(number, item, u, sent_header); -} - -/* Manage the SQLINE list. */ - -static int do_sqline(User * u) -{ - char *cmd = strtok(NULL, " "); - - if (!ircd->sqline) { - notice_lang(s_OperServ, u, OPER_SQLINE_UNSUPPORTED); - return MOD_CONT; - } - - if (!cmd) - cmd = ""; - - if (!stricmp(cmd, "ADD")) { - int deleted = 0; - char *expiry, *mask, *reason; - time_t expires; - - mask = strtok(NULL, " "); - if (mask && *mask == '+') { - expiry = mask; - mask = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : SQLineExpiry; - /* If the expiry given does not contain a final letter, it's in days, - * said the doc. Ah well. - */ - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - /* Do not allow less than a minute expiry time */ - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (mask && (reason = strtok(NULL, ""))) { - - /* We first do some sanity check on the proposed mask. */ - if (strspn(mask, "*") == strlen(mask)) { - notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask); - return MOD_CONT; - } - - /* Channel SQLINEs are only supported on Bahamut servers */ - if (*mask == '#' && !ircd->chansqline) { - notice_lang(s_OperServ, u, - OPER_SQLINE_CHANNELS_UNSUPPORTED); - return MOD_CONT; - } - - deleted = add_sqline(u, mask, u->nick, expires, reason); - if (deleted < 0) - return MOD_CONT; - else if (deleted) - notice_lang(s_OperServ, u, OPER_SQLINE_DELETED_SEVERAL, - deleted); - notice_lang(s_OperServ, u, OPER_SQLINE_ADDED, mask); - - if (WallOSSQLine) { - char buf[128]; - - if (!expires) { - strcpy(buf, "does not expire"); - } else { - int wall_expiry = expires - time(NULL); - char *s = NULL; - - if (wall_expiry >= 86400) { - wall_expiry /= 86400; - s = "day"; - } else if (wall_expiry >= 3600) { - wall_expiry /= 3600; - s = "hour"; - } else if (wall_expiry >= 60) { - wall_expiry /= 60; - s = "minute"; - } - - snprintf(buf, sizeof(buf), "expires in %d %s%s", - wall_expiry, s, - (wall_expiry == 1) ? "" : "s"); - } - - anope_cmd_global(s_OperServ, - "%s added an SQLINE for %s (%s)", u->nick, - mask, buf); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else { - syntax_error(s_OperServ, u, "SQLINE", OPER_SQLINE_SYNTAX); - } - - } else if (!stricmp(cmd, "DEL")) { - - char *mask; - int res = 0; - - mask = strtok(NULL, ""); - - if (!mask) { - syntax_error(s_OperServ, u, "SQLINE", OPER_SQLINE_SYNTAX); - return MOD_CONT; - } - - if (sqlines.count == 0) { - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_EMPTY); - return MOD_CONT; - } - - if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) { - /* Deleting a range */ - res = slist_delete_range(&sqlines, mask, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_SQLINE_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_SQLINE_DELETED_SEVERAL, - res); - } - } else { - if ((res = slist_indexof(&sqlines, mask)) == -1) { - notice_lang(s_OperServ, u, OPER_SQLINE_NOT_FOUND, mask); - return MOD_CONT; - } - - slist_delete(&sqlines, res); - notice_lang(s_OperServ, u, OPER_SQLINE_DELETED, mask); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else if (!stricmp(cmd, "LIST")) { - char *mask; - int res, sent_header = 0; - - if (sqlines.count == 0) { - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, ""); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&sqlines, mask, &sqline_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char *amask; - - for (i = 0; i < sqlines.count; i++) { - amask = ((SXLine *) sqlines.list[i])->mask; - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - sqline_list(i + 1, sqlines.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH); - else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "SQLine"); - } - } - } else if (!stricmp(cmd, "VIEW")) { - char *mask; - int res, sent_header = 0; - - if (sqlines.count == 0) { - notice_lang(s_OperServ, u, OPER_SQLINE_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, ""); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&sqlines, mask, &sqline_view_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char *amask; - - for (i = 0; i < sqlines.count; i++) { - amask = ((SXLine *) sqlines.list[i])->mask; - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - sqline_view(i + 1, sqlines.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_SQLINE_NO_MATCH); - } - } else if (!stricmp(cmd, "CLEAR")) { - slist_clear(&sqlines, 1); - notice_lang(s_OperServ, u, OPER_SQLINE_CLEAR); - } else { - syntax_error(s_OperServ, u, "SQLINE", OPER_SQLINE_SYNTAX); - } - return MOD_CONT; -} - /*************************************************************************/ /* Adds an SZLINE to the list. Returns >= 0 on success, -1 on error, -2 if @@ -3631,390 +1563,6 @@ static int is_szline_entry_equal(SList * slist, void *item1, void *item2) return 0; } -/* Lists an SZLINE entry, prefixing it with the header if needed */ - -static int szline_list(int number, SXLine * sx, User * u, int *sent_header) -{ - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_FORMAT, number, sx->mask, - sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int szline_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return szline_list(number, item, u, sent_header); -} - -/* Lists an SZLINE entry, prefixing it with the header if needed */ - -static int szline_view(int number, SXLine * sx, User * u, int *sent_header) -{ - char timebuf[32], expirebuf[256]; - struct tm tm; - - if (!sx) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_SZLINE_VIEW_HEADER); - *sent_header = 1; - } - - tm = *localtime(&sx->seton); - strftime_lang(timebuf, sizeof(timebuf), u, STRFTIME_SHORT_DATE_FORMAT, - &tm); - expire_left(u->na, expirebuf, sizeof(expirebuf), sx->expires); - notice_lang(s_OperServ, u, OPER_SZLINE_VIEW_FORMAT, number, sx->mask, - sx->by, timebuf, expirebuf, sx->reason); - - return 1; -} - -/* Callback for enumeration purposes */ - -static int szline_view_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return szline_view(number, item, u, sent_header); -} - -/* Manage the SZLINE list. */ - -static int do_szline(User * u) -{ - char *cmd = strtok(NULL, " "); - - if (!ircd->szline) { - notice_lang(s_OperServ, u, OPER_SZLINE_UNSUPPORTED); - return MOD_CONT; - } - - if (!cmd) - cmd = ""; - - if (!stricmp(cmd, "ADD")) { - int deleted = 0; - char *expiry, *mask, *reason; - time_t expires; - - mask = strtok(NULL, " "); - if (mask && *mask == '+') { - expiry = mask; - mask = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : SZLineExpiry; - /* If the expiry given does not contain a final letter, it's in days, - * said the doc. Ah well. - */ - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - /* Do not allow less than a minute expiry time */ - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (mask && (reason = strtok(NULL, ""))) { - /* We first do some sanity check on the proposed mask. */ - - if (strchr(mask, '!') || strchr(mask, '@')) { - notice_lang(s_OperServ, u, OPER_SZLINE_ONLY_IPS); - return MOD_CONT; - } - - if (strspn(mask, "*?") == strlen(mask)) { - notice_lang(s_OperServ, u, USERHOST_MASK_TOO_WIDE, mask); - return MOD_CONT; - } - - deleted = add_szline(u, mask, u->nick, expires, reason); - if (deleted < 0) - return MOD_CONT; - else if (deleted) - notice_lang(s_OperServ, u, OPER_SZLINE_DELETED_SEVERAL, - deleted); - notice_lang(s_OperServ, u, OPER_SZLINE_ADDED, mask); - - if (WallOSSZLine) { - char buf[128]; - - if (!expires) { - strcpy(buf, "does not expire"); - } else { - int wall_expiry = expires - time(NULL); - char *s = NULL; - - if (wall_expiry >= 86400) { - wall_expiry /= 86400; - s = "day"; - } else if (wall_expiry >= 3600) { - wall_expiry /= 3600; - s = "hour"; - } else if (wall_expiry >= 60) { - wall_expiry /= 60; - s = "minute"; - } - - snprintf(buf, sizeof(buf), "expires in %d %s%s", - wall_expiry, s, - (wall_expiry == 1) ? "" : "s"); - } - - anope_cmd_global(s_OperServ, - "%s added an SZLINE for %s (%s)", u->nick, - mask, buf); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else { - syntax_error(s_OperServ, u, "SZLINE", OPER_SZLINE_SYNTAX); - } - - } else if (!stricmp(cmd, "DEL")) { - - char *mask; - int res = 0; - - mask = strtok(NULL, " "); - - if (!mask) { - syntax_error(s_OperServ, u, "SZLINE", OPER_SZLINE_SYNTAX); - return MOD_CONT; - } - - if (szlines.count == 0) { - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_EMPTY); - return MOD_CONT; - } - - if (isdigit(*mask) && strspn(mask, "1234567890,-") == strlen(mask)) { - /* Deleting a range */ - res = slist_delete_range(&szlines, mask, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_SZLINE_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_SZLINE_DELETED_SEVERAL, - res); - } - } else { - if ((res = slist_indexof(&szlines, mask)) == -1) { - notice_lang(s_OperServ, u, OPER_SZLINE_NOT_FOUND, mask); - return MOD_CONT; - } - - slist_delete(&szlines, res); - notice_lang(s_OperServ, u, OPER_SZLINE_DELETED, mask); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - - } else if (!stricmp(cmd, "LIST")) { - char *mask; - int res, sent_header = 0; - - if (szlines.count == 0) { - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, " "); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&szlines, mask, &szline_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char *amask; - - for (i = 0; i < szlines.count; i++) { - amask = ((SXLine *) szlines.list[i])->mask; - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - szline_list(i + 1, szlines.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH); - } - } else if (!stricmp(cmd, "VIEW")) { - char *mask; - int res, sent_header = 0; - - if (szlines.count == 0) { - notice_lang(s_OperServ, u, OPER_SZLINE_LIST_EMPTY); - return MOD_CONT; - } - - mask = strtok(NULL, " "); - - if (!mask || (isdigit(*mask) - && strspn(mask, "1234567890,-") == strlen(mask))) { - res = - slist_enum(&szlines, mask, &szline_view_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH); - return MOD_CONT; - } - } else { - int i; - char *amask; - - for (i = 0; i < szlines.count; i++) { - amask = ((SXLine *) szlines.list[i])->mask; - if (!stricmp(mask, amask) - || match_wild_nocase(mask, amask)) - szline_view(i + 1, szlines.list[i], u, &sent_header); - } - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_SZLINE_NO_MATCH); - } - } else if (!stricmp(cmd, "CLEAR")) { - slist_clear(&szlines, 1); - notice_lang(s_OperServ, u, OPER_SZLINE_CLEAR); - } else { - syntax_error(s_OperServ, u, "SZLINE", OPER_SZLINE_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_chanlist(User * u) -{ - char *pattern = strtok(NULL, " "); - char *opt = strtok(NULL, " "); - - int modes = 0; - User *u2; - - if (opt && !stricmp(opt, "SECRET")) - modes |= (CMODE_s | CMODE_p); - - if (pattern && (u2 = finduser(pattern))) { - struct u_chanlist *uc; - - notice_lang(s_OperServ, u, OPER_CHANLIST_HEADER_USER, u2->nick); - - for (uc = u2->chans; uc; uc = uc->next) { - if (modes && !(uc->chan->mode & modes)) - continue; - notice_lang(s_OperServ, u, OPER_CHANLIST_RECORD, - uc->chan->name, uc->chan->usercount, - chan_get_modes(uc->chan, 1, 1), - (uc->chan->topic ? uc->chan->topic : "")); - } - } else { - int i; - Channel *c; - - notice_lang(s_OperServ, u, OPER_CHANLIST_HEADER); - - for (i = 0; i < 1024; i++) { - for (c = chanlist[i]; c; c = c->next) { - if (pattern && !match_wild_nocase(pattern, c->name)) - continue; - if (modes && !(c->mode & modes)) - continue; - notice_lang(s_OperServ, u, OPER_CHANLIST_RECORD, c->name, - c->usercount, chan_get_modes(c, 1, 1), - (c->topic ? c->topic : "")); - } - } - } - - notice_lang(s_OperServ, u, OPER_CHANLIST_END); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_userlist(User * u) -{ - char *pattern = strtok(NULL, " "); - char *opt = strtok(NULL, " "); - - Channel *c; - int modes = 0; - - if (opt && !stricmp(opt, "INVISIBLE")) - modes |= UMODE_i; - - if (pattern && (c = findchan(pattern))) { - struct c_userlist *cu; - - notice_lang(s_OperServ, u, OPER_USERLIST_HEADER_CHAN, pattern); - - for (cu = c->users; cu; cu = cu->next) { - if (modes && !(cu->user->mode & modes)) - continue; - notice_lang(s_OperServ, u, OPER_USERLIST_RECORD, - cu->user->nick, common_get_vident(cu->user), - common_get_vhost(cu->user)); - } - } else { - char mask[BUFSIZE]; - int i; - User *u2; - - notice_lang(s_OperServ, u, OPER_USERLIST_HEADER); - - for (i = 0; i < 1024; i++) { - for (u2 = userlist[i]; u2; u2 = u2->next) { - if (pattern) { - snprintf(mask, sizeof(mask), "%s!%s@%s", u2->nick, - common_get_vident(u2), common_get_vhost(u2)); - if (!match_wild_nocase(pattern, mask)) - continue; - if (modes && !(u2->mode & modes)) - continue; - } - notice_lang(s_OperServ, u, OPER_USERLIST_RECORD, u2->nick, - common_get_vident(u2), common_get_vhost(u2)); - } - } - } - - notice_lang(s_OperServ, u, OPER_USERLIST_END); - return MOD_CONT; -} - /*************************************************************************/ /* Callback function used to sort the admin list */ @@ -4036,192 +1584,6 @@ static void free_adminlist_entry(SList * slist, void *item) nc->flags &= ~NI_SERVICES_ADMIN; } -/* Lists an admin entry, prefixing it with the header if needed */ - -static int admin_list(int number, NickCore * nc, User * u, - int *sent_header) -{ - if (!nc) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_FORMAT, number, - nc->display); - return 1; -} - -/* Callback for enumeration purposes */ - -static int admin_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return admin_list(number, item, u, sent_header); -} - -/* Services admin list viewing/modification. */ - -static int do_admin(User * u) -{ - char *cmd = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - NickAlias *na; - int res = 0; - - if (skeleton) { - notice_lang(s_OperServ, u, OPER_ADMIN_SKELETON); - return MOD_CONT; - } - - if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) { - syntax_error(s_OperServ, u, "ADMIN", OPER_ADMIN_SYNTAX); - } else if (!stricmp(cmd, "ADD")) { - if (!is_services_root(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (na->nc->flags & NI_SERVICES_ADMIN - || slist_indexof(&servadmins, na->nc) != -1) { - notice_lang(s_OperServ, u, OPER_ADMIN_EXISTS, nick); - return MOD_CONT; - } - - res = slist_add(&servadmins, na->nc); - if (res == -2) { - notice_lang(s_OperServ, u, OPER_ADMIN_REACHED_LIMIT, nick); - return MOD_CONT; - } else { - if (na->nc->flags & NI_SERVICES_OPER - && (res = slist_indexof(&servopers, na->nc)) != -1) { - slist_delete(&servopers, res); - na->nc->flags |= NI_SERVICES_ADMIN; - notice_lang(s_OperServ, u, OPER_ADMIN_MOVED, nick); - } else { - na->nc->flags |= NI_SERVICES_ADMIN; - notice_lang(s_OperServ, u, OPER_ADMIN_ADDED, nick); - } - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - } else if (!stricmp(cmd, "DEL")) { - if (!is_services_root(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (servadmins.count == 0) { - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_EMPTY); - return MOD_CONT; - } - - if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) { - /* Deleting a range */ - res = slist_delete_range(&servadmins, nick, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_ADMIN_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_ADMIN_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_ADMIN_DELETED_SEVERAL, - res); - } - } else { - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (!(na->nc->flags & NI_SERVICES_ADMIN) - || (res = slist_indexof(&servadmins, na->nc)) == -1) { - notice_lang(s_OperServ, u, OPER_ADMIN_NOT_FOUND, nick); - return MOD_CONT; - } - - slist_delete(&servadmins, res); - notice_lang(s_OperServ, u, OPER_ADMIN_DELETED, nick); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - } else if (!stricmp(cmd, "LIST")) { - int sent_header = 0; - - if (servadmins.count == 0) { - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_EMPTY); - return MOD_CONT; - } - - if (!nick || (isdigit(*nick) - && strspn(nick, "1234567890,-") == strlen(nick))) { - res = - slist_enum(&servadmins, nick, &admin_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_ADMIN_NO_MATCH); - return MOD_CONT; - } else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Admin"); - } - } else { - int i; - - for (i = 0; i < servadmins.count; i++) - if (!stricmp - (nick, ((NickCore *) servadmins.list[i])->display) - || match_wild_nocase(nick, - ((NickCore *) servadmins. - list[i])->display)) - admin_list(i + 1, servadmins.list[i], u, &sent_header); - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_ADMIN_NO_MATCH); - else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Admin"); - } - } - } else if (!stricmp(cmd, "CLEAR")) { - if (!is_services_root(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (servadmins.count == 0) { - notice_lang(s_OperServ, u, OPER_ADMIN_LIST_EMPTY); - return MOD_CONT; - } - - slist_clear(&servadmins, 1); - notice_lang(s_OperServ, u, OPER_ADMIN_CLEAR); - } else { - syntax_error(s_OperServ, u, "ADMIN", OPER_ADMIN_SYNTAX); - } - return MOD_CONT; -} - /*************************************************************************/ /* Callback function used to sort the oper list */ @@ -4243,628 +1605,6 @@ static void free_operlist_entry(SList * slist, void *item) nc->flags &= ~NI_SERVICES_OPER; } -/* Lists an oper entry, prefixing it with the header if needed */ - -static int oper_list(int number, NickCore * nc, User * u, int *sent_header) -{ - if (!nc) - return 0; - - if (!*sent_header) { - notice_lang(s_OperServ, u, OPER_OPER_LIST_HEADER); - *sent_header = 1; - } - - notice_lang(s_OperServ, u, OPER_OPER_LIST_FORMAT, number, nc->display); - return 1; -} - -/* Callback for enumeration purposes */ - -static int oper_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - int *sent_header = va_arg(args, int *); - - return oper_list(number, item, u, sent_header); -} - -/** - * Display an Opers list Entry - **/ -static int opers_list(int number, NickCore * nc, User * u, char *level) -{ - User *au = NULL; - NickAlias *na; - int found; - int i; - - if (!nc) - return 0; - - found = 0; - if ((au = finduser(nc->display))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, '*', level, - nc->display); - } else { - for (i = 0; i < nc->aliases.count; i++) { /* check all aliases */ - na = nc->aliases.list[i]; - if ((au = finduser(na->nick))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_AFORMAT, '*', level, - nc->display, na->nick); - } - } - } - - if (!found) - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, ' ', level, - nc->display); - - return 1; -} - -/** - * Function for the enumerator to call - **/ -static int opers_list_callback(SList * slist, int number, void *item, - va_list args) -{ - User *u = va_arg(args, User *); - char *level = va_arg(args, char *); - - return opers_list(number, item, u, level); -} - -/** - * Display all Services Opers/Admins with Level + Online Status - * /msg OperServ opers - **/ -static int do_staff(User * u) -{ - int idx = 0; - User *au = NULL; - NickCore *nc; - NickAlias *na; - int found; - int i; - - notice_lang(s_OperServ, u, OPER_STAFF_LIST_HEADER); - slist_enum(&servopers, NULL, &opers_list_callback, u, "OPER"); - slist_enum(&servadmins, NULL, &opers_list_callback, u, "ADMN"); - - for (idx = 0; idx < RootNumber; idx++) { - found = 0; - if ((au = finduser(ServicesRoots[idx]))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, '*', "ROOT", - ServicesRoots[idx]); - } else if ((nc = findcore(ServicesRoots[idx]))) { - for (i = 0; i < nc->aliases.count; i++) { /* check all aliases */ - na = nc->aliases.list[i]; - if ((au = finduser(na->nick))) { /* see if user is online */ - found = 1; - notice_lang(s_OperServ, u, OPER_STAFF_AFORMAT, - '*', "ROOT", ServicesRoots[idx], na->nick); - } - } - } - - if (!found) - notice_lang(s_OperServ, u, OPER_STAFF_FORMAT, ' ', "ROOT", - ServicesRoots[idx]); - - } - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Staff"); - return MOD_CONT; -} - -/* Services operator list viewing/modification. */ - -static int do_oper(User * u) -{ - char *cmd = strtok(NULL, " "); - char *nick = strtok(NULL, " "); - NickAlias *na; - int res = 0; - - if (skeleton) { - notice_lang(s_OperServ, u, OPER_OPER_SKELETON); - return MOD_CONT; - } - - if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) { - syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX); - } else if (!stricmp(cmd, "ADD")) { - if (!is_services_admin(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (na->nc->flags & NI_SERVICES_OPER - || slist_indexof(&servopers, na->nc) != -1) { - notice_lang(s_OperServ, u, OPER_OPER_EXISTS, nick); - return MOD_CONT; - } - - res = slist_add(&servopers, na->nc); - if (res == -2) { - notice_lang(s_OperServ, u, OPER_OPER_REACHED_LIMIT, nick); - return MOD_CONT; - } else { - if (na->nc->flags & NI_SERVICES_ADMIN - && (res = slist_indexof(&servadmins, na->nc)) != -1) { - slist_delete(&servadmins, res); - na->nc->flags |= NI_SERVICES_OPER; - notice_lang(s_OperServ, u, OPER_OPER_MOVED, nick); - } else { - na->nc->flags |= NI_SERVICES_OPER; - notice_lang(s_OperServ, u, OPER_OPER_ADDED, nick); - } - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - } else if (!stricmp(cmd, "DEL")) { - if (!is_services_admin(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) { - /* Deleting a range */ - res = slist_delete_range(&servopers, nick, NULL); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); - return MOD_CONT; - } else if (res == 1) { - notice_lang(s_OperServ, u, OPER_OPER_DELETED_ONE); - } else { - notice_lang(s_OperServ, u, OPER_OPER_DELETED_SEVERAL, res); - } - } else { - if (!(na = findnick(nick))) { - notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick); - return MOD_CONT; - } - - if (na->status & NS_VERBOTEN) { - notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick); - return MOD_CONT; - } - - if (!(na->nc->flags & NI_SERVICES_OPER) - || (res = slist_indexof(&servopers, na->nc)) == -1) { - notice_lang(s_OperServ, u, OPER_OPER_NOT_FOUND, nick); - return MOD_CONT; - } - - slist_delete(&servopers, res); - notice_lang(s_OperServ, u, OPER_OPER_DELETED, nick); - } - - if (readonly) - notice_lang(s_OperServ, u, READ_ONLY_MODE); - } else if (!stricmp(cmd, "LIST")) { - int sent_header = 0; - - if (servopers.count == 0) { - notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY); - return MOD_CONT; - } - - if (!nick || (isdigit(*nick) - && strspn(nick, "1234567890,-") == strlen(nick))) { - res = - slist_enum(&servopers, nick, &oper_list_callback, u, - &sent_header); - if (res == 0) { - notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); - return MOD_CONT; - } else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper"); - } - } else { - int i; - - for (i = 0; i < servopers.count; i++) - if (!stricmp - (nick, ((NickCore *) servopers.list[i])->display) - || match_wild_nocase(nick, - ((NickCore *) servopers.list[i])-> - display)) - oper_list(i + 1, servopers.list[i], u, &sent_header); - - if (!sent_header) - notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH); - else { - notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper"); - } - } - } else if (!stricmp(cmd, "CLEAR")) { - if (!is_services_admin(u)) { - notice_lang(s_OperServ, u, PERMISSION_DENIED); - return MOD_CONT; - } - - if (servopers.count == 0) { - notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY); - return MOD_CONT; - } - - slist_clear(&servopers, 1); - notice_lang(s_OperServ, u, OPER_OPER_CLEAR); - } else { - syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -/* Set various Services runtime options. */ - -static int do_set(User * u) -{ - char *option = strtok(NULL, " "); - char *setting = strtok(NULL, " "); - int index; - - if (!option) { - syntax_error(s_OperServ, u, "SET", OPER_SET_SYNTAX); - } else if (stricmp(option, "LIST") == 0) { - index = - (allow_ignore ? OPER_SET_LIST_OPTION_ON : - OPER_SET_LIST_OPTION_OFF); - notice_lang(s_OperServ, u, index, "IGNORE"); - index = - (readonly ? OPER_SET_LIST_OPTION_ON : - OPER_SET_LIST_OPTION_OFF); - notice_lang(s_OperServ, u, index, "READONLY"); - index = - (logchan ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF); - notice_lang(s_OperServ, u, index, "LOGCHAN"); - index = - (debug ? OPER_SET_LIST_OPTION_ON : OPER_SET_LIST_OPTION_OFF); - notice_lang(s_OperServ, u, index, "DEBUG"); - index = - (noexpire ? OPER_SET_LIST_OPTION_ON : - OPER_SET_LIST_OPTION_OFF); - notice_lang(s_OperServ, u, index, "NOEXPIRE"); -#ifdef USE_MYSQL - index = - (do_mysql ? OPER_SET_LIST_OPTION_ON : - OPER_SET_LIST_OPTION_OFF); - notice_lang(s_OperServ, u, index, "SQL"); -#endif - } else if (!setting) { - syntax_error(s_OperServ, u, "SET", OPER_SET_SYNTAX); - } else if (stricmp(option, "IGNORE") == 0) { - if (stricmp(setting, "on") == 0) { - allow_ignore = 1; - notice_lang(s_OperServ, u, OPER_SET_IGNORE_ON); - } else if (stricmp(setting, "off") == 0) { - allow_ignore = 0; - notice_lang(s_OperServ, u, OPER_SET_IGNORE_OFF); - } else { - notice_lang(s_OperServ, u, OPER_SET_IGNORE_ERROR); - } -#ifdef USE_MYSQL - } else if (stricmp(option, "SQL") == 0) { - if (stricmp(setting, "on") == 0) { - if (!MysqlHost) { - notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_DISABLED); - } else { - if (rdb_init()) { - notice_lang(s_OperServ, u, OPER_SET_SQL_ON); - } else { - notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_INIT); - } - } - } else if (stricmp(setting, "off") == 0) { - if (!MysqlHost) { - notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR_DISABLED); - } else { - /* could call rdb_close() but that does nothing - TSL */ - do_mysql = 0; - notice_lang(s_OperServ, u, OPER_SET_SQL_OFF); - } - } else { - notice_lang(s_OperServ, u, OPER_SET_SQL_ERROR); - } -#endif - } else if (stricmp(option, "READONLY") == 0) { - if (stricmp(setting, "on") == 0) { - readonly = 1; - alog("Read-only mode activated"); - close_log(); - notice_lang(s_OperServ, u, OPER_SET_READONLY_ON); - } else if (stricmp(setting, "off") == 0) { - readonly = 0; - open_log(); - alog("Read-only mode deactivated"); - notice_lang(s_OperServ, u, OPER_SET_READONLY_OFF); - } else { - notice_lang(s_OperServ, u, OPER_SET_READONLY_ERROR); - } - - } else if (stricmp(option, "LOGCHAN") == 0) { - /* Unlike the other SET commands where only stricmp is necessary, - * we also have to ensure that LogChannel is defined or we can't - * send to it. - * - * -jester - */ - if (LogChannel && (stricmp(setting, "on") == 0)) { - if (ircd->join2msg) { - anope_cmd_join(s_GlobalNoticer, LogChannel, time(NULL)); - } - logchan = 1; - alog("Now sending log messages to %s", LogChannel); - notice_lang(s_OperServ, u, OPER_SET_LOGCHAN_ON, LogChannel); - } else if (LogChannel && (stricmp(setting, "off") == 0)) { - alog("No longer sending log messages to a channel"); - if (ircd->join2msg) { - anope_cmd_part(s_GlobalNoticer, LogChannel, NULL); - } - logchan = 0; - notice_lang(s_OperServ, u, OPER_SET_LOGCHAN_OFF); - } else { - notice_lang(s_OperServ, u, OPER_SET_LOGCHAN_ERROR); - } - /** - * Allow the user to turn super admin on/off - * - * Rob - **/ - } else if (stricmp(option, "SUPERADMIN") == 0) { - if (!SuperAdmin) { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_NOT_ENABLED); - } else if (stricmp(setting, "on") == 0) { - u->isSuperAdmin = 1; - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ON); - alog("%s: %s is a SuperAdmin ", s_OperServ, u->nick); - anope_cmd_global(s_OperServ, - getstring2(NULL, OPER_SUPER_ADMIN_WALL_ON), - u->nick); - } else if (stricmp(setting, "off") == 0) { - u->isSuperAdmin = 0; - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_OFF); - alog("%s: %s is no longer a SuperAdmin", s_OperServ, u->nick); - anope_cmd_global(s_OperServ, - getstring2(NULL, OPER_SUPER_ADMIN_WALL_OFF), - u->nick); - } else { - notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_SYNTAX); - } - } else if (stricmp(option, "DEBUG") == 0) { - if (stricmp(setting, "on") == 0) { - debug = 1; - alog("Debug mode activated"); - notice_lang(s_OperServ, u, OPER_SET_DEBUG_ON); - } else if (stricmp(setting, "off") == 0 || - (*setting == '0' && atoi(setting) == 0)) { - alog("Debug mode deactivated"); - debug = 0; - notice_lang(s_OperServ, u, OPER_SET_DEBUG_OFF); - } else if (isdigit(*setting) && atoi(setting) > 0) { - debug = atoi(setting); - alog("Debug mode activated (level %d)", debug); - notice_lang(s_OperServ, u, OPER_SET_DEBUG_LEVEL, debug); - } else { - notice_lang(s_OperServ, u, OPER_SET_DEBUG_ERROR); - } - - } else if (stricmp(option, "NOEXPIRE") == 0) { - if (stricmp(setting, "ON") == 0) { - noexpire = 1; - alog("No expire mode activated"); - notice_lang(s_OperServ, u, OPER_SET_NOEXPIRE_ON); - } else if (stricmp(setting, "OFF") == 0) { - noexpire = 0; - alog("No expire mode deactivated"); - notice_lang(s_OperServ, u, OPER_SET_NOEXPIRE_OFF); - } else { - notice_lang(s_OperServ, u, OPER_SET_NOEXPIRE_ERROR); - } - } else { - notice_lang(s_OperServ, u, OPER_SET_UNKNOWN_OPTION, option); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_noop(User * u) -{ - char *cmd = strtok(NULL, " "); - char *server = strtok(NULL, " "); - - if (!cmd || !server) { - syntax_error(s_OperServ, u, "NOOP", OPER_NOOP_SYNTAX); - } else if (!stricmp(cmd, "SET")) { - User *u2; - User *u3 = NULL; - char reason[NICKMAX + 32]; - - /* Remove the O:lines */ - anope_cmd_svsnoop(server, 1); - - snprintf(reason, sizeof(reason), "NOOP command used by %s", - u->nick); - if (WallOSNoOp) - anope_cmd_global(s_OperServ, "\2%s\2 used NOOP on \2%s\2", - u->nick, server); - notice_lang(s_OperServ, u, OPER_NOOP_SET, server); - - /* Kill all the IRCops of the server */ - for (u2 = firstuser(); u2; u2 = u3) { - u3 = nextuser(); - if ((u2) && is_oper(u2) && (u2->server->name) - && match_wild(server, u2->server->name)) { - kill_user(s_OperServ, u2->nick, reason); - } - } - } else if (!stricmp(cmd, "REVOKE")) { - anope_cmd_svsnoop(server, 0); - notice_lang(s_OperServ, u, OPER_NOOP_REVOKE, server); - } else { - syntax_error(s_OperServ, u, "NOOP", OPER_NOOP_SYNTAX); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_jupe(User * u) -{ - char *jserver = strtok(NULL, " "); - char *reason = strtok(NULL, ""); - - if (!jserver) { - syntax_error(s_OperServ, u, "JUPE", OPER_JUPE_SYNTAX); - } else { - if (!isValidHost(jserver, 3)) { - notice_lang(s_OperServ, u, OPER_JUPE_HOST_ERROR); - } else { - anope_cmd_jupe(jserver, u->nick, reason); - - if (WallOSJupe) - anope_cmd_global(s_OperServ, "\2%s\2 used JUPE on \2%s\2", - u->nick, jserver); - } - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_raw(User * u) -{ - - if (!DisableRaw) { - - char *text = strtok(NULL, ""); - - if (!text) - syntax_error(s_OperServ, u, "RAW", OPER_RAW_SYNTAX); - else { - send_cmd(NULL, "%s", text); - if (WallOSRaw) { - char *kw = strtok(text, " "); - while (kw && *kw == ':') - kw = strtok(NULL, " "); - anope_cmd_global(s_OperServ, - "\2%s\2 used RAW command for \2%s\2", - u->nick, - (kw ? kw : - "\2non RFC compliant message\2")); - } - alog("%s used RAW command for %s", u->nick, text); - } - } else { - notice_lang(s_OperServ, u, RAW_DISABLED); - } - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_update(User * u) -{ - notice_lang(s_OperServ, u, OPER_UPDATING); - save_data = 1; - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_reload(User * u) -{ - if (!read_config(1)) { - quitmsg = calloc(28 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = - "Error during the reload of the configuration file, but out of memory!"; - else - sprintf(quitmsg, - "Error during the reload of the configuration file!"); - quitting = 1; - } - - notice_lang(s_OperServ, u, OPER_RELOAD); - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_os_quit(User * u) -{ - quitmsg = calloc(28 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = "QUIT command received, but out of memory!"; - else - sprintf(quitmsg, "QUIT command received from %s", u->nick); - - if (GlobalOnCycle) { - oper_global(NULL, "%s", GlobalOnCycleMessage); - } - quitting = 1; - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_shutdown(User * u) -{ - quitmsg = calloc(32 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = "SHUTDOWN command received, but out of memory!"; - else - sprintf(quitmsg, "SHUTDOWN command received from %s", u->nick); - - if (GlobalOnCycle) { - oper_global(NULL, "%s", GlobalOnCycleMessage); - } - save_data = 1; - delayed_quit = 1; - return MOD_CONT; -} - -/*************************************************************************/ - -static int do_restart(User * u) -{ -#ifdef SERVICES_BIN - quitmsg = calloc(31 + strlen(u->nick), 1); - if (!quitmsg) - quitmsg = "RESTART command received, but out of memory!"; - else - sprintf(quitmsg, "RESTART command received from %s", u->nick); - - if (GlobalOnCycle) { - oper_global(NULL, "%s", GlobalOnCycleMessage); - } - /* raise(SIGHUP); */ - do_restart_services(); -#else - notice_lang(s_OperServ, u, OPER_CANNOT_RESTART); -#endif - return MOD_CONT; -} - /*************************************************************************/ #ifdef DEBUG_COMMANDS @@ -4883,157 +1623,6 @@ static int do_matchwild(User * u) #endif /* DEBUG_COMMANDS */ /*************************************************************************/ - -/* Kill all users matching a certain host. The host is obtained from the - * supplied nick. The raw hostmsk is not supplied with the command in an effort - * to prevent abuse and mistakes from being made - which might cause *.com to - * be killed. It also makes it very quick and simple to use - which is usually - * what you want when someone starts loading numerous clones. In addition to - * killing the clones, we add a temporary AKILL to prevent them from - * immediately reconnecting. - * Syntax: KILLCLONES nick - * -TheShadow (29 Mar 1999) - */ - -static int do_killclones(User * u) -{ - char *clonenick = strtok(NULL, " "); - int count = 0; - User *cloneuser, *user, *tempuser; - char *clonemask, *akillmask; - char killreason[NICKMAX + 32]; - char akillreason[] = "Temporary KILLCLONES akill."; - - if (!clonenick) { - notice_lang(s_OperServ, u, OPER_KILLCLONES_SYNTAX); - - } else if (!(cloneuser = finduser(clonenick))) { - notice_lang(s_OperServ, u, OPER_KILLCLONES_UNKNOWN_NICK, - clonenick); - - } else { - clonemask = smalloc(strlen(cloneuser->host) + 5); - sprintf(clonemask, "*!*@%s", cloneuser->host); - - akillmask = smalloc(strlen(cloneuser->host) + 3); - sprintf(akillmask, "*@%s", cloneuser->host); - - user = firstuser(); - while (user) { - if (match_usermask(clonemask, user) != 0) { - tempuser = nextuser(); - count++; - snprintf(killreason, sizeof(killreason), - "Cloning [%d]", count); - kill_user(NULL, user->nick, killreason); - user = tempuser; - } else { - user = nextuser(); - } - } - - add_akill(u, akillmask, u->nick, - time(NULL) + KillClonesAkillExpire, akillreason); - - anope_cmd_global(s_OperServ, - "\2%s\2 used KILLCLONES for \2%s\2 killing " - "\2%d\2 clones. A temporary AKILL has been added " - "for \2%s\2.", u->nick, clonemask, count, - akillmask); - - alog("%s: KILLCLONES: %d clone(s) matching %s killed.", - s_OperServ, count, clonemask); - - free(akillmask); - free(clonemask); - } - return MOD_CONT; -} - -/** - * Defcon - A method of impelemting various stages of securty, the hope is this will help serives - * protect a network during an attack, allowing admins to choose the precautions taken at each - * level. - * - * /msg OperServ DefCon [level] - * - **/ - -static int do_defcon(User * u) -{ - char *lvl = strtok(NULL, " "); - int newLevel = 0; - char *langglobal; - langglobal = getstring(NULL, DEFCON_GLOBAL); - - if (!DefConLevel) { /* If we dont have a .conf setting! */ - notice_lang(s_OperServ, u, OPER_DEFCON_NO_CONF); - return MOD_CONT; - } - - if (!lvl) { - notice_lang(s_OperServ, u, OPER_DEFCON_CHANGED, DefConLevel); - defcon_sendlvls(u); - return MOD_CONT; - } - newLevel = atoi(lvl); - if (newLevel < 1 || newLevel > 5) { - notice_lang(s_OperServ, u, OPER_DEFCON_SYNTAX); - return MOD_CONT; - } - DefConLevel = newLevel; - send_event(EVENT_DEFCON_LEVEL, "%d", DefConLevel); - DefContimer = time(NULL); - notice_lang(s_OperServ, u, OPER_DEFCON_CHANGED, DefConLevel); - defcon_sendlvls(u); - alog("Defcon level changed to %d by Oper %s", newLevel, u->nick); - anope_cmd_global(s_OperServ, getstring2(NULL, OPER_DEFCON_WALL), - u->nick, newLevel); - /* Global notice the user what is happening. Also any Message that - the Admin would like to add. Set in config file. */ - if (GlobalOnDefcon) { - if ((DefConLevel == 5) && (DefConOffMessage)) { - oper_global(NULL, "%s", DefConOffMessage); - } else { - oper_global(NULL, langglobal, DefConLevel); - } - } - if (GlobalOnDefconMore) { - if ((DefConOffMessage) && DefConLevel == 5) { - } else { - oper_global(NULL, "%s", DefconMessage); - } - } - /* Run any defcon functions, e.g. FORCE CHAN MODE */ - runDefCon(); - return MOD_CONT; -} - -/** - * Reverse the mode string, used for remove DEFCON chan modes. - **/ -char *defconReverseModes(const char *modes) -{ - char *newmodes = NULL; - int i = 0; - if (!modes) { - return NULL; - } - if (!(newmodes = malloc(sizeof(char) * strlen(modes) + 1))) { - return NULL; - } - for (i = 0; i < strlen(modes); i++) { - if (modes[i] == '+') - newmodes[i] = '-'; - else if (modes[i] == '-') - newmodes[i] = '+'; - else - newmodes[i] = modes[i]; - } - newmodes[i] = '\0'; - return newmodes; -} - /** * Returns 1 if the passed level is part of the CURRENT defcon, else 0 is returned **/ @@ -5043,42 +1632,17 @@ int checkDefCon(int level) } /** - * Run DefCon level specific Functions. - **/ -void runDefCon(void) -{ - char *newmodes; - if (checkDefCon(DEFCON_FORCE_CHAN_MODES)) { - if (DefConChanModes && !DefConModesSet) { - if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { - alog("DEFCON: setting %s on all chan's", DefConChanModes); - do_mass_mode(DefConChanModes); - DefConModesSet = 1; - } - } - } else { - if (DefConChanModes && (DefConModesSet != 0)) { - if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { - if ((newmodes = defconReverseModes(DefConChanModes))) { - alog("DEFCON: setting %s on all chan's", newmodes); - do_mass_mode(newmodes); - } - DefConModesSet = 0; - } - } - } -} - -/** * Automaticaly re-set the DefCon level if the time limit has expired. **/ void resetDefCon(int level) { + char strLevel[5]; + snprintf(strLevel, 4, "%d", level); if (DefConLevel != level) { if ((DefContimer) && (time(NULL) - DefContimer >= dotime(DefConTimeOut))) { DefConLevel = level; - send_event(EVENT_DEFCON_LEVEL, "%d", DefConLevel); + send_event(EVENT_DEFCON_LEVEL, 1, strLevel); alog("Defcon level timeout, returning to lvl %d", level); anope_cmd_global(s_OperServ, getstring2(NULL, OPER_DEFCON_WALL), @@ -5100,257 +1664,56 @@ void resetDefCon(int level) } /** - * Send a message to the oper about which precautions are "active" for this level - **/ -static void defcon_sendlvls(User * u) -{ - if (checkDefCon(DEFCON_NO_NEW_CHANNELS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CHANNELS); - } - if (checkDefCon(DEFCON_NO_NEW_NICKS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_NICKS); - } - if (checkDefCon(DEFCON_NO_MLOCK_CHANGE)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_MLOCK_CHANGE); - } - if (checkDefCon(DEFCON_FORCE_CHAN_MODES) && (DefConChanModes)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_FORCE_CHAN_MODES, - DefConChanModes); - } - if (checkDefCon(DEFCON_REDUCE_SESSION)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_REDUCE_SESSION, - DefConSessionLimit); - } - if (checkDefCon(DEFCON_NO_NEW_CLIENTS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_CLIENTS); - } - if (checkDefCon(DEFCON_OPER_ONLY)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_OPER_ONLY); - } - if (checkDefCon(DEFCON_SILENT_OPER_ONLY)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_SILENT_OPER_ONLY); - } - if (checkDefCon(DEFCON_AKILL_NEW_CLIENTS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_AKILL_NEW_CLIENTS); - } - if (checkDefCon(DEFCON_NO_NEW_MEMOS)) { - notice_lang(s_OperServ, u, OPER_HELP_DEFCON_NO_NEW_MEMOS); - } -} - -/** - * ChanKill - Akill an entire channel (got botnet?) - * - * /msg OperServ ChanKill +expire #channel reason - * + * Run DefCon level specific Functions. **/ - -static int do_chankill(User * u) +void runDefCon(void) { - char *expiry, *channel, *reason; - time_t expires; - char breason[BUFSIZE]; - char mask[USERMAX + HOSTMAX + 2]; - struct c_userlist *cu, *next; - Channel *c; - - channel = strtok(NULL, " "); - if (channel && *channel == '+') { - expiry = channel; - channel = strtok(NULL, " "); - } else { - expiry = NULL; - } - - expires = expiry ? dotime(expiry) : ChankillExpiry; - if (expiry && isdigit(expiry[strlen(expiry) - 1])) - expires *= 86400; - if (expires != 0 && expires < 60) { - notice_lang(s_OperServ, u, BAD_EXPIRY_TIME); - return MOD_CONT; - } else if (expires > 0) { - expires += time(NULL); - } - - if (channel && (reason = strtok(NULL, ""))) { - - if (AddAkiller) { - snprintf(breason, sizeof(breason), "[%s] %s", u->nick, reason); - reason = sstrdup(breason); - } - - if ((c = findchan(channel))) { - for (cu = c->users; cu; cu = next) { - next = cu->next; - if (is_oper(cu->user)) { - continue; - } - strncpy(mask, "*@", 3); /* Use *@" for the akill's, */ - strncat(mask, cu->user->host, HOSTMAX); - add_akill(NULL, mask, s_OperServ, expires, reason); - check_akill(cu->user->nick, cu->user->username, - cu->user->host, NULL, NULL); - } - if (WallOSAkill) { - anope_cmd_global(s_OperServ, "%s used CHANKILL on %s (%s)", - u->nick, channel, reason); + char *newmodes; + if (checkDefCon(DEFCON_FORCE_CHAN_MODES)) { + if (DefConChanModes && !DefConModesSet) { + if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { + alog("DEFCON: setting %s on all chan's", DefConChanModes); + do_mass_mode(DefConChanModes); + DefConModesSet = 1; } - } else { - notice_lang(s_OperServ, u, CHAN_X_NOT_IN_USE, channel); } } else { - syntax_error(s_OperServ, u, "CHANKILL", OPER_CHANKILL_SYNTAX); - } - return MOD_CONT; -} - -#ifdef USE_MODULES - -int do_modload(User * u) -{ - char *name; - Module *m; - - name = strtok(NULL, ""); - if (!name) { - syntax_error(s_OperServ, u, "MODLOAD", OPER_MODULE_LOAD_SYNTAX); - return MOD_CONT; - } - m = findModule(name); - if (!m) { - m = createModule(name); - mod_current_module = m; - mod_current_user = u; - mod_current_op = 1; - } else { - notice_lang(s_OperServ, u, OPER_MODULE_LOAD_FAIL, name); - } - return MOD_CONT; -} - -int do_modunload(User * u) -{ - char *name; - Module *m; - - name = strtok(NULL, ""); - if (!name) { - syntax_error(s_OperServ, u, "MODUNLOAD", - OPER_MODULE_UNLOAD_SYNTAX); - return MOD_CONT; - } - m = findModule(name); - if (m) { - mod_current_user = u; - mod_current_module = m; - mod_current_op = 2; - } else { - notice_lang(s_OperServ, u, OPER_MODULE_REMOVE_FAIL, name); - } - return MOD_CONT; -} - -int do_modlist(User * u) -{ - int idx; - int count = 0; - ModuleHash *current = NULL; - - notice_lang(s_OperServ, u, OPER_MODULE_LIST_HEADER); - - for (idx = 0; idx != MAX_CMD_HASH; idx++) { - for (current = MODULE_HASH[idx]; current; current = current->next) { - notice_lang(s_OperServ, u, OPER_MODULE_LIST, current->name, - current->m->version); - count++; + if (DefConChanModes && (DefConModesSet != 0)) { + if (DefConChanModes[0] == '+' || DefConChanModes[0] == '-') { + if ((newmodes = defconReverseModes(DefConChanModes))) { + alog("DEFCON: setting %s on all chan's", newmodes); + do_mass_mode(newmodes); + } + DefConModesSet = 0; + } } } - if (count == 0) { - notice_lang(s_OperServ, u, OPER_MODULE_NO_LIST); - } else { - notice_lang(s_OperServ, u, OPER_MODULE_LIST_FOOTER, count); - } - - return MOD_CONT; } -int do_modinfo(User * u) +/** + * Reverse the mode string, used for remove DEFCON chan modes. + **/ +char *defconReverseModes(const char *modes) { - char *file; - struct tm tm; - char timebuf[64]; - Module *m; - int idx = 0; - int display = 0; - - file = strtok(NULL, ""); - if (!file) { - syntax_error(s_OperServ, u, "MODINFO", OPER_MODULE_INFO_SYNTAX); - return MOD_CONT; - } - m = findModule(file); - if (m) { - tm = *localtime(&m->time); - strftime_lang(timebuf, sizeof(timebuf), u, - STRFTIME_DATE_TIME_FORMAT, &tm); - notice_lang(s_OperServ, u, OPER_MODULE_INFO_LIST, m->name, - m->version ? m->version : "?", - m->author ? m->author : "?", timebuf); - for (idx = 0; idx < MAX_CMD_HASH; idx++) { - display += showModuleCmdLoaded(HOSTSERV[idx], m->name, u); - display += showModuleCmdLoaded(OPERSERV[idx], m->name, u); - display += showModuleCmdLoaded(NICKSERV[idx], m->name, u); - display += showModuleCmdLoaded(CHANSERV[idx], m->name, u); - display += showModuleCmdLoaded(BOTSERV[idx], m->name, u); - display += showModuleCmdLoaded(MEMOSERV[idx], m->name, u); - display += showModuleCmdLoaded(HELPSERV[idx], m->name, u); - display += showModuleMsgLoaded(IRCD[idx], m->name, u); - - } - } - if (display == 0) { - notice_lang(s_OperServ, u, OPER_MODULE_NO_INFO, file); + char *newmodes = NULL; + int i = 0; + if (!modes) { + return NULL; } - return MOD_CONT; -} - -static int showModuleCmdLoaded(CommandHash * cmdList, char *mod_name, - User * u) -{ - Command *c; - CommandHash *current; - int display = 0; - - for (current = cmdList; current; current = current->next) { - for (c = current->c; c; c = c->next) { - if ((c->mod_name) && (stricmp(c->mod_name, mod_name) == 0)) { - notice_lang(s_OperServ, u, OPER_MODULE_CMD_LIST, - c->service, c->name); - display++; - } - } + if (!(newmodes = malloc(sizeof(char) * strlen(modes) + 1))) { + return NULL; } - return display; -} - -static int showModuleMsgLoaded(MessageHash * msgList, char *mod_name, - User * u) -{ - Message *msg; - MessageHash *mcurrent; - int display = 0; - for (mcurrent = msgList; mcurrent; mcurrent = mcurrent->next) { - for (msg = mcurrent->m; msg; msg = msg->next) { - if ((msg->mod_name) && (stricmp(msg->mod_name, mod_name) == 0)) { - notice_lang(s_OperServ, u, OPER_MODULE_MSG_LIST, - msg->name); - display++; - } - } + for (i = 0; i < strlen(modes); i++) { + if (modes[i] == '+') + newmodes[i] = '-'; + else if (modes[i] == '-') + newmodes[i] = '+'; + else + newmodes[i] = modes[i]; } - return display; + newmodes[i] = '\0'; + return newmodes; } -#endif /*************************************************************************/ |