ns_ghost.c

Go to the documentation of this file.
00001 /* NickServ core functions
00002  *
00003  * (C) 2003-2007 Anope Team
00004  * Contact us at info@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  * $Id: ns_ghost.c 1265 2007-08-26 15:33:06Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_ghost(User * u);
00019 void myNickServHelp(User * u);
00020 
00027 int AnopeInit(int argc, char **argv)
00028 {
00029     Command *c;
00030 
00031     moduleAddAuthor("Anope");
00032     moduleAddVersion("$Id: ns_ghost.c 1265 2007-08-26 15:33:06Z geniusdex $");
00033     moduleSetType(CORE);
00034 
00035     c = createCommand("GHOST", do_ghost, NULL, NICK_HELP_GHOST, -1, -1, -1,
00036                       -1);
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 
00052 
00053 
00058 void myNickServHelp(User * u)
00059 {
00060     notice_lang(s_NickServ, u, NICK_HELP_CMD_GHOST);
00061 }
00062 
00068 int do_ghost(User * u)
00069 {
00070     char *nick = strtok(NULL, " ");
00071     char *pass = strtok(NULL, " ");
00072     NickAlias *na;
00073     User *u2;
00074 
00075     if (!nick) {
00076         syntax_error(s_NickServ, u, "GHOST", NICK_GHOST_SYNTAX);
00077     } else if (!(u2 = finduser(nick))) {
00078         notice_lang(s_NickServ, u, NICK_X_NOT_IN_USE, nick);
00079     } else if (!(na = u2->na)) {
00080         notice_lang(s_NickServ, u, NICK_X_NOT_REGISTERED, nick);
00081     } else if (na->status & NS_VERBOTEN) {
00082         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00083     } else if (na->nc->flags & NI_SUSPENDED) {
00084         notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00085     } else if (stricmp(nick, u->nick) == 0) {
00086         notice_lang(s_NickServ, u, NICK_NO_GHOST_SELF);
00087     } else if (pass) {
00088         int res = enc_check_password(pass, na->nc->pass);
00089         if (res == 1) {
00090             char buf[NICKMAX + 32];
00091             snprintf(buf, sizeof(buf), "GHOST command used by %s",
00092                      u->nick);
00093             if (LimitSessions) {
00094                 del_session(u2->host);
00095             }
00096             kill_user(s_NickServ, nick, buf);
00097             notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
00098         } else {
00099             notice_lang(s_NickServ, u, ACCESS_DENIED);
00100             if (res == 0) {
00101                 alog("%s: GHOST: invalid password for %s by %s!%s@%s",
00102                      s_NickServ, nick, u->nick, u->username, u->host);
00103                 bad_password(u);
00104             }
00105         }
00106     } else {
00107         if (group_identified(u, na->nc)
00108             || (!(na->nc->flags & NI_SECURE) && is_on_access(u, na->nc))) {
00109             char buf[NICKMAX + 32];
00110             snprintf(buf, sizeof(buf), "GHOST command used by %s",
00111                      u->nick);
00112             if (LimitSessions) {
00113                 del_session(u2->host);
00114             }
00115             kill_user(s_NickServ, nick, buf);
00116             notice_lang(s_NickServ, u, NICK_GHOST_KILLED, nick);
00117         } else {
00118             notice_lang(s_NickServ, u, ACCESS_DENIED);
00119         }
00120     }
00121     return MOD_CONT;
00122 }

Generated on Sun Dec 30 09:26:47 2007 for Anope by  doxygen 1.5.1-20070107