XmlNodes are now always closed
Remove the close() method and closed attribute. Remove all the calls to close(). (Save one bool per XmlNode, yay, and save a few ifs and some useless function calls. At best it should be unnoticeably faster and lighter and save a few keystrokes in the future)
This commit is contained in:
@@ -25,7 +25,6 @@ void PingStep1(XmppComponent*, AdhocSession&, XmlNode& command_node)
|
|||||||
XmlNode note("note");
|
XmlNode note("note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Pong");
|
note.set_inner("Pong");
|
||||||
note.close();
|
|
||||||
command_node.add_child(std::move(note));
|
command_node.add_child(std::move(note));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -35,22 +34,17 @@ void HelloStep1(XmppComponent*, AdhocSession&, XmlNode& command_node)
|
|||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlNode title("title");
|
||||||
title.set_inner("Configure your name.");
|
title.set_inner("Configure your name.");
|
||||||
title.close();
|
|
||||||
x.add_child(std::move(title));
|
x.add_child(std::move(title));
|
||||||
XmlNode instructions("instructions");
|
XmlNode instructions("instructions");
|
||||||
instructions.set_inner("Please provide your name.");
|
instructions.set_inner("Please provide your name.");
|
||||||
instructions.close();
|
|
||||||
x.add_child(std::move(instructions));
|
x.add_child(std::move(instructions));
|
||||||
XmlNode name_field("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");
|
XmlNode required("required");
|
||||||
required.close();
|
|
||||||
name_field.add_child(std::move(required));
|
name_field.add_child(std::move(required));
|
||||||
name_field.close();
|
|
||||||
x.add_child(std::move(name_field));
|
x.add_child(std::move(name_field));
|
||||||
x.close();
|
|
||||||
command_node.add_child(std::move(x));
|
command_node.add_child(std::move(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +69,6 @@ void HelloStep2(XmppComponent*, AdhocSession& session, XmlNode& command_node)
|
|||||||
XmlNode note("note");
|
XmlNode note("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);
|
||||||
note.close();
|
|
||||||
command_node.delete_all_children();
|
command_node.delete_all_children();
|
||||||
command_node.add_child(std::move(note));
|
command_node.add_child(std::move(note));
|
||||||
return;
|
return;
|
||||||
@@ -86,9 +79,7 @@ void HelloStep2(XmppComponent*, AdhocSession& session, XmlNode& command_node)
|
|||||||
XmlNode error(ADHOC_NS":error");
|
XmlNode error(ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlNode condition(STANZA_NS":bad-request");
|
||||||
condition.close();
|
|
||||||
error.add_child(std::move(condition));
|
error.add_child(std::move(condition));
|
||||||
error.close();
|
|
||||||
command_node.add_child(std::move(error));
|
command_node.add_child(std::move(error));
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
@@ -100,6 +91,5 @@ void Reload(XmppComponent*, AdhocSession&, XmlNode& command_node)
|
|||||||
XmlNode note("note");
|
XmlNode note("note");
|
||||||
note["type"] = "info";
|
note["type"] = "info";
|
||||||
note.set_inner("Configuration reloaded.");
|
note.set_inner("Configuration reloaded.");
|
||||||
note.close();
|
|
||||||
command_node.add_child(std::move(note));
|
command_node.add_child(std::move(note));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,9 +36,7 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, Xm
|
|||||||
XmlNode error(ADHOC_NS":error");
|
XmlNode error(ADHOC_NS":error");
|
||||||
error["type"] = "cancel";
|
error["type"] = "cancel";
|
||||||
XmlNode condition(STANZA_NS":item-not-found");
|
XmlNode condition(STANZA_NS":item-not-found");
|
||||||
condition.close();
|
|
||||||
error.add_child(std::move(condition));
|
error.add_child(std::move(condition));
|
||||||
error.close();
|
|
||||||
command_node.add_child(std::move(error));
|
command_node.add_child(std::move(error));
|
||||||
}
|
}
|
||||||
else if (command_it->second.is_admin_only() &&
|
else if (command_it->second.is_admin_only() &&
|
||||||
@@ -47,9 +45,7 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, Xm
|
|||||||
XmlNode error(ADHOC_NS":error");
|
XmlNode error(ADHOC_NS":error");
|
||||||
error["type"] = "cancel";
|
error["type"] = "cancel";
|
||||||
XmlNode condition(STANZA_NS":forbidden");
|
XmlNode condition(STANZA_NS":forbidden");
|
||||||
condition.close();
|
|
||||||
error.add_child(std::move(condition));
|
error.add_child(std::move(condition));
|
||||||
error.close();
|
|
||||||
command_node.add_child(std::move(error));
|
command_node.add_child(std::move(error));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -72,9 +68,7 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, Xm
|
|||||||
XmlNode error(ADHOC_NS":error");
|
XmlNode error(ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlNode condition(STANZA_NS":bad-request");
|
||||||
condition.close();
|
|
||||||
error.add_child(std::move(condition));
|
error.add_child(std::move(condition));
|
||||||
error.close();
|
|
||||||
command_node.add_child(std::move(error));
|
command_node.add_child(std::move(error));
|
||||||
}
|
}
|
||||||
else if (action == "execute" || action == "next" || action == "complete")
|
else if (action == "execute" || action == "next" || action == "complete")
|
||||||
@@ -95,9 +89,7 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, Xm
|
|||||||
command_node["status"] = "executing";
|
command_node["status"] = "executing";
|
||||||
XmlNode actions("actions");
|
XmlNode actions("actions");
|
||||||
XmlNode next("next");
|
XmlNode next("next");
|
||||||
next.close();
|
|
||||||
actions.add_child(std::move(next));
|
actions.add_child(std::move(next));
|
||||||
actions.close();
|
|
||||||
command_node.add_child(std::move(actions));
|
command_node.add_child(std::move(actions));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -112,9 +104,7 @@ XmlNode AdhocCommandsHandler::handle_request(const std::string& executor_jid, Xm
|
|||||||
XmlNode error(ADHOC_NS":error");
|
XmlNode error(ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlNode condition(STANZA_NS":bad-request");
|
||||||
condition.close();
|
|
||||||
error.add_child(std::move(condition));
|
error.add_child(std::move(condition));
|
||||||
error.close();
|
|
||||||
command_node.add_child(std::move(error));
|
command_node.add_child(std::move(error));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,12 +89,9 @@ void XmppComponent::on_connected()
|
|||||||
{
|
{
|
||||||
log_info("connected to XMPP server");
|
log_info("connected to XMPP server");
|
||||||
this->first_connection_try = true;
|
this->first_connection_try = true;
|
||||||
XmlNode node("", nullptr);
|
this->send_data("<stream:stream to='");
|
||||||
node.set_name("stream:stream");
|
this->send_data(std::string{this->served_hostname});
|
||||||
node["xmlns"] = COMPONENT_NS;
|
this->send_data("' xmlns:stream='http://etherx.jabber.org/streams' xmlns='" COMPONENT_NS "'>");
|
||||||
node["xmlns:stream"] = STREAM_NS;
|
|
||||||
node["to"] = this->served_hostname;
|
|
||||||
this->send_stanza(node);
|
|
||||||
this->doc_open = true;
|
this->doc_open = true;
|
||||||
// We may have some pending data to send: this happens when we try to send
|
// We may have some pending data to send: this happens when we try to send
|
||||||
// some data before we are actually connected. We send that data right now, if any
|
// some data before we are actually connected. We send that data right now, if any
|
||||||
@@ -152,10 +149,9 @@ void XmppComponent::on_remote_stream_open(const XmlNode& node)
|
|||||||
sprintf(digest + (i*2), "%02x", result[i]);
|
sprintf(digest + (i*2), "%02x", result[i]);
|
||||||
digest[HASH_LENGTH * 2] = '\0';
|
digest[HASH_LENGTH * 2] = '\0';
|
||||||
|
|
||||||
Stanza handshake(COMPONENT_NS":handshake");
|
this->send_data("<handshake xmlns='" COMPONENT_NS "'>");
|
||||||
handshake.set_inner(digest);
|
this->send_data(digest);
|
||||||
handshake.close();
|
this->send_data("</handshake>");
|
||||||
this->send_stanza(handshake);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmppComponent::on_remote_stream_close(const XmlNode& node)
|
void XmppComponent::on_remote_stream_close(const XmlNode& node)
|
||||||
@@ -192,9 +188,7 @@ void XmppComponent::send_stream_error(const std::string& name, const std::string
|
|||||||
error["xmlns"] = STREAM_NS;
|
error["xmlns"] = STREAM_NS;
|
||||||
if (!explanation.empty())
|
if (!explanation.empty())
|
||||||
error.set_inner(explanation);
|
error.set_inner(explanation);
|
||||||
error.close();
|
|
||||||
node.add_child(std::move(error));
|
node.add_child(std::move(error));
|
||||||
node.close();
|
|
||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,19 +214,15 @@ void XmppComponent::send_stanza_error(const std::string& kind, const std::string
|
|||||||
error["type"] = error_type;
|
error["type"] = error_type;
|
||||||
XmlNode inner_error(defined_condition);
|
XmlNode inner_error(defined_condition);
|
||||||
inner_error["xmlns"] = STANZA_NS;
|
inner_error["xmlns"] = STANZA_NS;
|
||||||
inner_error.close();
|
|
||||||
error.add_child(std::move(inner_error));
|
error.add_child(std::move(inner_error));
|
||||||
if (!text.empty())
|
if (!text.empty())
|
||||||
{
|
{
|
||||||
XmlNode text_node("text");
|
XmlNode text_node("text");
|
||||||
text_node["xmlns"] = STANZA_NS;
|
text_node["xmlns"] = STANZA_NS;
|
||||||
text_node.set_inner(text);
|
text_node.set_inner(text);
|
||||||
text_node.close();
|
|
||||||
error.add_child(std::move(text_node));
|
error.add_child(std::move(text_node));
|
||||||
}
|
}
|
||||||
error.close();
|
|
||||||
node.add_child(std::move(error));
|
node.add_child(std::move(error));
|
||||||
node.close();
|
|
||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,7 +285,6 @@ void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, con
|
|||||||
node["type"] = type;
|
node["type"] = type;
|
||||||
XmlNode body_node("body");
|
XmlNode body_node("body");
|
||||||
body_node.set_inner(std::get<0>(body));
|
body_node.set_inner(std::get<0>(body));
|
||||||
body_node.close();
|
|
||||||
node.add_child(std::move(body_node));
|
node.add_child(std::move(body_node));
|
||||||
if (std::get<1>(body))
|
if (std::get<1>(body))
|
||||||
{
|
{
|
||||||
@@ -303,10 +292,8 @@ void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, con
|
|||||||
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::get<1>(body).release());
|
html.add_child(std::get<1>(body).release());
|
||||||
html.close();
|
|
||||||
node.add_child(std::move(html));
|
node.add_child(std::move(html));
|
||||||
}
|
}
|
||||||
node.close();
|
|
||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,19 +323,15 @@ 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;
|
||||||
}
|
}
|
||||||
item.close();
|
|
||||||
x.add_child(std::move(item));
|
x.add_child(std::move(item));
|
||||||
|
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlNode status("status");
|
||||||
status["code"] = "110";
|
status["code"] = "110";
|
||||||
status.close();
|
|
||||||
x.add_child(std::move(status));
|
x.add_child(std::move(status));
|
||||||
}
|
}
|
||||||
x.close();
|
|
||||||
node.add_child(std::move(x));
|
node.add_child(std::move(x));
|
||||||
node.close();
|
|
||||||
this->send_stanza(node);
|
this->send_stanza(node);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -365,14 +348,12 @@ void XmppComponent::send_invalid_room_error(const std::string& muc_name,
|
|||||||
presence["type"] = "error";
|
presence["type"] = "error";
|
||||||
XmlNode x("x");
|
XmlNode x("x");
|
||||||
x["xmlns"] = MUC_NS;
|
x["xmlns"] = MUC_NS;
|
||||||
x.close();
|
|
||||||
presence.add_child(std::move(x));
|
presence.add_child(std::move(x));
|
||||||
XmlNode error("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");
|
XmlNode item_not_found("item-not-found");
|
||||||
item_not_found["xmlns"] = STANZA_NS;
|
item_not_found["xmlns"] = STANZA_NS;
|
||||||
item_not_found.close();
|
|
||||||
error.add_child(std::move(item_not_found));
|
error.add_child(std::move(item_not_found));
|
||||||
XmlNode text("text");
|
XmlNode text("text");
|
||||||
text["xmlns"] = STANZA_NS;
|
text["xmlns"] = STANZA_NS;
|
||||||
@@ -380,11 +361,8 @@ void XmppComponent::send_invalid_room_error(const std::string& muc_name,
|
|||||||
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);
|
||||||
text.close();
|
|
||||||
error.add_child(std::move(text));
|
error.add_child(std::move(text));
|
||||||
error.close();
|
|
||||||
presence.add_child(std::move(error));
|
presence.add_child(std::move(error));
|
||||||
presence.close();
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -396,13 +374,11 @@ void XmppComponent::send_invalid_user_error(const std::string& user_name, const
|
|||||||
message["type"] = "error";
|
message["type"] = "error";
|
||||||
XmlNode x("x");
|
XmlNode x("x");
|
||||||
x["xmlns"] = MUC_NS;
|
x["xmlns"] = MUC_NS;
|
||||||
x.close();
|
|
||||||
message.add_child(std::move(x));
|
message.add_child(std::move(x));
|
||||||
XmlNode error("error");
|
XmlNode error("error");
|
||||||
error["type"] = "cancel";
|
error["type"] = "cancel";
|
||||||
XmlNode item_not_found("item-not-found");
|
XmlNode item_not_found("item-not-found");
|
||||||
item_not_found["xmlns"] = STANZA_NS;
|
item_not_found["xmlns"] = STANZA_NS;
|
||||||
item_not_found.close();
|
|
||||||
error.add_child(std::move(item_not_found));
|
error.add_child(std::move(item_not_found));
|
||||||
XmlNode text("text");
|
XmlNode text("text");
|
||||||
text["xmlns"] = STANZA_NS;
|
text["xmlns"] = STANZA_NS;
|
||||||
@@ -410,11 +386,8 @@ void XmppComponent::send_invalid_user_error(const std::string& user_name, const
|
|||||||
text.set_inner(user_name +
|
text.set_inner(user_name +
|
||||||
" is not a valid IRC user name. A correct user jid is of the form: <nick>!<server>@" +
|
" is not a valid IRC user name. A correct user jid is of the form: <nick>!<server>@" +
|
||||||
this->served_hostname);
|
this->served_hostname);
|
||||||
text.close();
|
|
||||||
error.add_child(std::move(text));
|
error.add_child(std::move(text));
|
||||||
error.close();
|
|
||||||
message.add_child(std::move(error));
|
message.add_child(std::move(error));
|
||||||
message.close();
|
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,9 +399,7 @@ void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, cons
|
|||||||
message["type"] = "groupchat";
|
message["type"] = "groupchat";
|
||||||
XmlNode subject("subject");
|
XmlNode subject("subject");
|
||||||
subject.set_inner(std::get<0>(topic));
|
subject.set_inner(std::get<0>(topic));
|
||||||
subject.close();
|
|
||||||
message.add_child(std::move(subject));
|
message.add_child(std::move(subject));
|
||||||
message.close();
|
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -443,7 +414,6 @@ void XmppComponent::send_muc_message(const std::string& muc_name, const std::str
|
|||||||
message["type"] = "groupchat";
|
message["type"] = "groupchat";
|
||||||
XmlNode body("body");
|
XmlNode body("body");
|
||||||
body.set_inner(std::get<0>(xmpp_body));
|
body.set_inner(std::get<0>(xmpp_body));
|
||||||
body.close();
|
|
||||||
message.add_child(std::move(body));
|
message.add_child(std::move(body));
|
||||||
if (std::get<1>(xmpp_body))
|
if (std::get<1>(xmpp_body))
|
||||||
{
|
{
|
||||||
@@ -451,10 +421,8 @@ void XmppComponent::send_muc_message(const std::string& muc_name, const std::str
|
|||||||
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::get<1>(xmpp_body).release());
|
html.add_child(std::get<1>(xmpp_body).release());
|
||||||
html.close();
|
|
||||||
message.add_child(std::move(html));
|
message.add_child(std::move(html));
|
||||||
}
|
}
|
||||||
message.close();
|
|
||||||
this->send_stanza(message);
|
this->send_stanza(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -471,19 +439,15 @@ void XmppComponent::send_muc_leave(const std::string& muc_name, std::string&& ni
|
|||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlNode status("status");
|
||||||
status["code"] = "110";
|
status["code"] = "110";
|
||||||
status.close();
|
|
||||||
x.add_child(std::move(status));
|
x.add_child(std::move(status));
|
||||||
}
|
}
|
||||||
x.close();
|
|
||||||
presence.add_child(std::move(x));
|
presence.add_child(std::move(x));
|
||||||
if (!message_str.empty())
|
if (!message_str.empty())
|
||||||
{
|
{
|
||||||
XmlNode status("status");
|
XmlNode status("status");
|
||||||
status.set_inner(message_str);
|
status.set_inner(message_str);
|
||||||
status.close();
|
|
||||||
presence.add_child(std::move(status));
|
presence.add_child(std::move(status));
|
||||||
}
|
}
|
||||||
presence.close();
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,22 +467,17 @@ void XmppComponent::send_nick_change(const std::string& muc_name,
|
|||||||
x["xmlns"] = MUC_USER_NS;
|
x["xmlns"] = MUC_USER_NS;
|
||||||
XmlNode item("item");
|
XmlNode item("item");
|
||||||
item["nick"] = new_nick;
|
item["nick"] = new_nick;
|
||||||
item.close();
|
|
||||||
x.add_child(std::move(item));
|
x.add_child(std::move(item));
|
||||||
XmlNode status("status");
|
XmlNode status("status");
|
||||||
status["code"] = "303";
|
status["code"] = "303";
|
||||||
status.close();
|
|
||||||
x.add_child(std::move(status));
|
x.add_child(std::move(status));
|
||||||
if (self)
|
if (self)
|
||||||
{
|
{
|
||||||
XmlNode status2("status");
|
XmlNode status2("status");
|
||||||
status2["code"] = "110";
|
status2["code"] = "110";
|
||||||
status2.close();
|
|
||||||
x.add_child(std::move(status2));
|
x.add_child(std::move(status2));
|
||||||
}
|
}
|
||||||
x.close();
|
|
||||||
presence.add_child(std::move(x));
|
presence.add_child(std::move(x));
|
||||||
presence.close();
|
|
||||||
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);
|
||||||
@@ -542,21 +501,15 @@ void XmppComponent::kick_user(const std::string& muc_name,
|
|||||||
XmlNode actor("actor");
|
XmlNode actor("actor");
|
||||||
actor["nick"] = author;
|
actor["nick"] = author;
|
||||||
actor["jid"] = author; // backward compatibility with old clients
|
actor["jid"] = author; // backward compatibility with old clients
|
||||||
actor.close();
|
|
||||||
item.add_child(std::move(actor));
|
item.add_child(std::move(actor));
|
||||||
XmlNode reason("reason");
|
XmlNode reason("reason");
|
||||||
reason.set_inner(txt);
|
reason.set_inner(txt);
|
||||||
reason.close();
|
|
||||||
item.add_child(std::move(reason));
|
item.add_child(std::move(reason));
|
||||||
item.close();
|
|
||||||
x.add_child(std::move(item));
|
x.add_child(std::move(item));
|
||||||
XmlNode status("status");
|
XmlNode status("status");
|
||||||
status["code"] = "307";
|
status["code"] = "307";
|
||||||
status.close();
|
|
||||||
x.add_child(std::move(status));
|
x.add_child(std::move(status));
|
||||||
x.close();
|
|
||||||
presence.add_child(std::move(x));
|
presence.add_child(std::move(x));
|
||||||
presence.close();
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,7 +527,6 @@ void XmppComponent::send_presence_error(const std::string& muc_name,
|
|||||||
presence["type"] = "error";
|
presence["type"] = "error";
|
||||||
XmlNode x("x");
|
XmlNode x("x");
|
||||||
x["xmlns"] = MUC_NS;
|
x["xmlns"] = MUC_NS;
|
||||||
x.close();
|
|
||||||
presence.add_child(std::move(x));
|
presence.add_child(std::move(x));
|
||||||
XmlNode error("error");
|
XmlNode error("error");
|
||||||
error["by"] = muc_name + "@" + this->served_hostname;
|
error["by"] = muc_name + "@" + this->served_hostname;
|
||||||
@@ -583,11 +535,8 @@ void XmppComponent::send_presence_error(const std::string& muc_name,
|
|||||||
error["code"] = error_code;
|
error["code"] = error_code;
|
||||||
XmlNode subnode(condition);
|
XmlNode subnode(condition);
|
||||||
subnode["xmlns"] = STANZA_NS;
|
subnode["xmlns"] = STANZA_NS;
|
||||||
subnode.close();
|
|
||||||
error.add_child(std::move(subnode));
|
error.add_child(std::move(subnode));
|
||||||
error.close();
|
|
||||||
presence.add_child(std::move(error));
|
presence.add_child(std::move(error));
|
||||||
presence.close();
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -605,11 +554,8 @@ void XmppComponent::send_affiliation_role_change(const std::string& muc_name,
|
|||||||
XmlNode item("item");
|
XmlNode item("item");
|
||||||
item["affiliation"] = affiliation;
|
item["affiliation"] = affiliation;
|
||||||
item["role"] = role;
|
item["role"] = role;
|
||||||
item.close();
|
|
||||||
x.add_child(std::move(item));
|
x.add_child(std::move(item));
|
||||||
x.close();
|
|
||||||
presence.add_child(std::move(x));
|
presence.add_child(std::move(x));
|
||||||
presence.close();
|
|
||||||
this->send_stanza(presence);
|
this->send_stanza(presence);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -627,27 +573,21 @@ void XmppComponent::send_version(const std::string& id, const std::string& jid_t
|
|||||||
{
|
{
|
||||||
XmlNode name("name");
|
XmlNode name("name");
|
||||||
name.set_inner("biboumi");
|
name.set_inner("biboumi");
|
||||||
name.close();
|
|
||||||
query.add_child(std::move(name));
|
query.add_child(std::move(name));
|
||||||
XmlNode version("version");
|
XmlNode version("version");
|
||||||
version.set_inner(SOFTWARE_VERSION);
|
version.set_inner(SOFTWARE_VERSION);
|
||||||
version.close();
|
|
||||||
query.add_child(std::move(version));
|
query.add_child(std::move(version));
|
||||||
XmlNode os("os");
|
XmlNode os("os");
|
||||||
os.set_inner(SYSTEM_NAME);
|
os.set_inner(SYSTEM_NAME);
|
||||||
os.close();
|
|
||||||
query.add_child(std::move(os));
|
query.add_child(std::move(os));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
XmlNode name("name");
|
XmlNode name("name");
|
||||||
name.set_inner(version);
|
name.set_inner(version);
|
||||||
name.close();
|
|
||||||
query.add_child(std::move(name));
|
query.add_child(std::move(name));
|
||||||
}
|
}
|
||||||
query.close();
|
|
||||||
iq.add_child(std::move(query));
|
iq.add_child(std::move(query));
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -669,12 +609,9 @@ void XmppComponent::send_adhoc_commands_list(const std::string& id, const std::s
|
|||||||
item["jid"] = this->served_hostname;
|
item["jid"] = this->served_hostname;
|
||||||
item["node"] = kv.first;
|
item["node"] = kv.first;
|
||||||
item["name"] = kv.second.name;
|
item["name"] = kv.second.name;
|
||||||
item.close();
|
|
||||||
query.add_child(std::move(item));
|
query.add_child(std::move(item));
|
||||||
}
|
}
|
||||||
query.close();
|
|
||||||
iq.add_child(std::move(query));
|
iq.add_child(std::move(query));
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -688,9 +625,7 @@ void XmppComponent::send_iq_version_request(const std::string& from,
|
|||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
XmlNode query("query");
|
XmlNode query("query");
|
||||||
query["xmlns"] = VERSION_NS;
|
query["xmlns"] = VERSION_NS;
|
||||||
query.close();
|
|
||||||
iq.add_child(std::move(query));
|
iq.add_child(std::move(query));
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -704,7 +639,6 @@ void XmppComponent::send_iq_result(const std::string& id, const std::string& to_
|
|||||||
iq["to"] = to_jid;
|
iq["to"] = to_jid;
|
||||||
iq["id"] = id;
|
iq["id"] = id;
|
||||||
iq["type"] = "result";
|
iq["type"] = "result";
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,6 @@ void XmppParser::end_element(const XML_Char* name)
|
|||||||
{
|
{
|
||||||
(void)name;
|
(void)name;
|
||||||
level--;
|
level--;
|
||||||
this->current_node->close();
|
|
||||||
if (level == 1)
|
if (level == 1)
|
||||||
{
|
{
|
||||||
this->stanza_event(*this->current_node);
|
this->stanza_event(*this->current_node);
|
||||||
|
|||||||
@@ -84,8 +84,7 @@ std::string xml_unescape(const std::string& data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
XmlNode::XmlNode(const std::string& name, XmlNode* parent):
|
XmlNode::XmlNode(const std::string& name, XmlNode* parent):
|
||||||
parent(parent),
|
parent(parent)
|
||||||
closed(false)
|
|
||||||
{
|
{
|
||||||
// split the namespace and the name
|
// split the namespace and the name
|
||||||
auto n = name.rfind(":");
|
auto n = name.rfind(":");
|
||||||
@@ -191,13 +190,6 @@ XmlNode* XmlNode::get_last_child() const
|
|||||||
return this->children.back();
|
return this->children.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
void XmlNode::close()
|
|
||||||
{
|
|
||||||
if (this->closed)
|
|
||||||
throw std::runtime_error("Closing an already closed XmlNode");
|
|
||||||
this->closed = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
XmlNode* XmlNode::get_parent() const
|
XmlNode* XmlNode::get_parent() const
|
||||||
{
|
{
|
||||||
return this->parent;
|
return this->parent;
|
||||||
@@ -219,18 +211,15 @@ std::string XmlNode::to_string() const
|
|||||||
res += this->name;
|
res += this->name;
|
||||||
for (const auto& it: this->attributes)
|
for (const auto& it: this->attributes)
|
||||||
res += " " + it.first + "='" + sanitize(it.second) + "'";
|
res += " " + it.first + "='" + sanitize(it.second) + "'";
|
||||||
if (this->closed && !this->has_children() && this->inner.empty())
|
if (!this->has_children() && this->inner.empty())
|
||||||
res += "/>";
|
res += "/>";
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
res += ">" + sanitize(this->inner);
|
res += ">" + sanitize(this->inner);
|
||||||
for (const auto& child: this->children)
|
for (const auto& child: this->children)
|
||||||
res += child->to_string();
|
res += child->to_string();
|
||||||
if (this->closed)
|
|
||||||
{
|
|
||||||
res += "</" + this->get_name() + ">";
|
res += "</" + this->get_name() + ">";
|
||||||
}
|
}
|
||||||
}
|
|
||||||
res += sanitize(this->tail);
|
res += sanitize(this->tail);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ public:
|
|||||||
XmlNode(XmlNode&& node):
|
XmlNode(XmlNode&& node):
|
||||||
name(std::move(node.name)),
|
name(std::move(node.name)),
|
||||||
parent(node.parent),
|
parent(node.parent),
|
||||||
closed(node.closed),
|
|
||||||
attributes(std::move(node.attributes)),
|
attributes(std::move(node.attributes)),
|
||||||
children(std::move(node.children)),
|
children(std::move(node.children)),
|
||||||
inner(std::move(node.inner)),
|
inner(std::move(node.inner)),
|
||||||
@@ -42,7 +41,6 @@ public:
|
|||||||
XmlNode(const XmlNode& node):
|
XmlNode(const XmlNode& node):
|
||||||
name(node.name),
|
name(node.name),
|
||||||
parent(nullptr),
|
parent(nullptr),
|
||||||
closed(node.closed),
|
|
||||||
attributes(node.attributes),
|
attributes(node.attributes),
|
||||||
children{},
|
children{},
|
||||||
inner(node.inner),
|
inner(node.inner),
|
||||||
@@ -106,10 +104,6 @@ public:
|
|||||||
* by calling has_children() for example.
|
* by calling has_children() for example.
|
||||||
*/
|
*/
|
||||||
XmlNode* get_last_child() const;
|
XmlNode* get_last_child() const;
|
||||||
/**
|
|
||||||
* Mark this node as closed, nothing else
|
|
||||||
*/
|
|
||||||
void close();
|
|
||||||
XmlNode* get_parent() const;
|
XmlNode* get_parent() const;
|
||||||
void set_name(const std::string& name);
|
void set_name(const std::string& name);
|
||||||
const std::string get_name() const;
|
const std::string get_name() const;
|
||||||
@@ -140,7 +134,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
std::string name;
|
std::string name;
|
||||||
XmlNode* parent;
|
XmlNode* parent;
|
||||||
bool closed;
|
|
||||||
std::unordered_map<std::string, std::string> attributes;
|
std::unordered_map<std::string, std::string> attributes;
|
||||||
std::vector<XmlNode*> children;
|
std::vector<XmlNode*> children;
|
||||||
std::string inner;
|
std::string inner;
|
||||||
|
|||||||
@@ -80,7 +80,6 @@ Xmpp::body irc_format_to_xhtmlim(const std::string& s)
|
|||||||
else if (s[pos_end] == IRC_FORMAT_NEWLINE_CHAR)
|
else if (s[pos_end] == IRC_FORMAT_NEWLINE_CHAR)
|
||||||
{
|
{
|
||||||
XmlNode* br_node = new XmlNode("br");
|
XmlNode* br_node = new XmlNode("br");
|
||||||
br_node->close();
|
|
||||||
current_node->add_child(br_node);
|
current_node->add_child(br_node);
|
||||||
cleaned += '\n';
|
cleaned += '\n';
|
||||||
}
|
}
|
||||||
@@ -126,7 +125,6 @@ Xmpp::body irc_format_to_xhtmlim(const std::string& s)
|
|||||||
// close opened span, if any
|
// close opened span, if any
|
||||||
if (current_node != result.get())
|
if (current_node != result.get())
|
||||||
{
|
{
|
||||||
current_node->close();
|
|
||||||
result->add_child(current_node);
|
result->add_child(current_node);
|
||||||
current_node = result.get();
|
current_node = result.get();
|
||||||
}
|
}
|
||||||
@@ -163,12 +161,8 @@ Xmpp::body irc_format_to_xhtmlim(const std::string& s)
|
|||||||
current_node->add_to_inner(txt);
|
current_node->add_to_inner(txt);
|
||||||
|
|
||||||
if (current_node != result.get())
|
if (current_node != result.get())
|
||||||
{
|
|
||||||
current_node->close();
|
|
||||||
result->add_child(current_node);
|
result->add_child(current_node);
|
||||||
}
|
|
||||||
|
|
||||||
result->close();
|
|
||||||
Xmpp::body body_res = std::make_tuple(cleaned, std::move(result));
|
Xmpp::body body_res = std::make_tuple(cleaned, std::move(result));
|
||||||
return body_res;
|
return body_res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,18 +10,15 @@ void DisconnectUserStep1(XmppComponent* xmpp_component, AdhocSession&, XmlNode&
|
|||||||
x["type"] = "form";
|
x["type"] = "form";
|
||||||
XmlNode title("title");
|
XmlNode title("title");
|
||||||
title.set_inner("Disconnect a user from the gateway");
|
title.set_inner("Disconnect a user from the gateway");
|
||||||
title.close();
|
|
||||||
x.add_child(std::move(title));
|
x.add_child(std::move(title));
|
||||||
XmlNode instructions("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");
|
||||||
instructions.close();
|
|
||||||
x.add_child(std::move(instructions));
|
x.add_child(std::move(instructions));
|
||||||
XmlNode jids_field("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");
|
XmlNode required("required");
|
||||||
required.close();
|
|
||||||
jids_field.add_child(std::move(required));
|
jids_field.add_child(std::move(required));
|
||||||
for (Bridge* bridge: biboumi_component->get_bridges())
|
for (Bridge* bridge: biboumi_component->get_bridges())
|
||||||
{
|
{
|
||||||
@@ -29,12 +26,9 @@ void DisconnectUserStep1(XmppComponent* xmpp_component, AdhocSession&, XmlNode&
|
|||||||
option["label"] = bridge->get_jid();
|
option["label"] = bridge->get_jid();
|
||||||
XmlNode value("value");
|
XmlNode value("value");
|
||||||
value.set_inner(bridge->get_jid());
|
value.set_inner(bridge->get_jid());
|
||||||
value.close();
|
|
||||||
option.add_child(std::move(value));
|
option.add_child(std::move(value));
|
||||||
option.close();
|
|
||||||
jids_field.add_child(std::move(option));
|
jids_field.add_child(std::move(option));
|
||||||
}
|
}
|
||||||
jids_field.close();
|
|
||||||
x.add_child(std::move(jids_field));
|
x.add_child(std::move(jids_field));
|
||||||
|
|
||||||
XmlNode message_field("field");
|
XmlNode message_field("field");
|
||||||
@@ -43,11 +37,8 @@ void DisconnectUserStep1(XmppComponent* xmpp_component, AdhocSession&, XmlNode&
|
|||||||
message_field["label"] = "Quit message";
|
message_field["label"] = "Quit message";
|
||||||
XmlNode message_value("value");
|
XmlNode message_value("value");
|
||||||
message_value.set_inner("Disconnected by admin");
|
message_value.set_inner("Disconnected by admin");
|
||||||
message_value.close();
|
|
||||||
message_field.add_child(std::move(message_value));
|
message_field.add_child(std::move(message_value));
|
||||||
message_field.close();
|
|
||||||
x.add_child(std::move(message_field));
|
x.add_child(std::move(message_field));
|
||||||
x.close();
|
|
||||||
command_node.add_child(std::move(x));
|
command_node.add_child(std::move(x));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +86,6 @@ 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.");
|
||||||
note.close();
|
|
||||||
command_node.add_child(std::move(note));
|
command_node.add_child(std::move(note));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -103,9 +93,7 @@ void DisconnectUserStep2(XmppComponent* xmpp_component, AdhocSession& session, X
|
|||||||
XmlNode error(ADHOC_NS":error");
|
XmlNode error(ADHOC_NS":error");
|
||||||
error["type"] = "modify";
|
error["type"] = "modify";
|
||||||
XmlNode condition(STANZA_NS":bad-request");
|
XmlNode condition(STANZA_NS":bad-request");
|
||||||
condition.close();
|
|
||||||
error.add_child(std::move(condition));
|
error.add_child(std::move(condition));
|
||||||
error.close();
|
|
||||||
command_node.add_child(std::move(error));
|
command_node.add_child(std::move(error));
|
||||||
session.terminate();
|
session.terminate();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -321,7 +321,6 @@ void BiboumiComponent::handle_iq(const Stanza& stanza)
|
|||||||
else
|
else
|
||||||
response["type"] = "result";
|
response["type"] = "result";
|
||||||
response.add_child(std::move(inner_node));
|
response.add_child(std::move(inner_node));
|
||||||
response.close();
|
|
||||||
this->send_stanza(response);
|
this->send_stanza(response);
|
||||||
stanza_error.disable();
|
stanza_error.disable();
|
||||||
}
|
}
|
||||||
@@ -494,18 +493,14 @@ void BiboumiComponent::send_self_disco_info(const std::string& id, const std::st
|
|||||||
identity["category"] = "conference";
|
identity["category"] = "conference";
|
||||||
identity["type"] = "irc";
|
identity["type"] = "irc";
|
||||||
identity["name"] = "Biboumi XMPP-IRC gateway";
|
identity["name"] = "Biboumi XMPP-IRC gateway";
|
||||||
identity.close();
|
|
||||||
query.add_child(std::move(identity));
|
query.add_child(std::move(identity));
|
||||||
for (const std::string& ns: {DISCO_INFO_NS, MUC_NS, ADHOC_NS})
|
for (const std::string& ns: {DISCO_INFO_NS, MUC_NS, ADHOC_NS})
|
||||||
{
|
{
|
||||||
XmlNode feature("feature");
|
XmlNode feature("feature");
|
||||||
feature["var"] = ns;
|
feature["var"] = ns;
|
||||||
feature.close();
|
|
||||||
query.add_child(std::move(feature));
|
query.add_child(std::move(feature));
|
||||||
}
|
}
|
||||||
query.close();
|
|
||||||
iq.add_child(std::move(query));
|
iq.add_child(std::move(query));
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -519,9 +514,7 @@ void BiboumiComponent::send_iq_version_request(const std::string& from,
|
|||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
XmlNode query("query");
|
XmlNode query("query");
|
||||||
query["xmlns"] = VERSION_NS;
|
query["xmlns"] = VERSION_NS;
|
||||||
query.close();
|
|
||||||
iq.add_child(std::move(query));
|
iq.add_child(std::move(query));
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -536,9 +529,7 @@ void BiboumiComponent::send_ping_request(const std::string& from,
|
|||||||
iq["to"] = jid_to;
|
iq["to"] = jid_to;
|
||||||
XmlNode ping("ping");
|
XmlNode ping("ping");
|
||||||
ping["xmlns"] = PING_NS;
|
ping["xmlns"] = PING_NS;
|
||||||
ping.close();
|
|
||||||
iq.add_child(std::move(ping));
|
iq.add_child(std::move(ping));
|
||||||
iq.close();
|
|
||||||
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)
|
||||||
@@ -571,11 +562,8 @@ void BiboumiComponent::send_iq_room_list_result(const std::string& id,
|
|||||||
{
|
{
|
||||||
XmlNode item("item");
|
XmlNode item("item");
|
||||||
item["jid"] = room.channel + "%" + from + "@" + this->served_hostname;
|
item["jid"] = room.channel + "%" + from + "@" + this->served_hostname;
|
||||||
item.close();
|
|
||||||
query.add_child(std::move(item));
|
query.add_child(std::move(item));
|
||||||
}
|
}
|
||||||
query.close();
|
|
||||||
iq.add_child(std::move(query));
|
iq.add_child(std::move(query));
|
||||||
iq.close();
|
|
||||||
this->send_stanza(iq);
|
this->send_stanza(iq);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user