Give users who join a +AU channel using the user pass level 1 ops.
authorMichael Poole <mdpoole@troilus.org>
Thu, 5 May 2005 02:14:54 +0000 (02:14 +0000)
committerMichael Poole <mdpoole@troilus.org>
Thu, 5 May 2005 02:14:54 +0000 (02:14 +0000)
git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1396 c9e4aea6-c8fd-4c43-8297-357d70d61c8c

ChangeLog
ircd/channel.c
ircd/m_join.c

index 7c31559747f67bdfc263c154450a1b7a8ceecffc..0bbb784e1b80df6b2da36bde2dbf9e860634aeaa 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2005-05-04  Michael Poole <mdpoole@troilus.org>
+
+       * ircd/channel.c (joinbuf_join): Include channel manager flag in
+       determination of oplevel.  If opping the user for a non-local
+       non-create, include oplevel in message to other servers.  Send
+       "MODE +o <client>" to local users whenever opping the client.
+
+       * ircd/m_join.c (m_join): Remove logic that moved into
+       joinbuf_join().
+       (ms_join): Look for level 0 and 1 joins from remote servers
+       and adjust value of 'flags' appropriately.
+
 2005-05-04  Michael Poole <mdpoole@troilus.org>
 
        * include/numeric.h: Remap oplevel numerics to new range.
index f5d78add9e2a167dddf3e55fc5d399046c9671c7..633d28c14848b4db3899635a4bfbb2426e45a52b 100644 (file)
@@ -3388,7 +3388,9 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
        is_local) /* got to remove user here */
       remove_user_from_channel(jbuf->jb_source, chan);
   } else {
-    int oplevel = chan->mode.apass[0] ? 0 : MAXOPLEVEL;
+    int oplevel = !chan->mode.apass[0] ? MAXOPLEVEL
+        : (flags & CHFL_CHANNEL_MANAGER) ? 0
+        : 1;
     /* Add user to channel */
     if ((chan->mode.mode & MODE_DELJOINS) && !(flags & CHFL_VOICED_OR_OPPED))
       add_user_to_channel(chan, jbuf->jb_source, flags | CHFL_DELAYED, oplevel);
@@ -3397,16 +3399,22 @@ joinbuf_join(struct JoinBuf *jbuf, struct Channel *chan, unsigned int flags)
 
     /* send notification to all servers */
     if (jbuf->jb_type != JOINBUF_TYPE_CREATE && !is_local)
-      sendcmdto_serv_butone(jbuf->jb_source, CMD_JOIN, jbuf->jb_connect,
-                           "%H %Tu", chan, chan->creationtime);
+    {
+      if (flags & CHFL_CHANOP)
+        sendcmdto_serv_butone(jbuf->jb_source, CMD_JOIN, jbuf->jb_connect,
+                              "%u:%H %Tu", oplevel, chan, chan->creationtime);
+      else
+        sendcmdto_serv_butone(jbuf->jb_source, CMD_JOIN, jbuf->jb_connect,
+                              "%H %Tu", chan, chan->creationtime);
+    }
 
     if (!((chan->mode.mode & MODE_DELJOINS) && !(flags & CHFL_VOICED_OR_OPPED))) {
       /* Send the notification to the channel */
       sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_JOIN, chan, NULL, 0, "%H", chan);
 
       /* send an op, too, if needed */
-      if (!MyUser(jbuf->jb_source) && jbuf->jb_type == JOINBUF_TYPE_CREATE)
-       sendcmdto_channel_butserv_butone(jbuf->jb_source, CMD_MODE, chan, NULL, 0, "%H +o %C",
+      if (flags & CHFL_CHANOP)
+       sendcmdto_channel_butserv_butone(&me, CMD_MODE, chan, NULL, 0, "%H +o %C",
                                         chan, jbuf->jb_source);
     } else if (MyUser(jbuf->jb_source))
       sendcmdto_one(jbuf->jb_source, CMD_JOIN, jbuf->jb_source, ":%H", chan);
index 59c667dd8ca4042ec9c53bab847ac79ecd73042e..7391139bb2ad128f437616fe9f96955ade4f776f 100644 (file)
@@ -170,7 +170,6 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
   struct Channel *chptr;
   struct JoinBuf join;
   struct JoinBuf create;
-  struct ModeBuf mbuf;
   struct Gline *gline;
   unsigned int flags = 0;
   int i, j, k = 0;
@@ -247,8 +246,7 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     if (chptr) {
       int is_level0_op = 0;
       if (!BadPtr(keys) && *chptr->mode.apass) {
-       /* Don't use compall for the apass, only a single key is allowed.
-          Test Apass first in case someone set Apass and upass equal. */
+        /* Don't use compall for the apass, only a single key is allowed. */
        if (strcmp(chptr->mode.apass, keys) == 0) {
          is_level0_op = 1;
          flags &= ~CHFL_DEOPPED;
@@ -304,16 +302,6 @@ int m_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
       } /* else if ((i = can_join(sptr, chptr, keys))) */
 
       joinbuf_join(&join, chptr, flags);
-      if (is_level0_op)
-      {
-       joinbuf_flush(&join);
-       modebuf_init(&mbuf, &me, cptr, chptr,
-           MODEBUF_DEST_CHANNEL |              /* Send mode to channel */
-           MODEBUF_DEST_SERVER);               /* And send it to the other servers */
-       modebuf_mode_client(&mbuf,
-           MODE_ADD | MODE_CHANOP, sptr);      /* Give ops to the level0 op */
-       modebuf_flush(&mbuf);
-      }
     } else if (!(chptr = get_channel(sptr, name, CGT_CREATE)))
       continue; /* couldn't get channel */
     else if (check_target_limit(sptr, chptr, chptr->chname, 1))
@@ -351,7 +339,7 @@ int ms_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
   struct Membership *member;
   struct Channel *chptr;
   struct JoinBuf join;
-  unsigned int flags = 0;
+  unsigned int flags;
   time_t creation = 0;
   char *p = 0;
   char *chanlist;
@@ -384,6 +372,19 @@ int ms_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
     if (join0(&join, cptr, sptr, name)) /* did client do a JOIN 0? */
       continue;
 
+    if (name[0] == '0' && name[1] == ':')
+    {
+      flags = CHFL_CHANOP | CHFL_CHANNEL_MANAGER;
+      name += 2;
+    }
+    else if (name[0] == '1' && name[1] == ':')
+    {
+      flags = CHFL_CHANOP;
+      name += 2;
+    }
+    else
+      flags = CHFL_DEOPPED;
+
     if (IsLocalChannel(name) || !IsChannelName(name))
     {
       protocol_violation(cptr, "%s tried to join %s", cli_name(sptr), name);
@@ -399,9 +400,9 @@ int ms_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
                           name,cli_name(sptr));
        continue;
       }
-      flags = CHFL_DEOPPED | (HasFlag(sptr, FLAG_TS8) ? CHFL_SERVOPOK : 0);
+      flags |= HasFlag(sptr, FLAG_TS8) ? CHFL_SERVOPOK : 0;
 
-      /* when the network is 2.10.11+ then remove MAGIC_REMOTE_JOIN_TS */ 
+      /* when the network is 2.10.11+ then remove MAGIC_REMOTE_JOIN_TS */
       chptr->creationtime = creation ? creation : MAGIC_REMOTE_JOIN_TS;
     }
     else { /* We have a valid channel? */
@@ -416,12 +417,12 @@ int ms_join(struct Client *cptr, struct Client *sptr, int parc, char *parv[])
        chptr = FindChannel(name);
       }
       else
-        flags = CHFL_DEOPPED | (HasFlag(sptr, FLAG_TS8) ? CHFL_SERVOPOK : 0);
+        flags |= HasFlag(sptr, FLAG_TS8) ? CHFL_SERVOPOK : 0;
       /* Always copy the timestamp when it is older, that is the only way to
          ensure network-wide synchronization of creation times. */
       if (creation && creation < chptr->creationtime)
        chptr->creationtime = creation;
-    } 
+    }
 
     joinbuf_join(&join, chptr, flags);
   }