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