From 7f2127a7ea4c49fc1fbcd6cd6fb13e0265f4d841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?louiz=E2=80=99?= Date: Thu, 30 Mar 2017 18:16:44 +0200 Subject: Add the archive ID to messages when they are sent to users This makes us compatible with mam 6.0 fix #3249 --- CHANGELOG.rst | 1 + src/bridge/bridge.cpp | 11 ++++++----- src/database/database.cpp | 14 +++++++++----- src/database/database.hpp | 2 +- src/xmpp/xmpp_component.cpp | 11 ++++++++++- src/xmpp/xmpp_component.hpp | 4 +++- tests/end_to_end/__main__.py | 8 ++++++-- 7 files changed, 36 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e4ff422..58ffc04 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -10,6 +10,7 @@ Version 5.0 an IRC bouncer. - Use the udns library instead of c-ares, for asynchronous DNS resolution. It’s still fully optional. + - Update MAM implementation to version 6.0 (namespace mam:2) Version 4.1 - 2017-03-21 ======================== diff --git a/src/bridge/bridge.cpp b/src/bridge/bridge.cpp index 0d6ade3..2da1d96 100644 --- a/src/bridge/bridge.cpp +++ b/src/bridge/bridge.cpp @@ -254,15 +254,16 @@ void Bridge::send_channel_message(const Iid& iid, const std::string& body) else irc->send_channel_message(iid.get_local(), line); + std::string uuid; #ifdef USE_DATABASE const auto xmpp_body = this->make_xmpp_body(line); if (this->record_history) - Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(), + uuid = Database::store_muc_message(this->get_bare_jid(), iid, std::chrono::system_clock::now(), std::get<0>(xmpp_body), irc->get_own_nick()); #endif for (const auto& resource: this->resources_in_chan[iid.to_tuple()]) - this->xmpp.send_muc_message(std::to_string(iid), irc->get_own_nick(), - this->make_xmpp_body(line), this->user_jid + "/" + resource); + this->xmpp.send_muc_message(std::to_string(iid), irc->get_own_nick(), this->make_xmpp_body(line), + this->user_jid + "/" + resource, uuid); } } @@ -839,8 +840,8 @@ void Bridge::send_message(const Iid& iid, const std::string& nick, const std::st #endif for (const auto& resource: this->resources_in_chan[iid.to_tuple()]) { - this->xmpp.send_muc_message(std::to_string(iid), nick, - this->make_xmpp_body(body, encoding), this->user_jid + "/" + resource); + this->xmpp.send_muc_message(std::to_string(iid), nick, this->make_xmpp_body(body, encoding), + this->user_jid + "/" + resource, {}); } } diff --git a/src/database/database.cpp b/src/database/database.cpp index 71b0c37..9f310da 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -119,14 +119,16 @@ db::IrcChannelOptions Database::get_irc_channel_options_with_server_and_global_d return coptions; } -void Database::store_muc_message(const std::string& owner, const Iid& iid, - Database::time_point date, - const std::string& body, - const std::string& nick) +std::string Database::store_muc_message(const std::string& owner, const Iid& iid, + Database::time_point date, + const std::string& body, + const std::string& nick) { db::MucLogLine line(*Database::db); - line.uuid = Database::gen_uuid(); + auto uuid = Database::gen_uuid(); + + line.uuid = uuid; line.owner = owner; line.ircChanName = iid.get_local(); line.ircServerName = iid.get_server(); @@ -135,6 +137,8 @@ void Database::store_muc_message(const std::string& owner, const Iid& iid, line.nick = nick; line.update(); + + return uuid; } std::vector Database::get_muc_logs(const std::string& owner, const std::string& chan_name, const std::string& server, diff --git a/src/database/database.hpp b/src/database/database.hpp index 1665a9a..b08a175 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -50,7 +50,7 @@ public: const std::string& channel); static std::vector get_muc_logs(const std::string& owner, const std::string& chan_name, const std::string& server, int limit=-1, const std::string& start="", const std::string& end=""); - static void store_muc_message(const std::string& owner, const Iid& iid, + static std::string store_muc_message(const std::string& owner, const Iid& iid, time_point date, const std::string& body, const std::string& nick); static void close(); diff --git a/src/xmpp/xmpp_component.cpp b/src/xmpp/xmpp_component.cpp index 6829cef..8335c8a 100644 --- a/src/xmpp/xmpp_component.cpp +++ b/src/xmpp/xmpp_component.cpp @@ -380,7 +380,7 @@ void XmppComponent::send_topic(const std::string& from, Xmpp::body&& topic, cons this->send_stanza(message); } -void XmppComponent::send_muc_message(const std::string& muc_name, const std::string& nick, Xmpp::body&& xmpp_body, const std::string& jid_to) +void XmppComponent::send_muc_message(const std::string& muc_name, const std::string& nick, Xmpp::body&& xmpp_body, const std::string& jid_to, std::string uuid) { Stanza message("message"); message["to"] = jid_to; @@ -402,6 +402,15 @@ void XmppComponent::send_muc_message(const std::string& muc_name, const std::str // Pass the ownership of the pointer to this xmlnode html.add_child(std::move(std::get<1>(xmpp_body))); } + + if (!uuid.empty()) + { + XmlSubNode stanza_id(message, "stanza-id"); + stanza_id["xmlns"] = STABLE_ID_NS; + stanza_id["by"] = muc_name + "@" + this->served_hostname; + stanza_id["id"] = std::move(uuid); + } + this->send_stanza(message); } diff --git a/src/xmpp/xmpp_component.hpp b/src/xmpp/xmpp_component.hpp index 250f0a8..8eabaf6 100644 --- a/src/xmpp/xmpp_component.hpp +++ b/src/xmpp/xmpp_component.hpp @@ -33,6 +33,7 @@ #define DATAFORM_NS "jabber:x:data" #define RSM_NS "http://jabber.org/protocol/rsm" #define MUC_TRAFFIC_NS "http://jabber.org/protocol/muc#traffic" +#define STABLE_ID_NS "urn:xmpp:sid:0" /** * An XMPP component, communicating with an XMPP server using the protocole @@ -134,7 +135,8 @@ public: /** * Send a (non-private) message to the MUC */ - void send_muc_message(const std::string& muc_name, const std::string& nick, Xmpp::body&& body, const std::string& jid_to); + void send_muc_message(const std::string& muc_name, const std::string& nick, Xmpp::body&& body, const std::string& jid_to, + std::string uuid); /** * Send a message, with a element, part of a MUC history */ diff --git a/tests/end_to_end/__main__.py b/tests/end_to_end/__main__.py index 088be9c..fd833e2 100644 --- a/tests/end_to_end/__main__.py +++ b/tests/end_to_end/__main__.py @@ -132,7 +132,8 @@ def match(stanza, xpath): 'rsm': 'http://jabber.org/protocol/rsm', 'carbon': 'urn:xmpp:carbons:2', 'hints': 'urn:xmpp:hints', - 'stanza': 'urn:ietf:params:xml:ns:xmpp-stanzas'}) + 'stanza': 'urn:ietf:params:xml:ns:xmpp-stanzas', + 'stable_id': 'urn:xmpp:sid:0'}) return matched @@ -1483,7 +1484,10 @@ if __name__ == '__main__': # Send two channel messages partial(send_stanza, "coucou"), - partial(expect_stanza, "/message[@from='#foo%{irc_server_one}/{nick_one}'][@to='{jid_one}/{resource_one}'][@type='groupchat']/body[text()='coucou']"), + partial(expect_stanza, + ("/message[@from='#foo%{irc_server_one}/{nick_one}'][@to='{jid_one}/{resource_one}'][@type='groupchat']/body[text()='coucou']", + "/message/stable_id:stanza-id[@by='#foo%{irc_server_one}'][@id]",) + ), partial(send_stanza, "coucou 2"), partial(expect_stanza, "/message[@from='#foo%{irc_server_one}/{nick_one}'][@to='{jid_one}/{resource_one}'][@type='groupchat']/body[text()='coucou 2']"), -- cgit v1.2.3