Mercurial > libervia-web
annotate src/browser/sat_browser/jid.py @ 557:d0114855d6d4
browser_side (plugin OTR): fixes missing resource issue:
- the problem might still happen but at least:
- the session won't be started with a bare JID
- if a session with a full JID exists and the user tries to send a message
to a bare JID, he will get the big warning added (c.f last changeset)
author | souliane <souliane@mailoo.org> |
---|---|
date | Tue, 23 Sep 2014 10:53:52 +0200 |
parents | 138336986bd0 |
children | b38629924602 |
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 |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
45 # XXX: I defined node, domain and resource as properties here, and renamed |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
46 # the class attributes with the '__' prefix, but it appeared that the setter |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
47 # methods were not called! Maybe pyjamas doesn't handle them well. |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
48 def setNode(self, node): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
49 self.node = node |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
50 self.__build() |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
51 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
52 def setDomain(self, domain): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
53 self.domain = domain |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
54 self.__build() |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
55 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
56 def setResource(self, resource): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
57 self.resource = resource |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
58 self.__build() |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
59 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
60 @property |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
61 def bare(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
62 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
|
63 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
64 @bare.setter |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
65 def bare(self, bare): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
66 self.__parseBare(bare) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
67 self.build() |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
68 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
69 def __build(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
70 """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
|
71 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
|
72 |
13 | 73 def __parse(self): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
74 """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
|
75 tokens = self.__raw.split('/') |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
76 bare, self.resource = (tokens[0], tokens[1]) if len(tokens) > 1 else (self.__raw, '') |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
77 self.__parseBare(bare) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
78 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
79 def __parseBare(self, bare): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
80 """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
|
81 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
82 @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
|
83 """ |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
84 tokens = bare.split('@') |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
85 self.node, self.domain = (tokens[0], tokens[1]) if len(tokens) > 1 else ('', bare) |
19 | 86 |
87 def __str__(self): | |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
88 try: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
89 return self.__raw |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
90 except AttributeError: |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
91 raise AttributeError("Trying to output a JID which has not been parsed yet") |
13 | 92 |
93 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
|
94 """ |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
95 @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
|
96 """ |
da690ef8019e
browser_side: force JID's node and domain to lower-case
souliane <souliane@mailoo.org>
parents:
467
diff
changeset
|
97 return self.domain != '' |
303
6ce8515ee8f5
browser_side: fix internal JID class equality operator
souliane <souliane@mailoo.org>
parents:
274
diff
changeset
|
98 |
6ce8515ee8f5
browser_side: fix internal JID class equality operator
souliane <souliane@mailoo.org>
parents:
274
diff
changeset
|
99 def __eq__(self, other): |
519
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
100 """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
|
101 return self.__raw == other.__raw |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
102 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
103 def __hash__(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
104 """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
|
105 return hash(self.__raw) |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
106 |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
107 def full(self): |
138336986bd0
browser_side: refactorize class JID to allow modifying its attributes
souliane <souliane@mailoo.org>
parents:
515
diff
changeset
|
108 return str(self) |