From 9bca51eb693d43192ceb54828b64453899192520 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20H=C3=B6rist?= Date: Fri, 28 Jul 2017 01:37:06 +0200 Subject: [PATCH] Implement XEP-0359 Stable Stanza IDs - This allows us to better deduplicate Messages on MAM syncs --- gajim/chat_control.py | 2 +- gajim/chat_control_base.py | 6 +++--- gajim/common/connection.py | 20 ++++++++++++++------ gajim/common/connection_handlers_events.py | 5 +++-- gajim/common/zeroconf/connection_zeroconf.py | 4 ++-- gajim/groupchat_control.py | 2 +- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/gajim/chat_control.py b/gajim/chat_control.py index 0ae6a6ab9..4c9bfdcad 100644 --- a/gajim/chat_control.py +++ b/gajim/chat_control.py @@ -1187,7 +1187,7 @@ class ChatControl(ChatControlBase): gajim.nec.push_outgoing_event(MessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, chatstate=state, - msg_id=contact.msg_log_id, control=self)) + control=self)) contact.our_chatstate = state if state == 'active': diff --git a/gajim/chat_control_base.py b/gajim/chat_control_base.py index f609b3592..bbff1a585 100644 --- a/gajim/chat_control_base.py +++ b/gajim/chat_control_base.py @@ -732,7 +732,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): return label def send_message(self, message, keyID='', type_='chat', chatstate=None, - msg_id=None, resource=None, xhtml=None, callback=None, callback_args=None, + resource=None, xhtml=None, callback=None, callback_args=None, process_commands=True, attention=False): """ Send the given message to the active tab. Doesn't return None if error @@ -757,7 +757,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): label = self.get_seclabel() def _cb(obj, msg, cb, *cb_args): - self.last_sent_msg = obj.msg_id + self.last_sent_msg = obj.stanza_id if cb: cb(obj, msg, *cb_args) @@ -768,7 +768,7 @@ class ChatControlBase(MessageControl, ChatCommandProcessor, CommandTools): gajim.nec.push_outgoing_event(MessageOutgoingEvent(None, account=self.account, jid=self.contact.jid, message=message, - keyID=keyID, type_=type_, chatstate=chatstate, msg_id=msg_id, + keyID=keyID, type_=type_, chatstate=chatstate, resource=resource, user_nick=self.user_nick, xhtml=xhtml, label=label, callback=_cb, callback_args=[callback] + callback_args, control=self, attention=attention, correct_id=correct_id, diff --git a/gajim/common/connection.py b/gajim/common/connection.py index 520ba7b05..42f440c5b 100644 --- a/gajim/common/connection.py +++ b/gajim/common/connection.py @@ -317,8 +317,11 @@ class CommonConnection: msg_iq.setTag('replace', attrs={'id': obj.correct_id}, namespace=nbxmpp.NS_CORRECT) - if obj.msg_id: - msg_iq.setID(obj.msg_id) + # XEP-0359 + obj.stanza_id = self.connection.getAnID() + msg_iq.setID(obj.stanza_id) + if obj.message: + msg_iq.setOriginID(obj.stanza_id) if obj.form_node: msg_iq.addChild(node=obj.form_node) @@ -2056,12 +2059,12 @@ class Connection(CommonConnection, ConnectionHandlers): self.send_message(obj) def send_message(self, obj): - obj.msg_id = self.connection.send(obj.msg_iq, now=obj.now) + obj.stanza_id = self.connection.send(obj.msg_iq, now=obj.now) gajim.nec.push_incoming_event(MessageSentEvent( None, conn=self, jid=obj.jid, message=obj.message, keyID=obj.keyID, chatstate=obj.chatstate, automatic_message=obj.automatic_message, - msg_id=obj.msg_id, additional_data=obj.additional_data)) + stanza_id=obj.stanza_id, additional_data=obj.additional_data)) if obj.callback: obj.callback(obj, obj.msg_iq, *obj.callback_args) @@ -2628,6 +2631,11 @@ class Connection(CommonConnection, ConnectionHandlers): msg_iq = nbxmpp.Message(obj.jid, obj.message, typ='groupchat', xhtml=obj.xhtml) + obj.stanza_id = self.connection.getAnID() + msg_iq.setID(obj.stanza_id) + if obj.message: + msg_iq.setOriginID(obj.stanza_id) + if obj.correct_id: msg_iq.setTag('replace', attrs={'id': obj.correct_id}, namespace=nbxmpp.NS_CORRECT) @@ -2654,11 +2662,11 @@ class Connection(CommonConnection, ConnectionHandlers): self.send_gc_message(obj) def send_gc_message(self, obj): - obj.msg_id = self.connection.send(obj.msg_iq) + obj.stanza_id = self.connection.send(obj.msg_iq) gajim.nec.push_incoming_event(MessageSentEvent( None, conn=self, jid=obj.jid, message=obj.message, keyID=None, chatstate=None, automatic_message=obj.automatic_message, - msg_id=obj.msg_id, additional_data=obj.additional_data)) + stanza_id=obj.stanza_id, additional_data=obj.additional_data)) if obj.callback: obj.callback(obj) diff --git a/gajim/common/connection_handlers_events.py b/gajim/common/connection_handlers_events.py index 521537ed6..3fa53e5a7 100644 --- a/gajim/common/connection_handlers_events.py +++ b/gajim/common/connection_handlers_events.py @@ -1637,7 +1637,7 @@ class MessageSentEvent(nec.NetworkIncomingEvent): def generate(self): if not self.automatic_message: - self.conn.sent_message_ids.append(self.msg_id) + self.conn.sent_message_ids.append(self.stanza_id) # only record the last 20000 message ids (should be about 1MB [36 byte per uuid] # and about 24 hours if you send out a message every 5 seconds) self.conn.sent_message_ids = self.conn.sent_message_ids[-20000:] @@ -2709,7 +2709,7 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent): self.type_ = 'chat' self.subject = '' self.chatstate = None - self.msg_id = None + self.stanza_id = None self.resource = None self.user_nick = None self.xhtml = None @@ -2762,6 +2762,7 @@ class GcMessageOutgoingEvent(nec.NetworkOutgoingEvent): self.message = '' self.chatstate = None self.xhtml = None + self.stanza_id = None self.label = None self.callback = None self.callback_args = [] diff --git a/gajim/common/zeroconf/connection_zeroconf.py b/gajim/common/zeroconf/connection_zeroconf.py index 2446a5e37..cf9d9e03d 100644 --- a/gajim/common/zeroconf/connection_zeroconf.py +++ b/gajim/common/zeroconf/connection_zeroconf.py @@ -334,11 +334,11 @@ class ConnectionZeroconf(CommonConnection, ConnectionHandlersZeroconf): def _nec_stanza_message_outgoing(self, obj): - def on_send_ok(msg_id): + def on_send_ok(stanza_id): gajim.nec.push_incoming_event(MessageSentEvent(None, conn=self, jid=obj.jid, message=obj.message, keyID=obj.keyID, automatic_message=obj.automatic_message, chatstate=None, - msg_id=msg_id)) + stanza_id=stanza_id)) if obj.callback: obj.callback(obj.msg_iq, *obj.callback_args) diff --git a/gajim/groupchat_control.py b/gajim/groupchat_control.py index b101af8c6..57fee08fd 100644 --- a/gajim/groupchat_control.py +++ b/gajim/groupchat_control.py @@ -2042,7 +2042,7 @@ class GroupchatControl(ChatControlBase): def _cb(obj): # we'll save sent message text when we'll receive it in # _nec_gc_message_received - self.last_sent_msg = obj.msg_id + self.last_sent_msg = obj.stanza_id if self.correcting: self.correcting = False gtkgui_helpers.remove_css_class(