+2005-04-17 Michael Poole <mdpoole@troilus.org>
+
+ * 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 <mdpoole@troilus.org>
* tools/linesync/linesync.sh: Fix typo comment. Check for
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),
"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 */
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)
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");
*/
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();