+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.
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);
/* 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);
struct Channel *chptr;
struct JoinBuf join;
struct JoinBuf create;
- struct ModeBuf mbuf;
struct Gline *gline;
unsigned int flags = 0;
int i, j, k = 0;
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;
} /* 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))
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;
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);
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? */
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);
}