Browse Source

* Fixed cookie/manop protections to kick all opped nicks.

svn: 1724
Bryan Drewery 21 years ago
parent
commit
5ecb228d95
2 changed files with 20 additions and 29 deletions
  1. 1 0
      doc/UPDATES
  2. 19 29
      src/mod/irc.mod/mode.c

+ 1 - 0
doc/UPDATES

@@ -60,6 +60,7 @@ Lines prefixxed with '-' were disabled before release and are not finishsed.
 * Now using OpenBSD's strlcpy()
 * Added a (temporarily) static auto-op delay of 6 seconds.
 * Added primitive CIDR ban support (enforcebans/kickban/getop).
+* Fixed cookie/manop protections to kick all opped nicks.
 
 1.2
 * No longer displaying SALTS on ./bin -v

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

@@ -932,6 +932,9 @@ static memberlist *assert_ismember(struct chanset_t *chan, const char *nick)
 static int
 gotmode(char *from, char *msg)
 {
+#define msign	modes[i][0]
+#define mmode	modes[i][1]
+#define mparam	&modes[i][3]
   /* Usermode changes? */
   if (msg[0] && (strchr(CHANMETA, msg[0]) != NULL)) {
     char *ch = newsplit(&msg);
@@ -1073,8 +1076,6 @@ gotmode(char *from, char *msg)
                 isbadop = checkcookie(chan->dname, u->handle, &(modes[modecnt - 1][3]));
               }
               if (isbadop) {
-                char trg[NICKLEN] = "";
-
                 putlog(LOG_WARNING, "*", "%s opped in %s with bad cookie(%d): %s", m->nick, chan->dname, isbadop, msg);
                 n = i = 0;
                 switch (role) {
@@ -1082,11 +1083,10 @@ gotmode(char *from, char *msg)
                     break;
                   case 1:
                     /* Kick opper */
-                    if (!m || !chan_sentkick(m)) {
+                    if (!chan_sentkick(m)) {
+                      m->flags |= SENTKICK;
                       sprintf(tmp, "KICK %s %s :%s%s\r\n", chan->name, m->nick, kickprefix, response(RES_BADOP));
                       tputs(serv, tmp, strlen(tmp));
-                      if (m)
-                        m->flags |= SENTKICK;
                     }
                     sprintf(tmp, "%s!%s MODE %s", m->nick, m->userhost, msg);
                     deflag_user(u, DEFLAG_BADCOOKIE, tmp, chan);
@@ -1101,16 +1101,14 @@ gotmode(char *from, char *msg)
                         i++;
                     }
                     if (!n) {
-                      memberlist *mo = NULL;
-
-                      strlcpy(trg, (char *) &modes[i][3], NICKLEN);
-                      mo = ismember(chan, trg);
-                      if (mo) {
-                        if (!(mo->flags & CHANOP)) {
-                          if (!chan_sentkick(mo)) {
-                            sprintf(tmp, "KICK %s %s :%s%s\r\n", chan->name, trg, kickprefix, response(RES_BADOPPED));
+                      for (i = 0; i < modecnt; i++) {
+                        if (msign == '+' && mmode == 'o') {
+                          mv = ismember(chan, mparam);
+                          if (!mv || !chan_sentkick(mv)) {
+                            if (mv)
+                              mv->flags |= SENTKICK;
+                            sprintf(tmp, "KICK %s %s :%s%s\r\n", chan->name, mparam, kickprefix, response(RES_BADOPPED));
                             tputs(serv, tmp, strlen(tmp));
-                            mo->flags |= SENTKICK;
                           }
                         }
                       }
@@ -1128,8 +1126,6 @@ gotmode(char *from, char *msg)
             }
 
             if (!channel_manop(chan) && !u->bot) {
-              char trg[NICKLEN] = "";
-
               n = i = 0;
 
               switch (role) {
@@ -1156,19 +1152,16 @@ gotmode(char *from, char *msg)
                       i++;
                   }
                   if (!n) {
-                    strlcpy(trg, (char *) &modes[i][3], NICKLEN);
-                    mv = ismember(chan, trg);
-                    if (mv) {
-                      if (!(mv->flags & CHANOP) && !match_my_nick(mv->nick)) {
-                        if (!chan_sentkick(mv)) {
-                          sprintf(tmp, "KICK %s %s :%s%s\r\n", chan->name, mv->nick, kickprefix, response(RES_MANUALOPPED));
+                    for (i = 0; i < modecnt; i++) {
+                      if (msign == '+' && mmode == 'o' && !match_my_nick(mparam)) {
+                        mv = ismember(chan, mparam);
+                        if (!mv || !chan_sentkick(mv)) {
+                          if (mv)
+                            mv->flags |= SENTKICK;
+                          sprintf(tmp, "KICK %s %s :%s%s\r\n", chan->name, mparam, kickprefix, response(RES_MANUALOPPED));
                           tputs(serv, tmp, strlen(tmp));
-                          mv->flags |= SENTKICK;
                         }
                       }
-                    } else {
-                      sprintf(tmp, "KICK %s %s :%s%s\r\n", chan->name, trg, kickprefix, response(RES_MANUALOPPED));
-                      tputs(serv, tmp, strlen(tmp));
                     }
                   }
               }
@@ -1191,9 +1184,6 @@ gotmode(char *from, char *msg)
           reversing = 1;
         }
       }
-#define msign	modes[i][0]
-#define mmode	modes[i][1]
-#define mparam	&modes[i][3]
 
       for (i = 0; i < modecnt; i++) {
         int todo = 0;