ns_set.c

Go to the documentation of this file.
00001 /* NickServ core functions
00002  *
00003  * (C) 2003-2007 Anope Team
00004  * Contact us at info@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  * $Id: ns_set.c 1265 2007-08-26 15:33:06Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 #include "encrypt.h"
00018 
00019 int do_set(User * u);
00020 int do_set_display(User * u, NickCore * nc, char *param);
00021 int do_set_password(User * u, NickCore * nc, char *param);
00022 int do_set_language(User * u, NickCore * nc, char *param);
00023 int do_set_url(User * u, NickCore * nc, char *param);
00024 int do_set_email(User * u, NickCore * nc, char *param);
00025 int do_set_greet(User * u, NickCore * nc, char *param);
00026 int do_set_icq(User * u, NickCore * nc, char *param);
00027 int do_set_kill(User * u, NickCore * nc, char *param);
00028 int do_set_secure(User * u, NickCore * nc, char *param);
00029 int do_set_private(User * u, NickCore * nc, char *param);
00030 int do_set_msg(User * u, NickCore * nc, char *param);
00031 int do_set_hide(User * u, NickCore * nc, char *param);
00032 int do_set_autoop(User *u, NickCore *nc, char *param);
00033 void myNickServHelp(User * u);
00034 
00041 int AnopeInit(int argc, char **argv)
00042 {
00043     Command *c;
00044 
00045     moduleAddAuthor("Anope");
00046     moduleAddVersion("$Id: ns_set.c 1265 2007-08-26 15:33:06Z geniusdex $");
00047     moduleSetType(CORE);
00048 
00049     c = createCommand("SET", do_set, NULL, NICK_HELP_SET, -1, -1, -1, -1);
00050     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00051     c = createCommand("SET DISPLAY", NULL, NULL, NICK_HELP_SET_DISPLAY, -1,
00052                       -1, -1, -1);
00053     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00054     c = createCommand("SET PASSWORD", NULL, NULL, NICK_HELP_SET_PASSWORD,
00055                       -1, -1, -1, -1);
00056     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00057     c = createCommand("SET URL", NULL, NULL, NICK_HELP_SET_URL, -1, -1, -1,
00058                       -1);
00059     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00060     c = createCommand("SET EMAIL", NULL, NULL, NICK_HELP_SET_EMAIL, -1, -1,
00061                       -1, -1);
00062     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00063     c = createCommand("SET ICQ", NULL, NULL, NICK_HELP_SET_ICQ, -1, -1, -1,
00064                       -1);
00065     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00066     c = createCommand("SET GREET", NULL, NULL, NICK_HELP_SET_GREET, -1, -1,
00067                       -1, -1);
00068     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00069     c = createCommand("SET KILL", NULL, NULL, NICK_HELP_SET_KILL, -1, -1,
00070                       -1, -1);
00071     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00072     c = createCommand("SET SECURE", NULL, NULL, NICK_HELP_SET_SECURE, -1,
00073                       -1, -1, -1);
00074     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00075     c = createCommand("SET PRIVATE", NULL, NULL, NICK_HELP_SET_PRIVATE, -1,
00076                       -1, -1, -1);
00077     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00078     c = createCommand("SET MSG", NULL, NULL, NICK_HELP_SET_MSG, -1, -1, -1,
00079                       -1);
00080     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00081     c = createCommand("SET HIDE", NULL, NULL, NICK_HELP_SET_HIDE, -1, -1,
00082                       -1, -1);
00083     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00084     c = createCommand("SET AUTOOP", NULL, NULL, NICK_HELP_SET_AUTOOP, -1, -1,
00085                       -1, -1);
00086     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00087 
00088     moduleSetNickHelp(myNickServHelp);
00089 
00090     return MOD_CONT;
00091 }
00092 
00096 void AnopeFini(void)
00097 {
00098 
00099 }
00100 
00101 
00102 
00107 void myNickServHelp(User * u)
00108 {
00109     notice_lang(s_NickServ, u, NICK_HELP_CMD_SET);
00110 }
00111 
00117 int do_set(User * u)
00118 {
00119     char *cmd = strtok(NULL, " ");
00120     char *param = strtok(NULL, " ");
00121     NickAlias *na = u->na;
00122 
00123     if (readonly) {
00124         notice_lang(s_NickServ, u, NICK_SET_DISABLED);
00125         return MOD_CONT;
00126     }
00127 
00128     if (!param
00129         && (!cmd
00130             || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0
00131                 && stricmp(cmd, "GREET") != 0
00132                 && stricmp(cmd, "ICQ") != 0))) {
00133         syntax_error(s_NickServ, u, "SET", NICK_SET_SYNTAX);
00134     } else if (!na) {
00135         notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
00136     } else if (na->status & NS_VERBOTEN) {
00137         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00138     } else if (na->nc->flags & NI_SUSPENDED) {
00139         notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00140     } else if (!nick_identified(u)) {
00141         notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
00142     } else if (stricmp(cmd, "DISPLAY") == 0) {
00143         do_set_display(u, na->nc, param);
00144     } else if (stricmp(cmd, "PASSWORD") == 0) {
00145         do_set_password(u, na->nc, param);
00146     } else if (stricmp(cmd, "LANGUAGE") == 0) {
00147         do_set_language(u, na->nc, param);
00148     } else if (stricmp(cmd, "URL") == 0) {
00149         do_set_url(u, na->nc, param);
00150     } else if (stricmp(cmd, "EMAIL") == 0) {
00151         do_set_email(u, na->nc, param);
00152     } else if (stricmp(cmd, "ICQ") == 0) {
00153         do_set_icq(u, na->nc, param);
00154     } else if (stricmp(cmd, "GREET") == 0) {
00155         do_set_greet(u, na->nc, param);
00156     } else if (stricmp(cmd, "KILL") == 0) {
00157         do_set_kill(u, na->nc, param);
00158     } else if (stricmp(cmd, "SECURE") == 0) {
00159         do_set_secure(u, na->nc, param);
00160     } else if (stricmp(cmd, "PRIVATE") == 0) {
00161         do_set_private(u, na->nc, param);
00162     } else if (stricmp(cmd, "MSG") == 0) {
00163         do_set_msg(u, na->nc, param);
00164     } else if (stricmp(cmd, "HIDE") == 0) {
00165         do_set_hide(u, na->nc, param);
00166     } else if (stricmp(cmd, "AUTOOP") == 0) {
00167         do_set_autoop(u, na->nc, param);
00168     } else {
00169         notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION, cmd);
00170     }
00171     return MOD_CONT;
00172 }
00173 
00174 int do_set_display(User * u, NickCore * nc, char *param)
00175 {
00176     int i;
00177     NickAlias *na;
00178 
00179     /* First check whether param is a valid nick of the group */
00180     for (i = 0; i < nc->aliases.count; i++) {
00181         na = nc->aliases.list[i];
00182         if (!stricmp(na->nick, param)) {
00183             param = na->nick;   /* Because case may differ */
00184             break;
00185         }
00186     }
00187 
00188     if (i == nc->aliases.count) {
00189         notice_lang(s_NickServ, u, NICK_SET_DISPLAY_INVALID);
00190         return MOD_CONT;
00191     }
00192 
00193     change_core_display(nc, param);
00194     notice_lang(s_NickServ, u, NICK_SET_DISPLAY_CHANGED, nc->display);
00195 
00196     /* Enable nick tracking if enabled */
00197     if (NSNickTracking)
00198         nsStartNickTracking(u);
00199 
00200     return MOD_CONT;
00201 }
00202 
00203 int do_set_password(User * u, NickCore * nc, char *param)
00204 {
00205     int len = strlen(param);
00206     char tmp_pass[PASSMAX];
00207 
00208     if (stricmp(nc->display, param) == 0 || (StrictPasswords && len < 5)) {
00209         notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);
00210         return MOD_CONT;
00211     }
00212 
00213     if (len > PASSMAX) {
00214         len = PASSMAX;
00215         param[len] = 0;
00216         notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX);
00217     }
00218 
00219     if (nc->pass)
00220         free(nc->pass);
00221 
00222     nc->pass = smalloc(PASSMAX);
00223 
00224     if (enc_encrypt(param, len, nc->pass, PASSMAX) < 0) {
00225         memset(param, 0, len);
00226         alog("%s: Failed to encrypt password for %s (set)", s_NickServ,
00227              nc->display);
00228         notice_lang(s_NickServ, u, NICK_SET_PASSWORD_FAILED);
00229         return MOD_CONT;
00230     }
00231 
00232     memset(param, 0, len);
00233 
00234     if(enc_decrypt(nc->pass,tmp_pass,PASSMAX)==1) {
00235         notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED_TO, nc->pass);
00236     } else {
00237         notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED);
00238     }
00239 
00240     alog("%s: %s!%s@%s (e-mail: %s) changed its password.", s_NickServ,
00241          u->nick, u->username, u->host, (nc->email ? nc->email : "none"));
00242 
00243     return MOD_CONT;
00244 }
00245 
00246 int do_set_language(User * u, NickCore * nc, char *param)
00247 {
00248     int langnum;
00249 
00250     if (param[strspn(param, "0123456789")] != 0) {      /* i.e. not a number */
00251         syntax_error(s_NickServ, u, "SET LANGUAGE",
00252                      NICK_SET_LANGUAGE_SYNTAX);
00253         return MOD_CONT;
00254     }
00255     langnum = atoi(param) - 1;
00256     if (langnum < 0 || langnum >= NUM_LANGS || langlist[langnum] < 0) {
00257         notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_UNKNOWN, langnum + 1,
00258                     s_NickServ);
00259         return MOD_CONT;
00260     }
00261     nc->language = langlist[langnum];
00262     notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_CHANGED);
00263     return MOD_CONT;
00264 }
00265 
00266 int do_set_url(User * u, NickCore * nc, char *param)
00267 {
00268     if (nc->url)
00269         free(nc->url);
00270 
00271     if (param) {
00272         nc->url = sstrdup(param);
00273         notice_lang(s_NickServ, u, NICK_SET_URL_CHANGED, param);
00274     } else {
00275         nc->url = NULL;
00276         notice_lang(s_NickServ, u, NICK_SET_URL_UNSET);
00277     }
00278     return MOD_CONT;
00279 }
00280 
00281 int do_set_email(User * u, NickCore * nc, char *param)
00282 {
00283     if (!param && NSForceEmail) {
00284         notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET_IMPOSSIBLE);
00285         return MOD_CONT;
00286     } else if (param && !MailValidate(param)) {
00287         notice_lang(s_NickServ, u, MAIL_X_INVALID, param);
00288         return MOD_CONT;
00289     }
00290 
00291     alog("%s: %s!%s@%s (e-mail: %s) changed its e-mail to %s.",
00292          s_NickServ, u->nick, u->username, u->host,
00293          (nc->email ? nc->email : "none"), (param ? param : "none"));
00294 
00295     if (nc->email)
00296         free(nc->email);
00297 
00298     if (param) {
00299         nc->email = sstrdup(param);
00300         notice_lang(s_NickServ, u, NICK_SET_EMAIL_CHANGED, param);
00301     } else {
00302         nc->email = NULL;
00303         notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET);
00304     }
00305     return MOD_CONT;
00306 }
00307 
00308 int do_set_icq(User * u, NickCore * nc, char *param)
00309 {
00310     if (param) {
00311         int32 tmp = atol(param);
00312         if (!tmp) {
00313             notice_lang(s_NickServ, u, NICK_SET_ICQ_INVALID, param);
00314         } else {
00315             nc->icq = tmp;
00316             notice_lang(s_NickServ, u, NICK_SET_ICQ_CHANGED, param);
00317         }
00318     } else {
00319         nc->icq = 0;
00320         notice_lang(s_NickServ, u, NICK_SET_ICQ_UNSET);
00321     }
00322     return MOD_CONT;
00323 }
00324 
00325 int do_set_greet(User * u, NickCore * nc, char *param)
00326 {
00327     if (nc->greet)
00328         free(nc->greet);
00329 
00330     if (param) {
00331         char buf[BUFSIZE];
00332         char *end = strtok(NULL, "");
00333 
00334         snprintf(buf, sizeof(buf), "%s%s%s", param, (end ? " " : ""),
00335                  (end ? end : ""));
00336 
00337         nc->greet = sstrdup(buf);
00338         notice_lang(s_NickServ, u, NICK_SET_GREET_CHANGED, buf);
00339     } else {
00340         nc->greet = NULL;
00341         notice_lang(s_NickServ, u, NICK_SET_GREET_UNSET);
00342     }
00343     return MOD_CONT;
00344 }
00345 
00346 int do_set_kill(User * u, NickCore * nc, char *param)
00347 {
00348     if (stricmp(param, "ON") == 0) {
00349         nc->flags |= NI_KILLPROTECT;
00350         nc->flags &= ~(NI_KILL_QUICK | NI_KILL_IMMED);
00351         notice_lang(s_NickServ, u, NICK_SET_KILL_ON);
00352     } else if (stricmp(param, "QUICK") == 0) {
00353         nc->flags |= NI_KILLPROTECT | NI_KILL_QUICK;
00354         nc->flags &= ~NI_KILL_IMMED;
00355         notice_lang(s_NickServ, u, NICK_SET_KILL_QUICK);
00356     } else if (stricmp(param, "IMMED") == 0) {
00357         if (NSAllowKillImmed) {
00358             nc->flags |= NI_KILLPROTECT | NI_KILL_IMMED;
00359             nc->flags &= ~NI_KILL_QUICK;
00360             notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED);
00361         } else {
00362             notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED_DISABLED);
00363         }
00364     } else if (stricmp(param, "OFF") == 0) {
00365         nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED);
00366         notice_lang(s_NickServ, u, NICK_SET_KILL_OFF);
00367     } else {
00368         syntax_error(s_NickServ, u, "SET KILL",
00369                      NSAllowKillImmed ? NICK_SET_KILL_IMMED_SYNTAX :
00370                      NICK_SET_KILL_SYNTAX);
00371     }
00372     return MOD_CONT;
00373 }
00374 
00375 int do_set_secure(User * u, NickCore * nc, char *param)
00376 {
00377     if (stricmp(param, "ON") == 0) {
00378         nc->flags |= NI_SECURE;
00379         notice_lang(s_NickServ, u, NICK_SET_SECURE_ON);
00380     } else if (stricmp(param, "OFF") == 0) {
00381         nc->flags &= ~NI_SECURE;
00382         notice_lang(s_NickServ, u, NICK_SET_SECURE_OFF);
00383     } else {
00384         syntax_error(s_NickServ, u, "SET SECURE", NICK_SET_SECURE_SYNTAX);
00385     }
00386     return MOD_CONT;
00387 }
00388 
00389 int do_set_private(User * u, NickCore * nc, char *param)
00390 {
00391     if (stricmp(param, "ON") == 0) {
00392         nc->flags |= NI_PRIVATE;
00393         notice_lang(s_NickServ, u, NICK_SET_PRIVATE_ON);
00394     } else if (stricmp(param, "OFF") == 0) {
00395         nc->flags &= ~NI_PRIVATE;
00396         notice_lang(s_NickServ, u, NICK_SET_PRIVATE_OFF);
00397     } else {
00398         syntax_error(s_NickServ, u, "SET PRIVATE",
00399                      NICK_SET_PRIVATE_SYNTAX);
00400     }
00401     return MOD_CONT;
00402 }
00403 
00404 int do_set_msg(User * u, NickCore * nc, char *param)
00405 {
00406     if (!UsePrivmsg) {
00407         notice_lang(s_NickServ, u, NICK_SET_OPTION_DISABLED, "MSG");
00408         return MOD_CONT;
00409     }
00410 
00411     if (stricmp(param, "ON") == 0) {
00412         nc->flags |= NI_MSG;
00413         notice_lang(s_NickServ, u, NICK_SET_MSG_ON);
00414     } else if (stricmp(param, "OFF") == 0) {
00415         nc->flags &= ~NI_MSG;
00416         notice_lang(s_NickServ, u, NICK_SET_MSG_OFF);
00417     } else {
00418         syntax_error(s_NickServ, u, "SET MSG", NICK_SET_MSG_SYNTAX);
00419     }
00420     return MOD_CONT;
00421 }
00422 
00423 int do_set_hide(User * u, NickCore * nc, char *param)
00424 {
00425     int flag, onmsg, offmsg;
00426 
00427     if (stricmp(param, "EMAIL") == 0) {
00428         flag = NI_HIDE_EMAIL;
00429         onmsg = NICK_SET_HIDE_EMAIL_ON;
00430         offmsg = NICK_SET_HIDE_EMAIL_OFF;
00431     } else if (stricmp(param, "USERMASK") == 0) {
00432         flag = NI_HIDE_MASK;
00433         onmsg = NICK_SET_HIDE_MASK_ON;
00434         offmsg = NICK_SET_HIDE_MASK_OFF;
00435     } else if (stricmp(param, "STATUS") == 0) {
00436         flag = NI_HIDE_STATUS;
00437         onmsg = NICK_SET_HIDE_STATUS_ON;
00438         offmsg = NICK_SET_HIDE_STATUS_OFF;
00439     } else if (stricmp(param, "QUIT") == 0) {
00440         flag = NI_HIDE_QUIT;
00441         onmsg = NICK_SET_HIDE_QUIT_ON;
00442         offmsg = NICK_SET_HIDE_QUIT_OFF;
00443     } else {
00444         syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
00445         return MOD_CONT;
00446     }
00447 
00448     param = strtok(NULL, " ");
00449     if (!param) {
00450         syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
00451     } else if (stricmp(param, "ON") == 0) {
00452         nc->flags |= flag;
00453         notice_lang(s_NickServ, u, onmsg, s_NickServ);
00454     } else if (stricmp(param, "OFF") == 0) {
00455         nc->flags &= ~flag;
00456         notice_lang(s_NickServ, u, offmsg, s_NickServ);
00457     } else {
00458         syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
00459     }
00460     return MOD_CONT;
00461 }
00462 
00463 int do_set_autoop(User *u, NickCore *nc, char *param) {
00464 
00470     if (stricmp(param, "ON") == 0) {
00471         nc->flags &= ~NI_AUTOOP;
00472         notice_lang(s_NickServ, u, NICK_SET_AUTOOP_ON);
00473     } else if (stricmp(param, "OFF") == 0) {
00474     nc->flags |= NI_AUTOOP;
00475         notice_lang(s_NickServ, u, NICK_SET_AUTOOP_OFF);
00476     } else {
00477         syntax_error(s_NickServ, u, "SET AUTOOP", NICK_SET_AUTOOP_SYNTAX);
00478     }
00479 
00480     return MOD_CONT;
00481 }
00482 
00483 
00484 /* EOF */

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