X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcommand_parse.cpp;h=0bf8e0e0a9f1a0b56ef7e489811aeb515f614e30;hb=bb3aa2fb37071f48a5312df8688c0a6990644fbb;hp=8d5bcbee41d59a8cdaf7dc861141d4e07d1de55d;hpb=e8c617b7749a18b353290471491e23b0573ebd7c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/command_parse.cpp b/src/command_parse.cpp index 8d5bcbee4..0bf8e0e0a 100644 --- a/src/command_parse.cpp +++ b/src/command_parse.cpp @@ -1,28 +1,27 @@ -/* +------------------------------------+ - * | Inspire Internet Relay Chat Daemon | - * +------------------------------------+ +/* + * InspIRCd -- Internet Relay Chat Daemon * - * InspIRCd: (C) 2002-2010 InspIRCd Development Team - * See: http://wiki.inspircd.org/Credits + * Copyright (C) 2009-2010 Daniel De Graaf + * Copyright (C) 2006-2008 Robin Burchell + * Copyright (C) 2008 Thomas Stagner + * Copyright (C) 2005-2008 Craig Edwards + * Copyright (C) 2006-2007 Dennis Friis * - * This program is free but copyrighted software; see - * the file COPYING for details. + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. * - * --------------------------------------------------- + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ + #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) { @@ -38,7 +37,7 @@ int InspIRCd::PassCompare(Extensible* ex, const std::string &data, const std::st return 1; /* We dont handle any hash types except for plaintext - Thanks tra26 */ - if (hashtype != "" && hashtype != "plaintext") + if (!hashtype.empty() && hashtype != "plaintext") /* See below. 1 because they dont match */ return 1; @@ -94,7 +93,7 @@ int CommandParser::LoopCall(User* user, Command* CommandObj, const std::vector new_parameters(parameters); if (!items2.GetToken(extrastuff)) - extrastuff = ""; + extrastuff.clear(); new_parameters[splithere] = item; if (extra >= 0) @@ -149,6 +148,9 @@ CmdResult CommandParser::CallHandler(const std::string &commandname, const std:: if (n != cmdlist.end()) { + if ((!parameters.empty()) && (parameters.back().empty()) && (!n->second->allow_empty_last_param)) + return CMD_INVALID; + if (parameters.size() >= n->second->min_params) { bool bOkay = false; @@ -179,7 +181,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); @@ -204,10 +206,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 (IS_LOCAL(user) && !user->HasPrivPermission("users/flood/no-throttle")) + 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 - IS_LOCAL(user)->CommandFloodPenalty += cm != cmdlist.end() ? cm->second->Penalty * 1000 : 2000; + user->CommandFloodPenalty += cm != cmdlist.end() ? cm->second->Penalty * 1000 : 2000; } @@ -244,7 +246,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd) * a * test */ - std::string lparam = ""; + std::string lparam; /* * The '-1' here is a clever trick, we'll go backwards throwing everything into a temporary param @@ -282,9 +284,7 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd) return true; /* activity resets the ping pending timer */ - LocalUser* luser = IS_LOCAL(user); - if (luser) - luser->nping = ServerInstance->Time() + luser->MyClass->GetPingTime(); + user->nping = ServerInstance->Time() + user->MyClass->GetPingTime(); if (cm->second->flags_needed) { @@ -317,6 +317,10 @@ bool CommandParser::ProcessCommand(User *user, std::string &cmd) command.c_str(), user->nick.c_str(), user->ident.c_str(), user->host.c_str()); return do_more; } + + if ((!command_p.empty()) && (command_p.back().empty()) && (!cm->second->allow_empty_last_param)) + command_p.pop_back(); + if (command_p.size() < cm->second->min_params) { user->WriteNumeric(ERR_NEEDMOREPARAMS, "%s %s :Not enough parameters.", user->nick.c_str(), command.c_str()); @@ -362,12 +366,12 @@ 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[%s] I :%s %s", + ServerInstance->Logs->Log("USERINPUT", RAWIO, "C[%s] I :%s %s", user->uuid.c_str(), user->nick.c_str(), buffer.c_str()); return ProcessCommand(user,buffer); }