annotate sat/plugins/plugin_xep_0059.py @ 2762:5a51c7fc74a5

core (XMLUI): small optimisation: introspection is done once at module loading instead of on each XMLUI instantiation
author Goffi <goffi@goffi.org>
date Fri, 11 Jan 2019 09:48:17 +0100
parents e3f6de6ce320
children c4190d5340ab
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)
2483
0046283a285d dates update
Goffi <goffi@goffi.org>
parents: 2414
diff changeset
5 # Copyright (C) 2009-2018 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 """
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
64 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
65 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
66 try:
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
67 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
68 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
69 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
70 continue
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
71
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
72 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
73 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
74 else:
035901dc946d plugin XEP-0059: added "parseExtra" method to easily handle RSM argument coming from bridge.
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
75 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
76
2717
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
77 def serialise(self, rsm_response, data=None):
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
78 """Serialise data for RSM
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
79
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
80 Key set in data can be:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
81 - rsm_first: first item id in the page
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
82 - rsm_last: last item id in the page
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
83 - 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
84 - 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
85 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
86 All values are set as strings.
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
87 @param rsm_response(rsm.RSMResponse): response to serialise
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
88 @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
89 If None, a new dict is created
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
90 @return (dict): data dict
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
91 """
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
92 if data is None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
93 data = {}
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
94 if rsm_response.first is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
95 data[u"rsm_first"] = rsm_response.first
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
96 if rsm_response.last is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
97 data[u"rsm_last"] = rsm_response.last
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
98 if rsm_response.index is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
99 data[u"rsm_index"] = unicode(rsm_response.index)
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
100 if rsm_response.index is not None:
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
101 data[u"rsm_index"] = unicode(rsm_response.index)
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
102 return data
e3f6de6ce320 plugin XEP-0059: added serialise method
Goffi <goffi@goffi.org>
parents: 2700
diff changeset
103
1219
16484ebb695b plugin XEP-0059: first draft, pubsub and jabber search do not exploit it yet
souliane <souliane@mailoo.org>
parents:
diff changeset
104
1769
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
105 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
106 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
107
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
108 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
1769
1fc6a380f4db plugin xep-0059: minor cleaning
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
109 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
110
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
111 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
112 return []