summaryrefslogtreecommitdiff
path: root/louloulibs/xmpp/adhoc_commands_handler.cpp
diff options
context:
space:
mode:
authorJonas Smedegaard <dr@jones.dk>2017-06-24 09:21:37 +0200
committerJonas Smedegaard <dr@jones.dk>2017-06-24 09:21:37 +0200
commit3d39f109ba8ea7ae9778c58bd1665b9e8e0f45cb (patch)
tree9a5684babcd16d302fbe59c56b6045660ad62488 /louloulibs/xmpp/adhoc_commands_handler.cpp
parentf9cee98aacd6aea8ccb7f5677b4ff1e1e234e4d1 (diff)
parentc21cbbf9667991d2b928562a9c199e625d3f9bba (diff)
downloadbiboumi-3d39f109ba8ea7ae9778c58bd1665b9e8e0f45cb.tar.gz
biboumi-3d39f109ba8ea7ae9778c58bd1665b9e8e0f45cb.tar.bz2
biboumi-3d39f109ba8ea7ae9778c58bd1665b9e8e0f45cb.tar.xz
biboumi-3d39f109ba8ea7ae9778c58bd1665b9e8e0f45cb.zip
Updated version 5.0 from 'upstream/5.0'
with Debian dir 2ae31d03ffb1d79153a692af23c7b2b097cc4b2b
Diffstat (limited to 'louloulibs/xmpp/adhoc_commands_handler.cpp')
-rw-r--r--louloulibs/xmpp/adhoc_commands_handler.cpp126
1 files changed, 0 insertions, 126 deletions
diff --git a/louloulibs/xmpp/adhoc_commands_handler.cpp b/louloulibs/xmpp/adhoc_commands_handler.cpp
deleted file mode 100644
index 540cac0..0000000
--- a/louloulibs/xmpp/adhoc_commands_handler.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-#include <xmpp/adhoc_commands_handler.hpp>
-#include <xmpp/xmpp_component.hpp>
-
-#include <utils/timed_events.hpp>
-#include <logger/logger.hpp>
-#include <config/config.hpp>
-#include <xmpp/jid.hpp>
-
-#include <iostream>
-
-using namespace std::string_literals;
-
-const std::map<const std::string, const AdhocCommand>& AdhocCommandsHandler::get_commands() const
-{
- return this->commands;
-}
-
-void AdhocCommandsHandler::add_command(std::string name, AdhocCommand command)
-{
- const auto found = this->commands.find(name);
- if (found != this->commands.end())
- throw std::runtime_error("Trying to add an ad-hoc command that already exist: "s + name);
- this->commands.emplace(std::make_pair(std::move(name), std::move(command)));
-}
-
-XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, const std::string& to, XmlNode command_node)
-{
- std::string action = command_node.get_tag("action");
- if (action.empty())
- action = "execute";
- command_node.del_tag("action");
-
- Jid jid(executor_jid);
-
- const std::string node = command_node.get_tag("node");
- auto command_it = this->commands.find(node);
- if (command_it == this->commands.end())
- {
- XmlNode error(ADHOC_NS":error");
- error["type"] = "cancel";
- XmlNode condition(STANZA_NS":item-not-found");
- error.add_child(std::move(condition));
- command_node.add_child(std::move(error));
- }
- else if (command_it->second.is_admin_only() &&
- Config::get("admin", "") != jid.local + "@" + jid.domain)
- {
- XmlNode error(ADHOC_NS":error");
- error["type"] = "cancel";
- XmlNode condition(STANZA_NS":forbidden");
- error.add_child(std::move(condition));
- command_node.add_child(std::move(error));
- }
- else
- {
- std::string sessionid = command_node.get_tag("sessionid");
- if (sessionid.empty())
- { // create a new session, with a new id
- sessionid = XmppComponent::next_id();
- command_node["sessionid"] = sessionid;
- this->sessions.emplace(std::piecewise_construct,
- std::forward_as_tuple(sessionid, executor_jid),
- std::forward_as_tuple(command_it->second, executor_jid, to));
- TimedEventsManager::instance().add_event(TimedEvent(std::chrono::steady_clock::now() + 3600s,
- std::bind(&AdhocCommandsHandler::remove_session, this, sessionid, executor_jid),
- "adhocsession"s + sessionid + executor_jid));
- }
- auto session_it = this->sessions.find(std::make_pair(sessionid, executor_jid));
- if (session_it == this->sessions.end())
- {
- XmlNode error(ADHOC_NS":error");
- error["type"] = "modify";
- XmlNode condition(STANZA_NS":bad-request");
- error.add_child(std::move(condition));
- command_node.add_child(std::move(error));
- }
- else if (action == "execute" || action == "next" || action == "complete")
- {
- // execute the step
- AdhocSession& session = session_it->second;
- const AdhocStep& step = session.get_next_step();
- step(this->xmpp_component, session, command_node);
- if (session.remaining_steps() == 0 ||
- session.is_terminated())
- {
- this->sessions.erase(session_it);
- command_node["status"] = "completed";
- TimedEventsManager::instance().cancel("adhocsession"s + sessionid + executor_jid);
- }
- else
- {
- command_node["status"] = "executing";
- XmlNode actions("actions");
- XmlNode next("next");
- actions.add_child(std::move(next));
- command_node.add_child(std::move(actions));
- }
- }
- else if (action == "cancel")
- {
- this->sessions.erase(session_it);
- command_node["status"] = "canceled";
- TimedEventsManager::instance().cancel("adhocsession"s + sessionid + executor_jid);
- }
- else // unsupported action
- {
- XmlNode error(ADHOC_NS":error");
- error["type"] = "modify";
- XmlNode condition(STANZA_NS":bad-request");
- error.add_child(std::move(condition));
- command_node.add_child(std::move(error));
- }
- }
- return command_node;
-}
-
-void AdhocCommandsHandler::remove_session(const std::string& session_id, const std::string& initiator_jid)
-{
- auto session_it = this->sessions.find(std::make_pair(session_id, initiator_jid));
- if (session_it != this->sessions.end())
- {
- this->sessions.erase(session_it);
- return ;
- }
- log_error("Tried to remove ad-hoc session for [", session_id, ", ", initiator_jid, "] but none found");
-}