Răsfoiți Sursa

* Port [3367] to 1.2.14
* Clean up code
* Fix few places of missing +private checks



svn: 3368

Bryan Drewery 19 ani în urmă
părinte
comite
bddb043fd2
3 a modificat fișierele cu 17 adăugiri și 20 ștergeri
  1. 7 5
      src/mod/irc.mod/chan.c
  2. 5 7
      src/mod/irc.mod/cmdsirc.c
  3. 5 8
      src/mod/irc.mod/irc.c

+ 7 - 5
src/mod/irc.mod/chan.c

@@ -1078,12 +1078,13 @@ void enforce_closed(struct chanset_t *chan) {
   if (!chan || !me_op(chan)) 
   if (!chan || !me_op(chan)) 
     return;
     return;
 
 
-  char buf[3] = "";
+  char buf[3] = "", *p = buf;
 
 
   if (chan->closed_invite && !(chan->channel.mode & CHANINV))
   if (chan->closed_invite && !(chan->channel.mode & CHANINV))
-    strcat(buf, "i");
+    *p++ = 'i';
   if (chan->closed_private && !(chan->channel.mode & CHANPRIV))
   if (chan->closed_private && !(chan->channel.mode & CHANPRIV))
-    strcat(buf, "p"); 
+    *p++ = 'p';
+  *p = 0;
   if (buf && buf[0])
   if (buf && buf[0])
     dprintf(DP_MODE, "MODE %s +%s\n", chan->name, buf);
     dprintf(DP_MODE, "MODE %s +%s\n", chan->name, buf);
   priority_do(chan, 0, PRIO_KICK);
   priority_do(chan, 0, PRIO_KICK);
@@ -2434,11 +2435,12 @@ static int gotjoin(char *from, char *chname)
       /* ok, the op-on-join,etc, tests...first only both if Im opped */
       /* ok, the op-on-join,etc, tests...first only both if Im opped */
       if (me_op(chan)) {
       if (me_op(chan)) {
         struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
         struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0 };
+        bool is_op = chk_op(fr, chan);
 
 
         get_user_flagrec(m->user, &fr, chan->dname);
         get_user_flagrec(m->user, &fr, chan->dname);
 
 
         /* Check for a mass join */
         /* Check for a mass join */
-        if (!splitjoin && channel_nomassjoin(chan) && !chk_op(fr, chan)) {
+        if (!splitjoin && channel_nomassjoin(chan) && !is_op) {
           if (chan->channel.drone_jointime < now - chan->flood_mjoin_time) {      //expired, reset counter
           if (chan->channel.drone_jointime < now - chan->flood_mjoin_time) {      //expired, reset counter
             chan->channel.drone_joins = 0;
             chan->channel.drone_joins = 0;
           }
           }
@@ -2461,7 +2463,7 @@ static int gotjoin(char *from, char *chname)
 	  refresh_invite(chan, from);
 	  refresh_invite(chan, from);
 
 
 	if (!(use_exempts && (u_match_mask(global_exempts,from) || u_match_mask(chan->exempts, from)))) {
 	if (!(use_exempts && (u_match_mask(global_exempts,from) || u_match_mask(chan->exempts, from)))) {
-          if (channel_enforcebans(chan) && !chan_op(fr) && !glob_op(fr) && !chan_sentkick(m) &&
+          if (channel_enforcebans(chan) && !chan_sentkick(m) && !is_op &&
               !(use_exempts && (isexempted(chan, from) || (chan->ircnet_status & CHAN_ASKED_EXEMPTS)))) {
               !(use_exempts && (isexempted(chan, from) || (chan->ircnet_status & CHAN_ASKED_EXEMPTS)))) {
             for (masklist* b = chan->channel.ban; b->mask[0]; b = b->next) {
             for (masklist* b = chan->channel.ban; b->mask[0]; b = b->next) {
               if (wild_match(b->mask, from) || match_cidr(b->mask, from)) {
               if (wild_match(b->mask, from) || match_cidr(b->mask, from)) {

+ 5 - 7
src/mod/irc.mod/cmdsirc.c

@@ -859,8 +859,7 @@ static void cmd_deop(int idx, char *par)
       if (all) goto next;  
       if (all) goto next;  
       return;
       return;
     }
     }
-    if ((chan_op(victim) || (glob_op(victim) && !chan_deop(victim))) &&
-        !(chan_master(user) || glob_master(user))) {
+    if (chk_op(victim, chan) && !(chan_master(user) || glob_master(user))) {
       dprintf(idx, "%s has the op flag for %s.\n", m->nick, chan->dname);
       dprintf(idx, "%s has the op flag for %s.\n", m->nick, chan->dname);
       if (all) goto next;  
       if (all) goto next;  
       return;
       return;
@@ -950,8 +949,7 @@ static void cmd_kick(int idx, char *par)
     simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
     simple_snprintf(s, sizeof s, "%s!%s", m->nick, m->userhost);
     u = get_user_by_host(s);
     u = get_user_by_host(s);
     get_user_flagrec(u, &victim, chan->dname);
     get_user_flagrec(u, &victim, chan->dname);
-    if ((chan_op(victim) || (glob_op(victim) && !chan_deop(victim))) &&
-        !(chan_master(user) || glob_master(user))) {
+    if (chk_op(victim, chan) && !(chan_master(user) || glob_master(user))) {
       if (all) goto next;
       if (all) goto next;
       dprintf(idx, "%s is a legal op.\n", nick);
       dprintf(idx, "%s is a legal op.\n", nick);
       return;
       return;
@@ -1340,7 +1338,7 @@ static void cmd_channel(int idx, char *par)
        	strlcpy(handle, m->user->handle, sizeof handle);
        	strlcpy(handle, m->user->handle, sizeof handle);
       get_user_flagrec(m->user, &user, chan->dname);
       get_user_flagrec(m->user, &user, chan->dname);
       /* Determine status char to use */
       /* Determine status char to use */
-      if (glob_bot(user) && (glob_op(user)|| chan_op(user)))
+      if (glob_bot(user) && chk_op(user, chan))
         atrflag = 'B';
         atrflag = 'B';
       else if (glob_bot(user))
       else if (glob_bot(user))
         atrflag = 'b';
         atrflag = 'b';
@@ -1362,7 +1360,7 @@ static void cmd_channel(int idx, char *par)
         atrflag = 'a';
         atrflag = 'a';
       else if (glob_op(user) && !privchan(user, chan, PRIV_OP))
       else if (glob_op(user) && !privchan(user, chan, PRIV_OP))
         atrflag = 'O';
         atrflag = 'O';
-      else if (chan_op(user) && !privchan(user, chan, PRIV_OP))
+      else if (chan_op(user))
         atrflag = 'o';
         atrflag = 'o';
       else if (glob_quiet(user))
       else if (glob_quiet(user))
         atrflag = 'Q';
         atrflag = 'Q';
@@ -1370,7 +1368,7 @@ static void cmd_channel(int idx, char *par)
         atrflag = 'q';
         atrflag = 'q';
       else if (glob_voice(user) && !privchan(user, chan, PRIV_VOICE))
       else if (glob_voice(user) && !privchan(user, chan, PRIV_VOICE))
         atrflag = 'V';
         atrflag = 'V';
-      else if (chan_voice(user) && !privchan(user, chan, PRIV_VOICE))
+      else if (chan_voice(user))
         atrflag = 'v';
         atrflag = 'v';
       else if (glob_kick(user))
       else if (glob_kick(user))
         atrflag = 'K';
         atrflag = 'K';

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

@@ -126,8 +126,7 @@ void unlock_chan(struct chanset_t *chan)
       *p++ = 'i';
       *p++ = 'i';
     if (chan->channel.drone_set_mode & CHANMODER)
     if (chan->channel.drone_set_mode & CHANMODER)
       *p++ = 'm';
       *p++ = 'm';
-
-    buf[sizeof(buf) - 1] = '\0';
+    *p = 0;
     dprintf(DP_MODE, "MODE %s :-%s\n", chan->name[0] ? chan->name : chan->dname, buf);
     dprintf(DP_MODE, "MODE %s :-%s\n", chan->name[0] ? chan->name : chan->dname, buf);
   }
   }
   chan->channel.drone_set_mode = 0;
   chan->channel.drone_set_mode = 0;
@@ -148,7 +147,7 @@ void detected_drone_flood(struct chanset_t* chan, memberlist* m) {
     chan->channel.drone_set_mode |= CHANMODER;
     chan->channel.drone_set_mode |= CHANMODER;
     *p++ = 'm';
     *p++ = 'm';
   }
   }
-  buf[sizeof(buf) - 1] = '\0';
+  *p = 0;
 
 
   if (chan->channel.drone_set_mode && buf[0]) {
   if (chan->channel.drone_set_mode && buf[0]) {
     chan->channel.drone_joins = 0;
     chan->channel.drone_joins = 0;
@@ -925,9 +924,7 @@ want_to_revenge(struct chanset_t *chan, struct userrec *u,
       get_user_flagrec(u2, &fr2, chan->dname);
       get_user_flagrec(u2, &fr2, chan->dname);
       /* Protecting friends? */
       /* Protecting friends? */
       /* Protecting ops? */
       /* Protecting ops? */
-      if ((channel_protectops(chan) &&
-           /* ... and kicked is valid op? */
-           (chan_op(fr2) || (glob_op(fr2) && !chan_deop(fr2)))))
+      if ((channel_protectops(chan) && chk_op(fr2, chan))
         return 1;
         return 1;
     }
     }
   }
   }
@@ -977,7 +974,7 @@ punish_badguy(struct chanset_t *chan, char *whobad,
     memberlist *mx = NULL;
     memberlist *mx = NULL;
 
 
     /* Removing op */
     /* Removing op */
-    if (chan_op(fr) || (glob_op(fr) && !chan_deop(fr))) {
+    if (chk_op(fr, chan)) {
       fr.match = FR_CHAN;
       fr.match = FR_CHAN;
       if (chan_op(fr)) {
       if (chan_op(fr)) {
         fr.chan &= ~USER_OP;
         fr.chan &= ~USER_OP;
@@ -1459,7 +1456,7 @@ check_expired_chanstuff(struct chanset_t *chan)
           if (now - m->last >= chan->idle_kick * 60 && !match_my_nick(m->nick) && !chan_issplit(m)) {
           if (now - m->last >= chan->idle_kick * 60 && !match_my_nick(m->nick) && !chan_issplit(m)) {
             simple_sprintf(s, "%s!%s", m->nick, m->userhost);
             simple_sprintf(s, "%s!%s", m->nick, m->userhost);
             get_user_flagrec(m->user ? m->user : get_user_by_host(s), &fr, chan->dname);
             get_user_flagrec(m->user ? m->user : get_user_by_host(s), &fr, chan->dname);
-            if (!(glob_bot(fr) || (glob_op(fr) && !glob_deop(fr)) || chan_op(fr))) {
+            if (!(glob_bot(fr) || chk_op(fr, chan))) {
               dprintf(DP_SERVER, "KICK %s %s :%sidle %d min\n", chan->name, m->nick, kickprefix, chan->idle_kick);
               dprintf(DP_SERVER, "KICK %s %s :%sidle %d min\n", chan->name, m->nick, kickprefix, chan->idle_kick);
               m->flags |= SENTKICK;
               m->flags |= SENTKICK;
             }
             }