Mercurial > libervia-pubsub
annotate idavoll/pubsub.py @ 14:68e900b46d49
Send service-unavailable for unknown iq child namespaces
author | Ralph Meijer <ralphm@ik.nu> |
---|---|
date | Sat, 17 Jul 2004 22:03:37 +0000 |
parents | d45e921a5d2a |
children | ce3d0db64da1 |
rev | line source |
---|---|
1 | 1 from twisted.protocols.jabber import component,jid |
2 | 2 from twisted.xish import utility, domish |
1 | 3 from twisted.python import components |
4 import backend | |
5 import xmpp_error | |
6 | |
2 | 7 NS_COMPONENT = 'jabber:component:accept' |
8 NS_PUBSUB = 'http://jabber.org/protocol/pubsub' | |
9 NS_PUBSUB_EVENT = NS_PUBSUB + '#event' | |
10 | |
1 | 11 IQ_GET = '/iq[@type="get"]' |
12 IQ_SET = '/iq[@type="set"]' | |
2 | 13 PUBSUB_ELEMENT = '/pubsub[@xmlns="' + NS_PUBSUB + '"]' |
14 PUBSUB_GET = IQ_GET + PUBSUB_ELEMENT | |
15 PUBSUB_SET = IQ_SET + PUBSUB_ELEMENT | |
1 | 16 PUBSUB_CREATE = PUBSUB_SET + '/create' |
17 PUBSUB_PUBLISH = PUBSUB_SET + '/publish' | |
7
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
18 PUBSUB_OPTIONS_GET = PUBSUB_GET + '/options' |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
19 PUBSUB_CONFIGURE_GET = PUBSUB_GET + '/configure' |
1 | 20 |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
21 error_map = { |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
22 backend.NotAuthorized: 'not-authorized', |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
23 backend.NodeNotFound: 'item-not-found', |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
24 backend.NoPayloadAllowed: 'bad-request', |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
25 backend.PayloadExpected: 'bad-request', |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
26 } |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
27 |
1 | 28 class ComponentServiceFromBackend(component.Service, utility.EventDispatcher): |
29 | |
30 def __init__(self, backend): | |
31 utility.EventDispatcher.__init__(self) | |
32 self.backend = backend | |
2 | 33 self.backend.pubsub_service = self |
1 | 34 self.addObserver(PUBSUB_PUBLISH, self.onPublish) |
7
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
35 self.addObserver(PUBSUB_OPTIONS_GET, self.onOptionsGet) |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
36 self.addObserver(PUBSUB_CONFIGURE_GET, self.onConfigureGet) |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
37 self.addObserver(PUBSUB_GET, self.notImplemented, -1) |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
38 self.addObserver(PUBSUB_SET, self.notImplemented, -1) |
1 | 39 |
40 def componentConnected(self, xmlstream): | |
41 xmlstream.addObserver(PUBSUB_SET, self.onPubSub) | |
42 xmlstream.addObserver(PUBSUB_GET, self.onPubSub) | |
43 | |
9 | 44 def getIdentities(self, node): |
45 results = [] | |
46 if not node: | |
47 results.append({ | |
48 'category': 'pubsub', | |
49 'type': 'generic', | |
50 'name': 'Generic Pubsub Service' | |
51 }) | |
52 return results | |
53 | |
12 | 54 def getFeatures(self, node): |
55 return [ | |
56 "http://jabber.org/protocol/pubsub#outcast-affil", | |
57 "http://jabber.org/protocol/pubsub#publisher-affil", | |
58 # We do not really store items yet | |
59 # "http://jabber.org/protocol/pubsub#persistent-items", | |
60 ] | |
61 | |
1 | 62 def error(self, failure, iq): |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
63 r = failure.trap(*error_map.keys()) |
1 | 64 |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
65 xmpp_error.error_from_iq(iq, error_map[r], failure.value.msg) |
1 | 66 |
67 return iq | |
68 | |
69 def success(self, result, iq): | |
70 iq.swapAttributeValues("to", "from") | |
71 iq["type"] = 'result' | |
72 iq.children = [] | |
73 return iq | |
74 | |
7
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
75 def notImplemented(self, iq): |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
76 self.send(xmpp_error.error_from_iq(iq, 'feature-not-implemented')) |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
77 |
1 | 78 def onPubSub(self, iq): |
79 self.dispatch(iq) | |
80 iq.handled = True | |
81 | |
82 def onPublish(self, iq): | |
83 node = iq.pubsub.publish["node"] | |
84 | |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
85 items = [] |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
86 for child in iq.pubsub.publish.children: |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
87 if child.__class__ == domish.Element and child.name == 'item': |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
88 items.append(child) |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
89 |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
90 print items |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
91 |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
92 d = self.backend.do_publish(node, jid.JID(iq["from"]).userhost(), items) |
1 | 93 d.addCallback(self.success, iq) |
94 d.addErrback(self.error, iq) | |
95 d.addCallback(self.send) | |
96 | |
7
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
97 def onOptionsGet(self, iq): |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
98 self.send(xmpp_error.error_from_iq(iq, 'feature-not-implemented', 'No subscriber options available')) |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
99 |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
100 def onConfigureGet(self, iq): |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
101 self.send(xmpp_error.error_from_iq(iq, 'feature-not-implemented', 'Node can not be configured')) |
a8cfb31dc50c
Implemented fallback for feature-not-implemented.
Ralph Meijer <ralphm@ik.nu>
parents:
4
diff
changeset
|
102 |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
103 def do_notification(self, list, node): |
1 | 104 |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
105 for recipient, items in list.items(): |
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
106 self.notify(node, items, recipient) |
2 | 107 |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
108 def notify(self, node, itemlist, recipient): |
2 | 109 message = domish.Element((NS_COMPONENT, "message")) |
110 message["from"] = self.parent.jabberId | |
111 message["to"] = recipient | |
112 x = message.addElement((NS_PUBSUB_EVENT, "x"), NS_PUBSUB_EVENT) | |
113 items = x.addElement("items") | |
114 items["node"] = node | |
4
ea195dc1732d
Allow publication of more than 1 item.
Ralph Meijer <ralphm@ik.nu>
parents:
2
diff
changeset
|
115 items.children.extend(itemlist) |
2 | 116 self.send(message) |
117 | |
1 | 118 """ |
119 def onCreateSet(self, iq): | |
120 node = iq.pubsub.create["node"] | |
121 owner = jid.JID(iq["from"]).userhost() | |
122 | |
123 try: | |
124 node = self.backend.create_node(node, owner) | |
125 | |
126 if iq.pubsub.create["node"] == None: | |
127 # also show node name | |
128 except: | |
129 pass | |
130 | |
131 iq.handled = True | |
132 """ | |
133 | |
134 components.registerAdapter(ComponentServiceFromBackend, backend.IBackendService, component.IService) | |
135 |