os_oper.c

Go to the documentation of this file.
00001 /* OperServ core functions
00002  *
00003  * (C) 2003-2007 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: os_oper.c 1270 2007-08-27 03:23:06Z drstein $
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             /* Deleting a range */
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 /* Lists an oper entry, prefixing it with the header if needed */
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 /* Callback for enumeration purposes */
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 }

Generated on Sun Dec 30 09:26:48 2007 for Anope by  doxygen 1.5.1-20070107