Committer  : entrope
CVSROOT    : /cvsroot/undernet-ircu
Module     : ircu2.10
Branch tags: u2_10_12_branch
Commit time: 2005-11-09 12:36:23 UTC

Modified files:
  Tag: u2_10_12_branch
     ChangeLog ircd/channel.c ircd/m_kick.c

Log message:

Allow oplevel 999 to kick and deop other oplevel 999, making Apass
channels behave the same as non-Apass channels.

---------------------- diff included ----------------------
Index: ircu2.10/ChangeLog
diff -u ircu2.10/ChangeLog:1.710.2.21 ircu2.10/ChangeLog:1.710.2.22
--- ircu2.10/ChangeLog:1.710.2.21       Mon Oct 31 15:33:36 2005
+++ ircu2.10/ChangeLog  Wed Nov  9 04:36:09 2005
@@ -1,3 +1,11 @@
+2005-11-07  Michael Poole <[EMAIL PROTECTED]>
+
+       * ircd/channel.c (mode_parse_client): Allow clients to specify
+       oplevel in MODE #channel +o.
+       (mode_process_clients): Allow oplevel 999 to deop another 999.
+
+       * ircd/kick.c (m_kick): Allow oplevel 999 to kick another 999.
+
 2005-10-31  Michael Poole <[EMAIL PROTECTED]>
        (Based on a patch by Romain Bignon <[EMAIL PROTECTED]>)
 
Index: ircu2.10/ircd/channel.c
diff -u ircu2.10/ircd/channel.c:1.155.2.2 ircu2.10/ircd/channel.c:1.155.2.3
--- ircu2.10/ircd/channel.c:1.155.2.2   Mon Oct 31 15:33:36 2005
+++ ircu2.10/ircd/channel.c     Wed Nov  9 04:36:12 2005
@@ -19,7 +19,7 @@
  */
 /** @file
  * @brief Channel management and maintenance
- * @version $Id: channel.c,v 1.155.2.2 2005/10/31 23:33:36 entrope Exp $
+ * @version $Id: channel.c,v 1.155.2.3 2005/11/09 12:36:12 entrope Exp $
  */
 #include "config.h"
 
@@ -2889,9 +2889,11 @@
 mode_parse_client(struct ParseState *state, int *flag_p)
 {
   char *t_str;
+  char *colon;
   struct Client *acptr;
   struct Membership *member;
   int oplevel = MAXOPLEVEL + 1;
+  int req_oplevel;
   int i;
 
   if (MyUser(state->sptr) && state->max_args <= 0) /* drop if too many args */
@@ -2910,9 +2912,27 @@
     return;
   }
 
-  if (MyUser(state->sptr)) /* find client we're manipulating */
+  if (MyUser(state->sptr)) {
+    colon = strchr(t_str, ':');
+    if (colon != NULL) {
+      *colon++ = '\0';
+      req_oplevel = atoi(colon);
+      if (!(state->flags & MODE_PARSE_FORCE)
+          && state->member
+          && (req_oplevel < OpLevel(state->member)
+              || (req_oplevel == OpLevel(state->member)
+                  && OpLevel(state->member) < MAXOPLEVEL)
+              || req_oplevel > MAXOPLEVEL))
+        send_reply(state->sptr, ERR_NOTLOWEROPLEVEL,
+                   t_str, state->chptr->chname,
+                   OpLevel(state->member), req_oplevel, "op",
+                   OpLevel(state->member) == req_oplevel ? "the same" : "a 
higher");
+      else if (req_oplevel <= MAXOPLEVEL)
+        oplevel = req_oplevel;
+    }
+    /* find client we're manipulating */
     acptr = find_chasing(state->sptr, t_str, NULL);
-  else {
+  } else {
     if (t_str[5] == ':') {
       t_str[5] = '\0';
       oplevel = atoi(t_str + 6);
@@ -3002,11 +3022,14 @@
          continue;
         }
 
-       /* don't allow to deop members with an op level that is <= our own 
level */
-       if (state->sptr != state->cli_change[i].client          /* but allow to 
deop oneself */
-            && state->chptr->mode.apass[0]
+       /* Forbid deopping other members with an oplevel less than
+         * one's own level, and other members with an oplevel the same
+         * as one's own unless both are at MAXOPLEVEL. */
+       if (state->sptr != state->cli_change[i].client
             && state->member
-            && OpLevel(member) <= OpLevel(state->member)) {
+            && ((OpLevel(member) < OpLevel(state->member))
+                || (OpLevel(member) == OpLevel(state->member)
+                    && OpLevel(member) < MAXOPLEVEL))) {
            int equal = (OpLevel(member) == OpLevel(state->member));
            send_reply(state->sptr, ERR_NOTLOWEROPLEVEL,
                       cli_name(state->cli_change[i].client),
Index: ircu2.10/ircd/m_kick.c
diff -u ircu2.10/ircd/m_kick.c:1.19.2.2 ircu2.10/ircd/m_kick.c:1.19.2.3
--- ircu2.10/ircd/m_kick.c:1.19.2.2     Fri Oct 28 00:27:19 2005
+++ ircu2.10/ircd/m_kick.c      Wed Nov  9 04:36:12 2005
@@ -20,7 +20,7 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  *
- * $Id: m_kick.c,v 1.19.2.2 2005/10/28 07:27:19 decampos Exp $
+ * $Id: m_kick.c,v 1.19.2.3 2005/11/09 12:36:12 entrope Exp $
  */
 
 /*
@@ -142,8 +142,12 @@
   if (!(member = find_member_link(chptr, who)) || IsZombie(member))
     return send_reply(sptr, ERR_USERNOTINCHANNEL, cli_name(who), 
chptr->chname);
 
-  /* Don't allow to kick member with a higher or equal op-level */
-  if (chptr->mode.apass[0] && OpLevel(member) <= OpLevel(member2))
+  /* Don't allow to kick member with a higher op-level,
+   * or members with the same op-level unless both are MAXOPLEVEL.
+   */
+  if (OpLevel(member) < OpLevel(member2)
+      || (OpLevel(member) == OpLevel(member2)
+          && OpLevel(member) < MAXOPLEVEL))
     return send_reply(sptr, ERR_NOTLOWEROPLEVEL, cli_name(who), chptr->chname,
        OpLevel(member2), OpLevel(member), "kick",
        OpLevel(member) == OpLevel(member2) ? "the same" : "a higher");
----------------------- End of diff -----------------------
_______________________________________________
Patches mailing list
[email protected]
http://undernet.sbg.org/mailman/listinfo/patches

Reply via email to