]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/command_parse.cpp
Add fine-grained command flood controls
[user/henk/code/inspircd.git] / src / command_parse.cpp
index c8ca7d59e404ab8a504b8fd396f23273b796f13d..86f801d3e3c3e4023d7f25d2f66235679ede9069 100644 (file)
@@ -11,8 +11,6 @@
  * ---------------------------------------------------
  */
 
-/* $Core */
-
 #include "inspircd.h"
 #include "xline.h"
 #include "socketengine.h"
@@ -251,11 +249,10 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
 
        /* Modify the user's penalty regardless of whether or not the command exists */
        bool do_more = true;
-       if (!user->HasPrivPermission("users/flood/no-throttle"))
+       if (IS_LOCAL(user) && !user->HasPrivPermission("users/flood/no-throttle"))
        {
                // If it *doesn't* exist, give it a slightly heftier penalty than normal to deter flooding us crap
-               user->IncreasePenalty(cm != cmdlist.end() ? cm->second->Penalty : 2);
-               do_more = (user->Penalty < 10);
+               IS_LOCAL(user)->CommandFloodPenalty += cm != cmdlist.end() ? cm->second->Penalty * 1000 : 2000;
        }
 
 
@@ -330,8 +327,9 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
                return true;
 
        /* activity resets the ping pending timer */
-       if (user->MyClass)
-               user->nping = ServerInstance->Time() + user->MyClass->GetPingTime();
+       LocalUser* luser = IS_LOCAL(user);
+       if (luser)
+               luser->nping = ServerInstance->Time() + luser->MyClass->GetPingTime();
 
        if (cm->second->flags_needed)
        {
@@ -342,7 +340,8 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
                }
                if (!user->HasPermission(command))
                {
-                       user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to command %s",user->nick.c_str(),irc::Spacify(user->oper.c_str()),command.c_str());
+                       user->WriteNumeric(ERR_NOPRIVILEGES, "%s :Permission Denied - Oper type %s does not have access to command %s",
+                               user->nick.c_str(), user->oper->NameStr(), command.c_str());
                        return do_more;
                }
        }
@@ -396,24 +395,16 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd)
        }
 }
 
-void CommandParser::RemoveCommands(Module* source)
+void CommandParser::RemoveCommand(Command* x)
 {
-       Commandtable::iterator i,safei;
-       for (i = cmdlist.begin(); i != cmdlist.end();)
-       {
-               safei = i;
-               i++;
-               RemoveCommand(safei, source);
-       }
+       Commandtable::iterator n = cmdlist.find(x->command);
+       if (n != cmdlist.end() && n->second == x)
+               cmdlist.erase(n);
 }
 
-void CommandParser::RemoveCommand(Commandtable::iterator safei, Module* source)
+Command::~Command()
 {
-       Command* x = safei->second;
-       if (x->creator == source)
-       {
-               cmdlist.erase(safei);
-       }
+       ServerInstance->Parser->RemoveCommand(this);
 }
 
 bool CommandParser::ProcessBuffer(std::string &buffer,User *user)
@@ -421,12 +412,12 @@ bool CommandParser::ProcessBuffer(std::string &buffer,User *user)
        if (!user || buffer.empty())
                return true;
 
-       ServerInstance->Logs->Log("USERINPUT", DEBUG, "C[%d] I :%s %s", 
-               user->GetFd(), user->nick.c_str(), buffer.c_str());
+       ServerInstance->Logs->Log("USERINPUT", DEBUG, "C[%s] I :%s %s",
+               user->uuid.c_str(), user->nick.c_str(), buffer.c_str());
        return ProcessCommand(user,buffer);
 }
 
-bool CommandParser::CreateCommand(Command *f)
+bool CommandParser::AddCommand(Command *f)
 {
        /* create the command and push it onto the table */
        if (cmdlist.find(f->command) == cmdlist.end())
@@ -437,7 +428,7 @@ bool CommandParser::CreateCommand(Command *f)
        return false;
 }
 
-CommandParser::CommandParser() 
+CommandParser::CommandParser()
 {
        para.resize(128);
 }