~singpolyma/biboumi

37340e593ffb61eaccc444a1efdb3aa6f784a14a — louiz’ 4 years ago 286aa58
Add a <x muc#user> node on outgoing private MUC messages

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

fix #3321
M src/bridge/bridge.cpp => src/bridge/bridge.cpp +2 -1
@@ 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();
          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->user_jid + "/" + resource, "chat", true, true);
                                    this->user_jid + "/"
                                    + resource, "chat", true, true, true);
        }
      else
        {

M src/xmpp/xmpp_component.cpp => src/xmpp/xmpp_component.cpp +7 -1
@@ 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,
                                 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");
  {


@@ 301,6 302,11 @@ void XmppComponent::send_message(const std::string& from, Xmpp::body&& body, con
        XmlSubNode nocopy(message, "no-copy");
        nocopy["xmlns"] = "urn:xmpp:hints";
      }
    if (muc_private)
      {
        XmlSubNode x(message, "x");
        x["xmlns"] = MUC_USER_NS;
      }
  }
  this->send_stanza(message);
}

M src/xmpp/xmpp_component.hpp => src/xmpp/xmpp_component.hpp +2 -1
@@ 112,7 112,8 @@ public:
   * server-part of the JID and must be added.
   */
  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
   */

M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +4 -2
@@ 1088,7 1088,8 @@ if __name__ == '__main__':
                     # 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']",
                                             "/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']"),




@@ 1280,7 1281,8 @@ if __name__ == '__main__':
                     # 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>"),
                     # 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,
                     # to check if the response comes from the right JID