diff sat/core/patches.py @ 2809:00d905e1b0ef

core (patches): partially fixed jid caching: jid caching in Twisted use a dict (__internJIDs) which associate a jid as string to its jid.JID instance. But this caching doesn't handle mutability of the objects, resulting wrong jid returned when a modification is done (e.g. if resource is changed). This is a temporary workaround until the patch is proposed and merged upstream. note: this is a partial fix because the caching is also leaking memory (cf. https://twistedmatrix.com/trac/ticket/5122)
author Goffi <goffi@goffi.org>
date Sun, 24 Feb 2019 14:09:44 +0100
parents 1ecceac3df96
children ab2696e34d29
line wrap: on
line diff
--- a/sat/core/patches.py	Sat Feb 23 19:00:25 2019 +0100
+++ b/sat/core/patches.py	Sun Feb 24 14:09:44 2019 +0100
@@ -1,4 +1,5 @@
-from twisted.words.protocols.jabber import xmlstream, sasl, client as tclient
+import copy
+from twisted.words.protocols.jabber import xmlstream, sasl, client as tclient, jid
 from twisted.internet import ssl
 from wokkel import client
 from sat.core.constants import Const as C
@@ -139,9 +140,31 @@
             raise Exception("No available authentication method found")
 
 
+# jid fix
+
+def internJID(jidstring):
+    """
+    Return interned JID.
+
+    @rtype: L{JID}
+    """
+    # XXX: this interJID return a copy of the cached jid
+    #      this avoid modification of cached jid as JID is mutable
+    # TODO: propose this upstream
+
+    if jidstring in jid.__internJIDs:
+        return copy.copy(jid.__internJIDs[jidstring])
+    else:
+        j = jid.JID(jidstring)
+        jid.__internJIDs[jidstring] = j
+        return copy.copy(j)
+
+
 def apply():
     # certificate validation
     xmlstream.TLSInitiatingInitializer = TLSInitiatingInitializer
     client.XMPPClient = XMPPClient
     # XmlStream triggers
     xmlstream.XmlStreamFactory.protocol = XmlStream
+    # jid fix
+    jid.internJID = internJID