diff options
author | attilamolnar <attilamolnar@hush.com> | 2013-06-12 21:22:37 +0200 |
---|---|---|
committer | attilamolnar <attilamolnar@hush.com> | 2013-06-12 21:22:37 +0200 |
commit | 623ba6ae49f8e1e0958f921fa178af8a95797c1c (patch) | |
tree | fd746ff8dfc3c89e9b051b4cffdde1a5baff85ea | |
parent | 56d4680b8cf9621d7ef3e6635dc9ba4707963c8e (diff) |
Get rid of the OnRemoteKill hook, make use of GetRouting() and TR_CUSTOM to route KILLs
-rw-r--r-- | include/modules.h | 10 | ||||
-rw-r--r-- | src/commands/cmd_kill.cpp | 30 | ||||
-rw-r--r-- | src/modules.cpp | 1 | ||||
-rw-r--r-- | src/modules/m_spanningtree/main.cpp | 17 | ||||
-rw-r--r-- | src/modules/m_spanningtree/main.h | 1 | ||||
-rw-r--r-- | src/modules/m_testnet.cpp | 1 |
6 files changed, 26 insertions, 34 deletions
diff --git a/include/modules.h b/include/modules.h index a26b6e857..0c521332a 100644 --- a/include/modules.h +++ b/include/modules.h @@ -328,7 +328,7 @@ enum Implementation I_OnUserMessage, I_OnMode, I_OnGetServerDescription, I_OnSyncUser, I_OnSyncChannel, I_OnDecodeMetaData, I_OnAcceptConnection, I_OnUserInit, I_OnChangeHost, I_OnChangeName, I_OnAddLine, I_OnDelLine, I_OnExpireLine, - I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, + I_OnUserPostNick, I_OnPreMode, I_On005Numeric, I_OnKill, I_OnLoadModule, I_OnUnloadModule, I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite, I_OnRawMode, I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckChannelBan, I_OnExtBanCheck, I_OnStats, I_OnChangeLocalUserHost, I_OnPreTopicChange, @@ -861,14 +861,6 @@ class CoreExport Module : public classbase, public usecountbase */ virtual ModResult OnKill(User* source, User* dest, const std::string &reason); - /** Called when an oper wants to disconnect a remote user via KILL - * @param source The user sending the KILL - * @param dest The user being killed - * @param reason The kill reason - * @param operreason The oper kill reason - */ - virtual void OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason); - /** Called whenever a module is loaded. * mod will contain a pointer to the module, and string will contain its name, * for example m_widgets.so. This function is primary for dependency checking, diff --git a/src/commands/cmd_kill.cpp b/src/commands/cmd_kill.cpp index 04a59f60a..74024f84e 100644 --- a/src/commands/cmd_kill.cpp +++ b/src/commands/cmd_kill.cpp @@ -28,13 +28,16 @@ */ class CommandKill : public Command { + std::string lastuuid; + std::string killreason; + public: /** Constructor for kill. */ CommandKill ( Module* parent) : Command(parent,"KILL",2,2) { flags_needed = 'o'; syntax = "<nickname> <reason>"; - TRANSLATE3(TR_NICK, TR_TEXT, TR_END); + TRANSLATE3(TR_CUSTOM, TR_CUSTOM, TR_END); } /** Handle command. * @param parameters The parameters to the comamnd @@ -45,11 +48,21 @@ class CommandKill : public Command CmdResult Handle(const std::vector<std::string>& parameters, User *user); RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters) { - // local kills of remote users are routed via the OnRemoteKill hook - if (IS_LOCAL(user)) + // FindNick() doesn't work here because we quit the target user in Handle() which + // removes it from the nicklist, so we check lastuuid: if it's empty then this KILL + // was for a local user, otherwise it contains the uuid of the user who was killed. + if (lastuuid.empty()) return ROUTE_LOCALONLY; return ROUTE_BROADCAST; } + + void EncodeParameter(std::string& param, int index) + { + // Manually translate the nick -> uuid (see above), and also the reason (params[1]) + // because we decorate it if the oper is local and want remote servers to see the + // decorated reason not the original. + param = ((index == 0) ? lastuuid : killreason); + } }; /** Handle /KILL @@ -58,7 +71,11 @@ CmdResult CommandKill::Handle (const std::vector<std::string>& parameters, User { /* Allow comma seperated lists of users for /KILL (thanks w00t) */ if (CommandParser::LoopCall(user, this, parameters, 0)) - return CMD_SUCCESS; + { + // If we got a colon delimited list of nicks then the handler ran for each nick, + // and KILL commands were broadcast for remote targets. + return CMD_FAILURE; + } User *u = ServerInstance->FindNick(parameters[0]); if ((u) && (!IS_SERVER(u))) @@ -71,7 +88,6 @@ CmdResult CommandKill::Handle (const std::vector<std::string>& parameters, User * just gets processed and passed on, otherwise, if they are local, it gets prefixed. Makes sense :-) -- w00t */ - std::string killreason; if (IS_LOCAL(user)) { /* @@ -112,7 +128,7 @@ CmdResult CommandKill::Handle (const std::vector<std::string>& parameters, User { // remote kill ServerInstance->SNO->WriteToSnoMask('K', "Remote kill by %s: %s (%s)", user->nick.c_str(), u->GetFullRealHost().c_str(), parameters[1].c_str()); - FOREACH_MOD(I_OnRemoteKill, OnRemoteKill(user, u, killreason, killreason)); + this->lastuuid = u->uuid; } else { @@ -138,6 +154,8 @@ CmdResult CommandKill::Handle (const std::vector<std::string>& parameters, User ServerInstance->Config->HideKillsServer.empty() ? user->nick.c_str() : ServerInstance->Config->HideKillsServer.c_str(), parameters[1].c_str()); } + + this->lastuuid.clear(); } // send the quit out diff --git a/src/modules.cpp b/src/modules.cpp index 7f3695ade..8bd44ff68 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -125,7 +125,6 @@ ModResult Module::OnPassCompare(Extensible* ex, const std::string &password, con void Module::OnGlobalOper(User*) { } void Module::OnPostConnect(User*) { } void Module::OnUserMessage(User*, void*, int, const std::string&, char, const CUList&, MessageType) { } -void Module::OnRemoteKill(User*, User*, const std::string&, const std::string&) { } void Module::OnUserInvite(User*, User*, Channel*, time_t) { } void Module::OnPostTopicChange(User*, Channel*, const std::string&) { } void Module::OnGetServerDescription(const std::string&, std::string&) { } diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 7c698a83e..9af4bfd0c 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -76,7 +76,7 @@ void ModuleSpanningTree::init() I_OnPreCommand, I_OnGetServerDescription, I_OnUserInvite, I_OnPostTopicChange, I_OnUserMessage, I_OnBackgroundTimer, I_OnUserJoin, I_OnChangeHost, I_OnChangeName, I_OnChangeIdent, I_OnUserPart, I_OnUnloadModule, - I_OnUserQuit, I_OnUserPostNick, I_OnUserKick, I_OnRemoteKill, I_OnRehash, I_OnPreRehash, + I_OnUserQuit, I_OnUserPostNick, I_OnUserKick, I_OnRehash, I_OnPreRehash, I_OnOper, I_OnAddLine, I_OnDelLine, I_OnMode, I_OnLoadModule, I_OnStats, I_OnSetAway, I_OnPostCommand, I_OnUserConnect, I_OnAcceptConnection }; @@ -667,21 +667,6 @@ void ModuleSpanningTree::OnUserKick(User* source, Membership* memb, const std::s } } -void ModuleSpanningTree::OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason) -{ - if (!IS_LOCAL(source)) - return; // Only start routing if we're origin. - - ServerInstance->OperQuit.set(dest, operreason); - parameterlist params; - params.push_back(":"+operreason); - Utils->DoOneToMany(dest->uuid,"OPERQUIT",params); - params.clear(); - params.push_back(dest->uuid); - params.push_back(":"+reason); - Utils->DoOneToMany(source->uuid,"KILL",params); -} - void ModuleSpanningTree::OnPreRehash(User* user, const std::string ¶meter) { if (loopCall) diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 9b827a6ef..22357aed4 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -157,7 +157,6 @@ class ModuleSpanningTree : public Module void OnUserQuit(User* user, const std::string &reason, const std::string &oper_message) CXX11_OVERRIDE; void OnUserPostNick(User* user, const std::string &oldnick) CXX11_OVERRIDE; void OnUserKick(User* source, Membership* memb, const std::string &reason, CUList& excepts) CXX11_OVERRIDE; - void OnRemoteKill(User* source, User* dest, const std::string &reason, const std::string &operreason) CXX11_OVERRIDE; void OnPreRehash(User* user, const std::string ¶meter) CXX11_OVERRIDE; void OnRehash(User* user) CXX11_OVERRIDE; void OnOper(User* user, const std::string &opertype) CXX11_OVERRIDE; diff --git a/src/modules/m_testnet.cpp b/src/modules/m_testnet.cpp index d32f26a4b..4bff4b711 100644 --- a/src/modules/m_testnet.cpp +++ b/src/modules/m_testnet.cpp @@ -129,7 +129,6 @@ static void checkall(Module* noimpl) CHK(OnPreMode); CHK(On005Numeric); CHK(OnKill); - CHK(OnRemoteKill); CHK(OnLoadModule); CHK(OnUnloadModule); CHK(OnBackgroundTimer); |