Commit 37340e59 authored by louiz’'s avatar louiz’

Add a <x muc#user> node on outgoing private MUC messages

See https://xmpp.org/extensions/xep-0045.html#privatemessage

fix #3321
parent 286aa58c
...@@ -862,7 +862,8 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st ...@@ -862,7 +862,8 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st
const auto chan_name = Iid(Jid(it->second).local, {}).get_local(); const auto chan_name = Iid(Jid(it->second).local, {}).get_local();
for (const auto& resource: this->resources_in_chan[ChannelKey{chan_name, iid.get_server()}]) for (const auto& resource: this->resources_in_chan[ChannelKey{chan_name, iid.get_server()}])
this->xmpp.send_message(it->second, this->make_xmpp_body(body, encoding), this->xmpp.send_message(it->second, this->make_xmpp_body(body, encoding),
this->user_jid + "/" + resource, "chat", true, true); this->user_jid + "/"
+ resource, "chat", true, true, true);
} }
else else
{ {
......
...@@ -269,7 +269,8 @@ void* XmppComponent::get_receive_buffer(const size_t size) const ...@@ -269,7 +269,8 @@ 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,
const bool muc_private)
{ {
Stanza message("message"); Stanza message("message");
{ {
...@@ -301,6 +302,11 @@ void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, con ...@@ -301,6 +302,11 @@ void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, con
XmlSubNode nocopy(message, "no-copy"); XmlSubNode nocopy(message, "no-copy");
nocopy["xmlns"] = "urn:xmpp:hints"; nocopy["xmlns"] = "urn:xmpp:hints";
} }
if (muc_private)
{
XmlSubNode x(message, "x");
x["xmlns"] = MUC_USER_NS;
}
} }
this->send_stanza(message); this->send_stanza(message);
} }
......
...@@ -112,7 +112,8 @@ public: ...@@ -112,7 +112,8 @@ public:
* server-part of the JID and must be added. * server-part of the JID and must be added.
*/ */
void send_message(const std::string& from, Xmpp::body&& body, const std::string& to, void send_message(const std::string& from, Xmpp::body&& body, const std::string& to,
const std::string& type, const bool fulljid, const bool nocopy=false); const std::string& type, const bool fulljid, const bool nocopy=false,
const bool muc_private=false);
/** /**
* Send a join from a new participant * Send a join from a new participant
*/ */
......
...@@ -1088,7 +1088,8 @@ if __name__ == '__main__': ...@@ -1088,7 +1088,8 @@ if __name__ == '__main__':
# Message is received with a server-wide JID, by the two resources behind nick_one # Message is received with a server-wide JID, by the two resources behind nick_one
partial(expect_stanza, ("/message[@from='{lower_nick_two}%{irc_server_one}'][@to='{jid_one}/{resource_one}'][@type='chat']/body[text()='RELLO']", partial(expect_stanza, ("/message[@from='{lower_nick_two}%{irc_server_one}'][@to='{jid_one}/{resource_one}'][@type='chat']/body[text()='RELLO']",
"/message/hints:no-copy", "/message/hints:no-copy",
"/message/carbon:private")), "/message/carbon:private",
"!/message/muc_user:x")),
partial(expect_stanza, "/message[@from='{lower_nick_two}%{irc_server_one}'][@to='{jid_one}/{resource_two}'][@type='chat']/body[text()='RELLO']"), partial(expect_stanza, "/message[@from='{lower_nick_two}%{irc_server_one}'][@to='{jid_one}/{resource_two}'][@type='chat']/body[text()='RELLO']"),
...@@ -1280,7 +1281,8 @@ if __name__ == '__main__': ...@@ -1280,7 +1281,8 @@ if __name__ == '__main__':
# Respond to the message, to the server-wide JID # Respond to the message, to the server-wide JID
partial(send_stanza, "<message from='{jid_two}/{resource_one}' to='{lower_nick_one}%{irc_server_one}' type='chat'><body>yes</body></message>"), partial(send_stanza, "<message from='{jid_two}/{resource_one}' to='{lower_nick_one}%{irc_server_one}' type='chat'><body>yes</body></message>"),
# The response is received from the in-room JID # The response is received from the in-room JID
partial(expect_stanza, "/message[@from='#foo%{irc_server_one}/{nick_two}'][@to='{jid_one}/{resource_one}'][@type='chat']/body[text()='yes']"), partial(expect_stanza, ("/message[@from='#foo%{irc_server_one}/{nick_two}'][@to='{jid_one}/{resource_one}'][@type='chat']/body[text()='yes']",
"/message/muc_user:x")),
## Do the exact same thing, from a different chan, ## Do the exact same thing, from a different chan,
# to check if the response comes from the right JID # to check if the response comes from the right JID
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment