From d31619714b0a55ea9330d34f35480d4ae7f8f055 Mon Sep 17 00:00:00 2001 From: Florent Le Coz Date: Mon, 2 Mar 2015 11:04:55 +0100 Subject: Move non-specific adhoc commands into louloulibs Only keep some biboumi-specific commands into biboumi_adhoc_commands.hpp/cpp --- src/xmpp/adhoc_command.cpp | 216 ------------------------------------ src/xmpp/adhoc_command.hpp | 45 -------- src/xmpp/biboumi_adhoc_commands.cpp | 111 ++++++++++++++++++ src/xmpp/biboumi_adhoc_commands.hpp | 13 +++ src/xmpp/biboumi_component.cpp | 1 + 5 files changed, 125 insertions(+), 261 deletions(-) delete mode 100644 src/xmpp/adhoc_command.cpp delete mode 100644 src/xmpp/adhoc_command.hpp create mode 100644 src/xmpp/biboumi_adhoc_commands.cpp create mode 100644 src/xmpp/biboumi_adhoc_commands.hpp (limited to 'src/xmpp') diff --git a/src/xmpp/adhoc_command.cpp b/src/xmpp/adhoc_command.cpp deleted file mode 100644 index ba20eba..0000000 --- a/src/xmpp/adhoc_command.cpp +++ /dev/null @@ -1,216 +0,0 @@ -#include -#include - -#include - -#include - -using namespace std::string_literals; - -AdhocCommand::AdhocCommand(std::vector&& callbacks, const std::string& name, const bool admin_only): - name(name), - callbacks(std::move(callbacks)), - admin_only(admin_only) -{ -} - -AdhocCommand::~AdhocCommand() -{ -} - -bool AdhocCommand::is_admin_only() const -{ - return this->admin_only; -} - -void PingStep1(XmppComponent*, AdhocSession&, XmlNode& command_node) -{ - XmlNode note("note"); - note["type"] = "info"; - note.set_inner("Pong"); - note.close(); - command_node.add_child(std::move(note)); -} - -void HelloStep1(XmppComponent*, AdhocSession&, XmlNode& command_node) -{ - XmlNode x("jabber:x:data:x"); - x["type"] = "form"; - XmlNode title("title"); - title.set_inner("Configure your name."); - title.close(); - x.add_child(std::move(title)); - XmlNode instructions("instructions"); - instructions.set_inner("Please provide your name."); - instructions.close(); - x.add_child(std::move(instructions)); - XmlNode name_field("field"); - name_field["var"] = "name"; - name_field["type"] = "text-single"; - name_field["label"] = "Your name"; - XmlNode required("required"); - required.close(); - name_field.add_child(std::move(required)); - name_field.close(); - x.add_child(std::move(name_field)); - x.close(); - command_node.add_child(std::move(x)); -} - -void HelloStep2(XmppComponent*, AdhocSession& session, XmlNode& command_node) -{ - // Find out if the name was provided in the form. - XmlNode* x = command_node.get_child("x", "jabber:x:data"); - if (x) - { - XmlNode* name_field = nullptr; - for (XmlNode* field: x->get_children("field", "jabber:x:data")) - if (field->get_tag("var") == "name") - { - name_field = field; - break; - } - if (name_field) - { - XmlNode* value = name_field->get_child("value", "jabber:x:data"); - if (value) - { - XmlNode note("note"); - note["type"] = "info"; - note.set_inner("Hello "s + value->get_inner() + "!"s); - note.close(); - command_node.delete_all_children(); - command_node.add_child(std::move(note)); - return; - } - } - } - command_node.delete_all_children(); - XmlNode error(ADHOC_NS":error"); - error["type"] = "modify"; - XmlNode condition(STANZA_NS":bad-request"); - condition.close(); - error.add_child(std::move(condition)); - error.close(); - command_node.add_child(std::move(error)); - session.terminate(); -} - -void DisconnectUserStep1(XmppComponent* xmpp_component, AdhocSession&, XmlNode& command_node) -{ - auto biboumi_component = static_cast(xmpp_component); - - XmlNode x("jabber:x:data:x"); - x["type"] = "form"; - XmlNode title("title"); - title.set_inner("Disconnect a user from the gateway"); - title.close(); - x.add_child(std::move(title)); - XmlNode instructions("instructions"); - instructions.set_inner("Choose a user JID and a quit message"); - instructions.close(); - x.add_child(std::move(instructions)); - XmlNode jids_field("field"); - jids_field["var"] = "jids"; - jids_field["type"] = "list-multi"; - jids_field["label"] = "The JIDs to disconnect"; - XmlNode required("required"); - required.close(); - jids_field.add_child(std::move(required)); - for (Bridge* bridge: biboumi_component->get_bridges()) - { - XmlNode option("option"); - option["label"] = bridge->get_jid(); - XmlNode value("value"); - value.set_inner(bridge->get_jid()); - value.close(); - option.add_child(std::move(value)); - option.close(); - jids_field.add_child(std::move(option)); - } - jids_field.close(); - x.add_child(std::move(jids_field)); - - XmlNode message_field("field"); - message_field["var"] = "quit-message"; - message_field["type"] = "text-single"; - message_field["label"] = "Quit message"; - XmlNode message_value("value"); - message_value.set_inner("Disconnected by admin"); - message_value.close(); - message_field.add_child(std::move(message_value)); - message_field.close(); - x.add_child(std::move(message_field)); - x.close(); - command_node.add_child(std::move(x)); -} - -void DisconnectUserStep2(XmppComponent* xmpp_component, AdhocSession& session, XmlNode& command_node) -{ - auto biboumi_component = static_cast(xmpp_component); - - // Find out if the jids, and the quit message are provided in the form. - std::string quit_message; - XmlNode* x = command_node.get_child("x", "jabber:x:data"); - if (x) - { - XmlNode* message_field = nullptr; - XmlNode* jids_field = nullptr; - for (XmlNode* field: x->get_children("field", "jabber:x:data")) - if (field->get_tag("var") == "jids") - jids_field = field; - else if (field->get_tag("var") == "quit-message") - message_field = field; - if (message_field) - { - XmlNode* value = message_field->get_child("value", "jabber:x:data"); - if (value) - quit_message = value->get_inner(); - } - if (jids_field) - { - std::size_t num = 0; - for (XmlNode* value: jids_field->get_children("value", "jabber:x:data")) - { - Bridge* bridge = biboumi_component->find_user_bridge(value->get_inner()); - if (bridge) - { - bridge->shutdown(quit_message); - num++; - } - } - command_node.delete_all_children(); - - XmlNode note("note"); - note["type"] = "info"; - if (num == 0) - note.set_inner("No user were disconnected."); - else if (num == 1) - note.set_inner("1 user has been disconnected."); - else - note.set_inner(std::to_string(num) + " users have been disconnected."); - note.close(); - command_node.add_child(std::move(note)); - return; - } - } - XmlNode error(ADHOC_NS":error"); - error["type"] = "modify"; - XmlNode condition(STANZA_NS":bad-request"); - condition.close(); - error.add_child(std::move(condition)); - error.close(); - command_node.add_child(std::move(error)); - session.terminate(); -} - -void Reload(XmppComponent*, AdhocSession&, XmlNode& command_node) -{ - ::reload_process(); - command_node.delete_all_children(); - XmlNode note("note"); - note["type"] = "info"; - note.set_inner("Configuration reloaded."); - note.close(); - command_node.add_child(std::move(note)); -} diff --git a/src/xmpp/adhoc_command.hpp b/src/xmpp/adhoc_command.hpp deleted file mode 100644 index 622d6b9..0000000 --- a/src/xmpp/adhoc_command.hpp +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef ADHOC_COMMAND_HPP -# define ADHOC_COMMAND_HPP - -/** - * Describe an ad-hoc command. - * - * Can only have zero or one step for now. When execution is requested, it - * can return a result immediately, or provide a form to be filled, and - * provide a result once the filled form is received. - */ - -#include - -#include -#include - -class AdhocCommand -{ - friend class AdhocSession; -public: - AdhocCommand(std::vector&& callback, const std::string& name, const bool admin_only); - ~AdhocCommand(); - - const std::string name; - - bool is_admin_only() const; - -private: - /** - * A command may have one or more steps. Each step is a different - * callback, inserting things into a XmlNode and calling - * methods of an AdhocSession. - */ - std::vector callbacks; - const bool admin_only; -}; - -void PingStep1(XmppComponent*, AdhocSession& session, XmlNode& command_node); -void HelloStep1(XmppComponent*, AdhocSession& session, XmlNode& command_node); -void HelloStep2(XmppComponent*, AdhocSession& session, XmlNode& command_node); -void DisconnectUserStep1(XmppComponent*, AdhocSession& session, XmlNode& command_node); -void DisconnectUserStep2(XmppComponent*, AdhocSession& session, XmlNode& command_node); -void Reload(XmppComponent*, AdhocSession& session, XmlNode& command_node); - -#endif // ADHOC_COMMAND_HPP diff --git a/src/xmpp/biboumi_adhoc_commands.cpp b/src/xmpp/biboumi_adhoc_commands.cpp new file mode 100644 index 0000000..089eebf --- /dev/null +++ b/src/xmpp/biboumi_adhoc_commands.cpp @@ -0,0 +1,111 @@ +#include +#include +#include + +void DisconnectUserStep1(XmppComponent* xmpp_component, AdhocSession&, XmlNode& command_node) +{ + auto biboumi_component = static_cast(xmpp_component); + + XmlNode x("jabber:x:data:x"); + x["type"] = "form"; + XmlNode title("title"); + title.set_inner("Disconnect a user from the gateway"); + title.close(); + x.add_child(std::move(title)); + XmlNode instructions("instructions"); + instructions.set_inner("Choose a user JID and a quit message"); + instructions.close(); + x.add_child(std::move(instructions)); + XmlNode jids_field("field"); + jids_field["var"] = "jids"; + jids_field["type"] = "list-multi"; + jids_field["label"] = "The JIDs to disconnect"; + XmlNode required("required"); + required.close(); + jids_field.add_child(std::move(required)); + for (Bridge* bridge: biboumi_component->get_bridges()) + { + XmlNode option("option"); + option["label"] = bridge->get_jid(); + XmlNode value("value"); + value.set_inner(bridge->get_jid()); + value.close(); + option.add_child(std::move(value)); + option.close(); + jids_field.add_child(std::move(option)); + } + jids_field.close(); + x.add_child(std::move(jids_field)); + + XmlNode message_field("field"); + message_field["var"] = "quit-message"; + message_field["type"] = "text-single"; + message_field["label"] = "Quit message"; + XmlNode message_value("value"); + message_value.set_inner("Disconnected by admin"); + message_value.close(); + message_field.add_child(std::move(message_value)); + message_field.close(); + x.add_child(std::move(message_field)); + x.close(); + command_node.add_child(std::move(x)); +} + +void DisconnectUserStep2(XmppComponent* xmpp_component, AdhocSession& session, XmlNode& command_node) +{ + auto biboumi_component = static_cast(xmpp_component); + + // Find out if the jids, and the quit message are provided in the form. + std::string quit_message; + XmlNode* x = command_node.get_child("x", "jabber:x:data"); + if (x) + { + XmlNode* message_field = nullptr; + XmlNode* jids_field = nullptr; + for (XmlNode* field: x->get_children("field", "jabber:x:data")) + if (field->get_tag("var") == "jids") + jids_field = field; + else if (field->get_tag("var") == "quit-message") + message_field = field; + if (message_field) + { + XmlNode* value = message_field->get_child("value", "jabber:x:data"); + if (value) + quit_message = value->get_inner(); + } + if (jids_field) + { + std::size_t num = 0; + for (XmlNode* value: jids_field->get_children("value", "jabber:x:data")) + { + Bridge* bridge = biboumi_component->find_user_bridge(value->get_inner()); + if (bridge) + { + bridge->shutdown(quit_message); + num++; + } + } + command_node.delete_all_children(); + + XmlNode note("note"); + note["type"] = "info"; + if (num == 0) + note.set_inner("No user were disconnected."); + else if (num == 1) + note.set_inner("1 user has been disconnected."); + else + note.set_inner(std::to_string(num) + " users have been disconnected."); + note.close(); + command_node.add_child(std::move(note)); + return; + } + } + XmlNode error(ADHOC_NS":error"); + error["type"] = "modify"; + XmlNode condition(STANZA_NS":bad-request"); + condition.close(); + error.add_child(std::move(condition)); + error.close(); + command_node.add_child(std::move(error)); + session.terminate(); +} diff --git a/src/xmpp/biboumi_adhoc_commands.hpp b/src/xmpp/biboumi_adhoc_commands.hpp new file mode 100644 index 0000000..30f713a --- /dev/null +++ b/src/xmpp/biboumi_adhoc_commands.hpp @@ -0,0 +1,13 @@ +#ifndef BIBOUMI_ADHOC_COMMANDS_HPP_INCLUDED +#define BIBOUMI_ADHOC_COMMANDS_HPP_INCLUDED + +#include +#include +#include + +class XmppComponent; + +void DisconnectUserStep1(XmppComponent*, AdhocSession& session, XmlNode& command_node); +void DisconnectUserStep2(XmppComponent*, AdhocSession& session, XmlNode& command_node); + +#endif /* BIBOUMI_ADHOC_COMMANDS_HPP_INCLUDED */ diff --git a/src/xmpp/biboumi_component.cpp b/src/xmpp/biboumi_component.cpp index 2ecf247..ba8cb49 100644 --- a/src/xmpp/biboumi_component.cpp +++ b/src/xmpp/biboumi_component.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include -- cgit v1.2.3