00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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;
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
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) {
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