Mercurial > libervia-pubsub
annotate sat_pubsub/backend.py @ 474:af167e95527c
Added tag v0.4.0 for changeset dc53c6f020bc
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 30 Nov 2021 23:16:26 +0100 |
parents | ed9e12701e0f |
children | b544109ab4c4 |
rev | line source |
---|---|
414 | 1 #!/usr/bin/env python3 |
237 | 2 # |
440 | 3 # Copyright (c) 2012-2021 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 | 6 |
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 | 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 | 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 | 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 | 26 |
312
5d7c3787672e
fixed copyright put in docstring instead of comments
Goffi <goffi@goffi.org>
parents:
311
diff
changeset
|
27 # -- |
233 | 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 | 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 | 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 | 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 | 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 | 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 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
65 from typing import Optional, List, Tuple |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
66 |
414 | 67 from zope.interface import implementer |
2 | 68 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
69 from twisted.application import service |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
70 from twisted.python import components, failure, log |
183
c21b986cff30
Implement HTTP client to gateway and implement functional tests with it.
Ralph Meijer <ralphm@ik.nu>
parents:
181
diff
changeset
|
71 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
|
72 from twisted.words.protocols.jabber.error import StanzaError |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
73 from twisted.words.protocols.jabber import jid |
381
7c490bb60847
backend: items ids are returned in payload if not specified on publish
Goffi <goffi@goffi.org>
parents:
380
diff
changeset
|
74 from twisted.words.xish import domish, utility |
1 | 75 |
317
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
76 from wokkel import disco |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
77 from wokkel import data_form |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
78 from wokkel import rsm |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
79 from wokkel import iwokkel |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
80 from wokkel import pubsub |
375
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
81 from wokkel.subprotocols import XMPPHandler |
20
eddea65d1032
Added two exceptions: NoInstantNodes and NodeExists.
Ralph Meijer <ralphm@ik.nu>
parents:
18
diff
changeset
|
82 |
317
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
83 from sat_pubsub import error |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
84 from sat_pubsub import iidavoll |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
85 from sat_pubsub import const |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
86 from sat_pubsub import container |
15 | 87 |
430 | 88 # TODO: modernise the code, get rid of legacy Twisted logging, use coroutines, |
89 # better formatting | |
90 | |
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
|
91 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
92 def _getAffiliation(node, entity): |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
93 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
|
94 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
|
95 return d |
23
884268687229
Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents:
20
diff
changeset
|
96 |
171
bc269696ef42
Reply with the correct error condition on subscription when not subscribed.
Ralph Meijer <ralphm@ik.nu>
parents:
169
diff
changeset
|
97 |
394
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
98 def elementCopy(element): |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
99 """Make a copy of a domish.Element |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
100 |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
101 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
|
102 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
|
103 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
|
104 it will also affect original element. |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
105 @param element(domish.Element): Element to clone |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
106 """ |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
107 new_elt = domish.Element( |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
108 (element.uri, element.name), |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
109 defaultUri = element.defaultUri, |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
110 attribs = element.attributes, |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
111 localPrefixes = element.localPrefixes) |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
112 new_elt.parent = element.parent |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
113 new_elt.children = element.children[:] |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
114 return new_elt |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
115 |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
116 |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
117 def itemDataCopy(item_data): |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
118 """Make a copy of an item_data |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
119 |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
120 deep copy every element of the tuple but item |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
121 do an elementCopy of item_data.item |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
122 @param item_data(ItemData): item data to copy |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
123 @return (ItemData): copied data |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
124 """ |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
125 return container.ItemData(*[elementCopy(item_data.item)] |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
126 + [copy.deepcopy(d) for d in item_data[1:]]) |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
127 |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
128 |
414 | 129 @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
|
130 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
|
131 """ |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
132 Generic publish-subscribe backend service. |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
133 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
134 @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
|
135 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
|
136 and possible options to choose from. |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
137 @type nodeOptions: C{dict}. |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
138 @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
|
139 """ |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
140 |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
141 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
142 nodeOptions = { |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
143 const.OPT_PERSIST_ITEMS: |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
144 {"type": "boolean", |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
145 "label": "Persist items to storage"}, |
422 | 146 const.OPT_MAX_ITEMS: |
147 {"type": "text-single", | |
148 "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
|
149 const.OPT_DELIVER_PAYLOADS: |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
150 {"type": "boolean", |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
151 "label": "Deliver payloads with event notifications"}, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
152 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
|
153 {"type": "list-single", |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
154 "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
|
155 "options": { |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
156 "never": "Never", |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
157 "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
|
158 }, |
259
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
159 const.OPT_ACCESS_MODEL: |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
160 {"type": "list-single", |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
161 "label": "Who can subscribe to this node", |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
162 "options": { |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
163 const.VAL_AMODEL_OPEN: "Public node", |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
164 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
|
165 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
|
166 const.VAL_AMODEL_WHITELIST: "Node restricted to some jids", |
259
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
167 } |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
168 }, |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
169 const.OPT_ROSTER_GROUPS_ALLOWED: |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
170 {"type": "list-multi", |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
171 "label": "Groups of the roster allowed to access the node", |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
172 }, |
260 | 173 const.OPT_PUBLISH_MODEL: |
174 {"type": "list-single", | |
175 "label": "Who can publish to this node", | |
176 "options": { | |
177 const.VAL_PMODEL_OPEN: "Everybody can publish", | |
178 const.VAL_PMODEL_PUBLISHERS: "Only owner and publishers can publish", | |
179 const.VAL_PMODEL_SUBSCRIBERS: "Everybody which subscribed to the node", | |
180 } | |
181 }, | |
438
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
182 const.OPT_OVERWRITE_POLICY: |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
183 {"type": "list-single", |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
184 "label": "Who can overwrite an item", |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
185 "options": { |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
186 const.VAL_OWPOL_ORIGINAL: "Only original publisher of the item", |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
187 const.VAL_OWPOL_ANY_PUB: "Any publisher", |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
188 } |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
189 }, |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
190 const.OPT_SERIAL_IDS: |
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
191 {"type": "boolean", |
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
192 "label": "Use serial ids"}, |
403
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
193 const.OPT_CONSISTENT_PUBLISHER: |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
194 {"type": "boolean", |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
195 "label": "Keep publisher on update"}, |
430 | 196 const.OPT_FTS_LANGUAGE: |
197 {"type": "list-single", | |
198 "label": "Default language to use for full text search", | |
199 "options": { | |
200 const.VAL_FTS_GENERIC: ( | |
201 "Generic (use if unsure of if your language is not present)" | |
202 ) | |
203 } | |
204 }, | |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
205 } |
159
6fe78048baf9
Rework error handling, depend on Twisted Words 0.4.0.
Ralph Meijer <ralphm@ik.nu>
parents:
155
diff
changeset
|
206 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
207 subscriptionOptions = { |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
208 "pubsub#subscription_type": |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
209 {"type": "list-single", |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
210 "options": { |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
211 "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
|
212 "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
|
213 }, |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
214 "pubsub#subscription_depth": |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
215 {"type": "list-single", |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
216 "options": { |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
217 "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
|
218 "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
|
219 }, |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
220 } |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
221 |
380 | 222 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
|
223 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
|
224 self.storage = storage |
380 | 225 self.config = config |
414 | 226 self.admins = config['admins_jids_list'] |
460 | 227 self.jid = config["jid"] |
228 if config["server_jid"] is None: | |
229 self.server_jid = jid.JID(str(self.jid).split(".", 1)[1]) | |
230 else: | |
231 self.server_jid = jid.JID(config["server_jid"]) | |
430 | 232 d = self.storage.getFTSLanguages() |
233 d.addCallbacks(self._getFTSLanguagesCb, self._getFTSLanguagesEb) | |
234 | |
235 def _getFTSLanguagesCb(self, languages): | |
236 # we skip the first one which is always "generic", as we already have it | |
237 for l in languages[1:]: | |
238 self.nodeOptions[const.OPT_FTS_LANGUAGE]["options"][l] = l.title() | |
239 | |
240 def _getFTSLanguagesEb(self, failure_): | |
241 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
|
242 |
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
|
243 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
|
244 """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
|
245 return entity_jid.userhostJID() in self.admins |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
246 |
363
a98b3d52c2ff
added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents:
358
diff
changeset
|
247 def supportsPublishOptions(self): |
a98b3d52c2ff
added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents:
358
diff
changeset
|
248 return True |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
249 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
250 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
|
251 return True |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
252 |
250 | 253 def supportsGroupBlog(self): |
254 return True | |
255 | |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
256 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
|
257 return True |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
258 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
259 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
|
260 return True |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
261 |
260 | 262 def supportsPublishModel(self): |
263 return True | |
264 | |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
265 def getNodeType(self, nodeIdentifier, pep, recipient=None): |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
266 # FIXME: manage pep and recipient |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
267 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
|
268 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
|
269 return d |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
270 |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
271 def _getNodesIds(self, subscribed, pep, recipient): |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
272 # TODO: filter whitelist nodes |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
273 # 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
|
274 if not subscribed: |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
275 allowed_accesses = {'open', 'whitelist'} |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
276 else: |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
277 allowed_accesses = {'open', 'presence', 'whitelist'} |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
278 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
|
279 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
280 async def getNodes(self, requestor, pep, recipient): |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
281 if pep: |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
282 subscribed = await self.privilege.isSubscribedFrom(requestor, recipient) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
283 return await self._getNodesIds(subscribed, pep, recipient) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
284 return await 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
|
285 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
286 def getNodeMetaData(self, nodeIdentifier, pep, recipient=None): |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
287 # FIXME: manage pep and recipient |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
288 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
|
289 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
|
290 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
|
291 return d |
108
1c18759d2afb
Moved two errors to storage.py.
Ralph Meijer <ralphm@ik.nu>
parents:
106
diff
changeset
|
292 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
293 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
|
294 options = [] |
414 | 295 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
|
296 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
|
297 option = {"var": key} |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
298 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
|
299 option["value"] = value |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
300 options.append(option) |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
301 |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
302 return options |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
303 |
461
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
304 async def _checkAuth(self, node, requestor): |
260 | 305 """ Check authorisation of publishing in node for requestor """ |
461
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
306 affiliation = await node.getAffiliation(requestor) |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
307 configuration = node.getConfiguration() |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
308 publish_model = configuration[const.OPT_PUBLISH_MODEL] |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
309 if publish_model == const.VAL_PMODEL_PUBLISHERS: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
310 if affiliation not in ['owner', 'publisher']: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
311 raise error.Forbidden() |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
312 elif publish_model == const.VAL_PMODEL_SUBSCRIBERS: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
313 if affiliation not in ['owner', 'publisher']: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
314 # we are in subscribers publish model, we must check that |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
315 # the requestor is a subscriber to allow him to publish |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
316 subscribed = await node.isSubscribed(requestor) |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
317 if not subscribed: |
260 | 318 raise error.Forbidden() |
461
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
319 elif publish_model != const.VAL_PMODEL_OPEN: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
320 # publish_model must be publishers (default), subscribers or open. |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
321 raise ValueError('Unexpected value') |
260 | 322 |
461
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
323 return (affiliation, node) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
324 |
250 | 325 def parseItemConfig(self, item): |
326 """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
|
327 |
05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents:
300
diff
changeset
|
328 @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
|
329 @return (tuple[unicode, dict)): (access_model, item_config) |
250 | 330 """ |
331 item_config = None | |
259
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
332 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
|
333 for idx, elt in enumerate(item.elements()): |
395
9bc3fbf3e685
backend: fixed elements filtering in parseItemConfig
Goffi <goffi@goffi.org>
parents:
394
diff
changeset
|
334 if elt.uri != data_form.NS_X_DATA or elt.name != 'x': |
250 | 335 continue |
336 form = data_form.Form.fromElement(elt) | |
300 | 337 if form.formNamespace == const.NS_ITEM_CONFIG: |
250 | 338 item_config = form |
300 | 339 del item.children[idx] #we need to remove the config from item |
250 | 340 break |
341 | |
342 if item_config: | |
259
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
343 access_model = item_config.get(const.OPT_ACCESS_MODEL, const.VAL_AMODEL_DEFAULT) |
250 | 344 return (access_model, item_config) |
345 | |
301
05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents:
300
diff
changeset
|
346 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
|
347 """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
|
348 |
364
8bd8be6815ab
completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents:
363
diff
changeset
|
349 @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
|
350 @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
|
351 """ |
05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents:
300
diff
changeset
|
352 categories = [] |
05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents:
300
diff
changeset
|
353 try: |
414 | 354 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
|
355 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
|
356 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
|
357 |
05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents:
300
diff
changeset
|
358 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
|
359 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
|
360 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
|
361 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
|
362 |
05c875a13a62
categories are now stored in a dedicated table if item contain an atom entry:
Goffi <goffi@goffi.org>
parents:
300
diff
changeset
|
363 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
|
364 |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
365 def enforceSchema(self, item_elt, schema, affiliation): |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
366 """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
|
367 |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
368 @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
|
369 @param schema(domish.Eement): schema to enfore |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
370 @param affiliation(unicode): affiliation of the publisher |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
371 """ |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
372 try: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
373 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
|
374 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
|
375 except (StopIteration, data_form.Error): |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
376 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
|
377 else: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
378 item_elt.children.remove(x_elt) |
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 schema_form = data_form.Form.fromElement(schema) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
381 |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
382 # we enforce restrictions |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
383 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
|
384 var = field_elt['var'] |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
385 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
|
386 write_restriction = restrict_elt.attributes.get('write') |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
387 if write_restriction is not None: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
388 if write_restriction == 'owner': |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
389 if affiliation != 'owner': |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
390 # 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
|
391 # 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
|
392 # 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
|
393 try: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
394 item_form.removeField(item_form.fields[var]) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
395 except KeyError: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
396 pass |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
397 item_form.addField(schema_form.fields[var]) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
398 else: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
399 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
|
400 |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
401 # 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
|
402 to_remove = set() |
414 | 403 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
|
404 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
|
405 to_remove.add(item_field) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
406 |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
407 for field in to_remove: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
408 item_form.removeField(field) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
409 item_elt.addChild(item_form.toElement()) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
410 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
411 def _getFDPSubmittedNode( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
412 self, |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
413 nodeIdentifier: str, |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
414 pep: bool, |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
415 recipient: jid.JID, |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
416 ) -> Optional[defer.Deferred]: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
417 """Get submitted forms node for Form Discovery and Publishing |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
418 |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
419 @param nodeIdentifier: template node (must start with const.FDP_TEMPLATE_PREFIX) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
420 @êeturn: node or None if the node doesn't exist |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
421 """ |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
422 app_ns = nodeIdentifier[len(const.FDP_TEMPLATE_PREFIX):] |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
423 submitted_node_id = f"{const.FDP_SUBMITTED_PREFIX}{app_ns}" |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
424 try: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
425 return self.storage.getNode(submitted_node_id, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
426 except error.NodeNotFound: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
427 return None |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
428 |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
429 async def publish(self, nodeIdentifier, items, requestor, options, pep, recipient): |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
430 if len(items) == 0: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
431 raise pubsub.BadRequest(text="no item to publish") |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
432 node = await self.storage.getNode(nodeIdentifier, pep, recipient) |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
433 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
|
434 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
435 if node.nodeType == 'collection': |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
436 raise error.NoPublishing() |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
437 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
438 configuration = node.getConfiguration() |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
439 persistItems = configuration[const.OPT_PERSIST_ITEMS] |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
440 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
|
441 |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
442 # we check that publish-options are satisfied |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
443 for field, value in options.items(): |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
444 try: |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
445 current_value = configuration[field] |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
446 except KeyError: |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
447 raise error.ConstraintFailed( |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
448 f"publish-options {field!r} doesn't exist in node configuration" |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
449 ) |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
450 if current_value != value: |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
451 raise error.ConstraintFailed( |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
452 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
|
453 f"which doesn't fit publish-options expected {value!r}" |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
454 ) |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
455 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
456 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
|
457 raise error.ItemForbidden() |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
458 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
|
459 raise error.ItemRequired() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
460 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
461 items_data = [] |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
462 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
|
463 ret_payload = None # payload returned, None or domish.Element |
250 | 464 for item in items: |
299 | 465 # we enforce publisher (cf XEP-0060 §7.1.2.3) |
466 item['publisher'] = requestor.full() | |
250 | 467 if persistItems or deliverPayloads: |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
468 item.uri = None |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
469 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
|
470 if not item.getAttribute("id"): |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
471 item["id"] = await node.getNextId() |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
472 new_item = True |
389
66128656f76c
backend: fixed items returned on publishing:
Goffi <goffi@goffi.org>
parents:
388
diff
changeset
|
473 if ret_payload is None: |
414 | 474 ret_pubsub_elt = domish.Element((pubsub.NS_PUBSUB, 'pubsub')) |
475 ret_publish_elt = ret_pubsub_elt.addElement('publish') | |
476 ret_publish_elt['node'] = node.nodeIdentifier | |
389
66128656f76c
backend: fixed items returned on publishing:
Goffi <goffi@goffi.org>
parents:
388
diff
changeset
|
477 ret_payload = ret_pubsub_elt |
66128656f76c
backend: fixed items returned on publishing:
Goffi <goffi@goffi.org>
parents:
388
diff
changeset
|
478 ret_publish_elt = ret_payload.publish |
414 | 479 ret_item_elt = ret_publish_elt.addElement('item') |
480 ret_item_elt["id"] = item["id"] | |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
481 else: |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
482 check_overwrite = True |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
483 new_item = False |
250 | 484 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
|
485 categories = self.parseCategories(item) |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
486 schema = node.getSchema() |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
487 if schema is not None: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
488 self.enforceSchema(item, schema, affiliation) |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
489 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
|
490 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
491 if persistItems: |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
492 |
403
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
493 if check_overwrite: |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
494 itemIdentifiers = [item['id'] for item in items |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
495 if item.getAttribute('id')] |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
496 |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
497 if affiliation == 'owner' or self.isAdmin(requestor): |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
498 if configuration[const.OPT_CONSISTENT_PUBLISHER]: |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
499 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
|
500 if pub_map: |
4179ed660a85
backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents:
414
diff
changeset
|
501 # 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
|
502 # 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
|
503 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
|
504 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
|
505 # 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
|
506 # publishers) |
4179ed660a85
backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents:
414
diff
changeset
|
507 raise error.NoPublishing( |
4179ed660a85
backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents:
414
diff
changeset
|
508 "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
|
509 "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
|
510 "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
|
511 # 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
|
512 # 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
|
513 requestor = publishers.pop() |
4179ed660a85
backend: fixed publishing with "consistent_publisher" when no item was previously available
Goffi <goffi@goffi.org>
parents:
414
diff
changeset
|
514 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
|
515 item['publisher'] = requestor.full() |
438
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
516 elif configuration[const.OPT_OVERWRITE_POLICY] == const.VAL_OWPOL_ORIGINAL: |
403
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
517 # we don't want a publisher to overwrite the item |
1dc606612405
implemented experimental "consistent_publisher" option:
Goffi <goffi@goffi.org>
parents:
397
diff
changeset
|
518 # of an other publisher |
438
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
519 item_pub_map = await node.getItemsPublishers(itemIdentifiers) |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
520 for item_publisher in item_pub_map.values(): |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
521 if item_publisher.userhost() != requestor.userhost(): |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
522 raise error.ItemForbidden( |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
523 "Item can only be overwritten by original publisher" |
b5e1e8d93dd4
backend, pgsql: new `overwrite_policy` node setting:
Goffi <goffi@goffi.org>
parents:
437
diff
changeset
|
524 ) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
525 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
526 if node.nodeIdentifier.startswith(const.FDP_TEMPLATE_PREFIX): |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
527 schema_item = items_data[-1].item |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
528 try: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
529 schema = next(schema_item.elements(data_form.NS_X_DATA, 'x')) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
530 except StopIteration: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
531 raise pubsub.BadRequest(text="Data form is missing in FDP request") |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
532 submitted_node = await self._getFDPSubmittedNode( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
533 node.nodeIdentifier, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
534 if submitted_node is not None: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
535 await submitted_node.setSchema(schema) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
536 |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
537 # 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
|
538 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
|
539 |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
540 self._doNotify(node, items_data, deliverPayloads, pep, recipient) |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
541 return ret_payload |
367
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
542 |
a772f7dac930
backend, storage(pgsql): creation/update date + serial ids:
Goffi <goffi@goffi.org>
parents:
365
diff
changeset
|
543 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
|
544 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
|
545 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
|
546 item_data.item.children = [] |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
547 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
|
548 '//event/pubsub/notify') |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
549 |
339
516b282aa542
backend (notifications): avoid useless database request in getNotifications
Goffi <goffi@goffi.org>
parents:
336
diff
changeset
|
550 def getNotifications(self, node, items_data): |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
551 """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
|
552 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
553 subscribers will be associated with subscribed items, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
554 and subscription type. |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
555 """ |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
556 |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
557 def toNotifications(subscriptions, items_data): |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
558 subsBySubscriber = {} |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
559 for subscription in subscriptions: |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
560 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
|
561 'items') == 'items': |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
562 subs = subsBySubscriber.setdefault(subscription.subscriber, |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
563 set()) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
564 subs.add(subscription) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
565 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
566 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
|
567 for subscriber, subscriptions_ |
414 | 568 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
|
569 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
570 return notifications |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
571 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
572 def rootNotFound(failure): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
573 failure.trap(error.NodeNotFound) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
574 return [] |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
575 |
339
516b282aa542
backend (notifications): avoid useless database request in getNotifications
Goffi <goffi@goffi.org>
parents:
336
diff
changeset
|
576 d1 = node.getSubscriptions('subscribed') |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
577 # FIXME: must add root node subscriptions ? |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
578 # d2 = self.storage.getNode('', False) # FIXME: to check |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
579 # d2.addCallback(lambda node: node.getSubscriptions('subscribed')) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
580 # d2.addErrback(rootNotFound) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
581 # d = defer.gatherResults([d1, d2]) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
582 # d.addCallback(lambda result: result[0] + result[1]) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
583 d1.addCallback(toNotifications, items_data) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
584 return d1 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
585 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
586 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
|
587 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
|
588 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
589 def registerRetractNotifier(self, observerfn, *args, **kwargs): |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
590 self.addObserver('//event/pubsub/retract', observerfn, *args, **kwargs) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
591 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
592 def registerDeleteNotifier(self, observerfn, *args, **kwargs): |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
593 self.addObserver('//event/pubsub/delete', observerfn, *args, **kwargs) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
594 |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
595 def registerPurgeNotifier(self, observerfn, *args, **kwargs): |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
596 self.addObserver('//event/pubsub/purge', observerfn, *args, **kwargs) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
597 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
598 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
|
599 subscriberEntity = subscriber.userhostJID() |
216
53d2c0019458
Fix subscription and unsubscription JID checks.
Ralph Meijer <ralphm@ik.nu>
parents:
211
diff
changeset
|
600 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
|
601 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
|
602 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
603 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
|
604 d.addCallback(_getAffiliation, subscriberEntity) |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
605 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
|
606 return d |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
607 |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
608 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
|
609 node, affiliation = result |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
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 if affiliation == 'outcast': |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
612 raise error.Forbidden() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
613 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
614 access_model = node.getAccessModel() |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
615 |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
616 if access_model == const.VAL_AMODEL_OPEN: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
617 d = defer.succeed(None) |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
618 elif access_model == const.VAL_AMODEL_PRESENCE: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
619 d = self.checkPresenceSubscription(node, subscriber) |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
620 elif access_model == const.VAL_AMODEL_PUBLISHER_ROSTER: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
621 d = self.checkRosterGroups(node, subscriber) |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
622 elif access_model == const.VAL_AMODEL_WHITELIST: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
623 d = self.checkNodeAffiliations(node, subscriber) |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
624 else: |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
625 raise NotImplementedError |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
626 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
627 def trapExists(failure): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
628 failure.trap(error.SubscriptionExists) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
629 return False |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
630 |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
631 def cb(sendLast): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
632 d = node.getSubscription(subscriber) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
633 if sendLast: |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
634 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
|
635 return d |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
636 |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
637 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
|
638 d.addCallbacks(lambda _: True, trapExists) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
639 d.addCallback(cb) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
640 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
641 return d |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
642 |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
643 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
|
644 |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
645 def notifyItem(items_data): |
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
646 if items_data: |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
647 reactor.callLater(0, self.dispatch, |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
648 {'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
|
649 'node': node, |
355
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
650 'pep': pep, |
c72fcbdcdab7
backend: fixed subscription, PEP was not handled correctly
Goffi <goffi@goffi.org>
parents:
354
diff
changeset
|
651 'recipient': recipient, |
261
65d4fed44edf
fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents:
260
diff
changeset
|
652 'subscription': subscription, |
65d4fed44edf
fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents:
260
diff
changeset
|
653 }, |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
654 '//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
|
655 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
656 config = node.getConfiguration() |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
657 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
|
658 'never') |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
659 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
|
660 entity = subscription.subscriber.userhostJID() |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
661 d = defer.ensureDeferred( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
662 self.getItemsData( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
663 node.nodeIdentifier, entity, recipient, maxItems=1, ext_data={'pep': pep} |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
664 ) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
665 ) |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
666 d.addCallback(notifyItem) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
667 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
|
668 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
669 return subscription |
178
07114105885a
Send last published item on subscription if node is so configured.
Ralph Meijer <ralphm@ik.nu>
parents:
174
diff
changeset
|
670 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
671 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
|
672 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
|
673 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
|
674 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
675 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
|
676 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
|
677 return d |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
678 |
357
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
679 def getSubscriptions(self, requestor, nodeIdentifier, pep, recipient): |
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
680 """retrieve subscriptions of an entity |
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
681 |
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
682 @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
|
683 @param nodeIdentifier(unicode, None): identifier of the node |
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
684 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
|
685 @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
|
686 @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
|
687 """ |
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
688 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
|
689 |
228 | 690 def supportsAutoCreate(self): |
691 return True | |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
692 |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
693 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
|
694 return True |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
695 |
461
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
696 async def _createNode( |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
697 self, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
698 nodeIdentifier: Optional[str], |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
699 requestor: jid.JID, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
700 options: Optional[dict] = None, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
701 pep: bool = False, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
702 recipient: Optional[jid.JID] = None |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
703 ) -> str: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
704 if pep: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
705 if recipient == self.server_jid: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
706 if not self.isAdmin(requestor): |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
707 raise error.Forbidden() |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
708 elif requestor.userhostJID() != recipient.userhostJID(): |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
709 raise error.Forbidden() |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
710 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
711 if not nodeIdentifier: |
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
712 nodeIdentifier = 'generic/%s' % uuid.uuid4() |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
713 |
259
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
714 if not options: |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
715 options = {} |
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
716 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
717 nodeType = 'leaf' |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
718 config = self.storage.getDefaultConfiguration(nodeType) |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
719 config['pubsub#node_type'] = nodeType |
259
6fe7da6b4b32
node "roster" access model management
Goffi <goffi@goffi.org>
parents:
258
diff
changeset
|
720 config.update(options) |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
721 |
352 | 722 # TODO: handle schema on creation |
461
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
723 await self.storage.createNode( |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
724 nodeIdentifier, requestor, config, None, pep, recipient |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
725 ) |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
726 return nodeIdentifier |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
727 |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
728 def createNode( |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
729 self, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
730 nodeIdentifier: Optional[str], |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
731 requestor: jid.JID, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
732 options: Optional[dict] = None, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
733 pep: bool = False, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
734 recipient: Optional[jid.JID] = None |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
735 ) -> defer.Deferred: |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
736 return defer.ensureDeferred(self._createNode( |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
737 nodeIdentifier=nodeIdentifier, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
738 requestor=requestor, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
739 options=options, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
740 pep=pep, |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
741 recipient=recipient |
c9238fca1fb3
backend: fix node creation permission check for PEP
Goffi <goffi@goffi.org>
parents:
460
diff
changeset
|
742 )) |
90
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
743 |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
744 def getDefaultConfiguration(self, nodeType): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
745 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
|
746 return d |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
747 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
748 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
|
749 if not nodeIdentifier: |
196
00a6dbfbee42
Return deferreds on failure, instead of raising exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
750 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
|
751 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
752 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
|
753 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
|
754 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
755 return d |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
756 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
757 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
|
758 if not nodeIdentifier: |
196
00a6dbfbee42
Return deferreds on failure, instead of raising exceptions.
Ralph Meijer <ralphm@ik.nu>
parents:
183
diff
changeset
|
759 return defer.fail(error.NoRootNode()) |
90
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
760 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
761 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
|
762 d.addCallback(_getAffiliation, requestor) |
422 | 763 d.addCallback( |
764 lambda result: defer.ensureDeferred( | |
765 self._doSetNodeConfiguration(result, requestor, options)) | |
766 ) | |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
767 return d |
90
59378610b16e
Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents:
85
diff
changeset
|
768 |
422 | 769 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
|
770 node, affiliation = result |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
771 |
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
|
772 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
|
773 raise error.Forbidden() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
774 |
422 | 775 max_items = options.get(const.OPT_MAX_ITEMS, '').strip().lower() |
776 if not max_items: | |
777 pass | |
778 elif max_items == 'max': | |
779 # FIXME: we use "0" for max for now, but as "0" may be used as legal value | |
780 # in XEP-0060 ("max" is used otherwise), we should use "None" instead. | |
781 # This require a schema update, as NULL is not allowed at the moment | |
782 options.fields[const.OPT_MAX_ITEMS].value = "0" | |
783 else: | |
784 # max_items is a number, we have to check that it's not bigger than the | |
785 # total number of items on this node | |
786 try: | |
787 max_items = int(max_items) | |
788 except ValueError: | |
789 raise error.InvalidConfigurationValue('Invalid "max_items" value') | |
790 else: | |
791 options.fields[const.OPT_MAX_ITEMS].value = str(max_items) | |
792 if max_items: | |
793 items_count = await node.getItemsCount(None, True) | |
794 if max_items < items_count: | |
795 raise error.ConstraintFailed( | |
796 "\"max_items\" can't be set to a value lower than the total " | |
797 "number of items on this node. Please increase \"max_items\" " | |
798 "or delete items from this node") | |
799 | |
800 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
|
801 |
331 | 802 def getAffiliations(self, entity, nodeIdentifier, pep, recipient): |
803 return self.storage.getAffiliations(entity, nodeIdentifier, pep, recipient) | |
804 | |
805 def getAffiliationsOwner(self, nodeIdentifier, requestor, pep, recipient): | |
806 d = self.storage.getNode(nodeIdentifier, pep, recipient) | |
807 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
|
808 d.addCallback(self._doGetAffiliationsOwner, requestor) |
331 | 809 return d |
810 | |
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
|
811 def _doGetAffiliationsOwner(self, result, requestor): |
331 | 812 node, affiliation = result |
813 | |
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
|
814 if affiliation != 'owner' and not self.isAdmin(requestor): |
331 | 815 raise error.Forbidden() |
816 return node.getAffiliations() | |
817 | |
818 def setAffiliationsOwner(self, nodeIdentifier, requestor, affiliations, pep, recipient): | |
819 d = self.storage.getNode(nodeIdentifier, pep, recipient) | |
820 d.addCallback(_getAffiliation, requestor) | |
821 d.addCallback(self._doSetAffiliationsOwner, requestor, affiliations) | |
822 return d | |
823 | |
824 def _doSetAffiliationsOwner(self, result, requestor, affiliations): | |
825 # Check that requestor is allowed to set affiliations, and delete entities | |
826 # with "none" affiliation | |
827 | |
828 # TODO: return error with failed affiliations in case of failure | |
829 node, requestor_affiliation = result | |
830 | |
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
|
831 if requestor_affiliation != 'owner' and not self.isAdmin(requestor): |
331 | 832 raise error.Forbidden() |
833 | |
834 # we don't allow requestor to change its own affiliation | |
835 requestor_bare = requestor.userhostJID() | |
836 if requestor_bare in affiliations and affiliations[requestor_bare] != 'owner': | |
837 # FIXME: it may be interesting to allow the owner to ask for ownership removal | |
838 # if at least one other entity is owner for this node | |
839 raise error.Forbidden("You can't change your own affiliation") | |
840 | |
414 | 841 to_delete = [jid_ for jid_, affiliation in affiliations.items() if affiliation == 'none'] |
331 | 842 for jid_ in to_delete: |
843 del affiliations[jid_] | |
844 | |
845 if to_delete: | |
846 d = node.deleteAffiliations(to_delete) | |
847 if affiliations: | |
848 d.addCallback(lambda dummy: node.setAffiliations(affiliations)) | |
849 else: | |
850 d = node.setAffiliations(affiliations) | |
851 | |
852 return d | |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
853 |
341
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
854 def getSubscriptionsOwner(self, nodeIdentifier, requestor, pep, recipient): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
855 d = self.storage.getNode(nodeIdentifier, pep, recipient) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
856 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
|
857 d.addCallback(self._doGetSubscriptionsOwner, requestor) |
341
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
858 return d |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
859 |
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
|
860 def _doGetSubscriptionsOwner(self, result, requestor): |
341
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
861 node, affiliation = result |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
862 |
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
|
863 if affiliation != 'owner' and not self.isAdmin(requestor): |
341
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
864 raise error.Forbidden() |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
865 return node.getSubscriptions() |
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 def setSubscriptionsOwner(self, nodeIdentifier, requestor, subscriptions, pep, recipient): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
868 d = self.storage.getNode(nodeIdentifier, pep, recipient) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
869 d.addCallback(_getAffiliation, requestor) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
870 d.addCallback(self._doSetSubscriptionsOwner, requestor, subscriptions) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
871 return d |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
872 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
873 def unwrapFirstError(self, failure): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
874 failure.trap(defer.FirstError) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
875 return failure.value.subFailure |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
876 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
877 def _doSetSubscriptionsOwner(self, result, requestor, subscriptions): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
878 # 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
|
879 # with "none" subscription |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
880 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
881 # 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
|
882 node, requestor_affiliation = result |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
883 |
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
|
884 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
|
885 raise error.Forbidden() |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
886 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
887 d_list = [] |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
888 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
889 for subscription in subscriptions.copy(): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
890 if subscription.state == 'none': |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
891 subscriptions.remove(subscription) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
892 d_list.append(node.removeSubscription(subscription.subscriber)) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
893 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
894 if subscriptions: |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
895 d_list.append(node.setSubscriptions(subscriptions)) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
896 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
897 d = defer.gatherResults(d_list, consumeErrors=True) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
898 d.addCallback(lambda _: None) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
899 d.addErrback(self.unwrapFirstError) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
900 return d |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
901 |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
902 def filterItemsWithSchema(self, items_data, schema, owner): |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
903 """Check schema restriction and remove fields/items if they don't comply |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
904 |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
905 @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
|
906 items in this list will be modified |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
907 @param schema(domish.Element): node schema |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
908 @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
|
909 """ |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
910 fields_to_remove = set() |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
911 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
|
912 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
|
913 read_restriction = restrict_elt.attributes.get('read') |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
914 if read_restriction is not None: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
915 if read_restriction == 'owner': |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
916 if not owner: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
917 fields_to_remove.add(field_elt['var']) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
918 else: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
919 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
|
920 items_to_remove = [] |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
921 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
|
922 item_elt = item_data.item |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
923 try: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
924 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
|
925 except StopIteration: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
926 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
|
927 items_to_remove.append(item_data) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
928 continue |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
929 form = data_form.Form.fromElement(x_elt) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
930 # 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
|
931 for field in fields_to_remove: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
932 try: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
933 form.removeField(form.fields[field]) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
934 except KeyError: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
935 continue |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
936 item_elt.children.remove(x_elt) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
937 item_elt.addChild(form.toElement()) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
938 |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
939 for item_data in items_to_remove: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
940 items_data.remove(item_data) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
941 |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
942 def checkPresenceSubscription(self, node, requestor): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
943 """check if requestor has presence subscription from node owner |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
944 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
945 @param node(Node): node to check |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
946 @param requestor(jid.JID): entity who want to access node |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
947 """ |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
948 def gotRoster(roster): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
949 if roster is None: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
950 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
951 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
952 if requestor not in roster: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
953 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
954 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
955 if not roster[requestor].subscriptionFrom: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
956 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
957 |
467
d86e0f8a1405
privilege: store roster cache in database:
Goffi <goffi@goffi.org>
parents:
464
diff
changeset
|
958 d = defer.ensureDeferred(self.getOwnerRoster(node)) |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
959 d.addCallback(gotRoster) |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
960 return d |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
961 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
962 @defer.inlineCallbacks |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
963 def checkRosterGroups(self, node, requestor): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
964 """check if requestor is in allowed groups of a node |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
965 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
966 @param node(Node): node to check |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
967 @param requestor(jid.JID): entity who want to access node |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
968 """ |
467
d86e0f8a1405
privilege: store roster cache in database:
Goffi <goffi@goffi.org>
parents:
464
diff
changeset
|
969 roster = yield defer.ensureDeferred(self.getOwnerRoster(node)) |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
970 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
971 if roster is None: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
972 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
973 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
974 if requestor not in roster: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
975 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
976 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
977 authorized_groups = yield node.getAuthorizedGroups() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
978 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
979 if not roster[requestor].groups.intersection(authorized_groups): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
980 # 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
|
981 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
982 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
983 def checkNodeAffiliations(self, node, requestor): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
984 """check if requestor is in white list of a node |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
985 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
986 @param node(Node): node to check |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
987 @param requestor(jid.JID): entity who want to access node |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
988 """ |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
989 def gotAffiliations(affiliations): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
990 try: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
991 affiliation = affiliations[requestor.userhostJID()] |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
992 except KeyError: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
993 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
994 else: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
995 if affiliation not in ('owner', 'publisher', 'member'): |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
996 raise error.Forbidden() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
997 |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
998 d = node.getAffiliations() |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
999 d.addCallback(gotAffiliations) |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1000 return d |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1001 |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1002 @defer.inlineCallbacks |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1003 def checkNodeAccess(self, node, requestor): |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1004 """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
|
1005 |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1006 @param node(Node): node to check |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1007 @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
|
1008 @return (tuple): permissions data with: |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1009 - 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
|
1010 - roster(None, ): roster of the requestor |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1011 None if not needed/available |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1012 - 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
|
1013 @raise error.Forbidden: access is not granted |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1014 @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
|
1015 """ |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1016 node, affiliation = yield _getAffiliation(node, requestor) |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1017 |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1018 if not iidavoll.ILeafNode.providedBy(node): |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1019 raise error.NotLeafNodeError() |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1020 |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1021 if affiliation == 'outcast': |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1022 raise error.Forbidden() |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1023 |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1024 # node access check |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1025 owner = affiliation == 'owner' |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1026 access_model = node.getAccessModel() |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1027 roster = None |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1028 |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1029 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
|
1030 pass |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1031 elif access_model == const.VAL_AMODEL_PRESENCE: |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1032 yield self.checkPresenceSubscription(node, requestor) |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1033 elif access_model == const.VAL_AMODEL_PUBLISHER_ROSTER: |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1034 # 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
|
1035 yield self.checkRosterGroups(node, requestor) |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1036 elif access_model == const.VAL_AMODEL_WHITELIST: |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1037 yield self.checkNodeAffiliations(node, requestor) |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1038 else: |
414 | 1039 raise Exception("Unknown access_model") |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1040 |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1041 defer.returnValue((affiliation, owner, roster, access_model)) |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1042 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1043 async def getItemsIds( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1044 self, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1045 nodeIdentifier: str, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1046 requestor: jid.JID, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1047 authorized_groups: Optional[List[str]], |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1048 unrestricted: bool, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1049 maxItems: Optional[int] = None, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1050 ext_data: Optional[dict] = None, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1051 pep: bool = False, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1052 recipient: Optional[jid.JID] = None |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1053 ) -> List[str]: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1054 """Retrieve IDs of items from a nodeIdentifier |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1055 |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1056 Requestor permission is checked before retrieving items IDs |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1057 """ |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1058 # FIXME: items access model are not checked |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1059 # TODO: check items access model |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1060 node = await self.storage.getNode(nodeIdentifier, pep, recipient) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1061 await self.checkNodeAccess(node, requestor) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1062 ids = await node.getItemsIds( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1063 authorized_groups, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1064 unrestricted, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1065 maxItems, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1066 ext_data |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1067 ) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1068 return ids |
346 | 1069 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1070 def getItems(self, nodeIdentifier, requestor, recipient, maxItems=None, |
278 | 1071 itemIdentifiers=None, ext_data=None): |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1072 d = defer.ensureDeferred( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1073 self.getItemsData( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1074 nodeIdentifier, requestor, recipient, maxItems, itemIdentifiers, ext_data |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1075 ) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1076 ) |
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
|
1077 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
|
1078 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
|
1079 |
467
d86e0f8a1405
privilege: store roster cache in database:
Goffi <goffi@goffi.org>
parents:
464
diff
changeset
|
1080 async def getOwnerRoster(self, node, owners=None): |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1081 # 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
|
1082 if owners is None: |
467
d86e0f8a1405
privilege: store roster cache in database:
Goffi <goffi@goffi.org>
parents:
464
diff
changeset
|
1083 owners = await node.getOwners() |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1084 |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1085 if len(owners) != 1: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1086 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
|
1087 return |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1088 |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1089 owner_jid = owners[0] |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1090 |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1091 try: |
467
d86e0f8a1405
privilege: store roster cache in database:
Goffi <goffi@goffi.org>
parents:
464
diff
changeset
|
1092 roster = await self.privilege.getRoster(owner_jid) |
471
ed9e12701e0f
backend: return empty roster when `NotAllowedError` is raised in `getOwnerRoster`:
Goffi <goffi@goffi.org>
parents:
467
diff
changeset
|
1093 except error.NotAllowedError: |
ed9e12701e0f
backend: return empty roster when `NotAllowedError` is raised in `getOwnerRoster`:
Goffi <goffi@goffi.org>
parents:
467
diff
changeset
|
1094 return |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1095 except Exception as e: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1096 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
|
1097 owner_jid = owner_jid.full(), |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1098 msg = e)) |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1099 return |
467
d86e0f8a1405
privilege: store roster cache in database:
Goffi <goffi@goffi.org>
parents:
464
diff
changeset
|
1100 return roster |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1101 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1102 async 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
|
1103 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
|
1104 """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
|
1105 if maxItems == 0: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1106 log.msg("WARNING: maxItems=0 on items retrieval") |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1107 return [] |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1108 |
278 | 1109 if ext_data is None: |
1110 ext_data = {} | |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1111 node = await 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
|
1112 try: |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1113 affiliation, owner, roster, access_model = await self.checkNodeAccess(node, requestor) |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1114 except error.NotLeafNodeError: |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1115 return [] |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1116 |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1117 # 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
|
1118 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1119 if owner: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1120 # 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
|
1121 requestor_groups = None |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1122 else: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1123 if roster is None: |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1124 # FIXME: publisher roster should be used, not owner |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1125 roster = await self.getOwnerRoster(node) |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1126 if roster is None: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1127 roster = {} |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1128 roster_item = roster.get(requestor.userhostJID()) |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1129 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
|
1130 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1131 if itemIdentifiers: |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1132 items_data = await node.getItemsById(requestor_groups, owner, itemIdentifiers) |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1133 else: |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1134 items_data = await 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
|
1135 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1136 if owner: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1137 # 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
|
1138 for item_data in items_data: |
318 | 1139 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
|
1140 pass |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1141 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
|
1142 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
|
1143 access = data_form.Field(None, const.OPT_ACCESS_MODEL, value=const.VAL_AMODEL_PUBLISHER_ROSTER) |
318 | 1144 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
|
1145 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
|
1146 form.addField(allowed) |
318 | 1147 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
|
1148 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
|
1149 #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
|
1150 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
|
1151 else: |
25a1dc7181cc
full items, with item-configuration, are returned if items are asked by the owner
Goffi <goffi@goffi.org>
parents:
251
diff
changeset
|
1152 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
|
1153 |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1154 schema = node.getSchema() |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1155 if schema is not None: |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1156 self.filterItemsWithSchema(items_data, schema, owner) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1157 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1158 await self._items_rsm( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1159 items_data, node, requestor_groups, owner, itemIdentifiers, ext_data) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1160 return items_data |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1161 |
315
720d73e30bf7
backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents:
314
diff
changeset
|
1162 def _setCount(self, value, response): |
720d73e30bf7
backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents:
314
diff
changeset
|
1163 response.count = value |
720d73e30bf7
backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents:
314
diff
changeset
|
1164 |
318 | 1165 def _setIndex(self, value, response, adjust): |
1166 """Set index in RSM response | |
1167 | |
1168 @param value(int): value of the reference index (i.e. before or after item) | |
1169 @param response(RSMResponse): response instance to fill | |
1170 @param adjust(int): adjustement term (i.e. difference between reference index and first item of the result) | |
1171 """ | |
1172 response.index = value + adjust | |
315
720d73e30bf7
backend (rsm): replaced setattr use by methods for better performances
Goffi <goffi@goffi.org>
parents:
314
diff
changeset
|
1173 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1174 async def _items_rsm(self, items_data, node, authorized_groups, owner, |
318 | 1175 itemIdentifiers, ext_data): |
1176 # FIXME: move this to a separate module | |
1177 # TODO: Index can be optimized by keeping a cache of the last RSM request | |
1178 # An other optimisation would be to look for index first and use it as offset | |
1179 try: | |
1180 rsm_request = ext_data['rsm'] | |
1181 except KeyError: | |
1182 # No RSM in this request, nothing to do | |
1183 return items_data | |
1184 | |
1185 if itemIdentifiers: | |
1186 log.msg("WARNING, itemIdentifiers used with RSM, ignoring the RSM part") | |
1187 return items_data | |
1188 | |
278 | 1189 response = rsm.RSMResponse() |
1190 | |
318 | 1191 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
|
1192 d_count.addCallback(self._setCount, response) |
278 | 1193 d_list = [d_count] |
1194 | |
318 | 1195 if items_data: |
1196 response.first = items_data[0].item['id'] | |
1197 response.last = items_data[-1].item['id'] | |
1198 | |
1199 # index handling | |
1200 if rsm_request.index is not None: | |
1201 response.index = rsm_request.index | |
1202 elif rsm_request.before: | |
1203 # The last page case (before == '') is managed in render method | |
1204 d_index = node.getItemsIndex(rsm_request.before, authorized_groups, owner, ext_data) | |
1205 d_index.addCallback(self._setIndex, response, -len(items_data)) | |
278 | 1206 d_list.append(d_index) |
318 | 1207 elif rsm_request.after is not None: |
1208 d_index = node.getItemsIndex(rsm_request.after, authorized_groups, owner, ext_data) | |
1209 d_index.addCallback(self._setIndex, response, 1) | |
1210 d_list.append(d_index) | |
1211 else: | |
1212 # the first page was requested | |
1213 response.index = 0 | |
278 | 1214 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1215 |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1216 await defer.DeferredList(d_list) |
278 | 1217 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1218 if rsm_request.before == '': |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1219 # the last page was requested |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1220 response.index = response.count - len(items_data) |
278 | 1221 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1222 items_data.append(container.ItemData(response.toElement())) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1223 |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1224 return items_data |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1225 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1226 async def retractItem(self, nodeIdentifier, itemIdentifiers, requestor, notify, pep, recipient): |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1227 node = await self.storage.getNode(nodeIdentifier, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1228 node, affiliation = await _getAffiliation(node, requestor) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1229 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1230 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
|
1231 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1232 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
|
1233 raise error.NodeNotPersistent() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1234 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1235 # 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
|
1236 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1237 if affiliation not in ['owner', 'publisher']: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1238 # the requestor doesn't have right to retract on the whole node |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1239 # we check if he is a publisher for all items he wants to retract |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1240 # and forbid the retraction else. |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1241 publishers_map = await node.getItemsPublishers(itemIdentifiers) |
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
|
1242 # 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
|
1243 if (any((requestor.userhostJID() != publisher.userhostJID() |
414 | 1244 for publisher in publishers_map.values())) |
388
1c13ba86a421
backend: allow admins to retract any item
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
1245 and not self.isAdmin(requestor) |
1c13ba86a421
backend: allow admins to retract any item
Goffi <goffi@goffi.org>
parents:
387
diff
changeset
|
1246 ): |
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
|
1247 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
|
1248 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1249 items_data = await node.getItemsById(None, True, itemIdentifiers) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1250 # Remove the items and keep only actually removed ones in items_data |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1251 removed = await node.removeItems(itemIdentifiers) |
437
454f61a32427
backend: fixed item retractation notification
Goffi <goffi@goffi.org>
parents:
431
diff
changeset
|
1252 retracted_items_data = [ |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1253 item_data for item_data in items_data if item_data.item["id"] in removed |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1254 ] |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1255 if nodeIdentifier.startswith(const.FDP_TEMPLATE_PREFIX): |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1256 app_ns = nodeIdentifier[len(const.FDP_TEMPLATE_PREFIX):] |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1257 submitted_node_id = f"{const.FDP_SUBMITTED_PREFIX}{app_ns}" |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1258 submitted_node = await self.storage.getNode(submitted_node_id, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1259 schema_items = await node.getItems([], True, maxItems=1) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1260 if not schema_items: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1261 # no more schema, we need to remove it from submitted node |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1262 submitted_node = await self._getFDPSubmittedNode( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1263 nodeIdentifier, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1264 if submitted_node is not None: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1265 submitted_node.setSchema(None) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1266 else: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1267 # not all items have been removed from the FDP template node, we check |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1268 # if the last one correspond to current submitted node schema, and if not, |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1269 # we update it. |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1270 current_schema = next(schema_items[0].item.elements( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1271 data_form.NS_X_DATA, 'x')) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1272 if current_schema == node.schema: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1273 submitted_node = await self._getFDPSubmittedNode( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1274 nodeIdentifier, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1275 if submitted_node is not None: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1276 submitted_node.setSchema(current_schema) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1277 |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1278 if notify: |
437
454f61a32427
backend: fixed item retractation notification
Goffi <goffi@goffi.org>
parents:
431
diff
changeset
|
1279 self._doNotifyRetraction(retracted_items_data, node, pep, recipient) |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1280 |
437
454f61a32427
backend: fixed item retractation notification
Goffi <goffi@goffi.org>
parents:
431
diff
changeset
|
1281 return [r.item for r in retracted_items_data] |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1282 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1283 def _doNotifyRetraction(self, items_data, node, pep, recipient): |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1284 self.dispatch({'items_data': items_data, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1285 'node': node, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1286 'pep': pep, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1287 'recipient': recipient}, |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1288 '//event/pubsub/retract') |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1289 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1290 async def purgeNode(self, nodeIdentifier, requestor, pep, recipient): |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1291 node = await self.storage.getNode(nodeIdentifier, pep, recipient) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1292 node, affiliation = await _getAffiliation(node, requestor) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1293 persistItems = node.getConfiguration()[const.OPT_PERSIST_ITEMS] |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1294 |
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
|
1295 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
|
1296 raise error.Forbidden() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1297 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1298 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
|
1299 raise error.NodeNotPersistent() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1300 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1301 await node.purge() |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1302 |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1303 subscribers = await self.getSubscribers(nodeIdentifier, pep, recipient) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1304 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1305 # now we can send notifications |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1306 self.dispatch( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1307 { |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1308 'node': node, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1309 'pep': pep, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1310 'recipient': recipient, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1311 'subscribers': subscribers, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1312 }, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1313 '//event/pubsub/purge' |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1314 ) |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1315 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1316 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
|
1317 def cb(subscriptions): |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1318 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
|
1319 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1320 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
|
1321 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
|
1322 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
|
1323 return d |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1324 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1325 async def deleteNode( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1326 self, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1327 nodeIdentifier: str, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1328 requestor: jid.JID, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1329 pep: bool, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1330 recipient: jid.JID, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1331 redirectURI: str = None |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1332 ) -> None: |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1333 node = await self.storage.getNode(nodeIdentifier, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1334 node, affiliation = await _getAffiliation(node, requestor) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1335 |
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
|
1336 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
|
1337 raise error.Forbidden() |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1338 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1339 # we have to get subscribers (for notifications) before the node is deleted |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1340 subscribers = await self.getSubscribers(nodeIdentifier, pep, recipient) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1341 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1342 await self.storage.deleteNodeByDbId(node.nodeDbId) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1343 |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1344 if node.nodeIdentifier.startswith(const.FDP_TEMPLATE_PREFIX): |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1345 # we need to delete the associated schema |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1346 submitted_node = await self._getFDPSubmittedNode( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1347 node.nodeIdentifier, pep, recipient) |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1348 if submitted_node is not None: |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1349 await submitted_node.setSchema(None) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1350 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1351 # now we can send notifications |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1352 self.dispatch( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1353 { |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1354 'node': node, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1355 'pep': pep, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1356 'recipient': recipient, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1357 'redirectURI': redirectURI, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1358 'subscribers': subscribers, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1359 }, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1360 '//event/pubsub/delete' |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1361 ) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1362 |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1363 |
317
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
1364 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
|
1365 """ |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1366 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
|
1367 """ |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1368 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1369 features = [ |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1370 "config-node", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1371 "create-nodes", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1372 "delete-any", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1373 "delete-nodes", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1374 "item-ids", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1375 "meta-data", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1376 "publish", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1377 "purge-nodes", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1378 "retract-items", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1379 "retrieve-affiliations", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1380 "retrieve-default", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1381 "retrieve-items", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1382 "retrieve-subscriptions", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1383 "subscribe", |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1384 ] |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1385 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1386 discoIdentity = disco.DiscoIdentity('pubsub', |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1387 'service', |
453
1a179ad10125
backend: service name can now be specified with `service_name` parameter
Goffi <goffi@goffi.org>
parents:
452
diff
changeset
|
1388 const.SERVICE_NAME) |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1389 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1390 pubsubService = None |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1391 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1392 _errorMap = { |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1393 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
|
1394 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
|
1395 error.Forbidden: ('forbidden', None, None), |
243
42048e37699e
added experimental roster access_model (use remote_roster)
Goffi <goffi@goffi.org>
parents:
240
diff
changeset
|
1396 error.NotAuthorized: ('not-authorized', None, None), |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1397 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
|
1398 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
|
1399 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
|
1400 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
|
1401 'unsupported', |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1402 'instant-nodes'), |
171
bc269696ef42
Reply with the correct error condition on subscription when not subscribed.
Ralph Meijer <ralphm@ik.nu>
parents:
169
diff
changeset
|
1403 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
|
1404 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
|
1405 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
|
1406 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
|
1407 'unsupported', |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1408 'persistent-node'), |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1409 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
|
1410 error.NoCollections: ('feature-not-implemented', |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1411 'unsupported', |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1412 'collections'), |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1413 error.NoPublishing: ('feature-not-implemented', |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1414 'unsupported', |
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1415 'publish'), |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1416 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
|
1417 } |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1418 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1419 def __init__(self, backend): |
317
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
1420 pubsub.PubSubResource.__init__(self) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1421 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1422 self.backend = backend |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1423 self.hideNodes = False |
153 | 1424 |
453
1a179ad10125
backend: service name can now be specified with `service_name` parameter
Goffi <goffi@goffi.org>
parents:
452
diff
changeset
|
1425 self.__class__.discoIdentity.name = backend.config["service_name"] |
1a179ad10125
backend: service name can now be specified with `service_name` parameter
Goffi <goffi@goffi.org>
parents:
452
diff
changeset
|
1426 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1427 self.backend.registerPublishNotifier(self._notifyPublish) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1428 self.backend.registerRetractNotifier(self._notifyRetract) |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1429 self.backend.registerDeleteNotifier(self._notifyDelete) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1430 self.backend.registerPurgeNotifier(self._notifyPurge) |
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
|
1431 |
228 | 1432 if self.backend.supportsAutoCreate(): |
1433 self.features.append("auto-create") | |
1434 | |
363
a98b3d52c2ff
added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents:
358
diff
changeset
|
1435 if self.backend.supportsPublishOptions(): |
a98b3d52c2ff
added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents:
358
diff
changeset
|
1436 self.features.append("publish-options") |
a98b3d52c2ff
added missing #publish-options in disco features
Arnaud Joset <info@agayon.be>
parents:
358
diff
changeset
|
1437 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1438 if self.backend.supportsInstantNodes(): |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1439 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
|
1440 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1441 if self.backend.supportsOutcastAffiliation(): |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1442 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
|
1443 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1444 if self.backend.supportsPersistentItems(): |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1445 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
|
1446 |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1447 if self.backend.supportsPublisherAffiliation(): |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1448 self.features.append("publisher-affiliation") |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1449 |
250 | 1450 if self.backend.supportsGroupBlog(): |
1451 self.features.append("groupblog") | |
1452 | |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1453 # 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
|
1454 # examples but it's necessary for microblogging comments (see XEP-0277) |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1455 if self.backend.supportsPublishModel(): |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1456 self.features.append("publish_model") |
260 | 1457 |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1458 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
|
1459 """ 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
|
1460 |
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1461 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
|
1462 """ |
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1463 # 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
|
1464 |
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1465 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
|
1466 if item_config: |
394
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
1467 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
|
1468 new_item.addChild(item_config.toElement()) |
394
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
1469 return new_item |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
1470 else: |
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
1471 return item |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1472 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1473 def _notifyPublish(self, data: dict) -> defer.Deferred: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1474 return defer.ensureDeferred(self.notifyPublish(data)) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1475 |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1476 async def notifyPublish(self, data: dict) -> None: |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1477 items_data = data['items_data'] |
250 | 1478 node = data['node'] |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1479 pep = data['pep'] |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1480 recipient = data['recipient'] |
250 | 1481 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1482 owners, notifications_filtered = await self._prepareNotify( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1483 items_data, node, data.get('subscription'), pep, recipient |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1484 ) |
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
|
1485 |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1486 # 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
|
1487 # 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
|
1488 # 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
|
1489 # 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
|
1490 |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1491 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
|
1492 notifications_filtered.append( |
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1493 (owner_jid, |
364
8bd8be6815ab
completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents:
363
diff
changeset
|
1494 {pubsub.Subscription(node.nodeIdentifier, |
8bd8be6815ab
completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents:
363
diff
changeset
|
1495 owner_jid, |
8bd8be6815ab
completed docstrings + use short notation for sets
Arnaud Joset <info@agayon.be>
parents:
363
diff
changeset
|
1496 'subscribed')}, |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1497 [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
|
1498 |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1499 if pep: |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1500 self.backend.privilege.notifyPublish( |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1501 recipient, |
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1502 node.nodeIdentifier, |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1503 notifications_filtered |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1504 ) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1505 |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1506 else: |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1507 self.pubsubService.notifyPublish( |
340
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1508 self.serviceJID, |
567e486bce24
backend (notifications): use inline callbacks in _notifyPublish + added PEP data in _prepareNotify
Goffi <goffi@goffi.org>
parents:
339
diff
changeset
|
1509 node.nodeIdentifier, |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1510 notifications_filtered) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1511 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1512 def _notifyRetract(self, data: dict) -> defer.Deferred: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1513 return defer.ensureDeferred(self.notifyRetract(data)) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1514 |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1515 async def notifyRetract(self, data: dict) -> None: |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1516 items_data = data['items_data'] |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1517 node = data['node'] |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1518 pep = data['pep'] |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1519 recipient = data['recipient'] |
251
0a7d43b3dad6
owner is now notified of items published
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
1520 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1521 owners, notifications_filtered = await self._prepareNotify( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1522 items_data, node, data.get('subscription'), pep, recipient |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1523 ) |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1524 |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1525 #we add the owners |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1526 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1527 for owner_jid in owners: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1528 notifications_filtered.append( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1529 (owner_jid, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1530 {pubsub.Subscription(node.nodeIdentifier, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1531 owner_jid, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1532 'subscribed')}, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1533 [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
|
1534 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1535 if pep: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1536 return self.backend.privilege.notifyRetract( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1537 recipient, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1538 node.nodeIdentifier, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1539 notifications_filtered) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1540 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1541 else: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1542 return self.pubsubService.notifyRetract( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1543 self.serviceJID, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1544 node.nodeIdentifier, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1545 notifications_filtered) |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1546 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1547 async def _prepareNotify( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1548 self, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1549 items_data: Tuple[domish.Element, str, dict], |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1550 node, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1551 subscription: Optional[pubsub.Subscription] = None, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1552 pep: bool = False, |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1553 recipient: Optional[jid.JID] = None |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1554 ) -> Tuple: |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1555 """Do a bunch of permissions check and filter notifications |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1556 |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1557 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
|
1558 it must be added by the calling method |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1559 @param items_data: must contain: |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1560 - item |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1561 - access_model |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1562 - access_list (dict as returned getItemsById, or item_config) |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1563 @param node(LeafNode): node hosting the items |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1564 @param subscription: TODO |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1565 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1566 @return: will contain: |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1567 - notifications_filtered |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1568 - node_owner_jid |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1569 - items_data |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1570 """ |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1571 if subscription is None: |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1572 notifications = await 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
|
1573 else: |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1574 notifications = [(subscription.subscriber, [subscription], items_data)] |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1575 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1576 if ((pep |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1577 and node.getConfiguration()[const.OPT_ACCESS_MODEL] in ('open', 'presence') |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1578 )): |
343
ff8aff4c9b79
backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents:
341
diff
changeset
|
1579 # 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
|
1580 explicit_subscribers = {subscriber for subscriber, _, _ in notifications} |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1581 auto_subscribers = await self.backend.privilege.getAutoSubscribers( |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1582 recipient, node.nodeIdentifier, explicit_subscribers |
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1583 ) |
343
ff8aff4c9b79
backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents:
341
diff
changeset
|
1584 for sub_jid in auto_subscribers: |
ff8aff4c9b79
backend, psql: implemented notifications for auto subscribers in PEP:
Goffi <goffi@goffi.org>
parents:
341
diff
changeset
|
1585 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
|
1586 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
|
1587 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1588 owners = await node.getOwners() |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1589 owner_roster = None |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1590 |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1591 # 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
|
1592 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1593 #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
|
1594 notifications_filtered = [] |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1595 schema = node.getSchema() |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1596 |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1597 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
|
1598 subscriber_bare = subscriber.userhostJID() |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1599 if subscriber_bare in owners: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1600 # 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
|
1601 # 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
|
1602 continue |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1603 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
|
1604 |
353
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1605 if schema is not None: |
394
dc83b1d837cf
backend: fixed recursion error on getFullItem:
Goffi <goffi@goffi.org>
parents:
392
diff
changeset
|
1606 # 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
|
1607 # 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
|
1608 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
|
1609 self.backend.filterItemsWithSchema(items_data, schema, False) |
7c5d85c6fb3a
backend: enforce schema on get/publish and notifications
Goffi <goffi@goffi.org>
parents:
352
diff
changeset
|
1610 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1611 for item_data in items_data: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1612 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
|
1613 access_list = item_data.config |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1614 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
|
1615 allowed_items.append(item) |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1616 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
|
1617 if owner_roster is None: |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1618 # FIXME: publisher roster should be used, not owner |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1619 owner_roster= await self.backend.getOwnerRoster(node, owners) |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1620 if owner_roster is None: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1621 owner_roster = {} |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1622 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
|
1623 continue |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1624 #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
|
1625 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
|
1626 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
|
1627 allowed_items.append(item) |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1628 else: #unknown access_model |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1629 # TODO: white list access |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1630 raise NotImplementedError |
251
0a7d43b3dad6
owner is now notified of items published
Goffi <goffi@goffi.org>
parents:
250
diff
changeset
|
1631 |
330
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1632 if allowed_items: |
82d1259b3e36
backend, pgsql storage: better items/notification handling, various fixes:
Goffi <goffi@goffi.org>
parents:
320
diff
changeset
|
1633 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
|
1634 |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1635 return (owners, notifications_filtered) |
250 | 1636 |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1637 async def _aNotifyDelete(self, data): |
261
65d4fed44edf
fixed notifications (a key was missing in data in some cases)
Goffi <goffi@goffi.org>
parents:
260
diff
changeset
|
1638 nodeIdentifier = data['node'].nodeIdentifier |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1639 pep = data['pep'] |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1640 recipient = data['recipient'] |
209
7f3ffb7a1a9e
Add support for node deletion with redirect.
Ralph Meijer <ralphm@ik.nu>
parents:
206
diff
changeset
|
1641 redirectURI = data.get('redirectURI', None) |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1642 subscribers = data['subscribers'] |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1643 if pep: |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1644 self.backend.privilege.notifyDelete( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1645 recipient, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1646 nodeIdentifier, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1647 subscribers, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1648 redirectURI |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1649 ) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1650 else: |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1651 self.pubsubService.notifyDelete( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1652 self.serviceJID, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1653 nodeIdentifier, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1654 subscribers, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1655 redirectURI |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1656 ) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1657 |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1658 def _notifyDelete(self, data): |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1659 d = defer.ensureDeferred(self._aNotifyDelete(data)) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1660 d.addErrback(log.err) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1661 |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1662 async def _aNotifyPurge(self, data): |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1663 nodeIdentifier = data['node'].nodeIdentifier |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1664 pep = data['pep'] |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1665 recipient = data['recipient'] |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1666 subscribers = data['subscribers'] |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1667 if pep: |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1668 self.backend.privilege.notifyPurge( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1669 recipient, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1670 nodeIdentifier, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1671 subscribers, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1672 ) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1673 else: |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1674 self.pubsubService.notifyPurge( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1675 self.serviceJID, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1676 nodeIdentifier, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1677 subscribers, |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1678 ) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1679 |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1680 def _notifyPurge(self, data): |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1681 d = defer.ensureDeferred(self._aNotifyPurge(data)) |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1682 d.addErrback(log.err) |
174
79d451d186b1
Send out node deletion notifications.
Ralph Meijer <ralphm@ik.nu>
parents:
172
diff
changeset
|
1683 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1684 def _mapErrors(self, failure): |
414 | 1685 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
|
1686 |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1687 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
|
1688 msg = failure.value.msg |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1689 |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1690 if pubsubCondition: |
317
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
1691 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
|
1692 else: |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1693 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
|
1694 |
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1695 raise exc |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1696 |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1697 async def _getInfo( |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1698 self, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1699 requestor: jid.JID, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1700 service: jid.JID, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1701 nodeIdentifier: str, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1702 pep: bool = False, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1703 recipient: Optional[jid.JID] = None |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1704 ) -> Optional[dict]: |
288
073161f6f143
namespace delegation: disco nesting management
Goffi <goffi@goffi.org>
parents:
285
diff
changeset
|
1705 if not requestor.resource: |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1706 # this avoid error when getting a disco request from server during namespace |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1707 # delegation |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1708 return None |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1709 info = {} |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1710 try: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1711 info["type"] = await self.backend.getNodeType(nodeIdentifier, pep, recipient) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1712 info["meta-data"] = await self.backend.getNodeMetaData( |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1713 nodeIdentifier, pep, recipient |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1714 ) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1715 except error.NodeNotFound: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1716 info["meta-data"] = None |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1717 return None |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1718 except failure.Failure as e: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1719 self._mapErrors(e) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1720 except Exception as e: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1721 self._mapErrors(failure.Failure(e)) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1722 else: |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1723 return info |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1724 |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1725 def getInfo(self, requestor, service, nodeIdentifier): |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1726 try: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1727 pep = service.delegated |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1728 except AttributeError: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1729 pep = False |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1730 recipient = None |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1731 else: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1732 recipient = service if pep else None |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1733 return defer.ensureDeferred( |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1734 self._getInfo( |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1735 requestor, service, nodeIdentifier, pep, recipient |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1736 ) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1737 ) |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1738 |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1739 async def _getNodes(self, requestor, service, nodeIdentifier): |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1740 """return nodes for disco#items |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1741 |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1742 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
|
1743 else Pubsub/PEP items will be returned |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1744 (according to what requestor can access) |
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1745 """ |
346 | 1746 try: |
1747 pep = service.pep | |
1748 except AttributeError: | |
1749 pep = False | |
198
e404775b12df
Change naming and spacing conventions to match Twisted's.
Ralph Meijer <ralphm@ik.nu>
parents:
196
diff
changeset
|
1750 |
464
391aa65f72b2
backend: restored `--hide-nodes` effect
Goffi <goffi@goffi.org>
parents:
463
diff
changeset
|
1751 if self.hideNodes or service.resource: |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1752 return [] |
346 | 1753 |
1754 if nodeIdentifier: | |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1755 items = await self.backend.getItemsIds( |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1756 nodeIdentifier, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1757 requestor, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1758 [], |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1759 requestor.userhostJID() == service, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1760 None, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1761 None, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1762 pep, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1763 service |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1764 ) |
349
20b82fb8de02
backend: check nodes/items permission on disco#items:
Goffi <goffi@goffi.org>
parents:
346
diff
changeset
|
1765 # items must be set as name, not node |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1766 return [(None, item) for item in items] |
346 | 1767 else: |
459
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1768 try: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1769 return await self.backend.getNodes( |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1770 requestor.userhostJID(), |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1771 pep, |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1772 service |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1773 ) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1774 except failure.Failure as e: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1775 self._mapErrors(e) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1776 except Exception as e: |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1777 self._mapErrors(failure.Failure(e)) |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1778 |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1779 def getNodes(self, requestor, service, nodeIdentifier): |
cebcb7f56889
backend, delegation: update to XEP-0355 v0.5 (namespace bump) + disco:
Goffi <goffi@goffi.org>
parents:
455
diff
changeset
|
1780 return defer.ensureDeferred(self._getNodes(requestor, service, nodeIdentifier)) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1781 |
205
e6b710bf2b24
Adjust node configuration to match wokkel API changes.
Ralph Meijer <ralphm@ik.nu>
parents:
202
diff
changeset
|
1782 def getConfigurationOptions(self): |
206
274a45d2a5ab
Implement root collection that includes all leaf nodes.
Ralph Meijer <ralphm@ik.nu>
parents:
205
diff
changeset
|
1783 return self.backend.nodeOptions |
205
e6b710bf2b24
Adjust node configuration to match wokkel API changes.
Ralph Meijer <ralphm@ik.nu>
parents:
202
diff
changeset
|
1784 |
228 | 1785 def _publish_errb(self, failure, request): |
1786 if failure.type == error.NodeNotFound and self.backend.supportsAutoCreate(): | |
463
f520ac3164b0
privilege: improvment on last message sending on presence with `+notify`:
Goffi <goffi@goffi.org>
parents:
461
diff
changeset
|
1787 print(f"Auto-creating node {request.nodeIdentifier}") |
228 | 1788 d = self.backend.createNode(request.nodeIdentifier, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1789 request.sender, |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1790 request.options, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1791 pep=self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1792 recipient=request.recipient) |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1793 d.addCallback( |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1794 lambda __, request: defer.ensureDeferred(self.backend.publish( |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1795 request.nodeIdentifier, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1796 request.items, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1797 request.sender, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1798 request.options, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1799 self._isPep(request), |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1800 request.recipient, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1801 )), |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1802 request, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1803 ) |
228 | 1804 return d |
1805 | |
240
70c8bb90d75f
added access_model to config, default to 'open'
Goffi <goffi@goffi.org>
parents:
237
diff
changeset
|
1806 return failure |
205
e6b710bf2b24
Adjust node configuration to match wokkel API changes.
Ralph Meijer <ralphm@ik.nu>
parents:
202
diff
changeset
|
1807 |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1808 def _isPep(self, request): |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1809 try: |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1810 return request.delegated |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1811 except AttributeError: |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1812 return False |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1813 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1814 def publish(self, request): |
419
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1815 d = defer.ensureDeferred(self.backend.publish( |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1816 request.nodeIdentifier, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1817 request.items, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1818 request.sender, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1819 request.options, |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1820 self._isPep(request), |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1821 request.recipient |
794593086517
backend: publish-options implementation:
Goffi <goffi@goffi.org>
parents:
415
diff
changeset
|
1822 )) |
228 | 1823 d.addErrback(self._publish_errb, request) |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1824 return d.addErrback(self._mapErrors) |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1825 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1826 def subscribe(self, request): |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1827 d = self.backend.subscribe(request.nodeIdentifier, |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1828 request.subscriber, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1829 request.sender, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1830 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1831 request.recipient) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1832 return d.addErrback(self._mapErrors) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1833 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1834 def unsubscribe(self, request): |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1835 d = self.backend.unsubscribe(request.nodeIdentifier, |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1836 request.subscriber, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1837 request.sender, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1838 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1839 request.recipient) |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1840 return d.addErrback(self._mapErrors) |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1841 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1842 def subscriptions(self, request): |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1843 d = self.backend.getSubscriptions(request.sender, |
357
1167e48e5f52
handle single node on subscriptions request
Goffi <goffi@goffi.org>
parents:
355
diff
changeset
|
1844 request.nodeIdentifier, |
354
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1845 self._isPep(request), |
18b983fe9e1b
backend: added "presence" access_model:
Goffi <goffi@goffi.org>
parents:
353
diff
changeset
|
1846 request.recipient) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1847 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
|
1848 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1849 def affiliations(self, request): |
331 | 1850 """Retrieve affiliation for normal entity (cf. XEP-0060 §5.7) |
1851 | |
1852 retrieve all node where this jid is affiliated | |
1853 """ | |
1854 d = self.backend.getAffiliations(request.sender, | |
1855 request.nodeIdentifier, | |
1856 self._isPep(request), | |
1857 request.recipient) | |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1858 return d.addErrback(self._mapErrors) |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1859 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1860 def create(self, request): |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1861 d = self.backend.createNode(request.nodeIdentifier, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1862 request.sender, request.options, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1863 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1864 request.recipient) |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1865 return d.addErrback(self._mapErrors) |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1866 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1867 def default(self, request): |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1868 d = self.backend.getDefaultConfiguration(request.nodeType, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1869 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1870 request.sender) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1871 return d.addErrback(self._mapErrors) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1872 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1873 def configureGet(self, request): |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1874 d = self.backend.getNodeConfiguration(request.nodeIdentifier, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1875 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1876 request.recipient) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1877 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
|
1878 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1879 def configureSet(self, request): |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1880 d = self.backend.setNodeConfiguration(request.nodeIdentifier, |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1881 request.options, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1882 request.sender, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1883 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1884 request.recipient) |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1885 return d.addErrback(self._mapErrors) |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1886 |
331 | 1887 def affiliationsGet(self, request): |
1888 """Retrieve affiliations for owner (cf. XEP-0060 §8.9.1) | |
1889 | |
1890 retrieve all affiliations for a node | |
1891 """ | |
1892 d = self.backend.getAffiliationsOwner(request.nodeIdentifier, | |
1893 request.sender, | |
1894 self._isPep(request), | |
1895 request.recipient) | |
1896 return d.addErrback(self._mapErrors) | |
1897 | |
1898 def affiliationsSet(self, request): | |
1899 d = self.backend.setAffiliationsOwner(request.nodeIdentifier, | |
1900 request.sender, | |
1901 request.affiliations, | |
1902 self._isPep(request), | |
1903 request.recipient) | |
1904 return d.addErrback(self._mapErrors) | |
1905 | |
341
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1906 def subscriptionsGet(self, request): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1907 """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
|
1908 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1909 retrieve all affiliations for a node |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1910 """ |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1911 d = self.backend.getSubscriptionsOwner(request.nodeIdentifier, |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1912 request.sender, |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1913 self._isPep(request), |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1914 request.recipient) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1915 return d.addErrback(self._mapErrors) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1916 |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1917 def subscriptionsSet(self, request): |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1918 d = self.backend.setSubscriptionsOwner(request.nodeIdentifier, |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1919 request.sender, |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1920 request.subscriptions, |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1921 self._isPep(request), |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1922 request.recipient) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1923 return d.addErrback(self._mapErrors) |
b49f75a26156
backend, pgsql: implemented subscriptionsGet and subscriptionsSet
Goffi <goffi@goffi.org>
parents:
340
diff
changeset
|
1924 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1925 def items(self, request): |
278 | 1926 ext_data = {} |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1927 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
|
1928 if request.rsm.max < 0: |
ded7657b03fa
backend: send a BadRequest if RSM max is negative
Goffi <goffi@goffi.org>
parents:
375
diff
changeset
|
1929 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
|
1930 ext_data['rsm'] = request.rsm |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1931 try: |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1932 ext_data['pep'] = request.delegated |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1933 except AttributeError: |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1934 pass |
375
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1935 ext_data['order_by'] = request.orderBy or [] |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1936 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
|
1937 request.sender, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1938 request.recipient, |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1939 request.maxItems, |
278 | 1940 request.itemIdentifiers, |
1941 ext_data) | |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1942 return d.addErrback(self._mapErrors) |
29
d4fc29bb5381
Define interfaces of blocks of functionality.
Ralph Meijer <ralphm@ik.nu>
parents:
24
diff
changeset
|
1943 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1944 def retract(self, request): |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1945 d = defer.ensureDeferred( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1946 self.backend.retractItem(request.nodeIdentifier, |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1947 request.itemIdentifiers, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1948 request.sender, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1949 request.notify, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1950 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1951 request.recipient) |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1952 ) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1953 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
|
1954 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1955 def purge(self, request): |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1956 d = defer.ensureDeferred( |
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1957 self.backend.purgeNode(request.nodeIdentifier, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1958 request.sender, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1959 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1960 request.recipient) |
455
0b5233981671
backend: fix `delete` notification + add `purge` notification
Goffi <goffi@goffi.org>
parents:
453
diff
changeset
|
1961 ) |
167
ef22e4150caa
Move protocol implementations (pubsub, disco, forms) to and depend on wokkel.
Ralph Meijer <ralphm@ik.nu>
parents:
159
diff
changeset
|
1962 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
|
1963 |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1964 def delete(self, request): |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1965 d = defer.ensureDeferred( |
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1966 self.backend.deleteNode(request.nodeIdentifier, |
294
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1967 request.sender, |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1968 self._isPep(request), |
df1edebb0466
PEP implementation, draft (huge patch sorry):
Goffi <goffi@goffi.org>
parents:
290
diff
changeset
|
1969 request.recipient) |
431
5e8b8ef5c862
implentation of XEP-0346 (Form Discovery and Publishing):
Goffi <goffi@goffi.org>
parents:
430
diff
changeset
|
1970 ) |
222
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1971 return d.addErrback(self._mapErrors) |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1972 |
698af5d720ad
Reshape Idavoll as a PubSubResource.
Ralph Meijer <ralphm@ik.nu>
parents:
216
diff
changeset
|
1973 components.registerAdapter(PubSubResourceFromBackend, |
317
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
1974 iidavoll.IBackendService, |
34adc4a8aa64
new container module, with an ItemData container:
Goffi <goffi@goffi.org>
parents:
315
diff
changeset
|
1975 iwokkel.IPubSubResource) |
375
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1976 |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1977 |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1978 |
414 | 1979 @implementer(iwokkel.IDisco) |
375
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1980 class ExtraDiscoHandler(XMPPHandler): |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1981 # see comment in twisted/plugins/pubsub.py |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1982 # 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
|
1983 |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1984 def getDiscoInfo(self, requestor, service, nodeIdentifier=''): |
452 | 1985 return [ |
1986 disco.DiscoFeature(rsm.NS_RSM), | |
1987 # cf. https://xmpp.org/extensions/xep-0060.html#subscriber-retrieve-returnsome | |
1988 disco.DiscoFeature(const.NS_PUBSUB_RSM), | |
1989 disco.DiscoFeature(pubsub.NS_ORDER_BY), | |
1990 disco.DiscoFeature(const.NS_FDP) | |
1991 ] | |
375
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1992 |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1993 def getDiscoItems(self, requestor, service, nodeIdentifier=''): |
9a787881b824
implemented Order-By ProtoXEP (MAM + PubSub)
Goffi <goffi@goffi.org>
parents:
369
diff
changeset
|
1994 return [] |