ns_set.c

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