summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-03-02 09:57:48 +0000
committerbrain <brain@e03df62e-2008-0410-955e-edbf42e46eb7>2006-03-02 09:57:48 +0000
commit18c757067c0a9e5c1aa81496dca8428a0bf3635f (patch)
tree4391711a1e206ba168c5bcb69bdeee79069a8510 /src
parent86499a92b6ede0fc80ee36e14a2a248a088e5e43 (diff)
Changed definition of CallHandler and CallCommandHandler for the ability to return false on bad command.
This allows us to terminate server links that send commands we dont know (e.g. admin loads module A after linking, we dont have module A, when it sends module A's command, abort) git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@3414 e03df62e-2008-0410-955e-edbf42e46eb7
Diffstat (limited to 'src')
-rw-r--r--src/command_parse.cpp12
-rw-r--r--src/modules.cpp4
-rw-r--r--src/modules/m_spanningtree.cpp6
3 files changed, 12 insertions, 10 deletions
diff --git a/src/command_parse.cpp b/src/command_parse.cpp
index 18915b819..77fef66d7 100644
--- a/src/command_parse.cpp
+++ b/src/command_parse.cpp
@@ -288,7 +288,7 @@ bool CommandParser::IsValidCommand(std::string &commandname, int pcnt, userrec *
// calls a handler function for a command
-void CommandParser::CallHandler(std::string &commandname,char **parameters, int pcnt, userrec *user)
+bool CommandParser::CallHandler(std::string &commandname,char **parameters, int pcnt, userrec *user)
{
nspace::hash_map<std::string,command_t*>::iterator n = cmdlist.find(commandname);
@@ -300,23 +300,21 @@ void CommandParser::CallHandler(std::string &commandname,char **parameters, int
{
if (n->second->flags_needed)
{
- if ((user->HasPermission(commandname)) || (is_uline(user->server)))
+ if ((user->HasPermission(commandname)) || (!IS_LOCAL(user)))
{
n->second->Handle(parameters,pcnt,user);
- }
- else
- {
- if (!IS_LOCAL(user))
- WriteOpers("*** \2WARNING\2: Command '%s' not allowed for oper '%s', dropped.",commandname.c_str(),user->nick);
+ return true;
}
}
else
{
n->second->Handle(parameters,pcnt,user);
+ return true;
}
}
}
}
+ return false;
}
int CommandParser::ProcessParameters(char **command_p,char *parameters)
diff --git a/src/modules.cpp b/src/modules.cpp
index 9b6a0d826..64a61c1b0 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -486,9 +486,9 @@ bool Server::IsUlined(std::string server)
return is_uline(server.c_str());
}
-void Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
+bool Server::CallCommandHandler(std::string commandname, char** parameters, int pcnt, userrec* user)
{
- ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user);
+ return ServerInstance->Parser->CallHandler(commandname,parameters,pcnt,user);
}
bool Server::IsValidModuleCommand(std::string commandname, int pcnt, userrec* user)
diff --git a/src/modules/m_spanningtree.cpp b/src/modules/m_spanningtree.cpp
index b33e28af8..f927ac044 100644
--- a/src/modules/m_spanningtree.cpp
+++ b/src/modules/m_spanningtree.cpp
@@ -2513,7 +2513,11 @@ class TreeSocket : public InspSocket
{
strparams[q] = (char*)params[q].c_str();
}
- Srv->CallCommandHandler(command.c_str(), strparams, params.size(), who);
+ if (!Srv->CallCommandHandler(command.c_str(), strparams, params.size(), who))
+ {
+ this->WriteLine("ERROR :Unrecognised command -- possibly loaded mismatched modules");
+ return false;
+ }
}
else
{