ns_recover.c

Go to the documentation of this file.
00001 /* NickServ core functions
00002  *
00003  * (C) 2003-2013 Anope Team
00004  * Contact us at team@anope.org
00005  *
00006  * Please read COPYING and README for further details.
00007  *
00008  * Based on the original code of Epona by Lara.
00009  * Based on the original code of Services by Andy Church. 
00010  * 
00011  *
00012  */
00013 /*************************************************************************/
00014 
00015 #include "module.h"
00016 
00017 Command *c;
00018 
00019 static int do_recover(User * u);
00020 static void myNickServHelp(User * u);
00021 static int myHelpResonse(User * u);
00022 
00029 int AnopeInit(int argc, char **argv)
00030 {
00031     moduleAddAuthor("Anope");
00032     moduleAddVersion(VERSION_STRING);
00033     moduleSetType(CORE);
00034 
00035     c = createCommand("RECOVER", do_recover, NULL, -1, -1, -1, -1, -1);
00036     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00037     moduleAddHelp(c, myHelpResonse);
00038 
00039     moduleSetNickHelp(myNickServHelp);
00040 
00041     return MOD_CONT;
00042 }
00043 
00047 void AnopeFini(void)
00048 {
00049 
00050 }
00051 
00056 static void myNickServHelp(User * u)
00057 {
00058     notice_lang(s_NickServ, u, NICK_HELP_CMD_RECOVER);
00059 }
00060 
00065 static int myHelpResonse(User * u)
00066 {
00067     char relstr[192];
00068 
00069     /* Convert NSReleaseTimeout seconds to string format */
00070     duration(u->na, relstr, sizeof(relstr), NSReleaseTimeout);
00071     
00072     notice_help(s_NickServ, u, NICK_HELP_RECOVER, relstr);
00073     do_help_limited(s_NickServ, u, c);
00074 
00075     return MOD_CONT;
00076 }
00077 
00083 static int do_recover(User * u)
00084 {
00085     char *nick = strtok(NULL, " ");
00086     char *pass = strtok(NULL, " ");
00087     NickAlias *na;
00088     User *u2;
00089 
00090     if (!nick) {
00091         syntax_error(s_NickServ, u, "RECOVER", NICK_RECOVER_SYNTAX);
00092     } else if (!(u2 = finduser(nick))) {
00093         notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
00094     } else if (!(na = u2->na)) {
00095         notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
00096     } else if (na->status & NS_VERBOTEN) {
00097         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00098     } else if (na->nc->flags & NI_SUSPENDED) {
00099         notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00100     } else if (stricmp(nick, u->nick) == 0) {
00101         notice_lang(s_NickServ, u, NICK_NO_RECOVER_SELF);
00102     } else if (pass) {
00103         int res = enc_check_password(pass, na->nc->pass);
00104 
00105         if (res == 1) {
00106             char relstr[192];
00107 
00108             send_event(EVENT_NICK_RECOVERED, 3, EVENT_START, u->nick, nick);
00109             alog("%s: %s!%s@%s used RECOVER on %s",
00110                  s_NickServ, u->nick, u->username, u->host, u2->nick);
00111             notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
00112             collide(na, 0);
00113 
00114             /* Convert NSReleaseTimeout seconds to string format */
00115             duration(u2->na, relstr, sizeof(relstr), NSReleaseTimeout);
00116 
00117             notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick, relstr);
00118             send_event(EVENT_NICK_RECOVERED, 3, EVENT_STOP, u->nick, nick);
00119         } else {
00120             notice_lang(s_NickServ, u, ACCESS_DENIED);
00121             if (res == 0) {
00122                 alog("%s: RECOVER: invalid password for %s by %s!%s@%s",
00123                      s_NickServ, nick, u->nick, u->username, u->host);
00124                 bad_password(u);
00125             }
00126         }
00127     } else {
00128         if (group_identified(u, na->nc)
00129             || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
00130             char relstr[192];
00131 
00132             send_event(EVENT_NICK_RECOVERED, 3, EVENT_START, u->nick, nick);
00133             alog("%s: %s!%s@%s used RECOVER on %s",
00134                  s_NickServ, u->nick, u->username, u->host, u2->nick);
00135             notice_lang(s_NickServ, u2, FORCENICKCHANGE_NOW);
00136             collide(na, 0);
00137 
00138             /* Convert NSReleaseTimeout second to string format */
00139             duration(u2->na, relstr, sizeof(relstr), NSReleaseTimeout);
00140 
00141             notice_lang(s_NickServ, u, NICK_RECOVERED, s_NickServ, nick, relstr);
00142             send_event(EVENT_NICK_RECOVERED, 3, EVENT_STOP, u->nick, nick);
00143         } else {
00144             notice_lang(s_NickServ, u, ACCESS_DENIED);
00145         }
00146     }
00147 
00148     return MOD_CONT;
00149 }
00150 
00151 /* EOF */