[packages/python-pyxmpp] add python-pyxmpp-xep-0203.patch

jajcus jajcus at pld-linux.org
Fri Aug 12 09:37:19 CEST 2016


commit 2ab4ebddcd775081310a8229d8c589cc319f3c6c
Author: Jacek Konieczny <j.konieczny at eggsoft.pl>
Date:   Fri Aug 12 09:37:03 2016 +0200

    add python-pyxmpp-xep-0203.patch

 python-pyxmpp-xep-0203.patch | 152 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 152 insertions(+)
---
diff --git a/python-pyxmpp-xep-0203.patch b/python-pyxmpp-xep-0203.patch
new file mode 100644
index 0000000..a73905a
--- /dev/null
+++ b/python-pyxmpp-xep-0203.patch
@@ -0,0 +1,152 @@
+commit ef3cf7e860439441fd62b92602bddc70d8e6ace8 (HEAD -> master, origin/master, origin/HEAD)
+Author: Jacek Konieczny <j.konieczny at eggsoft.pl>
+Date:   Thu Aug 11 16:14:07 2016 +0200
+
+    XEP 0203 support
+    
+    Old jabber:x:delay has already disappeared from servers.
+
+diff --git a/pyxmpp/jabber/delay.py b/pyxmpp/jabber/delay.py
+index a3f8136..045f05e 100644
+--- a/pyxmpp/jabber/delay.py
++++ b/pyxmpp/jabber/delay.py
+@@ -15,10 +15,11 @@
+ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ #
+ 
+-"""Delayed delivery mark (jabber:x:delay) handling.
++"""Delayed delivery mark (urn:xmpp:delay and jabber:x:delay) handling.
+ 
+ Normative reference:
+   - `JEP 91 <http://www.jabber.org/jeps/jep-0091.html>`__
++  - `XEP 0203 <http://xmpp.org/extensions/xep-0203.html>`__
+ """
+ 
+ __docformat__="restructuredtext en"
+@@ -35,13 +36,26 @@ from pyxmpp.utils import datetime_utc_to_local,datetime_local_to_utc
+ from pyxmpp.objects import StanzaPayloadObject
+ from pyxmpp.exceptions import BadRequestProtocolError, JIDMalformedProtocolError, JIDError
+ 
+-DELAY_NS="jabber:x:delay"
++DELAY_NS = "urn:xmpp:delay"
++LEGACY_DELAY_NS = "jabber:x:delay"
++
++def _parse_ts(timestamp):
++    if "." in timestamp and timestamp.endswith("Z"):
++        # strip miliseconds
++        timestamp = timestamp.split(".", 1)[0] + "Z"
++    for fmt in ("%Y-%m-%dT%H:%M:%SZ", "%Y%m%dT%H:%M:%S"):
++        try:
++            result = time.strptime(timestamp, fmt)
++            return result
++        except ValueError:
++            continue
++    raise BadRequestProtocolError, "Bad timestamp: " + repr(timestamp)
+ 
+ class Delay(StanzaPayloadObject):
+     """
+     Delayed delivery tag.
+ 
+-    Represents 'jabber:x:delay' (JEP-0091) element of a Jabber stanza.
++    Represents 'urn:xmpp:delay' (XEP-0203) element of a Jabber stanza.
+ 
+     :Ivariables:
+         - `delay_from`: the "from" value of the delay element
+@@ -49,9 +63,12 @@ class Delay(StanzaPayloadObject):
+         - `timestamp`: the UTC timestamp as naive datetime object
+     """
+ 
+-    xml_element_name = "x"
++    xml_element_name = "delay"
+     xml_element_namespace = DELAY_NS
+ 
++    _sort_order = 1
++    _time_format = "%Y-%m-%dT%H:%M:%SZ"
++
+     def __init__(self,node_or_datetime,delay_from=None,reason=None,utc=True):
+         """
+         Initialize the Delay object.
+@@ -89,17 +106,11 @@ class Delay(StanzaPayloadObject):
+         if xmlnode.type!="element":
+             raise ValueError,"XML node is not a jabber:x:delay element (not an element)"
+         ns=get_node_ns_uri(xmlnode)
+-        if ns and ns!=DELAY_NS or xmlnode.name!="x":
+-            raise ValueError,"XML node is not a jabber:x:delay element"
++        if ns and (ns != self.xml_element_namespace
++                or xmlnode.name != self.xml_element_name):
++            raise ValueError,"XML node is not a " + self.xml_element_namespace + " element"
+         stamp=xmlnode.prop("stamp")
+-        if stamp.endswith("Z"):
+-            stamp=stamp[:-1]
+-        if "-" in stamp:
+-            stamp=stamp.split("-",1)[0]
+-        try:
+-            tm = time.strptime(stamp, "%Y%m%dT%H:%M:%S")
+-        except ValueError:
+-            raise BadRequestProtocolError, "Bad timestamp"
++        tm = _parse_ts(stamp)
+         tm=tm[0:8]+(0,)
+         self.timestamp=datetime.datetime.fromtimestamp(time.mktime(tm))
+         delay_from=from_utf8(xmlnode.prop("from"))
+@@ -107,7 +118,7 @@ class Delay(StanzaPayloadObject):
+             try:
+                 self.delay_from = JID(delay_from)
+             except JIDError:
+-                raise JIDMalformedProtocolError, "Bad JID in the jabber:x:delay 'from' attribute"
++                raise JIDMalformedProtocolError, "Bad JID in the " + self.xml_element_namespace + " 'from' attribute"
+         else:
+             self.delay_from = None
+         self.reason = from_utf8(xmlnode.getContent())
+@@ -124,7 +135,7 @@ class Delay(StanzaPayloadObject):
+         :Types:
+             - `xmlnode`: `libxml2.xmlNode`
+             - `_unused`: `libxml2.xmlDoc`"""
+-        tm=self.timestamp.strftime("%Y%m%dT%H:%M:%S")
++        tm=self.timestamp.strftime(self._time_format)
+         xmlnode.setProp("stamp",tm)
+         if self.delay_from:
+             xmlnode.setProp("from",self.delay_from.as_utf8())
+@@ -153,8 +164,27 @@ class Delay(StanzaPayloadObject):
+         n.freeNode()
+         return r
+ 
+-    def __cmp__(self,other):
+-        return cmp(timestamp, other.timestamp)
++    def __cmp__(self, other):
++        return cmp((self._sort_order, self.timestamp),
++                    (other._sort_order, other.timestamp))
++
++class LegacyDelay(Delay):
++    """
++    Delayed delivery tag.
++
++    Represents 'jabber:x:delay' (JEP-0091) element of a Jabber stanza.
++
++    :Ivariables:
++        - `delay_from`: the "from" value of the delay element
++        - `reason`: the "reason" (content) of the delay element
++        - `timestamp`: the UTC timestamp as naive datetime object
++    """
++
++    xml_element_name = "x"
++    xml_element_namespace = LEGACY_DELAY_NS
++
++    _sort_order = 2
++    _time_format = "%Y%m%dT%H:%M:%S"
+ 
+ def get_delays(stanza):
+     """Get jabber:x:delay elements from the stanza.
+@@ -169,8 +199,11 @@ def get_delays(stanza):
+     delays=[]
+     n=stanza.xmlnode.children
+     while n:
+-        if n.type=="element" and get_node_ns_uri(n)==DELAY_NS and n.name=="x":
+-            delays.append(Delay(n))
++        if n.type=="element":
++            if get_node_ns_uri(n) == DELAY_NS and n.name == "delay":
++                delays.append(Delay(n))
++            elif get_node_ns_uri(n) == LEGACY_DELAY_NS and n.name == "x":
++                delays.append(LegacyDelay(n))
+         n=n.next
+     delays.sort()
+     return delays
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/python-pyxmpp.git/commitdiff/2ab4ebddcd775081310a8229d8c589cc319f3c6c



More information about the pld-cvs-commit mailing list