annotate sat/core/patches.py @ 2798:7d2d28564b3e 0.7.0a3

0.7.0a3 release
author Goffi <goffi@goffi.org>
date Wed, 06 Feb 2019 09:10:27 +0100
parents 1ecceac3df96
children 00d905e1b0ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
1 from twisted.words.protocols.jabber import xmlstream, sasl, client as tclient
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
2 from twisted.internet import ssl
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 from wokkel import client
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
4 from sat.core.constants import Const as C
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
5 from sat.core.log import getLogger
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
6
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
7 log = getLogger(__name__)
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
8
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
9 """This module apply monkey patches to Twisted and Wokkel
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
10 First part handle certificate validation during XMPP connectionand are temporary
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
11 (until merged upstream).
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
12 Second part add a trigger point to send and onElement method of XmlStream
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
13 """
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
14
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
15
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
16 ## certificate validation patches
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
17
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
18 class TLSInitiatingInitializer(xmlstream.TLSInitiatingInitializer):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 check_certificate = True
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
20
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 def onProceed(self, obj):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 self.xmlstream.removeObserver('/failure', self.onFailure)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 trustRoot = ssl.platformTrust() if self.check_certificate else None
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 ctx = ssl.CertificateOptions(trustRoot=trustRoot)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 self.xmlstream.transport.startTLS(ctx)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 self.xmlstream.reset()
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 self.xmlstream.sendHeader()
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 self._deferred.callback(xmlstream.Reset)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
29
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 class XMPPClient(client.XMPPClient):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
32
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
33 def __init__(self, jid, password, host=None, port=5222,
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
34 check_certificate=True):
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 self.jid = jid
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 self.domain = jid.host.encode('idna')
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 self.host = host
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 self.port = port
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
39
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
40 factory = HybridClientFactory(
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
41 jid, password, check_certificate=check_certificate)
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
42
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 client.StreamManager.__init__(self, factory)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
44
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
45
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 def HybridClientFactory(jid, password, check_certificate=True):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 a = HybridAuthenticator(jid, password, check_certificate)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
48
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 return xmlstream.XmlStreamFactory(a)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
50
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
51
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 class HybridAuthenticator(client.HybridAuthenticator):
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
53 res_binding = True
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 def __init__(self, jid, password, check_certificate):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 xmlstream.ConnectAuthenticator.__init__(self, jid.host)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 self.jid = jid
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 self.password = password
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 self.check_certificate = check_certificate
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
60
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 def associateWithStream(self, xs):
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 xmlstream.ConnectAuthenticator.associateWithStream(self, xs)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
63
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 tlsInit = xmlstream.TLSInitiatingInitializer(xs)
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 tlsInit.check_certificate = self.check_certificate
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
66 xs.initializers = [client.client.CheckVersionInitializer(xs),
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
67 tlsInit,
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
68 CheckAuthInitializer(xs, self.res_binding)]
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
69
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
70
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
71 # XmlStream triggers
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
72
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
73
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
74 class XmlStream(xmlstream.XmlStream):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
75 """XmlStream which allows to add hooks"""
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
76
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
77 def __init__(self, authenticator):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
78 xmlstream.XmlStream.__init__(self, authenticator)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
79 # hooks at this level should not modify content
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
80 # so it's not needed to handle priority as with triggers
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
81 self._onElementHooks = []
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
82 self._sendHooks = []
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
83
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
84 def addHook(self, hook_type, callback):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
85 """Add a send or receive hook"""
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
86 conflict_msg = (u"Hook conflict: can't add {hook_type} hook {callback}"
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
87 .format(hook_type=hook_type, callback=callback))
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
88 if hook_type == C.STREAM_HOOK_RECEIVE:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
89 if callback not in self._onElementHooks:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
90 self._onElementHooks.append(callback)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
91 else:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
92 log.warning(conflict_msg)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
93 elif hook_type == C.STREAM_HOOK_SEND:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
94 if callback not in self._sendHooks:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
95 self._sendHooks.append(callback)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
96 else:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
97 log.warning(conflict_msg)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
98 else:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
99 raise ValueError(u"Invalid hook type: {hook_type}"
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
100 .format(hook_type=hook_type))
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
101
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
102 def onElement(self, element):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
103 for hook in self._onElementHooks:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
104 hook(element)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
105 xmlstream.XmlStream.onElement(self, element)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
106
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
107 def send(self, obj):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
108 for hook in self._sendHooks:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
109 hook(obj)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
110 xmlstream.XmlStream.send(self, obj)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
111
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
112
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
113 # Binding activation (needed for stream management, XEP-0198)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
114
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
115
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
116 class CheckAuthInitializer(client.CheckAuthInitializer):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
117
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
118 def __init__(self, xs, res_binding):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
119 super(CheckAuthInitializer, self).__init__(xs)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
120 self.res_binding = res_binding
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
121
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
122 def initialize(self):
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
123 # XXX: modification of client.CheckAuthInitializer which has optional
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
124 # resource binding, and which doesn't do deprecated
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
125 # SessionInitializer
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
126 if (sasl.NS_XMPP_SASL, 'mechanisms') in self.xmlstream.features:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
127 inits = [(sasl.SASLInitiatingInitializer, True)]
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
128 if self.res_binding:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
129 inits.append((tclient.BindInitializer, True)),
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
130
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
131 for initClass, required in inits:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
132 init = initClass(self.xmlstream)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
133 init.required = required
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
134 self.xmlstream.initializers.append(init)
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
135 elif (tclient.NS_IQ_AUTH_FEATURE, 'auth') in self.xmlstream.features:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
136 self.xmlstream.initializers.append(
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
137 tclient.IQAuthInitializer(self.xmlstream))
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
138 else:
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
139 raise Exception("No available authentication method found")
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
140
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
141
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 def apply():
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
143 # certificate validation
2687
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 xmlstream.TLSInitiatingInitializer = TLSInitiatingInitializer
e9cd473a2f46 core (xmpp): server certificate validation:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 client.XMPPClient = XMPPClient
2691
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
146 # XmlStream triggers
1ecceac3df96 plugin XEP-0198: Stream Management implementation:
Goffi <goffi@goffi.org>
parents: 2687
diff changeset
147 xmlstream.XmlStreamFactory.protocol = XmlStream