diff options
-rw-r--r-- | include/modules/cap.h | 99 | ||||
-rw-r--r-- | src/modules/m_cap.cpp | 148 |
2 files changed, 0 insertions, 247 deletions
diff --git a/include/modules/cap.h b/include/modules/cap.h deleted file mode 100644 index b1bfbc3f9..000000000 --- a/include/modules/cap.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * InspIRCd -- Internet Relay Chat Daemon - * - * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org> - * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc> - * - * 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 <http://www.gnu.org/licenses/>. - */ - - -#pragma once - -#include "event.h" - -class CapEvent -{ - public: - enum CapEventType - { - CAPEVENT_REQ, - CAPEVENT_LS, - CAPEVENT_LIST, - CAPEVENT_CLEAR - }; - - CapEventType type; - std::vector<std::string> wanted; - std::vector<std::string> ack; - User* user; - CapEvent(Module* sender, User* u, CapEventType capevtype) : type(capevtype), user(u) {} -}; - -class GenericCap : public Events::ModuleEventListener -{ - bool active; - - public: - LocalIntExt ext; - const std::string cap; - GenericCap(Module* parent, const std::string& Cap) - : Events::ModuleEventListener(parent, "event/cap") - , active(true) - , ext("cap_" + Cap, ExtensionItem::EXT_USER, parent) - , cap(Cap) - { - } - - void OnCapEvent(CapEvent& ev) - { - if (!active) - return; - - CapEvent *data = static_cast<CapEvent*>(&ev); - if (data->type == CapEvent::CAPEVENT_REQ) - { - for (std::vector<std::string>::iterator it = data->wanted.begin(); it != data->wanted.end(); ++it) - { - if (it->empty()) - continue; - bool enablecap = ((*it)[0] != '-'); - if (((enablecap) && (*it == cap)) || (*it == "-" + cap)) - { - // we can handle this, so ACK it, and remove it from the wanted list - data->ack.push_back(*it); - data->wanted.erase(it); - ext.set(data->user, enablecap ? 1 : 0); - break; - } - } - } - else if (data->type == CapEvent::CAPEVENT_LS) - { - data->wanted.push_back(cap); - } - else if (data->type == CapEvent::CAPEVENT_LIST) - { - if (ext.get(data->user)) - data->wanted.push_back(cap); - } - else if (data->type == CapEvent::CAPEVENT_CLEAR) - { - data->ack.push_back("-" + cap); - ext.set(data->user, 0); - } - } - - void SetActive(bool newstate) { active = newstate; } - bool IsActive() const { return active; } -}; diff --git a/src/modules/m_cap.cpp b/src/modules/m_cap.cpp deleted file mode 100644 index 2c2178a18..000000000 --- a/src/modules/m_cap.cpp +++ /dev/null @@ -1,148 +0,0 @@ -/* - * InspIRCd -- Internet Relay Chat Daemon - * - * Copyright (C) 2009 Daniel De Graaf <danieldg@inspircd.org> - * Copyright (C) 2008 Craig Edwards <craigedwards@brainbox.cc> - * - * 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 <http://www.gnu.org/licenses/>. - */ - - -#include "inspircd.h" -#include "modules/cap.h" - -/* -CAP LS -:alfred.staticbox.net CAP * LS :multi-prefix sasl -CAP REQ :multi-prefix -:alfred.staticbox.net CAP * ACK :multi-prefix -CAP CLEAR -:alfred.staticbox.net CAP * ACK :-multi-prefix -CAP REQ :multi-prefix -:alfred.staticbox.net CAP * ACK :multi-prefix -CAP LIST -:alfred.staticbox.net CAP * LIST :multi-prefix -CAP END -*/ - -/** Handle /CAP - */ -class CommandCAP : public Command -{ - Events::ModuleEventProvider capevprov; - - public: - LocalIntExt reghold; - CommandCAP (Module* mod) : Command(mod, "CAP", 1), - capevprov(mod, "event/cap"), - reghold("CAP_REGHOLD", ExtensionItem::EXT_USER, mod) - { - works_before_reg = true; - } - - CmdResult Handle (const std::vector<std::string> ¶meters, User *user) - { - std::string subcommand(parameters[0].length(), ' '); - std::transform(parameters[0].begin(), parameters[0].end(), subcommand.begin(), ::toupper); - - if (subcommand == "REQ") - { - if (parameters.size() < 2) - return CMD_FAILURE; - - CapEvent Data(creator, user, CapEvent::CAPEVENT_REQ); - - // tokenize the input into a nice list of requested caps - std::string cap_; - irc::spacesepstream cap_stream(parameters[1]); - - while (cap_stream.GetToken(cap_)) - { - std::transform(cap_.begin(), cap_.end(), cap_.begin(), ::tolower); - Data.wanted.push_back(cap_); - } - - reghold.set(user, 1); - FOREACH_MOD_CUSTOM(capevprov, GenericCap, OnCapEvent, (Data)); - - if (Data.ack.size() > 0) - { - std::string AckResult = irc::stringjoiner(Data.ack); - user->WriteCommand("CAP", "ACK :" + AckResult); - } - - if (Data.wanted.size() > 0) - { - std::string NakResult = irc::stringjoiner(Data.wanted); - user->WriteCommand("CAP", "NAK :" + NakResult); - } - } - else if (subcommand == "END") - { - reghold.set(user, 0); - } - else if ((subcommand == "LS") || (subcommand == "LIST")) - { - CapEvent Data(creator, user, subcommand == "LS" ? CapEvent::CAPEVENT_LS : CapEvent::CAPEVENT_LIST); - - reghold.set(user, 1); - FOREACH_MOD_CUSTOM(capevprov, GenericCap, OnCapEvent, (Data)); - - std::string Result = irc::stringjoiner(Data.wanted); - user->WriteCommand("CAP", subcommand + " :" + Result); - } - else if (subcommand == "CLEAR") - { - CapEvent Data(creator, user, CapEvent::CAPEVENT_CLEAR); - - reghold.set(user, 1); - FOREACH_MOD_CUSTOM(capevprov, GenericCap, OnCapEvent, (Data)); - - std::string Result = irc::stringjoiner(Data.ack); - user->WriteCommand("CAP", "ACK :" + Result); - } - else - { - user->WriteNumeric(ERR_INVALIDCAPSUBCOMMAND, "%s :Invalid CAP subcommand", subcommand.c_str()); - return CMD_FAILURE; - } - - return CMD_SUCCESS; - } -}; - -class ModuleCAP : public Module -{ - CommandCAP cmd; - public: - ModuleCAP() - : cmd(this) - { - } - - ModResult OnCheckReady(LocalUser* user) CXX11_OVERRIDE - { - /* Users in CAP state get held until CAP END */ - if (cmd.reghold.get(user)) - return MOD_RES_DENY; - - return MOD_RES_PASSTHRU; - } - - Version GetVersion() CXX11_OVERRIDE - { - return Version("Client CAP extension support", VF_VENDOR); - } -}; - -MODULE_INIT(ModuleCAP) |