00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
00061 }
00062
00063
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
00078
00079
00080
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
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
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
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
00271 char *langtable_en_us[] = {
00272
00273 " ENFORCE Enforce various channel modes and set options",
00274
00275 "Syntax: \002ENFORCE \037channel\037 [\037what\037]\002",
00276
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
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
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
00304 char *langtable_nl[] = {
00305
00306 " ENFORCE Forceer enkele kanaalmodes en set-opties",
00307
00308 "Syntax: \002ENFORCE \037kanaal\037 [\037wat\037]\002",
00309
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
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
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
00339 char *langtable_de[] = {
00340
00341 " ENFORCE Erzwingt verschieden Modes und SET Optionen",
00342
00343 "Syntax: \002ENFORCE \037Channel\037 [\037was\037]\002",
00344
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
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
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
00371 char *langtable_pt[] = {
00372
00373 " ENFORCE Verifica o cumprimento de vários modos de canal e opções ajustadas",
00374
00375 "Sintaxe: \002ENFORCE \037canal\037 [\037opção\037]\002",
00376
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
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
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
00403 char *langtable_it[] = {
00404
00405 " ENFORCE Forza diversi modi di canale ed opzioni SET",
00406
00407 "Sintassi: \002ENFORCE \037canale\037 [\037cosa\037]\002",
00408
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
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
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