don't hide protected channels from Network Helpers in cmd_myaccess
[srvx.git] / src / mod-watchdog.c
index c1143662295e7f8bb2603dc912d81ff601ee9e61..4f8f27b04a3182c3e6997504dd7a319e821271a7 100644 (file)
@@ -37,6 +37,7 @@
 #include "modcmd.h"
 #include "saxdb.h"
 #include "timeq.h"
+#include "gline.h"
 
 #define KEY_BADWORDS "badwords"
 #define KEY_BADWORD_MASK "mask"
@@ -341,6 +342,7 @@ watchdog_detected_badword(struct userNode *user, struct chanNode *chan, struct b
 {
     char *hostmask;
     char *reason = watchdog_conf.punishment_reason;
+    char mask[IRC_NTOP_MAX_SIZE+3] = { '*', '@', '\0' };
     switch(badword->action) {
         case BADACTION_BAN:
             hostmask = generate_hostmask(user, GENMASK_STRICT_HOST | GENMASK_ANY_IDENT);
@@ -349,6 +351,7 @@ watchdog_detected_badword(struct userNode *user, struct chanNode *chan, struct b
                 //registered channel
                 add_channel_ban(chan->channel_info, hostmask, watchdog->nick, now, now, now + watchdog_conf.ban_duration, reason);
             }
+            struct mod_chanmode change;
             mod_chanmode_init(&change);
             change.argc = 1;
             change.args[0].mode = MODE_BAN;
@@ -357,20 +360,20 @@ watchdog_detected_badword(struct userNode *user, struct chanNode *chan, struct b
             free(hostmask);
             
         case BADACTION_KICK:
-            KickChannelUser(user, chan, watchdog, reason);     
+            if(GetUserMode(chan, user))
+                KickChannelUser(user, chan, watchdog, reason); 
             break;
         case BADACTION_KILL:
             DelUser(user, watchdog, 1, reason);
             break;
         case BADACTION_GLINE:
-            int size = strlen(user->hostname) + 3;
-            hostmask = alloca(size);
-            snprintf(hostmask, size, "*@%s", user->hostname);
-            gline_add(watchdog->nick, hostmask, watchdog_conf.gline_duration, reason, now, now, 0, 1);
+            irc_ntop(mask + 2, sizeof(mask) - 2, &user->ip);
+            gline_add(watchdog->nick, mask, watchdog_conf.gline_duration, reason, now, now, 0, 1);
             break;
         default:
             //error?
-    }
+            break;
+        }
 }
 
 static void
@@ -508,7 +511,7 @@ watchdog_saxdb_read_chanlist(const char *name, void *data, UNUSED_ARG(void *extr
     struct record_data *rd = data;
 
      if (rd->type == RECDB_OBJECT) {
-        dict_t obj = GET_RECORD_OBJECT(rd);
+        //dict_t obj = GET_RECORD_OBJECT(rd);
         /* nothing in here, yet */
 
         add_channel(name);
@@ -536,7 +539,6 @@ watchdog_saxdb_read(struct dict *db)
 static int
 watchdog_saxdb_write(struct saxdb_context *ctx)
 {
-    char str[10];
     dict_iterator_t it;
 
     saxdb_write_int(ctx, KEY_BADWORDID, last_badword_id);
@@ -545,13 +547,15 @@ watchdog_saxdb_write(struct saxdb_context *ctx)
         saxdb_start_record(ctx, KEY_BADWORDS, 1);
         for (it = dict_first(shitlist); it; it = iter_next(it)) {
             struct badword *badword = iter_data(it);
-            saxdb_start_record(ctx, iter_key(it), 0);
-            
-            saxdb_write_string(ctx, KEY_BADWORD_MASK, badword->badword_mask);
-            saxdb_write_int(ctx, KEY_BADWORD_TRIGGERED, badword->triggered);
-            saxdb_write_int(ctx, KEY_BADWORD_ACTION, badword->action);
-            
-            saxdb_end_record(ctx);
+            if(badword && badword->badword_mask) {
+                saxdb_start_record(ctx, iter_key(it), 0);
+                
+                saxdb_write_string(ctx, KEY_BADWORD_MASK, badword->badword_mask);
+                saxdb_write_int(ctx, KEY_BADWORD_TRIGGERED, badword->triggered);
+                saxdb_write_int(ctx, KEY_BADWORD_ACTION, badword->action);
+                
+                saxdb_end_record(ctx);
+            }
         }
         saxdb_end_record(ctx);
     }
@@ -560,9 +564,11 @@ watchdog_saxdb_write(struct saxdb_context *ctx)
         saxdb_start_record(ctx, KEY_CHANNELS, 1);
         for (it = dict_first(chanlist); it; it = iter_next(it)) {
             struct watchdog_channel *wc = iter_data(it);
-            saxdb_start_record(ctx, wc->channel->name, 0);
-            //anything else?
-            saxdb_end_record(ctx);
+            if(wc && wc->channel && wc->channel->name) {
+                saxdb_start_record(ctx, wc->channel->name, 0);
+                //anything else?
+                saxdb_end_record(ctx);
+            }
         }
         saxdb_end_record(ctx);
     }