diff options
Diffstat (limited to 'sleekxmpp/jid.py')
-rw-r--r-- | sleekxmpp/jid.py | 144 |
1 files changed, 100 insertions, 44 deletions
diff --git a/sleekxmpp/jid.py b/sleekxmpp/jid.py index 8f1a81d4..ac5ba30d 100644 --- a/sleekxmpp/jid.py +++ b/sleekxmpp/jid.py @@ -19,6 +19,8 @@ import stringprep import threading import encodings.idna +from copy import deepcopy + from sleekxmpp.util import stringprep_profiles from sleekxmpp.thirdparty import OrderedDict @@ -75,7 +77,7 @@ def _cache(key, parts, locked): with JID_CACHE_LOCK: while len(JID_CACHE) > JID_CACHE_MAX_SIZE: found = None - for key, item in JID_CACHE.iteritems(): + for key, item in JID_CACHE.items(): if not item[1]: # if not locked found = key break @@ -202,7 +204,7 @@ def _validate_domain(domain): socket.inet_pton(socket.AF_INET6, domain.strip('[]')) domain = '[%s]' % domain.strip('[]') ip_addr = True - except socket.error: + except (socket.error, ValueError): pass if not ip_addr: @@ -228,7 +230,7 @@ def _validate_domain(domain): for char in label: if char in ILLEGAL_CHARS: - raise InvalidJID('Domain contains illegar characters') + raise InvalidJID('Domain contains illegal characters') if '-' in (label[0], label[-1]): raise InvalidJID('Domain started or ended with -') @@ -506,50 +508,100 @@ class JID(object): """ self._jid = JID(data)._jid - # pylint: disable=R0911 - def __getattr__(self, name): - """Retrieve the given JID component. + @property + def resource(self): + return self._jid[2] or '' - :param name: one of: user, server, domain, resource, - full, or bare. - """ - if name == 'resource': - return self._jid[2] or '' - elif name in ('user', 'username', 'local', 'node'): - return self._jid[0] or '' - elif name in ('server', 'domain', 'host'): - return self._jid[1] or '' - elif name in ('full', 'jid'): - return _format_jid(*self._jid) - elif name == 'bare': - return _format_jid(self._jid[0], self._jid[1]) - elif name == '_jid': - return getattr(super(JID, self), '_jid') - else: - return None + @property + def user(self): + return self._jid[0] or '' - # pylint: disable=W0212 - def __setattr__(self, name, value): - """Update the given JID component. + @property + def local(self): + return self._jid[0] or '' + + @property + def node(self): + return self._jid[0] or '' + + @property + def username(self): + return self._jid[0] or '' + + @property + def bare(self): + return _format_jid(self._jid[0], self._jid[1]) + + @property + def server(self): + return self._jid[1] or '' + + @property + def domain(self): + return self._jid[1] or '' + + @property + def host(self): + return self._jid[1] or '' + + @property + def full(self): + return _format_jid(*self._jid) + + @property + def jid(self): + return _format_jid(*self._jid) + + @property + def bare(self): + return _format_jid(self._jid[0], self._jid[1]) + + + @resource.setter + def resource(self, value): + self._jid = JID(self, resource=value)._jid + + @user.setter + def user(self, value): + self._jid = JID(self, local=value)._jid + + @username.setter + def username(self, value): + self._jid = JID(self, local=value)._jid + + @local.setter + def local(self, value): + self._jid = JID(self, local=value)._jid + + @node.setter + def node(self, value): + self._jid = JID(self, local=value)._jid + + @server.setter + def server(self, value): + self._jid = JID(self, domain=value)._jid + + @domain.setter + def domain(self, value): + self._jid = JID(self, domain=value)._jid + + @host.setter + def host(self, value): + self._jid = JID(self, domain=value)._jid + + @full.setter + def full(self, value): + self._jid = JID(value)._jid + + @jid.setter + def jid(self, value): + self._jid = JID(value)._jid + + @bare.setter + def bare(self, value): + parsed = JID(value)._jid + self._jid = (parsed[0], parsed[1], self._jid[2]) - :param name: one of: ``user``, ``username``, ``local``, - ``node``, ``server``, ``domain``, ``host``, - ``resource``, ``full``, ``jid``, or ``bare``. - :param value: The new string value of the JID component. - """ - if name == '_jid': - super(JID, self).__setattr__('_jid', value) - elif name == 'resource': - self._jid = JID(self, resource=value)._jid - elif name in ('user', 'username', 'local', 'node'): - self._jid = JID(self, local=value)._jid - elif name in ('server', 'domain', 'host'): - self._jid = JID(self, domain=value)._jid - elif name in ('full', 'jid'): - self._jid = JID(value)._jid - elif name == 'bare': - parsed = JID(value)._jid - self._jid = (parsed[0], parsed[1], self._jid[2]) def __str__(self): """Use the full JID as the string value.""" @@ -580,3 +632,7 @@ class JID(object): def __copy__(self): """Generate a duplicate JID.""" return JID(self) + + def __deepcopy__(self, memo): + """Generate a duplicate JID.""" + return JID(deepcopy(str(self), memo)) |