annotate idavoll/pubsub.py @ 110:7043839982ba

Use storage. Fixup some small errors.
author Ralph Meijer <ralphm@ik.nu>
date Fri, 08 Apr 2005 10:17:10 +0000
parents 8d8946e67fcb
children 8527bce09862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
105
8d8946e67fcb Move to Twisted 2.0.
Ralph Meijer <ralphm@ik.nu>
parents: 104
diff changeset
1 from twisted.words.protocols.jabber import component,jid
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
2 from twisted.xish import utility, domish
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
3 from twisted.python import components
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
4 from twisted.internet import defer
105
8d8946e67fcb Move to Twisted 2.0.
Ralph Meijer <ralphm@ik.nu>
parents: 104
diff changeset
5 from zope.interface import implements
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
6
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
7 import backend
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
8 import storage
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
9 import xmpp_error
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
10 import disco
101
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
11 import data_form
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
12
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
13 NS_COMPONENT = 'jabber:component:accept'
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
14 NS_PUBSUB = 'http://jabber.org/protocol/pubsub'
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
15 NS_PUBSUB_EVENT = NS_PUBSUB + '#event'
16
ce3d0db64da1 Implemented basic subscribing.
Ralph Meijer <ralphm@ik.nu>
parents: 12
diff changeset
16 NS_PUBSUB_ERRORS = NS_PUBSUB + '#errors'
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
17 NS_PUBSUB_OWNER = NS_PUBSUB + "#owner"
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
18
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
19 IQ_GET = '/iq[@type="get"]'
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
20 IQ_SET = '/iq[@type="set"]'
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
21 PUBSUB_ELEMENT = '/pubsub[@xmlns="' + NS_PUBSUB + '"]'
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
22 PUBSUB_OWNER_ELEMENT = '/pubsub[@xmlns="' + NS_PUBSUB_OWNER + '"]'
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
23 PUBSUB_GET = IQ_GET + PUBSUB_ELEMENT
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
24 PUBSUB_SET = IQ_SET + PUBSUB_ELEMENT
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
25 PUBSUB_OWNER_GET = IQ_GET + PUBSUB_OWNER_ELEMENT
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
26 PUBSUB_OWNER_SET = IQ_SET + PUBSUB_OWNER_ELEMENT
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
27 PUBSUB_CREATE = PUBSUB_SET + '/create'
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
28 PUBSUB_PUBLISH = PUBSUB_SET + '/publish'
16
ce3d0db64da1 Implemented basic subscribing.
Ralph Meijer <ralphm@ik.nu>
parents: 12
diff changeset
29 PUBSUB_SUBSCRIBE = PUBSUB_SET + '/subscribe'
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
30 PUBSUB_UNSUBSCRIBE = PUBSUB_SET + '/unsubscribe'
7
a8cfb31dc50c Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents: 4
diff changeset
31 PUBSUB_OPTIONS_GET = PUBSUB_GET + '/options'
21
e01bbbfa8a46 Implemented node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 18
diff changeset
32 PUBSUB_OPTIONS_SET = PUBSUB_SET + '/options'
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
33 PUBSUB_CONFIGURE_GET = PUBSUB_OWNER_GET + '/configure'
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
34 PUBSUB_CONFIGURE_SET = PUBSUB_OWNER_SET + '/configure'
60
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
35 PUBSUB_AFFILIATIONS = PUBSUB_GET + '/affiliations'
81
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
36 PUBSUB_ITEMS = PUBSUB_GET + '/items'
85
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
37 PUBSUB_RETRACT = PUBSUB_SET + '/retract'
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
38 PUBSUB_PURGE = PUBSUB_SET + '/purge'
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
39 PUBSUB_DELETE = PUBSUB_SET + '/delete'
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
40
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
41 class Error(Exception):
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
42 pubsub_error = None
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
43 stanza_error = None
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
44 msg = ''
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
45
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
46 class NotImplemented(Error):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
47 stanza_error = 'feature-not-implemented'
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
48
47
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
49 class BadRequest(Error):
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
50 stanza_error = 'bad-request'
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
51
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
52 class OptionsUnavailable(Error):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
53 stanza_error = 'feature-not-implemented'
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
54 pubsub_error = 'subscription-options-unavailable'
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
55
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
56 class NodeNotConfigurable(Error):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
57 stanza_error = 'feature-not-implemented'
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
58 pubsub_error = 'node-not-configurable'
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
59
4
ea195dc1732d Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents: 2
diff changeset
60 error_map = {
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
61 storage.NodeNotFound: ('item-not-found', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
62 storage.NodeExists: ('conflict', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
63
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
64 backend.NotAuthorized: ('not-authorized', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
65 backend.NoPayloadAllowed: ('bad-request', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
66 backend.PayloadExpected: ('bad-request', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
67 backend.NoInstantNodes: ('not-acceptable', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
68 backend.NotImplemented: ('feature-not-implemented', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
69 backend.NotSubscribed: ('not-authorized', 'requestor-not-subscribed'),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
70 backend.InvalidConfigurationOption: ('not-acceptable', None),
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
71 backend.InvalidConfigurationValue: ('not-acceptable', None),
4
ea195dc1732d Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents: 2
diff changeset
72 }
ea195dc1732d Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents: 2
diff changeset
73
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
74 class Service(component.Service):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
75
105
8d8946e67fcb Move to Twisted 2.0.
Ralph Meijer <ralphm@ik.nu>
parents: 104
diff changeset
76 implements(component.IService)
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
77
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
78 def __init__(self, backend):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
79 self.backend = backend
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
80
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
81 def error(self, failure, iq):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
82 try:
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
83 e = failure.trap(Error, *error_map.keys())
81
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
84 except:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
85 failure.printBriefTraceback()
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
86 xmpp_error.error_from_iq(iq, 'internal-server-error')
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
87 return iq
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
88 else:
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
89 if e == Error:
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
90 stanza_error = failure.value.stanza_error
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
91 pubsub_error = failure.value.pubsub_error
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
92 msg = ''
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
93 else:
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
94 stanza_error, pubsub_error = error_map[e]
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
95 msg = failure.value.msg
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
96
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
97 xmpp_error.error_from_iq(iq, stanza_error, msg)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
98 if pubsub_error:
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
99 iq.error.addElement((NS_PUBSUB_ERRORS, pubsub_error))
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
100 return iq
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
101
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
102 def success(self, result, iq):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
103 iq.swapAttributeValues("to", "from")
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
104 iq["type"] = 'result'
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
105 iq.children = []
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
106 if result:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
107 for child in result:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
108 iq.addChild(child)
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
109
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
110 return iq
9
52bd563b7a5d Add disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 7
diff changeset
111
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
112 def handler_wrapper(self, handler, iq):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
113 try:
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
114 d = handler(iq)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
115 except:
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
116 d = defer.fail()
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
117
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
118
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
119 d.addCallback(self.success, iq)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
120 d.addErrback(self.error, iq)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
121 d.addCallback(self.send)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
122 iq.handled = True
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
123
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
124 class ComponentServiceFromService(Service):
12
d45e921a5d2a Return implemented features
Ralph Meijer <ralphm@ik.nu>
parents: 9
diff changeset
125
97
cf918d581da5 Enable admin to hide all nodes when the service is queried using disco items.
Ralph Meijer <ralphm@ik.nu>
parents: 96
diff changeset
126 def __init__(self, backend):
cf918d581da5 Enable admin to hide all nodes when the service is queried using disco items.
Ralph Meijer <ralphm@ik.nu>
parents: 96
diff changeset
127 Service.__init__(self, backend)
cf918d581da5 Enable admin to hide all nodes when the service is queried using disco items.
Ralph Meijer <ralphm@ik.nu>
parents: 96
diff changeset
128 self.hide_nodes = False
cf918d581da5 Enable admin to hide all nodes when the service is queried using disco items.
Ralph Meijer <ralphm@ik.nu>
parents: 96
diff changeset
129
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
130 def get_disco_info(self, node):
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
131 info = []
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
132
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
133 if not node:
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
134 info.append(disco.Identity('pubsub', 'generic',
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
135 'Generic Pubsub Service'))
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
136
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
137 if self.backend.supports_publisher_affiliation():
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
138 info.append(disco.Feature(NS_PUBSUB + "#publisher-affiliation"))
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
139
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
140 if self.backend.supports_outcast_affiliation():
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
141 info.append(disco.Feature(NS_PUBSUB + "#outcast-affiliation"))
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
142
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
143 if self.backend.supports_persistent_items():
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
144 info.append(disco.Feature(NS_PUBSUB + "#persistent-items"))
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
145
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
146 return defer.succeed(info)
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
147 else:
102
f4d725a94202 Fix bug in how errors are handled in disco info request.
Ralph Meijer <ralphm@ik.nu>
parents: 101
diff changeset
148 try:
f4d725a94202 Fix bug in how errors are handled in disco info request.
Ralph Meijer <ralphm@ik.nu>
parents: 101
diff changeset
149 d = self.backend.get_node_type(node)
104
d42327839888 Fix location of errback.
Ralph Meijer <ralphm@ik.nu>
parents: 102
diff changeset
150 d.addCallback(self._add_identity, [], node)
102
f4d725a94202 Fix bug in how errors are handled in disco info request.
Ralph Meijer <ralphm@ik.nu>
parents: 101
diff changeset
151 d.addErrback(lambda _: [])
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
152 except storage.NodeNotFound:
102
f4d725a94202 Fix bug in how errors are handled in disco info request.
Ralph Meijer <ralphm@ik.nu>
parents: 101
diff changeset
153 return defer.succeed([])
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
154 return d
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
155
101
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
156 def _add_identity(self, node_type, result_list, node):
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
157 result_list.append(disco.Identity('pubsub', node_type))
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
158 d = self.backend.get_node_meta_data(node)
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
159 d.addCallback(self._add_meta_data, node_type, result_list)
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
160 return d
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
161
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
162 def _add_meta_data(self, meta_data, node_type, result_list):
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
163 form = data_form.Form(type="result", form_type=NS_PUBSUB + "#meta-data")
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
164 for meta_datum in meta_data:
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
165 form.add_field_single(**meta_datum)
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
166 form.add_field_single("text-single",
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
167 "pubsub#node_type",
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
168 "The type of node (collection or leaf)",
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
169 node_type)
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
170 result_list.append(form)
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
171 return result_list
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
172
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
173 def get_disco_items(self, node):
97
cf918d581da5 Enable admin to hide all nodes when the service is queried using disco items.
Ralph Meijer <ralphm@ik.nu>
parents: 96
diff changeset
174 if node or self.hide_nodes:
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
175 return defer.succeed([])
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
176
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
177 d = self.backend.get_nodes()
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
178 d.addCallback(lambda nodes: [disco.Item(self.parent.jabberId, node)
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
179 for node in nodes])
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
180 return d
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
181
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
182 components.registerAdapter(ComponentServiceFromService, backend.IBackendService, component.IService)
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
183
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
184 class ComponentServiceFromNotificationService(Service):
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
185
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
186 def componentConnected(self, xmlstream):
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
187 self.backend.register_notifier(self.notify)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
188
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
189 def notify(self, object):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
190 node_id = object["node_id"]
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
191 items = object["items"]
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
192 d = self.backend.get_notification_list(node_id, items)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
193 d.addCallback(self._notify, node_id)
7
a8cfb31dc50c Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents: 4
diff changeset
194
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
195 def _notify(self, list, node_id):
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
196 for recipient, items in list:
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
197 self._notify_recipient(recipient, node_id, items)
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
198
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
199 def _notify_recipient(self, recipient, node_id, itemlist):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
200 message = domish.Element((NS_COMPONENT, "message"))
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
201 message["from"] = self.parent.jabberId
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
202 message["to"] = recipient.full()
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
203 event = message.addElement((NS_PUBSUB_EVENT, "event"))
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
204 items = event.addElement("items")
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
205 items["node"] = node_id
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
206 items.children.extend(itemlist)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
207 self.send(message)
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
208
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
209 components.registerAdapter(ComponentServiceFromNotificationService, backend.INotificationService, component.IService)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
210
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
211 class ComponentServiceFromPublishService(Service):
4
ea195dc1732d Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents: 2
diff changeset
212
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
213 def componentConnected(self, xmlstream):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
214 xmlstream.addObserver(PUBSUB_PUBLISH, self.onPublish)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
215
93
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
216 def get_disco_info(self, node):
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
217 info = []
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
218
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
219 if not node:
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
220 info.append(disco.Feature(NS_PUBSUB + "#item-ids"))
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
221
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
222 return defer.succeed(info)
ea3b2410c01c Ignore unsupported configure and option elements.
Ralph Meijer <ralphm@ik.nu>
parents: 90
diff changeset
223
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
224 def onPublish(self, iq):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
225 self.handler_wrapper(self._onPublish, iq)
4
ea195dc1732d Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents: 2
diff changeset
226
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
227 def _onPublish(self, iq):
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
228 try:
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
229 node = iq.pubsub.publish["node"]
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
230 except KeyError:
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
231 raise BadRequest
1
4cc41776b7d7 Initial revision
Ralph Meijer <ralphm@ik.nu>
parents:
diff changeset
232
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
233 items = []
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
234 for child in iq.pubsub.publish.children:
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
235 if child.__class__ == domish.Element and child.name == 'item':
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
236 items.append(child)
7
a8cfb31dc50c Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents: 4
diff changeset
237
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
238 return self.backend.publish(node, items,
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
239 jid.JID(iq["from"]).userhostJID())
21
e01bbbfa8a46 Implemented node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 18
diff changeset
240
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
241 components.registerAdapter(ComponentServiceFromPublishService, backend.IPublishService, component.IService)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
242
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
243 class ComponentServiceFromSubscriptionService(Service):
16
ce3d0db64da1 Implemented basic subscribing.
Ralph Meijer <ralphm@ik.nu>
parents: 12
diff changeset
244
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
245 def componentConnected(self, xmlstream):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
246 xmlstream.addObserver(PUBSUB_SUBSCRIBE, self.onSubscribe)
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
247 xmlstream.addObserver(PUBSUB_UNSUBSCRIBE, self.onUnsubscribe)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
248 xmlstream.addObserver(PUBSUB_OPTIONS_GET, self.onOptionsGet)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
249 xmlstream.addObserver(PUBSUB_OPTIONS_SET, self.onOptionsSet)
58
3e2e0040e3e0 Return support for the pubsub#subscribe feature.
Ralph Meijer <ralphm@ik.nu>
parents: 56
diff changeset
250
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
251 def get_disco_info(self, node):
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
252 info = []
58
3e2e0040e3e0 Return support for the pubsub#subscribe feature.
Ralph Meijer <ralphm@ik.nu>
parents: 56
diff changeset
253
3e2e0040e3e0 Return support for the pubsub#subscribe feature.
Ralph Meijer <ralphm@ik.nu>
parents: 56
diff changeset
254 if not node:
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
255 info.append(disco.Feature(NS_PUBSUB + '#subscribe'))
58
3e2e0040e3e0 Return support for the pubsub#subscribe feature.
Ralph Meijer <ralphm@ik.nu>
parents: 56
diff changeset
256
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
257 return defer.succeed(info)
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
258
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
259 def onSubscribe(self, iq):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
260 self.handler_wrapper(self._onSubscribe, iq)
21
e01bbbfa8a46 Implemented node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 18
diff changeset
261
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
262 def _onSubscribe(self, iq):
48
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
263 try:
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
264 node_id = iq.pubsub.subscribe["node"]
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
265 subscriber = jid.JID(iq.pubsub.subscribe["jid"])
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
266 except KeyError:
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
267 raise BadRequest
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
268
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
269 requestor = jid.JID(iq["from"]).userhostJID()
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
270 d = self.backend.subscribe(node_id, subscriber, requestor)
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
271 d.addCallback(self.return_subscription)
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
272 return d
7
a8cfb31dc50c Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents: 4
diff changeset
273
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
274 def return_subscription(self, result):
60
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
275 reply = domish.Element((NS_PUBSUB, "pubsub"))
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
276 entity = reply.addElement("entity")
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
277 entity["node"] = result["node"]
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
278 entity["jid"] = result["jid"].full()
48
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
279 entity["affiliation"] = result["affiliation"] or 'none'
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
280 entity["subscription"] = result["subscription"]
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
281 return [reply]
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
282
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
283 def onUnsubscribe(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
284 self.handler_wrapper(self._onUnsubscribe, iq)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
285
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
286 def _onUnsubscribe(self, iq):
47
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
287 try:
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
288 node_id = iq.pubsub.unsubscribe["node"]
48
671ead538758 Check for malformed subscription request.
Ralph Meijer <ralphm@ik.nu>
parents: 47
diff changeset
289 subscriber = jid.JID(iq.pubsub.unsubscribe["jid"])
47
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
290 except KeyError:
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
291 raise BadRequest
31eb00734cc5 Check for malformed unsubscribe request.
Ralph Meijer <ralphm@ik.nu>
parents: 38
diff changeset
292
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
293 requestor = jid.JID(iq["from"]).userhostJID()
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
294 return self.backend.unsubscribe(node_id, subscriber, requestor)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
295
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
296 def onOptionsGet(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
297 self.handler_wrapper(self._onOptionsGet, iq)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
298
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
299 def _onOptionsGet(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
300 raise OptionsUnavailable
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
301
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
302 def onOptionsSet(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
303 self.handler_wrapper(self._onOptionsSet, iq)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
304
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
305 def _onOptionsSet(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
306 raise OptionsUnavailable
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
307
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
308 components.registerAdapter(ComponentServiceFromSubscriptionService, backend.ISubscriptionService, component.IService)
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
309
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
310 class ComponentServiceFromNodeCreationService(Service):
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
311
68
a3d67cbab9c4 Return deferreds from getFeatures() and getIdentities().
Ralph Meijer <ralphm@ik.nu>
parents: 60
diff changeset
312 def componentConnected(self, xmlstream):
a3d67cbab9c4 Return deferreds from getFeatures() and getIdentities().
Ralph Meijer <ralphm@ik.nu>
parents: 60
diff changeset
313 xmlstream.addObserver(PUBSUB_CREATE, self.onCreate)
a3d67cbab9c4 Return deferreds from getFeatures() and getIdentities().
Ralph Meijer <ralphm@ik.nu>
parents: 60
diff changeset
314 xmlstream.addObserver(PUBSUB_CONFIGURE_GET, self.onConfigureGet)
a3d67cbab9c4 Return deferreds from getFeatures() and getIdentities().
Ralph Meijer <ralphm@ik.nu>
parents: 60
diff changeset
315 xmlstream.addObserver(PUBSUB_CONFIGURE_SET, self.onConfigureSet)
a3d67cbab9c4 Return deferreds from getFeatures() and getIdentities().
Ralph Meijer <ralphm@ik.nu>
parents: 60
diff changeset
316
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
317 def get_disco_info(self, node):
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
318 info = []
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
319
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
320 if not node:
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
321 info.append(disco.Feature(NS_PUBSUB + "#create-nodes"))
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
322 info.append(disco.Feature(NS_PUBSUB + "#config-node"))
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
323
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
324 if self.backend.supports_instant_nodes():
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
325 info.append(disco.Feature(NS_PUBSUB + "#instant-nodes"))
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
326
73
5d7a924ebddb Reworked disco support.
Ralph Meijer <ralphm@ik.nu>
parents: 68
diff changeset
327 return defer.succeed(info)
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
328
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
329 def onCreate(self, iq):
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
330 self.handler_wrapper(self._onCreate, iq)
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
331
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
332 def _onCreate(self, iq):
56
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
333 node = iq.pubsub.create.getAttribute("node")
55fa890ef60b Match backend's supported_*() methods in getFeatures() of ComponentServiceFromService.
Ralph Meijer <ralphm@ik.nu>
parents: 48
diff changeset
334
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
335 owner = jid.JID(iq["from"]).userhostJID()
23
884268687229 Simplify call chain by mapping incoming requests directly to method
Ralph Meijer <ralphm@ik.nu>
parents: 21
diff changeset
336
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
337 d = self.backend.create_node(node, owner)
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
338 d.addCallback(self._return_create_response, iq)
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
339 return d
2
9701df89c534 First take at notifications
Ralph Meijer <ralphm@ik.nu>
parents: 1
diff changeset
340
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
341 def _return_create_response(self, result, iq):
83
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
342 node_id = iq.pubsub.create.getAttribute("node")
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
343 if not node_id or node_id != result:
60
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
344 reply = domish.Element((NS_PUBSUB, 'pubsub'))
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
345 entity = reply.addElement('create')
83
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
346 entity['node'] = result
60
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
347 return [reply]
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
348
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
349 def onConfigureGet(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
350 self.handler_wrapper(self._onConfigureGet, iq)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
351
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
352 def _onConfigureGet(self, iq):
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
353 try:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
354 node_id = iq.pubsub.configure["node"]
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
355 except KeyError:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
356 raise NodeNotConfigurable
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
357
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
358 d = self.backend.get_node_configuration(node_id)
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
359 d.addCallback(self._return_configuration_response, node_id)
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
360 return d
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
361
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
362 def _return_configuration_response(self, options, node_id):
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
363 reply = domish.Element((NS_PUBSUB_OWNER, "pubsub"))
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
364 configure = reply.addElement("configure")
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
365 if node_id:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
366 configure["node"] = node_id
101
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
367 form = data_form.Form(type="form",
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
368 form_type=NS_PUBSUB + "#node_config")
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
369
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
370 for option in options:
101
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
371 form.add_field_single(**option)
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
372
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
373 form.parent = configure
101
b75fcc554358 Added support for disco info meta data.
Ralph Meijer <ralphm@ik.nu>
parents: 98
diff changeset
374 configure.addChild(form)
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
375
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
376 return [reply]
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
377
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
378 def onConfigureSet(self, iq):
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
379 self.handler_wrapper(self._onConfigureSet, iq)
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
380
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
381 def _onConfigureSet(self, iq):
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
382 try:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
383 node_id = iq.pubsub.configure["node"]
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
384 except KeyError:
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
385 raise BadRequest
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
386
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
387 requestor = jid.JID(iq["from"]).userhostJID()
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
388
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
389 for element in iq.pubsub.configure.elements():
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
390 if element.name != 'x' or element.uri != data_form.NS_X_DATA:
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
391 continue
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
392
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
393 type = element.getAttribute("type")
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
394 if type == "cancel":
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
395 return None
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
396 elif type != "submit":
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
397 continue
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
398
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
399 options = self._get_form_options(element)
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
400
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
401 if options["FORM_TYPE"] == NS_PUBSUB + "#node_config":
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
402 del options["FORM_TYPE"]
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
403 return self.backend.set_node_configuration(node_id,
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
404 options,
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
405 requestor)
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
406
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
407 raise BadRequest
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
408
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
409 def _get_form_options(self, form):
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
410 options = {}
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
411
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
412 for element in form.elements():
110
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
413 if element.name == 'field' and element.uri == data_form.NS_X_DATA:
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
414 try:
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
415 options[element["var"]] = str(element.value)
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
416 except (KeyError, AttributeError):
7043839982ba Use storage.
Ralph Meijer <ralphm@ik.nu>
parents: 105
diff changeset
417 raise BadRequest
95
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
418
3ad74552bbc7 Merge from RELENG_0: Implemented node configuration.
Ralph Meijer <ralphm@ik.nu>
parents: 93
diff changeset
419 return options
38
c9ddca3cce20 Change exception classes to include stanza error.
Ralph Meijer <ralphm@ik.nu>
parents: 31
diff changeset
420
31
fa866793075d Split up implementation in several Services that match the division
Ralph Meijer <ralphm@ik.nu>
parents: 25
diff changeset
421 components.registerAdapter(ComponentServiceFromNodeCreationService, backend.INodeCreationService, component.IService)
60
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
422
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
423 class ComponentServiceFromAffiliationsService(Service):
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
424
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
425 def componentConnected(self, xmlstream):
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
426 xmlstream.addObserver(PUBSUB_AFFILIATIONS, self.onAffiliations)
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
427
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
428 def onAffiliations(self, iq):
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
429 self.handler_wrapper(self._onAffiliations, iq)
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
430
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
431 def _onAffiliations(self, iq):
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
432 d = self.backend.get_affiliations(jid.JID(iq["from"]).userhostJID())
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
433 d.addCallback(self._return_affiliations_response, iq)
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
434 return d
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
435
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
436 def _return_affiliations_response(self, result, iq):
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
437 reply = domish.Element((NS_PUBSUB, 'pubsub'))
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
438 affiliations = reply.addElement('affiliations')
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
439 for r in result:
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
440 entity = affiliations.addElement('entity')
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
441 entity['node'] = r['node']
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
442 entity['jid'] = r['jid'].full()
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
443 entity['affiliation'] = r['affiliation'] or 'none'
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
444 entity['subscription'] = r['subscription'] or 'none'
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
445 return [reply]
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
446
f6b7a06b8870 Implement retrieving affiliations.
Ralph Meijer <ralphm@ik.nu>
parents: 58
diff changeset
447 components.registerAdapter(ComponentServiceFromAffiliationsService, backend.IAffiliationsService, component.IService)
81
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
448
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
449 class ComponentServiceFromItemRetrievalService(Service):
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
450
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
451 def componentConnected(self, xmlstream):
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
452 xmlstream.addObserver(PUBSUB_ITEMS, self.onItems)
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
453
83
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
454 def get_disco_info(self, node):
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
455 info = []
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
456
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
457 if not node:
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
458 info.append(disco.Feature(NS_PUBSUB + "#retrieve-items"))
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
459
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
460 return defer.succeed(info)
f3f31aa491df Fix handling of node creation.
Ralph Meijer <ralphm@ik.nu>
parents: 81
diff changeset
461
81
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
462 def onItems(self, iq):
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
463 self.handler_wrapper(self._onItems, iq)
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
464
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
465 def _onItems(self, iq):
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
466 try:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
467 node_id = iq.pubsub.items["node"]
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
468 except KeyError:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
469 raise BadRequest
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
470
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
471 max_items = iq.pubsub.items.getAttribute('max_items')
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
472
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
473 if max_items:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
474 try:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
475 max_items = int(max_items)
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
476 except ValueError:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
477 raise BadRequest
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
478
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
479 item_ids = []
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
480 for child in iq.pubsub.items.children:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
481 if child.name == 'item' and child.uri == NS_PUBSUB:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
482 try:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
483 item_ids.append(child["id"])
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
484 except KeyError:
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
485 raise BadRequest
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
486
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
487 d = self.backend.get_items(node_id, jid.JID(iq["from"]), max_items,
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
488 item_ids)
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
489 d.addCallback(self._return_items_response, node_id)
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
490 return d
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
491
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
492 def _return_items_response(self, result, node_id):
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
493 reply = domish.Element((NS_PUBSUB, 'pubsub'))
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
494 items = reply.addElement('items')
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
495 items["node"] = node_id
98
b9c449f4c167 Removed debugging junk
Ralph Meijer <ralphm@ik.nu>
parents: 97
diff changeset
496 for r in result:
b9c449f4c167 Removed debugging junk
Ralph Meijer <ralphm@ik.nu>
parents: 97
diff changeset
497 items.addRawXml(r)
81
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
498
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
499 return [reply]
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
500
995ba223a43b Implemented ComponentServiceToItemRetrievalService.
Ralph Meijer <ralphm@ik.nu>
parents: 73
diff changeset
501 components.registerAdapter(ComponentServiceFromItemRetrievalService, backend.IItemRetrievalService, component.IService)
85
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
502
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
503 class ComponentServiceFromRetractionService(Service):
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
504
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
505 def componentConnected(self, xmlstream):
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
506 xmlstream.addObserver(PUBSUB_RETRACT, self.onRetract)
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
507 xmlstream.addObserver(PUBSUB_PURGE, self.onPurge)
85
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
508
96
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
509 def get_disco_info(self, node):
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
510 info = []
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
511
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
512 if not node:
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
513 info.append(disco.Feature(NS_PUBSUB + "#delete-any"))
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
514
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
515 return defer.succeed(info)
f289c3e1dd0a Announce pubsub#delete-any feature.
Ralph Meijer <ralphm@ik.nu>
parents: 95
diff changeset
516
85
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
517 def onRetract(self, iq):
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
518 self.handler_wrapper(self._onRetract, iq)
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
519
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
520 def _onRetract(self, iq):
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
521 try:
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
522 node = iq.pubsub.retract["node"]
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
523 except KeyError:
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
524 raise BadRequest
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
525
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
526 item_ids = []
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
527 for child in iq.pubsub.retract.children:
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
528 if child.__class__ == domish.Element and child.name == 'item':
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
529 try:
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
530 item_ids.append(child["id"])
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
531 except KeyError:
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
532 raise BadRequest
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
533
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
534 return self.backend.retract_item(node, item_ids,
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
535 jid.JID(iq["from"]).userhostJID())
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
536
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
537 def onPurge(self, iq):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
538 self.handler_wrapper(self._onPurge, iq)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
539
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
540 def _onPurge(self, iq):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
541 try:
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
542 node = iq.pubsub.purge["node"]
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
543 except KeyError:
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
544 raise BadRequest
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
545
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
546 return self.backend.purge_node(node, jid.JID(iq["from"]).userhostJID())
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
547
85
ec557449d1aa Implement node retraction, with storage support for pgsql.
Ralph Meijer <ralphm@ik.nu>
parents: 83
diff changeset
548 components.registerAdapter(ComponentServiceFromRetractionService, backend.IRetractionService, component.IService)
90
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
549
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
550 class ComponentServiceFromNodeDeletionService(Service):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
551
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
552 def __init__(self, backend):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
553 Service.__init__(self, backend)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
554 self.subscribers = []
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
555
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
556 def componentConnected(self, xmlstream):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
557 self.backend.register_pre_delete(self._pre_delete)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
558 xmlstream.addObserver(PUBSUB_DELETE, self.onDelete)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
559
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
560 def _pre_delete(self, node_id):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
561 d = self.backend.get_subscribers(node_id)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
562 d.addCallback(self._return_deferreds, node_id)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
563 return d
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
564
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
565 def _return_deferreds(self, subscribers, node_id):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
566 d = defer.Deferred()
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
567 d.addCallback(self._notify, subscribers, node_id)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
568 return [d]
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
569
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
570 def _notify(self, result, subscribers, node_id):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
571 message = domish.Element((NS_COMPONENT, "message"))
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
572 message["from"] = self.parent.jabberId
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
573 event = message.addElement((NS_PUBSUB_EVENT, "event"))
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
574 event.addElement("delete")["node"] = node_id
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
575
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
576 for subscriber in subscribers:
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
577 message["to"] = subscriber
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
578 self.send(message)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
579
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
580 def onDelete(self, iq):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
581 self.handler_wrapper(self._onDelete, iq)
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
582
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
583 def _onDelete(self, iq):
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
584 try:
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
585 node = iq.pubsub.delete["node"]
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
586 except KeyError:
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
587 raise BadRequest
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
588
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
589 return self.backend.delete_node(node, jid.JID(iq["from"]).userhostJID())
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
590
59378610b16e Implement node purging and node deletion.
Ralph Meijer <ralphm@ik.nu>
parents: 85
diff changeset
591 components.registerAdapter(ComponentServiceFromNodeDeletionService, backend.INodeDeletionService, component.IService)