summaryrefslogtreecommitdiff
path: root/src/nickserv.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nickserv.c')
-rw-r--r--src/nickserv.c2599
1 files changed, 14 insertions, 2585 deletions
diff --git a/src/nickserv.c b/src/nickserv.c
index 76dfcf21f..ac0cdd0ae 100644
--- a/src/nickserv.c
+++ b/src/nickserv.c
@@ -36,111 +36,21 @@ extern char *getvHost(char *nick);
void alpha_insert_alias(NickAlias * na);
void insert_core(NickCore * nc);
void insert_requestnick(NickRequest * nr);
-static NickAlias *makenick(const char *nick);
-static NickRequest *makerequest(const char *nick);
-static NickAlias *makealias(const char *nick, NickCore * nc);
-static void change_core_display(NickCore * nc, char *newdisplay);
+void change_core_display(NickCore * nc, char *newdisplay);
-static void collide(NickAlias * na, int from_timeout);
-static void release(NickAlias * na, int from_timeout);
+void collide(NickAlias * na, int from_timeout);
+void release(NickAlias * na, int from_timeout);
static void add_ns_timeout(NickAlias * na, int type, time_t delay);
-static void del_ns_timeout(NickAlias * na, int type);
+void del_ns_timeout(NickAlias * na, int type);
int delnickrequest(NickRequest * nr);
NickRequest *findrequestnick(const char *nick);
-static int do_sendregmail(User * u, NickRequest * nr);
-static int do_setmodes(User * u);
-
-static int do_help(User * u);
-static int do_register(User * u);
-static int do_confirm(User * u);
-static int do_group(User * u);
-static int do_nickupdate(User * u);
-static int do_identify(User * u);
-static int do_logout(User * u);
-static int do_drop(User * u);
-static int do_set(User * u);
-static int do_set_display(User * u, NickCore * nc, char *param);
-static int do_set_password(User * u, NickCore * nc, char *param);
-static int do_set_language(User * u, NickCore * nc, char *param);
-static int do_set_url(User * u, NickCore * nc, char *param);
-static int do_set_email(User * u, NickCore * nc, char *param);
-static int do_set_greet(User * u, NickCore * nc, char *param);
-static int do_set_icq(User * u, NickCore * nc, char *param);
-static int do_set_kill(User * u, NickCore * nc, char *param);
-static int do_set_secure(User * u, NickCore * nc, char *param);
-static int do_set_private(User * u, NickCore * nc, char *param);
-static int do_set_msg(User * u, NickCore * nc, char *param);
-static int do_set_hide(User * u, NickCore * nc, char *param);
-static int do_set_noexpire(User * u, NickAlias * nc, char *param);
-static int do_access(User * u);
-static int do_info(User * u);
-static int do_list(User * u);
-static int do_alist(User * u);
-static int do_glist(User * u);
-static int do_recover(User * u);
-static int do_release(User * u);
-static int do_ghost(User * u);
-static int do_status(User * u);
-static int do_getpass(User * u);
-static int do_getemail(User * u);
-static int do_sendpass(User * u);
-static int do_forbid(User * u);
-static int do_resend(User * u);
-static int do_suspend(User * u);
-static int do_unsuspend(User * u);
-
-/* Obsolete commands */
-static int do_link(User * u);
-static int do_unlink(User * u);
-static int do_listlinks(User * u);
+int do_setmodes(User * u);
/*************************************************************************/
/* *INDENT-OFF* */
void moduleAddNickServCmds(void) {
- Command *c;
- c = createCommand("HELP", do_help, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("REGISTER", do_register, NULL, NICK_HELP_REGISTER, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("RESEND", do_resend, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("CONFIRM", do_confirm, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("GROUP", do_group, NULL, NICK_HELP_GROUP, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("UPDATE", do_nickupdate, NULL, NICK_HELP_UPDATE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("ID", do_identify, NULL, NICK_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("IDENTIFY", do_identify, NULL, NICK_HELP_IDENTIFY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SIDENTIFY",do_identify, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("LOGOUT", do_logout, NULL, -1,NICK_HELP_LOGOUT, -1,NICK_SERVADMIN_HELP_LOGOUT, NICK_SERVADMIN_HELP_LOGOUT); addCoreCommand(NICKSERV,c);
- c = createCommand("DROP", do_drop, NULL, -1,NICK_HELP_DROP, -1,NICK_SERVADMIN_HELP_DROP, NICK_SERVADMIN_HELP_DROP); addCoreCommand(NICKSERV,c);
- c = createCommand("LINK", do_link, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("UNLINK", do_unlink, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("LISTLINKS",do_listlinks, NULL, -1, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("ACCESS", do_access, NULL, NICK_HELP_ACCESS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET", do_set, NULL, NICK_HELP_SET,-1, -1,NICK_SERVADMIN_HELP_SET, NICK_SERVADMIN_HELP_SET); addCoreCommand(NICKSERV,c);
- c = createCommand("SET DISPLAY", NULL, NULL, NICK_HELP_SET_DISPLAY, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET PASSWORD", NULL, NULL, NICK_HELP_SET_PASSWORD, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET URL", NULL, NULL, NICK_HELP_SET_URL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET EMAIL", NULL, NULL, NICK_HELP_SET_EMAIL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET ICQ", NULL, NULL, NICK_HELP_SET_ICQ, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET GREET", NULL, NULL, NICK_HELP_SET_GREET, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET KILL", NULL, NULL, NICK_HELP_SET_KILL, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET SECURE", NULL, NULL, NICK_HELP_SET_SECURE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET PRIVATE", NULL, NULL, NICK_HELP_SET_PRIVATE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET MSG", NULL, NULL, NICK_HELP_SET_MSG, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET HIDE", NULL, NULL, NICK_HELP_SET_HIDE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SET NOEXPIRE", NULL, NULL, -1, -1,-1,NICK_SERVADMIN_HELP_SET_NOEXPIRE,NICK_SERVADMIN_HELP_SET_NOEXPIRE); addCoreCommand(NICKSERV,c);
- c = createCommand("RECOVER", do_recover, NULL, NICK_HELP_RECOVER, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("RELEASE", do_release, NULL, NICK_HELP_RELEASE, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("GHOST", do_ghost, NULL, NICK_HELP_GHOST, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("INFO", do_info, NULL, NICK_HELP_INFO,-1, NICK_HELP_INFO, NICK_SERVADMIN_HELP_INFO,NICK_SERVADMIN_HELP_INFO); addCoreCommand(NICKSERV,c);
- c = createCommand("LIST", do_list, NULL, -1,NICK_HELP_LIST, -1,NICK_SERVADMIN_HELP_LIST, NICK_SERVADMIN_HELP_LIST); addCoreCommand(NICKSERV,c);
- c = createCommand("ALIST", do_alist, NULL, -1,NICK_HELP_ALIST, -1,NICK_SERVADMIN_HELP_ALIST, NICK_SERVADMIN_HELP_ALIST); addCoreCommand(NICKSERV,c);
- c = createCommand("GLIST", do_glist, NULL, -1,NICK_HELP_GLIST, -1,NICK_SERVADMIN_HELP_GLIST, NICK_SERVADMIN_HELP_GLIST); addCoreCommand(NICKSERV,c);
- c = createCommand("STATUS", do_status, NULL, NICK_HELP_STATUS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("SENDPASS", do_sendpass, NULL, NICK_HELP_SENDPASS, -1,-1,-1,-1); addCoreCommand(NICKSERV,c);
- c = createCommand("GETPASS", do_getpass, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_GETPASS, NICK_SERVADMIN_HELP_GETPASS); addCoreCommand(NICKSERV,c);
- c = createCommand("GETEMAIL", do_getemail, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_GETEMAIL, NICK_SERVADMIN_HELP_GETEMAIL); addCoreCommand(NICKSERV,c);
- c = createCommand("FORBID", do_forbid, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_FORBID, NICK_SERVADMIN_HELP_FORBID); addCoreCommand(NICKSERV,c);
- c = createCommand("SUSPEND", do_suspend, is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_SUSPEND, NICK_SERVADMIN_HELP_SUSPEND); addCoreCommand(NICKSERV,c);
- c = createCommand("UNSUSPEND",do_unsuspend,is_services_admin, -1,-1, -1,NICK_SERVADMIN_HELP_UNSUSPEND, NICK_SERVADMIN_HELP_UNSUSPEND); addCoreCommand(NICKSERV,c);
+ modules_core_init(NickServCoreNumber, NickServCoreModules);
}
/* *INDENT-ON* */
/*************************************************************************/
@@ -1240,7 +1150,7 @@ void expire_nicks()
(na->nc->email ? na->nc->email : "none"));
tmpnick = sstrdup(na->nick);
delnick(na);
- send_event(EVENT_NICK_EXPIRE, tmpnick);
+ send_event(EVENT_NICK_EXPIRE, 1, tmpnick);
free(tmpnick);
}
}
@@ -1451,67 +1361,12 @@ void insert_requestnick(NickRequest * nr)
}
/*************************************************************************/
-/* Creates a new Nick Request */
-static NickRequest *makerequest(const char *nick)
-{
- NickRequest *nr;
-
- nr = scalloc(1, sizeof(NickRequest));
- nr->nick = sstrdup(nick);
- insert_requestnick(nr);
- alog("%s: Nick %s has been requested", s_NickServ, nr->nick);
- return nr;
-}
-
-
-
-/* Creates a full new nick (alias + core) in NickServ database. */
-
-static NickAlias *makenick(const char *nick)
-{
- NickAlias *na;
- NickCore *nc;
-
- /* First make the core */
- nc = scalloc(1, sizeof(NickCore));
- nc->display = sstrdup(nick);
- slist_init(&nc->aliases);
- insert_core(nc);
- alog("%s: group %s has been created", s_NickServ, nc->display);
-
- /* Then make the alias */
- na = scalloc(1, sizeof(NickAlias));
- na->nick = sstrdup(nick);
- na->nc = nc;
- slist_add(&nc->aliases, na);
- alpha_insert_alias(na);
- return na;
-}
-
-/*************************************************************************/
-
-/* Creates a new alias in NickServ database. */
-
-static NickAlias *makealias(const char *nick, NickCore * nc)
-{
- NickAlias *na;
-
- /* Just need to make the alias */
- na = scalloc(1, sizeof(NickAlias));
- na->nick = sstrdup(nick);
- na->nc = nc;
- slist_add(&nc->aliases, na);
- alpha_insert_alias(na);
- return na;
-}
-
-/*************************************************************************/
/* Sets nc->display to newdisplay. If newdisplay is NULL, it will change
* it to the first alias in the list.
*/
-static void change_core_display(NickCore * nc, char *newdisplay)
+void change_core_display(NickCore * nc, char *newdisplay)
{
if (!newdisplay) {
NickAlias *na;
@@ -1745,7 +1600,7 @@ int delnick(NickAlias * na)
* This is watched for and done in cancel_user(). -TheShadow
*/
-static void collide(NickAlias * na, int from_timeout)
+void collide(NickAlias * na, int from_timeout)
{
char guestnick[NICKMAX];
@@ -1779,7 +1634,7 @@ static void collide(NickAlias * na, int from_timeout)
/* Release hold on a nick. */
-static void release(NickAlias * na, int from_timeout)
+void release(NickAlias * na, int from_timeout)
{
if (!from_timeout)
del_ns_timeout(na, TO_RELEASE);
@@ -1905,7 +1760,7 @@ void add_ns_timeout(NickAlias * na, int type, time_t delay)
/* Delete a collide/release timeout. */
-static void del_ns_timeout(NickAlias * na, int type)
+void del_ns_timeout(NickAlias * na, int type)
{
struct my_timeout *t, *t2;
@@ -1962,675 +1817,6 @@ void clean_ns_timeouts(NickAlias * na)
/*************************************************************************/
/*********************** NickServ command routines ***********************/
/*************************************************************************/
-
-/* Return a help message. */
-
-static int do_help(User * u)
-{
- char *cmd = strtok(NULL, "");
-
- if (!cmd) {
- notice_help(s_NickServ, u, NICK_HELP);
- if (NSExpire >= 86400)
- notice_help(s_NickServ, u, NICK_HELP_EXPIRES,
- NSExpire / 86400);
- if (is_services_oper(u))
- notice_help(s_NickServ, u, NICK_SERVADMIN_HELP);
- moduleDisplayHelp(1, u);
- } else if (stricmp(cmd, "SET LANGUAGE") == 0) {
- int i;
- notice_help(s_NickServ, u, NICK_HELP_SET_LANGUAGE);
- for (i = 0; i < NUM_LANGS && langlist[i] >= 0; i++)
- notice_user(s_NickServ, u, " %2d) %s", i + 1,
- langnames[langlist[i]]);
- } else {
- mod_help_cmd(s_NickServ, u, NICKSERV, cmd);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-/* Register a nick. */
-
-static int do_register(User * u)
-{
- NickRequest *nr = NULL, *anr = NULL;
- NickCore *nc = NULL;
- int prefixlen = strlen(NSGuestNickPrefix);
- int nicklen = strlen(u->nick);
- char *pass = strtok(NULL, " ");
- char *email = strtok(NULL, " ");
- char passcode[11];
- int idx, min = 1, max = 62, i = 0;
- int chars[] =
- { ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
- 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
- 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
- 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
- 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
- };
-
- if (readonly) {
- notice_lang(s_NickServ, u, NICK_REGISTRATION_DISABLED);
- return MOD_CONT;
- }
-
- if (checkDefCon(DEFCON_NO_NEW_NICKS)) {
- notice_lang(s_NickServ, u, OPER_DEFCON_DENIED);
- return MOD_CONT;
- }
-
- if (!is_oper(u) && NickRegDelay
- && ((time(NULL) - u->my_signon) < NickRegDelay)) {
- notice_lang(s_NickServ, u, NICK_REG_DELAY, NickRegDelay);
- return MOD_CONT;
- }
-
- if ((anr = findrequestnick(u->nick))) {
- notice_lang(s_NickServ, u, NICK_REQUESTED);
- return MOD_CONT;
- }
- /* Prevent "Guest" nicks from being registered. -TheShadow */
-
- /* Guest nick can now have a series of between 1 and 7 digits.
- * --lara
- */
- if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1 &&
- stristr(u->nick, NSGuestNickPrefix) == u->nick &&
- strspn(u->nick + prefixlen, "1234567890") == nicklen - prefixlen) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, u->nick);
- return MOD_CONT;
- }
-
- if (RestrictOperNicks) {
- for (i = 0; i < RootNumber; i++) {
- if (stristr(u->nick, ServicesRoots[i]) && !is_oper(u)) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- for (i = 0; i < servadmins.count && (nc = servadmins.list[i]); i++) {
- if (stristr(u->nick, nc->display) && !is_oper(u)) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- for (i = 0; i < servopers.count && (nc = servopers.list[i]); i++) {
- if (stristr(u->nick, nc->display) && !is_oper(u)) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- }
-
- if (!pass) {
- if (NSForceEmail) {
- syntax_error(s_NickServ, u, "REGISTER",
- NICK_REGISTER_SYNTAX_EMAIL);
- } else {
- syntax_error(s_NickServ, u, "REGISTER", NICK_REGISTER_SYNTAX);
- }
- } else if (NSForceEmail && !email) {
- syntax_error(s_NickServ, u, "REGISTER",
- NICK_REGISTER_SYNTAX_EMAIL);
- } else if (time(NULL) < u->lastnickreg + NSRegDelay) {
- notice_lang(s_NickServ, u, NICK_REG_PLEASE_WAIT, NSRegDelay);
- } else if (u->na) { /* i.e. there's already such a nick regged */
- if (u->na->status & NS_VERBOTEN) {
- alog("%s: %s@%s tried to register FORBIDden nick %s",
- s_NickServ, u->username, u->host, u->nick);
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED, u->nick);
- } else {
- notice_lang(s_NickServ, u, NICK_ALREADY_REGISTERED, u->nick);
- }
- } else if (stricmp(u->nick, pass) == 0
- || (StrictPasswords && strlen(pass) < 5)) {
- notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);
- } else if (email && !MailValidate(email)) {
- notice_lang(s_NickServ, u, MAIL_X_INVALID, email);
- } else {
-#ifdef USE_ENCRYPTION
- if (strlen(pass) > PASSMAX) {
- pass[PASSMAX] = 0;
- notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX);
- }
-#else
- if (strlen(pass) > PASSMAX - 1) { /* -1 for null byte */
- pass[PASSMAX] = 0;
- notice_lang(s_NickServ, u, PASSWORD_TRUNCATED, PASSMAX - 1);
- }
-#endif
- for (idx = 0; idx < 9; idx++) {
- passcode[idx] =
- chars[(1 +
- (int) (((float) (max - min)) * getrandom16() /
- (65535 + 1.0)) + min)];
- } passcode[idx] = '\0';
- nr = makerequest(u->nick);
- nr->passcode = sstrdup(passcode);
- nr->password = sstrdup(pass);
- if (email) {
- nr->email = sstrdup(email);
- }
- nr->requested = time(NULL);
- if (NSEmailReg) {
- if (do_sendregmail(u, nr) == 0) {
- notice_lang(s_NickServ, u, NICK_ENTER_REG_CODE, email,
- s_NickServ);
- alog("%s: sent registration verification code to %s",
- s_NickServ, nr->email);
- } else {
- alog("%s: Unable to send registration verification mail",
- s_NickServ);
- notice_lang(s_NickServ, u, NICK_REG_UNABLE);
- delnickrequest(nr); /* Delete the NickRequest if we couldnt send the mail */
- return MOD_CONT;
- }
- } else {
- do_confirm(u);
- }
-
- }
- return MOD_CONT;
-}
-
-
-static int do_resend(User * u)
-{
- NickRequest *nr = NULL;
- if (NSEmailReg) {
- if ((nr = findrequestnick(u->nick))) {
- if (do_sendregmail(u, nr) == 0) {
- notice_lang(s_NickServ, u, NICK_REG_RESENT, nr->email);
- alog("%s: re-sent registration verification code for %s to %s", s_NickServ, nr->nick, nr->email);
- } else {
- alog("%s: Unable to re-send registration verification mail for %s", s_NickServ, nr->nick);
- return MOD_CONT;
- }
- }
- }
- return MOD_CONT;
-}
-
-static int do_sendregmail(User * u, NickRequest * nr)
-{
- MailInfo *mail = NULL;
- char buf[BUFSIZE];
-
- if (!(nr || u)) {
- return -1;
- }
- snprintf(buf, sizeof(buf), getstring2(NULL, NICK_REG_MAIL_SUBJECT),
- nr->nick);
- mail = MailRegBegin(u, nr, buf, s_NickServ);
- if (!mail) {
- return -1;
- }
- fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_HEAD));
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_1), nr->nick);
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_2), s_NickServ,
- nr->passcode);
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_3));
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_4));
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring2(NULL, NICK_REG_MAIL_LINE_5),
- NetworkName);
- fprintf(mail->pipe, "\n.\n");
- MailEnd(mail);
- return 0;
-}
-
-static int do_confirm(User * u)
-{
-
- NickRequest *nr = NULL;
- NickAlias *na = NULL;
- char *passcode = strtok(NULL, " ");
- char *pass = NULL;
- char *email = NULL;
- int forced = 0;
- User *utmp = NULL;
-#ifdef USE_ENCRYPTION
- int len;
-#endif
- nr = findrequestnick(u->nick);
-
- if (NSEmailReg) {
- if (!passcode) {
- notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID);
- return MOD_CONT;
- }
-
- if (!nr) {
- if (is_services_admin(u)) {
-/* If an admin, thier nick is obviously already regged, so look at the passcode to get the nick
- of the user they are trying to validate, and push that user through regardless of passcode */
- nr = findrequestnick(passcode);
- if (nr) {
- utmp = finduser(passcode);
- if (utmp) {
- sprintf(passcode,
- "FORCE_ACTIVATION_DUE_TO_OPER_CONFIRM %s",
- nr->passcode);
- passcode = strtok(passcode, " ");
- notice_lang(s_NickServ, u, NICK_FORCE_REG,
- nr->nick);
- do_confirm(utmp);
- return MOD_CONT;
- } else {
- passcode = sstrdup(nr->passcode);
- forced = 1;
- }
- } else {
- notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND,
- s_NickServ);
- return MOD_CONT;
- }
- } else {
- notice_lang(s_NickServ, u, NICK_CONFIRM_NOT_FOUND,
- s_NickServ);
- return MOD_CONT;
- }
- }
-
- if (stricmp(nr->passcode, passcode) != 0) {
- notice_lang(s_NickServ, u, NICK_CONFIRM_INVALID);
- return MOD_CONT;
- }
- }
-
- if (!nr) {
- notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
- return MOD_CONT;
- }
- pass = sstrdup(nr->password);
-
- if (nr->email) {
- email = sstrdup(nr->email);
- }
- na = makenick(nr->nick);
-
- if (na) {
- int i;
- char tsbuf[16];
-
-#ifdef USE_ENCRYPTION
- len = strlen(pass);
- na->nc->pass = smalloc(PASSMAX);
- if (encrypt(pass, len, na->nc->pass, PASSMAX) < 0) {
- memset(pass, 0, strlen(pass));
- alog("%s: Failed to encrypt password for %s (register)",
- s_NickServ, nr->nick);
- notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
- return MOD_CONT;
- }
- memset(pass, 0, strlen(pass));
- na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED);
- na->nc->flags |= NI_ENCRYPTEDPW;
-#else
- na->nc->pass = sstrdup(pass);
- na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED);
-#endif
- na->nc->flags |= NSDefFlags;
- for (i = 0; i < RootNumber; i++) {
- if (!stricmp(ServicesRoots[i], nr->nick)) {
- na->nc->flags |= NI_SERVICES_ROOT;
- break;
- }
- }
- na->nc->memos.memomax = MSMaxMemos;
- na->nc->channelmax = CSMaxReg;
- if (forced == 1) {
- na->last_usermask = sstrdup("*@*");
- na->last_realname = sstrdup("unknown");
- } else {
- na->last_usermask =
- scalloc(strlen(common_get_vident(u)) +
- strlen(common_get_vhost(u)) + 2, 1);
- sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
- common_get_vhost(u));
- na->last_realname = sstrdup(u->realname);
- }
- na->time_registered = na->last_seen = time(NULL);
- if (NSAddAccessOnReg) {
- na->nc->accesscount = 1;
- na->nc->access = scalloc(sizeof(char *), 1);
- na->nc->access[0] = create_mask(u);
- } else {
- na->nc->accesscount = 0;
- na->nc->access = NULL;
- }
- na->nc->language = NSDefLanguage;
- if (email)
- na->nc->email = sstrdup(email);
- if (forced != 1) {
- u->na = na;
- na->u = u;
- alog("%s: '%s' registered by %s@%s (e-mail: %s)", s_NickServ,
- u->nick, u->username, u->host, (email ? email : "none"));
- if (NSAddAccessOnReg)
- notice_lang(s_NickServ, u, NICK_REGISTERED, u->nick,
- na->nc->access[0]);
- else
- notice_lang(s_NickServ, u, NICK_REGISTERED_NO_MASK,
- u->nick);
- send_event(EVENT_NICK_REGISTERED, u->nick);
-#ifndef USE_ENCRYPTION
- notice_lang(s_NickServ, u, NICK_PASSWORD_IS, na->nc->pass);
-#endif
- u->lastnickreg = time(NULL);
- if (ircd->modeonreg) {
- if (ircd->tsonmode) {
- snprintf(tsbuf, sizeof(tsbuf), "%lu",
- (unsigned long int) u->timestamp);
- common_svsmode(u, ircd->modeonreg, tsbuf);
- } else {
- common_svsmode(u, ircd->modeonreg, NULL);
- }
- }
-
- } else {
- notice_lang(s_NickServ, u, NICK_FORCE_REG, nr->nick);
- }
- delnickrequest(nr); /* remove the nick request */
- } else {
- alog("%s: makenick(%s) failed", s_NickServ, u->nick);
- notice_lang(s_NickServ, u, NICK_REGISTRATION_FAILED);
- }
-
- /* Enable nick tracking if enabled */
- if (NSNickTracking)
- nsStartNickTracking(u);
-
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-/* Register a nick in a specified group. */
-
-static int do_group(User * u)
-{
- NickAlias *na, *target;
- NickCore *nc;
- char *nick = strtok(NULL, " ");
- char *pass = strtok(NULL, " ");
- int i;
- char tsbuf[16];
-
- if (NSEmailReg && (findrequestnick(u->nick))) {
- notice_lang(s_NickServ, u, NICK_REQUESTED);
- return MOD_CONT;
- }
-
- if (readonly) {
- notice_lang(s_NickServ, u, NICK_GROUP_DISABLED);
- return MOD_CONT;
- }
- if (checkDefCon(DEFCON_NO_NEW_NICKS)) {
- notice_lang(s_NickServ, u, OPER_DEFCON_DENIED);
- return MOD_CONT;
- }
-
- if (RestrictOperNicks) {
- for (i = 0; i < RootNumber; i++) {
- if (stristr(u->nick, ServicesRoots[i]) && !is_oper(u)) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- for (i = 0; i < servadmins.count && (nc = servadmins.list[i]); i++) {
- if (stristr(u->nick, nc->display) && !is_oper(u)) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- for (i = 0; i < servopers.count && (nc = servopers.list[i]); i++) {
- if (stristr(u->nick, nc->display) && !is_oper(u)) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- }
-
- if (!nick || !pass) {
- syntax_error(s_NickServ, u, "GROUP", NICK_GROUP_SYNTAX);
- } else if (time(NULL) < u->lastnickreg + NSRegDelay) {
- notice_lang(s_NickServ, u, NICK_GROUP_PLEASE_WAIT, NSRegDelay);
- } else if (u->na && (u->na->status & NS_VERBOTEN)) {
- alog("%s: %s@%s tried to use GROUP from FORBIDden nick %s",
- s_NickServ, u->username, u->host, u->nick);
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u->nick);
- } else if (u->na && (u->na->nc->flags & NI_SUSPENDED)) {
- alog("%s: %s@%s tried to use GROUP from SUSPENDED nick %s",
- s_NickServ, u->username, u->host, u->nick);
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, u->nick);
- } else if (u->na && NSNoGroupChange) {
- notice_lang(s_NickServ, u, NICK_GROUP_CHANGE_DISABLED, s_NickServ);
- } else if (u->na && !nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else if (!(target = findnick(nick))) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- } else if (target && (target->nc->flags & NI_SUSPENDED)) {
- alog("%s: %s@%s tried to use GROUP from SUSPENDED nick %s",
- s_NickServ, u->username, u->host, u->nick);
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, target->nick);
- } else if (target->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
- } else if (u->na && target->nc == u->na->nc) {
- notice_lang(s_NickServ, u, NICK_GROUP_SAME, target->nick);
- } else if (NSMaxAliases && (target->nc->aliases.count >= NSMaxAliases)
- && !nick_is_services_admin(target->nc)) {
- notice_lang(s_NickServ, u, NICK_GROUP_TOO_MANY, target->nick,
- s_NickServ, s_NickServ);
- } else if (check_password(pass, target->nc->pass) != 1) {
- alog("%s: Failed GROUP for %s!%s@%s (invalid password)",
- s_NickServ, u->nick, u->username, u->host);
- notice_lang(s_NickServ, u, PASSWORD_INCORRECT);
- bad_password(u);
- } else {
- /* If the nick is already registered, drop it.
- * If not, check that it is valid.
- */
- if (u->na) {
- delnick(u->na);
- } else {
- int prefixlen = strlen(NSGuestNickPrefix);
- int nicklen = strlen(u->nick);
-
- if (nicklen <= prefixlen + 7 && nicklen >= prefixlen + 1
- && stristr(u->nick, NSGuestNickPrefix) == u->nick
- && strspn(u->nick + prefixlen,
- "1234567890") == nicklen - prefixlen) {
- notice_lang(s_NickServ, u, NICK_CANNOT_BE_REGISTERED,
- u->nick);
- return MOD_CONT;
- }
- }
- na = makealias(u->nick, target->nc);
-
- if (na) {
- na->last_usermask =
- scalloc(strlen(common_get_vident(u)) +
- strlen(common_get_vhost(u)) + 2, 1);
- sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
- common_get_vhost(u));
- na->last_realname = sstrdup(u->realname);
- na->time_registered = na->last_seen = time(NULL);
- na->status = (int16) (NS_IDENTIFIED | NS_RECOGNIZED);
-
- if (!(na->nc->flags & NI_SERVICES_ROOT)) {
- for (i = 0; i < RootNumber; i++) {
- if (!stricmp(ServicesRoots[i], u->nick)) {
- na->nc->flags |= NI_SERVICES_ROOT;
- break;
- }
- }
- }
-
- u->na = na;
- na->u = u;
-
-#ifdef USE_RDB
- /* Is this really needed? Since this is a new alias it will get
- * its unique id on the next update, since it was previously
- * deleted by delnick. Must observe...
- */
- if (rdb_open()) {
- rdb_save_ns_alias(na);
- rdb_close();
- }
-#endif
- send_event(EVENT_GROUP, u->nick);
- alog("%s: %s!%s@%s makes %s join group of %s (%s) (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, u->nick, target->nick, target->nc->display, (target->nc->email ? target->nc->email : "none"));
- notice_lang(s_NickServ, u, NICK_GROUP_JOINED, target->nick);
-
- u->lastnickreg = time(NULL);
- snprintf(tsbuf, sizeof(tsbuf), "%lu",
- (unsigned long int) u->timestamp);
- if (ircd->modeonreg) {
- if (ircd->tsonmode) {
- common_svsmode(u, ircd->modeonreg, tsbuf);
- } else {
- common_svsmode(u, ircd->modeonreg, NULL);
- }
- }
-
- check_memos(u);
- } else {
- alog("%s: makealias(%s) failed", s_NickServ, u->nick);
- notice_lang(s_NickServ, u, NICK_GROUP_FAILED);
- }
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_nickupdate(User * u)
-{
- NickAlias *na;
-
- if (!nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else {
- na = u->na;
- if (NSModeOnID)
- do_setmodes(u);
- check_memos(u);
- if (na->last_realname)
- free(na->last_realname);
- na->last_realname = sstrdup(u->realname);
- na->status |= NS_IDENTIFIED;
- na->last_seen = time(NULL);
- if (ircd->vhost) {
- do_on_id(u);
- }
- notice_lang(s_NickServ, u, NICK_UPDATE_SUCCESS, s_NickServ);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_identify(User * u)
-{
- char *pass = strtok(NULL, " ");
- NickAlias *na;
- NickRequest *nr;
- int res;
- char tsbuf[16];
-
- if (!pass) {
- syntax_error(s_NickServ, u, "IDENTIFY", NICK_IDENTIFY_SYNTAX);
- } else if (!(na = u->na)) {
- if ((nr = findrequestnick(u->nick))) {
- notice_lang(s_NickServ, u, NICK_IS_PREREG);
- } else {
- notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
- }
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
- } else if (nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_ALREADY_IDENTIFIED);
- } else if (!(res = check_password(pass, na->nc->pass))) {
- alog("%s: Failed IDENTIFY for %s!%s@%s", s_NickServ, u->nick,
- u->username, u->host);
- notice_lang(s_NickServ, u, PASSWORD_INCORRECT);
- bad_password(u);
- } else if (res == -1) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_FAILED);
- } else {
- if (!(na->status & NS_IDENTIFIED) && !(na->status & NS_RECOGNIZED)) {
- if (na->last_usermask)
- free(na->last_usermask);
- na->last_usermask =
- scalloc(strlen(common_get_vident(u)) +
- strlen(common_get_vhost(u)) + 2, 1);
- sprintf(na->last_usermask, "%s@%s", common_get_vident(u),
- common_get_vhost(u));
- if (na->last_realname)
- free(na->last_realname);
- na->last_realname = sstrdup(u->realname);
- }
-
- na->status |= NS_IDENTIFIED;
- na->last_seen = time(NULL);
- snprintf(tsbuf, sizeof(tsbuf), "%lu",
- (unsigned long int) u->timestamp);
-
- if (ircd->modeonreg) {
- if (ircd->tsonmode) {
- common_svsmode(u, ircd->modeonreg, tsbuf);
- } else {
- common_svsmode(u, ircd->modeonreg, "");
- }
- }
- send_event(EVENT_NICK_IDENTIFY, u->nick);
- alog("%s: %s!%s@%s identified for nick %s", s_NickServ, u->nick,
- u->username, u->host, u->nick);
- notice_lang(s_NickServ, u, NICK_IDENTIFY_SUCCEEDED);
- if (ircd->vhost) {
- do_on_id(u);
- }
- if (NSModeOnID) {
- do_setmodes(u);
- }
-
- if (NSForceEmail && u->na && !u->na->nc->email) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_EMAIL_REQUIRED);
- notice_help(s_NickServ, u, NICK_IDENTIFY_EMAIL_HOWTO);
- }
-
- if (!(na->status & NS_RECOGNIZED))
- check_memos(u);
-
- /* Enable nick tracking if enabled */
- if (NSNickTracking)
- nsStartNickTracking(u);
-
- /* Clear any timers */
- if (na->nc->flags & NI_KILLPROTECT) {
- del_ns_timeout(na, TO_COLLIDE);
- }
-
- }
- return MOD_CONT;
-}
-
int should_mode_change(int16 status, int16 mode)
{
switch (mode) {
@@ -2678,7 +1864,9 @@ int should_mode_change(int16 status, int16 mode)
return 1;
}
-static int do_setmodes(User * u)
+/*************************************************************************/
+
+int do_setmodes(User * u)
{
struct u_chanlist *uc;
Channel *c;
@@ -2692,1765 +1880,6 @@ static int do_setmodes(User * u)
}
/*************************************************************************/
-
-static int do_logout(User * u)
-{
- char *nick = strtok(NULL, " ");
- char *param = strtok(NULL, " ");
- User *u2;
-
- if (!is_services_admin(u) && nick) {
- syntax_error(s_NickServ, u, "LOGOUT", NICK_LOGOUT_SYNTAX);
- } else if (!(u2 = (nick ? finduser(nick) : u))) {
- notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
- } else if (!u2->na) {
- if (nick)
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- else
- notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
- } else if (u2->na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, u2->na->nick);
- } else if (!nick && !nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else if (nick && is_services_admin(u2)) {
- notice_lang(s_NickServ, u, NICK_LOGOUT_SERVICESADMIN, nick);
- } else {
- if (nick && param && !stricmp(param, "REVALIDATE")) {
- cancel_user(u2);
- validate_user(u2);
- } else {
- u2->na->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED);
- }
-
- if (ircd->modeonreg) {
- common_svsmode(u2, ircd->modeonunreg, "1");
- }
-
- u->isSuperAdmin = 0; /* Dont let people logout and remain a SuperAdmin */
- alog("%s: %s!%s@%s logged out nickname %s", s_NickServ, u->nick,
- u->username, u->host, u2->nick);
-
- if (nick)
- notice_lang(s_NickServ, u, NICK_LOGOUT_X_SUCCEEDED, nick);
- else
- notice_lang(s_NickServ, u, NICK_LOGOUT_SUCCEEDED);
-
- /* Stop nick tracking if enabled */
- if (NSNickTracking)
- nsStopNickTracking(u);
-
- /* Clear any timers again */
- if (u->na->nc->flags & NI_KILLPROTECT) {
- del_ns_timeout(u->na, TO_COLLIDE);
- }
-
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_drop(User * u)
-{
- char *nick = strtok(NULL, " ");
- NickAlias *na;
- NickRequest *nr = NULL;
- int is_servadmin = is_services_admin(u);
- int is_mine; /* Does the nick being dropped belong to the user that is dropping? */
- char *my_nick = NULL;
-
- if (readonly && !is_servadmin) {
- notice_lang(s_NickServ, u, NICK_DROP_DISABLED);
- return MOD_CONT;
- }
-
- if (!(na = (nick ? findnick(nick) : u->na))) {
- if (nick) {
- if ((nr = findrequestnick(nick)) && is_servadmin) {
- if (readonly)
- notice_lang(s_NickServ, u, READ_ONLY_MODE);
- if (WallDrop)
- anope_cmd_global(s_NickServ,
- "\2%s\2 used DROP on \2%s\2", u->nick,
- nick);
- alog("%s: %s!%s@%s dropped nickname %s (e-mail: %s)",
- s_NickServ, u->nick, u->username, u->host,
- nr->nick, nr->email);
- delnickrequest(nr);
- notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
- } else {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- }
- } else
- notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
- return MOD_CONT;
- }
-
- is_mine = (u->na && (u->na->nc == na->nc));
- if (is_mine && !nick)
- my_nick = sstrdup(na->nick);
-
- if (is_mine && !nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else if (!is_mine && !is_servadmin) {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- } else if (NSSecureAdmins && !is_mine && nick_is_services_admin(na->nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- } else {
- if (readonly)
- notice_lang(s_NickServ, u, READ_ONLY_MODE);
-
- if (ircd->sqline && (na->status & NS_VERBOTEN)) {
- anope_cmd_unsqline(na->nick);
- }
-
- alog("%s: %s!%s@%s dropped nickname %s (group %s) (e-mail: %s)",
- s_NickServ, u->nick, u->username, u->host,
- na->nick, na->nc->display,
- (na->nc->email ? na->nc->email : "none"));
- delnick(na);
- send_event(EVENT_NICK_DROPPED, (my_nick ? my_nick : nick));
-
- if (!is_mine) {
- if (WallDrop)
- anope_cmd_global(s_NickServ, "\2%s\2 used DROP on \2%s\2",
- u->nick, nick);
- notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
- } else {
- if (nick)
- notice_lang(s_NickServ, u, NICK_X_DROPPED, nick);
- else
- notice_lang(s_NickServ, u, NICK_DROPPED);
- if (my_nick) {
- free(my_nick);
- }
- }
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set(User * u)
-{
- char *cmd = strtok(NULL, " ");
- char *param = strtok(NULL, " ");
-
- NickAlias *na;
- int is_servadmin = is_services_admin(u);
- int set_nick = 0;
-
- if (readonly) {
- notice_lang(s_NickServ, u, NICK_SET_DISABLED);
- return MOD_CONT;
- }
-
- if (is_servadmin && cmd && (na = findnick(cmd))) {
- cmd = param;
- param = strtok(NULL, " ");
- set_nick = 1;
- } else {
- na = u->na;
- }
-
- if (!param
- && (!cmd
- || (stricmp(cmd, "URL") != 0 && stricmp(cmd, "EMAIL") != 0
- && stricmp(cmd, "GREET") != 0
- && stricmp(cmd, "ICQ") != 0))) {
- if (is_servadmin) {
- syntax_error(s_NickServ, u, "SET", NICK_SET_SERVADMIN_SYNTAX);
- } else {
- syntax_error(s_NickServ, u, "SET", NICK_SET_SYNTAX);
- }
- } else if (!na) {
- notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
- } else if (!is_servadmin && !nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else if (stricmp(cmd, "DISPLAY") == 0) {
- do_set_display(u, na->nc, param);
- } else if (stricmp(cmd, "PASSWORD") == 0) {
- do_set_password(u, na->nc, param);
- } else if (stricmp(cmd, "LANGUAGE") == 0) {
- do_set_language(u, na->nc, param);
- } else if (stricmp(cmd, "URL") == 0) {
- do_set_url(u, na->nc, param);
- } else if (stricmp(cmd, "EMAIL") == 0) {
- do_set_email(u, na->nc, param);
- } else if (stricmp(cmd, "ICQ") == 0) {
- do_set_icq(u, na->nc, param);
- } else if (stricmp(cmd, "GREET") == 0) {
- do_set_greet(u, na->nc, param);
- } else if (stricmp(cmd, "KILL") == 0) {
- do_set_kill(u, na->nc, param);
- } else if (stricmp(cmd, "SECURE") == 0) {
- do_set_secure(u, na->nc, param);
- } else if (stricmp(cmd, "PRIVATE") == 0) {
- do_set_private(u, na->nc, param);
- } else if (stricmp(cmd, "MSG") == 0) {
- do_set_msg(u, na->nc, param);
- } else if (stricmp(cmd, "HIDE") == 0) {
- do_set_hide(u, na->nc, param);
- } else if (stricmp(cmd, "NOEXPIRE") == 0) {
- do_set_noexpire(u, na, param);
- } else {
- if (is_servadmin)
- notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION_OR_BAD_NICK,
- cmd);
- else
- notice_lang(s_NickServ, u, NICK_SET_UNKNOWN_OPTION, cmd);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_display(User * u, NickCore * nc, char *param)
-{
- int i;
- NickAlias *na;
-
- /* First check whether param is a valid nick of the group */
- for (i = 0; i < nc->aliases.count; i++) {
- na = nc->aliases.list[i];
- if (!stricmp(na->nick, param)) {
- param = na->nick; /* Because case may differ */
- break;
- }
- }
-
- if (i == nc->aliases.count) {
- notice_lang(s_NickServ, u, NICK_SET_DISPLAY_INVALID);
- return MOD_CONT;
- }
-
- change_core_display(nc, param);
- notice_lang(s_NickServ, u, NICK_SET_DISPLAY_CHANGED, nc->display);
-
- /* Enable nick tracking if enabled */
- if (NSNickTracking)
- nsStartNickTracking(u);
-
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_password(User * u, NickCore * nc, char *param)
-{
- int len = strlen(param);
-
- if (NSSecureAdmins && u->na->nc != nc && nick_is_services_admin(nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- } else if (stricmp(nc->display, param) == 0
- || (StrictPasswords && len < 5)) {
- notice_lang(s_NickServ, u, MORE_OBSCURE_PASSWORD);
- return MOD_CONT;
- }
-
- if (nc->pass)
- free(nc->pass);
-
-#ifdef USE_ENCRYPTION
- nc->pass = smalloc(PASSMAX);
-
- if (encrypt(param, len, nc->pass, PASSMAX) < 0) {
- memset(param, 0, len);
- alog("%s: Failed to encrypt password for %s (set)", s_NickServ,
- nc->display);
- notice_lang(s_NickServ, u, NICK_SET_PASSWORD_FAILED);
- return MOD_CONT;
- }
-
- memset(param, 0, len);
- notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED);
-#else
- nc->pass = sstrdup(param);
- notice_lang(s_NickServ, u, NICK_SET_PASSWORD_CHANGED_TO, nc->pass);
-#endif
-
- if (u->na && u->na->nc != nc && is_services_admin(u)) {
- alog("%s: %s!%s@%s used SET PASSWORD as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, nc->display, (nc->email ? nc->email : "none"));
- if (WallSetpass)
- anope_cmd_global(s_NickServ,
- "\2%s\2 used SET PASSWORD as Services admin on \2%s\2",
- u->nick, nc->display);
- } else {
- alog("%s: %s!%s@%s (e-mail: %s) changed its password.", s_NickServ,
- u->nick, u->username, u->host,
- (nc->email ? nc->email : "none"));
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_language(User * u, NickCore * nc, char *param)
-{
- int langnum;
-
- if (param[strspn(param, "0123456789")] != 0) { /* i.e. not a number */
- syntax_error(s_NickServ, u, "SET LANGUAGE",
- NICK_SET_LANGUAGE_SYNTAX);
- return MOD_CONT;
- }
- langnum = atoi(param) - 1;
- if (langnum < 0 || langnum >= NUM_LANGS || langlist[langnum] < 0) {
- notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_UNKNOWN, langnum + 1,
- s_NickServ);
- return MOD_CONT;
- }
- nc->language = langlist[langnum];
- notice_lang(s_NickServ, u, NICK_SET_LANGUAGE_CHANGED);
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_url(User * u, NickCore * nc, char *param)
-{
- if (nc->url)
- free(nc->url);
-
- if (param) {
- nc->url = sstrdup(param);
- notice_lang(s_NickServ, u, NICK_SET_URL_CHANGED, param);
- } else {
- nc->url = NULL;
- notice_lang(s_NickServ, u, NICK_SET_URL_UNSET);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_email(User * u, NickCore * nc, char *param)
-{
- if (!param && NSForceEmail) {
- notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET_IMPOSSIBLE);
- return MOD_CONT;
- } else if (NSSecureAdmins && u->na->nc != nc
- && nick_is_services_admin(nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- } else if (param && !MailValidate(param)) {
- notice_lang(s_NickServ, u, MAIL_X_INVALID, param);
- return MOD_CONT;
- }
-
- if (u->na && u->na->nc != nc && is_services_admin(u)) {
- alog("%s: %s!%s@%s used SET EMAIL as Services admin on %s (e-mail: %s)", s_NickServ, u->nick, u->username, u->host, nc->display, (nc->email ? nc->email : "none"));
- } else {
- alog("%s: %s!%s@%s (e-mail: %s) changed its e-mail to %s.",
- s_NickServ, u->nick, u->username, u->host,
- (nc->email ? nc->email : "none"), (param ? param : "none"));
- }
- if (nc->email)
- free(nc->email);
-
- if (param) {
- nc->email = sstrdup(param);
- notice_lang(s_NickServ, u, NICK_SET_EMAIL_CHANGED, param);
- } else {
- nc->email = NULL;
- notice_lang(s_NickServ, u, NICK_SET_EMAIL_UNSET);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_icq(User * u, NickCore * nc, char *param)
-{
- if (param) {
- int32 tmp = atol(param);
- if (!tmp) {
- notice_lang(s_NickServ, u, NICK_SET_ICQ_INVALID, param);
- } else {
- nc->icq = tmp;
- notice_lang(s_NickServ, u, NICK_SET_ICQ_CHANGED, param);
- }
- } else {
- nc->icq = 0;
- notice_lang(s_NickServ, u, NICK_SET_ICQ_UNSET);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_greet(User * u, NickCore * nc, char *param)
-{
- if (nc->greet)
- free(nc->greet);
-
- if (param) {
- char buf[BUFSIZE];
- char *end = strtok(NULL, "");
-
- snprintf(buf, sizeof(buf), "%s%s%s", param, (end ? " " : ""),
- (end ? end : ""));
-
- nc->greet = sstrdup(buf);
- notice_lang(s_NickServ, u, NICK_SET_GREET_CHANGED, buf);
- } else {
- nc->greet = NULL;
- notice_lang(s_NickServ, u, NICK_SET_GREET_UNSET);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_kill(User * u, NickCore * nc, char *param)
-{
- if (stricmp(param, "ON") == 0) {
- nc->flags |= NI_KILLPROTECT;
- nc->flags &= ~(NI_KILL_QUICK | NI_KILL_IMMED);
- notice_lang(s_NickServ, u, NICK_SET_KILL_ON);
- } else if (stricmp(param, "QUICK") == 0) {
- nc->flags |= NI_KILLPROTECT | NI_KILL_QUICK;
- nc->flags &= ~NI_KILL_IMMED;
- notice_lang(s_NickServ, u, NICK_SET_KILL_QUICK);
- } else if (stricmp(param, "IMMED") == 0) {
- if (NSAllowKillImmed) {
- nc->flags |= NI_KILLPROTECT | NI_KILL_IMMED;
- nc->flags &= ~NI_KILL_QUICK;
- notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED);
- } else {
- notice_lang(s_NickServ, u, NICK_SET_KILL_IMMED_DISABLED);
- }
- } else if (stricmp(param, "OFF") == 0) {
- nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED);
- notice_lang(s_NickServ, u, NICK_SET_KILL_OFF);
- } else {
- syntax_error(s_NickServ, u, "SET KILL",
- NSAllowKillImmed ? NICK_SET_KILL_IMMED_SYNTAX :
- NICK_SET_KILL_SYNTAX);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_secure(User * u, NickCore * nc, char *param)
-{
- if (stricmp(param, "ON") == 0) {
- nc->flags |= NI_SECURE;
- notice_lang(s_NickServ, u, NICK_SET_SECURE_ON);
- } else if (stricmp(param, "OFF") == 0) {
- nc->flags &= ~NI_SECURE;
- notice_lang(s_NickServ, u, NICK_SET_SECURE_OFF);
- } else {
- syntax_error(s_NickServ, u, "SET SECURE", NICK_SET_SECURE_SYNTAX);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_private(User * u, NickCore * nc, char *param)
-{
- if (stricmp(param, "ON") == 0) {
- nc->flags |= NI_PRIVATE;
- notice_lang(s_NickServ, u, NICK_SET_PRIVATE_ON);
- } else if (stricmp(param, "OFF") == 0) {
- nc->flags &= ~NI_PRIVATE;
- notice_lang(s_NickServ, u, NICK_SET_PRIVATE_OFF);
- } else {
- syntax_error(s_NickServ, u, "SET PRIVATE",
- NICK_SET_PRIVATE_SYNTAX);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_msg(User * u, NickCore * nc, char *param)
-{
- if (!UsePrivmsg) {
- notice_lang(s_NickServ, u, NICK_SET_OPTION_DISABLED, "MSG");
- return MOD_CONT;
- }
-
- if (stricmp(param, "ON") == 0) {
- nc->flags |= NI_MSG;
- notice_lang(s_NickServ, u, NICK_SET_MSG_ON);
- } else if (stricmp(param, "OFF") == 0) {
- nc->flags &= ~NI_MSG;
- notice_lang(s_NickServ, u, NICK_SET_MSG_OFF);
- } else {
- syntax_error(s_NickServ, u, "SET MSG", NICK_SET_MSG_SYNTAX);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_hide(User * u, NickCore * nc, char *param)
-{
- int flag, onmsg, offmsg;
-
- if (stricmp(param, "EMAIL") == 0) {
- flag = NI_HIDE_EMAIL;
- onmsg = NICK_SET_HIDE_EMAIL_ON;
- offmsg = NICK_SET_HIDE_EMAIL_OFF;
- } else if (stricmp(param, "USERMASK") == 0) {
- flag = NI_HIDE_MASK;
- onmsg = NICK_SET_HIDE_MASK_ON;
- offmsg = NICK_SET_HIDE_MASK_OFF;
- } else if (stricmp(param, "STATUS") == 0) {
- flag = NI_HIDE_STATUS;
- onmsg = NICK_SET_HIDE_STATUS_ON;
- offmsg = NICK_SET_HIDE_STATUS_OFF;
- } else if (stricmp(param, "QUIT") == 0) {
- flag = NI_HIDE_QUIT;
- onmsg = NICK_SET_HIDE_QUIT_ON;
- offmsg = NICK_SET_HIDE_QUIT_OFF;
- } else {
- syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
- return MOD_CONT;
- }
-
- param = strtok(NULL, " ");
- if (!param) {
- syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
- } else if (stricmp(param, "ON") == 0) {
- nc->flags |= flag;
- notice_lang(s_NickServ, u, onmsg, s_NickServ);
- } else if (stricmp(param, "OFF") == 0) {
- nc->flags &= ~flag;
- notice_lang(s_NickServ, u, offmsg, s_NickServ);
- } else {
- syntax_error(s_NickServ, u, "SET HIDE", NICK_SET_HIDE_SYNTAX);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_set_noexpire(User * u, NickAlias * na, char *param)
-{
- if (!is_services_admin(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- }
- if (!param) {
- syntax_error(s_NickServ, u, "SET NOEXPIRE",
- NICK_SET_NOEXPIRE_SYNTAX);
- return MOD_CONT;
- }
- if (stricmp(param, "ON") == 0) {
- na->status |= NS_NO_EXPIRE;
- notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_ON, na->nick);
- } else if (stricmp(param, "OFF") == 0) {
- na->status &= ~NS_NO_EXPIRE;
- notice_lang(s_NickServ, u, NICK_SET_NOEXPIRE_OFF, na->nick);
- } else {
- syntax_error(s_NickServ, u, "SET NOEXPIRE",
- NICK_SET_NOEXPIRE_SYNTAX);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_link(User * u)
-{
- notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GROUP");
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_unlink(User * u)
-{
- notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "DROP");
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_listlinks(User * u)
-{
- notice_lang(s_NickServ, u, OBSOLETE_COMMAND, "GLIST");
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_access(User * u)
-{
- char *cmd = strtok(NULL, " ");
- char *mask = strtok(NULL, " ");
- NickAlias *na;
- int i;
- char **access;
-
- if (cmd && stricmp(cmd, "LIST") == 0 && mask && is_services_admin(u)
- && (na = findnick(mask))) {
-
- if (na->nc->accesscount == 0) {
- notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X_EMPTY, na->nick);
- return MOD_CONT;
- }
-
- if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- return MOD_CONT;
- }
-
- if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
- return MOD_CONT;
- }
-
-
- notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X, mask);
- mask = strtok(NULL, " ");
- for (access = na->nc->access, i = 0; i < na->nc->accesscount;
- access++, i++) {
- if (mask && !match_wild(mask, *access))
- continue;
- notice_user(s_NickServ, u, " %s", *access);
- }
-
- } else if (!cmd || ((stricmp(cmd, "LIST") == 0) ? !!mask : !mask)) {
- syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
-
- } else if (mask && !strchr(mask, '@')) {
- notice_lang(s_NickServ, u, BAD_USERHOST_MASK);
- notice_lang(s_NickServ, u, MORE_INFO, s_NickServ, "ACCESS");
-
- } else if (!(na = u->na)) {
- notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
-
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
-
- } else if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
-
- } else if (!nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
-
- } else if (stricmp(cmd, "ADD") == 0) {
- if (na->nc->accesscount >= NSAccessMax) {
- notice_lang(s_NickServ, u, NICK_ACCESS_REACHED_LIMIT,
- NSAccessMax);
- return MOD_CONT;
- }
-
- for (access = na->nc->access, i = 0; i < na->nc->accesscount;
- access++, i++) {
- if (strcmp(*access, mask) == 0) {
- notice_lang(s_NickServ, u, NICK_ACCESS_ALREADY_PRESENT,
- *access);
- return MOD_CONT;
- }
- }
-
- na->nc->accesscount++;
- na->nc->access =
- srealloc(na->nc->access, sizeof(char *) * na->nc->accesscount);
- na->nc->access[na->nc->accesscount - 1] = sstrdup(mask);
- notice_lang(s_NickServ, u, NICK_ACCESS_ADDED, mask);
-
- } else if (stricmp(cmd, "DEL") == 0) {
-
- for (access = na->nc->access, i = 0; i < na->nc->accesscount;
- access++, i++) {
- if (stricmp(*access, mask) == 0)
- break;
- }
- if (i == na->nc->accesscount) {
- notice_lang(s_NickServ, u, NICK_ACCESS_NOT_FOUND, mask);
- return MOD_CONT;
- }
-
- notice_lang(s_NickServ, u, NICK_ACCESS_DELETED, *access);
- free(*access);
- na->nc->accesscount--;
- if (i < na->nc->accesscount) /* if it wasn't the last entry... */
- memmove(access, access + 1,
- (na->nc->accesscount - i) * sizeof(char *));
- if (na->nc->accesscount) /* if there are any entries left... */
- na->nc->access =
- srealloc(na->nc->access,
- na->nc->accesscount * sizeof(char *));
- else {
- free(na->nc->access);
- na->nc->access = NULL;
- }
- } else if (stricmp(cmd, "LIST") == 0) {
- if (na->nc->accesscount == 0) {
- notice_lang(s_NickServ, u, NICK_ACCESS_LIST_EMPTY, u->nick);
- return MOD_CONT;
- }
-
- notice_lang(s_NickServ, u, NICK_ACCESS_LIST);
- for (access = na->nc->access, i = 0; i < na->nc->accesscount;
- access++, i++) {
- if (mask && !match_wild(mask, *access))
- continue;
- notice_user(s_NickServ, u, " %s", *access);
- }
- } else {
- syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
-
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-/* Show hidden info to nick owners and sadmins when the "ALL" parameter is
- * supplied. If a nick is online, the "Last seen address" changes to "Is
- * online from".
- * Syntax: INFO <nick> {ALL}
- * -TheShadow (13 Mar 1999)
- */
-
-static int do_info(User * u)
-{
- char *nick = strtok(NULL, " ");
- char *param = strtok(NULL, " ");
-
- NickAlias *na;
- NickRequest *nr = NULL;
- int is_servadmin = is_services_admin(u);
-
- if (!nick) {
- syntax_error(s_NickServ, u, "INFO", NICK_INFO_SYNTAX);
- } else if (!(na = findnick(nick))) {
- if ((nr = findrequestnick(nick))) {
- notice_lang(s_NickServ, u, NICK_IS_PREREG);
- if (param && stricmp(param, "ALL") == 0 && is_servadmin) {
- notice_lang(s_NickServ, u, NICK_INFO_EMAIL, nr->email);
- } else {
- if (is_servadmin) {
- notice_lang(s_NickServ, u, NICK_INFO_FOR_MORE,
- s_NickServ, nr->nick);
- }
- }
- } else if (nickIsServices(nick, 1)) {
- notice_lang(s_NickServ, u, NICK_X_IS_SERVICES, nick);
- } else {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- }
- } else if (na->status & NS_VERBOTEN) {
- if (is_oper(u) && na->last_usermask)
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN_OPER, nick,
- na->last_usermask,
- (na->last_realname ? na->
- last_realname : getstring(u->na, NO_REASON)));
- else
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, nick);
- } else {
- struct tm *tm;
- char buf[BUFSIZE], *end;
- const char *commastr = getstring(u->na, COMMA_SPACE);
- int need_comma = 0;
- int nick_online = 0;
- int show_hidden = 0;
- time_t expt;
-
- /* Is the real owner of the nick we're looking up online? -TheShadow */
- if (na->status & (NS_RECOGNIZED | NS_IDENTIFIED))
- nick_online = 1;
-
- /* Only show hidden fields to owner and sadmins and only when the ALL
- * parameter is used. -TheShadow */
- if (param && stricmp(param, "ALL") == 0 && u->na
- && ((nick_identified(u) && (na->nc == u->na->nc))
- || is_servadmin))
- show_hidden = 1;
-
- notice_lang(s_NickServ, u, NICK_INFO_REALNAME, na->nick,
- na->last_realname);
-
- if ((nick_identified(u) && (na->nc == u->na->nc)) || is_servadmin) {
-
- if (nick_is_services_root(na->nc))
- notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ROOT,
- na->nick);
- else if (nick_is_services_admin(na->nc))
- notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ADMIN,
- na->nick);
- else if (nick_is_services_oper(na->nc))
- notice_lang(s_NickServ, u, NICK_INFO_SERVICES_OPER,
- na->nick);
-
- } else {
-
- if (nick_is_services_root(na->nc)
- && !(na->nc->flags & NI_HIDE_STATUS))
- notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ROOT,
- na->nick);
- else if (nick_is_services_admin(na->nc)
- && !(na->nc->flags & NI_HIDE_STATUS))
- notice_lang(s_NickServ, u, NICK_INFO_SERVICES_ADMIN,
- na->nick);
- else if (nick_is_services_oper(na->nc)
- && !(na->nc->flags & NI_HIDE_STATUS))
- notice_lang(s_NickServ, u, NICK_INFO_SERVICES_OPER,
- na->nick);
-
- }
-
-
- if (nick_online) {
- if (show_hidden || !(na->nc->flags & NI_HIDE_MASK))
- notice_lang(s_NickServ, u, NICK_INFO_ADDRESS_ONLINE,
- na->last_usermask);
- else
- notice_lang(s_NickServ, u, NICK_INFO_ADDRESS_ONLINE_NOHOST,
- na->nick);
- } else {
- if (show_hidden || !(na->nc->flags & NI_HIDE_MASK))
- notice_lang(s_NickServ, u, NICK_INFO_ADDRESS,
- na->last_usermask);
- }
-
- tm = localtime(&na->time_registered);
- strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT, tm);
- notice_lang(s_NickServ, u, NICK_INFO_TIME_REGGED, buf);
-
- if (!nick_online) {
- tm = localtime(&na->last_seen);
- strftime_lang(buf, sizeof(buf), u, STRFTIME_DATE_TIME_FORMAT,
- tm);
- notice_lang(s_NickServ, u, NICK_INFO_LAST_SEEN, buf);
- }
-
- if (na->last_quit
- && (show_hidden || !(na->nc->flags & NI_HIDE_QUIT)))
- notice_lang(s_NickServ, u, NICK_INFO_LAST_QUIT, na->last_quit);
-
- if (na->nc->url)
- notice_lang(s_NickServ, u, NICK_INFO_URL, na->nc->url);
- if (na->nc->email
- && (show_hidden || !(na->nc->flags & NI_HIDE_EMAIL)))
- notice_lang(s_NickServ, u, NICK_INFO_EMAIL, na->nc->email);
- if (na->nc->icq)
- notice_lang(s_NickServ, u, NICK_INFO_ICQ, na->nc->icq);
-
- if (show_hidden) {
- if (s_HostServ && ircd->vhost) {
- if (getvHost(na->nick) != NULL) {
- if (ircd->vident && getvIdent(na->nick) != NULL) {
- notice_lang(s_NickServ, u, NICK_INFO_VHOST2,
- getvIdent(na->nick),
- getvHost(na->nick));
- } else {
- notice_lang(s_NickServ, u, NICK_INFO_VHOST,
- getvHost(na->nick));
- }
- }
- }
- if (na->nc->greet)
- notice_lang(s_NickServ, u, NICK_INFO_GREET, na->nc->greet);
-
- *buf = 0;
- end = buf;
-
- if (na->nc->flags & NI_KILLPROTECT) {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s",
- getstring(u->na, NICK_INFO_OPT_KILL));
- need_comma = 1;
- }
- if (na->nc->flags & NI_SECURE) {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
- need_comma ? commastr : "",
- getstring(u->na, NICK_INFO_OPT_SECURE));
- need_comma = 1;
- }
- if (na->nc->flags & NI_PRIVATE) {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
- need_comma ? commastr : "",
- getstring(u->na, NICK_INFO_OPT_PRIVATE));
- need_comma = 1;
- }
- if (na->nc->flags & NI_MSG) {
- end += snprintf(end, sizeof(buf) - (end - buf), "%s%s",
- need_comma ? commastr : "",
- getstring(u->na, NICK_INFO_OPT_MSG));
- need_comma = 1;
- }
-
- notice_lang(s_NickServ, u, NICK_INFO_OPTIONS,
- *buf ? buf : getstring(u->na, NICK_INFO_OPT_NONE));
-
- if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_INFO_SUSPENDED,
- na->last_quit);
- }
-
- if (na->status & NS_NO_EXPIRE) {
- notice_lang(s_NickServ, u, NICK_INFO_NO_EXPIRE);
- } else {
- if (is_services_admin(u)) {
- expt = na->last_seen + NSExpire;
- tm = localtime(&expt);
- strftime_lang(buf, sizeof(buf), na->u,
- STRFTIME_DATE_TIME_FORMAT, tm);
- notice_lang(s_NickServ, u, NICK_INFO_EXPIRE, buf);
- }
- }
- }
-
- if (!show_hidden
- && ((u->na && (na->nc == u->na->nc) && nick_identified(u))
- || is_servadmin))
- notice_lang(s_NickServ, u, NICK_INFO_FOR_MORE, s_NickServ,
- na->nick);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-/* SADMINS can search for nicks based on their NS_VERBOTEN and NS_NO_EXPIRE
- * status. The keywords FORBIDDEN and NOEXPIRE represent these two states
- * respectively. These keywords should be included after the search pattern.
- * Multiple keywords are accepted and should be separated by spaces. Only one
- * of the keywords needs to match a nick's state for the nick to be displayed.
- * Forbidden nicks can be identified by "[Forbidden]" appearing in the last
- * seen address field. Nicks with NOEXPIRE set are preceeded by a "!". Only
- * SADMINS will be shown forbidden nicks and the "!" indicator.
- * Syntax for sadmins: LIST pattern [FORBIDDEN] [NOEXPIRE]
- * -TheShadow
- */
-
-static int do_list(User * u)
-{
- char *pattern = strtok(NULL, " ");
- char *keyword;
- NickAlias *na;
- NickCore *mync;
- int nnicks, i;
- char buf[BUFSIZE];
- int is_servadmin = is_services_admin(u);
- int16 matchflags = 0;
- NickRequest *nr = NULL;
- int nronly = 0;
- char noexpire_char = ' ';
- int count = 0, from = 0, to = 0;
- char *tmp = NULL;
- char *s = NULL;
-
- if (NSListOpersOnly && !(is_oper(u))) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- }
-
- if (!pattern) {
- syntax_error(s_NickServ, u, "LIST",
- is_servadmin ? NICK_LIST_SERVADMIN_SYNTAX :
- NICK_LIST_SYNTAX);
- } else {
-
- if (pattern) {
- if (pattern[0] == '#') {
- tmp = myStrGetOnlyToken((pattern + 1), '-', 0); /* Read FROM out */
- if (!tmp) {
- return MOD_CONT;
- }
- for (s = tmp; *s; s++) {
- if (!isdigit(*s)) {
- return MOD_CONT;
- }
- }
- from = atoi(tmp);
- tmp = myStrGetTokenRemainder(pattern, '-', 1); /* Read TO out */
- if (!tmp) {
- return MOD_CONT;
- }
- for (s = tmp; *s; s++) {
- if (!isdigit(*s)) {
- return MOD_CONT;
- }
- }
- to = atoi(tmp);
- pattern = sstrdup("*");
- }
- }
-
- nnicks = 0;
-
- while (is_servadmin && (keyword = strtok(NULL, " "))) {
- if (stricmp(keyword, "FORBIDDEN") == 0)
- matchflags |= NS_VERBOTEN;
- if (stricmp(keyword, "NOEXPIRE") == 0)
- matchflags |= NS_NO_EXPIRE;
- if (stricmp(keyword, "UNCONFIRMED") == 0)
- nronly = 1;
- }
-
- mync = (nick_identified(u) ? u->na->nc : NULL);
-
- notice_lang(s_NickServ, u, NICK_LIST_HEADER, pattern);
- if (nronly != 1) {
- for (i = 0; i < 1024; i++) {
- for (na = nalists[i]; na; na = na->next) {
- /* Don't show private and forbidden nicks to non-services admins. */
- if ((na->status & NS_VERBOTEN) && !is_servadmin)
- continue;
- if ((na->nc->flags & NI_PRIVATE) && !is_servadmin
- && na->nc != mync)
- continue;
- if ((matchflags != 0) && !(na->status & matchflags))
- continue;
-
- /* We no longer compare the pattern against the output buffer.
- * Instead we build a nice nick!user@host buffer to compare.
- * The output is then generated separately. -TheShadow */
- snprintf(buf, sizeof(buf), "%s!%s", na->nick,
- (na->last_usermask
- && !(na->status & NS_VERBOTEN)) ? na->
- last_usermask : "*@*");
- if (stricmp(pattern, na->nick) == 0
- || match_wild_nocase(pattern, buf)) {
-
- if ((((count + 1 >= from) && (count + 1 <= to))
- || ((from == 0) && (to == 0)))
- && (++nnicks <= NSListMax)) {
- if (is_servadmin
- && (na->status & NS_NO_EXPIRE))
- noexpire_char = '!';
- else {
- noexpire_char = ' ';
- }
- if ((na->nc->flags & NI_HIDE_MASK)
- && !is_servadmin && na->nc != mync) {
- snprintf(buf, sizeof(buf),
- "%-20s [Hostname Hidden]",
- na->nick);
- } else if (na->status & NS_VERBOTEN) {
- snprintf(buf, sizeof(buf),
- "%-20s [Forbidden]", na->nick);
- } else {
- snprintf(buf, sizeof(buf), "%-20s %s",
- na->nick, na->last_usermask);
- }
- notice_user(s_NickServ, u, " %c%s",
- noexpire_char, buf);
- }
- count++;
- }
- }
- }
- }
-
- if (nronly == 1 || (is_servadmin && matchflags == 0)) {
- noexpire_char = ' ';
- for (i = 0; i < 1024; i++) {
- for (nr = nrlists[i]; nr; nr = nr->next) {
- snprintf(buf, sizeof(buf), "%s!*@*", nr->nick);
- if (stricmp(pattern, nr->nick) == 0
- || match_wild_nocase(pattern, buf)) {
- if (++nnicks <= NSListMax) {
- snprintf(buf, sizeof(buf),
- "%-20s [UNCONFIRMED]", nr->nick);
- notice_user(s_NickServ, u, " %c%s",
- noexpire_char, buf);
- }
- }
- }
- }
- }
- notice_lang(s_NickServ, u, NICK_LIST_RESULTS,
- nnicks > NSListMax ? NSListMax : nnicks, nnicks);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_glist(User * u)
-{
- char *nick = strtok(NULL, " ");
-
- NickAlias *na, *na2;
- int is_servadmin = is_services_admin(u);
- int nick_ided = nick_identified(u);
- int i;
-
- if ((nick ? (stricmp(nick, u->nick) ? !is_servadmin : !nick_ided)
- : !nick_ided)) {
- notice_lang(s_NickServ, u,
- (nick_ided ? ACCESS_DENIED :
- NICK_IDENTIFY_REQUIRED), s_NickServ);
- } else if ((!nick ? !(na = u->na) : !(na = findnick(nick)))) {
- notice_lang(s_NickServ, u,
- (!nick ? NICK_NOT_REGISTERED : NICK_X_NOT_REGISTERED),
- nick);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else {
- time_t expt;
- struct tm *tm;
- char buf[BUFSIZE];
- int wont_expire;
-
- notice_lang(s_NickServ, u,
- nick ? NICK_GLIST_HEADER_X : NICK_GLIST_HEADER,
- na->nc->display);
- for (i = 0; i < na->nc->aliases.count; i++) {
- na2 = na->nc->aliases.list[i];
- if (na2->nc == na->nc) {
- if (!(wont_expire = na2->status & NS_NO_EXPIRE)) {
- expt = na2->last_seen + NSExpire;
- tm = localtime(&expt);
- strftime_lang(buf, sizeof(buf), na2->u,
- STRFTIME_DATE_TIME_FORMAT, tm);
- }
- notice_lang(s_NickServ, u,
- ((is_services_admin(u) && !wont_expire)
- ? NICK_GLIST_REPLY_ADMIN : NICK_GLIST_REPLY),
- (wont_expire ? '!' : ' '), na2->nick, buf);
- }
- }
- notice_lang(s_NickServ, u, NICK_GLIST_FOOTER,
- na->nc->aliases.count);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-/**
- * List the channels that the given nickname has access on
- *
- * /ns ALIST [level]
- * /ns ALIST [nickname] [level]
- *
- * -jester
- */
-static int do_alist(User * u)
-{
- char *nick = NULL;
- char *lev = NULL;
-
- NickAlias *na;
-
- int min_level = 0;
- int is_servadmin = is_services_admin(u);
-
- if (!is_servadmin) {
- /* Non service admins can only see their own levels */
- na = u->na;
- } else {
- /* Services admins can request ALIST on nicks.
- * The first argument for service admins must
- * always be a nickname.
- */
- nick = strtok(NULL, " ");
-
- /* If an argument was passed, use it as the nick to see levels
- * for, else check levels for the user calling the command */
- if (nick) {
- na = findnick(nick);
- } else {
- na = u->na;
- }
- }
-
- /* If available, get level from arguments */
- lev = strtok(NULL, " ");
-
- /* if a level was given, make sure it's an int for later */
- if (lev) {
- if (stricmp(lev, "FOUNDER") == 0) {
- min_level = ACCESS_FOUNDER;
- } else if (stricmp(lev, "SOP") == 0) {
- min_level = ACCESS_SOP;
- } else if (stricmp(lev, "AOP") == 0) {
- min_level = ACCESS_AOP;
- } else if (stricmp(lev, "HOP") == 0) {
- min_level = ACCESS_HOP;
- } else if (stricmp(lev, "VOP") == 0) {
- min_level = ACCESS_VOP;
- } else {
- min_level = atoi(lev);
- }
- }
-
- if (!nick_identified(u)) {
- notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
- } else if (is_servadmin && nick && !na) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (min_level <= ACCESS_INVALID || min_level >= ACCESS_FOUNDER) {
- notice_lang(s_NickServ, u, CHAN_ACCESS_LEVEL_RANGE,
- ACCESS_INVALID + 1, ACCESS_FOUNDER - 1);
- } else {
- int i, level;
- int chan_count = 0;
- int match_count = 0;
- ChannelInfo *ci;
-
- notice_lang(s_NickServ, u, (is_servadmin ? NICK_ALIST_HEADER_X :
- NICK_ALIST_HEADER), na->nick);
-
- for (i = 0; i < 256; i++) {
- for ((ci = chanlists[i]); ci; (ci = ci->next)) {
-
- if ((level = get_access_level(ci, na))) {
- chan_count++;
-
- if (min_level > level) {
- continue;
- }
-
- match_count++;
-
- if ((ci->flags & CI_XOP) || (level == ACCESS_FOUNDER)) {
- char *xop;
-
- xop = get_xop_level(level);
-
- notice_lang(s_NickServ, u, NICK_ALIST_XOP_FORMAT,
- match_count,
- ((ci->
- flags & CI_NO_EXPIRE) ? '!' : ' '),
- ci->name, xop,
- (ci->desc ? ci->desc : ""));
- } else {
- notice_lang(s_NickServ, u,
- NICK_ALIST_ACCESS_FORMAT, match_count,
- ((ci->
- flags & CI_NO_EXPIRE) ? '!' : ' '),
- ci->name, level,
- (ci->desc ? ci->desc : ""));
-
- }
- }
- }
- }
-
- notice_lang(s_NickServ, u, NICK_ALIST_FOOTER, match_count,
- chan_count);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_recover(User * u)
-{
- char *nick = strtok(NULL, " ");
- char *pass = strtok(NULL, " ");
- NickAlias *na;
- User *u2;
-
- if (!nick) {
- syntax_error(s_NickServ, u, "RECOVER", NICK_RECOVER_SYNTAX);
- } else if (!(u2 = finduser(nick))) {
- notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
- } else if (!(na = u2->na)) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
- } else if (stricmp(nick, u->nick) == 0) {
- notice_lang(s_NickServ, u, NICK_NO_RECOVER_SELF);
- } else if (pass) {
- int res = check_password(pass, na->nc->pass);
-
- if (res == 1) {
- notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
- collide(na, 0);
- notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick);
- } else {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- if (res == 0) {
- alog("%s: RECOVER: invalid password for %s by %s!%s@%s",
- s_NickServ, nick, u->nick, u->username, u->host);
- bad_password(u);
- }
- }
- } else {
- if (group_identified(u, na->nc)
- || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
- notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
- collide(na, 0);
- notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick);
- } else {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- }
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_release(User * u)
-{
- char *nick = strtok(NULL, " ");
- char *pass = strtok(NULL, " ");
- NickAlias *na;
-
- if (!nick) {
- syntax_error(s_NickServ, u, "RELEASE", NICK_RELEASE_SYNTAX);
- } else if (!(na = findnick(nick))) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
- } else if (!(na->status & NS_KILL_HELD)) {
- notice_lang(s_NickServ, u, NICK_RELEASE_NOT_HELD, nick);
- } else if (pass) {
- int res = check_password(pass, na->nc->pass);
- if (res == 1) {
- release(na, 0);
- notice_lang(s_NickServ, u, NICK_RELEASED);
- } else {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- if (res == 0) {
- alog("%s: RELEASE: invalid password for %s by %s!%s@%s",
- s_NickServ, nick, u->nick, u->username, u->host);
- bad_password(u);
- }
- }
- } else {
- if (group_identified(u, na->nc)
- || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
- release(na, 0);
- notice_lang(s_NickServ, u, NICK_RELEASED);
- } else {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- }
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_ghost(User * u)
-{
- char *nick = strtok(NULL, " ");
- char *pass = strtok(NULL, " ");
- NickAlias *na;
- User *u2;
-
- if (!nick) {
- syntax_error(s_NickServ, u, "GHOST", NICK_GHOST_SYNTAX);
- } else if (!(u2 = finduser(nick))) {
- notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
- } else if (!(na = u2->na)) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (na->nc->flags & NI_SUSPENDED) {
- notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
- } else if (stricmp(nick, u->nick) == 0) {
- notice_lang(s_NickServ, u, NICK_NO_GHOST_SELF);
- } else if (pass) {
- int res = check_password(pass, na->nc->pass);
- if (res == 1) {
- char buf[NICKMAX + 32];
- snprintf(buf, sizeof(buf), "GHOST command used by %s",
- u->nick);
- if (LimitSessions) {
- del_session(u2->host);
- }
- kill_user(s_NickServ, nick, buf);
- notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
- } else {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- if (res == 0) {
- alog("%s: GHOST: invalid password for %s by %s!%s@%s",
- s_NickServ, nick, u->nick, u->username, u->host);
- bad_password(u);
- }
- }
- } else {
- if (group_identified(u, na->nc)
- || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
- char buf[NICKMAX + 32];
- snprintf(buf, sizeof(buf), "GHOST command used by %s",
- u->nick);
- if (LimitSessions) {
- del_session(u2->host);
- }
- kill_user(s_NickServ, nick, buf);
- notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
- } else {
- notice_lang(s_NickServ, u, ACCESS_DENIED);
- }
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_status(User * u)
-{
- User *u2;
- NickAlias *na = NULL;
- int i = 0;
- char *nick = strtok(NULL, " ");
-
- /* If no nickname is given, we assume that the user
- * is asking for himself */
- if (!nick)
- nick = u->nick;
-
- while (nick && (i++ < 16)) {
- if (!(u2 = finduser(nick))) /* Nick is not online */
- notice_lang(s_NickServ, u, NICK_STATUS_0, nick);
- else if (nick_identified(u2)) /* Nick is identified */
- notice_lang(s_NickServ, u, NICK_STATUS_3, nick);
- else if (nick_recognized(u2)) /* Nick is recognised, but NOT identified */
- notice_lang(s_NickServ, u, NICK_STATUS_2, nick);
- else if ((na = findnick(nick)) == NULL) /* Nick is online, but NOT a registered */
- notice_lang(s_NickServ, u, NICK_STATUS_0, nick);
- else
- notice_lang(s_NickServ, u, NICK_STATUS_1, nick);
-
- /* Get the next nickname */
- nick = strtok(NULL, " ");
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-/* A simple call to check for all emails that a user may have registered */
-/* with. It returns the nicks that match the email you provide. Wild */
-/* Cards are not excepted. Must use user@email-host. */
-/*************************************************************************/
-static int do_getemail(User * u)
-{
- char *email = strtok(NULL, " ");
- int i, j = 0;
- NickCore *nc;
-
- if (!email) {
- syntax_error(s_NickServ, u, "GETMAIL", NICK_GETEMAIL_SYNTAX);
- return MOD_CONT;
- }
- alog("%s: %s!%s@%s used GETEMAIL on %s", s_NickServ, u->nick,
- u->username, u->host, email);
- for (i = 0; i < 1024; i++) {
- for (nc = nclists[i]; nc; nc = nc->next) {
- if (nc->email) {
- if (stricmp(nc->email, email) == 0) {
- j++;
- notice_lang(s_NickServ, u, NICK_GETEMAIL_EMAILS_ARE,
- nc->display, email);
- }
- }
- }
- }
- if (j <= 0) {
- notice_lang(s_NickServ, u, NICK_GETEMAIL_NOT_USED, email);
- return MOD_CONT;
- }
- return MOD_CONT;
-}
-
-/**************************************************************************/
-
-static int do_getpass(User * u)
-{
-#ifndef USE_ENCRYPTION
- char *nick = strtok(NULL, " ");
- NickAlias *na;
- NickRequest *nr = NULL;
-#endif
-
- /* Assumes that permission checking has already been done. */
-#ifdef USE_ENCRYPTION
- notice_lang(s_NickServ, u, NICK_GETPASS_UNAVAILABLE);
-#else
- if (!nick) {
- syntax_error(s_NickServ, u, "GETPASS", NICK_GETPASS_SYNTAX);
- } else if (!(na = findnick(nick))) {
- if ((nr = findrequestnick(nick))) {
- alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
- u->username, u->host, nick);
- if (WallGetpass)
- anope_cmd_global(s_NickServ,
- "\2%s\2 used GETPASS on \2%s\2", u->nick,
- nick);
- notice_lang(s_NickServ, u, NICK_GETPASS_PASSCODE_IS, nick,
- nr->passcode);
- } else {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- }
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else if (NSSecureAdmins && nick_is_services_admin(na->nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- } else if (NSRestrictGetPass && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- } else {
- alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
- u->username, u->host, nick);
- if (WallGetpass)
- anope_cmd_global(s_NickServ, "\2%s\2 used GETPASS on \2%s\2",
- u->nick, nick);
- notice_lang(s_NickServ, u, NICK_GETPASS_PASSWORD_IS, nick,
- na->nc->pass);
- }
-#endif
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_sendpass(User * u)
-{
-#ifndef USE_ENCRYPTION
- char *nick = strtok(NULL, " ");
- NickAlias *na;
-#endif
-
-#ifdef USE_ENCRYPTION
- notice_lang(s_NickServ, u, NICK_SENDPASS_UNAVAILABLE);
-#else
- if (!nick) {
- syntax_error(s_NickServ, u, "SENDPASS", NICK_SENDPASS_SYNTAX);
- } else if (RestrictMail && !is_oper(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- } else if (!(na = findnick(nick))) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- } else if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- } else {
- char buf[BUFSIZE];
- MailInfo *mail;
-
- snprintf(buf, sizeof(buf), getstring(na, NICK_SENDPASS_SUBJECT),
- na->nick);
- mail = MailBegin(u, na->nc, buf, s_NickServ);
- if (!mail)
- return MOD_CONT;
-
- fprintf(mail->pipe, getstring(na, NICK_SENDPASS_HEAD));
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_1), na->nick);
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_2),
- na->nc->pass);
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_3));
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_4));
- fprintf(mail->pipe, "\n\n");
- fprintf(mail->pipe, getstring(na, NICK_SENDPASS_LINE_5),
- NetworkName);
- fprintf(mail->pipe, "\n.\n");
-
- MailEnd(mail);
-
- alog("%s: %s!%s@%s used SENDPASS on %s", s_NickServ, u->nick,
- u->username, u->host, nick);
- notice_lang(s_NickServ, u, NICK_SENDPASS_OK, nick);
- }
-#endif
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_forbid(User * u)
-{
- NickAlias *na;
- char *nick = strtok(NULL, " ");
- char *reason = strtok(NULL, "");
-
- /* Assumes that permission checking has already been done. */
- if (!nick || (ForceForbidReason && !reason)) {
- syntax_error(s_NickServ, u, "FORBID",
- (ForceForbidReason ? NICK_FORBID_SYNTAX_REASON :
- NICK_FORBID_SYNTAX));
- return MOD_CONT;
- }
-
- if (readonly)
- notice_lang(s_NickServ, u, READ_ONLY_MODE);
- if ((na = findnick(nick)) != NULL) {
- if (NSSecureAdmins && nick_is_services_admin(na->nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- }
- delnick(na);
- }
- na = makenick(nick);
- if (na) {
- na->status |= NS_VERBOTEN;
- na->last_usermask = sstrdup(u->nick);
- if (reason)
- na->last_realname = sstrdup(reason);
-
- na->u = finduser(na->nick);
- if (na->u)
- na->u->na = na;
-
- if (na->u) {
- notice_lang(s_NickServ, na->u, FORCENICKCHANGE_NOW);
- collide(na, 0);
- }
-
-
- if (ircd->sqline) {
- anope_cmd_sqline(na->nick, ((reason) ? reason : "Forbidden"));
- }
-
- if (WallForbid)
- anope_cmd_global(s_NickServ, "\2%s\2 used FORBID on \2%s\2",
- u->nick, nick);
-
- alog("%s: %s set FORBID for nick %s", s_NickServ, u->nick, nick);
- notice_lang(s_NickServ, u, NICK_FORBID_SUCCEEDED, nick);
- send_event(EVENT_NICK_FORBIDDEN, nick);
- } else {
- alog("%s: Valid FORBID for %s by %s failed", s_NickServ, nick,
- u->nick);
- notice_lang(s_NickServ, u, NICK_FORBID_FAILED, nick);
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_suspend(User * u)
-{
-
- NickAlias *na;
- char *nick = strtok(NULL, " ");
- char *reason = strtok(NULL, "");
-
- if (!nick || !reason) {
- syntax_error(s_NickServ, u, "SUSPEND", NICK_SUSPEND_SYNTAX);
- return MOD_CONT;
- }
-
- if (readonly) {
- notice_lang(s_NickServ, u, READ_ONLY_MODE);
- return MOD_CONT;
- }
-
- if ((na = findnick(nick)) == NULL) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- return MOD_CONT;
- }
-
- if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- return MOD_CONT;
- }
-
- if (NSSecureAdmins && nick_is_services_admin(na->nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- }
-
- if (na) {
- na->nc->flags |= NI_SUSPENDED;
- na->nc->flags |= NI_SECURE;
- na->status &= ~(NS_IDENTIFIED | NS_RECOGNIZED);
- na->nc->flags &= ~(NI_KILLPROTECT | NI_KILL_QUICK | NI_KILL_IMMED);
- na->last_quit = sstrdup(reason);
-
- if (WallForbid)
- anope_cmd_global(s_NickServ, "\2%s\2 used SUSPEND on \2%s\2",
- u->nick, nick);
-
- alog("%s: %s set SUSPEND for nick %s", s_NickServ, u->nick, nick);
- notice_lang(s_NickServ, u, NICK_SUSPEND_SUCCEEDED, nick);
- send_event(EVENT_NICK_SUSPENDED, nick);
-
- } else {
-
- alog("%s: Valid SUSPEND for %s by %s failed", s_NickServ, nick,
- u->nick);
- notice_lang(s_NickServ, u, NICK_SUSPEND_FAILED, nick);
-
- }
- return MOD_CONT;
-}
-
-/*************************************************************************/
-
-static int do_unsuspend(User * u)
-{
- NickAlias *na;
- char *nick = strtok(NULL, " ");
-
- if (!nick) {
- syntax_error(s_NickServ, u, "UNSUSPEND", NICK_UNSUSPEND_SYNTAX);
- return MOD_CONT;
- }
-
- if (readonly) {
- notice_lang(s_NickServ, u, READ_ONLY_MODE);
- return MOD_CONT;
- }
-
- if ((na = findnick(nick)) == NULL) {
- notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
- return MOD_CONT;
- }
-
- if (na->status & NS_VERBOTEN) {
- notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
- return MOD_CONT;
- }
- if (NSSecureAdmins && nick_is_services_admin(na->nc)
- && !is_services_root(u)) {
- notice_lang(s_NickServ, u, PERMISSION_DENIED);
- return MOD_CONT;
- }
-
- if (na) {
- na->nc->flags &= ~NI_SUSPENDED;
-
- if (WallForbid)
- anope_cmd_global(s_NickServ, "\2%s\2 used UNSUSPEND on \2%s\2",
- u->nick, nick);
-
- alog("%s: %s set UNSUSPEND for nick %s", s_NickServ, u->nick,
- nick);
- notice_lang(s_NickServ, u, NICK_UNSUSPEND_SUCCEEDED, nick);
- send_event(EVENT_NICK_UNSUSPEND, nick);
-
- } else {
-
- alog("%s: Valid UNSUSPEND for %s by %s failed", s_NickServ, nick,
- u->nick);
- notice_lang(s_NickServ, u, NICK_UNSUSPEND_FAILED, nick);
-
- }
-
- return MOD_CONT;
-
-}
-
-/*************************************************************************/
-
-int ns_do_register(User * u)
-{
- return do_register(u);
-}
-
-/*************************************************************************/
/*
* Nick tracking
*/