From: Michael Poole Date: Thu, 5 May 2005 02:14:54 +0000 (+0000) Subject: Give users who join a +AU channel using the user pass level 1 ops. X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=commitdiff_plain;h=1043fc76c84ee139d9ad35ba8d816ae900037244 Give users who join a +AU channel using the user pass level 1 ops. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1396 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- diff --git a/ChangeLog b/ChangeLog index 7c31559..0bbb784 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2005-05-04 Michael Poole + + * 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 " 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 * include/numeric.h: Remap oplevel numerics to new range. diff --git a/ircd/channel.c b/ircd/channel.c index f5d78ad..633d28c 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -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); diff --git a/ircd/m_join.c b/ircd/m_join.c index 59c667d..7391139 100644 --- a/ircd/m_join.c +++ b/ircd/m_join.c @@ -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); }