Merge branch 'master' into SpamServ
authorNurPech <nurpech@nurpech.de>
Tue, 27 Aug 2013 19:09:35 +0000 (21:09 +0200)
committerNurPech <nurpech@nurpech.de>
Tue, 27 Aug 2013 19:09:54 +0000 (21:09 +0200)
src/chanserv.c
src/mod-blacklist.c
src/mod-hostserv.c
src/mod-iauth_loc.c
src/nickserv.c
src/nickserv.h
src/opserv.c
src/opserv.h
src/proto-p10.c
src/spamserv.c

index 19a5c5776587b121248a86ecef4aab8b5bfe9030..37d6531e5485dddb19db96586324777941a140fb 100644 (file)
@@ -399,7 +399,7 @@ static const struct message_entry msgtab[] = {
     { "CSMSG_LC_H_TITLE", "support helper" },
     { "CSMSG_LAME_SMURF_TARGET", "%s is an IRC operator." },
     { "CSMSG_MYACCESS_COUNT", "%s has access in $b%d$b channels and is owner of $b%d$b channel(s)." },
-       { "CSMSG_MYACCESS_COUNT_1", "%s has access in $b%d$b channel and is owner of $b%d$b channel(s)." },
+    { "CSMSG_MYACCESS_COUNT_1", "%s has access in $b%d$b channel and is owner of $b%d$b channel(s)." },
 
 
 /* Seen information */
@@ -483,6 +483,7 @@ static const struct message_entry msgtab[] = {
 /* Toys */
     { "CSMSG_UNF_RESPONSE", "I don't want to be part of your sick fantasies!" },
     { "CSMSG_PING_RESPONSE", "Pong!" },
+    { "CSMSG_PONG_RESPONSE", "Ping!" },
     { "CSMSG_WUT_RESPONSE", "wut" },
     { "CSMSG_BAD_NUMBER", "$b%s$b is an invalid number.  Please use a number greater than 1 with this command." },
     { "CSMSG_BAD_DIE_FORMAT", "I do not understand $b%s$b.  Please use either a single number or standard 4d6+3 format." },
@@ -1523,7 +1524,7 @@ unregister_channel(struct chanData *channel, const char *reason)
     if(channel->expiry)
         timeq_del(channel->expiry, chanserv_expire_channel, channel, 0);
     channel->channel->channel_info = NULL;
-
+    sprintf(msgbuf, "%s %s", channel->channel->name, reason);
     dict_delete(channel->notes);
     if(!IsSuspended(channel))
         DelChannelUser(chanserv, channel->channel, msgbuf, 0);
@@ -2168,7 +2169,6 @@ static CHANSERV_FUNC(cmd_register)
     struct handle_info *handle;
     struct chanData *cData;
     struct modeNode *mn;
-    char reason[MAXLEN];
     char *chan_name;
     unsigned int new_channel, force=0;
     struct do_not_register *dnr;
@@ -3287,8 +3287,7 @@ static CHANSERV_FUNC(cmd_opme)
         return 0;
     }
 
-    struct devnull_class *devnull;
-    if(user->handle_info->devnull && (devnull = devnull_get(user->handle_info->devnull)) && (devnull->modes & DEVNULL_MODE_OPME))
+    if(devnull_user_has_priv(user->handle_info, DEVNULL_PRIV_OPME))
     {
         change.args[0].mode = MODE_CHANOP;
         errmsg = "CSMSG_ALREADY_OPPED";
@@ -7130,6 +7129,20 @@ static CHANSERV_FUNC(cmd_ping)
     return 1;
 }
 
+static CHANSERV_FUNC(cmd_pong)
+{
+    if(channel)
+    {
+        char response[MAXLEN];
+        const char *fmt = user_find_message(user, "CSMSG_PONG_RESPONSE");
+        sprintf(response, "\ 2%s\ 2: %s", user->nick, fmt);
+        irc_privmsg(cmd->parent->bot, channel->name, response);
+    }
+    else
+        reply("CSMSG_PONG_RESPONSE");
+    return 1;
+}
+
 static CHANSERV_FUNC(cmd_wut)
 {
     if(channel)
@@ -7988,7 +8001,7 @@ chanserv_conf_read(void)
     str = database_get_data(conf_node, "off_channel", RECDB_QSTRING);
     off_channel = str ? atoi(str) : 0;
 
-    str = database_get_data(conf_node, "oper_chan", RECDB_QSTRING);
+    str = database_get_data(conf_node, "oper_channel", RECDB_QSTRING);
        if(str)
        {
                chanserv_conf.oper_channel = AddChannel(str, now, "+tinms", NULL);
@@ -8963,6 +8976,7 @@ init_chanserv(const char *nick)
 
     DEFINE_COMMAND(unf, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL);
     DEFINE_COMMAND(ping, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL);
+    DEFINE_COMMAND(pong, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL);
     DEFINE_COMMAND(wut, 1, 0, "flags", "+nolog,+toy,+acceptchan", NULL);
     DEFINE_COMMAND(8ball, 2, 0, "flags", "+nolog,+toy,+acceptchan", NULL);
     DEFINE_COMMAND(d, 2, 0, "flags", "+nolog,+toy,+acceptchan", NULL);
index e202f739302e9de2a8c4a90fb338eb406d762520..61d0adf5072f973d10065af23ae4bffa273863ce 100644 (file)
@@ -53,9 +53,9 @@ static struct {
 } conf;
 
 #if defined(GCC_VARMACROS)
-# define blacklist_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, ARGS); } while (0)
+# define blacklist_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, ARGS); } while (0)
 #elif defined(C99_VARMACROS)
-# define blacklist_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0)
+# define blacklist_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0)
 #endif
 
 static void
index ce8a3745d64ad405d5ef7e8ffe4ddd696a315d4c..24de72dc7ee471bcd15e5100b0e81a9e2d90416f 100644 (file)
@@ -40,7 +40,7 @@
  */
 
 #include "chanserv.h"
-#include "opserv.h"
+#include "opserv.h" /* devnull management! */
 #include "nickserv.h"
 #include "conf.h"
 #include "modcmd.h"
@@ -52,6 +52,7 @@
 #define KEY_MANAGERS "Manager"
 #define KEY_ASSIGNMENTS "Assignments"
 #define KEY_ACTIVE "active"
+#define KEY_DEVNULL "devnull"
 
 #define HS_FAKEHOST_SPECIAL_CHARS "_-:;" /* alphanum already included */
 
@@ -79,6 +80,7 @@ static const struct message_entry msgtab[] = {
     { "HSMSG_UNKNOWN_FAKEHOST", "Fakehost $b%s.%s$b is unknown or you have no access to manage it." },
     { "HSMSG_TOPLEVEL_FAKEHOSTS", "Fakehosts in group $b*.%s$b:" },
     { "HSMSG_TOPLEVEL_FAKEHOST", "  $b%s.%s$b   assignments: %d   managers: %d" },
+    { "HSMSG_TOPLEVEL_FAKEHOST_DEVNULL", "  $b%s.%s$b   assignments: %d   managers: %d   DevNull: %s" },
     { "HSMSG_TOPLEVEL_INVALID", "The name of the group you entered is invalid ($b%s$b)" },
     { "HSMSG_MANAGERS_TOPLEVEL", "Managers of group $b*.%s$b:" },
     { "HSMSG_MANAGERS_FAKEHOST", "Managers of group $b%s.%s$b:" },
@@ -101,6 +103,8 @@ static const struct message_entry msgtab[] = {
     { "HSMSG_FAKEHOST_ASSIGN_SUCCESS", "Group $b%s.%s$b was assigned successfully." },
     { "HSMSG_FAKEHOST_ASSIGNED", "Group $b%s.%s$b is already assigned to the user." },
     { "HSMSG_FAKEHOST_UNASSIGN_SUCCESS", "Group $b%s.%s$b was unassigned successfully." },
+    { "HSMSG_FAKEHOST_TLDEVNULL", "You can't assign a DevNull class to a toplevel fakehost." },
+    { "HSMSG_DEVNULL_CLASS", "$b%s.%s$b DevNull Class: %s" },
     
     { NULL, NULL }
 };
@@ -139,6 +143,7 @@ struct hs_secondlevel {
     struct hs_toplevel *toplevel;
     char *fakehost;
     struct hs_manager *managers;
+    int devnull_id;
     struct hs_assignment *assignments;
     struct hs_secondlevel *next;
 };
@@ -646,7 +651,11 @@ static void cmd_view_toplevel_information(UNUSED_ARG(struct userNode *user), UNU
         int assignments = 0;
         for(assignment = slfh->assignments; assignment; assignment = assignment->next)
             assignments++;
-        reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers);
+        struct devnull_class *th;
+        if(slfh->devnull_id && (th = devnull_find_id(slfh->devnull_id)))
+            reply("HSMSG_TOPLEVEL_FAKEHOST_DEVNULL", slfh->fakehost, tlfh->fakehost, assignments, managers, th->name);
+        else
+            reply("HSMSG_TOPLEVEL_FAKEHOST", slfh->fakehost, tlfh->fakehost, assignments, managers);
     }
     reply("HSMSG_MANAGERS_TOPLEVEL", tlfh->fakehost);
     struct hs_manager *cmanager;
@@ -1224,6 +1233,78 @@ static MODCMD_FUNC(cmd_oset) {
     }
 }
 
+static MODCMD_FUNC(cmd_setdevnull) {
+    struct handle_info *hi;
+    if (!(hi = user->handle_info)) {
+        reply("NSMSG_MUST_AUTH");
+        return 0;
+    }
+    struct hs_fakehost_info fhinfo = parse_fakehost_info(argv[1], 1);
+    if(fhinfo.parse_state == HS_FHPARSE_INVALID) {
+        reply("HSMSG_TOPLEVEL_INVALID", argv[1]);
+        return 0;
+    }
+    if(!fhinfo.have_secondlevel) {
+        reply("HSMSG_FAKEHOST_TLDEVNULL");
+        return 0;
+    } else {
+        if(!fhinfo.tlfh) {
+            reply("HSMSG_UNKNOWN_FAKEHOST", fhinfo.slfh_name, fhinfo.tlfh_name);
+            return 0;
+        }
+        if(!check_management_access(hi, NULL, NULL)) {
+            reply("HSMSG_ACCESS_DENIED");
+            return 0;
+        }
+        char *fakehost_name;
+        if(!strcmp(argv[2], "*")) {
+            fhinfo.slfh->devnull_id = 0;
+            fakehost_name = "-";
+        } else {
+            struct devnull_class *th = devnull_find_name(argv[2]);
+            if(!th) {
+                reply("OSMSG_DEVNULL_NOTFOUND", argv[2]);
+                return 0;
+            }
+            fhinfo.slfh->devnull_id = th->id;
+            fakehost_name = th->name;
+        }
+        reply("HSMSG_DEVNULL_CLASS", fhinfo.slfh_name, fhinfo.tlfh_name, fakehost_name);
+    }
+    return 1;
+}
+
+
+struct devnull_class hostserv_get_user_priv(struct handle_info *hi) {
+    struct devnull_class th;
+    memset(&th, 0, sizeof(th));
+    
+    struct hs_user *huser = hs_get_user(hi, 0);
+    if(huser) {
+        struct hs_assignment *assignment;
+        struct hs_secondlevel *slfh;
+        struct devnull_class *devc;
+        for(assignment = huser->assignments; assignment; assignment = assignment->unext) {
+            slfh = assignment->secondlevel;
+            if(slfh->devnull_id) {
+                devc = devnull_find_id(slfh->devnull_id);
+                if(!devc) {
+                    slfh->devnull_id = 0;
+                    continue;
+                }
+                if(DEVNULL_HAS_PRIV(devc, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < devc->maxchan))
+                    th.maxchan = devc->maxchan;
+                if(DEVNULL_HAS_PRIV(devc, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < devc->maxsendq))
+                    th.maxsendq = devc->maxsendq;
+                th.modes |= devc->modes;
+                if(!th.name)
+                    th.name = devc->name;
+            }
+        }
+    }
+    return th;
+}
+
 static void hostserv_conf_read(void) {
     dict_t conf_node;
     const char *str;
@@ -1311,6 +1392,7 @@ static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_
     struct hs_manager *managerSL;
     struct hs_user *user;
     struct dict *object;
+    char *str;
 
     if (rd->type == RECDB_OBJECT) {
         dict_t db = GET_RECORD_OBJECT(rd);
@@ -1318,6 +1400,10 @@ static int hostserv_saxdb_read_secondlevel(const char *name, void *data, UNUSED_
         
         slfh = hs_add_secondlevel(tlfh, name);
         
+        str = database_get_data(db, KEY_DEVNULL, RECDB_QSTRING);
+        if(str)
+            slfh->devnull_id = atoi(str);
+        
         if ((object = database_get_data(db, KEY_MANAGERS, RECDB_OBJECT))) {
             for (it = dict_first(object); it; it = iter_next(it)) {
                 user = hs_get_user(get_handle_info(iter_key(it)), 1);
@@ -1392,6 +1478,9 @@ hostserv_saxdb_write(struct saxdb_context *ctx)
         for(slfh = tlfh->secondlevel; slfh; slfh = slfh->next) {
             saxdb_start_record(ctx, slfh->fakehost, 1);
             
+            if(slfh->devnull_id)
+                saxdb_write_int(ctx, KEY_DEVNULL, slfh->devnull_id);
+            
             saxdb_start_record(ctx, KEY_MANAGERS, 1);
             for(manager = slfh->managers; manager; manager = manager->next) {
                 saxdb_start_record(ctx, manager->user->hi->handle, 0);
@@ -1453,7 +1542,11 @@ int hostserv_init() {
     modcmd_register(hostserv_module, "delhost", cmd_delhost, 2, MODCMD_REQUIRE_AUTHED, NULL);
     modcmd_register(hostserv_module, "renamehost", cmd_renamehost, 3, MODCMD_REQUIRE_AUTHED, NULL);
     modcmd_register(hostserv_module, "oset", cmd_oset, 3, MODCMD_REQUIRE_AUTHED, NULL);
+    modcmd_register(hostserv_module, "setdevnull", cmd_setdevnull, 3, MODCMD_REQUIRE_AUTHED, NULL);
     message_register_table(msgtab);
+    
+    /* "register" own devnull privilege handler */
+    devnull_check_priv_func = hostserv_get_user_priv;
     return 1;
 }
 
index 78668c00bba75509a9e53520b722affe1d23f3fb..1eba722c004b6f648e743c9d6dc2b42bb2aaa6ea 100644 (file)
@@ -32,9 +32,9 @@ static struct {
 } conf;
 
 #if defined(GCC_VARMACROS)
-# define loc_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, ARGS); } while (0)
+# define loc_debug(ARGS...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, ARGS); } while (0)
 #elif defined(C99_VARMACROS)
-# define loc_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_notice(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0)
+# define loc_debug(...) do { if (conf.debug_bot && conf.debug_channel) send_channel_message(conf.debug_channel, conf.debug_bot, __VA_ARGS__); } while (0)
 #endif
 
 static void
index 25c2a43cfa9dc427b1adead6d1e66e0e02632d6d..089cc935daab316d7c9e22647c75e6f367205617 100644 (file)
@@ -491,7 +491,7 @@ register_handle(const char *handle, const char *passwd, unsigned long id)
 
     hi->id = id;
     hi->website = NULL;
-    hi->devnull = NULL;
+    hi->devnull_id = 0;
     dict_insert(nickserv_id_dict, strdup(id_base64), hi);
 
     return hi;
@@ -578,7 +578,6 @@ free_handle_info(void *vhi)
     free(hi->infoline);
     free(hi->epithet);
     free(hi->fakehost);
-    free(hi->devnull);
     free(hi->website);
     free(hi->fakeident);
     if (hi->cookie) {
@@ -1510,8 +1509,10 @@ static NICKSERV_FUNC(cmd_handleinfo)
     }
 
     reply("NSMSG_HANDLEINFO_INFOLINE", (hi->infoline ? hi->infoline : nsmsg_none));
-    if ((oper_has_access(user, cmd->parent->bot, 200, 1)) || IsNetworkHelper(user))
-        reply("NSMSG_HANDLEINFO_DEVNULL", (hi->devnull ? hi->devnull : nsmsg_none));
+    if ((oper_has_access(user, cmd->parent->bot, 200, 1)) || IsNetworkHelper(user)) {
+        struct devnull_class *devnull_c = (hi->devnull_id ? devnull_find_id(hi->devnull_id) : NULL);
+        reply("NSMSG_HANDLEINFO_DEVNULL", (devnull_c ? devnull_c->name : nsmsg_none));
+    }
     if (user->handle_info && HANDLE_FLAGGED(user->handle_info, BOT))
         reply("NSMSG_HANDLEINFO_WEBSITE", (hi->website ? hi->website : nsmsg_none));
     if(hi->opserv_level > 0 && user->handle_info && HANDLE_FLAGGED(user->handle_info, BOT))
@@ -2649,52 +2650,46 @@ static OPTION_FUNC(opt_info)
 
 static OPTION_FUNC(opt_devnull)
 {
-    const char *devnull;
-    
+    const char *devnull_name;
+    struct devnull_class *devnull_c;
+
     if (argc > 1) {
         if (!override) {
             send_message(user, nickserv, "MSG_SETTING_PRIVILEGED", argv[0]);
             return 0;
         }
         if ((argv[1][0] == '*') && (argv[1][1] == 0)) {
-            free(hi->devnull);
-            hi->devnull = NULL;
+            hi->devnull_id = 0;
         } else {
-            devnull = unsplit_string(argv+1, argc-1, NULL);
-            if(devnull_check(devnull) == 1) { 
-                if(hi->devnull)
-                    free(hi->devnull);
-                hi->devnull = strdup(devnull);
-            }
+            devnull_name = unsplit_string(argv+1, argc-1, NULL);
+            devnull_c = devnull_find_name(devnull_name);
+            if(devnull_c)
+                hi->devnull_id = devnull_c->id;
         }
     }
 
-    devnull = hi->devnull ? hi->devnull : user_find_message(user, "MSG_NONE");
-    send_message(user, nickserv, "NSMSG_SET_DEVNULL", devnull);
-    return 1;
-}
-
-void nickserv_devnull_delete(char *name) {
-    dict_iterator_t it;
-    struct handle_info *hi;
-
-    for (it = dict_first(nickserv_handle_dict); it; it = iter_next(it)) {
-        hi = iter_data(it);
-        if (hi->devnull && !irccasecmp(name, hi->devnull)) {
-            free(hi->devnull);
-            hi->devnull = NULL;
+    if(hi->devnull_id) {
+        devnull_c = devnull_find_id(hi->devnull_id);
+        if(devnull_c)
+            devnull_name = devnull_c->name;
+        else {
+            devnull_name = user_find_message(user, "MSG_NONE");
+            hi->devnull_id = 0;
         }
-    }
+    } else
+        devnull_name = user_find_message(user, "MSG_NONE");
+    send_message(user, nickserv, "NSMSG_SET_DEVNULL", devnull_name);
+    return 1;
 }
 
-void nickserv_devnull_rename(char *oldname, char *newname) {
+void nickserv_devnull_delete(unsigned int devnull_id) {
     dict_iterator_t it;
     struct handle_info *hi;
 
     for (it = dict_first(nickserv_handle_dict); it; it = iter_next(it)) {
         hi = iter_data(it);
-        if (hi->devnull && !irccasecmp(oldname, hi->devnull)) {
-            hi->devnull = strdup(newname);
+        if (hi->devnull_id == devnull_id) {
+            hi->devnull_id = 0;
         }
     }
 }
@@ -3500,8 +3495,8 @@ nickserv_saxdb_write(struct saxdb_context *ctx) {
         saxdb_write_int(ctx, KEY_ID, hi->id);
         if (hi->infoline)
             saxdb_write_string(ctx, KEY_INFO, hi->infoline);
-        if (hi->devnull)
-            saxdb_write_string(ctx, KEY_DEVNULL, hi->devnull);
+        if (hi->devnull_id)
+            saxdb_write_int(ctx, KEY_DEVNULL, hi->devnull_id);
         if (hi->website)
             saxdb_write_string(ctx, KEY_WEBSITE, hi->website);
         if (hi->last_quit_host[0])
@@ -3730,9 +3725,10 @@ struct nickserv_discrim {
     const char *fakehostmask;
     const char *fakeidentmask;
     const char *website;
-    const char *devnullclass;
     const char *handlemask;
     const char *emailmask;
+    const char *devnull_name;
+    unsigned int devnull_id;
 };
 
 typedef void (*discrim_search_func)(struct userNode *source, struct handle_info *hi, struct nickserv_discrim *discrim);
@@ -3878,9 +3874,16 @@ nickserv_discrim_create(struct userNode *user, unsigned int argc, char *argv[])
             }
         } else if (!irccasecmp(argv[i], "devnull")) {
             if (!irccasecmp(argv[++i], "*")) {
-                discrim->devnullclass = 0;
+                discrim->devnull_id = 0;
+                discrim->devnull_name = 0;
             } else {
-                discrim->devnullclass = argv[i];
+                struct devnull_class *th = devnull_find_name(argv[i]);
+                if(!th) {
+                    send_message(user, nickserv, "OSMSG_DEVNULL_NOTFOUND", argv[i]);
+                    goto fail;
+                }
+                discrim->devnull_name = argv[i];
+                discrim->devnull_id = th->id;
             }
         } else if (!irccasecmp(argv[i], "handlemask") || !irccasecmp(argv[i], "accountmask")) {
             if (!irccasecmp(argv[++i], "*")) {
@@ -3959,7 +3962,7 @@ nickserv_discrim_match(struct nickserv_discrim *discrim, struct handle_info *hi)
         || (discrim->fakehostmask && (!hi->fakehost || !match_ircglob(hi->fakehost, discrim->fakehostmask)))
         || (discrim->fakeidentmask && (!hi->fakeident || !match_ircglob(hi->fakeident, discrim->fakeidentmask)))
         || (discrim->website && (!hi->website || !match_ircglob(hi->website, discrim->website)))
-        || (discrim->devnullclass && (!hi->devnull || !match_ircglob(hi->devnull, discrim->devnullclass)))
+        || (discrim->devnull_id && discrim->devnull_id != hi->devnull_id)
         || (discrim->emailmask && (!hi->email_addr || !match_ircglob(hi->email_addr, discrim->emailmask)))
         || (discrim->min_level > hi->opserv_level)
         || (discrim->max_level < hi->opserv_level)
@@ -4043,9 +4046,14 @@ search_print_func(struct userNode *source, struct handle_info *match, struct nic
                 discrim->output_table->contents[discrim->output_table_pos][i++] = (match->fakehost ? match->fakehost : "*");
             if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_WEBSITE)
                 discrim->output_table->contents[discrim->output_table_pos][i++] = (match->website ? match->website : "*");
-            if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_DEVNULL)
-                discrim->output_table->contents[discrim->output_table_pos][i++] = (match->devnull ? match->devnull : "*");
-            
+            if(discrim->show_fields & NICKSERV_DISCRIM_FIELDS_DEVNULL) {
+                if(discrim->devnull_name) 
+                    discrim->output_table->contents[discrim->output_table_pos][i++] = discrim->devnull_name;
+                else {
+                    struct devnull_class *devnull = devnull_find_id(match->devnull_id);
+                    discrim->output_table->contents[discrim->output_table_pos][i++] = (devnull ? devnull->name : "*");
+                }
+            }
         }
     } else
         send_message(source, nickserv, "NSMSG_SEARCH_MATCH", match->handle);
@@ -4330,8 +4338,7 @@ nickserv_db_read_handle(const char *handle, dict_t obj)
     if (str)
         hi->website = strdup(str);
     str = database_get_data(obj, KEY_DEVNULL, RECDB_QSTRING);
-    if (str)
-        hi->devnull = strdup(str);
+    hi->devnull_id = str ? strtoul(str, NULL, 0) : 0;
     str = database_get_data(obj, KEY_REGISTER_ON, RECDB_QSTRING);
     hi->registered = str ? strtoul(str, NULL, 0) : now;
     str = database_get_data(obj, KEY_LAST_SEEN, RECDB_QSTRING);
index 322170e2825422abdfb1b805b17a7df2a0548c67..a37195fe2e27d40b5fdeba55bc2ca6de74ce62bc 100644 (file)
@@ -109,13 +109,13 @@ struct handle_info {
     struct language *language;
     struct authlogEntry *authlog;
     char *website;
-    char *devnull;
     char *email_addr;
     char *epithet;
     char *infoline;
     char *handle;
     char *fakehost;
     char *fakeident;
+    unsigned int devnull_id;
     unsigned long id;
     unsigned long registered;
     unsigned long lastseen;
@@ -158,8 +158,7 @@ int staff_has_access(struct userNode *user, struct userNode *bot, unsigned int m
 void nickserv_show_oper_accounts(struct userNode *user, struct svccmd *cmd);
 struct handle_info *checklogin(const char *user, const char *pass, const char *numeric, const char *hostmask, const char *ipmask);
 char *getfakehost(const char *user);
-void nickserv_devnull_delete(char *name);
-void nickserv_devnull_rename(char *oldname, char *newname);
+void nickserv_devnull_delete(unsigned int devnull_id);
 char *generate_fakehost(struct handle_info *handle);
 char *generate_fakeident(struct handle_info *handle, struct userNode *user);
 void apply_fakehost(struct handle_info *handle, struct userNode *user);
index 83eb31080107824144522160212037d488456ea6..6c6ac33d6046cde0ca855c06e5836219779454a5 100644 (file)
@@ -79,6 +79,8 @@
 #define KEY_ISSUER "issuer"
 #define KEY_ISSUED "issued"
 #define KEY_DEVNULL_CLASSES "classes"
+#define KEY_DEVNULL_LASTID "devnull_id"
+#define KEY_DEVNULL_ID "id"
 #define KEY_DEVNULL_NAME "class"
 #define KEY_DEVNULL_MODE "modes"
 #define KEY_DEVNULL_MAXCHAN "chanlimit"
@@ -329,6 +331,9 @@ static unsigned int new_user_flood;
 const char *devnull_modes = DEVNULL_MODES;
 static char *level_strings[1001];
 static char devnull_inverse_modes[256];
+unsigned int devnull_last_id = 1;
+
+void *devnull_check_priv_func = NULL;
 
 static struct {
     struct chanNode *debug_channel;
@@ -435,13 +440,13 @@ opserv_free_user_alert(void *data)
 }
 
 #if defined(GCC_VARMACROS)
-# define opserv_debug(ARGS...) do { if (opserv_conf.debug_channel) send_channel_notice(opserv_conf.debug_channel, opserv, ARGS); } while (0)
-# define opserv_alert(ARGS...) do { if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, ARGS); } while (0)
-# define opserv_custom_alert(CHAN, ARGS...) do { if (CHAN) send_target_message(4, (CHAN), opserv, ARGS); else if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, ARGS); } while (0)
+# define opserv_debug(ARGS...) do { if (opserv_conf.debug_channel) send_channel_message(opserv_conf.debug_channel, opserv, ARGS); } while (0)
+# define opserv_alert(ARGS...) do { if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, ARGS); } while (0)
+# define opserv_custom_alert(CHAN, ARGS...) do { if (CHAN) send_target_message(5, (CHAN), opserv, ARGS); else if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, ARGS); } while (0)
 #elif defined(C99_VARMACROS)
-# define opserv_debug(...) do { if (opserv_conf.debug_channel) send_channel_notice(opserv_conf.debug_channel, opserv, __VA_ARGS__); } while (0)
-# define opserv_alert(...) do { if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0)
-# define opserv_custom_alert(chan, ...) do { if (chan) send_target_message(4, chan, opserv, __VA_ARGS__); else if (opserv_conf.alert_channel) send_channel_notice(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0)
+# define opserv_debug(...) do { if (opserv_conf.debug_channel) send_channel_message(opserv_conf.debug_channel, opserv, __VA_ARGS__); } while (0)
+# define opserv_alert(...) do { if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0)
+# define opserv_custom_alert(chan, ...) do { if (chan) send_target_message(5, chan, opserv, __VA_ARGS__); else if (opserv_conf.alert_channel) send_channel_message(opserv_conf.alert_channel, opserv, __VA_ARGS__); } while (0)
 #endif
 
 /* A lot of these commands are very similar to what ChanServ can do,
@@ -2814,12 +2819,16 @@ trusted_host_read(const char *host, void *data, UNUSED_ARG(void *extra))
 }
 
 static void
-opserv_add_devnull_class(const char *name, unsigned long modes, unsigned long maxchan, unsigned long maxsendq)
+opserv_add_devnull_class(const char *name, unsigned int id, unsigned long modes, unsigned long maxchan, unsigned long maxsendq)
 {
     struct devnull_class *th;
     th = calloc(1, sizeof(*th));
     if (!th)
         return;
+    if(id)
+        th->id = id;
+    else
+        th->id = (++devnull_last_id);
     th->name = strdup(name);
     th->modes = modes;
     th->maxchan = maxchan;
@@ -2839,14 +2848,18 @@ static int
 devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra))
 {
     struct record_data *rd = data;
-    const char *nameb = name, *str;
+    const char *str;
     unsigned long modes, maxchan, maxsendq;
-    unsigned int ii;
+    unsigned int id, ii;
 
     if (rd->type == RECDB_OBJECT) {
         dict_t obj = GET_RECORD_OBJECT(rd);
         /* new style structure */
-        nameb = database_get_data(obj, KEY_DEVNULL_NAME, RECDB_QSTRING);
+        str = database_get_data(obj, KEY_DEVNULL_ID, RECDB_QSTRING);
+        if(str)
+            id = atoi(str);
+        else
+            id = 0;
         str = database_get_data(obj, KEY_DEVNULL_MODE, RECDB_QSTRING);
         modes = 0;
         if (str) {
@@ -2860,7 +2873,7 @@ devnull_class_read(const char *name, void *data, UNUSED_ARG(void *extra))
     } else
         return 0;
 
-    opserv_add_devnull_class(nameb, modes, maxchan, maxsendq);
+    opserv_add_devnull_class(name, id, modes, maxchan, maxsendq);
     return 0;
 }
 
@@ -2871,6 +2884,7 @@ opserv_saxdb_read(struct dict *conf_db)
     struct record_data *rd;
     dict_iterator_t it;
     unsigned int nn;
+    char *str;
 
     if ((object = database_get_data(conf_db, KEY_RESERVES, RECDB_OBJECT)))
         dict_foreach(object, add_reserved, opserv_reserved_nick_dict);
@@ -2900,12 +2914,13 @@ opserv_saxdb_read(struct dict *conf_db)
             dict_insert(opserv_exempt_channels, strdup(rd->d.slist->list[nn]), NULL);
     }
     if ((object = database_get_data(conf_db, KEY_MAX_CLIENTS, RECDB_OBJECT))) {
-        char *str;
         if ((str = database_get_data(object, KEY_MAX, RECDB_QSTRING)))
             max_clients = atoi(str);
         if ((str = database_get_data(object, KEY_TIME, RECDB_QSTRING)))
             max_clients_time = atoi(str);
     }
+    if ((str = database_get_data(object, KEY_DEVNULL_LASTID, RECDB_QSTRING)))
+        devnull_last_id = atoi(str);
     if ((object = database_get_data(conf_db, KEY_TRUSTED_HOSTS, RECDB_OBJECT)))
         dict_foreach(object, trusted_host_read, opserv_trusted_hosts);
     if ((object = database_get_data(conf_db, KEY_DEVNULL_CLASSES, RECDB_OBJECT)))
@@ -2972,8 +2987,8 @@ opserv_saxdb_write(struct saxdb_context *ctx)
         saxdb_start_record(ctx, KEY_DEVNULL_CLASSES, 1);
         for (it = dict_first(opserv_devnull_classes); it; it = iter_next(it)) {
             struct devnull_class *th = iter_data(it);
-            saxdb_start_record(ctx, iter_key(it), 0);
-            if (th->name) saxdb_write_string(ctx, KEY_DEVNULL_NAME, th->name);
+            saxdb_start_record(ctx, th->name, 0);
+            saxdb_write_int(ctx, KEY_DEVNULL_ID, th->id);
             if (th->modes) {
                 int ii, flen;
                 char flags[50];
@@ -2989,6 +3004,7 @@ opserv_saxdb_write(struct saxdb_context *ctx)
         }
         saxdb_end_record(ctx);
     }
+    saxdb_write_int(ctx, KEY_DEVNULL_LASTID, devnull_last_id);
     /* gags */
     if (gagList) {
         struct gag_entry *gag;
@@ -4296,8 +4312,7 @@ static MODCMD_FUNC(cmd_listdevnull)
     tbl.contents[0][12] = "+X";
     tbl.contents[0][13] = "MaxQ";
     tbl.contents[0][14] = "OpMe";
-    if(!count)
-    {
+    if(!count) {
         table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
         reply("MSG_NONE");
         free(tbl.contents[0]);
@@ -4308,82 +4323,84 @@ static MODCMD_FUNC(cmd_listdevnull)
         struct devnull_class *th = iter_data(it);
         tbl.contents[++ii] = malloc(tbl.width * sizeof(tbl.contents[0][0]));
         tbl.contents[ii][0] = th->name;
-        if(DEVNULL_FLAGGED(th, MODE_A)) {
+        if(DEVNULL_HAS_PRIV(th, CHANLIMIT)) {
             tbl.contents[ii][1] = strtab(th->maxchan);
         } else {
             tbl.contents[ii][1] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_B)) {
+        if(DEVNULL_HAS_PRIV(th, UNLIMITTARGET)) {
             tbl.contents[ii][2] = on;
         } else {
             tbl.contents[ii][2] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_D)) {
+        if(DEVNULL_HAS_PRIV(th, NOFLOOD)) {
             tbl.contents[ii][3] = on;
-        } else if(DEVNULL_FLAGGED(th, MODE_C)) {
+        } else if(DEVNULL_HAS_PRIV(th, HALFFLOOD)) {
             tbl.contents[ii][3] = half;
         } else {
             tbl.contents[ii][3] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_E)) {
+        if(DEVNULL_HAS_PRIV(th, CHANHIDE)) {
             tbl.contents[ii][4] = on;
         } else {
             tbl.contents[ii][4] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_F)) {
+        if(DEVNULL_HAS_PRIV(th, IDLEHIDE)) {
             tbl.contents[ii][5] = on;
         } else {
             tbl.contents[ii][5] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_J)) {
+        if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
             tbl.contents[ii][6] = on;
         } else {
             tbl.contents[ii][6] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_K)) {
+        if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
             tbl.contents[ii][7] = on;
         } else {
             tbl.contents[ii][7] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_L)) {
+        if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
             tbl.contents[ii][8] = on;
         } else {
             tbl.contents[ii][8] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_M)) {
+        if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
             tbl.contents[ii][9] = on;
         } else {
             tbl.contents[ii][9] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_G)) {
+        if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
             tbl.contents[ii][10] = on;
         } else {
             tbl.contents[ii][10] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_I)) {
+        if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
             tbl.contents[ii][11] = on;
         } else {
             tbl.contents[ii][11] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_H)) {
+        if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
             tbl.contents[ii][12] = on;
         } else {
             tbl.contents[ii][12] = off;
         }
-        if(DEVNULL_FLAGGED(th, MODE_N)) {
-            tbl.contents[ii][13] = on;
+        if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) {
+            char maxsenqbuf[MAXLEN];
+            sprintf(maxsenqbuf, "%lu", th->maxsendq);
+            tbl.contents[ii][13] = strdup(maxsenqbuf);
         } else {
-            tbl.contents[ii][13] = off;
+            tbl.contents[ii][13] = strdup(off);
         }
-        if(DEVNULL_FLAGGED(th, MODE_OPME)) {
+        if(DEVNULL_HAS_PRIV(th, OPME)) {
             tbl.contents[ii][14] = on;
         } else {
             tbl.contents[ii][14] = off;
         }
     }
     table_send(cmd->parent->bot, user->nick, 0, NULL, tbl);
-    for(ii = 1; ii < tbl.length; ++ii)
-    {
+    for(ii = 1; ii < tbl.length; ++ii) {
+        free(tbl.contents[ii][13]);
         free(tbl.contents[ii]);
     }
     free(tbl.contents[0]);
@@ -4428,7 +4445,7 @@ static MODCMD_FUNC(cmd_adddevnull)
         return 0;
     }
     
-    opserv_add_devnull_class(argv[1], 0, 0, 0);
+    opserv_add_devnull_class(argv[1], (++devnull_last_id), 0, 0, 0);
     reply("OSMSG_DEVNULL_ADDED",argv[1]);
     return 1;
 }
@@ -4442,7 +4459,7 @@ static MODCMD_FUNC(cmd_deldevnull)
         struct devnull_class *th = dict_find(opserv_devnull_classes, argv[n], NULL);
         if (!th)
             continue;
-        nickserv_devnull_delete(th->name);
+        nickserv_devnull_delete(th->id);
         dict_remove(opserv_devnull_classes, argv[n]);
         reply("OSMSG_DEVNULL_REMOVED",argv[n]);
     }
@@ -4457,8 +4474,7 @@ static MODCMD_FUNC(cmd_renamedevnull)
         return 0;
     }
     if ((th = dict_find(opserv_devnull_classes, argv[1], NULL))) {
-        opserv_add_devnull_class(argv[2], th->modes, th->maxchan, th->maxsendq);
-        nickserv_devnull_rename(th->name,argv[2]);
+        opserv_add_devnull_class(argv[2], th->id, th->modes, th->maxchan, th->maxsendq);
         dict_remove(opserv_devnull_classes, argv[1]);
         reply("OSMSG_DEVNULL_RENAMED",argv[1],argv[2]);
     } else {
@@ -4479,236 +4495,225 @@ static MODCMD_FUNC(cmd_setdevnull)
                 argv[offset+2][ ii ] = toupper( argv[offset+2][ ii ] );
             for( ii = 0; argv[offset+3][ ii ]; ii++)
                 argv[offset+3][ ii ] = toupper( argv[offset+3][ ii ] );
+            
             if(!strcmp("CHANLIMIT",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_A);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  DEVNULL_SET_FLAG(th, MODE_A);
-                  th->maxchan = strtoul(argv[offset+3], NULL, 0);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 }
-            }
-            else if(!strcmp("UNLIMITTARGET",argv[offset+2]) || !strcmp("UNLIMITEDTARGET",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_B);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_B);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("FLOOD",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_C);
-                  DEVNULL_CLEAR_FLAG(th, MODE_D);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_D);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("HALF",argv[offset+3]) || !strcmp("2",argv[offset+3]) || !strcmp("1/2",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_C);
-                  DEVNULL_CLEAR_FLAG(th, MODE_D);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("CHANHIDE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_E);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_E);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("IDLEHIDE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_F);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_F);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("CHSERVMODE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_G);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_G);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("XTRAOPMODE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_H);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_H);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("NETSERVMODE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_I);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_I);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("SEEIDLE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_J);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_J);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("FORCEIDLEHIDE",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_K);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_K);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("OVERRIDECC",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_L);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_L);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("OVERRIDENOAMSG",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_M);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_M);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
-            }
-            else if(!strcmp("MAXSENDQ",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_N);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  DEVNULL_SET_FLAG(th, MODE_N);
-                  th->maxsendq = strtoul(argv[offset+3], NULL, 0);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 }
+                if (!strcmp("OFF",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, CHANLIMIT);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    DEVNULL_SET_PRIV(th, CHANLIMIT);
+                    th->maxchan = strtoul(argv[offset+3], NULL, 0);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                }
+            } else if(!strcmp("UNLIMITTARGET",argv[offset+2]) || !strcmp("UNLIMITEDTARGET",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, UNLIMITTARGET);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, UNLIMITTARGET);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("FLOOD",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, HALFFLOOD);
+                    DEVNULL_CLEAR_PRIV(th, NOFLOOD);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, NOFLOOD);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("HALF",argv[offset+3]) || !strcmp("2",argv[offset+3]) || !strcmp("1/2",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, HALFFLOOD);
+                    DEVNULL_CLEAR_PRIV(th, NOFLOOD);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("CHANHIDE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, CHANHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, CHANHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("IDLEHIDE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, IDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, IDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("CHSERVMODE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, CHSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, CHSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("XTRAOPMODE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, XTRAOPMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, XTRAOPMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("NETSERVMODE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, NETSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, NETSERVMODE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("SEEIDLE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, SEEIDLE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, SEEIDLE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("FORCEIDLEHIDE",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, FORCEIDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, FORCEIDLEHIDE);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("OVERRIDECC",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, OVERRIDECC);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, OVERRIDECC);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("OVERRIDENOAMSG",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, OVERRIDENOAMSG);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, OVERRIDENOAMSG);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
+            } else if(!strcmp("MAXSENDQ",argv[offset+2])) {
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, MAXSENDQ);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    DEVNULL_SET_PRIV(th, MAXSENDQ);
+                    th->maxsendq = strtoul(argv[offset+3], NULL, 0);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                }
             } 
             else if(!strcmp("OPME",argv[offset+2])) {
-                 if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
-                  DEVNULL_CLEAR_FLAG(th, MODE_OPME);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
-                  DEVNULL_SET_FLAG(th, MODE_OPME);
-                  reply("OSMSG_DEVNULL_SET_DONE");
-                 } else {
-                  reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
-                 }
+                if (!strcmp("OFF",argv[offset+3]) || !strcmp("0",argv[offset+3])) {
+                    DEVNULL_CLEAR_PRIV(th, OPME);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else if (!strcmp("ON",argv[offset+3]) || !strcmp("1",argv[offset+3])) {
+                    DEVNULL_SET_PRIV(th, OPME);
+                    reply("OSMSG_DEVNULL_SET_DONE");
+                } else {
+                    reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+3]);
+                }
             } else {
-                 reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]);
+                reply("OSMSG_DEVNULL_SET_INVALID", argv[offset+2]);
             }
             
         } else {
             reply("OSMSG_DEVNULL_SET", th->name);
-            if(DEVNULL_FLAGGED(th, MODE_A)) {
+            if(DEVNULL_HAS_PRIV(th, CHANLIMIT)) {
                 reply("OSMSG_DEVNULL_SET_A_i", th->maxchan);
             } else {
                 reply("OSMSG_DEVNULL_SET_A", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_B)) {
+            if(DEVNULL_HAS_PRIV(th, UNLIMITTARGET)) {
                 reply("OSMSG_DEVNULL_SET_B", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_B", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_D)) {
+            if(DEVNULL_HAS_PRIV(th, NOFLOOD)) {
                 reply("OSMSG_DEVNULL_SET_C", "on");
-            } else if(DEVNULL_FLAGGED(th, MODE_C)) {
+            } else if(DEVNULL_HAS_PRIV(th, HALFFLOOD)) {
                 reply("OSMSG_DEVNULL_SET_C", "half");
             } else {
                 reply("OSMSG_DEVNULL_SET_C", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_E)) {
+            if(DEVNULL_HAS_PRIV(th, CHANHIDE)) {
                 reply("OSMSG_DEVNULL_SET_E", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_E", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_F)) {
+            if(DEVNULL_HAS_PRIV(th, IDLEHIDE)) {
                 reply("OSMSG_DEVNULL_SET_F", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_F", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_G)) {
+            if(DEVNULL_HAS_PRIV(th, CHSERVMODE)) {
                 reply("OSMSG_DEVNULL_SET_G", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_G", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_H)) {
+            if(DEVNULL_HAS_PRIV(th, XTRAOPMODE)) {
                 reply("OSMSG_DEVNULL_SET_H", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_H", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_I)) {
+            if(DEVNULL_HAS_PRIV(th, NETSERVMODE)) {
                 reply("OSMSG_DEVNULL_SET_I", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_I", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_J)) {
+            if(DEVNULL_HAS_PRIV(th, SEEIDLE)) {
                 reply("OSMSG_DEVNULL_SET_J", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_J", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_K)) {
+            if(DEVNULL_HAS_PRIV(th, FORCEIDLEHIDE)) {
                 reply("OSMSG_DEVNULL_SET_K", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_K", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_L)) {
+            if(DEVNULL_HAS_PRIV(th, OVERRIDECC)) {
                 reply("OSMSG_DEVNULL_SET_L", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_L", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_M)) {
+            if(DEVNULL_HAS_PRIV(th, OVERRIDENOAMSG)) {
                 reply("OSMSG_DEVNULL_SET_M", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_M", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_N)) {
+            if(DEVNULL_HAS_PRIV(th, MAXSENDQ)) {
                 reply("OSMSG_DEVNULL_SET_N_i", th->maxsendq);
             } else {
                 reply("OSMSG_DEVNULL_SET_N", "off");
             }
-            if(DEVNULL_FLAGGED(th, MODE_OPME)) {
+            if(DEVNULL_HAS_PRIV(th, OPME)) {
                 reply("OSMSG_DEVNULL_SET_OPME", "on");
             } else {
                 reply("OSMSG_DEVNULL_SET_OPME", "off");
@@ -4721,16 +4726,66 @@ static MODCMD_FUNC(cmd_setdevnull)
     return 1;
 }
 
-int devnull_check(const char *name) { 
-    if (dict_find(opserv_devnull_classes, name, NULL)) {
-        return 1;
+struct devnull_class *devnull_find_id(unsigned int id) {
+    dict_iterator_t it;
+    for (it = dict_first(opserv_devnull_classes); it; it = iter_next(it)) {
+        struct devnull_class *th = iter_data(it);
+        if(th->id == id)
+            return th;
     }
-    return 0;
+    return NULL;
 }
 
-struct devnull_class* 
-    devnull_get(const char *name) {
-    return dict_find(opserv_devnull_classes, name, NULL);
+struct devnull_class *devnull_find_name(const char *name) {
+    struct devnull_class *th;
+    if ((th = dict_find(opserv_devnull_classes, name, NULL))) {
+        return th;
+    }
+    return NULL;
+}
+
+int devnull_user_has_priv(struct handle_info *hi, int devnull_priv) {
+    if(devnull_check_priv_func) {
+        struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi);
+        if((ext_class.modes & devnull_priv))
+            return (ext_class.modes & devnull_priv);
+    }
+    
+    if(!hi->devnull_id)
+        return 0;
+    struct devnull_class *th = devnull_find_id(hi->devnull_id);
+    if(!th)
+        return 0;
+    return (th->modes & devnull_priv);
+}
+
+struct devnull_class devnull_user_get_class(struct handle_info *hi) {
+    struct devnull_class th;
+    memset(&th, 0, sizeof(th));
+    
+    if(devnull_check_priv_func) {
+        struct devnull_class ext_class = ((struct devnull_class (*)(struct handle_info *))devnull_check_priv_func)(hi);
+        th.modes |= ext_class.modes;
+        if(ext_class.name)
+            th.name = ext_class.name;
+        if(DEVNULL_HAS_PRIV(&th, CHANLIMIT))
+            th.maxchan = ext_class.maxchan;
+        if(DEVNULL_HAS_PRIV(&th, MAXSENDQ))
+            th.maxsendq = ext_class.maxsendq;
+    }
+    
+    if(hi->devnull_id) {
+        struct devnull_class *thp;
+        if((thp = devnull_find_id(hi->devnull_id))) {
+            if(DEVNULL_HAS_PRIV(thp, CHANLIMIT) && (!DEVNULL_HAS_PRIV(&th, CHANLIMIT) || th.maxchan < thp->maxchan))
+                th.maxchan = thp->maxchan;
+            if(DEVNULL_HAS_PRIV(thp, MAXSENDQ) && (!DEVNULL_HAS_PRIV(&th, MAXSENDQ) || th.maxsendq < thp->maxsendq))
+                th.maxsendq = thp->maxsendq;
+            th.modes |= thp->maxsendq;
+            th.name = thp->name;
+        }
+    }
+    return th;
 }
 
 void operpart(struct chanNode *chan, struct userNode *user)
index 92b35ecf0d4c4a644153cf2768f7172689e1efe6..169f43218b4df1ad1e34265c3bf2e135d72ee0ac 100644 (file)
 #ifndef _opserv_h
 #define _opserv_h
 
-/* DEVNULL_MODE_* go into devnull_class.modes */
-#define DEVNULL_MODE_A 0x00000001
-#define DEVNULL_MODE_B 0x00000002
-#define DEVNULL_MODE_C 0x00000004
-#define DEVNULL_MODE_D 0x00000008
-#define DEVNULL_MODE_E 0x00000010
-#define DEVNULL_MODE_F 0x00000020
-#define DEVNULL_MODE_G 0x00000040
-#define DEVNULL_MODE_H 0x00000080
-#define DEVNULL_MODE_I 0x00000100
-#define DEVNULL_MODE_J 0x00000200
-#define DEVNULL_MODE_K 0x00000400
-#define DEVNULL_MODE_L 0x00000800
-#define DEVNULL_MODE_M 0x00001000
-#define DEVNULL_MODE_N 0x00002000
-#define DEVNULL_MODE_OPME 0x00004000
+/* DEVNULL_PRIV_* go into devnull_class.modes */
+#define DEVNULL_PRIV_CHANLIMIT      0x0001
+#define DEVNULL_PRIV_UNLIMITTARGET  0x0002
+#define DEVNULL_PRIV_HALFFLOOD      0x0004
+#define DEVNULL_PRIV_NOFLOOD        0x0008
+#define DEVNULL_PRIV_CHANHIDE       0x0010
+#define DEVNULL_PRIV_IDLEHIDE       0x0020
+#define DEVNULL_PRIV_CHSERVMODE     0x0040
+#define DEVNULL_PRIV_XTRAOPMODE     0x0080
+#define DEVNULL_PRIV_NETSERVMODE    0x0100
+#define DEVNULL_PRIV_SEEIDLE        0x0200
+#define DEVNULL_PRIV_FORCEIDLEHIDE  0x0400
+#define DEVNULL_PRIV_OVERRIDECC     0x0800
+#define DEVNULL_PRIV_OVERRIDENOAMSG 0x1000
+#define DEVNULL_PRIV_MAXSENDQ       0x2000
+#define DEVNULL_PRIV_OPME           0x4000
 
-#define DEVNULL_MODES "abcdefghijklmno"
+#define DEVNULL_MODES               "abcdefghijklmno"
 
-#define DEVNULL_FLAGGED(hi, tok) ((hi)->modes & DEVNULL_##tok)
-#define DEVNULL_SET_FLAG(hi, tok) ((hi)->modes |= DEVNULL_##tok)
-#define DEVNULL_CLEAR_FLAG(hi, tok) ((hi)->modes &= ~DEVNULL_##tok)
+#define DEVNULL_HAS_PRIV(cl, tok) ((cl)->modes & DEVNULL_PRIV_##tok)
+#define DEVNULL_SET_PRIV(cl, tok) ((cl)->modes |= DEVNULL_PRIV_##tok)
+#define DEVNULL_CLEAR_PRIV(cl, tok) ((cl)->modes &= ~DEVNULL_PRIV_##tok)
 
 struct devnull_class {
+    unsigned int id;
     char *name;
     unsigned long modes;
     unsigned long maxchan;
     unsigned long maxsendq;
 };
 
+extern void *devnull_check_priv_func;
+
 void init_opserv(const char *nick);
 unsigned int gag_create(const char *mask, const char *owner, const char *reason, unsigned long expires);
 int opserv_bad_channel(const char *name);
-void devnull_delete(const char *auth);
-void devnull_rename(const char *oldauth, const char *newauth);
-int devnull_check(const char *name);
-struct devnull_class* devnull_get(const char *name);
+int devnull_user_has_priv(struct handle_info *hi, int devnull_priv);
+struct devnull_class devnull_user_get_class(struct handle_info *hi);
+struct devnull_class *devnull_find_id(unsigned int id);
+struct devnull_class *devnull_find_name(const char *name);
 struct userNode* GetOpServ(void);
 void operpart(struct chanNode *chan, struct userNode *user);
 void operadd(struct userNode *user);
index dc0829d07e9ca6dc8776bf924441e38e0c979fed..91247e251606f974d96be9bbb3755d4de2ed645b 100644 (file)
@@ -1786,41 +1786,41 @@ static CMD_FUNC(cmd_relay)
         //ok  someone relayed something to us!
         if(strcmp("LQ", argv[2]) == 0) {
             //oooh thats exciting - we've got a LOC Query! :D
-            //LQ !ABADE pk910 80.153.5.212 server.zoelle1.de ~watchcat :test
             //ok  let's check the login datas
             struct handle_info *hi;
             char tmp[MAXLEN], tmp2[MAXLEN];
             sprintf(tmp, "%s@%s",argv[7],argv[6]);
             sprintf(tmp2, "%s@%s",argv[7],argv[5]);
             if((hi = checklogin(argv[4],argv[argc-1],&argv[3][1],tmp,tmp2))) {
-             //login ok
-             struct devnull_class *th;
-             char devnull[512];
-             if(hi->devnull && (th = devnull_get(hi->devnull))) {
-                const char *devnull_modes = DEVNULL_MODES;
-                int ii, flen;
-                char flags[50];
-                for (ii=flen=0; devnull_modes[ii]; ++ii)
-                    if (th->modes & (1 << ii))
-                        flags[flen++] = devnull_modes[ii];
-                flags[flen] = 0;
-                sprintf(devnull, "+%s %s %lu %lu",flags,th->name,th->maxchan,th->maxsendq);
-             } else {
-                devnull[0] = 0;
-             }
-             if(!HANDLE_FLAGGED(hi, AUTOHIDE)) {
-                sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull);
-             } else if(getfakehost(argv[4])) {
-                sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull);
-             } else {
-                extern const char *hidden_host_suffix;
-                sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull);
-             }
-             irc_relay(tmp);
+                //login ok
+                struct devnull_class th = devnull_user_get_class(hi);
+                char devnull[MAXLEN];
+                
+                if(th.modes) {
+                    const char *devnull_modes = DEVNULL_MODES;
+                    int ii, flen = 0;
+                    char flags[50];
+                    for (ii = 0; devnull_modes[ii]; ++ii)
+                        if(th.modes & (1 << ii))
+                            flags[flen++] = devnull_modes[ii];
+                    flags[flen] = 0;
+                    sprintf(devnull, "+%s %s %lu %lu", flags, (th.name ? th.name : "custom"), (DEVNULL_HAS_PRIV(&th, CHANLIMIT) ? th.maxchan : 0), (DEVNULL_HAS_PRIV(&th, MAXSENDQ) ? th.maxsendq : 0));
+                } else
+                    devnull[0] = 0;
+                
+                if(!HANDLE_FLAGGED(hi, AUTOHIDE))
+                    sprintf(tmp,"%s LA %s 0 %s\n",argv[3],hi->handle,devnull);
+                else if(getfakehost(argv[4]))
+                    sprintf(tmp,"%s LA %s %s %s\n",argv[3],hi->handle,getfakehost(argv[4]),devnull);
+                else {
+                    extern const char *hidden_host_suffix;
+                    sprintf(tmp,"%s LA %s %s.%s %s\n",argv[3],hi->handle,hi->handle,hidden_host_suffix,devnull);
+                }
+                irc_relay(tmp);
             } else {
-             //login rejected
-             sprintf(tmp,"%s LR\n",argv[3]);
-             irc_relay(tmp);
+                //login rejected
+                sprintf(tmp,"%s LR\n",argv[3]);
+                irc_relay(tmp);
             }
         } else if(strcmp("UC", argv[2]) == 0) {
             char tmp[MAXLEN];
index c6d73cd2ad21ed2a0c6409f084897300c87d423c..178818395a46ae011fcb9b0c48aac44e4080ce40 100644 (file)
@@ -307,7 +307,8 @@ spamserv_cs_move_merge(struct userNode *user, struct chanNode *channel, struct c
                else
                        snprintf(reason, sizeof(reason), "$X (channel %s) merged into %s by %s.", channel->name, target->name, user->handle_info->handle);
 
-               global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);
+               /*global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, reason);*/
+               spamserv_oper_message("%s", reason);
                return 1;
        }
 
@@ -343,7 +344,7 @@ spamserv_cs_unregister(struct userNode *user, struct chanNode *channel, enum cs_
                        spamserv_part_channel(channel, partmsg);
                
                spamserv_unregister_channel(cInfo);
-               global_message(MESSAGE_RECIPIENT_OPERS | MESSAGE_RECIPIENT_HELPERS, global);
+               spamserv_oper_message(SSMSG_CHANNEL_UNREGISTERED, spamserv->nick, channel->name, user->handle_info->handle);
        }
 }
 
@@ -593,7 +594,11 @@ spamserv_user_join(struct modeNode *mNode)
 
        if(user->uplink->burst || !(cInfo = get_chanInfo(channel->name)) || !CHECK_JOINFLOOD(cInfo) || !(uInfo = get_userInfo(user->nick)))
                return 0;
-        
+
+       if(IsOper(user))
+       {
+               return;
+       }
         
     if(!CHECK_CHANOPS(cInfo))
        {
@@ -1098,7 +1103,6 @@ static
 SPAMSERV_FUNC(cmd_register)
 {
        struct chanInfo *cInfo;
-       char reason[MAXLEN];
 
        if(!channel || !channel->channel_info)
        {
@@ -1946,6 +1950,11 @@ spamserv_channel_message(struct chanNode *channel, struct userNode *user, char *
        if(!spamserv || quit_services || !GetUserMode(channel, spamserv) || !(cInfo = get_chanInfo(channel->name)) || !(uInfo = get_userInfo(user->nick)))
                return;
 
+       if(IsOper(user))
+       {
+               return;
+       }
+
        if(!CHECK_CHANOPS(cInfo))
        {
                struct modeNode *mn = GetUserMode(channel, user);