X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_channel%2Fcmd_kick.cpp;h=e2fdd787797d7a2819a66a83252923ea81758bc0;hb=30fc51c6ddca487a1b89da9ab0ab59da003aee36;hp=d646d9a45bf443174907ddad333683d985d8094f;hpb=b6da8d9e22a8b03ae13339ab8db3305797cba295;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_channel/cmd_kick.cpp b/src/coremods/core_channel/cmd_kick.cpp index d646d9a45..e2fdd7877 100644 --- a/src/coremods/core_channel/cmd_kick.cpp +++ b/src/coremods/core_channel/cmd_kick.cpp @@ -31,7 +31,6 @@ CommandKick::CommandKick(Module* parent) */ CmdResult CommandKick::Handle (const std::vector& parameters, User *user) { - std::string reason; Channel* c = ServerInstance->FindChan(parameters[0]); User* u; @@ -66,7 +65,7 @@ CmdResult CommandKick::Handle (const std::vector& parameters, User } } - const UserMembIter victimiter = c->userlist.find(u); + const Channel::MemberMap::iterator victimiter = c->userlist.find(u); if (victimiter == c->userlist.end()) { user->WriteNumeric(ERR_USERNOTINCHANNEL, "%s %s :They are not on that channel", u->nick.c_str(), c->name.c_str()); @@ -74,15 +73,20 @@ CmdResult CommandKick::Handle (const std::vector& parameters, User } Membership* const memb = victimiter->second; - if (parameters.size() > 2) + // KICKs coming from servers can carry a membership id + if ((!IS_LOCAL(user)) && (parameters.size() > 3)) { - reason.assign(parameters[2], 0, ServerInstance->Config->Limits.MaxKick); - } - else - { - reason.assign(user->nick, 0, ServerInstance->Config->Limits.MaxKick); + // If the current membership id is not equal to the one in the message then the user rejoined + if (memb->id != Membership::IdFromString(parameters[2])) + { + ServerInstance->Logs->Log(MODNAME, LOG_DEBUG, "Dropped KICK due to membership id mismatch: " + ConvToStr(memb->id) + " != " + parameters[2]); + return CMD_FAILURE; + } } + const bool has_reason = (parameters.size() > 2); + const std::string reason((has_reason ? parameters.back() : user->nick), 0, ServerInstance->Config->Limits.MaxKick); + // Do the following checks only if the KICK is done by a local user; // each server enforces its own rules. if (srcmemb)