os_svsnick.c

Go to the documentation of this file.
00001 /* OperServ 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_svsnick(User * u);
00018 static void myOperServHelp(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("SVSNICK", do_svsnick, is_services_root,
00035                       OPER_HELP_SVSNICK, -1, -1, -1, -1);
00036     moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
00037 
00038     moduleSetOperHelp(myOperServHelp);
00039     if (!ircd->svsnick) {
00040         return MOD_STOP;
00041     }
00042     return MOD_CONT;
00043 }
00044 
00048 void AnopeFini(void)
00049 {
00050 
00051 }
00052 
00053 
00058 static void myOperServHelp(User * u)
00059 {
00060     if (is_services_admin(u) && u->isSuperAdmin) {
00061         notice_lang(s_OperServ, u, OPER_HELP_CMD_SVSNICK);
00062     }
00063 }
00064 
00070 /* Forcefully change a user's nickname */
00071 
00072 static int do_svsnick(User * u)
00073 {
00074     char *nick = strtok(NULL, " ");
00075     char *newnick = strtok(NULL, " ");
00076 
00077     NickAlias *na;
00078     char *c;
00079 
00080     /* Only allow this if SuperAdmin is enabled */
00081     if (!u->isSuperAdmin) {
00082         notice_lang(s_OperServ, u, OPER_SUPER_ADMIN_ONLY);
00083         return MOD_CONT;
00084     }
00085 
00086     if (!nick || !newnick) {
00087         syntax_error(s_OperServ, u, "SVSNICK", OPER_SVSNICK_SYNTAX);
00088         return MOD_CONT;
00089     }
00090 
00091     /* Truncate long nicknames to NICKMAX-2 characters */
00092     if (strlen(newnick) > (NICKMAX - 2)) {
00093         notice_lang(s_OperServ, u, NICK_X_TRUNCATED,
00094                     newnick, NICKMAX - 2, newnick);
00095         newnick[NICKMAX - 2] = '\0';
00096     }
00097 
00098     /* Check for valid characters */
00099     if (*newnick == '-' || isdigit(*newnick)) {
00100         notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick);
00101         return MOD_CONT;
00102     }
00103     for (c = newnick; *c && (c - newnick) < NICKMAX; c++) {
00104         if (!isvalidnick(*c)) {
00105             notice_lang(s_OperServ, u, NICK_X_ILLEGAL, newnick);
00106             return MOD_CONT;
00107         }
00108     }
00109 
00110     /* Check for a nick in use or a forbidden/suspended nick */
00111     if (!finduser(nick)) {
00112         notice_lang(s_OperServ, u, NICK_X_NOT_IN_USE, nick);
00113     } else if (stricmp(nick, newnick) && finduser(newnick)) {
00114         notice_lang(s_OperServ, u, NICK_X_IN_USE, newnick);
00115     } else if ((na = findnick(newnick)) && (na->status & NS_VERBOTEN)) {
00116         notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, newnick);
00117     } else {
00118         notice_lang(s_OperServ, u, OPER_SVSNICK_NEWNICK, nick, newnick);
00119         anope_cmd_global(s_OperServ, "%s used SVSNICK to change %s to %s",
00120                          u->nick, nick, newnick);
00121         anope_cmd_svsnick(nick, newnick, time(NULL));
00122     }
00123     return MOD_CONT;
00124 }