~singpolyma/biboumi

ref: 7b3e0e0cf3eddd3537455a3605b04a48ee663f47 biboumi/src/xmpp/adhoc_command.cpp -rw-r--r-- 2.4 KiB
7b3e0e0c — louiz’ Make botan’s policy configurable from a file 5 years ago
                                                                                
5402a256 louiz’
e1a7114c Florent Le Coz
5402a256 louiz’
e1a7114c Florent Le Coz
9714d020 Florent Le Coz
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
9714d020 Florent Le Coz
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
9714d020 Florent Le Coz
e1a7114c Florent Le Coz
9714d020 Florent Le Coz
e1a7114c Florent Le Coz
f3b3d937 Florent Le Coz
e1a7114c Florent Le Coz
9714d020 Florent Le Coz
e1a7114c Florent Le Coz
17411e6b louiz’
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
17411e6b louiz’
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
9714d020 Florent Le Coz
e1a7114c Florent Le Coz
5a5bb7f6 louiz’
e1a7114c Florent Le Coz
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <utility>
#include <xmpp/adhoc_command.hpp>
#include <xmpp/xmpp_component.hpp>
#include <utils/reload.hpp>

using namespace std::string_literals;

AdhocCommand::AdhocCommand(std::vector<AdhocStep>&& callbacks, std::string name, const bool admin_only):
  name(std::move(name)),
  callbacks(std::move(callbacks)),
  admin_only(admin_only)
{
}

bool AdhocCommand::is_admin_only() const
{
  return this->admin_only;
}

void PingStep1(XmppComponent&, AdhocSession&, XmlNode& command_node)
{
  XmlSubNode note(command_node, "note");
  note["type"] = "info";
  note.set_inner("Pong");
}

void HelloStep1(XmppComponent&, AdhocSession&, XmlNode& command_node)
{
  XmlSubNode x(command_node, "jabber:x:data:x");
  x["type"] = "form";
  XmlSubNode title(x, "title");
  title.set_inner("Configure your name.");
  XmlSubNode instructions(x, "instructions");
  instructions.set_inner("Please provide your name.");
  XmlSubNode name_field(x, "field");
  name_field["var"] = "name";
  name_field["type"] = "text-single";
  name_field["label"] = "Your name";
  XmlSubNode required(name_field, "required");
}

void HelloStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
{
  // Find out if the name was provided in the form.
  if (const XmlNode* x = command_node.get_child("x", "jabber:x:data"))
    {
      const XmlNode* name_field = nullptr;
      for (const XmlNode* field: x->get_children("field", "jabber:x:data"))
        if (field->get_tag("var") == "name")
          {
            name_field = field;
            break;
          }
      if (name_field)
        {
          if (const XmlNode* value = name_field->get_child("value", "jabber:x:data"))
            {
              const std::string value_str = value->get_inner();
              command_node.delete_all_children();
              XmlSubNode note(command_node, "note");
              note["type"] = "info";
              note.set_inner("Hello "s + value_str + "!"s);
              return;
            }
        }
    }
  command_node.delete_all_children();
  XmlSubNode error(command_node, ADHOC_NS":error");
  error["type"] = "modify";
  XmlSubNode condition(error, STANZA_NS":bad-request");
  session.terminate();
}

void Reload(XmppComponent&, AdhocSession&, XmlNode& command_node)
{
  ::reload_process();
  command_node.delete_all_children();
  XmlSubNode note(command_node, "note");
  note["type"] = "info";
  note.set_inner("Configuration reloaded.");
}