aboutsummaryrefslogtreecommitdiff
path: root/src/command_parse.cpp
diff options
context:
space:
mode:
authorGravatar Sadie Powell2020-02-04 12:26:25 +0000
committerGravatar Sadie Powell2020-02-04 12:26:25 +0000
commit6da4987073aad99061360bc54022e342e3a0f555 (patch)
treed4e8cca5270013eed9915fe740f346cd6890a7c4 /src/command_parse.cpp
parentVarious CI improvements. (diff)
parentInclude the ABI version with the incompatible module error message. (diff)
Merge branch 'insp3' into master.
Diffstat (limited to 'src/command_parse.cpp')
-rw-r--r--src/command_parse.cpp28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/command_parse.cpp b/src/command_parse.cpp
index 706566199..0405a5659 100644
--- a/src/command_parse.cpp
+++ b/src/command_parse.cpp
@@ -1,7 +1,7 @@
/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2014, 2017-2019 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2014, 2017-2020 Sadie Powell <sadie@witchery.services>
* Copyright (C) 2012-2016, 2018 Attila Molnar <attilamolnar@hush.com>
* Copyright (C) 2012 Robby <robby@chatbelgie.be>
* Copyright (C) 2009-2010 Daniel De Graaf <danieldg@inspircd.org>
@@ -80,29 +80,28 @@ bool CommandParser::LoopCall(User* user, Command* handler, const CommandBase::Pa
* for every parameter or parameter pair until there are no more
* left to parse.
*/
+ CommandBase::Params splitparams(parameters);
while (items1.GetToken(item) && (!usemax || max++ < ServerInstance->Config->MaxTargets))
{
if ((!check_dupes) || (dupes.insert(item).second))
{
- CommandBase::Params new_parameters(parameters);
- new_parameters[splithere] = item;
+ splitparams[splithere] = item;
if (extra >= 0)
{
// If we have two lists then get the next item from the second list.
// In case it runs out of elements then 'item' will be an empty string.
items2.GetToken(item);
- new_parameters[extra] = item;
+ splitparams[extra] = item;
}
- CommandBase::Params params(new_parameters, parameters.GetTags());
- CmdResult result = handler->Handle(user, params);
+ CmdResult result = handler->Handle(user, splitparams);
if (localuser)
{
// Run the OnPostCommand hook with the last parameter being true to indicate
// that the event is being called in a loop.
item.clear();
- FOREACH_MOD(OnPostCommand, (handler, new_parameters, localuser, result, true));
+ FOREACH_MOD(OnPostCommand, (handler, splitparams, localuser, result, true));
}
}
}
@@ -191,7 +190,10 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
ModResult MOD_RESULT;
FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, false));
if (MOD_RESULT == MOD_RES_DENY)
+ {
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
+ }
/*
* This double lookup is in case a module (abbreviation) wishes to change a command.
@@ -205,7 +207,9 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
{
if (user->registered == REG_ALL)
user->WriteNumeric(ERR_UNKNOWNCOMMAND, command, "Unknown command");
+
ServerInstance->stats.Unknown++;
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
}
}
@@ -245,7 +249,10 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
ModResult MOD_RESULT;
FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, false));
if (MOD_RESULT == MOD_RES_DENY)
+ {
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
+ }
/* activity resets the ping pending timer */
user->nextping = ServerInstance->Time() + user->MyClass->GetPingTime();
@@ -256,6 +263,7 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
{
user->CommandFloodPenalty += failpenalty;
user->WriteNumeric(ERR_NOPRIVILEGES, "Permission Denied - You do not have the required operator privileges");
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
}
@@ -264,6 +272,7 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
user->CommandFloodPenalty += failpenalty;
user->WriteNumeric(ERR_NOPRIVILEGES, InspIRCd::Format("Permission Denied - Oper type %s does not have access to command %s",
user->oper->name.c_str(), command.c_str()));
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
}
}
@@ -277,6 +286,7 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
user->WriteNumeric(ERR_NEEDMOREPARAMS, command, "Not enough parameters.");
if ((ServerInstance->Config->SyntaxHints) && (user->registered == REG_ALL) && (handler->syntax.length()))
user->WriteNumeric(RPL_SYNTAX, handler->name, handler->syntax);
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
}
@@ -284,6 +294,7 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
{
user->CommandFloodPenalty += failpenalty;
user->WriteNumeric(ERR_NOTREGISTERED, command, "You have not registered");
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
}
else
{
@@ -293,7 +304,10 @@ void CommandParser::ProcessCommand(LocalUser* user, std::string& command, Comman
/* module calls too */
FIRST_MOD_RESULT(OnPreCommand, MOD_RESULT, (command, command_p, user, true));
if (MOD_RESULT == MOD_RES_DENY)
+ {
+ FOREACH_MOD(OnCommandBlocked, (command, command_p, user));
return;
+ }
/*
* WARNING: be careful, the user may be deleted soon