/*
* InspIRCd -- Internet Relay Chat Daemon
*
- * Copyright (C) 2014 Attila Molnar <attilamolnar@hush.com>
- * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org>
- * Copyright (C) 2007 Robin Burchell <robin+git@viroteck.net>
+ * Copyright (C) 2019 Robby <robby@chatbelgie.be>
+ * Copyright (C) 2017-2020 Sadie Powell <sadie@witchery.services>
+ * Copyright (C) 2014-2016 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"
+enum
+{
+ // From RFC 1459.
+ ERR_SUMMONDISABLED = 445,
+ ERR_USERSDISABLED = 446
+};
+
+class CommandCapab : public Command
+{
+ public:
+ CommandCapab(Module* parent)
+ : Command(parent, "CAPAB")
+ {
+ works_before_reg = true;
+ }
+
+ CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE
+ {
+ if (user->registered == REG_NONE)
+ {
+ // The CAPAB command is used in the server protocol for negotiating
+ // the protocol version when initiating a server connection. There
+ // is no legitimate reason for a user to send this so we disconnect
+ // users who sent it in order to help out server admins who have
+ // misconfigured their server.
+ ServerInstance->Users->QuitUser(user, "You can not connect a server to a client port. Read " INSPIRCD_DOCS "modules/spanningtree for docs on how to link a server.");
+ }
+ return CMD_FAILURE;
+ }
+};
/** Handle /CONNECT.
*/
: Command(parent, "CONNECT", 1)
{
flags_needed = 'o';
- syntax = "<servername>";
+ syntax = "<servermask>";
}
/** 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
{
/*
* This is handled by the server linking module, if necessary. Do not remove this stub.
* @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
{
- user->WriteNumeric(RPL_LINKS, ServerInstance->Config->ServerName, ServerInstance->Config->ServerName, InspIRCd::Format("0 %s", ServerInstance->Config->ServerDesc.c_str()));
+ user->WriteNumeric(RPL_LINKS, ServerInstance->Config->GetServerName(), ServerInstance->Config->GetServerName(), InspIRCd::Format("0 %s", ServerInstance->Config->GetServerDesc().c_str()));
user->WriteNumeric(RPL_ENDOFLINKS, '*', "End of /LINKS list.");
return CMD_SUCCESS;
}
};
-/** Handle /SERVER.
+/** Handle /SQUIT.
*/
-class CommandServer : public Command
+class CommandSquit : public Command
{
public:
- /** Constructor for server.
+ /** Constructor for squit.
*/
- CommandServer(Module* parent)
- : Command(parent, "SERVER")
+ CommandSquit(Module* parent)
+ : Command(parent, "SQUIT", 1, 2)
{
- works_before_reg = true;
+ flags_needed = 'o';
+ syntax = "<servermask>";
}
/** 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
{
- if (user->registered == REG_ALL)
- {
- user->WriteNumeric(ERR_ALREADYREGISTERED, "You are already registered. (Perhaps your IRC client does not have a /SERVER command).");
- }
- else
- {
- user->WriteNumeric(ERR_NOTREGISTERED, "SERVER", "You may not register as a server (servers have separate ports from clients, change your config)");
- }
+ user->WriteNotice("Look into loading a linking module (like m_spanningtree) if you want this to do anything useful.");
return CMD_FAILURE;
}
};
-/** Handle /SQUIT.
- */
-class CommandSquit : public Command
+class CommandSummon
+ : public SplitCommand
{
public:
- /** Constructor for squit.
- */
- CommandSquit(Module* parent)
- : Command(parent, "SQUIT", 1, 2)
+ CommandSummon(Module* Creator)
+ : SplitCommand(Creator, "SUMMON", 1)
{
- flags_needed = 'o';
- syntax = "<servername>";
}
- /** 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)
+ CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
{
- user->WriteNotice("Look into loading a linking module (like m_spanningtree) if you want this to do anything useful.");
- return CMD_FAILURE;
+ user->WriteNumeric(ERR_SUMMONDISABLED, "SUMMON has been disabled");
+ return CMD_SUCCESS;
+ }
+};
+
+class CommandUsers
+ : public SplitCommand
+{
+ public:
+ CommandUsers(Module* Creator)
+ : SplitCommand(Creator, "USERS")
+ {
+ }
+
+ CmdResult HandleLocal(LocalUser* user, const Params& parameters) CXX11_OVERRIDE
+ {
+ user->WriteNumeric(ERR_USERSDISABLED, "USERS has been disabled");
+ return CMD_SUCCESS;
}
};
class CoreModStub : public Module
{
+ private:
+ CommandCapab cmdcapab;
CommandConnect cmdconnect;
CommandLinks cmdlinks;
- CommandServer cmdserver;
CommandSquit cmdsquit;
+ CommandSummon cmdsummon;
+ CommandUsers cmdusers;
public:
CoreModStub()
- : cmdconnect(this), cmdlinks(this), cmdserver(this), cmdsquit(this)
+ : cmdcapab(this)
+ , cmdconnect(this)
+ , cmdlinks(this)
+ , cmdsquit(this)
+ , cmdsummon(this)
+ , cmdusers(this)
{
}
- Version GetVersion()
+ Version GetVersion() CXX11_OVERRIDE
{
- return Version("Provides the stub commands CONNECT, LINKS, SERVER and SQUIT", VF_VENDOR|VF_CORE);
+ return Version("Provides stubs for unimplemented commands", VF_VENDOR|VF_CORE);
}
};