00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
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)
00161 memmove(access, access + 1,
00162 (na->nc->accesscount - i) * sizeof(char *));
00163 if (na->nc->accesscount)
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 }