ns_getpass.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 static int do_getpass(User * u);
00018 static void myNickServHelp(User * u);
00019 
00026 int AnopeInit(int argc, char **argv)
00027 {
00028     Command *c;
00029 
00030     moduleAddAuthor("Anope");
00031     moduleAddVersion(VERSION_STRING);
00032     moduleSetType(CORE);
00033 
00034     c = createCommand("GETPASS", do_getpass, is_services_admin, -1, -1, -1,
00035                       NICK_SERVADMIN_HELP_GETPASS,
00036                       NICK_SERVADMIN_HELP_GETPASS);
00037     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
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     if (is_services_admin(u)) {
00059         notice_lang(s_NickServ, u, NICK_HELP_CMD_GETPASS);
00060     }
00061 }
00062 
00068 static int do_getpass(User * u)
00069 {
00070     char *nick = strtok(NULL, " ");
00071     char tmp_pass[PASSMAX];
00072     NickAlias *na;
00073     NickRequest *nr = NULL;
00074 
00075     if (!nick) {
00076         syntax_error(s_NickServ, u, "GETPASS", NICK_GETPASS_SYNTAX);
00077     } else if (!(na = findnick(nick))) {
00078         if ((nr = findrequestnick(nick))) {
00079             alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
00080                  u->username, u->host, nick);
00081             if (WallGetpass)
00082                 anope_cmd_global(s_NickServ,
00083                                  "\2%s\2 used GETPASS on \2%s\2", u->nick,
00084                                  nick);
00085             notice_lang(s_NickServ, u, NICK_GETPASS_PASSCODE_IS, nick,
00086                         nr->passcode);
00087         } else {
00088             notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
00089         }
00090     } else if (na->status & NS_VERBOTEN) {
00091         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00092     } else if (NSSecureAdmins && nick_is_services_admin(na->nc)
00093                && !is_services_root(u)) {
00094         notice_lang(s_NickServ, u, PERMISSION_DENIED);
00095     } else if (NSRestrictGetPass && !is_services_root(u)) {
00096         notice_lang(s_NickServ, u, PERMISSION_DENIED);
00097     } else {
00098         if(enc_decrypt(na->nc->pass,tmp_pass,PASSMAX - 1)==1) {
00099             alog("%s: %s!%s@%s used GETPASS on %s", s_NickServ, u->nick,
00100                  u->username, u->host, nick);
00101             if (WallGetpass)
00102                 anope_cmd_global(s_NickServ, "\2%s\2 used GETPASS on \2%s\2",
00103                                  u->nick, nick);
00104             notice_lang(s_NickServ, u, NICK_GETPASS_PASSWORD_IS, nick,
00105                         tmp_pass);
00106         } else {
00107             notice_lang(s_NickServ, u, NICK_GETPASS_UNAVAILABLE);
00108         }
00109     }
00110     return MOD_CONT;
00111 }