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