# HG changeset patch # User Goffi # Date 1551013784 -3600 # Node ID 00d905e1b0efecad4202cb1304ad3fc96419d663 # Parent 51c53fc4fc4ac08b6ef2478a1341f618c889a9ac 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) diff -r 51c53fc4fc4a -r 00d905e1b0ef sat/core/patches.py --- 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