X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fm_kick.c;h=4a7200590382fcb8cbd4d985a7cc32aa1be98470;hb=2f1b0ed8f610deeb5743b041835a81d96b2275fb;hp=51c848e6e4aad693ddea4f635a4b1e3f5ca4c45e;hpb=050f7298038ef85c4455aca0da3f769a47525834;p=ircu2.10.12-pk.git diff --git a/ircd/m_kick.c b/ircd/m_kick.c index 51c848e..4a72005 100644 --- a/ircd/m_kick.c +++ b/ircd/m_kick.c @@ -107,6 +107,7 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) struct Client *who; struct Channel *chptr; struct Membership *member = 0; + struct Membership* member2; char *name, *comment; cli_flags(sptr) &= ~FLAGS_TS8; @@ -120,7 +121,8 @@ int m_kick(struct Client *cptr, struct Client *sptr, int parc, char *parv[]) if (!(chptr = get_channel(sptr, name, CGT_NO_CREATE))) return send_reply(sptr, ERR_NOSUCHCHANNEL, name); - if (!is_chan_op(sptr, chptr) || IsModelessChannel(name)) + if (!(member2 = find_member_link(chptr, sptr)) || IsZombie(member2) + || !IsChanOp(member2) || IsModelessChannel(name)) return send_reply(sptr, ERR_CHANOPRIVSNEEDED, name); if (!(who = find_chasing(sptr, parv[2], 0))) @@ -138,6 +140,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 (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"); + /* We rely on ircd_snprintf to truncate the comment */ comment = EmptyString(parv[parc - 1]) ? parv[0] : parv[parc - 1];