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)
This commit is contained in:
Goffi 2019-02-24 14:09:44 +01:00
commit 2e4f4069c5

View file

@ -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