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