Mercurial > libervia-backend
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