annotate sat_pubsub/backend.py @ 430:5a0ada3b61ca

Full-Text Search implementation: /!\ pgsql schema needs to be updated /!\ /!\ Minimal PostgreSQL required version is now 12 /!\ A new options is available to specify main language of a node. By default a `generic` language is used (which uses the `simple` configuration in PostgreSQL). When a node owner changes the language, the index is rebuilt accordingly. It is possible to have item specific language for multilingual nodes (but for the moment the search is done with node language, so the results won't be good). If an item language is explicitely set in `item_languages`, the FTS configuration won't be affected by node FTS language setting. Search is parsed with `websearch_to_tsquery` for now, but this parser doesn't handle prefix matching, so it may be replaced in the future. SetConfiguration now only updates the modified values, this avoid triggering the FTS re-indexing on each config change. `_checkNodeExists` is not called anymore as we can check if a row has been modified to see if the node exists, this avoid a useless query. Item storing has been slighly improved with a useless SELECT and condition removed. To avoid 2 schema updates in a row, the `sat_pubsub_update_5_6.sql` file also prepares the implementation of XEP-0346 by updating nodes with a schema and creating the suitable template nodes.
author Goffi <goffi@goffi.org>
date Fri, 11 Dec 2020 17:18:52 +0100
parents c21f31355ab9
children 5e8b8ef5c862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1 #!/usr/bin/env python3
237
6596730685e8 added creator check support
Goffi <goffi@goffi.org>
parents: 236
diff changeset
2 #
384
aa3a464df605 dates update
Goffi <goffi@goffi.org>
parents: 381
diff changeset
3 # Copyright (c) 2012-2019 Jérôme Poisson
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
4 # Copyright (c) 2013-2016 Adrien Cossa
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
5 # Copyright (c) 2003-2011 Ralph Meijer
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
6
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
7
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
8 # This program is free software: you can redistribute it and/or modify
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
11 # (at your option) any later version.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
12
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
13 # This program is distributed in the hope that it will be useful,
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
16 # GNU Affero General Public License for more details.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
17
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
20 # --
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
21
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
22 # This program is based on Idavoll (http://idavoll.ik.nu/),
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
23 # originaly written by Ralph Meijer (http://ralphm.net/blog/)
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
24 # It is sublicensed under AGPL v3 (or any later version) as allowed by the original
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
25 # license.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
26
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
27 # --
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
28
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
29 # Here is a copy of the original license:
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
30
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
31 # Copyright (c) 2003-2011 Ralph Meijer
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
32
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
33 # Permission is hereby granted, free of charge, to any person obtaining
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
34 # a copy of this software and associated documentation files (the
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
35 # "Software"), to deal in the Software without restriction, including
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
36 # without limitation the rights to use, copy, modify, merge, publish,
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
37 # distribute, sublicense, and/or sell copies of the Software, and to
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
38 # permit persons to whom the Software is furnished to do so, subject to
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
39 # the following conditions:
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
40
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
41 # The above copyright notice and this permission notice shall be
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
42 # included in all copies or substantial portions of the Software.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
43
312
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
44 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
45 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
46 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
47 # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
48 # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
49 # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
5d7c3787672e fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents: 311
diff changeset
50 # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
233
564ae55219e1 sublicensed under AGPL V3
Goffi <goffi@goffi.org>
parents: 232
diff changeset
51
155
5191ba7c4df8 Work towards first release 0.5.0.
Ralph Meijer <ralphm@ik.nu>
parents: 153
diff changeset
52
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
53 """
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
54 Generic publish-subscribe backend.
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
55
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
56 This module implements a generic publish-subscribe backend service with
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
57 business logic as per
200
2189c663ba44 Epytext fixes.
Ralph Meijer <ralphm@ik.nu>
parents: 198
diff changeset
58 U{XEP-0060<http://www.xmpp.org/extensions/xep-0060.html>} that interacts with
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
59 a given storage facility. It also provides an adapter from the XMPP
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
60 publish-subscribe protocol.
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
61 """
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
62
394
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
63 import copy
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
64 import uuid
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
65
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
66 from zope.interface import implementer
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
67
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
68 from twisted.application import service
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
69 from twisted.python import components, log
183
c21b986cff30 Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents: 181
diff changeset
70 from twisted.internet import defer, reactor
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
71 from twisted.words.protocols.jabber.error import StanzaError
381
7c490bb60847 backend: items ids are returned in payload if not specified on publish
Goffi <goffi@goffi.org>
parents: 380
diff changeset
72 from twisted.words.xish import domish, utility
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
73
317
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
74 from wokkel import disco
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
75 from wokkel import data_form
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
76 from wokkel import rsm
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
77 from wokkel import iwokkel
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
78 from wokkel import pubsub
375
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
79 from wokkel.subprotocols import XMPPHandler
20
eddea65d1032 Added two exceptions: NoInstantNodes and NodeExists.
Ralph Meijer <ralphm@ik.nu>
parents: 18
diff changeset
80
317
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
81 from sat_pubsub import error
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
82 from sat_pubsub import iidavoll
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
83 from sat_pubsub import const
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
84 from sat_pubsub import container
15
46cd13c68ac0 Redone memory storage of nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 5
diff changeset
85
430
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
86 # TODO: modernise the code, get rid of legacy Twisted logging, use coroutines,
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
87 # better formatting
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
88
285
a87c155d0fd5 replaced former roster dirty hack by a XEP-0356 first draft implementation, only roster get is implemented so far
Goffi <goffi@goffi.org>
parents: 283
diff changeset
89
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
90 def _getAffiliation(node, entity):
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
91 d = node.getAffiliation(entity)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
92 d.addCallback(lambda affiliation: (node, affiliation))
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
93 return d
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 20
diff changeset
94
171
bc269696ef42 Reply with the correct error condition on subscription when not subscribed.
Ralph Meijer <ralphm@ik.nu>
parents: 169
diff changeset
95
394
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
96 def elementCopy(element):
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
97 """Make a copy of a domish.Element
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
98
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
99 The copy will have its own children list, so other elements
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
100 can be added as direct children without modifying orignal one.
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
101 Children are not deeply copied, so if an element is added to a child or grandchild,
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
102 it will also affect original element.
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
103 @param element(domish.Element): Element to clone
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
104 """
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
105 new_elt = domish.Element(
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
106 (element.uri, element.name),
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
107 defaultUri = element.defaultUri,
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
108 attribs = element.attributes,
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
109 localPrefixes = element.localPrefixes)
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
110 new_elt.parent = element.parent
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
111 new_elt.children = element.children[:]
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
112 return new_elt
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
113
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
114
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
115 def itemDataCopy(item_data):
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
116 """Make a copy of an item_data
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
117
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
118 deep copy every element of the tuple but item
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
119 do an elementCopy of item_data.item
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
120 @param item_data(ItemData): item data to copy
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
121 @return (ItemData): copied data
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
122 """
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
123 return container.ItemData(*[elementCopy(item_data.item)]
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
124 + [copy.deepcopy(d) for d in item_data[1:]])
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
125
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
126
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
127 @implementer(iidavoll.IBackendService)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
128 class BackendService(service.Service, utility.EventDispatcher):
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
129 """
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
130 Generic publish-subscribe backend service.
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
131
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
132 @cvar nodeOptions: Node configuration form as a mapping from the field
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
133 name to a dictionary that holds the field's type, label
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
134 and possible options to choose from.
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
135 @type nodeOptions: C{dict}.
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
136 @cvar defaultConfig: The default node configuration.
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
137 """
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
138
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
139
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
140 nodeOptions = {
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
141 const.OPT_PERSIST_ITEMS:
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
142 {"type": "boolean",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
143 "label": "Persist items to storage"},
422
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
144 const.OPT_MAX_ITEMS:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
145 {"type": "text-single",
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
146 "label": 'number of items to keep ("max" for unlimited)'},
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
147 const.OPT_DELIVER_PAYLOADS:
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
148 {"type": "boolean",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
149 "label": "Deliver payloads with event notifications"},
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
150 const.OPT_SEND_LAST_PUBLISHED_ITEM:
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
151 {"type": "list-single",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
152 "label": "When to send the last published item",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
153 "options": {
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
154 "never": "Never",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
155 "on_sub": "When a new subscription is processed"}
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
156 },
259
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
157 const.OPT_ACCESS_MODEL:
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
158 {"type": "list-single",
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
159 "label": "Who can subscribe to this node",
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
160 "options": {
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
161 const.VAL_AMODEL_OPEN: "Public node",
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
162 const.VAL_AMODEL_PRESENCE: "Node restricted to entites subscribed to owner presence",
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
163 const.VAL_AMODEL_PUBLISHER_ROSTER: "Node restricted to some groups of publisher's roster",
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
164 const.VAL_AMODEL_WHITELIST: "Node restricted to some jids",
259
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
165 }
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
166 },
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
167 const.OPT_ROSTER_GROUPS_ALLOWED:
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
168 {"type": "list-multi",
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
169 "label": "Groups of the roster allowed to access the node",
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
170 },
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
171 const.OPT_PUBLISH_MODEL:
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
172 {"type": "list-single",
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
173 "label": "Who can publish to this node",
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
174 "options": {
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
175 const.VAL_PMODEL_OPEN: "Everybody can publish",
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
176 const.VAL_PMODEL_PUBLISHERS: "Only owner and publishers can publish",
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
177 const.VAL_PMODEL_SUBSCRIBERS: "Everybody which subscribed to the node",
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
178 }
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
179 },
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
180 const.OPT_SERIAL_IDS:
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
181 {"type": "boolean",
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
182 "label": "Use serial ids"},
403
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
183 const.OPT_CONSISTENT_PUBLISHER:
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
184 {"type": "boolean",
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
185 "label": "Keep publisher on update"},
430
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
186 const.OPT_FTS_LANGUAGE:
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
187 {"type": "list-single",
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
188 "label": "Default language to use for full text search",
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
189 "options": {
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
190 const.VAL_FTS_GENERIC: (
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
191 "Generic (use if unsure of if your language is not present)"
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
192 )
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
193 }
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
194 },
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
195 }
159
6fe78048baf9 Rework error handling, depend on Twisted Words 0.4.0.
Ralph Meijer <ralphm@ik.nu>
parents: 155
diff changeset
196
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
197 subscriptionOptions = {
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
198 "pubsub#subscription_type":
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
199 {"type": "list-single",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
200 "options": {
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
201 "items": "Receive notification of new items only",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
202 "nodes": "Receive notification of new nodes only"}
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
203 },
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
204 "pubsub#subscription_depth":
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
205 {"type": "list-single",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
206 "options": {
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
207 "1": "Receive notification from direct child nodes only",
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
208 "all": "Receive notification from all descendent nodes"}
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
209 },
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
210 }
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
211
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 377
diff changeset
212 def __init__(self, storage, config):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
213 utility.EventDispatcher.__init__(self)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
214 self.storage = storage
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
215 self._callbackList = []
380
e81964db3cd6 administrators entities:
Goffi <goffi@goffi.org>
parents: 377
diff changeset
216 self.config = config
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
217 self.admins = config['admins_jids_list']
430
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
218 d = self.storage.getFTSLanguages()
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
219 d.addCallbacks(self._getFTSLanguagesCb, self._getFTSLanguagesEb)
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
220
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
221 def _getFTSLanguagesCb(self, languages):
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
222 # we skip the first one which is always "generic", as we already have it
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
223 for l in languages[1:]:
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
224 self.nodeOptions[const.OPT_FTS_LANGUAGE]["options"][l] = l.title()
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
225
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
226 def _getFTSLanguagesEb(self, failure_):
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
227 log.msg(f"WARNING: can get FTS languages: {failure_}")
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
228
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
229 def isAdmin(self, entity_jid):
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
230 """Return True if an entity is an administrator"""
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
231 return entity_jid.userhostJID() in self.admins
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
232
363
a98b3d52c2ff added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents: 358
diff changeset
233 def supportsPublishOptions(self):
a98b3d52c2ff added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents: 358
diff changeset
234 return True
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
235
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
236 def supportsPublisherAffiliation(self):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
237 return True
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
238
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
239 def supportsGroupBlog(self):
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
240 return True
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
241
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
242 def supportsOutcastAffiliation(self):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
243 return True
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
244
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
245 def supportsPersistentItems(self):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
246 return True
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
247
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
248 def supportsPublishModel(self):
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
249 return True
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
250
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
251 def getNodeType(self, nodeIdentifier, pep, recipient=None):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
252 # FIXME: manage pep and recipient
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
253 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
254 d.addCallback(lambda node: node.getType())
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
255 return d
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
256
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
257 def _getNodesIds(self, subscribed, pep, recipient):
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
258 # TODO: filter whitelist nodes
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
259 # TODO: handle publisher-roster (should probably be renamed to owner-roster for nodes)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
260 if not subscribed:
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
261 allowed_accesses = {'open', 'whitelist'}
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
262 else:
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
263 allowed_accesses = {'open', 'presence', 'whitelist'}
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
264 return self.storage.getNodeIds(pep, recipient, allowed_accesses)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
265
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
266 def getNodes(self, requestor, pep, recipient):
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
267 if pep:
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
268 d = self.privilege.isSubscribedFrom(requestor, recipient)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
269 d.addCallback(self._getNodesIds, pep, recipient)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
270 return d
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
271 return self.storage.getNodeIds(pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
272
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
273 def getNodeMetaData(self, nodeIdentifier, pep, recipient=None):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
274 # FIXME: manage pep and recipient
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
275 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
276 d.addCallback(lambda node: node.getMetaData())
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
277 d.addCallback(self._makeMetaData)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
278 return d
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
279
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
280 def _makeMetaData(self, metaData):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
281 options = []
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
282 for key, value in metaData.items():
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
283 if key in self.nodeOptions:
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
284 option = {"var": key}
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
285 option.update(self.nodeOptions[key])
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
286 option["value"] = value
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
287 options.append(option)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
288
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
289 return options
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
290
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
291 def _checkAuth(self, node, requestor):
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
292 """ Check authorisation of publishing in node for requestor """
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
293
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
294 def check(affiliation):
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
295 d = defer.succeed((affiliation, node))
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
296 configuration = node.getConfiguration()
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
297 publish_model = configuration[const.OPT_PUBLISH_MODEL]
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
298 if publish_model == const.VAL_PMODEL_PUBLISHERS:
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
299 if affiliation not in ['owner', 'publisher']:
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
300 raise error.Forbidden()
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
301 elif publish_model == const.VAL_PMODEL_SUBSCRIBERS:
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
302 if affiliation not in ['owner', 'publisher']:
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
303 # we are in subscribers publish model, we must check that
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
304 # the requestor is a subscriber to allow him to publish
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
305
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
306 def checkSubscription(subscribed):
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
307 if not subscribed:
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
308 raise error.Forbidden()
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
309 return (affiliation, node)
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
310
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
311 d.addCallback(lambda __: node.isSubscribed(requestor))
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
312 d.addCallback(checkSubscription)
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
313 elif publish_model != const.VAL_PMODEL_OPEN:
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
314 # publish_model must be publishers (default), subscribers or open.
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
315 raise ValueError('Unexpected value')
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
316
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
317 return d
108
1c18759d2afb Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents: 106
diff changeset
318
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
319 d = node.getAffiliation(requestor)
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
320 d.addCallback(check)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
321 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
322
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
323 def parseItemConfig(self, item):
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
324 """Get and remove item configuration information
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
325
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
326 @param item (domish.Element): item to parse
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
327 @return (tuple[unicode, dict)): (access_model, item_config)
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
328 """
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
329 item_config = None
259
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
330 access_model = const.VAL_AMODEL_DEFAULT
336
a468c187bbb5 fixed parseItemConfig (was iterating on children instead of elements)
Goffi <goffi@goffi.org>
parents: 333
diff changeset
331 for idx, elt in enumerate(item.elements()):
395
9bc3fbf3e685 backend: fixed elements filtering in parseItemConfig
Goffi <goffi@goffi.org>
parents: 394
diff changeset
332 if elt.uri != data_form.NS_X_DATA or elt.name != 'x':
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
333 continue
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
334 form = data_form.Form.fromElement(elt)
300
c5acb4995fde cleaner parseItemConfig
Goffi <goffi@goffi.org>
parents: 299
diff changeset
335 if form.formNamespace == const.NS_ITEM_CONFIG:
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
336 item_config = form
300
c5acb4995fde cleaner parseItemConfig
Goffi <goffi@goffi.org>
parents: 299
diff changeset
337 del item.children[idx] #we need to remove the config from item
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
338 break
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
339
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
340 if item_config:
259
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
341 access_model = item_config.get(const.OPT_ACCESS_MODEL, const.VAL_AMODEL_DEFAULT)
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
342 return (access_model, item_config)
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
343
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
344 def parseCategories(self, item_elt):
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
345 """Check if item contain an atom entry, and parse categories if possible
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
346
364
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
347 @param item_elt (domish.Element): item to parse
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
348 @return (list): list of found categories
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
349 """
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
350 categories = []
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
351 try:
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
352 entry_elt = next(item_elt.elements(const.NS_ATOM, "entry"))
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
353 except StopIteration:
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
354 return categories
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
355
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
356 for category_elt in entry_elt.elements(const.NS_ATOM, 'category'):
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
357 category = category_elt.getAttribute('term')
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
358 if category:
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
359 categories.append(category)
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
360
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
361 return categories
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
362
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
363 def enforceSchema(self, item_elt, schema, affiliation):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
364 """modifify item according to element, or refuse publishing
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
365
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
366 @param item_elt(domish.Element): item to check/modify
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
367 @param schema(domish.Eement): schema to enfore
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
368 @param affiliation(unicode): affiliation of the publisher
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
369 """
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
370 try:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
371 x_elt = next(item_elt.elements(data_form.NS_X_DATA, 'x'))
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
372 item_form = data_form.Form.fromElement(x_elt)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
373 except (StopIteration, data_form.Error):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
374 raise pubsub.BadRequest(text="node has a schema but item has no form")
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
375 else:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
376 item_elt.children.remove(x_elt)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
377
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
378 schema_form = data_form.Form.fromElement(schema)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
379
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
380 # we enforce restrictions
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
381 for field_elt in schema.elements(data_form.NS_X_DATA, 'field'):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
382 var = field_elt['var']
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
383 for restrict_elt in field_elt.elements(const.NS_SCHEMA_RESTRICT, 'restrict'):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
384 write_restriction = restrict_elt.attributes.get('write')
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
385 if write_restriction is not None:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
386 if write_restriction == 'owner':
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
387 if affiliation != 'owner':
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
388 # write is not allowed on this field, we use default value
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
389 # we can safely use Field from schema_form because
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
390 # we have created this instance only for this method
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
391 try:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
392 item_form.removeField(item_form.fields[var])
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
393 except KeyError:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
394 pass
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
395 item_form.addField(schema_form.fields[var])
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
396 else:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
397 raise StanzaError('feature-not-implemented', text='unknown write restriction {}'.format(write_restriction))
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
398
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
399 # we now remove every field which is not in data schema
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
400 to_remove = set()
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
401 for item_var, item_field in item_form.fields.items():
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
402 if item_var not in schema_form.fields:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
403 to_remove.add(item_field)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
404
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
405 for field in to_remove:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
406 item_form.removeField(field)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
407 item_elt.addChild(item_form.toElement())
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
408
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
409 def _checkOverwrite(self, node, itemIdentifiers, publisher):
403
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
410 """Check that publisher can overwrite items
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
411
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
412 current publisher must correspond to each item publisher
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
413 """
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
414 def doCheck(item_pub_map):
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
415 for item_publisher in item_pub_map.values():
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
416 if item_publisher.userhost() != publisher.userhost():
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
417 raise error.ItemForbidden()
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
418
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
419 d = node.getItemsPublishers(itemIdentifiers)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
420 d.addCallback(doCheck)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
421 return d
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
422
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
423 async def publish(self, nodeIdentifier, items, requestor, options, pep, recipient):
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
424 node = await self.storage.getNode(nodeIdentifier, pep, recipient)
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
425 affiliation, node = await self._checkAuth(node, requestor)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
426
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
427 if node.nodeType == 'collection':
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
428 raise error.NoPublishing()
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
429
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
430 configuration = node.getConfiguration()
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
431 persistItems = configuration[const.OPT_PERSIST_ITEMS]
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
432 deliverPayloads = configuration[const.OPT_DELIVER_PAYLOADS]
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
433
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
434 # we check that publish-options are satisfied
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
435 for field, value in options.items():
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
436 try:
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
437 current_value = configuration[field]
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
438 except KeyError:
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
439 raise error.ConstraintFailed(
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
440 f"publish-options {field!r} doesn't exist in node configuration"
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
441 )
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
442 if current_value != value:
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
443 raise error.ConstraintFailed(
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
444 f"configuration field {field!r} has a value of {current_value!r} "
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
445 f"which doesn't fit publish-options expected {value!r}"
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
446 )
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
447
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
448 if items and not persistItems and not deliverPayloads:
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
449 raise error.ItemForbidden()
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
450 elif not items and (persistItems or deliverPayloads):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
451 raise error.ItemRequired()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
452
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
453 items_data = []
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
454 check_overwrite = False
381
7c490bb60847 backend: items ids are returned in payload if not specified on publish
Goffi <goffi@goffi.org>
parents: 380
diff changeset
455 ret_payload = None # payload returned, None or domish.Element
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
456 for item in items:
299
07ad8d8fde77 item publisher is enforced
Goffi <goffi@goffi.org>
parents: 298
diff changeset
457 # we enforce publisher (cf XEP-0060 §7.1.2.3)
07ad8d8fde77 item publisher is enforced
Goffi <goffi@goffi.org>
parents: 298
diff changeset
458 item['publisher'] = requestor.full()
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
459 if persistItems or deliverPayloads:
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
460 item.uri = None
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
461 item.defaultUri = None
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
462 if not item.getAttribute("id"):
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
463 item["id"] = await node.getNextId()
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
464 new_item = True
389
66128656f76c backend: fixed items returned on publishing:
Goffi <goffi@goffi.org>
parents: 388
diff changeset
465 if ret_payload is None:
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
466 ret_pubsub_elt = domish.Element((pubsub.NS_PUBSUB, 'pubsub'))
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
467 ret_publish_elt = ret_pubsub_elt.addElement('publish')
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
468 ret_publish_elt['node'] = node.nodeIdentifier
389
66128656f76c backend: fixed items returned on publishing:
Goffi <goffi@goffi.org>
parents: 388
diff changeset
469 ret_payload = ret_pubsub_elt
66128656f76c backend: fixed items returned on publishing:
Goffi <goffi@goffi.org>
parents: 388
diff changeset
470 ret_publish_elt = ret_payload.publish
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
471 ret_item_elt = ret_publish_elt.addElement('item')
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
472 ret_item_elt["id"] = item["id"]
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
473 else:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
474 check_overwrite = True
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
475 new_item = False
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
476 access_model, item_config = self.parseItemConfig(item)
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
477 categories = self.parseCategories(item)
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
478 schema = node.getSchema()
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
479 if schema is not None:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
480 self.enforceSchema(item, schema, affiliation)
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
481 items_data.append(container.ItemData(item, access_model, item_config, categories, new=new_item))
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
482
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
483 if persistItems:
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
484
403
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
485 if check_overwrite:
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
486 itemIdentifiers = [item['id'] for item in items
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
487 if item.getAttribute('id')]
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
488
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
489 if affiliation == 'owner' or self.isAdmin(requestor):
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
490 if configuration[const.OPT_CONSISTENT_PUBLISHER]:
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
491 pub_map = await node.getItemsPublishers(itemIdentifiers)
415
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
492 if pub_map:
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
493 # if we have existing items, we replace publishers with
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
494 # original one to stay consistent
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
495 publishers = set(pub_map.values())
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
496 if len(publishers) != 1:
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
497 # TODO: handle multiple items publishing (from several
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
498 # publishers)
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
499 raise error.NoPublishing(
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
500 "consistent_publisher is currently only possible when "
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
501 "publishing items from a single publisher. Try to "
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
502 "publish one item at a time")
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
503 # we replace requestor and new payload's publisher by original
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
504 # item publisher to keep publisher consistent
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
505 requestor = publishers.pop()
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
506 for item in items:
4179ed660a85 backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents: 414
diff changeset
507 item['publisher'] = requestor.full()
403
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
508 else:
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
509 # we don't want a publisher to overwrite the item
1dc606612405 implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents: 397
diff changeset
510 # of an other publisher
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
511 await self._checkOverwrite(node, itemIdentifiers, requestor)
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
512
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
513 # TODO: check conflict and recalculate max id if serial_ids is set
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
514 await node.storeItems(items_data, requestor)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
515
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
516 self._doNotify(node, items_data, deliverPayloads, pep, recipient)
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
517 return ret_payload
367
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
518
a772f7dac930 backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents: 365
diff changeset
519 def _doNotify(self, node, items_data, deliverPayloads, pep, recipient):
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
520 if items_data and not deliverPayloads:
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
521 for item_data in items_data:
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
522 item_data.item.children = []
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
523 self.dispatch({'items_data': items_data, 'node': node, 'pep': pep, 'recipient': recipient},
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
524 '//event/pubsub/notify')
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
525
339
516b282aa542 backend (notifications): avoid useless database request in getNotifications
Goffi <goffi@goffi.org>
parents: 336
diff changeset
526 def getNotifications(self, node, items_data):
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
527 """Build a list of subscriber to the node
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
528
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
529 subscribers will be associated with subscribed items,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
530 and subscription type.
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
531 """
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
532
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
533 def toNotifications(subscriptions, items_data):
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
534 subsBySubscriber = {}
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
535 for subscription in subscriptions:
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
536 if subscription.options.get('pubsub#subscription_type',
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
537 'items') == 'items':
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
538 subs = subsBySubscriber.setdefault(subscription.subscriber,
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
539 set())
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
540 subs.add(subscription)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
541
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
542 notifications = [(subscriber, subscriptions_, items_data)
285
a87c155d0fd5 replaced former roster dirty hack by a XEP-0356 first draft implementation, only roster get is implemented so far
Goffi <goffi@goffi.org>
parents: 283
diff changeset
543 for subscriber, subscriptions_
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
544 in subsBySubscriber.items()]
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
545
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
546 return notifications
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
547
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
548 def rootNotFound(failure):
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
549 failure.trap(error.NodeNotFound)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
550 return []
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
551
339
516b282aa542 backend (notifications): avoid useless database request in getNotifications
Goffi <goffi@goffi.org>
parents: 336
diff changeset
552 d1 = node.getSubscriptions('subscribed')
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
553 # FIXME: must add root node subscriptions ?
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
554 # d2 = self.storage.getNode('', False) # FIXME: to check
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
555 # d2.addCallback(lambda node: node.getSubscriptions('subscribed'))
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
556 # d2.addErrback(rootNotFound)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
557 # d = defer.gatherResults([d1, d2])
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
558 # d.addCallback(lambda result: result[0] + result[1])
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
559 d1.addCallback(toNotifications, items_data)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
560 return d1
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
561
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
562 def registerPublishNotifier(self, observerfn, *args, **kwargs):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
563 self.addObserver('//event/pubsub/notify', observerfn, *args, **kwargs)
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
564
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
565 def registerRetractNotifier(self, observerfn, *args, **kwargs):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
566 self.addObserver('//event/pubsub/retract', observerfn, *args, **kwargs)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
567
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
568 def subscribe(self, nodeIdentifier, subscriber, requestor, pep, recipient):
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
569 subscriberEntity = subscriber.userhostJID()
216
53d2c0019458 Fix subscription and unsubscription JID checks.
Ralph Meijer <ralphm@ik.nu>
parents: 211
diff changeset
570 if subscriberEntity != requestor.userhostJID():
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
571 return defer.fail(error.Forbidden())
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
572
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
573 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
574 d.addCallback(_getAffiliation, subscriberEntity)
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
575 d.addCallback(self._doSubscribe, subscriber, pep, recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
576 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
577
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
578 def _doSubscribe(self, result, subscriber, pep, recipient):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
579 node, affiliation = result
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
580
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
581 if affiliation == 'outcast':
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
582 raise error.Forbidden()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
583
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
584 access_model = node.getAccessModel()
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
585
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
586 if access_model == const.VAL_AMODEL_OPEN:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
587 d = defer.succeed(None)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
588 elif access_model == const.VAL_AMODEL_PRESENCE:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
589 d = self.checkPresenceSubscription(node, subscriber)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
590 elif access_model == const.VAL_AMODEL_PUBLISHER_ROSTER:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
591 d = self.checkRosterGroups(node, subscriber)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
592 elif access_model == const.VAL_AMODEL_WHITELIST:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
593 d = self.checkNodeAffiliations(node, subscriber)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
594 else:
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
595 raise NotImplementedError
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
596
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
597 def trapExists(failure):
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
598 failure.trap(error.SubscriptionExists)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
599 return False
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
600
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
601 def cb(sendLast):
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
602 d = node.getSubscription(subscriber)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
603 if sendLast:
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
604 d.addCallback(self._sendLastPublished, node, pep, recipient)
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
605 return d
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
606
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
607 d.addCallback(lambda _: node.addSubscription(subscriber, 'subscribed', {}))
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
608 d.addCallbacks(lambda _: True, trapExists)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
609 d.addCallback(cb)
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
610
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
611 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
612
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
613 def _sendLastPublished(self, subscription, node, pep, recipient):
183
c21b986cff30 Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents: 181
diff changeset
614
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
615 def notifyItem(items_data):
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
616 if items_data:
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
617 reactor.callLater(0, self.dispatch,
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
618 {'items_data': items_data,
261
65d4fed44edf fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents: 260
diff changeset
619 'node': node,
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
620 'pep': pep,
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
621 'recipient': recipient,
261
65d4fed44edf fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents: 260
diff changeset
622 'subscription': subscription,
65d4fed44edf fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents: 260
diff changeset
623 },
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
624 '//event/pubsub/notify')
178
07114105885a Send last published item on subscription if node is so configured.
Ralph Meijer <ralphm@ik.nu>
parents: 174
diff changeset
625
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
626 config = node.getConfiguration()
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
627 sendLastPublished = config.get('pubsub#send_last_published_item',
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
628 'never')
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
629 if sendLastPublished == 'on_sub' and node.nodeType == 'leaf':
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
630 entity = subscription.subscriber.userhostJID()
355
c72fcbdcdab7 backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents: 354
diff changeset
631 d = self.getItemsData(node.nodeIdentifier, entity, recipient, maxItems=1, ext_data={'pep': pep})
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
632 d.addCallback(notifyItem)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
633 d.addErrback(log.err)
178
07114105885a Send last published item on subscription if node is so configured.
Ralph Meijer <ralphm@ik.nu>
parents: 174
diff changeset
634
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
635 return subscription
178
07114105885a Send last published item on subscription if node is so configured.
Ralph Meijer <ralphm@ik.nu>
parents: 174
diff changeset
636
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
637 def unsubscribe(self, nodeIdentifier, subscriber, requestor, pep, recipient):
216
53d2c0019458 Fix subscription and unsubscription JID checks.
Ralph Meijer <ralphm@ik.nu>
parents: 211
diff changeset
638 if subscriber.userhostJID() != requestor.userhostJID():
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
639 return defer.fail(error.Forbidden())
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
640
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
641 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
642 d.addCallback(lambda node: node.removeSubscription(subscriber))
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
643 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
644
357
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
645 def getSubscriptions(self, requestor, nodeIdentifier, pep, recipient):
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
646 """retrieve subscriptions of an entity
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
647
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
648 @param requestor(jid.JID): entity who want to check subscriptions
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
649 @param nodeIdentifier(unicode, None): identifier of the node
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
650 node to get all subscriptions of a service
364
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
651 @param pep(bool): True if it's a PEP request
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
652 @param recipient(jid.JID, None): recipient of the PEP request
357
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
653 """
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
654 return self.storage.getSubscriptions(requestor, nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
655
228
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
656 def supportsAutoCreate(self):
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
657 return True
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
658
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
659 def supportsInstantNodes(self):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
660 return True
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
661
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
662 def createNode(self, nodeIdentifier, requestor, options=None, pep=False, recipient=None):
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
663 if not nodeIdentifier:
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
664 nodeIdentifier = 'generic/%s' % uuid.uuid4()
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
665
259
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
666 if not options:
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
667 options = {}
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
668
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
669 nodeType = 'leaf'
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
670 config = self.storage.getDefaultConfiguration(nodeType)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
671 config['pubsub#node_type'] = nodeType
259
6fe7da6b4b32 node "roster" access model management
Goffi <goffi@goffi.org>
parents: 258
diff changeset
672 config.update(options)
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
673
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
674 # TODO: handle schema on creation
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
675 d = self.storage.createNode(nodeIdentifier, requestor, config, None, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
676 d.addCallback(lambda _: nodeIdentifier)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
677 return d
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
678
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
679 def getDefaultConfiguration(self, nodeType):
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
680 d = defer.succeed(self.storage.getDefaultConfiguration(nodeType))
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
681 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
682
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
683 def getNodeConfiguration(self, nodeIdentifier, pep, recipient):
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
684 if not nodeIdentifier:
196
00a6dbfbee42 Return deferreds on failure, instead of raising exceptions.
Ralph Meijer <ralphm@ik.nu>
parents: 183
diff changeset
685 return defer.fail(error.NoRootNode())
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
686
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
687 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
688 d.addCallback(lambda node: node.getConfiguration())
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
689
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
690 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
691
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
692 def setNodeConfiguration(self, nodeIdentifier, options, requestor, pep, recipient):
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
693 if not nodeIdentifier:
196
00a6dbfbee42 Return deferreds on failure, instead of raising exceptions.
Ralph Meijer <ralphm@ik.nu>
parents: 183
diff changeset
694 return defer.fail(error.NoRootNode())
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
695
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
696 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
697 d.addCallback(_getAffiliation, requestor)
422
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
698 d.addCallback(
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
699 lambda result: defer.ensureDeferred(
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
700 self._doSetNodeConfiguration(result, requestor, options))
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
701 )
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
702 return d
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
703
422
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
704 async def _doSetNodeConfiguration(self, result, requestor, options):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
705 node, affiliation = result
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
706
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
707 if affiliation != 'owner' and not self.isAdmin(requestor):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
708 raise error.Forbidden()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
709
422
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
710 max_items = options.get(const.OPT_MAX_ITEMS, '').strip().lower()
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
711 if not max_items:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
712 pass
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
713 elif max_items == 'max':
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
714 # FIXME: we use "0" for max for now, but as "0" may be used as legal value
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
715 # in XEP-0060 ("max" is used otherwise), we should use "None" instead.
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
716 # This require a schema update, as NULL is not allowed at the moment
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
717 options.fields[const.OPT_MAX_ITEMS].value = "0"
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
718 else:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
719 # max_items is a number, we have to check that it's not bigger than the
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
720 # total number of items on this node
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
721 try:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
722 max_items = int(max_items)
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
723 except ValueError:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
724 raise error.InvalidConfigurationValue('Invalid "max_items" value')
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
725 else:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
726 options.fields[const.OPT_MAX_ITEMS].value = str(max_items)
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
727 if max_items:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
728 items_count = await node.getItemsCount(None, True)
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
729 if max_items < items_count:
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
730 raise error.ConstraintFailed(
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
731 "\"max_items\" can't be set to a value lower than the total "
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
732 "number of items on this node. Please increase \"max_items\" "
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
733 "or delete items from this node")
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
734
c21f31355ab9 configuration: "max_items" option:
Goffi <goffi@goffi.org>
parents: 419
diff changeset
735 return await node.setConfiguration(options)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
736
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
737 def getNodeSchema(self, nodeIdentifier, pep, recipient):
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
738 if not nodeIdentifier:
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
739 return defer.fail(error.NoRootNode())
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
740
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
741 d = self.storage.getNode(nodeIdentifier, pep, recipient)
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
742 d.addCallback(lambda node: node.getSchema())
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
743
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
744 return d
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
745
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
746 def setNodeSchema(self, nodeIdentifier, schema, requestor, pep, recipient):
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
747 """set or remove Schema of a node
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
748
430
5a0ada3b61ca Full-Text Search implementation:
Goffi <goffi@goffi.org>
parents: 422
diff changeset
749 @param nodeIdentifier(unicode): identifier of the pubsub node
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
750 @param schema(domish.Element, None): schema to set
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
751 None to remove schema
364
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
752 @param requestor(jid.JID): entity doing the request
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
753 @param pep(bool): True if it's a PEP request
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
754 @param recipient(jid.JID, None): recipient of the PEP request
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
755 """
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
756 if not nodeIdentifier:
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
757 return defer.fail(error.NoRootNode())
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
758
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
759 d = self.storage.getNode(nodeIdentifier, pep, recipient)
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
760 d.addCallback(_getAffiliation, requestor)
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
761 d.addCallback(self._doSetNodeSchema, requestor, schema)
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
762 return d
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
763
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
764 def _doSetNodeSchema(self, result, requestor, schema):
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
765 node, affiliation = result
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
766
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
767 if affiliation != 'owner' and not self.isAdmin(requestor):
352
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
768 raise error.Forbidden()
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
769
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
770 return node.setSchema(schema)
efbdca10f0fb schema: node schema implementation
Goffi <goffi@goffi.org>
parents: 349
diff changeset
771
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
772 def getAffiliations(self, entity, nodeIdentifier, pep, recipient):
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
773 return self.storage.getAffiliations(entity, nodeIdentifier, pep, recipient)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
774
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
775 def getAffiliationsOwner(self, nodeIdentifier, requestor, pep, recipient):
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
776 d = self.storage.getNode(nodeIdentifier, pep, recipient)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
777 d.addCallback(_getAffiliation, requestor)
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
778 d.addCallback(self._doGetAffiliationsOwner, requestor)
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
779 return d
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
780
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
781 def _doGetAffiliationsOwner(self, result, requestor):
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
782 node, affiliation = result
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
783
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
784 if affiliation != 'owner' and not self.isAdmin(requestor):
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
785 raise error.Forbidden()
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
786 return node.getAffiliations()
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
787
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
788 def setAffiliationsOwner(self, nodeIdentifier, requestor, affiliations, pep, recipient):
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
789 d = self.storage.getNode(nodeIdentifier, pep, recipient)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
790 d.addCallback(_getAffiliation, requestor)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
791 d.addCallback(self._doSetAffiliationsOwner, requestor, affiliations)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
792 return d
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
793
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
794 def _doSetAffiliationsOwner(self, result, requestor, affiliations):
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
795 # Check that requestor is allowed to set affiliations, and delete entities
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
796 # with "none" affiliation
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
797
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
798 # TODO: return error with failed affiliations in case of failure
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
799 node, requestor_affiliation = result
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
800
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
801 if requestor_affiliation != 'owner' and not self.isAdmin(requestor):
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
802 raise error.Forbidden()
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
803
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
804 # we don't allow requestor to change its own affiliation
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
805 requestor_bare = requestor.userhostJID()
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
806 if requestor_bare in affiliations and affiliations[requestor_bare] != 'owner':
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
807 # FIXME: it may be interesting to allow the owner to ask for ownership removal
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
808 # if at least one other entity is owner for this node
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
809 raise error.Forbidden("You can't change your own affiliation")
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
810
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
811 to_delete = [jid_ for jid_, affiliation in affiliations.items() if affiliation == 'none']
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
812 for jid_ in to_delete:
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
813 del affiliations[jid_]
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
814
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
815 if to_delete:
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
816 d = node.deleteAffiliations(to_delete)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
817 if affiliations:
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
818 d.addCallback(lambda dummy: node.setAffiliations(affiliations))
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
819 else:
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
820 d = node.setAffiliations(affiliations)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
821
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
822 return d
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
823
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
824 def getSubscriptionsOwner(self, nodeIdentifier, requestor, pep, recipient):
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
825 d = self.storage.getNode(nodeIdentifier, pep, recipient)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
826 d.addCallback(_getAffiliation, requestor)
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
827 d.addCallback(self._doGetSubscriptionsOwner, requestor)
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
828 return d
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
829
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
830 def _doGetSubscriptionsOwner(self, result, requestor):
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
831 node, affiliation = result
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
832
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
833 if affiliation != 'owner' and not self.isAdmin(requestor):
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
834 raise error.Forbidden()
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
835 return node.getSubscriptions()
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
836
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
837 def setSubscriptionsOwner(self, nodeIdentifier, requestor, subscriptions, pep, recipient):
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
838 d = self.storage.getNode(nodeIdentifier, pep, recipient)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
839 d.addCallback(_getAffiliation, requestor)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
840 d.addCallback(self._doSetSubscriptionsOwner, requestor, subscriptions)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
841 return d
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
842
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
843 def unwrapFirstError(self, failure):
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
844 failure.trap(defer.FirstError)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
845 return failure.value.subFailure
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
846
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
847 def _doSetSubscriptionsOwner(self, result, requestor, subscriptions):
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
848 # Check that requestor is allowed to set subscriptions, and delete entities
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
849 # with "none" subscription
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
850
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
851 # TODO: return error with failed subscriptions in case of failure
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
852 node, requestor_affiliation = result
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
853
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
854 if requestor_affiliation != 'owner' and not self.isAdmin(requestor):
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
855 raise error.Forbidden()
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
856
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
857 d_list = []
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
858
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
859 for subscription in subscriptions.copy():
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
860 if subscription.state == 'none':
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
861 subscriptions.remove(subscription)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
862 d_list.append(node.removeSubscription(subscription.subscriber))
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
863
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
864 if subscriptions:
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
865 d_list.append(node.setSubscriptions(subscriptions))
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
866
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
867 d = defer.gatherResults(d_list, consumeErrors=True)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
868 d.addCallback(lambda _: None)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
869 d.addErrback(self.unwrapFirstError)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
870 return d
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
871
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
872 def filterItemsWithSchema(self, items_data, schema, owner):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
873 """check schema restriction and remove fields/items if they don't comply
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
874
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
875 @param items_data(list[ItemData]): items to filter
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
876 items in this list will be modified
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
877 @param schema(domish.Element): node schema
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
878 @param owner(bool): True is requestor is a owner of the node
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
879 """
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
880 fields_to_remove = set()
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
881 for field_elt in schema.elements(data_form.NS_X_DATA, 'field'):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
882 for restrict_elt in field_elt.elements(const.NS_SCHEMA_RESTRICT, 'restrict'):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
883 read_restriction = restrict_elt.attributes.get('read')
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
884 if read_restriction is not None:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
885 if read_restriction == 'owner':
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
886 if not owner:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
887 fields_to_remove.add(field_elt['var'])
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
888 else:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
889 raise StanzaError('feature-not-implemented', text='unknown read restriction {}'.format(read_restriction))
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
890 items_to_remove = []
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
891 for idx, item_data in enumerate(items_data):
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
892 item_elt = item_data.item
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
893 try:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
894 x_elt = next(item_elt.elements(data_form.NS_X_DATA, 'x'))
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
895 except StopIteration:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
896 log.msg("WARNING, item {id} has a schema but no form, ignoring it")
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
897 items_to_remove.append(item_data)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
898 continue
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
899 form = data_form.Form.fromElement(x_elt)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
900 # we remove fields which are not visible for this user
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
901 for field in fields_to_remove:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
902 try:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
903 form.removeField(form.fields[field])
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
904 except KeyError:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
905 continue
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
906 item_elt.children.remove(x_elt)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
907 item_elt.addChild(form.toElement())
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
908
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
909 for item_data in items_to_remove:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
910 items_data.remove(item_data)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
911
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
912 def checkPresenceSubscription(self, node, requestor):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
913 """check if requestor has presence subscription from node owner
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
914
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
915 @param node(Node): node to check
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
916 @param requestor(jid.JID): entity who want to access node
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
917 """
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
918 def gotRoster(roster):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
919 if roster is None:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
920 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
921
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
922 if requestor not in roster:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
923 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
924
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
925 if not roster[requestor].subscriptionFrom:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
926 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
927
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
928 d = self.getOwnerRoster(node)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
929 d.addCallback(gotRoster)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
930 return d
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
931
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
932 @defer.inlineCallbacks
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
933 def checkRosterGroups(self, node, requestor):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
934 """check if requestor is in allowed groups of a node
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
935
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
936 @param node(Node): node to check
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
937 @param requestor(jid.JID): entity who want to access node
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
938 """
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
939 roster = yield self.getOwnerRoster(node)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
940
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
941 if roster is None:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
942 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
943
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
944 if requestor not in roster:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
945 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
946
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
947 authorized_groups = yield node.getAuthorizedGroups()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
948
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
949 if not roster[requestor].groups.intersection(authorized_groups):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
950 # requestor is in roster but not in one of the allowed groups
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
951 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
952
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
953 def checkNodeAffiliations(self, node, requestor):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
954 """check if requestor is in white list of a node
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
955
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
956 @param node(Node): node to check
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
957 @param requestor(jid.JID): entity who want to access node
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
958 """
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
959 def gotAffiliations(affiliations):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
960 try:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
961 affiliation = affiliations[requestor.userhostJID()]
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
962 except KeyError:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
963 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
964 else:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
965 if affiliation not in ('owner', 'publisher', 'member'):
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
966 raise error.Forbidden()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
967
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
968 d = node.getAffiliations()
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
969 d.addCallback(gotAffiliations)
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
970 return d
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
971
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
972 @defer.inlineCallbacks
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
973 def checkNodeAccess(self, node, requestor):
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
974 """check if a requestor can access data of a node
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
975
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
976 @param node(Node): node to check
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
977 @param requestor(jid.JID): entity who want to access node
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
978 @return (tuple): permissions data with:
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
979 - owner(bool): True if requestor is owner of the node
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
980 - roster(None, ): roster of the requestor
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
981 None if not needed/available
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
982 - access_model(str): access model of the node
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
983 @raise error.Forbidden: access is not granted
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
984 @raise error.NotLeafNodeError: this node is not a leaf
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
985 """
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
986 node, affiliation = yield _getAffiliation(node, requestor)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
987
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
988 if not iidavoll.ILeafNode.providedBy(node):
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
989 raise error.NotLeafNodeError()
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
990
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
991 if affiliation == 'outcast':
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
992 raise error.Forbidden()
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
993
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
994 # node access check
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
995 owner = affiliation == 'owner'
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
996 access_model = node.getAccessModel()
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
997 roster = None
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
998
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
999 if access_model == const.VAL_AMODEL_OPEN or owner:
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1000 pass
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1001 elif access_model == const.VAL_AMODEL_PRESENCE:
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1002 yield self.checkPresenceSubscription(node, requestor)
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1003 elif access_model == const.VAL_AMODEL_PUBLISHER_ROSTER:
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1004 # FIXME: for node, access should be renamed owner-roster, not publisher
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1005 yield self.checkRosterGroups(node, requestor)
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1006 elif access_model == const.VAL_AMODEL_WHITELIST:
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1007 yield self.checkNodeAffiliations(node, requestor)
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1008 else:
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1009 raise Exception("Unknown access_model")
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1010
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1011 defer.returnValue((affiliation, owner, roster, access_model))
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1012
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1013 @defer.inlineCallbacks
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1014 def getItemsIds(self, nodeIdentifier, requestor, authorized_groups, unrestricted, maxItems=None, ext_data=None, pep=False, recipient=None):
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1015 # FIXME: items access model are not checked
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1016 # TODO: check items access model
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1017 node = yield self.storage.getNode(nodeIdentifier, pep, recipient)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1018 affiliation, owner, roster, access_model = yield self.checkNodeAccess(node, requestor)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1019 ids = yield node.getItemsIds(authorized_groups,
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1020 unrestricted,
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1021 maxItems,
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1022 ext_data)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1023 defer.returnValue(ids)
346
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1024
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1025 def getItems(self, nodeIdentifier, requestor, recipient, maxItems=None,
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1026 itemIdentifiers=None, ext_data=None):
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1027 d = self.getItemsData(nodeIdentifier, requestor, recipient, maxItems, itemIdentifiers, ext_data)
320
29c2553ef863 added getItemsData to get list of ItemData instead of only the list of domish.Element
Goffi <goffi@goffi.org>
parents: 318
diff changeset
1028 d.addCallback(lambda items_data: [item_data.item for item_data in items_data])
29c2553ef863 added getItemsData to get list of ItemData instead of only the list of domish.Element
Goffi <goffi@goffi.org>
parents: 318
diff changeset
1029 return d
29c2553ef863 added getItemsData to get list of ItemData instead of only the list of domish.Element
Goffi <goffi@goffi.org>
parents: 318
diff changeset
1030
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1031 @defer.inlineCallbacks
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1032 def getOwnerRoster(self, node, owners=None):
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1033 # FIXME: roster of publisher, not owner, must be used
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1034 if owners is None:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1035 owners = yield node.getOwners()
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1036
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1037 if len(owners) != 1:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1038 log.msg('publisher-roster access is not allowed with more than 1 owner')
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1039 return
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1040
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1041 owner_jid = owners[0]
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1042
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1043 try:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1044 roster = yield self.privilege.getRoster(owner_jid)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1045 except Exception as e:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1046 log.msg("Error while getting roster of {owner_jid}: {msg}".format(
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1047 owner_jid = owner_jid.full(),
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1048 msg = e))
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1049 return
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1050 defer.returnValue(roster)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1051
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1052 @defer.inlineCallbacks
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1053 def getItemsData(self, nodeIdentifier, requestor, recipient, maxItems=None,
320
29c2553ef863 added getItemsData to get list of ItemData instead of only the list of domish.Element
Goffi <goffi@goffi.org>
parents: 318
diff changeset
1054 itemIdentifiers=None, ext_data=None):
29c2553ef863 added getItemsData to get list of ItemData instead of only the list of domish.Element
Goffi <goffi@goffi.org>
parents: 318
diff changeset
1055 """like getItems but return the whole ItemData"""
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1056 if maxItems == 0:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1057 log.msg("WARNING: maxItems=0 on items retrieval")
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1058 defer.returnValue([])
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1059
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1060 if ext_data is None:
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1061 ext_data = {}
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1062 node = yield self.storage.getNode(nodeIdentifier, ext_data.get('pep', False), recipient)
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1063 try:
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1064 affiliation, owner, roster, access_model = yield self.checkNodeAccess(node, requestor)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1065 except error.NotLeafNodeError:
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1066 defer.returnValue([])
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1067
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1068 # at this point node access is checked
243
42048e37699e added experimental roster access_model (use remote_roster)
Goffi <goffi@goffi.org>
parents: 240
diff changeset
1069
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1070 if owner:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1071 # requestor_groups is only used in restricted access
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1072 requestor_groups = None
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1073 else:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1074 if roster is None:
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1075 # FIXME: publisher roster should be used, not owner
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1076 roster = yield self.getOwnerRoster(node)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1077 if roster is None:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1078 roster = {}
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1079 roster_item = roster.get(requestor.userhostJID())
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1080 requestor_groups = tuple(roster_item.groups) if roster_item else tuple()
285
a87c155d0fd5 replaced former roster dirty hack by a XEP-0356 first draft implementation, only roster get is implemented so far
Goffi <goffi@goffi.org>
parents: 283
diff changeset
1081
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1082 if itemIdentifiers:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1083 items_data = yield node.getItemsById(requestor_groups, owner, itemIdentifiers)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1084 else:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1085 items_data = yield node.getItems(requestor_groups, owner, maxItems, ext_data)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1086
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1087 if owner:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1088 # Add item config data form to items with roster access model
302
b8b25efae0bc fixed item_data issues after introduction of ItemData namedtuple
Goffi <goffi@goffi.org>
parents: 301
diff changeset
1089 for item_data in items_data:
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1090 if item_data.access_model == const.VAL_AMODEL_OPEN:
252
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1091 pass
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1092 elif item_data.access_model == const.VAL_AMODEL_PUBLISHER_ROSTER:
252
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1093 form = data_form.Form('submit', formNamespace=const.NS_ITEM_CONFIG)
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1094 access = data_form.Field(None, const.OPT_ACCESS_MODEL, value=const.VAL_AMODEL_PUBLISHER_ROSTER)
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1095 allowed = data_form.Field(None, const.OPT_ROSTER_GROUPS_ALLOWED, values=item_data.config[const.OPT_ROSTER_GROUPS_ALLOWED])
252
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1096 form.addField(access)
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1097 form.addField(allowed)
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1098 item_data.item.addChild(form.toElement())
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1099 elif access_model == const.VAL_AMODEL_WHITELIST:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1100 #FIXME
252
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1101 raise NotImplementedError
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1102 else:
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1103 raise error.BadAccessTypeError(access_model)
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1104
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1105 schema = node.getSchema()
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1106 if schema is not None:
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1107 self.filterItemsWithSchema(items_data, schema, owner)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1108
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1109 yield self._items_rsm(items_data, node, requestor_groups, owner, itemIdentifiers, ext_data)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1110 defer.returnValue(items_data)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1111
315
720d73e30bf7 backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents: 314
diff changeset
1112 def _setCount(self, value, response):
720d73e30bf7 backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents: 314
diff changeset
1113 response.count = value
720d73e30bf7 backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents: 314
diff changeset
1114
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1115 def _setIndex(self, value, response, adjust):
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1116 """Set index in RSM response
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1117
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1118 @param value(int): value of the reference index (i.e. before or after item)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1119 @param response(RSMResponse): response instance to fill
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1120 @param adjust(int): adjustement term (i.e. difference between reference index and first item of the result)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1121 """
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1122 response.index = value + adjust
315
720d73e30bf7 backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents: 314
diff changeset
1123
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1124 def _items_rsm(self, items_data, node, authorized_groups, owner,
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1125 itemIdentifiers, ext_data):
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1126 # FIXME: move this to a separate module
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1127 # TODO: Index can be optimized by keeping a cache of the last RSM request
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1128 # An other optimisation would be to look for index first and use it as offset
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1129 try:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1130 rsm_request = ext_data['rsm']
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1131 except KeyError:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1132 # No RSM in this request, nothing to do
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1133 return items_data
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1134
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1135 if itemIdentifiers:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1136 log.msg("WARNING, itemIdentifiers used with RSM, ignoring the RSM part")
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1137 return items_data
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1138
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1139 response = rsm.RSMResponse()
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1140
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1141 d_count = node.getItemsCount(authorized_groups, owner, ext_data)
315
720d73e30bf7 backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents: 314
diff changeset
1142 d_count.addCallback(self._setCount, response)
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1143 d_list = [d_count]
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1144
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1145 if items_data:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1146 response.first = items_data[0].item['id']
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1147 response.last = items_data[-1].item['id']
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1148
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1149 # index handling
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1150 if rsm_request.index is not None:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1151 response.index = rsm_request.index
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1152 elif rsm_request.before:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1153 # The last page case (before == '') is managed in render method
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1154 d_index = node.getItemsIndex(rsm_request.before, authorized_groups, owner, ext_data)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1155 d_index.addCallback(self._setIndex, response, -len(items_data))
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1156 d_list.append(d_index)
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1157 elif rsm_request.after is not None:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1158 d_index = node.getItemsIndex(rsm_request.after, authorized_groups, owner, ext_data)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1159 d_index.addCallback(self._setIndex, response, 1)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1160 d_list.append(d_index)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1161 else:
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1162 # the first page was requested
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1163 response.index = 0
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1164
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1165 def render(result):
318
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1166 if rsm_request.before == '':
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1167 # the last page was requested
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1168 response.index = response.count - len(items_data)
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1169 items_data.append(container.ItemData(response.toElement()))
d13526c0eb32 RSM improvments/refactoring:
Goffi <goffi@goffi.org>
parents: 317
diff changeset
1170 return items_data
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1171
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1172 return defer.DeferredList(d_list).addCallback(render)
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1173
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1174 def retractItem(self, nodeIdentifier, itemIdentifiers, requestor, notify, pep, recipient):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1175 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1176 d.addCallback(_getAffiliation, requestor)
309
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1177 d.addCallback(self._doRetract, itemIdentifiers, requestor, notify, pep, recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1178 return d
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1179
309
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1180 def _doRetract(self, result, itemIdentifiers, requestor, notify, pep, recipient):
263
9dfd3890e646 added the constant FLAG_RETRACT_ALLOW_PUBLISHER to allow a publisher to retract an item he has published in a node of "open" publish model.
souliane <souliane@mailoo.org>
parents: 261
diff changeset
1181 node, affiliation = result
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1182 persistItems = node.getConfiguration()[const.OPT_PERSIST_ITEMS]
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1183
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1184 if not persistItems:
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1185 raise error.NodeNotPersistent()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1186
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1187 # we need to get the items before removing them, for the notifications
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1188
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1189 def removeItems(items_data):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1190 """Remove the items and keep only actually removed ones in items_data"""
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1191 d = node.removeItems(itemIdentifiers)
301
05c875a13a62 categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents: 300
diff changeset
1192 d.addCallback(lambda removed: [item_data for item_data in items_data if item_data.item["id"] in removed])
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1193 return d
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1194
309
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1195 def checkPublishers(publishers_map):
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1196 """Called when requestor is neither owner neither publisher of the Node
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1197
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1198 We check that requestor is publisher of all the items he wants to retract
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1199 and raise error.Forbidden if it is not the case
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1200 """
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1201 # TODO: the behaviour should be configurable (per node ?)
388
1c13ba86a421 backend: allow admins to retract any item
Goffi <goffi@goffi.org>
parents: 387
diff changeset
1202 if (any((requestor.userhostJID() != publisher.userhostJID()
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1203 for publisher in publishers_map.values()))
388
1c13ba86a421 backend: allow admins to retract any item
Goffi <goffi@goffi.org>
parents: 387
diff changeset
1204 and not self.isAdmin(requestor)
1c13ba86a421 backend: allow admins to retract any item
Goffi <goffi@goffi.org>
parents: 387
diff changeset
1205 ):
309
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1206 raise error.Forbidden()
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1207
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1208 if affiliation in ['owner', 'publisher']:
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1209 # the requestor is owner or publisher of the node
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1210 # he can retract what he wants
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1211 d = defer.succeed(None)
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1212 else:
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1213 # the requestor doesn't have right to retract on the whole node
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1214 # we check if he is a publisher for all items he wants to retract
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1215 # and forbid the retraction else.
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1216 d = node.getItemsPublishers(itemIdentifiers)
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1217 d.addCallback(checkPublishers)
890b24b37b56 Re-implemented feature which allows an entity to retract an item from somebody else node (i.e. a node from which he is neither owner or publisher) if he is the publisher of the item.
Goffi <goffi@goffi.org>
parents: 308
diff changeset
1218 d.addCallback(lambda dummy: node.getItemsById(None, True, itemIdentifiers))
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1219 d.addCallback(removeItems)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1220
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1221 if notify:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1222 d.addCallback(self._doNotifyRetraction, node, pep, recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1223 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1224
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1225 def _doNotifyRetraction(self, items_data, node, pep, recipient):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1226 self.dispatch({'items_data': items_data,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1227 'node': node,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1228 'pep': pep,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1229 'recipient': recipient},
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1230 '//event/pubsub/retract')
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1231
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1232 def purgeNode(self, nodeIdentifier, requestor, pep, recipient):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1233 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1234 d.addCallback(_getAffiliation, requestor)
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
1235 d.addCallback(self._doPurge, requestor)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1236 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1237
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
1238 def _doPurge(self, result, requestor):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1239 node, affiliation = result
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1240 persistItems = node.getConfiguration()[const.OPT_PERSIST_ITEMS]
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1241
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
1242 if affiliation != 'owner' and not self.isAdmin(requestor):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1243 raise error.Forbidden()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1244
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1245 if not persistItems:
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1246 raise error.NodeNotPersistent()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1247
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1248 d = node.purge()
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1249 d.addCallback(self._doNotifyPurge, node.nodeIdentifier)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1250 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1251
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1252 def _doNotifyPurge(self, result, nodeIdentifier):
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1253 self.dispatch(nodeIdentifier, '//event/pubsub/purge')
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1254
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1255 def registerPreDelete(self, preDeleteFn):
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1256 self._callbackList.append(preDeleteFn)
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1257
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1258 def getSubscribers(self, nodeIdentifier, pep, recipient):
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1259 def cb(subscriptions):
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1260 return [subscription.subscriber for subscription in subscriptions]
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1261
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1262 d = self.storage.getNode(nodeIdentifier, pep, recipient)
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1263 d.addCallback(lambda node: node.getSubscriptions('subscribed'))
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1264 d.addCallback(cb)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1265 return d
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1266
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1267 def deleteNode(self, nodeIdentifier, requestor, pep, recipient, redirectURI=None):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1268 d = self.storage.getNode(nodeIdentifier, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1269 d.addCallback(_getAffiliation, requestor)
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
1270 d.addCallback(self._doPreDelete, requestor, redirectURI, pep, recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1271 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1272
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
1273 def _doPreDelete(self, result, requestor, redirectURI, pep, recipient):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1274 node, affiliation = result
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1275
387
04e7dcc436ca backend: admins can delete node, change schema, change config or delete items even if they are not owner of a node
Goffi <goffi@goffi.org>
parents: 384
diff changeset
1276 if affiliation != 'owner' and not self.isAdmin(requestor):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1277 raise error.Forbidden()
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1278
261
65d4fed44edf fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents: 260
diff changeset
1279 data = {'node': node,
209
7f3ffb7a1a9e Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents: 206
diff changeset
1280 'redirectURI': redirectURI}
7f3ffb7a1a9e Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents: 206
diff changeset
1281
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1282 d = defer.DeferredList([cb(data, pep, recipient)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1283 for cb in self._callbackList],
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1284 consumeErrors=1)
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1285 d.addCallback(self._doDelete, node.nodeDbId)
59
0fa161c00ed9 Use jid.JIDs everywhere in the backend.
Ralph Meijer <ralphm@ik.nu>
parents: 53
diff changeset
1286
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1287 def _doDelete(self, result, nodeDbId):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1288 dl = []
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1289 for succeeded, r in result:
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1290 if succeeded and r:
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1291 dl.extend(r)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1292
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1293 d = self.storage.deleteNodeByDbId(nodeDbId)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1294 d.addCallback(self._doNotifyDelete, dl)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1295
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1296 return d
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1297
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1298 def _doNotifyDelete(self, result, dl):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1299 for d in dl:
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1300 d.callback(None)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1301
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1302
317
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
1303 class PubSubResourceFromBackend(pubsub.PubSubResource):
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1304 """
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1305 Adapts a backend to an xmpp publish-subscribe service.
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1306 """
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1307
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1308 features = [
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1309 "config-node",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1310 "create-nodes",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1311 "delete-any",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1312 "delete-nodes",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1313 "item-ids",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1314 "meta-data",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1315 "publish",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1316 "purge-nodes",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1317 "retract-items",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1318 "retrieve-affiliations",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1319 "retrieve-default",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1320 "retrieve-items",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1321 "retrieve-subscriptions",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1322 "subscribe",
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1323 ]
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1324
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1325 discoIdentity = disco.DiscoIdentity('pubsub',
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1326 'service',
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1327 'Salut à Toi pubsub service')
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1328
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1329 pubsubService = None
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1330
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1331 _errorMap = {
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1332 error.NodeNotFound: ('item-not-found', None, None),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1333 error.NodeExists: ('conflict', None, None),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1334 error.Forbidden: ('forbidden', None, None),
243
42048e37699e added experimental roster access_model (use remote_roster)
Goffi <goffi@goffi.org>
parents: 240
diff changeset
1335 error.NotAuthorized: ('not-authorized', None, None),
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1336 error.ItemNotFound: ('item-not-found', None, None),
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1337 error.ItemForbidden: ('bad-request', 'item-forbidden', None),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1338 error.ItemRequired: ('bad-request', 'item-required', None),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1339 error.NoInstantNodes: ('not-acceptable',
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1340 'unsupported',
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1341 'instant-nodes'),
171
bc269696ef42 Reply with the correct error condition on subscription when not subscribed.
Ralph Meijer <ralphm@ik.nu>
parents: 169
diff changeset
1342 error.NotSubscribed: ('unexpected-request', 'not-subscribed', None),
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1343 error.InvalidConfigurationOption: ('not-acceptable', None, None),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1344 error.InvalidConfigurationValue: ('not-acceptable', None, None),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1345 error.NodeNotPersistent: ('feature-not-implemented',
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1346 'unsupported',
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1347 'persistent-node'),
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1348 error.NoRootNode: ('bad-request', None, None),
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1349 error.NoCollections: ('feature-not-implemented',
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1350 'unsupported',
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1351 'collections'),
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1352 error.NoPublishing: ('feature-not-implemented',
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1353 'unsupported',
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1354 'publish'),
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1355 error.ConstraintFailed: ('conflict', 'precondition-not-met', None),
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1356 }
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1357
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1358 def __init__(self, backend):
317
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
1359 pubsub.PubSubResource.__init__(self)
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1360
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1361 self.backend = backend
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1362 self.hideNodes = False
153
753b8432460f Work towards JEP-0060 1.8
Ralph Meijer <ralphm@ik.nu>
parents: 108
diff changeset
1363
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1364 self.backend.registerPublishNotifier(self._notifyPublish)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1365 self.backend.registerRetractNotifier(self._notifyRetract)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1366 self.backend.registerPreDelete(self._preDelete)
285
a87c155d0fd5 replaced former roster dirty hack by a XEP-0356 first draft implementation, only roster get is implemented so far
Goffi <goffi@goffi.org>
parents: 283
diff changeset
1367
228
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1368 if self.backend.supportsAutoCreate():
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1369 self.features.append("auto-create")
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1370
363
a98b3d52c2ff added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents: 358
diff changeset
1371 if self.backend.supportsPublishOptions():
a98b3d52c2ff added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents: 358
diff changeset
1372 self.features.append("publish-options")
a98b3d52c2ff added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents: 358
diff changeset
1373
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1374 if self.backend.supportsInstantNodes():
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1375 self.features.append("instant-nodes")
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1376
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1377 if self.backend.supportsOutcastAffiliation():
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1378 self.features.append("outcast-affiliation")
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1379
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1380 if self.backend.supportsPersistentItems():
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1381 self.features.append("persistent-items")
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1382
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1383 if self.backend.supportsPublisherAffiliation():
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1384 self.features.append("publisher-affiliation")
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1385
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1386 if self.backend.supportsGroupBlog():
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1387 self.features.append("groupblog")
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1388
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1389 # XXX: this feature is not really described in XEP-0060, we just can see it in
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1390 # examples but it's necessary for microblogging comments (see XEP-0277)
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1391 if self.backend.supportsPublishModel():
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1392 self.features.append("publish_model")
260
f0cd02c032b3 publish model management
Goffi <goffi@goffi.org>
parents: 259
diff changeset
1393
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1394 def getFullItem(self, item_data):
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1395 """ Attach item configuration to this item
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1396
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1397 Used to give item configuration back to node's owner (and *only* to owner)
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1398 """
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1399 # TODO: a test should check that only the owner get the item configuration back
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1400
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1401 item, item_config = item_data.item, item_data.config
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1402 if item_config:
394
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
1403 new_item = elementCopy(item)
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1404 new_item.addChild(item_config.toElement())
394
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
1405 return new_item
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
1406 else:
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
1407 return item
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1408
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1409 @defer.inlineCallbacks
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1410 def _notifyPublish(self, data):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1411 items_data = data['items_data']
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1412 node = data['node']
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1413 pep = data['pep']
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1414 recipient = data['recipient']
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1415
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1416 owners, notifications_filtered = yield self._prepareNotify(items_data, node, data.get('subscription'), pep, recipient)
285
a87c155d0fd5 replaced former roster dirty hack by a XEP-0356 first draft implementation, only roster get is implemented so far
Goffi <goffi@goffi.org>
parents: 283
diff changeset
1417
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1418 # we notify the owners
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1419 # FIXME: check if this comply with XEP-0060 (option needed ?)
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1420 # TODO: item's access model have to be sent back to owner
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1421 # TODO: same thing for getItems
252
25a1dc7181cc full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents: 251
diff changeset
1422
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1423 for owner_jid in owners:
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1424 notifications_filtered.append(
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1425 (owner_jid,
364
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
1426 {pubsub.Subscription(node.nodeIdentifier,
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
1427 owner_jid,
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
1428 'subscribed')},
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1429 [self.getFullItem(item_data) for item_data in items_data]))
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1430
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1431 if pep:
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1432 defer.returnValue(self.backend.privilege.notifyPublish(
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1433 recipient,
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1434 node.nodeIdentifier,
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1435 notifications_filtered))
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1436
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1437 else:
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1438 defer.returnValue(self.pubsubService.notifyPublish(
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1439 self.serviceJID,
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1440 node.nodeIdentifier,
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1441 notifications_filtered))
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1442
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1443 def _notifyRetract(self, data):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1444 items_data = data['items_data']
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1445 node = data['node']
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1446 pep = data['pep']
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1447 recipient = data['recipient']
251
0a7d43b3dad6 owner is now notified of items published
Goffi <goffi@goffi.org>
parents: 250
diff changeset
1448
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1449 def afterPrepare(result):
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1450 owners, notifications_filtered = result
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1451 #we add the owners
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1452
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1453 for owner_jid in owners:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1454 notifications_filtered.append(
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1455 (owner_jid,
364
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
1456 {pubsub.Subscription(node.nodeIdentifier,
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
1457 owner_jid,
8bd8be6815ab completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents: 363
diff changeset
1458 'subscribed')},
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1459 [item_data.item for item_data in items_data]))
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1460
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1461 if pep:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1462 return self.backend.privilege.notifyRetract(
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1463 recipient,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1464 node.nodeIdentifier,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1465 notifications_filtered)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1466
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1467 else:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1468 return self.pubsubService.notifyRetract(
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1469 self.serviceJID,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1470 node.nodeIdentifier,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1471 notifications_filtered)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1472
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1473 d = self._prepareNotify(items_data, node, data.get('subscription'), pep, recipient)
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1474 d.addCallback(afterPrepare)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1475 return d
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1476
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1477 @defer.inlineCallbacks
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1478 def _prepareNotify(self, items_data, node, subscription=None, pep=None, recipient=None):
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1479 """Do a bunch of permissions check and filter notifications
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1480
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1481 The owner is not added to these notifications,
340
567e486bce24 backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents: 339
diff changeset
1482 it must be added by the calling method
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1483 @param items_data(tuple): must contain:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1484 - item (domish.Element)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1485 - access_model (unicode)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1486 - access_list (dict as returned getItemsById, or item_config)
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1487 @param node(LeafNode): node hosting the items
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1488 @param subscription(pubsub.Subscription, None): TODO
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1489
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1490 @return (tuple): will contain:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1491 - notifications_filtered
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1492 - node_owner_jid
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1493 - items_data
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1494 """
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1495 if subscription is None:
339
516b282aa542 backend (notifications): avoid useless database request in getNotifications
Goffi <goffi@goffi.org>
parents: 336
diff changeset
1496 notifications = yield self.backend.getNotifications(node, items_data)
178
07114105885a Send last published item on subscription if node is so configured.
Ralph Meijer <ralphm@ik.nu>
parents: 174
diff changeset
1497 else:
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1498 notifications = [(subscription.subscriber, [subscription], items_data)]
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1499
343
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1500 if pep and node.getConfiguration()[const.OPT_ACCESS_MODEL] in ('open', 'presence'):
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1501 # for PEP we need to manage automatic subscriptions (cf. XEP-0163 §4)
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1502 explicit_subscribers = {subscriber for subscriber, _, _ in notifications}
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1503 auto_subscribers = yield self.backend.privilege.getAutoSubscribers(recipient, node.nodeIdentifier, explicit_subscribers)
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1504 for sub_jid in auto_subscribers:
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1505 sub = pubsub.Subscription(node.nodeIdentifier, sub_jid, 'subscribed')
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1506 notifications.append((sub_jid, [sub], items_data))
ff8aff4c9b79 backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents: 341
diff changeset
1507
333
0fcd0ea89c84 fixed getOwners call in _prepareNotify
Goffi <goffi@goffi.org>
parents: 331
diff changeset
1508 owners = yield node.getOwners()
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1509 owner_roster = None
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1510
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1511 # now we check access of subscriber for each item, and keep only allowed ones
285
a87c155d0fd5 replaced former roster dirty hack by a XEP-0356 first draft implementation, only roster get is implemented so far
Goffi <goffi@goffi.org>
parents: 283
diff changeset
1512
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1513 #we filter items not allowed for the subscribers
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1514 notifications_filtered = []
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1515 schema = node.getSchema()
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1516
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1517 for subscriber, subscriptions, items_data in notifications:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1518 subscriber_bare = subscriber.userhostJID()
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1519 if subscriber_bare in owners:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1520 # as notification is always sent to owner,
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1521 # we ignore owner if he is here
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1522 continue
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1523 allowed_items = [] #we keep only item which subscriber can access
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1524
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1525 if schema is not None:
394
dc83b1d837cf backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents: 392
diff changeset
1526 # we have to copy items_data because different subscribers may receive
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1527 # different items (e.g. read restriction in schema)
397
a4980d03b3a3 backend: fixed items data copy on notification
Goffi <goffi@goffi.org>
parents: 396
diff changeset
1528 items_data = [itemDataCopy(item_data) for item_data in items_data]
353
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1529 self.backend.filterItemsWithSchema(items_data, schema, False)
7c5d85c6fb3a backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents: 352
diff changeset
1530
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1531 for item_data in items_data:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1532 item, access_model = item_data.item, item_data.access_model
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1533 access_list = item_data.config
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1534 if access_model == const.VAL_AMODEL_OPEN:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1535 allowed_items.append(item)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1536 elif access_model == const.VAL_AMODEL_PUBLISHER_ROSTER:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1537 if owner_roster is None:
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1538 # FIXME: publisher roster should be used, not owner
396
562e7a01218d backend: fixed getOwnerRoster call in _prepareNotify
Goffi <goffi@goffi.org>
parents: 395
diff changeset
1539 owner_roster= yield self.backend.getOwnerRoster(node, owners)
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1540 if owner_roster is None:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1541 owner_roster = {}
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1542 if not subscriber_bare in owner_roster:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1543 continue
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1544 #the subscriber is known, is he in the right group ?
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1545 authorized_groups = access_list[const.OPT_ROSTER_GROUPS_ALLOWED]
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1546 if owner_roster[subscriber_bare].groups.intersection(authorized_groups):
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1547 allowed_items.append(item)
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1548 else: #unknown access_model
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1549 # TODO: white list access
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1550 raise NotImplementedError
251
0a7d43b3dad6 owner is now notified of items published
Goffi <goffi@goffi.org>
parents: 250
diff changeset
1551
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1552 if allowed_items:
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1553 notifications_filtered.append((subscriber, subscriptions, allowed_items))
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1554
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1555 defer.returnValue((owners, notifications_filtered))
250
eb14b8d30cba fine tuning per-item permissions
Goffi <goffi@goffi.org>
parents: 248
diff changeset
1556
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1557 def _preDelete(self, data, pep, recipient):
261
65d4fed44edf fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents: 260
diff changeset
1558 nodeIdentifier = data['node'].nodeIdentifier
209
7f3ffb7a1a9e Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents: 206
diff changeset
1559 redirectURI = data.get('redirectURI', None)
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1560 d = self.backend.getSubscribers(nodeIdentifier, pep, recipient)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1561 d.addCallback(lambda subscribers: self.pubsubService.notifyDelete(
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1562 self.serviceJID,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1563 nodeIdentifier,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1564 subscribers,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1565 redirectURI))
174
79d451d186b1 Send out node deletion notifications.
Ralph Meijer <ralphm@ik.nu>
parents: 172
diff changeset
1566 return d
79d451d186b1 Send out node deletion notifications.
Ralph Meijer <ralphm@ik.nu>
parents: 172
diff changeset
1567
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1568 def _mapErrors(self, failure):
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1569 e = failure.trap(*list(self._errorMap.keys()))
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1570
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1571 condition, pubsubCondition, feature = self._errorMap[e]
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1572 msg = failure.value.msg
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1573
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1574 if pubsubCondition:
317
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
1575 exc = pubsub.PubSubError(condition, pubsubCondition, feature, msg)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1576 else:
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1577 exc = StanzaError(condition, text=msg)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1578
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1579 raise exc
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1580
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1581 def getInfo(self, requestor, service, nodeIdentifier, pep=None, recipient=None):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1582 return [] # FIXME: disabled for now, need to manage PEP
288
073161f6f143 namespace delegation: disco nesting management
Goffi <goffi@goffi.org>
parents: 285
diff changeset
1583 if not requestor.resource:
073161f6f143 namespace delegation: disco nesting management
Goffi <goffi@goffi.org>
parents: 285
diff changeset
1584 # this avoid error when getting a disco request from server during namespace delegation
073161f6f143 namespace delegation: disco nesting management
Goffi <goffi@goffi.org>
parents: 285
diff changeset
1585 return []
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1586 info = {}
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1587
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1588 def saveType(result):
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1589 info['type'] = result
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1590 return nodeIdentifier
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1591
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1592 def saveMetaData(result):
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1593 info['meta-data'] = result
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1594 return info
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1595
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1596 def trapNotFound(failure):
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1597 failure.trap(error.NodeNotFound)
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1598 return info
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1599
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1600 d = defer.succeed(nodeIdentifier)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1601 d.addCallback(self.backend.getNodeType)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1602 d.addCallback(saveType)
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1603 d.addCallback(self.backend.getNodeMetaData)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1604 d.addCallback(saveMetaData)
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1605 d.addErrback(trapNotFound)
172
9bfb00edd0cc Fix Backend's getNodeInfo so that it properly adds its errback.
Ralph Meijer <ralphm@ik.nu>
parents: 171
diff changeset
1606 d.addErrback(self._mapErrors)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1607 return d
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1608
346
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1609 def getNodes(self, requestor, service, nodeIdentifier):
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1610 """return nodes for disco#items
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1611
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1612 Pubsub/PEP nodes will be returned if disco node is not specified
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1613 else Pubsub/PEP items will be returned
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1614 (according to what requestor can access)
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1615 """
346
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1616 try:
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1617 pep = service.pep
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1618 except AttributeError:
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1619 pep = False
198
e404775b12df Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents: 196
diff changeset
1620
169
96afb248df5e Fix typos in service creation. Make disco not respond when a resource is provided.
Ralph Meijer <ralphm@ik.nu>
parents: 168
diff changeset
1621 if service.resource:
96afb248df5e Fix typos in service creation. Make disco not respond when a resource is provided.
Ralph Meijer <ralphm@ik.nu>
parents: 168
diff changeset
1622 return defer.succeed([])
346
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1623
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1624 if nodeIdentifier:
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1625 d = self.backend.getItemsIds(nodeIdentifier,
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1626 requestor,
346
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1627 [],
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1628 requestor.userhostJID() == service,
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1629 None,
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1630 None,
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1631 pep,
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1632 service)
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1633 # items must be set as name, not node
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1634 d.addCallback(lambda items: [(None, item) for item in items])
346
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1635
3bbab2173ebc implemented disco items:
Goffi <goffi@goffi.org>
parents: 343
diff changeset
1636 else:
349
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1637 d = self.backend.getNodes(requestor.userhostJID(),
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1638 pep,
20b82fb8de02 backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents: 346
diff changeset
1639 service)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1640 return d.addErrback(self._mapErrors)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1641
205
e6b710bf2b24 Adjust node configuration to match wokkel API changes.
Ralph Meijer <ralphm@ik.nu>
parents: 202
diff changeset
1642 def getConfigurationOptions(self):
206
274a45d2a5ab Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents: 205
diff changeset
1643 return self.backend.nodeOptions
205
e6b710bf2b24 Adjust node configuration to match wokkel API changes.
Ralph Meijer <ralphm@ik.nu>
parents: 202
diff changeset
1644
228
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1645 def _publish_errb(self, failure, request):
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1646 if failure.type == error.NodeNotFound and self.backend.supportsAutoCreate():
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1647 print("Auto-creating node %s" % (request.nodeIdentifier,))
228
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1648 d = self.backend.createNode(request.nodeIdentifier,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1649 request.sender,
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1650 request.options,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1651 pep=self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1652 recipient=request.recipient)
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1653 d.addCallback(
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1654 lambda __, request: defer.ensureDeferred(self.backend.publish(
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1655 request.nodeIdentifier,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1656 request.items,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1657 request.sender,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1658 request.options,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1659 self._isPep(request),
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1660 request.recipient,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1661 )),
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1662 request,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1663 )
228
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1664 return d
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1665
240
70c8bb90d75f added access_model to config, default to 'open'
Goffi <goffi@goffi.org>
parents: 237
diff changeset
1666 return failure
205
e6b710bf2b24 Adjust node configuration to match wokkel API changes.
Ralph Meijer <ralphm@ik.nu>
parents: 202
diff changeset
1667
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1668 def _isPep(self, request):
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1669 try:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1670 return request.delegated
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1671 except AttributeError:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1672 return False
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1673
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1674 def publish(self, request):
419
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1675 d = defer.ensureDeferred(self.backend.publish(
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1676 request.nodeIdentifier,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1677 request.items,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1678 request.sender,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1679 request.options,
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1680 self._isPep(request),
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1681 request.recipient
794593086517 backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents: 415
diff changeset
1682 ))
228
77029ecf9817 added auto-create support
Goffi <goffi@goffi.org>
parents: 223
diff changeset
1683 d.addErrback(self._publish_errb, request)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1684 return d.addErrback(self._mapErrors)
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1685
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1686 def subscribe(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1687 d = self.backend.subscribe(request.nodeIdentifier,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1688 request.subscriber,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1689 request.sender,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1690 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1691 request.recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1692 return d.addErrback(self._mapErrors)
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1693
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1694 def unsubscribe(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1695 d = self.backend.unsubscribe(request.nodeIdentifier,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1696 request.subscriber,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1697 request.sender,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1698 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1699 request.recipient)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1700 return d.addErrback(self._mapErrors)
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1701
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1702 def subscriptions(self, request):
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1703 d = self.backend.getSubscriptions(request.sender,
357
1167e48e5f52 handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents: 355
diff changeset
1704 request.nodeIdentifier,
354
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1705 self._isPep(request),
18b983fe9e1b backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents: 353
diff changeset
1706 request.recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1707 return d.addErrback(self._mapErrors)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1708
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1709 def affiliations(self, request):
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1710 """Retrieve affiliation for normal entity (cf. XEP-0060 §5.7)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1711
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1712 retrieve all node where this jid is affiliated
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1713 """
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1714 d = self.backend.getAffiliations(request.sender,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1715 request.nodeIdentifier,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1716 self._isPep(request),
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1717 request.recipient)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1718 return d.addErrback(self._mapErrors)
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1719
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1720 def create(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1721 d = self.backend.createNode(request.nodeIdentifier,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1722 request.sender, request.options,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1723 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1724 request.recipient)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1725 return d.addErrback(self._mapErrors)
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1726
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1727 def default(self, request):
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1728 d = self.backend.getDefaultConfiguration(request.nodeType,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1729 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1730 request.sender)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1731 return d.addErrback(self._mapErrors)
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1732
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1733 def configureGet(self, request):
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1734 d = self.backend.getNodeConfiguration(request.nodeIdentifier,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1735 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1736 request.recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1737 return d.addErrback(self._mapErrors)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1738
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1739 def configureSet(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1740 d = self.backend.setNodeConfiguration(request.nodeIdentifier,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1741 request.options,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1742 request.sender,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1743 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1744 request.recipient)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1745 return d.addErrback(self._mapErrors)
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1746
331
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1747 def affiliationsGet(self, request):
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1748 """Retrieve affiliations for owner (cf. XEP-0060 §8.9.1)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1749
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1750 retrieve all affiliations for a node
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1751 """
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1752 d = self.backend.getAffiliationsOwner(request.nodeIdentifier,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1753 request.sender,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1754 self._isPep(request),
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1755 request.recipient)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1756 return d.addErrback(self._mapErrors)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1757
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1758 def affiliationsSet(self, request):
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1759 d = self.backend.setAffiliationsOwner(request.nodeIdentifier,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1760 request.sender,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1761 request.affiliations,
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1762 self._isPep(request),
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1763 request.recipient)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1764 return d.addErrback(self._mapErrors)
e93a9fd329d9 affiliations XMPP handling:
Goffi <goffi@goffi.org>
parents: 330
diff changeset
1765
341
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1766 def subscriptionsGet(self, request):
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1767 """Retrieve subscriptions for owner (cf. XEP-0060 §8.8.1)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1768
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1769 retrieve all affiliations for a node
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1770 """
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1771 d = self.backend.getSubscriptionsOwner(request.nodeIdentifier,
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1772 request.sender,
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1773 self._isPep(request),
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1774 request.recipient)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1775 return d.addErrback(self._mapErrors)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1776
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1777 def subscriptionsSet(self, request):
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1778 d = self.backend.setSubscriptionsOwner(request.nodeIdentifier,
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1779 request.sender,
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1780 request.subscriptions,
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1781 self._isPep(request),
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1782 request.recipient)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1783 return d.addErrback(self._mapErrors)
b49f75a26156 backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents: 340
diff changeset
1784
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1785 def items(self, request):
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1786 ext_data = {}
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1787 if const.FLAG_ENABLE_RSM and request.rsm is not None:
377
ded7657b03fa backend: send a BadRequest if RSM max is negative
Goffi <goffi@goffi.org>
parents: 375
diff changeset
1788 if request.rsm.max < 0:
ded7657b03fa backend: send a BadRequest if RSM max is negative
Goffi <goffi@goffi.org>
parents: 375
diff changeset
1789 raise pubsub.BadRequest(text="max can't be negative")
290
9f612fa19eea backend: fixed a crash when there is no RSM in request
Goffi <goffi@goffi.org>
parents: 288
diff changeset
1790 ext_data['rsm'] = request.rsm
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1791 try:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1792 ext_data['pep'] = request.delegated
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1793 except AttributeError:
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1794 pass
375
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1795 ext_data['order_by'] = request.orderBy or []
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1796 d = self.backend.getItems(request.nodeIdentifier,
330
82d1259b3e36 backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents: 320
diff changeset
1797 request.sender,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1798 request.recipient,
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1799 request.maxItems,
278
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1800 request.itemIdentifiers,
8a71486c3e95 implements RSM (XEP-0059)
souliane <souliane@mailoo.org>
parents: 263
diff changeset
1801 ext_data)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1802 return d.addErrback(self._mapErrors)
29
d4fc29bb5381 Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents: 24
diff changeset
1803
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1804 def retract(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1805 d = self.backend.retractItem(request.nodeIdentifier,
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1806 request.itemIdentifiers,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1807 request.sender,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1808 request.notify,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1809 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1810 request.recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1811 return d.addErrback(self._mapErrors)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1812
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1813 def purge(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1814 d = self.backend.purgeNode(request.nodeIdentifier,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1815 request.sender,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1816 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1817 request.recipient)
167
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1818 return d.addErrback(self._mapErrors)
ef22e4150caa Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents: 159
diff changeset
1819
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1820 def delete(self, request):
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1821 d = self.backend.deleteNode(request.nodeIdentifier,
294
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1822 request.sender,
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1823 self._isPep(request),
df1edebb0466 PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents: 290
diff changeset
1824 request.recipient)
222
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1825 return d.addErrback(self._mapErrors)
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1826
698af5d720ad Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents: 216
diff changeset
1827 components.registerAdapter(PubSubResourceFromBackend,
317
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
1828 iidavoll.IBackendService,
34adc4a8aa64 new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents: 315
diff changeset
1829 iwokkel.IPubSubResource)
375
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1830
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1831
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1832
414
ccb2a22ea0fc Python 3 port:
Goffi <goffi@goffi.org>
parents: 405
diff changeset
1833 @implementer(iwokkel.IDisco)
375
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1834 class ExtraDiscoHandler(XMPPHandler):
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1835 # see comment in twisted/plugins/pubsub.py
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1836 # FIXME: upstream must be fixed so we can use custom (non pubsub#) disco features
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1837
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1838 def getDiscoInfo(self, requestor, service, nodeIdentifier=''):
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1839 return [disco.DiscoFeature(pubsub.NS_ORDER_BY)]
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1840
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1841 def getDiscoItems(self, requestor, service, nodeIdentifier=''):
9a787881b824 implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents: 369
diff changeset
1842 return []