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