annotate sat_pubsub/backend.py @ 367:a772f7dac930

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