Mercurial > libervia-web
annotate src/browser/sat_browser/jid.py @ 575:f8a355bede6a
browser_side (jid): remove JID constructor special error handling (it's better to get the full backtrace)
author | souliane <souliane@mailoo.org> |
---|---|
date | Sat, 18 Oct 2014 13:54:13 +0200 |
parents | b38629924602 |
children | 0a06cf833f5a |
rev | line source |
---|---|
13 | 1 #!/usr/bin/python |
2 # -*- coding: utf-8 -*- | |
3 | |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
4 # Libervia: a Salut à Toi frontend |
340 | 5 # Copyright (C) 2011, 2012, 2013, 2014 Jérôme Poisson <goffi@goffi.org> |
13 | 6 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
10 # (at your option) any later version. |
13 | 11 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
15 # GNU Affero General Public License for more details. |
13 | 16 |
339
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
2067d6241927
fixed docstrings wrong usage for licence informations
Goffi <goffi@goffi.org>
parents:
303
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
13 | 19 |
515
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
20 # FIXME: Libervia should use sat_frontends.tools.jid but pyjamas doesn't |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
21 # know the unicode type and also experiences issues with __new__. |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
22 |
13 | 23 |
274
886b47896f3c
browser_side: better PEP8 compliance
souliane <souliane@mailoo.org>
parents:
165
diff
changeset
|
24 class JID(object): |
13 | 25 """This class help manage JID (Node@Domaine/Resource)""" |
26 | |
27 def __init__(self, jid): | |
575
f8a355bede6a
browser_side (jid): remove JID constructor special error handling (it's better to get the full backtrace)
souliane <souliane@mailoo.org>
parents:
558
diff
changeset
|
28 assert(isinstance(jid, str)) |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
29 self.__raw = str(JID.__normalize(jid)) |
13 | 30 self.__parse() |
31 | |
515
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
32 @classmethod |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
33 def __normalize(cls, jid): |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
34 """Naive normalization before instantiating and parsing the JID""" |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
35 if not jid: |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
36 return jid |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
37 tokens = jid.split('/') |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
38 tokens[0] = tokens[0].lower() # force node and domain to lower-case |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
39 return '/'.join(tokens) |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
40 |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
41 @property |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
42 def node(self): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
43 return self.__node |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
44 |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
45 @property |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
46 def domain(self): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
47 return self.__domain |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
48 |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
49 @property |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
50 def resource(self): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
51 return self.__resource |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
52 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
53 @property |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
54 def bare(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
55 return self.domain if not self.node else (self.node + "@" + self.domain) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
56 |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
57 # XXX: Avoid property setters, Pyjamas doesn't seem to handle them well. It seems |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
58 # that it will just naively assign the value without actually calling the method. |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
59 # FIXME: find a way to raise an error if the (undefined!) setter is called. |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
60 def setNode(self, node): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
61 self.__node = node |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
62 self.__build() |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
63 |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
64 def setDomain(self, domain): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
65 self.__domain = domain |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
66 self.__build() |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
67 |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
68 def setResource(self, resource): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
69 self.__resource = resource |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
70 self.__build() |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
71 |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
72 def setBare(self, bare): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
73 self.__parseBare(bare) |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
74 self.__build() |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
75 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
76 def __build(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
77 """Build the JID string from the node, domain and resource""" |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
78 self.__raw = self.bare if not self.resource else (self.bare + '/' + self.resource) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
79 |
13 | 80 def __parse(self): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
81 """Parse the JID string to extract the node, domain and resource""" |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
82 tokens = self.__raw.split('/') |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
83 bare, self.__resource = (tokens[0], tokens[1]) if len(tokens) > 1 else (self.__raw, '') |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
84 self.__parseBare(bare) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
85 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
86 def __parseBare(self, bare): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
87 """Parse the given JID bare to extract the node and domain |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
88 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
89 @param bare (str): JID bare to parse |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
90 """ |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
91 tokens = bare.split('@') |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
92 self.__node, self.__domain = (tokens[0], tokens[1]) if len(tokens) > 1 else ('', bare) |
19 | 93 |
94 def __str__(self): | |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
95 try: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
96 return self.__raw |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
97 except AttributeError: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
98 raise AttributeError("Trying to output a JID which has not been parsed yet") |
13 | 99 |
100 def is_valid(self): | |
515
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
101 """ |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
102 @return: True if the JID is XMPP compliant |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
103 """ |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
104 return self.domain != '' |
303
6ce8515ee8f5
browser_side: fix internal JID class equality operator
souliane <souliane@mailoo.org>
parents:
274
diff
changeset
|
105 |
6ce8515ee8f5
browser_side: fix internal JID class equality operator
souliane <souliane@mailoo.org>
parents:
274
diff
changeset
|
106 def __eq__(self, other): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
107 """Redefine equality operator to implement the naturally expected behavior""" |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
108 return self.__raw == other.__raw |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
109 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
110 def __hash__(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
111 """Redefine hash to implement the naturally expected behavior""" |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
112 return hash(self.__raw) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
113 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
114 def full(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
115 return str(self) |