annotate sat/plugins/plugin_xep_0059.py @ 2979:f44a95f566d2

core, plugin XEP-0045: fix crashes when changing URIs: When adding missing URIs in message, the "children" property was used instead of elements(). "children" not only return elements, and this was causing crashes. This may fix bug 294 rel 294
author Goffi <goffi@goffi.org>
date Sun, 30 Jun 2019 15:52:30 +0200
parents 003b8b4b56a7
children ab2696e34d29
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1769
diff changeset
1 #!/usr/bin/env python2
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
3
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
4 # SAT plugin for Result Set Management (XEP-0059)
2771
003b8b4b56a7 date update
Goffi <goffi@goffi.org>
parents: 2763
diff changeset
5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org)
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1465
diff changeset
6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
7
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
8 # This program is free software: you can redistribute it and/or modify
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
11 # (at your option) any later version.
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
12
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
13 # This program is distributed in the hope that it will be useful,
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
16 # GNU Affero General Public License for more details.
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
17
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
20
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
21 from sat.core.i18n import _
2145
33c8c4973743 core (plugins): added missing contants + use of new constants in PLUGIN_INFO
Goffi <goffi@goffi.org>
parents: 2144
diff changeset
22 from sat.core.constants import Const as C
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
23 from sat.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
24
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
25 log = getLogger(__name__)
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
26
1769
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
27 from wokkel import disco
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
28 from wokkel import iwokkel
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
29 from wokkel import rsm
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
30
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
31 from twisted.words.protocols.jabber import xmlstream
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
32 from zope.interface import implements
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
33
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
34
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
35 PLUGIN_INFO = {
2700
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
36 C.PI_NAME: u"Result Set Management",
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
37 C.PI_IMPORT_NAME: u"XEP-0059",
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
38 C.PI_TYPE: u"XEP",
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
39 C.PI_PROTOCOLS: [u"XEP-0059"],
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
40 C.PI_MAIN: u"XEP_0059",
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
41 C.PI_HANDLER: u"yes",
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
42 C.PI_DESCRIPTION: _(u"""Implementation of Result Set Management"""),
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
43 }
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
44
2700
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
45 RSM_PREFIX = u"rsm_"
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
46
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
47
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
48 class XEP_0059(object):
1267
ea692d51a0ee plugins XEP-0059, XEP-0060: leave internal wokkel extensions to sat.tmp.wokkel
souliane <souliane@mailoo.org>
parents: 1219
diff changeset
49 # XXX: RSM management is done directly in Wokkel.
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
50
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
51 def __init__(self, host):
2700
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
52 log.info(_(u"Result Set Management plugin initialization"))
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
53
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
54 def getHandler(self, client):
1465
cbf38047ca60 plugin XEP-0059: fixed bad disco handling
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
55 return XEP_0059_handler()
cbf38047ca60 plugin XEP-0059: fixed bad disco handling
Goffi <goffi@goffi.org>
parents: 1396
diff changeset
56
2700
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
57 def parseExtra(self, extra):
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
58 """Parse extra dictionnary to retrieve RSM arguments
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
59
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
60 @param extra(dict): data for parse
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
61 @return (rsm.RSMRequest, None): request with parsed arguments
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
62 or None if no RSM arguments have been found
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
63 """
2763
c4190d5340ab XEP-0059: max value check:
Goffi <goffi@goffi.org>
parents: 2717
diff changeset
64 if int(extra.get(RSM_PREFIX + u'max', 0)) < 0:
c4190d5340ab XEP-0059: max value check:
Goffi <goffi@goffi.org>
parents: 2717
diff changeset
65 raise ValueError(_(u"rsm_max can't be negative"))
c4190d5340ab XEP-0059: max value check:
Goffi <goffi@goffi.org>
parents: 2717
diff changeset
66
2700
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
67 rsm_args = {}
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
68 for arg in (u"max", u"after", u"before", u"index"):
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
69 try:
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
70 argname = "max_" if arg == u"max" else arg
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
71 rsm_args[argname] = extra.pop(RSM_PREFIX + arg)
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
72 except KeyError:
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
73 continue
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
74
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
75 if rsm_args:
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
76 return rsm.RSMRequest(**rsm_args)
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
77 else:
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
78 return None
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
79
2717
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
80 def serialise(self, rsm_response, data=None):
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
81 """Serialise data for RSM
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
82
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
83 Key set in data can be:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
84 - rsm_first: first item id in the page
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
85 - rsm_last: last item id in the page
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
86 - rsm_index: position of the first item in the full set (may be approximate)
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
87 - rsm_count: total number of items in the full set (may be approximage)
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
88 If a value doesn't exists, it's not set.
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
89 All values are set as strings.
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
90 @param rsm_response(rsm.RSMResponse): response to serialise
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
91 @param data(dict, None): dict to update with rsm_* data.
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
92 If None, a new dict is created
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
93 @return (dict): data dict
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
94 """
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
95 if data is None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
96 data = {}
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
97 if rsm_response.first is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
98 data[u"rsm_first"] = rsm_response.first
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
99 if rsm_response.last is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
100 data[u"rsm_last"] = rsm_response.last
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
101 if rsm_response.index is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
102 data[u"rsm_index"] = unicode(rsm_response.index)
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
103 if rsm_response.index is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
104 data[u"rsm_index"] = unicode(rsm_response.index)
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
105 return data
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
106
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
107
1769
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
108 class XEP_0059_handler(xmlstream.XMPPHandler):
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
109 implements(iwokkel.IDisco)
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
110
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
111 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
1769
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
112 return [disco.DiscoFeature(rsm.NS_RSM)]
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
113
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
114 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
115 return []