From: Michael Poole Date: Wed, 9 Nov 2005 12:36:12 +0000 (+0000) Subject: Allow oplevel 999 to kick and deop other oplevel 999, making Apass X-Git-Url: http://git.pk910.de/?p=ircu2.10.12-pk.git;a=commitdiff_plain;h=9792e93a15da69f3c2366f0f4aa0addd80c4c461 Allow oplevel 999 to kick and deop other oplevel 999, making Apass channels behave the same as non-Apass channels. git-svn-id: file:///home/klmitch/undernet-ircu/undernet-ircu-svn/ircu2/branches/u2_10_12_branch@1539 c9e4aea6-c8fd-4c43-8297-357d70d61c8c --- diff --git a/ChangeLog b/ChangeLog index ec0602f..3507aaa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2005-11-07 Michael Poole + + * 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 (Based on a patch by Romain Bignon ) diff --git a/ircd/channel.c b/ircd/channel.c index 8b521c0..6ff0c82 100644 --- a/ircd/channel.c +++ b/ircd/channel.c @@ -2889,9 +2889,11 @@ static void 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 @@ mode_parse_client(struct ParseState *state, int *flag_p) 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 @@ mode_process_clients(struct ParseState *state) 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), diff --git a/ircd/m_kick.c b/ircd/m_kick.c index 60efbce..813dfc4 100644 --- a/ircd/m_kick.c +++ b/ircd/m_kick.c @@ -142,8 +142,12 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) 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");