/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2014 Attila Molnar <attilamolnar@hush.com>
+ * Copyright (C) 2017-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2014-2016, 2018 Attila Molnar <attilamolnar@hush.com>
*
* 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
#include "inspircd.h"
#include "core_user.h"
-class CommandMode : public Command
-{
- public:
- /** Constructor for mode.
- */
- CommandMode(Module* parent)
- : Command(parent, "MODE", 1)
- {
- syntax = "<target> <modes> {<mode-parameters>}";
- }
-
- /** Handle command.
- * @param parameters The parameters to the command
- * @param user The user issuing the command
- * @return A value from CmdResult to indicate command success or failure.
- */
- CmdResult Handle(const std::vector<std::string>& parameters, User* user)
- {
- ServerInstance->Modes->Process(parameters, user, (IS_LOCAL(user) ? ModeParser::MODE_NONE : ModeParser::MODE_LOCALONLY));
- return CMD_SUCCESS;
- }
-
- RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
- {
- return (IS_LOCAL(user) ? ROUTE_LOCALONLY : ROUTE_BROADCAST);
- }
-};
-
/** Handle /PASS.
*/
class CommandPass : public SplitCommand
* @param user The user issuing the command
* @return A value from CmdResult to indicate command success or failure.
*/
- CmdResult HandleLocal(const std::vector<std::string>& parameters, LocalUser *user)
+ CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
{
// Check to make sure they haven't registered -- Fix by FCS
if (user->registered == REG_ALL)
{
- user->WriteNumeric(ERR_ALREADYREGISTERED, ":You may not reregister");
+ user->CommandFloodPenalty += 1000;
+ user->WriteNumeric(ERR_ALREADYREGISTERED, "You may not reregister");
return CMD_FAILURE;
}
user->password = parameters[0];
/** Handle /PING.
*/
-class CommandPing : public Command
+class CommandPing : public SplitCommand
{
public:
/** Constructor for ping.
*/
CommandPing(Module* parent)
- : Command(parent, "PING", 1, 2)
+ : SplitCommand(parent, "PING", 1)
{
- Penalty = 0;
- syntax = "<servername> [:<servername>]";
+ syntax = "<cookie> [<servername>]";
}
/** Handle command.
* @param user The user issuing the command
* @return A value from CmdResult to indicate command success or failure.
*/
- CmdResult Handle(const std::vector<std::string>& parameters, User* user)
+ CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
{
- user->WriteServ("PONG %s :%s", ServerInstance->Config->ServerName.c_str(), parameters[0].c_str());
+ size_t origin = parameters.size() > 1 ? 1 : 0;
+ if (parameters[origin].empty())
+ {
+ user->WriteNumeric(ERR_NOORIGIN, "No origin specified");
+ return CMD_FAILURE;
+ }
+
+ ClientProtocol::Messages::Pong pong(parameters[0], origin ? parameters[1] : ServerInstance->Config->GetServerName());
+ user->Send(ServerInstance->GetRFCEvents().pong, pong);
return CMD_SUCCESS;
}
};
/** Constructor for pong.
*/
CommandPong(Module* parent)
- : Command(parent, "PONG", 0, 1)
+ : Command(parent, "PONG", 1)
{
Penalty = 0;
- syntax = "<ping-text>";
+ syntax = "<cookie> [<servername>]";
}
/** Handle command.
* @param user The user issuing the command
* @return A value from CmdResult to indicate command success or failure.
*/
- CmdResult Handle(const std::vector<std::string>& parameters, User* user)
+ CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
{
+ size_t origin = parameters.size() > 1 ? 1 : 0;
+ if (parameters[origin].empty())
+ {
+ user->WriteNumeric(ERR_NOORIGIN, "No origin specified");
+ return CMD_FAILURE;
+ }
+
// set the user as alive so they survive to next ping
- if (IS_LOCAL(user))
- IS_LOCAL(user)->lastping = 1;
+ LocalUser* localuser = IS_LOCAL(user);
+ if (localuser)
+ {
+ // Increase penalty unless we've sent a PING and this is the reply
+ if (localuser->lastping)
+ localuser->CommandFloodPenalty += 1000;
+ else
+ localuser->lastping = 1;
+ }
return CMD_SUCCESS;
}
};
+void MessageWrapper::Wrap(const std::string& message, std::string& out)
+{
+ // If there is a fixed message, it is stored in prefix. Otherwise prefix contains
+ // only the prefix, so append the message and the suffix
+ out.assign(prefix);
+ if (!fixed)
+ out.append(message).append(suffix);
+}
+
+void MessageWrapper::ReadConfig(const char* prefixname, const char* suffixname, const char* fixedname)
+{
+ ConfigTag* tag = ServerInstance->Config->ConfValue("options");
+ prefix = tag->getString(fixedname);
+ fixed = (!prefix.empty());
+ if (!fixed)
+ {
+ prefix = tag->getString(prefixname);
+ suffix = tag->getString(suffixname);
+ }
+}
+
class CoreModUser : public Module
{
CommandAway cmdaway;
- CommandMode cmdmode;
CommandNick cmdnick;
CommandPart cmdpart;
CommandPass cmdpass;
CommandPong cmdpong;
CommandQuit cmdquit;
CommandUser cmduser;
+ CommandIson cmdison;
+ CommandUserhost cmduserhost;
+ SimpleUserModeHandler invisiblemode;
+ ModeUserOperator operatormode;
+ ModeUserServerNoticeMask snomaskmode;
public:
CoreModUser()
- : cmdaway(this), cmdmode(this), cmdnick(this), cmdpart(this), cmdpass(this), cmdping(this)
- , cmdpong(this), cmdquit(this), cmduser(this)
+ : cmdaway(this)
+ , cmdnick(this)
+ , cmdpart(this)
+ , cmdpass(this)
+ , cmdping(this)
+ , cmdpong(this)
+ , cmdquit(this)
+ , cmduser(this)
+ , cmdison(this)
+ , cmduserhost(this)
+ , invisiblemode(this, "invisible", 'i')
+ , operatormode(this)
+ , snomaskmode(this)
+ {
+ }
+
+ void ReadConfig(ConfigStatus& status) CXX11_OVERRIDE
{
+ cmdpart.msgwrap.ReadConfig("prefixpart", "suffixpart", "fixedpart");
+ cmdquit.msgwrap.ReadConfig("prefixquit", "suffixquit", "fixedquit");
}
Version GetVersion() CXX11_OVERRIDE
{
- return Version("Provides the AWAY, MODE, NICK, PART, PASS, PING, PONG, QUIT and USER commands", VF_VENDOR|VF_CORE);
+ return Version("Provides the AWAY, ISON, NICK, PART, PASS, PING, PONG, QUIT, USERHOST, and USER commands", VF_VENDOR|VF_CORE);
}
};