Mercurial > libervia-backend
annotate src/tools/common/uri.py @ 2307:8fa7edd0da24
plugin Pubsub Hook: first draft:
This new plugin allow to attach an external action to a Pubsub event (i.e. notification).
Hook can be persitent accross restarts, or temporary (will be deleted on profile disconnection).
Only Python files are handled for now.
In the future, it may make sense to move hooks in a generic plugin which could be used by ad-hoc commands, messages, pubsub, etc.
author | Goffi <goffi@goffi.org> |
---|---|
date | Wed, 05 Jul 2017 15:05:47 +0200 |
parents | e5e54ff0b775 |
children | 91a14dab924d |
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 |
7e06eafef409
tools(common/uri): XMPP uri parsing module, first draft
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 # Copyright (C) 2009-2016 Jérôme Poisson (goffi@goffi.org) |
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(): |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
78 uri.append(u';' + urllib.quote_plus(k) + u'=' + urllib.quote_plus(v)) |
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') |
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
84 uri.append(urllib.quote_plus(path).replace(u'%40', '@')) |
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': |
2222
bdc64c487e21
tools/common (uri): added a method to build URI
Goffi <goffi@goffi.org>
parents:
2216
diff
changeset
|
87 if subtype == 'microblog' and not 'node' in kwargs: |
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) |