Mercurial > libervia-web
annotate src/browser/sat_browser/jid.py @ 571:f0c8a4d51890
browser_side: print a warning when trying to access a non existing contact box:
This occurs when you receive updatePresence of a MUC occupant before
Libervia knows that this is a MUC. Actually you shouldn't receive presence
update for the occupant before the MUC widget is displayed, this means a
loss of information. One way to fix it is to modify (un)availableReceived
in sat.core.xmpp: check for the entity data "type" or make a disco request
if it doesn't exist, and an attribute to presenceUpdate to tell the
frontend if we have a MUC occupant or a roster contact.
author | souliane <souliane@mailoo.org> |
---|---|
date | Fri, 17 Oct 2014 10:42:10 +0200 |
parents | b38629924602 |
children | f8a355bede6a |
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): | |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
28 try: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
29 assert(isinstance(jid, str)) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
30 except AssertionError: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
31 raise AssertionError('Expected a string but got a %(class)s: %(inst)s' % |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
32 {'class': jid.__class__, 'inst': jid}) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
33 self.__raw = str(JID.__normalize(jid)) |
13 | 34 self.__parse() |
35 | |
515
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
36 @classmethod |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
37 def __normalize(cls, jid): |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
38 """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
|
39 if not jid: |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
40 return jid |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
41 tokens = jid.split('/') |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
42 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
|
43 return '/'.join(tokens) |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
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 node(self): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
47 return self.__node |
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 domain(self): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
51 return self.__domain |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
52 |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
53 @property |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
54 def resource(self): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
55 return self.__resource |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
56 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
57 @property |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
58 def bare(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
59 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
|
60 |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
61 # 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
|
62 # 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
|
63 # 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
|
64 def setNode(self, node): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
65 self.__node = node |
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 setDomain(self, domain): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
69 self.__domain = domain |
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 setResource(self, resource): |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
73 self.__resource = resource |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
74 self.__build() |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
75 |
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
76 def setBare(self, bare): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
77 self.__parseBare(bare) |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
78 self.__build() |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
79 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
80 def __build(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
81 """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
|
82 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
|
83 |
13 | 84 def __parse(self): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
85 """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
|
86 tokens = self.__raw.split('/') |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
87 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
|
88 self.__parseBare(bare) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
89 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
90 def __parseBare(self, bare): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
91 """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
|
92 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
93 @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
|
94 """ |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
95 tokens = bare.split('@') |
558
b38629924602
browser_side: using property setters is explicitely NOT recommended
souliane <souliane@mailoo.org>
parents:
519
diff
changeset
|
96 self.__node, self.__domain = (tokens[0], tokens[1]) if len(tokens) > 1 else ('', bare) |
19 | 97 |
98 def __str__(self): | |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
99 try: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
100 return self.__raw |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
101 except AttributeError: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
102 raise AttributeError("Trying to output a JID which has not been parsed yet") |
13 | 103 |
104 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
|
105 """ |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
106 @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
|
107 """ |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
108 return self.domain != '' |
303
6ce8515ee8f5
browser_side: fix internal JID class equality operator
souliane <souliane@mailoo.org>
parents:
274
diff
changeset
|
109 |
6ce8515ee8f5
browser_side: fix internal JID class equality operator
souliane <souliane@mailoo.org>
parents:
274
diff
changeset
|
110 def __eq__(self, other): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
111 """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
|
112 return self.__raw == other.__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 __hash__(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
115 """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
|
116 return hash(self.__raw) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
117 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
118 def full(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
119 return str(self) |