X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommand_parse.cpp;h=2e20fc27f65195a2e383b5b25b4961517b4d9410;hb=490446040d80d144e64ddf8e52515df1f40f1fd7;hp=6dd4e663e04726411b63c904d201faab6d5b785f;hpb=106043620278abc0755377544cfe012c84de4abc;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/command_parse.cpp b/src/command_parse.cpp index 6dd4e663e..2e20fc27f 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * InspIRCd: (C) 2002-2010 InspIRCd Development Team * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see @@ -12,17 +12,6 @@ */ #include "inspircd.h" -#include "xline.h" -#include "socketengine.h" -#include "socket.h" -#include "command_parse.h" -#include "exitcodes.h" - -/* Directory Searching for Unix-Only */ -#ifndef WIN32 -#include -#include -#endif int InspIRCd::PassCompare(Extensible* ex, const std::string &data, const std::string &input, const std::string &hashtype) { @@ -55,11 +44,14 @@ int InspIRCd::PassCompare(Extensible* ex, const std::string &data, const std::st * The second version is much simpler and just has the one stream to read, and is used in NAMES, WHOIS, PRIVMSG etc. * Both will only parse until they reach ServerInstance->Config->MaxTargets number of targets, to stop abuse via spam. */ -int CommandParser::LoopCall(User* user, Command* CommandObj, const std::vector& parameters, unsigned int splithere, unsigned int extra) +int CommandParser::LoopCall(User* user, Command* CommandObj, const std::vector& parameters, unsigned int splithere, int extra, bool usemax) { if (splithere >= parameters.size()) return 0; + if (extra >= (signed)parameters.size()) + extra = -1; + /* First check if we have more than one item in the list, if we don't we return zero here and the handler * which called us just carries on as it was. */ @@ -75,7 +67,7 @@ int CommandParser::LoopCall(User* user, Command* CommandObj, const std::vector= 0 ? parameters[extra] : ""); std::string extrastuff; std::string item; unsigned int max = 0; @@ -84,72 +76,24 @@ int CommandParser::LoopCall(User* user, Command* CommandObj, const std::vectorConfig->MaxTargets)) + while (items1.GetToken(item) && (!usemax || max++ < ServerInstance->Config->MaxTargets)) { if (dupes.find(item.c_str()) == dupes.end()) { - std::vector new_parameters; - - for (unsigned int t = 0; (t < parameters.size()) && (t < MAXPARAMETERS); t++) - new_parameters.push_back(parameters[t]); + std::vector new_parameters(parameters); if (!items2.GetToken(extrastuff)) extrastuff = ""; - new_parameters[splithere] = item.c_str(); - new_parameters[extra] = extrastuff.c_str(); - - CommandObj->Handle(new_parameters, user); - - dupes.insert(item.c_str()); - } - } - return 1; -} - -int CommandParser::LoopCall(User* user, Command* CommandObj, const std::vector& parameters, unsigned int splithere) -{ - if (splithere >= parameters.size()) - return 0; - - /* First check if we have more than one item in the list, if we don't we return zero here and the handler - * which called us just carries on as it was. - */ - if (parameters[splithere].find(',') == std::string::npos) - return 0; - - std::set dupes; - - /* Only one commasepstream here */ - irc::commasepstream items1(parameters[splithere]); - std::string item; - unsigned int max = 0; + new_parameters[splithere] = item; + if (extra >= 0) + new_parameters[extra] = extrastuff; - /* Parse the commasepstream until there are no tokens remaining. - * Each token we parse out, call the command handler that called us - * with it - */ - while (items1.GetToken(item) && (max++ < ServerInstance->Config->MaxTargets)) - { - if (dupes.find(item.c_str()) == dupes.end()) - { - std::vector new_parameters; - - for (unsigned int t = 0; (t < parameters.size()) && (t < MAXPARAMETERS); t++) - new_parameters.push_back(parameters[t]); - - new_parameters[splithere] = item.c_str(); - - /* Execute the command handler. */ CommandObj->Handle(new_parameters, user); dupes.insert(item.c_str()); } } - /* By returning 1 we tell our caller that nothing is to be done, - * as all the previous calls handled the data. This makes the parent - * return without doing any processing. - */ return 1; } @@ -224,7 +168,7 @@ CmdResult CommandParser::CallHandler(const std::string &commandname, const std:: return CMD_INVALID; } -bool CommandParser::ProcessCommand(User *user, std::string &cmd) +bool CommandParser::ProcessCommand(LocalUser *user, std::string &cmd) { std::vector command_p; irc::tokenstream tokens(cmd); @@ -252,8 +196,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd) if (!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->GetClass()->GetPenaltyThreshold() && ((unsigned long)user->Penalty < user->GetClass()->GetPenaltyThreshold())); + user->CommandFloodPenalty += cm != cmdlist.end() ? cm->second->Penalty * 1000 : 2000; } @@ -328,8 +271,7 @@ 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(); + user->nping = ServerInstance->Time() + user->MyClass->GetPingTime(); if (cm->second->flags_needed) { @@ -340,7 +282,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; } } @@ -365,7 +308,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd) { user->WriteNumeric(ERR_NEEDMOREPARAMS, "%s %s :Not enough parameters.", user->nick.c_str(), command.c_str()); if ((ServerInstance->Config->SyntaxHints) && (user->registered == REG_ALL) && (cm->second->syntax.length())) - user->WriteNumeric(RPL_SYNTAX, "%s :SYNTAX %s %s", user->nick.c_str(), cm->second->command.c_str(), cm->second->syntax.c_str()); + user->WriteNumeric(RPL_SYNTAX, "%s :SYNTAX %s %s", user->nick.c_str(), cm->second->name.c_str(), cm->second->syntax.c_str()); return do_more; } if ((user->registered != REG_ALL) && (!cm->second->WorksBeforeReg())) @@ -396,7 +339,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd) void CommandParser::RemoveCommand(Command* x) { - Commandtable::iterator n = cmdlist.find(x->command); + Commandtable::iterator n = cmdlist.find(x->name); if (n != cmdlist.end() && n->second == x) cmdlist.erase(n); } @@ -406,28 +349,28 @@ Command::~Command() ServerInstance->Parser->RemoveCommand(this); } -bool CommandParser::ProcessBuffer(std::string &buffer,User *user) +bool CommandParser::ProcessBuffer(std::string &buffer,LocalUser *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::AddCommand(Command *f) { /* create the command and push it onto the table */ - if (cmdlist.find(f->command) == cmdlist.end()) + if (cmdlist.find(f->name) == cmdlist.end()) { - cmdlist[f->command] = f; + cmdlist[f->name] = f; return true; } return false; } -CommandParser::CommandParser() +CommandParser::CommandParser() { para.resize(128); }