00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "module.h"
00017
00018 int do_oper(User * u);
00019 int oper_list_callback(SList * slist, int number, void *item,
00020 va_list args);
00021 int oper_list(int number, NickCore * nc, User * u, int *sent_header);
00022 void myOperServHelp(User * u);
00023
00030 int AnopeInit(int argc, char **argv)
00031 {
00032 Command *c;
00033
00034 moduleAddAuthor("Anope");
00035 moduleAddVersion("$Id: os_oper.c 1270 2007-08-27 03:23:06Z drstein $");
00036 moduleSetType(CORE);
00037 c = createCommand("OPER", do_oper, NULL, OPER_HELP_OPER, -1, -1, -1,
00038 -1);
00039 c->help_param1 = s_NickServ;
00040 moduleAddCommand(OPERSERV, c, MOD_UNIQUE);
00041
00042 moduleSetOperHelp(myOperServHelp);
00043
00044 return MOD_CONT;
00045 }
00046
00050 void AnopeFini(void)
00051 {
00052
00053 }
00054
00055
00060 void myOperServHelp(User * u)
00061 {
00062 notice_lang(s_OperServ, u, OPER_HELP_CMD_OPER);
00063 }
00064
00070 int do_oper(User * u)
00071 {
00072 char *cmd = strtok(NULL, " ");
00073 char *nick = strtok(NULL, " ");
00074 NickAlias *na;
00075 int res = 0;
00076
00077 if (skeleton) {
00078 notice_lang(s_OperServ, u, OPER_OPER_SKELETON);
00079 return MOD_CONT;
00080 }
00081
00082 if (!cmd || (!nick && stricmp(cmd, "LIST") && stricmp(cmd, "CLEAR"))) {
00083 syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX);
00084 } else if (!stricmp(cmd, "ADD")) {
00085 if (!is_services_root(u)) {
00086 notice_lang(s_OperServ, u, PERMISSION_DENIED);
00087 return MOD_CONT;
00088 }
00089
00090 if (!(na = findnick(nick))) {
00091 notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick);
00092 return MOD_CONT;
00093 }
00094
00095 if (na->status & NS_VERBOTEN) {
00096 notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick);
00097 return MOD_CONT;
00098 }
00099
00100 if (na->nc->flags & NI_SERVICES_OPER
00101 || slist_indexof(&servopers, na->nc) != -1) {
00102 notice_lang(s_OperServ, u, OPER_OPER_EXISTS, nick);
00103 return MOD_CONT;
00104 }
00105
00106 res = slist_add(&servopers, na->nc);
00107 if (res == -2) {
00108 notice_lang(s_OperServ, u, OPER_OPER_REACHED_LIMIT, nick);
00109 return MOD_CONT;
00110 } else {
00111 if (na->nc->flags & NI_SERVICES_ADMIN
00112 && (res = slist_indexof(&servadmins, na->nc)) != -1) {
00113 if (!is_services_root(u)) {
00114 notice_lang(s_OperServ, u, PERMISSION_DENIED);
00115 return MOD_CONT;
00116 }
00117 slist_delete(&servadmins, res);
00118 na->nc->flags |= NI_SERVICES_OPER;
00119 notice_lang(s_OperServ, u, OPER_OPER_MOVED, nick);
00120 } else {
00121 na->nc->flags |= NI_SERVICES_OPER;
00122 notice_lang(s_OperServ, u, OPER_OPER_ADDED, nick);
00123 }
00124 }
00125
00126 if (readonly)
00127 notice_lang(s_OperServ, u, READ_ONLY_MODE);
00128 } else if (!stricmp(cmd, "DEL")) {
00129 if (!is_services_root(u)) {
00130 notice_lang(s_OperServ, u, PERMISSION_DENIED);
00131 return MOD_CONT;
00132 }
00133
00134 if (isdigit(*nick) && strspn(nick, "1234567890,-") == strlen(nick)) {
00135
00136 res = slist_delete_range(&servopers, nick, NULL);
00137 if (res == 0) {
00138 notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH);
00139 return MOD_CONT;
00140 } else if (res == 1) {
00141 notice_lang(s_OperServ, u, OPER_OPER_DELETED_ONE);
00142 } else {
00143 notice_lang(s_OperServ, u, OPER_OPER_DELETED_SEVERAL, res);
00144 }
00145 } else {
00146 if (!(na = findnick(nick))) {
00147 notice_lang(s_OperServ, u, NICK_X_NOT_REGISTERED, nick);
00148 return MOD_CONT;
00149 }
00150
00151 if (na->status & NS_VERBOTEN) {
00152 notice_lang(s_OperServ, u, NICK_X_FORBIDDEN, nick);
00153 return MOD_CONT;
00154 }
00155
00156 if (!(na->nc->flags & NI_SERVICES_OPER)
00157 || (res = slist_indexof(&servopers, na->nc)) == -1) {
00158 notice_lang(s_OperServ, u, OPER_OPER_NOT_FOUND, nick);
00159 return MOD_CONT;
00160 }
00161
00162 slist_delete(&servopers, res);
00163 notice_lang(s_OperServ, u, OPER_OPER_DELETED, nick);
00164 }
00165
00166 if (readonly)
00167 notice_lang(s_OperServ, u, READ_ONLY_MODE);
00168 } else if (!stricmp(cmd, "LIST")) {
00169 int sent_header = 0;
00170
00171 if (!is_oper(u)) {
00172 notice_lang(s_OperServ, u, PERMISSION_DENIED);
00173 return MOD_CONT;
00174 }
00175
00176 if (servopers.count == 0) {
00177 notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY);
00178 return MOD_CONT;
00179 }
00180
00181 if (!nick || (isdigit(*nick)
00182 && strspn(nick, "1234567890,-") == strlen(nick))) {
00183 res =
00184 slist_enum(&servopers, nick, &oper_list_callback, u,
00185 &sent_header);
00186 if (res == 0) {
00187 notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH);
00188 return MOD_CONT;
00189 } else {
00190 notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper");
00191 }
00192 } else {
00193 int i;
00194
00195 for (i = 0; i < servopers.count; i++)
00196 if (!stricmp
00197 (nick, ((NickCore *) servopers.list[i])->display)
00198 || match_wild_nocase(nick,
00199 ((NickCore *) servopers.list[i])->
00200 display))
00201 oper_list(i + 1, servopers.list[i], u, &sent_header);
00202
00203 if (!sent_header)
00204 notice_lang(s_OperServ, u, OPER_OPER_NO_MATCH);
00205 else {
00206 notice_lang(s_OperServ, u, END_OF_ANY_LIST, "Oper");
00207 }
00208 }
00209 } else if (!stricmp(cmd, "CLEAR")) {
00210 if (!is_services_root(u)) {
00211 notice_lang(s_OperServ, u, PERMISSION_DENIED);
00212 return MOD_CONT;
00213 }
00214
00215 if (servopers.count == 0) {
00216 notice_lang(s_OperServ, u, OPER_OPER_LIST_EMPTY);
00217 return MOD_CONT;
00218 }
00219
00220 slist_clear(&servopers, 1);
00221 notice_lang(s_OperServ, u, OPER_OPER_CLEAR);
00222 } else {
00223 syntax_error(s_OperServ, u, "OPER", OPER_OPER_SYNTAX);
00224 }
00225 return MOD_CONT;
00226 }
00227
00228
00229
00230 int oper_list(int number, NickCore * nc, User * u, int *sent_header)
00231 {
00232 if (!nc)
00233 return 0;
00234
00235 if (!*sent_header) {
00236 notice_lang(s_OperServ, u, OPER_OPER_LIST_HEADER);
00237 *sent_header = 1;
00238 }
00239
00240 notice_lang(s_OperServ, u, OPER_OPER_LIST_FORMAT, number, nc->display);
00241 return 1;
00242 }
00243
00244
00245
00246 int oper_list_callback(SList * slist, int number, void *item, va_list args)
00247 {
00248 User *u = va_arg(args, User *);
00249 int *sent_header = va_arg(args, int *);
00250
00251 return oper_list(number, item, u, sent_header);
00252 }