Mercurial > libervia-backend
annotate sat/tools/common/uri.py @ 2582:2e6864b1d577
quick frontend (contact list): don't store "nick" for group contacts:
plugin XEP-0054 may associate a "nick" with a bare jid, which in case of MUC can cause trouble (Primitivus for instance will use the nick instead of the name of the room).
This hack avoid this issue for now.
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 11 May 2018 17:13:58 +0200 |
parents | 26edcf3a30eb |
children | 56f94936df1e |
rev | line source |
---|---|
2216
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1 #!/usr/bin/env python2 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 # -*- coding: utf-8 -*- |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
4 # SAT: a jabber client |
2483 | 5 # Copyright (C) 2009-2018 Jérôme Poisson (goffi@goffi.org) |
2216
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # This program is free software: you can redistribute it and/or modify |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # it under the terms of the GNU Affero General Public License as published by |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # the Free Software Foundation, either version 3 of the License, or |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 # (at your option) any later version. |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # This program is distributed in the hope that it will be useful, |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 # GNU Affero General Public License for more details. |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # You should have received a copy of the GNU Affero General Public License |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
19 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
20 """ XMPP uri parsing tools """ |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
21 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
22 import urlparse |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
23 import urllib |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
24 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 # FIXME: basic implementation, need to follow RFC 5122 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 def parseXMPPUri(uri): |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
28 """Parse an XMPP uri and return a dict with various information |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 @param uri(unicode): uri to parse |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
31 @return dict(unicode, unicode): data depending of the URI where key can be: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 type: one of ("pubsub", TODO) |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
33 type is always present |
2216
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 sub_type: can be: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 - microblog |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
36 only used for pubsub for now |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 path: XMPP path (jid of the service or entity) |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
38 node: node used |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 id: id of the element (item for pubsub) |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
40 @raise ValueError: the scheme is not xmpp |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
41 """ |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 uri_split = urlparse.urlsplit(uri.encode('utf-8')) |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
43 if uri_split.scheme != 'xmpp': |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
44 raise ValueError(u'this is not a XMPP URI') |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
45 |
2229
761fa220a717
tools (common/uri): minor comment update
Goffi <goffi@goffi.org>
parents:
2222
diff
changeset
|
46 # XXX: we don't use jid.JID for path as it can be used both in backend and frontend |
761fa220a717
tools (common/uri): minor comment update
Goffi <goffi@goffi.org>
parents:
2222
diff
changeset
|
47 # which may use different JID classes |
2216
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
48 data = {u'path': urllib.unquote(uri_split.path).decode('utf-8')} |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
49 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 query_end = uri_split.query.find(';') |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 query_type = uri_split.query[:query_end] |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 if query_end == -1 or '=' in query_type: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 raise ValueError('no query type, invalid XMPP URI') |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
54 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
55 pairs = urlparse.parse_qs(uri_split.geturl()) |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
56 for k, v in pairs.items(): |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
57 if len(v) != 1: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
58 raise NotImplementedError(u"multiple values not managed") |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
59 if k in ('path', 'type', 'sub_type'): |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
60 raise NotImplementedError(u"reserved key used in URI, this is not supported") |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
61 data[k.decode('utf-8')] = urllib.unquote(v[0]).decode('utf-8') |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
62 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 if query_type: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 data[u'type'] = query_type.decode('utf-8') |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
65 elif u'node' in data: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 data[u'type'] = u'pubsub' |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 else: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 data[u'type'] = '' |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 if u'node' in data: |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 if data[u'node'].startswith(u'urn:xmpp:microblog:'): |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
72 data[u'sub_type'] = 'microblog' |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
73 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
74 return data |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
75 |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
76 def addPairs(uri, pairs): |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
77 for k,v in pairs.iteritems(): |
2328
f9adda22a2e1
tools(common/uri): fixed encoding in buildXMPPUri
Goffi <goffi@goffi.org>
parents:
2326
diff
changeset
|
78 uri.append(u';' + urllib.quote_plus(k.encode('utf-8')) + u'=' + urllib.quote_plus(v.encode('utf-8'))) |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
79 |
2242
e5e54ff0b775
core (tools/common/uri): don't display finale "?" if no extra data is specified
Goffi <goffi@goffi.org>
parents:
2229
diff
changeset
|
80 def buildXMPPUri(type_, **kwargs): |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
81 uri = [u'xmpp:'] |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
82 subtype = kwargs.pop('subtype', None) |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
83 path = kwargs.pop('path') |
2328
f9adda22a2e1
tools(common/uri): fixed encoding in buildXMPPUri
Goffi <goffi@goffi.org>
parents:
2326
diff
changeset
|
84 uri.append(urllib.quote_plus(path.encode('utf-8')).replace(u'%40', '@')) |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
85 |
2242
e5e54ff0b775
core (tools/common/uri): don't display finale "?" if no extra data is specified
Goffi <goffi@goffi.org>
parents:
2229
diff
changeset
|
86 if type_ == u'pubsub': |
2326
91a14dab924d
tools (common/uri): buildXMPPUri: use XEP-0277 namespace as node if node is empty or None for microblog subtype
Goffi <goffi@goffi.org>
parents:
2242
diff
changeset
|
87 if subtype == 'microblog' and not kwargs.get('node'): |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
88 kwargs[u'node'] = 'urn:xmpp:microblog:0' |
2242
e5e54ff0b775
core (tools/common/uri): don't display finale "?" if no extra data is specified
Goffi <goffi@goffi.org>
parents:
2229
diff
changeset
|
89 if kwargs: |
e5e54ff0b775
core (tools/common/uri): don't display finale "?" if no extra data is specified
Goffi <goffi@goffi.org>
parents:
2229
diff
changeset
|
90 uri.append(u'?') |
e5e54ff0b775
core (tools/common/uri): don't display finale "?" if no extra data is specified
Goffi <goffi@goffi.org>
parents:
2229
diff
changeset
|
91 addPairs(uri, kwargs) |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
92 else: |
2242
e5e54ff0b775
core (tools/common/uri): don't display finale "?" if no extra data is specified
Goffi <goffi@goffi.org>
parents:
2229
diff
changeset
|
93 raise NotImplementedError(u'{type_} URI are not handled yet'.format(type_=type_)) |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
94 |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
95 return u''.join(uri) |