Introduce a XmlSubNode class that automatically adds itself into its parent
This commit is contained in:
@@ -18,30 +18,24 @@ bool AdhocCommand::is_admin_only() const
|
|||||||
|
|
||||||
void PingStep1(XmppComponent&, AdhocSession&, XmlNode& command_node)
|
void PingStep1(XmppComponent&, AdhocSession&, XmlNode& command_node)
|
||||||
{
|
{
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Pong");
|
note.set_inner("Pong");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HelloStep1(XmppComponent&, AdhocSession&, XmlNode& command_node)
|
void HelloStep1(XmppComponent&, AdhocSession&, XmlNode& command_node)
|
||||||
{
|
{
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Configure your name.");
|
title.set_inner("Configure your name.");
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Please provide your name.");
|
instructions.set_inner("Please provide your name.");
|
||||||
x.add_child(std::move(instructions));
|
XmlSubNode name_field(x, "field");
|
||||||
XmlNode name_field("field");
|
|
||||||
name_field["var"] = "name";
|
name_field["var"] = "name";
|
||||||
name_field["type"] = "text-single";
|
name_field["type"] = "text-single";
|
||||||
name_field["label"] = "Your name";
|
name_field["label"] = "Your name";
|
||||||
XmlNode required("required");
|
XmlSubNode required(name_field, "required");
|
||||||
name_field.add_child(std::move(required));
|
|
||||||
x.add_child(std::move(name_field));
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HelloStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
void HelloStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -60,21 +54,18 @@ void HelloStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
|||||||
{
|
{
|
||||||
if (const XmlNode* value = name_field->get_child("value", "jabber:x:data"))
|
if (const XmlNode* value = name_field->get_child("value", "jabber:x:data"))
|
||||||
{
|
{
|
||||||
XmlNode note("note");
|
command_node.delete_all_children();
|
||||||
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Hello "s + value->get_inner() + "!"s);
|
note.set_inner("Hello "s + value->get_inner() + "!"s);
|
||||||
command_node.delete_all_children();
|
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, STANZA_NS":bad-request");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,8 +73,7 @@ void Reload(XmppComponent&, AdhocSession&, XmlNode& command_node)
|
|||||||
{
|
{
|
||||||
::reload_process();
|
::reload_process();
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Configuration reloaded.");
|
note.set_inner("Configuration reloaded.");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,20 +36,16 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, co
|
|||||||
auto command_it = this->commands.find(node);
|
auto command_it = this->commands.find(node);
|
||||||
if (command_it == this->commands.end())
|
if (command_it == this->commands.end())
|
||||||
{
|
{
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "cancel";
|
error["type"] = "cancel";
|
||||||
XmlNode condition(STANZA_NS":item-not-found");
|
XmlSubNode condition(error, 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() &&
|
else if (command_it->second.is_admin_only() &&
|
||||||
Config::get("admin", "") != jid.local + "@" + jid.domain)
|
Config::get("admin", "") != jid.local + "@" + jid.domain)
|
||||||
{
|
{
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "cancel";
|
error["type"] = "cancel";
|
||||||
XmlNode condition(STANZA_NS":forbidden");
|
XmlSubNode condition(error, STANZA_NS":forbidden");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -68,11 +64,9 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, co
|
|||||||
auto session_it = this->sessions.find(std::make_pair(sessionid, executor_jid));
|
auto session_it = this->sessions.find(std::make_pair(sessionid, executor_jid));
|
||||||
if (session_it == this->sessions.end())
|
if (session_it == this->sessions.end())
|
||||||
{
|
{
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, 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")
|
else if (action == "execute" || action == "next" || action == "complete")
|
||||||
{
|
{
|
||||||
@@ -90,10 +84,8 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, co
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
command_node["status"] = "executing";
|
command_node["status"] = "executing";
|
||||||
XmlNode actions("actions");
|
XmlSubNode actions(command_node, "actions");
|
||||||
XmlNode next("next");
|
XmlSubNode next(actions, "next");
|
||||||
actions.add_child(std::move(next));
|
|
||||||
command_node.add_child(std::move(actions));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (action == "cancel")
|
else if (action == "cancel")
|
||||||
@@ -104,11 +96,9 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, co
|
|||||||
}
|
}
|
||||||
else // unsupported action
|
else // unsupported action
|
||||||
{
|
{
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, STANZA_NS":bad-request");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return command_node;
|
return command_node;
|
||||||
|
|||||||
+106
-111
@@ -172,12 +172,13 @@ void XmppComponent::on_stanza(const Stanza& stanza)
|
|||||||
|
|
||||||
void XmppComponent::send_stream_error(const std::string& name, const std::string& explanation)
|
void XmppComponent::send_stream_error(const std::string& name, const std::string& explanation)
|
||||||
{
|
{
|
||||||
XmlNode node("stream:error");
|
Stanza node("stream:error");
|
||||||
XmlNode error(name);
|
{
|
||||||
|
XmlSubNode error(node, name);
|
||||||
error["xmlns"] = STREAM_NS;
|
error["xmlns"] = STREAM_NS;
|
||||||
if (!explanation.empty())
|
if (!explanation.empty())
|
||||||
error.set_inner(explanation);
|
error.set_inner(explanation);
|
||||||
node.add_child(std::move(error));
|
}
|
||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -187,6 +188,7 @@ void XmppComponent::send_stanza_error(const std::string& kind, const std::string
|
|||||||
const bool fulljid)
|
const bool fulljid)
|
||||||
{
|
{
|
||||||
Stanza node(kind);
|
Stanza node(kind);
|
||||||
|
{
|
||||||
if (!to.empty())
|
if (!to.empty())
|
||||||
node["to"] = to;
|
node["to"] = to;
|
||||||
if (!from.empty())
|
if (!from.empty())
|
||||||
@@ -199,19 +201,21 @@ void XmppComponent::send_stanza_error(const std::string& kind, const std::string
|
|||||||
if (!id.empty())
|
if (!id.empty())
|
||||||
node["id"] = id;
|
node["id"] = id;
|
||||||
node["type"] = "error";
|
node["type"] = "error";
|
||||||
XmlNode error("error");
|
{
|
||||||
|
XmlSubNode error(node, "error");
|
||||||
error["type"] = error_type;
|
error["type"] = error_type;
|
||||||
XmlNode inner_error(defined_condition);
|
{
|
||||||
|
XmlSubNode inner_error(error, defined_condition);
|
||||||
inner_error["xmlns"] = STANZA_NS;
|
inner_error["xmlns"] = STANZA_NS;
|
||||||
error.add_child(std::move(inner_error));
|
}
|
||||||
if (!text.empty())
|
if (!text.empty())
|
||||||
{
|
{
|
||||||
XmlNode text_node("text");
|
XmlSubNode text_node(error, "text");
|
||||||
text_node["xmlns"] = STANZA_NS;
|
text_node["xmlns"] = STANZA_NS;
|
||||||
text_node.set_inner(text);
|
text_node.set_inner(text);
|
||||||
error.add_child(std::move(text_node));
|
|
||||||
}
|
}
|
||||||
node.add_child(std::move(error));
|
}
|
||||||
|
}
|
||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,38 +268,33 @@ void* XmppComponent::get_receive_buffer(const size_t size) const
|
|||||||
void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, const std::string& to,
|
void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, const std::string& to,
|
||||||
const std::string& type, const bool fulljid, const bool nocopy)
|
const std::string& type, const bool fulljid, const bool nocopy)
|
||||||
{
|
{
|
||||||
XmlNode node("message");
|
Stanza message("message");
|
||||||
node["to"] = to;
|
{
|
||||||
|
message["to"] = to;
|
||||||
if (fulljid)
|
if (fulljid)
|
||||||
node["from"] = from;
|
message["from"] = from;
|
||||||
else
|
else
|
||||||
node["from"] = from + "@" + this->served_hostname;
|
message["from"] = from + "@" + this->served_hostname;
|
||||||
if (!type.empty())
|
if (!type.empty())
|
||||||
node["type"] = type;
|
message["type"] = type;
|
||||||
XmlNode body_node("body");
|
XmlSubNode body_node(message, "body");
|
||||||
body_node.set_inner(std::get<0>(body));
|
body_node.set_inner(std::get<0>(body));
|
||||||
node.add_child(std::move(body_node));
|
|
||||||
if (std::get<1>(body))
|
if (std::get<1>(body))
|
||||||
{
|
{
|
||||||
XmlNode html("html");
|
XmlSubNode html(message, "html");
|
||||||
html["xmlns"] = XHTMLIM_NS;
|
html["xmlns"] = XHTMLIM_NS;
|
||||||
// Pass the ownership of the pointer to this xmlnode
|
// Pass the ownership of the pointer to this xmlnode
|
||||||
html.add_child(std::move(std::get<1>(body)));
|
html.add_child(std::move(std::get<1>(body)));
|
||||||
node.add_child(std::move(html));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nocopy)
|
if (nocopy)
|
||||||
{
|
{
|
||||||
XmlNode private_node("private");
|
XmlSubNode private_node(message, "private");
|
||||||
private_node["xmlns"] = "urn:xmpp:carbons:2";
|
private_node["xmlns"] = "urn:xmpp:carbons:2";
|
||||||
node.add_child(std::move(private_node));
|
XmlSubNode nocopy(message, "no-copy");
|
||||||
|
|
||||||
XmlNode nocopy("no-copy");
|
|
||||||
nocopy["xmlns"] = "urn:xmpp:hints";
|
nocopy["xmlns"] = "urn:xmpp:hints";
|
||||||
node.add_child(std::move(nocopy));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
this->send_stanza(node);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::send_user_join(const std::string& from,
|
void XmppComponent::send_user_join(const std::string& from,
|
||||||
@@ -306,14 +305,15 @@ void XmppComponent::send_user_join(const std::string& from,
|
|||||||
const std::string& to,
|
const std::string& to,
|
||||||
const bool self)
|
const bool self)
|
||||||
{
|
{
|
||||||
XmlNode node("presence");
|
Stanza presence("presence");
|
||||||
node["to"] = to;
|
{
|
||||||
node["from"] = from + "@" + this->served_hostname + "/" + nick;
|
presence["to"] = to;
|
||||||
|
presence["from"] = from + "@" + this->served_hostname + "/" + nick;
|
||||||
|
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
|
|
||||||
XmlNode item("item");
|
XmlSubNode item(x, "item");
|
||||||
if (!affiliation.empty())
|
if (!affiliation.empty())
|
||||||
item["affiliation"] = affiliation;
|
item["affiliation"] = affiliation;
|
||||||
if (!role.empty())
|
if (!role.empty())
|
||||||
@@ -324,16 +324,14 @@ void XmppComponent::send_user_join(const std::string& from,
|
|||||||
if (!preped_jid.empty())
|
if (!preped_jid.empty())
|
||||||
item["jid"] = preped_jid;
|
item["jid"] = preped_jid;
|
||||||
}
|
}
|
||||||
x.add_child(std::move(item));
|
|
||||||
|
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlSubNode status(x, "status");
|
||||||
status["code"] = "110";
|
status["code"] = "110";
|
||||||
x.add_child(std::move(status));
|
|
||||||
}
|
}
|
||||||
node.add_child(std::move(x));
|
}
|
||||||
this->send_stanza(node);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::send_invalid_room_error(const std::string& muc_name,
|
void XmppComponent::send_invalid_room_error(const std::string& muc_name,
|
||||||
@@ -341,44 +339,43 @@ void XmppComponent::send_invalid_room_error(const std::string& muc_name,
|
|||||||
const std::string& to)
|
const std::string& to)
|
||||||
{
|
{
|
||||||
Stanza presence("presence");
|
Stanza presence("presence");
|
||||||
|
{
|
||||||
if (!muc_name.empty ())
|
if (!muc_name.empty ())
|
||||||
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nick;
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nick;
|
||||||
else
|
else
|
||||||
presence["from"] = this->served_hostname;
|
presence["from"] = this->served_hostname;
|
||||||
presence["to"] = to;
|
presence["to"] = to;
|
||||||
presence["type"] = "error";
|
presence["type"] = "error";
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_NS;
|
x["xmlns"] = MUC_NS;
|
||||||
presence.add_child(std::move(x));
|
XmlSubNode error(presence, "error");
|
||||||
XmlNode error("error");
|
|
||||||
error["by"] = muc_name + "@" + this->served_hostname;
|
error["by"] = muc_name + "@" + this->served_hostname;
|
||||||
error["type"] = "cancel";
|
error["type"] = "cancel";
|
||||||
XmlNode item_not_found("item-not-found");
|
XmlSubNode item_not_found(error, "item-not-found");
|
||||||
item_not_found["xmlns"] = STANZA_NS;
|
item_not_found["xmlns"] = STANZA_NS;
|
||||||
error.add_child(std::move(item_not_found));
|
XmlSubNode text(error, "text");
|
||||||
XmlNode text("text");
|
|
||||||
text["xmlns"] = STANZA_NS;
|
text["xmlns"] = STANZA_NS;
|
||||||
text["xml:lang"] = "en";
|
text["xml:lang"] = "en";
|
||||||
text.set_inner(muc_name +
|
text.set_inner(muc_name +
|
||||||
" is not a valid IRC channel name. A correct room jid is of the form: #<chan>%<server>@" +
|
" is not a valid IRC channel name. A correct room jid is of the form: #<chan>%<server>@" +
|
||||||
this->served_hostname);
|
this->served_hostname);
|
||||||
error.add_child(std::move(text));
|
}
|
||||||
presence.add_child(std::move(error));
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to, const std::string& who)
|
void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, const std::string& to, const std::string& who)
|
||||||
{
|
{
|
||||||
XmlNode message("message");
|
Stanza message("message");
|
||||||
|
{
|
||||||
message["to"] = to;
|
message["to"] = to;
|
||||||
if (who.empty())
|
if (who.empty())
|
||||||
message["from"] = from + "@" + this->served_hostname;
|
message["from"] = from + "@" + this->served_hostname;
|
||||||
else
|
else
|
||||||
message["from"] = from + "@" + this->served_hostname + "/" + who;
|
message["from"] = from + "@" + this->served_hostname + "/" + who;
|
||||||
message["type"] = "groupchat";
|
message["type"] = "groupchat";
|
||||||
XmlNode subject("subject");
|
XmlSubNode subject(message, "subject");
|
||||||
subject.set_inner(std::get<0>(topic));
|
subject.set_inner(std::get<0>(topic));
|
||||||
message.add_child(std::move(subject));
|
}
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,16 +388,18 @@ void XmppComponent::send_muc_message(const std::string& muc_name, const std::str
|
|||||||
else // Message from the room itself
|
else // Message from the room itself
|
||||||
message["from"] = muc_name + "@" + this->served_hostname;
|
message["from"] = muc_name + "@" + this->served_hostname;
|
||||||
message["type"] = "groupchat";
|
message["type"] = "groupchat";
|
||||||
XmlNode body("body");
|
|
||||||
|
{
|
||||||
|
XmlSubNode body(message, "body");
|
||||||
body.set_inner(std::get<0>(xmpp_body));
|
body.set_inner(std::get<0>(xmpp_body));
|
||||||
message.add_child(std::move(body));
|
}
|
||||||
|
|
||||||
if (std::get<1>(xmpp_body))
|
if (std::get<1>(xmpp_body))
|
||||||
{
|
{
|
||||||
XmlNode html("html");
|
XmlSubNode html(message, "html");
|
||||||
html["xmlns"] = XHTMLIM_NS;
|
html["xmlns"] = XHTMLIM_NS;
|
||||||
// Pass the ownership of the pointer to this xmlnode
|
// Pass the ownership of the pointer to this xmlnode
|
||||||
html.add_child(std::move(std::get<1>(xmpp_body)));
|
html.add_child(std::move(std::get<1>(xmpp_body)));
|
||||||
message.add_child(std::move(html));
|
|
||||||
}
|
}
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
@@ -415,40 +414,40 @@ void XmppComponent::send_history_message(const std::string& muc_name, const std:
|
|||||||
message["from"] = muc_name + "@" + this->served_hostname;
|
message["from"] = muc_name + "@" + this->served_hostname;
|
||||||
message["type"] = "groupchat";
|
message["type"] = "groupchat";
|
||||||
|
|
||||||
XmlNode body("body");
|
{
|
||||||
|
XmlSubNode body(message, "body");
|
||||||
body.set_inner(body_txt);
|
body.set_inner(body_txt);
|
||||||
message.add_child(std::move(body));
|
}
|
||||||
|
{
|
||||||
XmlNode delay("delay");
|
XmlSubNode delay(message, "delay");
|
||||||
delay["xmlns"] = DELAY_NS;
|
delay["xmlns"] = DELAY_NS;
|
||||||
delay["from"] = muc_name + "@" + this->served_hostname;
|
delay["from"] = muc_name + "@" + this->served_hostname;
|
||||||
delay["stamp"] = utils::to_string(timestamp);
|
delay["stamp"] = utils::to_string(timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
message.add_child(std::move(delay));
|
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::send_muc_leave(const std::string& muc_name, std::string&& nick, Xmpp::body&& message, const std::string& jid_to, const bool self)
|
void XmppComponent::send_muc_leave(const std::string& muc_name, std::string&& nick, Xmpp::body&& message, const std::string& jid_to, const bool self)
|
||||||
{
|
{
|
||||||
Stanza presence("presence");
|
Stanza presence("presence");
|
||||||
|
{
|
||||||
presence["to"] = jid_to;
|
presence["to"] = jid_to;
|
||||||
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nick;
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nick;
|
||||||
presence["type"] = "unavailable";
|
presence["type"] = "unavailable";
|
||||||
const std::string message_str = std::get<0>(message);
|
const std::string message_str = std::get<0>(message);
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlSubNode status(x, "status");
|
||||||
status["code"] = "110";
|
status["code"] = "110";
|
||||||
x.add_child(std::move(status));
|
|
||||||
}
|
}
|
||||||
presence.add_child(std::move(x));
|
|
||||||
if (!message_str.empty())
|
if (!message_str.empty())
|
||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlSubNode status(presence, "status");
|
||||||
status.set_inner(message_str);
|
status.set_inner(message_str);
|
||||||
presence.add_child(std::move(status));
|
}
|
||||||
}
|
}
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
@@ -462,24 +461,22 @@ void XmppComponent::send_nick_change(const std::string& muc_name,
|
|||||||
const bool self)
|
const bool self)
|
||||||
{
|
{
|
||||||
Stanza presence("presence");
|
Stanza presence("presence");
|
||||||
|
{
|
||||||
presence["to"] = jid_to;
|
presence["to"] = jid_to;
|
||||||
presence["from"] = muc_name + "@" + this->served_hostname + "/" + old_nick;
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + old_nick;
|
||||||
presence["type"] = "unavailable";
|
presence["type"] = "unavailable";
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
XmlNode item("item");
|
XmlSubNode item(x, "item");
|
||||||
item["nick"] = new_nick;
|
item["nick"] = new_nick;
|
||||||
x.add_child(std::move(item));
|
XmlSubNode status(x, "status");
|
||||||
XmlNode status("status");
|
|
||||||
status["code"] = "303";
|
status["code"] = "303";
|
||||||
x.add_child(std::move(status));
|
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
XmlNode status2("status");
|
XmlSubNode status(x, "status");
|
||||||
status2["code"] = "110";
|
status["code"] = "110";
|
||||||
x.add_child(std::move(status2));
|
}
|
||||||
}
|
}
|
||||||
presence.add_child(std::move(x));
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
|
|
||||||
this->send_user_join(muc_name, new_nick, "", affiliation, role, jid_to, self);
|
this->send_user_join(muc_name, new_nick, "", affiliation, role, jid_to, self);
|
||||||
@@ -489,32 +486,28 @@ void XmppComponent::kick_user(const std::string& muc_name, const std::string& ta
|
|||||||
const std::string& author, const std::string& jid_to, const bool self)
|
const std::string& author, const std::string& jid_to, const bool self)
|
||||||
{
|
{
|
||||||
Stanza presence("presence");
|
Stanza presence("presence");
|
||||||
|
{
|
||||||
presence["from"] = muc_name + "@" + this->served_hostname + "/" + target;
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + target;
|
||||||
presence["to"] = jid_to;
|
presence["to"] = jid_to;
|
||||||
presence["type"] = "unavailable";
|
presence["type"] = "unavailable";
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
XmlNode item("item");
|
XmlSubNode item(x, "item");
|
||||||
item["affiliation"] = "none";
|
item["affiliation"] = "none";
|
||||||
item["role"] = "none";
|
item["role"] = "none";
|
||||||
XmlNode actor("actor");
|
XmlSubNode actor(item, "actor");
|
||||||
actor["nick"] = author;
|
actor["nick"] = author;
|
||||||
actor["jid"] = author; // backward compatibility with old clients
|
actor["jid"] = author; // backward compatibility with old clients
|
||||||
item.add_child(std::move(actor));
|
XmlSubNode reason(item, "reason");
|
||||||
XmlNode reason("reason");
|
|
||||||
reason.set_inner(txt);
|
reason.set_inner(txt);
|
||||||
item.add_child(std::move(reason));
|
XmlSubNode status(x, "status");
|
||||||
x.add_child(std::move(item));
|
|
||||||
XmlNode status("status");
|
|
||||||
status["code"] = "307";
|
status["code"] = "307";
|
||||||
x.add_child(std::move(status));
|
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlSubNode status(x, "status");
|
||||||
status["code"] = "110";
|
status["code"] = "110";
|
||||||
x.add_child(std::move(status));
|
|
||||||
}
|
}
|
||||||
presence.add_child(std::move(x));
|
}
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -527,28 +520,26 @@ void XmppComponent::send_presence_error(const std::string& muc_name,
|
|||||||
const std::string& text)
|
const std::string& text)
|
||||||
{
|
{
|
||||||
Stanza presence("presence");
|
Stanza presence("presence");
|
||||||
|
{
|
||||||
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nickname;
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + nickname;
|
||||||
presence["to"] = jid_to;
|
presence["to"] = jid_to;
|
||||||
presence["type"] = "error";
|
presence["type"] = "error";
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_NS;
|
x["xmlns"] = MUC_NS;
|
||||||
presence.add_child(std::move(x));
|
XmlSubNode error(presence, "error");
|
||||||
XmlNode error("error");
|
|
||||||
error["by"] = muc_name + "@" + this->served_hostname;
|
error["by"] = muc_name + "@" + this->served_hostname;
|
||||||
error["type"] = type;
|
error["type"] = type;
|
||||||
if (!text.empty())
|
if (!text.empty())
|
||||||
{
|
{
|
||||||
XmlNode text_node("text");
|
XmlSubNode text_node(error, "text");
|
||||||
text_node["xmlns"] = STANZA_NS;
|
text_node["xmlns"] = STANZA_NS;
|
||||||
text_node.set_inner(text);
|
text_node.set_inner(text);
|
||||||
error.add_child(std::move(text_node));
|
|
||||||
}
|
}
|
||||||
if (!error_code.empty())
|
if (!error_code.empty())
|
||||||
error["code"] = error_code;
|
error["code"] = error_code;
|
||||||
XmlNode subnode(condition);
|
XmlSubNode subnode(error, condition);
|
||||||
subnode["xmlns"] = STANZA_NS;
|
subnode["xmlns"] = STANZA_NS;
|
||||||
error.add_child(std::move(subnode));
|
}
|
||||||
presence.add_child(std::move(error));
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -559,15 +550,15 @@ void XmppComponent::send_affiliation_role_change(const std::string& muc_name,
|
|||||||
const std::string& jid_to)
|
const std::string& jid_to)
|
||||||
{
|
{
|
||||||
Stanza presence("presence");
|
Stanza presence("presence");
|
||||||
|
{
|
||||||
presence["from"] = muc_name + "@" + this->served_hostname + "/" + target;
|
presence["from"] = muc_name + "@" + this->served_hostname + "/" + target;
|
||||||
presence["to"] = jid_to;
|
presence["to"] = jid_to;
|
||||||
XmlNode x("x");
|
XmlSubNode x(presence, "x");
|
||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
XmlNode item("item");
|
XmlSubNode item(x, "item");
|
||||||
item["affiliation"] = affiliation;
|
item["affiliation"] = affiliation;
|
||||||
item["role"] = role;
|
item["role"] = role;
|
||||||
x.add_child(std::move(item));
|
}
|
||||||
presence.add_child(std::move(x));
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -579,27 +570,30 @@ void XmppComponent::send_version(const std::string& id, const std::string& jid_t
|
|||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
iq["from"] = jid_from;
|
iq["from"] = jid_from;
|
||||||
XmlNode query("query");
|
{
|
||||||
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = VERSION_NS;
|
query["xmlns"] = VERSION_NS;
|
||||||
if (version.empty())
|
if (version.empty())
|
||||||
{
|
{
|
||||||
XmlNode name("name");
|
{
|
||||||
|
XmlSubNode name(query, "name");
|
||||||
name.set_inner("biboumi");
|
name.set_inner("biboumi");
|
||||||
query.add_child(std::move(name));
|
}
|
||||||
XmlNode version("version");
|
{
|
||||||
|
XmlSubNode version(query, "version");
|
||||||
version.set_inner(SOFTWARE_VERSION);
|
version.set_inner(SOFTWARE_VERSION);
|
||||||
query.add_child(std::move(version));
|
}
|
||||||
XmlNode os("os");
|
{
|
||||||
|
XmlSubNode os(query, "os");
|
||||||
os.set_inner(SYSTEM_NAME);
|
os.set_inner(SYSTEM_NAME);
|
||||||
query.add_child(std::move(os));
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
XmlNode name("name");
|
XmlSubNode name(query, "name");
|
||||||
name.set_inner(version);
|
name.set_inner(version);
|
||||||
query.add_child(std::move(name));
|
|
||||||
}
|
}
|
||||||
iq.add_child(std::move(query));
|
}
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -608,24 +602,24 @@ void XmppComponent::send_adhoc_commands_list(const std::string& id, const std::s
|
|||||||
const bool with_admin_only, const AdhocCommandsHandler& adhoc_handler)
|
const bool with_admin_only, const AdhocCommandsHandler& adhoc_handler)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["to"] = requester_jid;
|
iq["to"] = requester_jid;
|
||||||
iq["from"] = from_jid;
|
iq["from"] = from_jid;
|
||||||
XmlNode query("query");
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = DISCO_ITEMS_NS;
|
query["xmlns"] = DISCO_ITEMS_NS;
|
||||||
query["node"] = ADHOC_NS;
|
query["node"] = ADHOC_NS;
|
||||||
for (const auto &kv: adhoc_handler.get_commands())
|
for (const auto &kv: adhoc_handler.get_commands())
|
||||||
{
|
{
|
||||||
if (kv.second.is_admin_only() && !with_admin_only)
|
if (kv.second.is_admin_only() && !with_admin_only)
|
||||||
continue;
|
continue;
|
||||||
XmlNode item("item");
|
XmlSubNode item(query, "item");
|
||||||
item["jid"] = from_jid;
|
item["jid"] = from_jid;
|
||||||
item["node"] = kv.first;
|
item["node"] = kv.first;
|
||||||
item["name"] = kv.second.name;
|
item["name"] = kv.second.name;
|
||||||
query.add_child(std::move(item));
|
|
||||||
}
|
}
|
||||||
iq.add_child(std::move(query));
|
}
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -633,13 +627,14 @@ void XmppComponent::send_iq_version_request(const std::string& from,
|
|||||||
const std::string& jid_to)
|
const std::string& jid_to)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["type"] = "get";
|
iq["type"] = "get";
|
||||||
iq["id"] = "version_"s + XmppComponent::next_id();
|
iq["id"] = "version_"s + XmppComponent::next_id();
|
||||||
iq["from"] = from + "@" + this->served_hostname;
|
iq["from"] = from + "@" + this->served_hostname;
|
||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
XmlNode query("query");
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = VERSION_NS;
|
query["xmlns"] = VERSION_NS;
|
||||||
iq.add_child(std::move(query));
|
}
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -143,4 +143,18 @@ std::ostream& operator<<(std::ostream& os, const XmlNode& node);
|
|||||||
*/
|
*/
|
||||||
using Stanza = XmlNode;
|
using Stanza = XmlNode;
|
||||||
|
|
||||||
|
class XmlSubNode: public XmlNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
XmlSubNode(XmlNode& parent_ref, const std::string& name):
|
||||||
|
XmlNode(name),
|
||||||
|
parent_to_add(parent_ref)
|
||||||
|
{}
|
||||||
|
|
||||||
|
~XmlSubNode()
|
||||||
|
{
|
||||||
|
this->parent_to_add.add_child(std::move(*this));
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
XmlNode& parent_to_add;
|
||||||
|
};
|
||||||
@@ -26,40 +26,31 @@ void DisconnectUserStep1(XmppComponent& xmpp_component, AdhocSession&, XmlNode&
|
|||||||
{
|
{
|
||||||
auto& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
|
auto& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
|
||||||
|
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Disconnect a user from the gateway");
|
title.set_inner("Disconnect a user from the gateway");
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Choose a user JID and a quit message");
|
instructions.set_inner("Choose a user JID and a quit message");
|
||||||
x.add_child(std::move(instructions));
|
XmlSubNode jids_field(x, "field");
|
||||||
XmlNode jids_field("field");
|
|
||||||
jids_field["var"] = "jids";
|
jids_field["var"] = "jids";
|
||||||
jids_field["type"] = "list-multi";
|
jids_field["type"] = "list-multi";
|
||||||
jids_field["label"] = "The JIDs to disconnect";
|
jids_field["label"] = "The JIDs to disconnect";
|
||||||
XmlNode required("required");
|
XmlSubNode required(jids_field, "required");
|
||||||
jids_field.add_child(std::move(required));
|
|
||||||
for (Bridge* bridge: biboumi_component.get_bridges())
|
for (Bridge* bridge: biboumi_component.get_bridges())
|
||||||
{
|
{
|
||||||
XmlNode option("option");
|
XmlSubNode option(jids_field, "option");
|
||||||
option["label"] = bridge->get_jid();
|
option["label"] = bridge->get_jid();
|
||||||
XmlNode value("value");
|
XmlSubNode value(option, "value");
|
||||||
value.set_inner(bridge->get_jid());
|
value.set_inner(bridge->get_jid());
|
||||||
option.add_child(std::move(value));
|
|
||||||
jids_field.add_child(std::move(option));
|
|
||||||
}
|
}
|
||||||
x.add_child(std::move(jids_field));
|
|
||||||
|
|
||||||
XmlNode message_field("field");
|
XmlSubNode message_field(x, "field");
|
||||||
message_field["var"] = "quit-message";
|
message_field["var"] = "quit-message";
|
||||||
message_field["type"] = "text-single";
|
message_field["type"] = "text-single";
|
||||||
message_field["label"] = "Quit message";
|
message_field["label"] = "Quit message";
|
||||||
XmlNode message_value("value");
|
XmlSubNode message_value(message_field, "value");
|
||||||
message_value.set_inner("Disconnected by admin");
|
message_value.set_inner("Disconnected by admin");
|
||||||
message_field.add_child(std::move(message_value));
|
|
||||||
x.add_child(std::move(message_field));
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectUserStep2(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
|
void DisconnectUserStep2(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -98,7 +89,7 @@ void DisconnectUserStep2(XmppComponent& xmpp_component, AdhocSession& session, X
|
|||||||
}
|
}
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
|
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
if (num == 0)
|
if (num == 0)
|
||||||
note.set_inner("No user were disconnected.");
|
note.set_inner("No user were disconnected.");
|
||||||
@@ -106,15 +97,12 @@ void DisconnectUserStep2(XmppComponent& xmpp_component, AdhocSession& session, X
|
|||||||
note.set_inner("1 user has been disconnected.");
|
note.set_inner("1 user has been disconnected.");
|
||||||
else
|
else
|
||||||
note.set_inner(std::to_string(num) + " users have been disconnected.");
|
note.set_inner(std::to_string(num) + " users have been disconnected.");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, STANZA_NS":bad-request");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,43 +115,38 @@ void ConfigureGlobalStep1(XmppComponent&, AdhocSession& session, XmlNode& comman
|
|||||||
|
|
||||||
auto options = Database::get_global_options(owner.bare());
|
auto options = Database::get_global_options(owner.bare());
|
||||||
|
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Configure some global default settings.");
|
title.set_inner("Configure some global default settings.");
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Edit the form, to configure your global settings for the component.");
|
instructions.set_inner("Edit the form, to configure your global settings for the component.");
|
||||||
x.add_child(std::move(instructions));
|
|
||||||
|
|
||||||
XmlNode required("required");
|
XmlSubNode max_histo_length(x, "field");
|
||||||
|
|
||||||
XmlNode max_histo_length("field");
|
|
||||||
max_histo_length["var"] = "max_history_length";
|
max_histo_length["var"] = "max_history_length";
|
||||||
max_histo_length["type"] = "text-single";
|
max_histo_length["type"] = "text-single";
|
||||||
max_histo_length["label"] = "Max history length";
|
max_histo_length["label"] = "Max history length";
|
||||||
max_histo_length["desc"] = "The maximum number of lines in the history that the server sends when joining a channel";
|
max_histo_length["desc"] = "The maximum number of lines in the history that the server sends when joining a channel";
|
||||||
|
|
||||||
XmlNode value("value");
|
{
|
||||||
|
XmlSubNode value(max_histo_length, "value");
|
||||||
value.set_inner(std::to_string(options.maxHistoryLength.value()));
|
value.set_inner(std::to_string(options.maxHistoryLength.value()));
|
||||||
max_histo_length.add_child(std::move(value));
|
}
|
||||||
x.add_child(std::move(max_histo_length));
|
|
||||||
|
|
||||||
XmlNode record_history("field");
|
XmlSubNode record_history(x, "field");
|
||||||
record_history["var"] = "record_history";
|
record_history["var"] = "record_history";
|
||||||
record_history["type"] = "boolean";
|
record_history["type"] = "boolean";
|
||||||
record_history["label"] = "Record history";
|
record_history["label"] = "Record history";
|
||||||
record_history["desc"] = "Whether to save the messages into the database, or not";
|
record_history["desc"] = "Whether to save the messages into the database, or not";
|
||||||
|
|
||||||
|
{
|
||||||
|
XmlSubNode value(record_history, "value");
|
||||||
value.set_name("value");
|
value.set_name("value");
|
||||||
if (options.recordHistory.value())
|
if (options.recordHistory.value())
|
||||||
value.set_inner("true");
|
value.set_inner("true");
|
||||||
else
|
else
|
||||||
value.set_inner("false");
|
value.set_inner("false");
|
||||||
record_history.add_child(std::move(value));
|
}
|
||||||
x.add_child(std::move(record_history));
|
|
||||||
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigureGlobalStep2(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
|
void ConfigureGlobalStep2(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -195,17 +178,14 @@ void ConfigureGlobalStep2(XmppComponent& xmpp_component, AdhocSession& session,
|
|||||||
options.update();
|
options.update();
|
||||||
|
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Configuration successfully applied.");
|
note.set_inner("Configuration successfully applied.");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, STANZA_NS":bad-request");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,18 +199,16 @@ void ConfigureIrcServerStep1(XmppComponent&, AdhocSession& session, XmlNode& com
|
|||||||
auto options = Database::get_irc_server_options(owner.local + "@" + owner.domain,
|
auto options = Database::get_irc_server_options(owner.local + "@" + owner.domain,
|
||||||
server_domain);
|
server_domain);
|
||||||
|
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Configure the IRC server "s + server_domain);
|
title.set_inner("Configure the IRC server "s + server_domain);
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Edit the form, to configure the settings of the IRC server "s + server_domain);
|
instructions.set_inner("Edit the form, to configure the settings of the IRC server "s + server_domain);
|
||||||
x.add_child(std::move(instructions));
|
|
||||||
|
|
||||||
XmlNode required("required");
|
XmlNode required("required");
|
||||||
|
|
||||||
XmlNode ports("field");
|
XmlSubNode ports(x, "field");
|
||||||
ports["var"] = "ports";
|
ports["var"] = "ports";
|
||||||
ports["type"] = "text-multi";
|
ports["type"] = "text-multi";
|
||||||
ports["label"] = "Ports";
|
ports["label"] = "Ports";
|
||||||
@@ -238,15 +216,13 @@ void ConfigureIrcServerStep1(XmppComponent&, AdhocSession& session, XmlNode& com
|
|||||||
auto vals = utils::split(options.ports.value(), ';', false);
|
auto vals = utils::split(options.ports.value(), ';', false);
|
||||||
for (const auto& val: vals)
|
for (const auto& val: vals)
|
||||||
{
|
{
|
||||||
XmlNode ports_value("value");
|
XmlSubNode ports_value(ports, "value");
|
||||||
ports_value.set_inner(val);
|
ports_value.set_inner(val);
|
||||||
ports.add_child(std::move(ports_value));
|
|
||||||
}
|
}
|
||||||
ports.add_child(required);
|
ports.add_child(required);
|
||||||
x.add_child(std::move(ports));
|
|
||||||
|
|
||||||
#ifdef BOTAN_FOUND
|
#ifdef BOTAN_FOUND
|
||||||
XmlNode tls_ports("field");
|
XmlSubNode tls_ports(x, "field");
|
||||||
tls_ports["var"] = "tls_ports";
|
tls_ports["var"] = "tls_ports";
|
||||||
tls_ports["type"] = "text-multi";
|
tls_ports["type"] = "text-multi";
|
||||||
tls_ports["label"] = "TLS ports";
|
tls_ports["label"] = "TLS ports";
|
||||||
@@ -254,126 +230,105 @@ void ConfigureIrcServerStep1(XmppComponent&, AdhocSession& session, XmlNode& com
|
|||||||
vals = utils::split(options.tlsPorts.value(), ';', false);
|
vals = utils::split(options.tlsPorts.value(), ';', false);
|
||||||
for (const auto& val: vals)
|
for (const auto& val: vals)
|
||||||
{
|
{
|
||||||
XmlNode tls_ports_value("value");
|
XmlSubNode tls_ports_value(tls_ports, "value");
|
||||||
tls_ports_value.set_inner(val);
|
tls_ports_value.set_inner(val);
|
||||||
tls_ports.add_child(std::move(tls_ports_value));
|
|
||||||
}
|
}
|
||||||
tls_ports.add_child(required);
|
tls_ports.add_child(required);
|
||||||
x.add_child(std::move(tls_ports));
|
|
||||||
|
|
||||||
XmlNode verify_cert("field");
|
XmlSubNode verify_cert(x, "field");
|
||||||
verify_cert["var"] = "verify_cert";
|
verify_cert["var"] = "verify_cert";
|
||||||
verify_cert["type"] = "boolean";
|
verify_cert["type"] = "boolean";
|
||||||
verify_cert["label"] = "Verify certificate";
|
verify_cert["label"] = "Verify certificate";
|
||||||
verify_cert["desc"] = "Whether or not to abort the connection if the server’s TLS certificate is invalid";
|
verify_cert["desc"] = "Whether or not to abort the connection if the server’s TLS certificate is invalid";
|
||||||
XmlNode verify_cert_value("value");
|
XmlSubNode verify_cert_value(verify_cert, "value");
|
||||||
if (options.verifyCert.value())
|
if (options.verifyCert.value())
|
||||||
verify_cert_value.set_inner("true");
|
verify_cert_value.set_inner("true");
|
||||||
else
|
else
|
||||||
verify_cert_value.set_inner("false");
|
verify_cert_value.set_inner("false");
|
||||||
verify_cert.add_child(std::move(verify_cert_value));
|
|
||||||
x.add_child(std::move(verify_cert));
|
|
||||||
|
|
||||||
XmlNode fingerprint("field");
|
XmlSubNode fingerprint(x, "field");
|
||||||
fingerprint["var"] = "fingerprint";
|
fingerprint["var"] = "fingerprint";
|
||||||
fingerprint["type"] = "text-single";
|
fingerprint["type"] = "text-single";
|
||||||
fingerprint["label"] = "SHA-1 fingerprint of the TLS certificate to trust.";
|
fingerprint["label"] = "SHA-1 fingerprint of the TLS certificate to trust.";
|
||||||
if (!options.trustedFingerprint.value().empty())
|
if (!options.trustedFingerprint.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode fingerprint_value("value");
|
XmlSubNode fingerprint_value(fingerprint, "value");
|
||||||
fingerprint_value.set_inner(options.trustedFingerprint.value());
|
fingerprint_value.set_inner(options.trustedFingerprint.value());
|
||||||
fingerprint.add_child(std::move(fingerprint_value));
|
|
||||||
}
|
}
|
||||||
fingerprint.add_child(required);
|
fingerprint.add_child(required);
|
||||||
x.add_child(std::move(fingerprint));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
XmlNode pass("field");
|
XmlSubNode pass(x, "field");
|
||||||
pass["var"] = "pass";
|
pass["var"] = "pass";
|
||||||
pass["type"] = "text-private";
|
pass["type"] = "text-private";
|
||||||
pass["label"] = "Server password (to be used in a PASS command when connecting)";
|
pass["label"] = "Server password (to be used in a PASS command when connecting)";
|
||||||
if (!options.pass.value().empty())
|
if (!options.pass.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode pass_value("value");
|
XmlSubNode pass_value(pass, "value");
|
||||||
pass_value.set_inner(options.pass.value());
|
pass_value.set_inner(options.pass.value());
|
||||||
pass.add_child(std::move(pass_value));
|
|
||||||
}
|
}
|
||||||
pass.add_child(required);
|
pass.add_child(required);
|
||||||
x.add_child(std::move(pass));
|
|
||||||
|
|
||||||
XmlNode after_cnt_cmd("field");
|
XmlSubNode after_cnt_cmd(x, "field");
|
||||||
after_cnt_cmd["var"] = "after_connect_command";
|
after_cnt_cmd["var"] = "after_connect_command";
|
||||||
after_cnt_cmd["type"] = "text-single";
|
after_cnt_cmd["type"] = "text-single";
|
||||||
after_cnt_cmd["desc"] = "Custom IRC command sent after the connection is established with the server.";
|
after_cnt_cmd["desc"] = "Custom IRC command sent after the connection is established with the server.";
|
||||||
after_cnt_cmd["label"] = "After-connection IRC command";
|
after_cnt_cmd["label"] = "After-connection IRC command";
|
||||||
if (!options.afterConnectionCommand.value().empty())
|
if (!options.afterConnectionCommand.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode after_cnt_cmd_value("value");
|
XmlSubNode after_cnt_cmd_value(after_cnt_cmd, "value");
|
||||||
after_cnt_cmd_value.set_inner(options.afterConnectionCommand.value());
|
after_cnt_cmd_value.set_inner(options.afterConnectionCommand.value());
|
||||||
after_cnt_cmd.add_child(std::move(after_cnt_cmd_value));
|
|
||||||
}
|
}
|
||||||
after_cnt_cmd.add_child(required);
|
after_cnt_cmd.add_child(required);
|
||||||
x.add_child(std::move(after_cnt_cmd));
|
|
||||||
|
|
||||||
if (Config::get("realname_customization", "true") == "true")
|
if (Config::get("realname_customization", "true") == "true")
|
||||||
{
|
{
|
||||||
XmlNode username("field");
|
XmlSubNode username(x, "field");
|
||||||
username["var"] = "username";
|
username["var"] = "username";
|
||||||
username["type"] = "text-single";
|
username["type"] = "text-single";
|
||||||
username["label"] = "Username";
|
username["label"] = "Username";
|
||||||
if (!options.username.value().empty())
|
if (!options.username.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode username_value("value");
|
XmlSubNode username_value(username, "value");
|
||||||
username_value.set_inner(options.username.value());
|
username_value.set_inner(options.username.value());
|
||||||
username.add_child(std::move(username_value));
|
|
||||||
}
|
}
|
||||||
username.add_child(required);
|
username.add_child(required);
|
||||||
x.add_child(std::move(username));
|
|
||||||
|
|
||||||
XmlNode realname("field");
|
XmlSubNode realname(x, "field");
|
||||||
realname["var"] = "realname";
|
realname["var"] = "realname";
|
||||||
realname["type"] = "text-single";
|
realname["type"] = "text-single";
|
||||||
realname["label"] = "Realname";
|
realname["label"] = "Realname";
|
||||||
if (!options.realname.value().empty())
|
if (!options.realname.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode realname_value("value");
|
XmlSubNode realname_value(realname, "value");
|
||||||
realname_value.set_inner(options.realname.value());
|
realname_value.set_inner(options.realname.value());
|
||||||
realname.add_child(std::move(realname_value));
|
|
||||||
}
|
}
|
||||||
realname.add_child(required);
|
realname.add_child(required);
|
||||||
x.add_child(std::move(realname));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlNode encoding_out("field");
|
XmlSubNode encoding_out(x, "field");
|
||||||
encoding_out["var"] = "encoding_out";
|
encoding_out["var"] = "encoding_out";
|
||||||
encoding_out["type"] = "text-single";
|
encoding_out["type"] = "text-single";
|
||||||
encoding_out["desc"] = "The encoding used when sending messages to the IRC server.";
|
encoding_out["desc"] = "The encoding used when sending messages to the IRC server.";
|
||||||
encoding_out["label"] = "Out encoding";
|
encoding_out["label"] = "Out encoding";
|
||||||
if (!options.encodingOut.value().empty())
|
if (!options.encodingOut.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode encoding_out_value("value");
|
XmlSubNode encoding_out_value(encoding_out, "value");
|
||||||
encoding_out_value.set_inner(options.encodingOut.value());
|
encoding_out_value.set_inner(options.encodingOut.value());
|
||||||
encoding_out.add_child(std::move(encoding_out_value));
|
|
||||||
}
|
}
|
||||||
encoding_out.add_child(required);
|
encoding_out.add_child(required);
|
||||||
x.add_child(std::move(encoding_out));
|
|
||||||
|
|
||||||
XmlNode encoding_in("field");
|
XmlSubNode encoding_in(x, "field");
|
||||||
encoding_in["var"] = "encoding_in";
|
encoding_in["var"] = "encoding_in";
|
||||||
encoding_in["type"] = "text-single";
|
encoding_in["type"] = "text-single";
|
||||||
encoding_in["desc"] = "The encoding used to decode message received from the IRC server.";
|
encoding_in["desc"] = "The encoding used to decode message received from the IRC server.";
|
||||||
encoding_in["label"] = "In encoding";
|
encoding_in["label"] = "In encoding";
|
||||||
if (!options.encodingIn.value().empty())
|
if (!options.encodingIn.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode encoding_in_value("value");
|
XmlSubNode encoding_in_value(encoding_in, "value");
|
||||||
encoding_in_value.set_inner(options.encodingIn.value());
|
encoding_in_value.set_inner(options.encodingIn.value());
|
||||||
encoding_in.add_child(std::move(encoding_in_value));
|
|
||||||
}
|
}
|
||||||
encoding_in.add_child(required);
|
encoding_in.add_child(required);
|
||||||
x.add_child(std::move(encoding_in));
|
|
||||||
|
|
||||||
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -458,17 +413,14 @@ void ConfigureIrcServerStep2(XmppComponent&, AdhocSession& session, XmlNode& com
|
|||||||
options.update();
|
options.update();
|
||||||
|
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Configuration successfully applied.");
|
note.set_inner("Configuration successfully applied.");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, STANZA_NS":bad-request");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -480,46 +432,38 @@ void ConfigureIrcChannelStep1(XmppComponent&, AdhocSession& session, XmlNode& co
|
|||||||
auto options = Database::get_irc_channel_options_with_server_default(owner.local + "@" + owner.domain,
|
auto options = Database::get_irc_channel_options_with_server_default(owner.local + "@" + owner.domain,
|
||||||
iid.get_server(), iid.get_local());
|
iid.get_server(), iid.get_local());
|
||||||
|
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Configure the IRC channel "s + iid.get_local() + " on server "s + iid.get_server());
|
title.set_inner("Configure the IRC channel "s + iid.get_local() + " on server "s + iid.get_server());
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Edit the form, to configure the settings of the IRC channel "s + iid.get_local());
|
instructions.set_inner("Edit the form, to configure the settings of the IRC channel "s + iid.get_local());
|
||||||
x.add_child(std::move(instructions));
|
|
||||||
|
|
||||||
XmlNode required("required");
|
XmlNode required("required");
|
||||||
|
|
||||||
XmlNode encoding_out("field");
|
XmlSubNode encoding_out(x, "field");
|
||||||
encoding_out["var"] = "encoding_out";
|
encoding_out["var"] = "encoding_out";
|
||||||
encoding_out["type"] = "text-single";
|
encoding_out["type"] = "text-single";
|
||||||
encoding_out["desc"] = "The encoding used when sending messages to the IRC server. Defaults to the server's “out encoding” if unset for the channel";
|
encoding_out["desc"] = "The encoding used when sending messages to the IRC server. Defaults to the server's “out encoding” if unset for the channel";
|
||||||
encoding_out["label"] = "Out encoding";
|
encoding_out["label"] = "Out encoding";
|
||||||
if (!options.encodingOut.value().empty())
|
if (!options.encodingOut.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode encoding_out_value("value");
|
XmlSubNode encoding_out_value(encoding_out, "value");
|
||||||
encoding_out_value.set_inner(options.encodingOut.value());
|
encoding_out_value.set_inner(options.encodingOut.value());
|
||||||
encoding_out.add_child(std::move(encoding_out_value));
|
|
||||||
}
|
}
|
||||||
encoding_out.add_child(required);
|
encoding_out.add_child(required);
|
||||||
x.add_child(std::move(encoding_out));
|
|
||||||
|
|
||||||
XmlNode encoding_in("field");
|
XmlSubNode encoding_in(x, "field");
|
||||||
encoding_in["var"] = "encoding_in";
|
encoding_in["var"] = "encoding_in";
|
||||||
encoding_in["type"] = "text-single";
|
encoding_in["type"] = "text-single";
|
||||||
encoding_in["desc"] = "The encoding used to decode message received from the IRC server. Defaults to the server's “in encoding” if unset for the channel";
|
encoding_in["desc"] = "The encoding used to decode message received from the IRC server. Defaults to the server's “in encoding” if unset for the channel";
|
||||||
encoding_in["label"] = "In encoding";
|
encoding_in["label"] = "In encoding";
|
||||||
if (!options.encodingIn.value().empty())
|
if (!options.encodingIn.value().empty())
|
||||||
{
|
{
|
||||||
XmlNode encoding_in_value("value");
|
XmlSubNode encoding_in_value(encoding_in, "value");
|
||||||
encoding_in_value.set_inner(options.encodingIn.value());
|
encoding_in_value.set_inner(options.encodingIn.value());
|
||||||
encoding_in.add_child(std::move(encoding_in_value));
|
|
||||||
}
|
}
|
||||||
encoding_in.add_child(required);
|
encoding_in.add_child(required);
|
||||||
x.add_child(std::move(encoding_in));
|
|
||||||
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConfigureIrcChannelStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
void ConfigureIrcChannelStep2(XmppComponent&, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -548,17 +492,14 @@ void ConfigureIrcChannelStep2(XmppComponent&, AdhocSession& session, XmlNode& co
|
|||||||
options.update();
|
options.update();
|
||||||
|
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Configuration successfully applied.");
|
note.set_inner("Configuration successfully applied.");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XmlNode error(ADHOC_NS":error");
|
XmlSubNode error(command_node, ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlSubNode condition(error, STANZA_NS":bad-request");
|
||||||
error.add_child(std::move(condition));
|
|
||||||
command_node.add_child(std::move(error));
|
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
#endif // USE_DATABASE
|
#endif // USE_DATABASE
|
||||||
@@ -576,31 +517,24 @@ void DisconnectUserFromServerStep1(XmppComponent& xmpp_component, AdhocSession&
|
|||||||
{ // Send a form to select the user to disconnect
|
{ // Send a form to select the user to disconnect
|
||||||
auto& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
|
auto& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
|
||||||
|
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Disconnect a user from selected IRC servers");
|
title.set_inner("Disconnect a user from selected IRC servers");
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Choose a user JID");
|
instructions.set_inner("Choose a user JID");
|
||||||
x.add_child(std::move(instructions));
|
XmlSubNode jids_field(x, "field");
|
||||||
XmlNode jids_field("field");
|
|
||||||
jids_field["var"] = "jid";
|
jids_field["var"] = "jid";
|
||||||
jids_field["type"] = "list-single";
|
jids_field["type"] = "list-single";
|
||||||
jids_field["label"] = "The JID to disconnect";
|
jids_field["label"] = "The JID to disconnect";
|
||||||
XmlNode required("required");
|
XmlSubNode required(jids_field, "required");
|
||||||
jids_field.add_child(std::move(required));
|
|
||||||
for (Bridge* bridge: biboumi_component.get_bridges())
|
for (Bridge* bridge: biboumi_component.get_bridges())
|
||||||
{
|
{
|
||||||
XmlNode option("option");
|
XmlSubNode option(jids_field, "option");
|
||||||
option["label"] = bridge->get_jid();
|
option["label"] = bridge->get_jid();
|
||||||
XmlNode value("value");
|
XmlSubNode value(option, "value");
|
||||||
value.set_inner(bridge->get_jid());
|
value.set_inner(bridge->get_jid());
|
||||||
option.add_child(std::move(value));
|
|
||||||
jids_field.add_child(std::move(option));
|
|
||||||
}
|
}
|
||||||
x.add_child(std::move(jids_field));
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -628,53 +562,42 @@ void DisconnectUserFromServerStep2(XmppComponent& xmpp_component, AdhocSession&
|
|||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
auto& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
|
auto& biboumi_component = static_cast<BiboumiComponent&>(xmpp_component);
|
||||||
|
|
||||||
XmlNode x("jabber:x:data:x");
|
XmlSubNode x(command_node, "jabber:x:data:x");
|
||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlSubNode title(x, "title");
|
||||||
title.set_inner("Disconnect a user from selected IRC servers");
|
title.set_inner("Disconnect a user from selected IRC servers");
|
||||||
x.add_child(std::move(title));
|
XmlSubNode instructions(x, "instructions");
|
||||||
XmlNode instructions("instructions");
|
|
||||||
instructions.set_inner("Choose one or more servers to disconnect this JID from");
|
instructions.set_inner("Choose one or more servers to disconnect this JID from");
|
||||||
x.add_child(std::move(instructions));
|
XmlSubNode jids_field(x, "field");
|
||||||
XmlNode jids_field("field");
|
|
||||||
jids_field["var"] = "irc-servers";
|
jids_field["var"] = "irc-servers";
|
||||||
jids_field["type"] = "list-multi";
|
jids_field["type"] = "list-multi";
|
||||||
jids_field["label"] = "The servers to disconnect from";
|
jids_field["label"] = "The servers to disconnect from";
|
||||||
XmlNode required("required");
|
XmlSubNode required(jids_field, "required");
|
||||||
jids_field.add_child(std::move(required));
|
|
||||||
Bridge* bridge = biboumi_component.find_user_bridge(jid_to_disconnect);
|
Bridge* bridge = biboumi_component.find_user_bridge(jid_to_disconnect);
|
||||||
|
|
||||||
if (!bridge || bridge->get_irc_clients().empty())
|
if (!bridge || bridge->get_irc_clients().empty())
|
||||||
{
|
{
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("User "s + jid_to_disconnect + " is not connected to any IRC server.");
|
note.set_inner("User "s + jid_to_disconnect + " is not connected to any IRC server.");
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
session.terminate();
|
session.terminate();
|
||||||
return ;
|
return ;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& pair: bridge->get_irc_clients())
|
for (const auto& pair: bridge->get_irc_clients())
|
||||||
{
|
{
|
||||||
XmlNode option("option");
|
XmlSubNode option(jids_field, "option");
|
||||||
option["label"] = pair.first;
|
option["label"] = pair.first;
|
||||||
XmlNode value("value");
|
XmlSubNode value(option, "value");
|
||||||
value.set_inner(pair.first);
|
value.set_inner(pair.first);
|
||||||
option.add_child(std::move(value));
|
|
||||||
jids_field.add_child(std::move(option));
|
|
||||||
}
|
}
|
||||||
x.add_child(std::move(jids_field));
|
|
||||||
|
|
||||||
XmlNode message_field("field");
|
XmlSubNode message_field(x, "field");
|
||||||
message_field["var"] = "quit-message";
|
message_field["var"] = "quit-message";
|
||||||
message_field["type"] = "text-single";
|
message_field["type"] = "text-single";
|
||||||
message_field["label"] = "Quit message";
|
message_field["label"] = "Quit message";
|
||||||
XmlNode message_value("value");
|
XmlSubNode message_value(message_field, "value");
|
||||||
message_value.set_inner("Killed by admin");
|
message_value.set_inner("Killed by admin");
|
||||||
message_field.add_child(std::move(message_value));
|
|
||||||
x.add_child(std::move(message_field));
|
|
||||||
|
|
||||||
command_node.add_child(std::move(x));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisconnectUserFromServerStep3(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
|
void DisconnectUserFromServerStep3(XmppComponent& xmpp_component, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -719,14 +642,13 @@ void DisconnectUserFromServerStep3(XmppComponent& xmpp_component, AdhocSession&
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
std::string msg = jid_to_disconnect + " was disconnected from " + std::to_string(number) + " IRC server";
|
std::string msg = jid_to_disconnect + " was disconnected from " + std::to_string(number) + " IRC server";
|
||||||
if (number > 1)
|
if (number > 1)
|
||||||
msg += "s";
|
msg += "s";
|
||||||
msg += ".";
|
msg += ".";
|
||||||
note.set_inner(msg);
|
note.set_inner(msg);
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GetIrcConnectionInfoStep1(XmppComponent& component, AdhocSession& session, XmlNode& command_node)
|
void GetIrcConnectionInfoStep1(XmppComponent& component, AdhocSession& session, XmlNode& command_node)
|
||||||
@@ -742,10 +664,9 @@ void GetIrcConnectionInfoStep1(XmppComponent& component, AdhocSession& session,
|
|||||||
utils::ScopeGuard sg([&message, &command_node]()
|
utils::ScopeGuard sg([&message, &command_node]()
|
||||||
{
|
{
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
XmlNode note("note");
|
XmlSubNode note(command_node, "note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner(message);
|
note.set_inner(message);
|
||||||
command_node.add_child(std::move(note));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Bridge* bridge = biboumi_component.get_user_bridge(owner.bare());
|
Bridge* bridge = biboumi_component.get_user_bridge(owner.bare());
|
||||||
|
|||||||
@@ -626,37 +626,31 @@ void BiboumiComponent::send_archived_message(const db::MucLogLine& log_line, con
|
|||||||
const std::string& queryid)
|
const std::string& queryid)
|
||||||
{
|
{
|
||||||
Stanza message("message");
|
Stanza message("message");
|
||||||
|
{
|
||||||
message["from"] = from;
|
message["from"] = from;
|
||||||
message["to"] = to;
|
message["to"] = to;
|
||||||
|
|
||||||
XmlNode result("result");
|
XmlSubNode result(message, "result");
|
||||||
result["xmlns"] = MAM_NS;
|
result["xmlns"] = MAM_NS;
|
||||||
if (!queryid.empty())
|
if (!queryid.empty())
|
||||||
result["queryid"] = queryid;
|
result["queryid"] = queryid;
|
||||||
result["id"] = log_line.uuid.value();
|
result["id"] = log_line.uuid.value();
|
||||||
|
|
||||||
XmlNode forwarded("forwarded");
|
XmlSubNode forwarded(result, "forwarded");
|
||||||
forwarded["xmlns"] = FORWARD_NS;
|
forwarded["xmlns"] = FORWARD_NS;
|
||||||
|
|
||||||
XmlNode delay("delay");
|
XmlSubNode delay(forwarded, "delay");
|
||||||
delay["xmlns"] = DELAY_NS;
|
delay["xmlns"] = DELAY_NS;
|
||||||
delay["stamp"] = utils::to_string(log_line.date.value().timeStamp());
|
delay["stamp"] = utils::to_string(log_line.date.value().timeStamp());
|
||||||
|
|
||||||
forwarded.add_child(std::move(delay));
|
XmlSubNode submessage(forwarded, "message");
|
||||||
|
|
||||||
XmlNode submessage("message");
|
|
||||||
submessage["xmlns"] = CLIENT_NS;
|
submessage["xmlns"] = CLIENT_NS;
|
||||||
submessage["from"] = from + "/" + log_line.nick.value();
|
submessage["from"] = from + "/" + log_line.nick.value();
|
||||||
submessage["type"] = "groupchat";
|
submessage["type"] = "groupchat";
|
||||||
|
|
||||||
XmlNode body("body");
|
XmlSubNode body(submessage, "body");
|
||||||
body.set_inner(log_line.body.value());
|
body.set_inner(log_line.body.value());
|
||||||
submessage.add_child(std::move(body));
|
}
|
||||||
|
|
||||||
forwarded.add_child(std::move(submessage));
|
|
||||||
result.add_child(std::move(forwarded));
|
|
||||||
message.add_child(std::move(result));
|
|
||||||
|
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -699,24 +693,23 @@ std::vector<Bridge*> BiboumiComponent::get_bridges() const
|
|||||||
void BiboumiComponent::send_self_disco_info(const std::string& id, const std::string& jid_to)
|
void BiboumiComponent::send_self_disco_info(const std::string& id, const std::string& jid_to)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
iq["from"] = this->served_hostname;
|
iq["from"] = this->served_hostname;
|
||||||
XmlNode query("query");
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = DISCO_INFO_NS;
|
query["xmlns"] = DISCO_INFO_NS;
|
||||||
XmlNode identity("identity");
|
XmlSubNode identity(query, "identity");
|
||||||
identity["category"] = "conference";
|
identity["category"] = "conference";
|
||||||
identity["type"] = "irc";
|
identity["type"] = "irc";
|
||||||
identity["name"] = "Biboumi XMPP-IRC gateway";
|
identity["name"] = "Biboumi XMPP-IRC gateway";
|
||||||
query.add_child(std::move(identity));
|
|
||||||
for (const char *ns: {DISCO_INFO_NS, MUC_NS, ADHOC_NS, PING_NS, MAM_NS, VERSION_NS})
|
for (const char *ns: {DISCO_INFO_NS, MUC_NS, ADHOC_NS, PING_NS, MAM_NS, VERSION_NS})
|
||||||
{
|
{
|
||||||
XmlNode feature("feature");
|
XmlSubNode feature(query, "feature");
|
||||||
feature["var"] = ns;
|
feature["var"] = ns;
|
||||||
query.add_child(std::move(feature));
|
|
||||||
}
|
}
|
||||||
iq.add_child(std::move(query));
|
}
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -724,44 +717,42 @@ void BiboumiComponent::send_irc_server_disco_info(const std::string& id, const s
|
|||||||
{
|
{
|
||||||
Jid from(jid_from);
|
Jid from(jid_from);
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
iq["from"] = jid_from;
|
iq["from"] = jid_from;
|
||||||
XmlNode query("query");
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = DISCO_INFO_NS;
|
query["xmlns"] = DISCO_INFO_NS;
|
||||||
XmlNode identity("identity");
|
XmlSubNode identity(query, "identity");
|
||||||
identity["category"] = "conference";
|
identity["category"] = "conference";
|
||||||
identity["type"] = "irc";
|
identity["type"] = "irc";
|
||||||
identity["name"] = "IRC server "s + from.local + " over Biboumi";
|
identity["name"] = "IRC server "s + from.local + " over Biboumi";
|
||||||
query.add_child(std::move(identity));
|
|
||||||
for (const char *ns: {DISCO_INFO_NS, ADHOC_NS, PING_NS, VERSION_NS})
|
for (const char *ns: {DISCO_INFO_NS, ADHOC_NS, PING_NS, VERSION_NS})
|
||||||
{
|
{
|
||||||
XmlNode feature("feature");
|
XmlSubNode feature(query, "feature");
|
||||||
feature["var"] = ns;
|
feature["var"] = ns;
|
||||||
query.add_child(std::move(feature));
|
|
||||||
}
|
}
|
||||||
iq.add_child(std::move(query));
|
}
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BiboumiComponent::send_irc_channel_muc_traffic_info(const std::string id, const std::string& jid_from, const std::string& jid_to)
|
void BiboumiComponent::send_irc_channel_muc_traffic_info(const std::string id, const std::string& jid_from, const std::string& jid_to)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["from"] = jid_from;
|
iq["from"] = jid_from;
|
||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
|
|
||||||
XmlNode query("query");
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = DISCO_INFO_NS;
|
query["xmlns"] = DISCO_INFO_NS;
|
||||||
query["node"] = MUC_TRAFFIC_NS;
|
query["node"] = MUC_TRAFFIC_NS;
|
||||||
// We drop all “special” traffic (like xhtml-im, chatstates, etc), so
|
// We drop all “special” traffic (like xhtml-im, chatstates, etc), so
|
||||||
// don’t include any <feature/>
|
// don’t include any <feature/>
|
||||||
iq.add_child(std::move(query));
|
}
|
||||||
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void BiboumiComponent::send_ping_request(const std::string& from,
|
void BiboumiComponent::send_ping_request(const std::string& from,
|
||||||
@@ -769,13 +760,14 @@ void BiboumiComponent::send_ping_request(const std::string& from,
|
|||||||
const std::string& id)
|
const std::string& id)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["type"] = "get";
|
iq["type"] = "get";
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["from"] = from + "@" + this->served_hostname;
|
iq["from"] = from + "@" + this->served_hostname;
|
||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
XmlNode ping("ping");
|
XmlSubNode ping(iq, "ping");
|
||||||
ping["xmlns"] = PING_NS;
|
ping["xmlns"] = PING_NS;
|
||||||
iq.add_child(std::move(ping));
|
}
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
|
|
||||||
auto result_cb = [from, id](Bridge* bridge, const Stanza& stanza)
|
auto result_cb = [from, id](Bridge* bridge, const Stanza& stanza)
|
||||||
@@ -799,48 +791,43 @@ void BiboumiComponent::send_iq_room_list_result(const std::string& id, const std
|
|||||||
const ResultSetInfo& rs_info)
|
const ResultSetInfo& rs_info)
|
||||||
{
|
{
|
||||||
Stanza iq("iq");
|
Stanza iq("iq");
|
||||||
|
{
|
||||||
iq["from"] = from + "@" + this->served_hostname;
|
iq["from"] = from + "@" + this->served_hostname;
|
||||||
iq["to"] = to_jid;
|
iq["to"] = to_jid;
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
XmlNode query("query");
|
XmlSubNode query(iq, "query");
|
||||||
query["xmlns"] = DISCO_ITEMS_NS;
|
query["xmlns"] = DISCO_ITEMS_NS;
|
||||||
|
|
||||||
for (auto it = begin; it != end; ++it)
|
for (auto it = begin; it != end; ++it)
|
||||||
{
|
{
|
||||||
XmlNode item("item");
|
XmlSubNode item(query, "item");
|
||||||
item["jid"] = it->channel + "@" + this->served_hostname;
|
item["jid"] = it->channel + "@" + this->served_hostname;
|
||||||
query.add_child(std::move(item));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rs_info.max >= 0 || !rs_info.after.empty() || !rs_info.before.empty()))
|
if ((rs_info.max >= 0 || !rs_info.after.empty() || !rs_info.before.empty()))
|
||||||
{
|
{
|
||||||
XmlNode set_node("set");
|
XmlSubNode set_node(query, "set");
|
||||||
set_node["xmlns"] = RSM_NS;
|
set_node["xmlns"] = RSM_NS;
|
||||||
|
|
||||||
if (begin != channel_list.channels.cend())
|
if (begin != channel_list.channels.cend())
|
||||||
{
|
{
|
||||||
XmlNode first_node("first");
|
XmlSubNode first_node(set_node, "first");
|
||||||
first_node["index"] = std::to_string(std::distance(channel_list.channels.cbegin(), begin));
|
first_node["index"] = std::to_string(std::distance(channel_list.channels.cbegin(), begin));
|
||||||
first_node.set_inner(begin->channel + "@" + this->served_hostname);
|
first_node.set_inner(begin->channel + "@" + this->served_hostname);
|
||||||
set_node.add_child(std::move(first_node));
|
|
||||||
}
|
}
|
||||||
if (end != channel_list.channels.cbegin())
|
if (end != channel_list.channels.cbegin())
|
||||||
{
|
{
|
||||||
XmlNode last_node("last");
|
XmlSubNode last_node(set_node, "last");
|
||||||
last_node.set_inner(std::prev(end)->channel + "@" + this->served_hostname);
|
last_node.set_inner(std::prev(end)->channel + "@" + this->served_hostname);
|
||||||
set_node.add_child(std::move(last_node));
|
|
||||||
}
|
}
|
||||||
if (channel_list.complete)
|
if (channel_list.complete)
|
||||||
{
|
{
|
||||||
XmlNode count_node("count");
|
XmlSubNode count_node(set_node, "count");
|
||||||
count_node.set_inner(std::to_string(channel_list.channels.size()));
|
count_node.set_inner(std::to_string(channel_list.channels.size()));
|
||||||
set_node.add_child(std::move(count_node));
|
|
||||||
}
|
}
|
||||||
query.add_child(std::move(set_node));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
iq.add_child(std::move(query));
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -849,17 +836,17 @@ void BiboumiComponent::send_invitation(const std::string& room_target,
|
|||||||
const std::string& author_nick)
|
const std::string& author_nick)
|
||||||
{
|
{
|
||||||
Stanza message("message");
|
Stanza message("message");
|
||||||
|
{
|
||||||
message["from"] = room_target + "@" + this->served_hostname;
|
message["from"] = room_target + "@" + this->served_hostname;
|
||||||
message["to"] = jid_to;
|
message["to"] = jid_to;
|
||||||
XmlNode x("x");
|
XmlSubNode x(message, "x");
|
||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
XmlNode invite("invite");
|
XmlSubNode invite(x, "invite");
|
||||||
if (author_nick.empty())
|
if (author_nick.empty())
|
||||||
invite["from"] = room_target + "@" + this->served_hostname;
|
invite["from"] = room_target + "@" + this->served_hostname;
|
||||||
else
|
else
|
||||||
invite["from"] = room_target + "@" + this->served_hostname + "/" + author_nick;
|
invite["from"] = room_target + "@" + this->served_hostname + "/" + author_nick;
|
||||||
x.add_child(std::move(invite));
|
}
|
||||||
message.add_child(std::move(x));
|
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,3 +52,20 @@ TEST_CASE("handshake_digest")
|
|||||||
const auto res = get_handshake_digest("id1234", "S4CR3T");
|
const auto res = get_handshake_digest("id1234", "S4CR3T");
|
||||||
CHECK(res == "c92901b5d376ad56269914da0cce3aab976847df");
|
CHECK(res == "c92901b5d376ad56269914da0cce3aab976847df");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_CASE("substanzas")
|
||||||
|
{
|
||||||
|
Stanza a("a");
|
||||||
|
{
|
||||||
|
XmlSubNode b(a, "b");
|
||||||
|
{
|
||||||
|
CHECK(!a.has_children());
|
||||||
|
XmlSubNode c(b, "c");
|
||||||
|
XmlSubNode d(b, "d");
|
||||||
|
CHECK(!c.has_children());
|
||||||
|
CHECK(!d.has_children());
|
||||||
|
}
|
||||||
|
CHECK(b.has_children());
|
||||||
|
}
|
||||||
|
CHECK(a.has_children());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user