comparison frontends/src/tools/jid.py @ 1367:f71a0fc26886

merged branch frontends_multi_profiles
author Goffi <goffi@goffi.org>
date Wed, 18 Mar 2015 10:52:28 +0100
parents 4895e1e092fb
children 3dae6964c071
comparison
equal deleted inserted replaced
1295:1e3b1f9ad6e2 1367:f71a0fc26886
16 16
17 # You should have received a copy of the GNU Affero General Public License 17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. 18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20 20
21 class JID(unicode): 21 # hack to use this module with pyjamas
22 try:
23 unicode('') # XXX: unicode doesn't exist in pyjamas
24
25 # normal version
26 class BaseJID(unicode):
27 def __new__(cls, jid_str):
28 self = unicode.__new__(cls, cls._normalize(jid_str))
29 return self
30
31 def __init__(self, jid_str):
32 pass
33
34 def _parse(self):
35 """Find node domain and resource"""
36 node_end = self.find('@')
37 if node_end < 0:
38 node_end = 0
39 domain_end = self.find('/')
40 if domain_end == 0:
41 raise ValueError("a jid can't start with '/'")
42 if domain_end == -1:
43 domain_end = len(self)
44 self.node = self[:node_end] or None
45 self.domain = self[(node_end + 1) if node_end else 0:domain_end]
46 self.resource = self[domain_end + 1:] or None
47
48 except (TypeError, AttributeError): # Error raised is not the same depending on pyjsbuild options
49 # pyjamas version
50 class BaseJID(object):
51 def __init__(self, jid_str):
52 self.__internal_str = JID._normalize(jid_str)
53
54 def __str__(self):
55 return self.__internal_str
56
57 def __getattr__(self, name):
58 return getattr(self.__internal_str, name)
59
60 def __eq__(self, other):
61 if not isinstance(other, JID):
62 return False
63 return (self.node == other.node
64 and self.domain == other.domain
65 and self.resource == other.resource)
66
67 def __hash__(self):
68 return hash('JID<{}>'.format(self.__internal_str))
69
70 def find(self, *args):
71 return self.__internal_str.find(*args)
72
73 def _parse(self):
74 """Find node domain and resource"""
75 node_end = self.__internal_str.find('@')
76 if node_end < 0:
77 node_end = 0
78 domain_end = self.__internal_str.find('/')
79 if domain_end == 0:
80 raise ValueError("a jid can't start with '/'")
81 if domain_end == -1:
82 domain_end = len(self.__internal_str)
83 self.node = self.__internal_str[:node_end] or None
84 self.domain = self.__internal_str[(node_end + 1) if node_end else 0:domain_end]
85 self.resource = self.__internal_str[domain_end + 1:] or None
86
87
88 class JID(BaseJID):
22 """This class help manage JID (Node@Domaine/Resource)""" 89 """This class help manage JID (Node@Domaine/Resource)"""
23 90
24 def __new__(cls, jid): 91 def __init__(self, jid_str):
25 self = unicode.__new__(cls, cls.__normalize(jid)) 92 super(JID, self).__init__(jid_str)
26 self.__parse() 93 self._parse()
27 return self
28 94
29 @classmethod 95 @staticmethod
30 def __normalize(cls, jid): 96 def _normalize(jid_str):
31 """Naive normalization before instantiating and parsing the JID""" 97 """Naive normalization before instantiating and parsing the JID"""
32 if not jid: 98 if not jid_str:
33 return jid 99 return jid_str
34 tokens = jid.split('/') 100 tokens = jid_str.split('/')
35 tokens[0] = tokens[0].lower() # force node and domain to lower-case 101 tokens[0] = tokens[0].lower() # force node and domain to lower-case
36 return '/'.join(tokens) 102 return '/'.join(tokens)
37 103
38 def __parse(self): 104 @property
39 """Find node domain and resource""" 105 def bare(self):
40 node_end = self.find('@') 106 if not self.node:
41 if node_end < 0: 107 return JID(self.domain)
42 node_end = 0 108 return JID(u"{}@{}".format(self.node, self.domain))
43 domain_end = self.find('/')
44 if domain_end < 1:
45 domain_end = len(self)
46 self.node = self[:node_end]
47 self.domain = self[(node_end + 1) if node_end else 0:domain_end]
48 self.resource = self[domain_end + 1:]
49 if not node_end:
50 self.bare = self
51 else:
52 self.bare = self.node + '@' + self.domain
53 109
54 def is_valid(self): 110 def is_valid(self):
55 """ 111 """
56 @return: True if the JID is XMPP compliant 112 @return: True if the JID is XMPP compliant
57 """ 113 """