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