Merge branch 'master' into develop
This commit is contained in:
commit
14c9e9a9cc
5 changed files with 54 additions and 32 deletions
|
@ -69,12 +69,12 @@ class BaseXMPP(XMLStream):
|
||||||
self.stream_id = None
|
self.stream_id = None
|
||||||
|
|
||||||
#: The JabberID (JID) requested for this connection.
|
#: The JabberID (JID) requested for this connection.
|
||||||
self.requested_jid = JID(jid)
|
self.requested_jid = JID(jid, cache_lock=True)
|
||||||
|
|
||||||
#: The JabberID (JID) used by this connection,
|
#: The JabberID (JID) used by this connection,
|
||||||
#: as set after session binding. This may even be a
|
#: as set after session binding. This may even be a
|
||||||
#: different bare JID than what was requested.
|
#: different bare JID than what was requested.
|
||||||
self.boundjid = JID(jid)
|
self.boundjid = JID(jid, cache_lock=True)
|
||||||
|
|
||||||
self._expected_server_name = self.boundjid.host
|
self._expected_server_name = self.boundjid.host
|
||||||
self._redirect_attempts = 0
|
self._redirect_attempts = 0
|
||||||
|
@ -665,7 +665,7 @@ class BaseXMPP(XMLStream):
|
||||||
def set_jid(self, jid):
|
def set_jid(self, jid):
|
||||||
"""Rip a JID apart and claim it as our own."""
|
"""Rip a JID apart and claim it as our own."""
|
||||||
log.debug("setting jid to %s", jid)
|
log.debug("setting jid to %s", jid)
|
||||||
self.boundjid.full = jid
|
self.boundjid = JID(jid, cache_lock=True)
|
||||||
|
|
||||||
def getjidresource(self, fulljid):
|
def getjidresource(self, fulljid):
|
||||||
if '/' in fulljid:
|
if '/' in fulljid:
|
||||||
|
|
|
@ -64,7 +64,6 @@ class ClientXMPP(BaseXMPP):
|
||||||
escape_quotes=True, sasl_mech=None, lang='en'):
|
escape_quotes=True, sasl_mech=None, lang='en'):
|
||||||
BaseXMPP.__init__(self, jid, 'jabber:client')
|
BaseXMPP.__init__(self, jid, 'jabber:client')
|
||||||
|
|
||||||
self.set_jid(jid)
|
|
||||||
self.escape_quotes = escape_quotes
|
self.escape_quotes = escape_quotes
|
||||||
self.plugin_config = plugin_config
|
self.plugin_config = plugin_config
|
||||||
self.plugin_whitelist = plugin_whitelist
|
self.plugin_whitelist = plugin_whitelist
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from sleekxmpp.jid import JID
|
||||||
from sleekxmpp.stanza import Iq, StreamFeatures
|
from sleekxmpp.stanza import Iq, StreamFeatures
|
||||||
from sleekxmpp.features.feature_bind import stanza
|
from sleekxmpp.features.feature_bind import stanza
|
||||||
from sleekxmpp.xmlstream import register_stanza_plugin
|
from sleekxmpp.xmlstream import register_stanza_plugin
|
||||||
|
@ -48,7 +49,7 @@ class FeatureBind(BasePlugin):
|
||||||
iq['bind']['resource'] = self.xmpp.boundjid.resource
|
iq['bind']['resource'] = self.xmpp.boundjid.resource
|
||||||
response = iq.send(now=True)
|
response = iq.send(now=True)
|
||||||
|
|
||||||
self.xmpp.set_jid(response['bind']['jid'])
|
self.xmpp.boundjid = JID(response['bind']['jid'], cache_lock=True)
|
||||||
self.xmpp.bound = True
|
self.xmpp.bound = True
|
||||||
self.xmpp.event('session_bind', self.xmpp.boundjid, direct=True)
|
self.xmpp.event('session_bind', self.xmpp.boundjid, direct=True)
|
||||||
self.xmpp.session_bind_event.set()
|
self.xmpp.session_bind_event.set()
|
||||||
|
|
|
@ -16,6 +16,7 @@ from __future__ import unicode_literals
|
||||||
import re
|
import re
|
||||||
import socket
|
import socket
|
||||||
import stringprep
|
import stringprep
|
||||||
|
import threading
|
||||||
import encodings.idna
|
import encodings.idna
|
||||||
|
|
||||||
from sleekxmpp.util import stringprep_profiles
|
from sleekxmpp.util import stringprep_profiles
|
||||||
|
@ -65,6 +66,7 @@ JID_UNESCAPE_TRANSFORMATIONS = {'\\20': ' ',
|
||||||
'\\5c': '\\'}
|
'\\5c': '\\'}
|
||||||
|
|
||||||
JID_CACHE = OrderedDict()
|
JID_CACHE = OrderedDict()
|
||||||
|
JID_CACHE_LOCK = threading.Lock()
|
||||||
JID_CACHE_MAX_SIZE = 1024
|
JID_CACHE_MAX_SIZE = 1024
|
||||||
|
|
||||||
|
|
||||||
|
@ -416,37 +418,49 @@ class JID(object):
|
||||||
|
|
||||||
# pylint: disable=W0212
|
# pylint: disable=W0212
|
||||||
def __init__(self, jid=None, **kwargs):
|
def __init__(self, jid=None, **kwargs):
|
||||||
self._jid = (None, None, None)
|
jid_data = (jid, kwargs.get('local', None),
|
||||||
|
kwargs.get('domain', None),
|
||||||
|
kwargs.get('resource', None))
|
||||||
|
|
||||||
if jid is None or jid == '':
|
locked = kwargs.get('cache_lock', False)
|
||||||
jid = ''
|
|
||||||
|
|
||||||
if not jid:
|
if jid_data in JID_CACHE:
|
||||||
jid = (None, None, None)
|
parsed_jid, locked = JID_CACHE[jid_data]
|
||||||
elif jid in JID_CACHE:
|
self._jid = parsed_jid
|
||||||
jid = JID_CACHE[jid]
|
|
||||||
elif not isinstance(jid, JID):
|
|
||||||
jid = _parse_jid(jid)
|
|
||||||
else:
|
else:
|
||||||
jid = jid._jid
|
if jid is None:
|
||||||
|
jid = ''
|
||||||
|
|
||||||
local, domain, resource = jid
|
if not jid:
|
||||||
|
parsed_jid = (None, None, None)
|
||||||
|
elif not isinstance(jid, JID):
|
||||||
|
parsed_jid = _parse_jid(jid)
|
||||||
|
else:
|
||||||
|
parsed_jid = jid._jid
|
||||||
|
|
||||||
local = kwargs.get('local', local)
|
local, domain, resource = parsed_jid
|
||||||
domain = kwargs.get('domain', domain)
|
|
||||||
resource = kwargs.get('resource', resource)
|
|
||||||
|
|
||||||
if 'local' in kwargs:
|
local = kwargs.get('local', local)
|
||||||
local = _escape_node(local)
|
domain = kwargs.get('domain', domain)
|
||||||
if 'domain' in kwargs:
|
resource = kwargs.get('resource', resource)
|
||||||
domain = _validate_domain(domain)
|
|
||||||
if 'resource' in kwargs:
|
|
||||||
resource = _validate_resource(resource)
|
|
||||||
|
|
||||||
self._jid = (local, domain, resource)
|
if 'local' in kwargs:
|
||||||
JID_CACHE[_format_jid(*self._jid)] = self._jid
|
local = _escape_node(local)
|
||||||
|
if 'domain' in kwargs:
|
||||||
|
domain = _validate_domain(domain)
|
||||||
|
if 'resource' in kwargs:
|
||||||
|
resource = _validate_resource(resource)
|
||||||
|
|
||||||
|
self._jid = (local, domain, resource)
|
||||||
|
|
||||||
|
JID_CACHE[jid_data] = (self._jid, locked)
|
||||||
if len(JID_CACHE) > JID_CACHE_MAX_SIZE:
|
if len(JID_CACHE) > JID_CACHE_MAX_SIZE:
|
||||||
JID_CACHE.popitem(False)
|
with JID_CACHE_LOCK:
|
||||||
|
key, item = JID_CACHE.popitem(False)
|
||||||
|
if item[1]:
|
||||||
|
# Need to reinsert locked JIDs
|
||||||
|
JID_CACHE[key] = item
|
||||||
|
|
||||||
|
|
||||||
def unescape(self):
|
def unescape(self):
|
||||||
"""Return an unescaped JID object.
|
"""Return an unescaped JID object.
|
||||||
|
|
|
@ -11,6 +11,7 @@ import hashlib
|
||||||
import random
|
import random
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from sleekxmpp.jid import JID
|
||||||
from sleekxmpp.exceptions import IqError, IqTimeout
|
from sleekxmpp.exceptions import IqError, IqTimeout
|
||||||
from sleekxmpp.stanza import Iq, StreamFeatures
|
from sleekxmpp.stanza import Iq, StreamFeatures
|
||||||
from sleekxmpp.xmlstream import ElementBase, ET, register_stanza_plugin
|
from sleekxmpp.xmlstream import ElementBase, ET, register_stanza_plugin
|
||||||
|
@ -95,10 +96,11 @@ class XEP_0078(BasePlugin):
|
||||||
iq['auth']['username'] = self.xmpp.requested_jid.user
|
iq['auth']['username'] = self.xmpp.requested_jid.user
|
||||||
|
|
||||||
# A resource is required, so create a random one if necessary
|
# A resource is required, so create a random one if necessary
|
||||||
if self.xmpp.requested_jid.resource:
|
resource = self.xmpp.requested_jid.resource
|
||||||
iq['auth']['resource'] = self.xmpp.requested_jid.resource
|
if not resource:
|
||||||
else:
|
resource = uuid.uuid4()
|
||||||
iq['auth']['resource'] = '%s' % random.random()
|
|
||||||
|
iq['auth']['resource'] = resource
|
||||||
|
|
||||||
if 'digest' in resp['auth']['fields']:
|
if 'digest' in resp['auth']['fields']:
|
||||||
log.debug('Authenticating via jabber:iq:auth Digest')
|
log.debug('Authenticating via jabber:iq:auth Digest')
|
||||||
|
@ -130,6 +132,12 @@ class XEP_0078(BasePlugin):
|
||||||
self.xmpp.features.add('auth')
|
self.xmpp.features.add('auth')
|
||||||
|
|
||||||
self.xmpp.authenticated = True
|
self.xmpp.authenticated = True
|
||||||
|
|
||||||
|
self.xmpp.boundjid = JID(self.xmpp.requested_jid,
|
||||||
|
resource=resource,
|
||||||
|
cache_lock=True)
|
||||||
|
self.xmpp.event('session_bind', self.xmpp.boundjid, direct=True)
|
||||||
|
|
||||||
log.debug("Established Session")
|
log.debug("Established Session")
|
||||||
self.xmpp.sessionstarted = True
|
self.xmpp.sessionstarted = True
|
||||||
self.xmpp.session_started_event.set()
|
self.xmpp.session_started_event.set()
|
||||||
|
|
Loading…
Reference in a new issue