From: Michael Poole Date: Sun, 17 Apr 2005 16:59:49 +0000 (+0000) Subject: Fix ability to kick and deop users on -A channels when OPLEVELS enabled. X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=commitdiff_plain;h=6e75aeb4a4f6ac2def0ab6bb32f858ee7e327a1b Fix ability to kick and deop users on -A channels when OPLEVELS enabled. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/trunk@1368 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- diff --git a/ChangeLog b/ChangeLog index 284179f..71254a9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2005-04-17 Michael Poole + + * ircd/channel.c (mode_process_clients): Only prohibit deops of + users with the same or higher oplevel where apass is set. + Likewise, when opping users, give them MAXOPLEVEL for non-apass + channels. + (joinbuf_join): Give new ops MAXOPLEVEL for non-apass channels. + + * ircd/m_kick.c (m_kick): Only prohibit kicks of users with the + same or higher oplevel where apass is set. + + * ircd/s_user.c (register_user): Fix order of server version vs + various mode strings. + + * tools/linesync/linesync.sh: Add revision id field. + 2005-04-17 Michael Poole * tools/linesync/linesync.sh: Fix typo comment. Check for diff --git a/ircd/channel.c b/ircd/channel.c index db4e7f9..4821c4e 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -2999,11 +2999,11 @@ mode_process_clients(struct ParseState *state) continue; } - if (feature_bool(FEAT_OPLEVELS)) { /* 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->member - && OpLevel(member) <= OpLevel(state->member)) { + && state->chptr->mode.apass[0] + && state->member + && OpLevel(member) <= OpLevel(state->member)) { int equal = (OpLevel(member) == OpLevel(state->member)); send_reply(state->sptr, ERR_NOTLOWEROPLEVEL, cli_name(state->cli_change[i].client), @@ -3012,20 +3012,24 @@ mode_process_clients(struct ParseState *state) "deop", equal ? "the same" : "a higher"); continue; } - } } } /* set op-level of member being opped */ if ((state->cli_change[i].flag & (MODE_ADD | MODE_CHANOP)) == (MODE_ADD | MODE_CHANOP)) { - /* If on a channel with upass set, someone with level x gives ops to someone else, - then that person gets level x-1. On other channels, where upass is not set, - the level stays the same. */ - int level_increment = *state->chptr->mode.upass ? 1 : 0; - /* Someone being opped by a server gets op-level 0 */ - int old_level = (state->member == NULL) ? -level_increment : OpLevel(state->member); - SetOpLevel(member, old_level == MAXOPLEVEL ? MAXOPLEVEL : (old_level + level_increment)); + /* If being opped by an outsider, get oplevel 0 for an apass + * channel, else MAXOPLEVEL. + * Otherwise, if not an apass channel, or state->member has + * MAXOPLEVEL, get oplevel MAXOPLEVEL. + * Otherwise, get state->member's oplevel+1. + */ + if (!state->member) + SetOpLevel(member, state->chptr->mode.apass[0] ? 0 : MAXOPLEVEL); + else if (!state->chptr->mode.apass[0] || OpLevel(state->member) == MAXOPLEVEL) + SetOpLevel(member, MAXOPLEVEL); + else + SetOpLevel(member, OpLevel(state->member) + 1); } /* actually effect the change */ @@ -3368,11 +3372,12 @@ 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; /* 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, 0); + add_user_to_channel(chan, jbuf->jb_source, flags | CHFL_DELAYED, oplevel); else - add_user_to_channel(chan, jbuf->jb_source, flags, 0); + add_user_to_channel(chan, jbuf->jb_source, flags, oplevel); /* send notification to all servers */ if (jbuf->jb_type != JOINBUF_TYPE_CREATE && !is_local) diff --git a/ircd/m_kick.c b/ircd/m_kick.c index 5af0a4d..40ec73f 100644 --- a/ircd/m_kick.c +++ b/ircd/m_kick.c @@ -143,7 +143,7 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) 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 ((OpLevel(member) <= OpLevel(member2)) && feature_bool(FEAT_OPLEVELS)) + if (chptr->mode.apass[0] && OpLevel(member) <= OpLevel(member2)) return send_reply(sptr, ERR_NOTLOWEROPLEVEL, cli_name(who), chptr->chname, OpLevel(member2), OpLevel(member), "kick", OpLevel(member) == OpLevel(member2) ? "the same" : "a higher"); diff --git a/ircd/s_user.c b/ircd/s_user.c index 58e9ecf..af7b93b 100644 --- a/ircd/s_user.c +++ b/ircd/s_user.c @@ -591,8 +591,8 @@ int register_user(struct Client *cptr, struct Client *sptr, */ send_reply(sptr, RPL_YOURHOST, cli_name(&me), version); send_reply(sptr, RPL_CREATED, creation); - send_reply(sptr, RPL_MYINFO, cli_name(&me), infousermodes, infochanmodes, - infochanmodeswithparams, version); + send_reply(sptr, RPL_MYINFO, cli_name(&me), version, infousermodes, + infochanmodes, infochanmodeswithparams); send_supported(sptr); m_lusers(sptr, sptr, 1, parv); update_load(); diff --git a/tools/linesync/linesync.sh b/tools/linesync/linesync.sh index 77330ef..63da300 100755 --- a/tools/linesync/linesync.sh +++ b/tools/linesync/linesync.sh @@ -2,6 +2,7 @@ # linesync.sh, Copyright (c) 2002 Arjen Wolfs # 20020604, sengaia@undernet.org # 20050417, daniel@undernet.org - modified for u2.10.12 +# $Id$ # # The code contained is in this file is licenced under the terms # and conditions as specified in the GNU General Public License.