ns_access.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_access(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("ACCESS", do_access, NULL, NICK_HELP_ACCESS, -1, -1,
00035                       -1, -1);
00036     moduleAddCommand(NICKSERV, c, MOD_UNIQUE);
00037 
00038     moduleSetNickHelp(myNickServHelp);
00039 
00040     return MOD_CONT;
00041 }
00042 
00046 void AnopeFini(void)
00047 {
00048 
00049 }
00050 
00051 
00052 
00057 static void myNickServHelp(User * u)
00058 {
00059     notice_lang(s_NickServ, u, NICK_HELP_CMD_ACCESS);
00060 }
00061 
00067 static int do_access(User * u)
00068 {
00069     char *cmd = strtok(NULL, " ");
00070     char *mask = strtok(NULL, " ");
00071     NickAlias *na;
00072     int i;
00073     char **access;
00074 
00075     if (cmd && stricmp(cmd, "LIST") == 0 && mask && is_services_admin(u)
00076         && (na = findnick(mask))) {
00077 
00078         if (na->nc->accesscount == 0) {
00079             notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X_EMPTY, na->nick);
00080             return MOD_CONT;
00081         }
00082 
00083         if (na->status & NS_VERBOTEN) {
00084             notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00085             return MOD_CONT;
00086         }
00087 
00088         if (na->nc->flags & NI_SUSPENDED) {
00089             notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00090             return MOD_CONT;
00091         }
00092 
00093 
00094         notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X, mask);
00095         mask = strtok(NULL, " ");
00096         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00097              access++, i++) {
00098             if (mask && !match_wild(mask, *access))
00099                 continue;
00100             notice_user(s_NickServ, u, "    %s", *access);
00101         }
00102 
00103     } else if (!cmd || ((stricmp(cmd, "LIST") == 0) ? !!mask : !mask)) {
00104         syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
00105 
00106     } else if (mask && !strchr(mask, '@')) {
00107         notice_lang(s_NickServ, u, BAD_USERHOST_MASK);
00108         notice_lang(s_NickServ, u, MORE_INFO, s_NickServ, "ACCESS");
00109 
00110     } else if (!(na = u->na)) {
00111         notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
00112 
00113     } else if (na->status & NS_VERBOTEN) {
00114         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00115 
00116     } else if (na->nc->flags & NI_SUSPENDED) {
00117         notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00118 
00119     } else if (!nick_identified(u)) {
00120         notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
00121 
00122     } else if (stricmp(cmd, "ADD") == 0) {
00123         if (na->nc->accesscount >= NSAccessMax) {
00124             notice_lang(s_NickServ, u, NICK_ACCESS_REACHED_LIMIT,
00125                         NSAccessMax);
00126             return MOD_CONT;
00127         }
00128 
00129         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00130              access++, i++) {
00131             if (strcmp(*access, mask) == 0) {
00132                 notice_lang(s_NickServ, u, NICK_ACCESS_ALREADY_PRESENT,
00133                             *access);
00134                 return MOD_CONT;
00135             }
00136         }
00137 
00138         na->nc->accesscount++;
00139         na->nc->access =
00140             srealloc(na->nc->access, sizeof(char *) * na->nc->accesscount);
00141         na->nc->access[na->nc->accesscount - 1] = sstrdup(mask);
00142         alog("%s: %s!%s@%s added %s to their access list",
00143              s_NickServ, u->nick, u->username, u->host, mask);
00144         notice_lang(s_NickServ, u, NICK_ACCESS_ADDED, mask);
00145 
00146     } else if (stricmp(cmd, "DEL") == 0) {
00147 
00148         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00149              access++, i++) {
00150             if (stricmp(*access, mask) == 0)
00151                 break;
00152         }
00153         if (i == na->nc->accesscount) {
00154             notice_lang(s_NickServ, u, NICK_ACCESS_NOT_FOUND, mask);
00155             return MOD_CONT;
00156         }
00157         alog("%s: %s!%s@%s deleted %s from their access list",
00158              s_NickServ, u->nick, u->username, u->host, mask);
00159         notice_lang(s_NickServ, u, NICK_ACCESS_DELETED, *access);
00160         free(*access);
00161         na->nc->accesscount--;
00162         if (i < na->nc->accesscount)    /* if it wasn't the last entry... */
00163             memmove(access, access + 1,
00164                     (na->nc->accesscount - i) * sizeof(char *));
00165         if (na->nc->accesscount)        /* if there are any entries left... */
00166             na->nc->access =
00167                 srealloc(na->nc->access,
00168                          na->nc->accesscount * sizeof(char *));
00169         else {
00170             free(na->nc->access);
00171             na->nc->access = NULL;
00172         }
00173     } else if (stricmp(cmd, "LIST") == 0) {
00174         if (na->nc->accesscount == 0) {
00175             notice_lang(s_NickServ, u, NICK_ACCESS_LIST_EMPTY, u->nick);
00176             return MOD_CONT;
00177         }
00178 
00179         notice_lang(s_NickServ, u, NICK_ACCESS_LIST);
00180         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00181              access++, i++) {
00182             if (mask && !match_wild(mask, *access))
00183                 continue;
00184             notice_user(s_NickServ, u, "    %s", *access);
00185         }
00186     } else {
00187         syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
00188 
00189     }
00190     return MOD_CONT;
00191 }