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