From fef575ee1a509d2428620e843f83f110a0d82865 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Thu, 18 Jul 2019 12:28:16 +0200 Subject: [PATCH 1/2] Implement origin-id (XEP-0359) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This XEP is not implemented as a plugin but directly into Message. Signed-off-by: Maxime “pep” Buquet --- slixmpp/stanza/message.py | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/slixmpp/stanza/message.py b/slixmpp/stanza/message.py index f5813eaf..59707e25 100644 --- a/slixmpp/stanza/message.py +++ b/slixmpp/stanza/message.py @@ -10,6 +10,9 @@ from slixmpp.stanza.rootstanza import RootStanza from slixmpp.xmlstream import StanzaBase, ET +ORIGIN_NAME = '{urn:xmpp:sid:0}origin-id' + + class Message(RootStanza): """ @@ -63,6 +66,8 @@ class Message(RootStanza): if self['id'] == '': if self.stream is not None and self.stream.use_message_ids: self['id'] = self.stream.new_id() + else: + del self['origin_id'] def get_type(self): """ @@ -76,6 +81,40 @@ class Message(RootStanza): """ return self._get_attr('type', 'normal') + def get_id(self): + return self._get_attr('id') or '' + + def get_origin_id(self): + sub = self.xml.find(ORIGIN_NAME) + if sub is not None: + return sub.attrib.get('id') or '' + return '' + + def _set_ids(self, value) -> None: + if value is None or value == '': + return None + + self.xml.attrib['id'] = value + + sub = self.xml.find(ORIGIN_NAME) + if sub is not None: + sub.attrib['id'] = value + else: + sub = ET.Element(ORIGIN_NAME) + sub.attrib['id'] = value + self.xml.append(sub) + + def set_id(self, value): + return self._set_ids(value) + + def set_origin_id(self, value: str): + return self._set_ids(value) + + def del_origin_id(self): + sub = self.xml.find(ORIGIN_NAME) + if sub is not None: + self.xml.remove(sub) + def get_parent_thread(self): """Return the message thread's parent thread. @@ -140,6 +179,8 @@ class Message(RootStanza): new_message['parent_thread'] = self['parent_thread'] del new_message['id'] + if self.stream is not None and self.stream.use_message_ids: + new_message['id'] = self.stream.new_id() if body is not None: new_message['body'] = body From 3253d34c0a3088c98e7d54bc5f38c118bcbfde2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maxime=20=E2=80=9Cpep=E2=80=9D=20Buquet?= Date: Sat, 20 Jul 2019 16:35:18 +0200 Subject: [PATCH 2/2] basexmpp: Make origin-id opt-out MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maxime “pep” Buquet --- slixmpp/basexmpp.py | 3 +++ slixmpp/stanza/message.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/slixmpp/basexmpp.py b/slixmpp/basexmpp.py index 146b6086..02c0b21c 100644 --- a/slixmpp/basexmpp.py +++ b/slixmpp/basexmpp.py @@ -111,6 +111,9 @@ class BaseXMPP(XMLStream): #: outgoing messages an ID. self.use_presence_ids = True + #: XEP-0359 tag that gets added to stanzas. + self.use_origin_id = True + #: The API registry is a way to process callbacks based on #: JID+node combinations. Each callback in the registry is #: marked with: diff --git a/slixmpp/stanza/message.py b/slixmpp/stanza/message.py index 59707e25..716d48e0 100644 --- a/slixmpp/stanza/message.py +++ b/slixmpp/stanza/message.py @@ -96,6 +96,9 @@ class Message(RootStanza): self.xml.attrib['id'] = value + if not self.stream.use_origin_id: + return None + sub = self.xml.find(ORIGIN_NAME) if sub is not None: sub.attrib['id'] = value