ns_release.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_release(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("RELEASE", do_release, 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 
00052 
00053 
00058 static void myNickServHelp(User * u)
00059 {
00060     notice_lang(s_NickServ, u, NICK_HELP_CMD_RELEASE);
00061 }
00062 
00067 static int myHelpResonse(User * u)
00068 {
00069     char relstr[192];
00070 
00071     /* Convert NSReleaseTimeout seconds to string format */
00072     duration(u->na, relstr, sizeof(relstr), NSReleaseTimeout);
00073     
00074     notice_help(s_NickServ, u, NICK_HELP_RELEASE, relstr);
00075     do_help_limited(s_NickServ, u, c);
00076 
00077     return MOD_CONT;
00078 }
00079 
00085 static int do_release(User * u)
00086 {
00087     char *nick = strtok(NULL, " ");
00088     char *pass = strtok(NULL, " ");
00089     NickAlias *na;
00090 
00091     if (!nick) {
00092         syntax_error(s_NickServ, u, "RELEASE", NICK_RELEASE_SYNTAX);
00093     } else if (!(na = findnick(nick))) {
00094         notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
00095     } else if (na->status & NS_VERBOTEN) {
00096         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00097     } else if (na->nc->flags & NI_SUSPENDED) {
00098         notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00099     } else if (!(na->status & NS_KILL_HELD)) {
00100         notice_lang(s_NickServ, u, NICK_RELEASE_NOT_HELD, nick);
00101     } else if (pass) {
00102         int res = enc_check_password(pass, na->nc->pass);
00103         if (res == 1) {
00104             release(na, 0);
00105             notice_lang(s_NickServ, u, NICK_RELEASED);
00106         } else {
00107             notice_lang(s_NickServ, u, ACCESS_DENIED);
00108             if (res == 0) {
00109                 alog("%s: RELEASE: invalid password for %s by %s!%s@%s",
00110                      s_NickServ, nick, u->nick, u->username, u->host);
00111                 bad_password(u);
00112             }
00113         }
00114     } else {
00115         if (group_identified(u, na->nc)
00116             || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
00117             release(na, 0);
00118             notice_lang(s_NickServ, u, NICK_RELEASED);
00119         } else {
00120             notice_lang(s_NickServ, u, ACCESS_DENIED);
00121         }
00122     }
00123     return MOD_CONT;
00124 }
00125 
00126 /* EOF */