Mercurial > libervia-pubsub
comparison src/pubsub_admin.py @ 391:1d2222a91e6b
pubsub_admin: catch errors on publish, and send an iq error
author | Goffi <goffi@goffi.org> |
---|---|
date | Fri, 15 Feb 2019 18:05:02 +0100 |
parents | 77b52dbda89a |
children |
comparison
equal
deleted
inserted
replaced
390:fba96e95e329 | 391:1d2222a91e6b |
---|---|
22 """ | 22 """ |
23 | 23 |
24 from zope.interface import implements | 24 from zope.interface import implements |
25 from twisted.python import log | 25 from twisted.python import log |
26 from twisted.internet import defer | 26 from twisted.internet import defer |
27 from twisted.words.protocols.jabber import jid, error, xmlstream | 27 from twisted.words.protocols.jabber import jid, error as jabber_error, xmlstream |
28 from sat_pubsub import error | |
28 from wokkel.subprotocols import XMPPHandler | 29 from wokkel.subprotocols import XMPPHandler |
29 from wokkel import disco, iwokkel, pubsub | 30 from wokkel import disco, iwokkel, pubsub |
30 | 31 |
31 NS_PUBSUB_ADMIN = u"https://salut-a-toi.org/spec/pubsub_admin:0" | 32 NS_PUBSUB_ADMIN = u"https://salut-a-toi.org/spec/pubsub_admin:0" |
32 ADMIN_REQUEST = '/iq[@type="set"]/admin[@xmlns="{}"]'.format(NS_PUBSUB_ADMIN) | 33 ADMIN_REQUEST = '/iq[@type="set"]/admin[@xmlns="{}"]'.format(NS_PUBSUB_ADMIN) |
41 | 42 |
42 def connectionInitialized(self): | 43 def connectionInitialized(self): |
43 self.xmlstream.addObserver(ADMIN_REQUEST, self.onAdminRequest) | 44 self.xmlstream.addObserver(ADMIN_REQUEST, self.onAdminRequest) |
44 | 45 |
45 def sendError(self, iq_elt, condition=u'bad-request'): | 46 def sendError(self, iq_elt, condition=u'bad-request'): |
46 stanza_error = error.StanzaError(u'bad-request') | 47 stanza_error = jabber_error.StanzaError(condition) |
47 iq_error = stanza_error.toResponse(iq_elt) | 48 iq_error = stanza_error.toResponse(iq_elt) |
48 self.parent.xmlstream.send(iq_error) | 49 self.parent.xmlstream.send(iq_error) |
49 | 50 |
50 @defer.inlineCallbacks | 51 @defer.inlineCallbacks |
51 def onAdminRequest(self, iq_elt): | 52 def onAdminRequest(self, iq_elt): |
99 except KeyError: | 100 except KeyError: |
100 requestor = from_jid | 101 requestor = from_jid |
101 | 102 |
102 # we don't use a DeferredList because we want to be sure that | 103 # we don't use a DeferredList because we want to be sure that |
103 # each request is done in order | 104 # each request is done in order |
104 payload = yield self.backend.publish( | 105 try: |
105 nodeIdentifier=node, | 106 payload = yield self.backend.publish( |
106 items=[item], | 107 nodeIdentifier=node, |
107 requestor=requestor, | 108 items=[item], |
108 pep=pep, | 109 requestor=requestor, |
109 recipient=recipient) | 110 pep=pep, |
111 recipient=recipient) | |
112 except (error.Forbidden, error.ItemForbidden): | |
113 __import__('pudb').set_trace() | |
114 self.sendError(iq_elt, u"forbidden") | |
115 return | |
116 except Exception as e: | |
117 self.sendError(iq_elt, u"internal-server-error") | |
118 log.msg(u"INTERNAL ERROR: {msg}".format(msg=e)) | |
119 return | |
110 | 120 |
111 result_item_elt = result_publish_elt.addElement(u'item') | 121 result_item_elt = result_publish_elt.addElement(u'item') |
112 # either the id was given and it is available in item | 122 # either the id was given and it is available in item |
113 # either it's a new item, and we can retrieve it from return payload | 123 # either it's a new item, and we can retrieve it from return payload |
114 try: | 124 try: |