From 2e4f4069c5eb3ab6e568a8a2cfee2ba5a0671762 Mon Sep 17 00:00:00 2001 From: Goffi Date: Sun, 24 Feb 2019 14:09:44 +0100 Subject: [PATCH] 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) --- sat/core/patches.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/sat/core/patches.py b/sat/core/patches.py index cafa8783..ebe09f83 100644 --- a/sat/core/patches.py +++ b/sat/core/patches.py @@ -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 @@ class CheckAuthInitializer(client.CheckAuthInitializer): 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