ns_access.c

Go to the documentation of this file.
00001 /* NickServ core functions
00002  *
00003  * (C) 2003-2008 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_access.c 1345 2008-01-13 12:54:14Z geniusdex $
00012  *
00013  */
00014 /*************************************************************************/
00015 
00016 #include "module.h"
00017 
00018 int do_access(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_access.c 1345 2008-01-13 12:54:14Z geniusdex $");
00033     moduleSetType(CORE);
00034 
00035     c = createCommand("ACCESS", do_access, NULL, NICK_HELP_ACCESS, -1, -1,
00036                       -1, -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_ACCESS);
00061 }
00062 
00068 int do_access(User * u)
00069 {
00070     char *cmd = strtok(NULL, " ");
00071     char *mask = strtok(NULL, " ");
00072     NickAlias *na;
00073     int i;
00074     char **access;
00075 
00076     if (cmd && stricmp(cmd, "LIST") == 0 && mask && is_services_admin(u)
00077         && (na = findnick(mask))) {
00078 
00079         if (na->nc->accesscount == 0) {
00080             notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X_EMPTY, na->nick);
00081             return MOD_CONT;
00082         }
00083 
00084         if (na->status & NS_VERBOTEN) {
00085             notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00086             return MOD_CONT;
00087         }
00088 
00089         if (na->nc->flags & NI_SUSPENDED) {
00090             notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00091             return MOD_CONT;
00092         }
00093 
00094 
00095         notice_lang(s_NickServ, u, NICK_ACCESS_LIST_X, mask);
00096         mask = strtok(NULL, " ");
00097         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00098              access++, i++) {
00099             if (mask && !match_wild(mask, *access))
00100                 continue;
00101             notice_user(s_NickServ, u, "    %s", *access);
00102         }
00103 
00104     } else if (!cmd || ((stricmp(cmd, "LIST") == 0) ? !!mask : !mask)) {
00105         syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
00106 
00107     } else if (mask && !strchr(mask, '@')) {
00108         notice_lang(s_NickServ, u, BAD_USERHOST_MASK);
00109         notice_lang(s_NickServ, u, MORE_INFO, s_NickServ, "ACCESS");
00110 
00111     } else if (!(na = u->na)) {
00112         notice_lang(s_NickServ, u, NICK_NOT_REGISTERED);
00113 
00114     } else if (na->status & NS_VERBOTEN) {
00115         notice_lang(s_NickServ, u, NICK_X_FORBIDDEN, na->nick);
00116 
00117     } else if (na->nc->flags & NI_SUSPENDED) {
00118         notice_lang(s_NickServ, u, NICK_X_SUSPENDED, na->nick);
00119 
00120     } else if (!nick_identified(u)) {
00121         notice_lang(s_NickServ, u, NICK_IDENTIFY_REQUIRED, s_NickServ);
00122 
00123     } else if (stricmp(cmd, "ADD") == 0) {
00124         if (na->nc->accesscount >= NSAccessMax) {
00125             notice_lang(s_NickServ, u, NICK_ACCESS_REACHED_LIMIT,
00126                         NSAccessMax);
00127             return MOD_CONT;
00128         }
00129 
00130         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00131              access++, i++) {
00132             if (strcmp(*access, mask) == 0) {
00133                 notice_lang(s_NickServ, u, NICK_ACCESS_ALREADY_PRESENT,
00134                             *access);
00135                 return MOD_CONT;
00136             }
00137         }
00138 
00139         na->nc->accesscount++;
00140         na->nc->access =
00141             srealloc(na->nc->access, sizeof(char *) * na->nc->accesscount);
00142         na->nc->access[na->nc->accesscount - 1] = sstrdup(mask);
00143         notice_lang(s_NickServ, u, NICK_ACCESS_ADDED, mask);
00144 
00145     } else if (stricmp(cmd, "DEL") == 0) {
00146 
00147         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00148              access++, i++) {
00149             if (stricmp(*access, mask) == 0)
00150                 break;
00151         }
00152         if (i == na->nc->accesscount) {
00153             notice_lang(s_NickServ, u, NICK_ACCESS_NOT_FOUND, mask);
00154             return MOD_CONT;
00155         }
00156 
00157         notice_lang(s_NickServ, u, NICK_ACCESS_DELETED, *access);
00158         free(*access);
00159         na->nc->accesscount--;
00160         if (i < na->nc->accesscount)    /* if it wasn't the last entry... */
00161             memmove(access, access + 1,
00162                     (na->nc->accesscount - i) * sizeof(char *));
00163         if (na->nc->accesscount)        /* if there are any entries left... */
00164             na->nc->access =
00165                 srealloc(na->nc->access,
00166                          na->nc->accesscount * sizeof(char *));
00167         else {
00168             free(na->nc->access);
00169             na->nc->access = NULL;
00170         }
00171     } else if (stricmp(cmd, "LIST") == 0) {
00172         if (na->nc->accesscount == 0) {
00173             notice_lang(s_NickServ, u, NICK_ACCESS_LIST_EMPTY, u->nick);
00174             return MOD_CONT;
00175         }
00176 
00177         notice_lang(s_NickServ, u, NICK_ACCESS_LIST);
00178         for (access = na->nc->access, i = 0; i < na->nc->accesscount;
00179              access++, i++) {
00180             if (mask && !match_wild(mask, *access))
00181                 continue;
00182             notice_user(s_NickServ, u, "    %s", *access);
00183         }
00184     } else {
00185         syntax_error(s_NickServ, u, "ACCESS", NICK_ACCESS_SYNTAX);
00186 
00187     }
00188     return MOD_CONT;
00189 }

Generated on Sun Oct 5 09:06:55 2008 for Anope by  doxygen 1.5.7.1