1
0
Эх сурвалжийг харах

Merge branch 'maint'

* maint:
  * Properly honor exemptions when kicking matched RBL clients
Bryan Drewery 8 жил өмнө
parent
commit
e6c76e48a6
2 өөрчлөгдсөн 21 нэмэгдсэн , 12 устгасан
  1. 1 0
      doc/UPDATES.md
  2. 20 12
      src/mod/irc.mod/chan.cc

+ 1 - 0
doc/UPDATES.md

@@ -15,6 +15,7 @@
   * Fix command executions.
   * Reduce compilation spam.
   * Fix OpenSSL 1.1 build (API) and forward-runtime (ABI) compatibility. (#116)
+  * Properly honor exemptions when kicking matched RBL clients
 
 # 1.4.8
   * Support Debian/Ubuntu's libssl1.0.0[:i386] package.

+ 20 - 12
src/mod/irc.mod/chan.cc

@@ -130,21 +130,29 @@ static void resolve_rbl_callback(int id, void *client_data, const char *host, bd
 
   bd::String reason = "Listed in RBL: " + *(r->server);
 
-  u_addmask('b', chan, s1, conf.bot->nick, reason.c_str(), now + (60 * (chan->ban_time ? chan->ban_time : 300)), 0);
+  if (!(use_exempts && (u_match_mask(global_exempts, s1) || u_match_mask(chan->exempts, s1)))) {
 
-  if (me_op(chan)) {
-    do_mask(chan, chan->channel.ban, s1, 'b');
+    u_addmask('b', chan, s1, conf.bot->nick, reason.c_str(), now + (60 * (chan->ban_time ? chan->ban_time : 300)), 0);
 
-    memberlist *m = NULL;
-    char *pe = NULL;
+    if (me_op(chan)) {
+      do_mask(chan, chan->channel.ban, s1, 'b');
 
-    /* Apply lookup results to all matching members by host */
-    for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
-      if (!m->user && !chan_sentkick(m) && m->userip[0]) {
-        pe = strchr(m->userip, '@');
-        if (pe && !strcmp(pe + 1, r->host)) {
-          m->flags |= SENTKICK;
-          dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, reason.c_str());
+      memberlist *m = NULL;
+      char *pe = NULL;
+
+      /* Apply lookup results to all matching members by host */
+      for (m = chan->channel.member; m && m->nick[0]; m = m->next) {
+        if (!m->user && !chan_sentkick(m) && m->userip[0]) {
+          pe = strchr(m->userip, '@');
+          if (pe && !strcmp(pe + 1, r->host)) {
+            simple_snprintf(s1, sizeof(s1), "%s!%s", m->nick, m->userhost);
+            // Don't kick if exempted
+            if (!(use_exempts && (u_match_mask(global_exempts, s1) || u_match_mask(chan->exempts, s1)) &&
+                                  isexempted(chan, s1))) {
+              m->flags |= SENTKICK;
+              dprintf(DP_MODE, "KICK %s %s :%s%s\n", chan->name, m->nick, bankickprefix, reason.c_str());
+            }
+          }
         }
       }
     }