cs_enforce.c

Go to the documentation of this file.
00001 /* cs_enforce - Add a /cs ENFORCE command to enforce various set
00002  *              options and channelmodes on a channel.
00003  * 
00004  * (C) 2003-2007 Anope Team
00005  * Contact us at info@anope.org
00006  * 
00007  * Included in the Anope module pack since Anope 1.7.9
00008  * Anope Coder: GeniusDex <geniusdex@anope.org>
00009  * 
00010  * Please read COPYING and README for further details.
00011  *
00012  * Send any bug reports to the Anope Coder, as he will be able
00013  * to deal with it best.
00014  */
00015 
00016 #include "module.h"
00017 
00018 #define AUTHOR "Anope"
00019 #define VERSION "$Id: cs_enforce.c 1265 2007-08-26 15:33:06Z geniusdex $"
00020 
00021 int my_cs_enforce(User * u);
00022 void my_cs_help(User * u);
00023 int my_cs_help_enforce(User * u);
00024 void my_add_languages(void);
00025 
00026 #define LNG_NUM_STRINGS    6
00027 
00028 #define LNG_CHAN_HELP                           0
00029 #define LNG_ENFORCE_SYNTAX                      1
00030 #define LNG_CHAN_HELP_ENFORCE                   2
00031 #define LNG_CHAN_HELP_ENFORCE_R_ENABLED         3
00032 #define LNG_CHAN_HELP_ENFORCE_R_DISABLED        4
00033 #define LNG_CHAN_RESPONSE                       5
00034 
00035 int AnopeInit(int argc, char **argv)
00036 {
00037     Command *c;
00038     int status;
00039 
00040     moduleAddAuthor(AUTHOR);
00041     moduleAddVersion(VERSION);
00042     moduleSetType(SUPPORTED);
00043 
00044     c = createCommand("ENFORCE", my_cs_enforce, NULL, -1, -1, -1, -1, -1);
00045     if ((status = moduleAddCommand(CHANSERV, c, MOD_HEAD))) {
00046         alog("[cs_enforce] Unable to create ENFORCE command: %d", status);
00047         return MOD_STOP;
00048     }
00049 
00050     moduleAddHelp(c, my_cs_help_enforce);
00051     moduleSetChanHelp(my_cs_help);
00052 
00053     my_add_languages();
00054 
00055     return MOD_CONT;
00056 }
00057 
00058 void AnopeFini(void)
00059 {
00060     /* Nothing to clean up */
00061 }
00062 
00063 /* Enforcing functions */
00064 void do_enforce_secureops(Channel * c)
00065 {
00066     struct c_userlist *user;
00067     struct c_userlist *next;
00068     ChannelInfo *ci;
00069     uint32 flags;
00070 
00071     if (!(ci = c->ci))
00072         return;
00073 
00074     if (debug)
00075         alog("debug: cs_enforce: Enforcing SECUREOPS on %s", c->name);
00076 
00077     /* Dirty hack to allow chan_set_correct_modes to work ok.
00078      * We pretend like SECUREOPS is on so it doesn't ignore that
00079      * part of the code. This way we can enforce SECUREOPS even
00080      * if it's off.
00081      */
00082     flags = ci->flags;
00083     ci->flags |= CI_SECUREOPS;
00084 
00085     user = c->users;
00086     do {
00087         next = user->next;
00088         chan_set_correct_modes(user->user, c, 0);
00089         user = next;
00090     } while (user);
00091 
00092     ci->flags = flags;
00093 }
00094 
00095 void do_enforce_restricted(Channel * c)
00096 {
00097     struct c_userlist *user;
00098     struct c_userlist *next;
00099     ChannelInfo *ci;
00100     int16 old_nojoin_level;
00101     char mask[BUFSIZE];
00102     char *reason;
00103     char *av[3];
00104     User *u;
00105 
00106     if (!(ci = c->ci))
00107         return;
00108 
00109     if (debug)
00110         alog("debug: cs_enforce: Enforcing RESTRICTED on %s", c->name);
00111 
00112     old_nojoin_level = ci->levels[CA_NOJOIN];
00113     if (ci->levels[CA_NOJOIN] < 0)
00114         ci->levels[CA_NOJOIN] = 0;
00115 
00116     user = c->users;
00117     do {
00118         next = user->next;
00119         u = user->user;
00120         if (check_access(u, c->ci, CA_NOJOIN)) {
00121             get_idealban(ci, u, mask, sizeof(mask));
00122             reason = getstring(u->na, CHAN_NOT_ALLOWED_TO_JOIN);
00123             anope_cmd_mode(whosends(ci), ci->name, "+b %s %lu", mask,
00124                            time(NULL));
00125             anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s", reason);
00126             av[0] = ci->name;
00127             av[1] = u->nick;
00128             av[2] = reason;
00129             do_kick(s_ChanServ, 3, av);
00130         }
00131         user = next;
00132     } while (user);
00133 
00134     ci->levels[CA_NOJOIN] = old_nojoin_level;
00135 }
00136 
00137 void do_enforce_cmode_R(Channel * c)
00138 {
00139     struct c_userlist *user;
00140     struct c_userlist *next;
00141     ChannelInfo *ci;
00142     char mask[BUFSIZE];
00143     char *reason;
00144     char *av[3];
00145     User *u;
00146     CBMode *cbm;
00147 
00148     if (!(ci = c->ci))
00149         return;
00150 
00151     if (debug)
00152         alog("debug: cs_enforce: Enforcing mode +R on %s", c->name);
00153 
00154     user = c->users;
00155     do {
00156         next = user->next;
00157         u = user->user;
00158         if (!nick_identified(u)) {
00159             get_idealban(ci, u, mask, sizeof(mask));
00160             reason = getstring(u->na, CHAN_NOT_ALLOWED_TO_JOIN);
00161             if (((cbm = &cbmodes['R'])->flag == 0)
00162                 || !(c->mode & cbm->flag))
00163                 anope_cmd_mode(whosends(ci), ci->name, "+b %s %lu", mask,
00164                                time(NULL));
00165             anope_cmd_kick(whosends(ci), ci->name, u->nick, "%s", reason);
00166             av[0] = ci->name;
00167             av[1] = u->nick;
00168             av[2] = reason;
00169             do_kick(s_ChanServ, 3, av);
00170         }
00171         user = next;
00172     } while (user);
00173 }
00174 
00175 /* Enforcing Group Functions */
00176 void do_enforce_set(Channel * c)
00177 {
00178     ChannelInfo *ci;
00179 
00180     if (!(ci = c->ci))
00181         return;
00182 
00183     if (ci->flags & CI_SECUREOPS)
00184         do_enforce_secureops(c);
00185     if (ci->flags & CI_RESTRICTED)
00186         do_enforce_restricted(c);
00187 }
00188 
00189 void do_enforce_modes(Channel * c)
00190 {
00191     CBMode *cbm;
00192 
00193     if (((cbm = &cbmodes['R'])->flag != 0) && (c->mode & cbm->flag))
00194         do_enforce_cmode_R(c);
00195 }
00196 
00197 /* End of enforcing functions */
00198 
00199 int my_cs_enforce(User * u)
00200 {
00201     char *cur_buffer;
00202     char *chan=NULL;
00203     char *what=NULL;
00204     Channel *c;
00205     ChannelInfo *ci;
00206 
00207     cur_buffer = moduleGetLastBuffer();
00208     chan = myStrGetToken(cur_buffer, ' ', 0);
00209 
00210     if (!chan) {
00211         moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
00212     } else if (!(c = findchan(chan))) {
00213         notice_lang(s_ChanServ, u, CHAN_X_NOT_IN_USE, chan);
00214     } else if (!(ci = c->ci)) {
00215         notice_lang(s_ChanServ, u, CHAN_X_NOT_REGISTERED, chan);
00216     } else if (ci->flags & CI_VERBOTEN) {
00217         notice_lang(s_ChanServ, u, CHAN_X_FORBIDDEN, ci->name);
00218     } else if (!is_services_admin(u) && !check_access(u, ci, CA_AKICK)) {
00219         notice_lang(s_ChanServ, u, PERMISSION_DENIED);
00220     } else {
00221         what = myStrGetToken(cur_buffer, ' ', 1);
00222         if (!what || (stricmp(what, "SET") == 0)) {
00223             do_enforce_set(c);
00224         moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
00225         } else if (stricmp(what, "MODES") == 0) {
00226             do_enforce_modes(c);
00227         moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
00228         } else if (stricmp(what, "SECUREOPS") == 0) {
00229             do_enforce_secureops(c);
00230         moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
00231         } else if (stricmp(what, "RESTRICTED") == 0) {
00232             do_enforce_restricted(c);
00233         moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
00234         } else if (stricmp(what, "+R") == 0) {
00235             do_enforce_cmode_R(c);
00236         moduleNoticeLang(s_ChanServ,u,LNG_CHAN_RESPONSE,what);
00237         } else {
00238             moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
00239         }
00240     }
00241 
00242     if(chan) free(chan);
00243     if(what) free(what);
00244 
00245     return MOD_CONT;
00246 }
00247 
00248 /* Language and response stuff */
00249 void my_cs_help(User * u)
00250 {
00251     moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP);
00252 }
00253 
00254 int my_cs_help_enforce(User * u)
00255 {
00256     moduleNoticeLang(s_ChanServ, u, LNG_ENFORCE_SYNTAX);
00257     notice(s_ChanServ, u->nick, " ");
00258     moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_ENFORCE);
00259     notice(s_ChanServ, u->nick, " ");
00260     if (cbmodes['R'].flag != 0)
00261         moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_ENFORCE_R_ENABLED);
00262     else
00263         moduleNoticeLang(s_ChanServ, u, LNG_CHAN_HELP_ENFORCE_R_DISABLED);
00264 
00265     return MOD_STOP;
00266 }
00267 
00268 void my_add_languages(void)
00269 {
00270     /* English (US) */
00271     char *langtable_en_us[] = {
00272         /* LNG_CHAN_HELP */
00273         "    ENFORCE    Enforce various channel modes and set options",
00274         /* LNG_ENFORCE_SYNTAX */
00275         "Syntax: \002ENFORCE \037channel\037 [\037what\037]\002",
00276         /* LNG_CHAN_HELP_ENFORCE */
00277         "Enforce various channel modes and set options. The \037channel\037\n"
00278             "option indicates what channel to enforce the modes and options\n"
00279             "on. The \037what\037 option indicates what modes and options to\n"
00280             "enforce, and can be any of SET, SECUREOPS, RESTRICTED, MODES,\n"
00281             "or +R. When left out, it defaults to SET.\n"
00282             " \n"
00283             "If \037what\037 is SET, it will enforce SECUREOPS and RESTRICTED\n"
00284             "on the users currently in the channel, if they are set. Give\n"
00285             "SECUREOPS to enforce the SECUREOPS option, even if it is not\n"
00286             "enabled. Use RESTRICTED to enfore the RESTRICTED option, also\n"
00287             "if it's not enabled.",
00288         /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
00289         "If \037what\037 is MODES, it will enforce channelmode +R if it is\n"
00290             "set. If +R is specified for \037what\037, the +R channelmode will\n"
00291             "also be enforced, but even if it is not set. If it is not set,\n"
00292             "users will be banned to ensure they don't just rejoin.",
00293         /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
00294         "If \037what\037 is MODES, nothing will be enforced, since it would\n"
00295             "enforce modes that the current ircd does not support. If +R is\n"
00296             "specified for \037what\037, an equalivant of channelmode +R on\n"
00297             "other ircds will be enforced. All users that are in the channel\n"
00298             "but have not identified for their nickname will be kicked and\n"
00299             "banned from the channel.",
00300     "Enforced %s"
00301     };
00302 
00303     /* Dutch (NL) */
00304     char *langtable_nl[] = {
00305         /* LNG_CHAN_HELP */
00306         "    ENFORCE    Forceer enkele kanaalmodes en set-opties",
00307         /* LNG_ENFORCE_SYNTAX */
00308         "Syntax: \002ENFORCE \037kanaal\037 [\037wat\037]\002",
00309         /* LNG_CHAN_HELP_ENFORCE */
00310         "Forceer enkele kannalmodes en set-opties. De \037kanaal\037 optie\n"
00311             "geeft aan op welk kanaal de modes en opties geforceerd moeten\n"
00312             "worden. De \037wat\037 optie geeft aan welke modes en opties\n"
00313             "geforceerd moeten worden; dit kan SET, SECUREOPS, RESTRICTED,\n"
00314             "MODES, of +R zijn. Indien weggelaten is dit standaard SET.\n"
00315             " \n"
00316             "Als er voor \037wat\037 SET wordt ingevuld, zullen SECUREOPS en\n"
00317             "RESTRICTED geforceerd worden op de gebruikers in het kanaal,\n"
00318             "maar alleen als die opties aangezet zijn voor het kanaal. Als\n"
00319             "SECUREOPS of RESTRICTED wordt gegeven voor \037wat\037 zal die optie\n"
00320             "altijd geforceerd worden, ook als die niet is aangezet.",
00321         /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
00322         "Als er voor \037wat\037 MODES wordt ingevuld, zal kanaalmode +R worden\n"
00323             "geforceerd, als die op het kanaal aan staat. Als +R wordt ingevuld,\n"
00324             "zal kanaalmode +R worden geforceerd, maar ook als die niet aan"
00325             "staat voor het kanaal. Als +R niet aan staat, zullen alle ook\n"
00326             "gebanned worden om te zorgen dat ze niet opnieuw het kanaal binnen\n"
00327             "kunnen komen.",
00328         /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
00329         "Als er voor \037wat\037 MODES wordt ingevuld, zal er niks gebeuren.\n"
00330             "Normaal gesproken wordt er een kanaalmode geforceerd die op deze\n"
00331             "server niet ondersteund wordt. Als +R wordt ingevuld voor \037wat\037\n"
00332             "zullen alle gebruikers die in het kanaal zitten maar zich niet\n"
00333             "hebben geidentificeerd voor hun nick uit het kanaal gekicked en\n"
00334             "verbannen worden.",
00335     "Enforced %s"
00336     };
00337 
00338    /* German (DE) */
00339    char *langtable_de[] = {
00340         /* LNG_CHAN_HELP */
00341         "    ENFORCE   Erzwingt verschieden Modes und SET Optionen",
00342         /* LNG_ENFORCE_SYNTAX */
00343         "Syntax: \002ENFORCE \037Channel\037 [\037was\037]\002",
00344         /* LNG_CHAN_HELP_ENFORCE */
00345         "Erzwingt verschieden Modes und SET Optionen. Die \037Channel\037\n"
00346             "Option zeigt dir den Channel an, indem Modes und Optionen\n"
00347             "zu erzwingen sind. Die \037was\037 Option zeigt dir welche Modes\n"
00348             "und Optionen zu erzwingen sind. Die können nur SET, SECUREOPS,\n"
00349             "RESTRICTED, MODES oder +R sein.Default ist SET.\n"
00350             " \n"
00351             "Wenn \037was\037 SET ist, wird SECUREOPS und RESTRICTED\n"
00352             "auf die User die z.Z.in Channel sind erzwungen, wenn sie AN sind.\n"
00353             "Benutze SECUREOPS oder RESTRICTED , um die Optionen einzeln\n"
00354             "zu erzwingen, also wenn sie nicht eingeschaltet sind.",
00355         /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
00356         "Wenn \037was\037 MODES ist, wird das ChannelMode +R erzwungen\n"
00357             "falls an. Wenn \037was\037 +R ist, wird +R erzwungen aber eben\n"
00358             "wenn noch nicht als Channel-Mode ist. Wenn +R noch nicht als\n"
00359             "Channel-Mode war werden alle User aus den Channel gebannt um\n"
00360             "sicher zu sein das sie nicht rejoinen.",
00361         /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
00362         "Wenn \037was\037 MODES ist, wird nichts erzwungen weil es MODES seine\n"
00363             "können die dein IRCD nicht unterstützt. Wenn \037was\037 +R ist\n"
00364             "oder ein Modes was auf ein anderen IRCD gleich +R ist, wird es\n"
00365             "erzwungen. Alle User die nicht für deren Nicknamen identifiziert\n"
00366             "sind werden aus den Channel gekickt und gebannt.",
00367         "Erzwungen %s"
00368     };
00369 
00370     /* Portuguese (PT) */
00371     char *langtable_pt[] = {
00372         /* LNG_CHAN_HELP */
00373         "    ENFORCE    Verifica o cumprimento de vários modos de canal e opções ajustadas",
00374         /* LNG_ENFORCE_SYNTAX */
00375         "Sintaxe: \002ENFORCE \037canal\037 [\037opção\037]\002",
00376         /* LNG_CHAN_HELP_ENFORCE */
00377         "Verifica o cumprimento de vários modos de canal e opções ajustadas.\n"
00378             "O campo \037canal\037 indica qual canal deve ter os modos e opções verificadas\n"
00379             "O campo \037opção\037 indica quais modos e opções devem ser verificadas,\n"
00380             "e pode ser: SET, SECUREOPS, RESTRICTED, MODES ou +R\n"
00381             "Quando deixado em branco, o padrão é SET.\n"
00382             " \n"
00383             "Se \037opção\037 for SET, serão verificadas as opções SECUREOPS e RESTRICTED\n"
00384             "para usuários que estiverem no canal, caso elas estejam ativadas. Use\n"
00385             "SECUREOPS para verificar a opção SECUREOPS, mesmo que ela não esteja ativada\n"
00386             "Use RESTRICTED para verificar a opção RESTRICTED, mesmo que ela não esteja\n"
00387             "ativada.",
00388         /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
00389         "Se \037opção\037 for MODES, será verificado o modo de canal +R caso ele\n"
00390             "esteja ativado. Se +R for especificado para \037opção\037, o modo de canal\n"
00391             "+R também será verificado, mesmo que ele não esteja ativado. Se ele não\n"
00392             "estiver ativado, os usuários serão banidos para evitar que reentrem no canal.",
00393         /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
00394         "Se \037opção\037 for MODES, nada será verificado, visto que isto poderia\n"
00395             "verificar modos que o IRCd atual não suporta. Se +R for especificado\n"
00396             "para \037opção\037, um equivalente ao modo de canal +R em outros IRCds\n"
00397             "será verificado. Todos os usuários que estão no canal, mas não estejam\n"
00398             "identificados para seus nicks serão kickados e banidos do canal.",
00399     "Verificado %s"
00400     };
00401 
00402     /* Italian (IT) */
00403     char *langtable_it[] = {
00404         /* LNG_CHAN_HELP */
00405         "    ENFORCE    Forza diversi modi di canale ed opzioni SET",
00406         /* LNG_ENFORCE_SYNTAX */
00407         "Sintassi: \002ENFORCE \037canale\037 [\037cosa\037]\002",
00408         /* LNG_CHAN_HELP_ENFORCE */
00409         "Forza diversi modi di canale ed opzioni SET. Il parametro \037canale\037\n"
00410             "indica il canale sul quale forzare i modi e le opzioni. Il parametro\n"
00411             "\037cosa\037 indica i modi e le opzioni da forzare, e possono essere\n"
00412             "qualsiasi delle opzioni SET, SECUREOPS, RESTRICTED, MODES, o +R.\n"
00413             "Se non specificato, viene sottointeso SET.\n"
00414             " \n"
00415             "Se \037cosa\037 è SET, forzerà SECUREOPS e RESTRICTED sugli utenti\n"
00416             "attualmente nel canale, se sono impostati. Specifica SECUREOPS per\n"
00417             "forzare l'opzione SECUREOPS, anche se non è attivata. Specifica\n"
00418             "RESTRICTED per forzare l'opzione RESTRICTED, anche se non è\n"
00419             "attivata.",
00420         /* LNG_CHAN_HELP_ENFORCE_R_ENABLED */
00421         "Se \037cosa\037 è MODES, forzerà il modo del canale +R se è impostato.\n"
00422             "Se +R è specificato per \037cosa\037, il modo del canale +R verrà\n"
00423             "forzato, anche se non è impostato. Se non è impostato, gli utenti\n"
00424             "verranno bannati per assicurare che non rientrino semplicemente.",
00425         /* LNG_CHAN_HELP_ENFORCE_R_DISABLED */
00426         "Se \037cosa\037 è MODES, niente verrà forzato, siccome forzerebbe\n"
00427             "dei modi che l'ircd in uso non supporterebbe. Se +R è specificato\n"
00428             "per \037cosa\037, un modo equivalente a +R sui altri ircd verrà\n"
00429             "forzato. Tutti gli utenti presenti nel canale ma non identificati\n"
00430             "per il loro nickname verranno bannati ed espulsi dal canale.\n",
00431     "Forzato %s"
00432     };
00433 
00434     moduleInsertLanguage(LANG_EN_US, LNG_NUM_STRINGS, langtable_en_us);
00435     moduleInsertLanguage(LANG_NL, LNG_NUM_STRINGS, langtable_nl);
00436     moduleInsertLanguage(LANG_DE, LNG_NUM_STRINGS, langtable_de);
00437     moduleInsertLanguage(LANG_PT, LNG_NUM_STRINGS, langtable_pt);
00438     moduleInsertLanguage(LANG_IT, LNG_NUM_STRINGS, langtable_it);
00439 }
00440 
00441 /* EOF */

Generated on Sun Dec 30 09:26:49 2007 for Anope by  doxygen 1.5.1-20070107