Explorar el Código

* Port [3373] to 1.2.14
* Fix bot not checking +e/+I modes when opped sometimes.



svn: 3374

Bryan Drewery hace 19 años
padre
commit
d650174fca
Se han modificado 7 ficheros con 37 adiciones y 43 borrados
  1. 1 0
      doc/UPDATES
  2. 3 0
      src/chan.h
  3. 14 5
      src/match.c
  4. 1 0
      src/mod/channels.mod/tclchan.c
  5. 1 1
      src/mod/irc.mod/chan.c
  6. 4 8
      src/mod/irc.mod/irc.c
  7. 13 29
      src/mod/irc.mod/mode.c

+ 1 - 0
doc/UPDATES

@@ -39,6 +39,7 @@ Lines prefixed with '-' were disabled before release and are not finished, or ar
 * chanset flood-join now also counts PARTs as flooding.
 * Fix segfault in cmd_channel during splits.
 * Remove chanflag 'protectops'
+* Fix bot not checking +e/+I modes when opped sometimes.
 
 1.2.13 - http://wraith.shatow.net/milestone/1.2.13
 * Fix cmd_chanset accepting invalid flags

+ 3 - 0
src/chan.h

@@ -96,6 +96,9 @@ struct chan_t {
   time_t parttime;
   time_t no_op;
   time_t drone_jointime;
+  time_t last_eI;      /* this will stop +e and +I from being checked over and over if the bot is stuck in a
+                        * -o+o loop for some reason, hence possibly causing a SENDQ kill
+                        */
   int fighting;
   int drone_set_mode;
   int drone_joins;

+ 14 - 5
src/match.c

@@ -25,6 +25,7 @@
 
 #include "common.h"
 #include "match.h"
+#include "misc.h"
 #include "rfc1459.h"
 #include "socket.h"
 
@@ -227,6 +228,10 @@ comp_with_mask(void *addr, void *dest, unsigned int mask)
 int
 match_cidr(const char *s1, const char *s2)
 {
+  char *len = strrchr(s1, '/');
+  if(len == NULL)
+    return 0;
+
   char *ipmask = strrchr(s1, '@');
   if(ipmask == NULL)
     return 0;
@@ -247,14 +252,14 @@ match_cidr(const char *s1, const char *s2)
 
   *ipmask++ = '\0';
 
-  char *len = strrchr(ipmask, '/');
-  if(len == NULL)
-    return 0;
-
+  len = mask + (len - s1);
   *len++ = '\0';
 
+  if (!str_isdigit(len))
+    return 0;
+
   int cidrlen = atoi(len);
-  if(cidrlen == 0)
+  if(cidrlen <= 0)
     return 0;
 
   *ip++ = '\0';
@@ -279,6 +284,8 @@ match_cidr(const char *s1, const char *s2)
 
 #ifdef USE_IPV6
   if (aftype == AF_INET6) {
+    if (cidrlen > 128) 
+      return 0;
     inet_pton(aftype, ip, &ipaddr.u.ipv6.sin6_addr);
     inet_pton(aftype, ipmask, &maskaddr.u.ipv6.sin6_addr);
     if (comp_with_mask(&ipaddr.u.ipv6.sin6_addr.s6_addr, &maskaddr.u.ipv6.sin6_addr.s6_addr, cidrlen) && 
@@ -286,6 +293,8 @@ match_cidr(const char *s1, const char *s2)
       return ret;
   } else if (aftype == AF_INET) {
 #endif /* USE_IPV6 */
+    if (cidrlen > 32) 
+      return 0;
     inet_pton(aftype, ip, &ipaddr.u.ipv4.sin_addr);
     inet_pton(aftype, ipmask, &maskaddr.u.ipv4.sin_addr);
     if (comp_with_mask(&ipaddr.u.ipv4.sin_addr.s_addr, &maskaddr.u.ipv4.sin_addr.s_addr, cidrlen) && 

+ 1 - 0
src/mod/channels.mod/tclchan.c

@@ -916,6 +916,7 @@ int channel_add(char *result, char *newname, char *options)
     chan->channel.drone_set_mode = 0;
     chan->channel.drone_jointime = 0;
     chan->channel.drone_joins = 0;
+    chan->channel.last_eI = 0;
 
     /* We _only_ put the dname (display name) in here so as not to confuse
      * any code later on. chan->name gets updated with the channel name as

+ 1 - 1
src/mod/irc.mod/chan.c

@@ -1294,7 +1294,7 @@ void recheck_channel(struct chanset_t *chan, int dobans)
 
   /* This is a bad hack for +e/+I */
   if (dobans == 2 && !channel_take(chan) && me_op(chan) && do_eI) {
-    last_eI = now;
+    chan->channel.last_eI = now;
     if (!(chan->ircnet_status & CHAN_ASKED_EXEMPTS) && use_exempts == 1) {
         chan->ircnet_status |= CHAN_ASKED_EXEMPTS;
         dprintf(DP_MODE, "MODE %s +e\n", chan->name);

+ 4 - 8
src/mod/irc.mod/irc.c

@@ -42,10 +42,7 @@
 static cache_t *irccache = NULL;
 #endif /* CACHE */
 
-static time_t last_eI; /* this will stop +e and +I from being checked over and over if the bot is stuck in a
-                        * -o+o loop for some reason, hence possibly causing a SENDQ kill
-                        */
-#define do_eI (((now - last_eI) > 30) ? 1 : 0)
+#define do_eI (((now - chan->channel.last_eI) > 30) ? 1 : 0)
 
 static int net_type = 0;
 static time_t wait_split = 300;    /* Time to wait for user to return from
@@ -1211,10 +1208,8 @@ reset_chan_info(struct chanset_t *chan)
   }
 
   if (!channel_pending(chan)) {
-    bool opped = 0;
+    bool opped = me_op(chan) ? 1 : 0;
 
-    if (me_op(chan))
-      opped = 1;
     free(chan->channel.key);
     chan->channel.key = (char *) my_calloc(1, 1);
     clear_channel(chan, 1);
@@ -1226,8 +1221,9 @@ reset_chan_info(struct chanset_t *chan)
         chan->status |= CHAN_ASKEDBANS;
         dprintf(DP_MODE, "MODE %s +b\n", chan->name);
       }
+
       if (opped && do_eI) {
-        last_eI = now;
+        chan->channel.last_eI = now;
         if (!(chan->ircnet_status & CHAN_ASKED_EXEMPTS) && use_exempts == 1) {
           chan->ircnet_status |= CHAN_ASKED_EXEMPTS;
           dprintf(DP_MODE, "MODE %s +e\n", chan->name);

+ 13 - 29
src/mod/irc.mod/mode.c

@@ -522,14 +522,19 @@ got_key(struct chanset_t *chan, char *key)
   }
 }
 
+  /* m may not exist */
 static void
 got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
 {
   bool check_chan = 0;
+  bool me_opped = match_my_nick(mv->nick);
+  bool meop = me_op(chan);
 
   /* Did *I* just get opped? */
-  if (!me_op(chan) && match_my_nick(mv->nick))
+  if (!meop && me_opped) {
     check_chan = 1;
+    meop = 1;
+  }
 
   get_user_flagrec(mv->user, &victim, chan->dname);
   /* Flags need to be set correctly right from the beginning now, so that
@@ -545,11 +550,12 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
    */
   mv->flags &= ~SENTOP;
 
+  /* This skips the recheck_channel until we get the end of the WHO list */
   if (channel_pending(chan))
     return;
 
   /* I'm opped, and the opper isn't me, and it isn't a server op */
-  if (m && me_op(chan) && !match_my_nick(mv->nick)) {
+  if (m && meop && !me_opped) {
     /* deop if they are +d or it is +bitch */
     int bitch = chan_bitch(chan);
 
@@ -575,42 +581,18 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
     }
 
 
-  } else if (reversing && !match_my_nick(mv->nick))
+  } else if (reversing && !me_opped)
     add_mode(chan, '-', 'o', mv->nick);
 
   /* server op */
-  if (!m && me_op(chan) && !match_my_nick(mv->nick)) {
+  if (!m && meop && !me_opped) {
     if (chk_deop(victim, chan) || (chan_bitch(chan) && !chk_op(victim, chan))) {
       mv->flags |= FAKEOP;
       add_mode(chan, '-', 'o', mv->nick);
     } 
-#ifdef no
-    } else if (snm > 0 && snm < 7 && !((channel_autoop(chan) ||
-         glob_autoop(victim) || chan_autoop(victim)) && (chan_op(victim) ||
-         (glob_op(victim) && !chan_deop(victim)))) &&
-         !glob_exempt(victim) && !chan_exempt(victim)) {
-
-      if (snm == 5)
-        snm = chan_bitch(chan) ? 1 : 3;
-      if (snm == 6)
-        snm = chan_bitch(chan) ? 4 : 2;
-      if (chan_wasoptest(victim) || glob_wasoptest(victim) || snm == 2) {
-        if (!chan_wasop(mv)) {
-          mv->flags |= FAKEOP;
-          add_mode(chan, '-', 'o', mv->nick);
-        }
-      } else if (!(chan_op(victim) || (glob_op(victim) && !chan_deop(victim)))) {
-        if (snm == 1 || snm == 4 || (snm == 3 && !chan_wasop(mv))) {
-          add_mode(chan, '-', 'o', mv->nick);
-          m->flags |= FAKEOP;
-        }
-      } else if (snm == 4 && !chan_wasop(mv)) {
-        add_mode(chan, '-', 'o', mv->nick);
-        mv->flags |= FAKEOP;
-      }
-#endif
   }
   mv->flags |= WASOP;
+
   if (check_chan) {
 #ifdef no
     /* tell other bots to set jointime to 0 and join */
@@ -620,6 +602,8 @@ got_op(struct chanset_t *chan, memberlist *m, memberlist *mv)
     putallbots(buf);
     free(buf);
 #endif
+
+    /* check exempts/invites and shit */
     recheck_channel(chan, 2);
   }
 }