# HG changeset patch # User Goffi # Date 1550250302 -3600 # Node ID 1d2222a91e6b8cfcb0edefe9704a25227dbb16a8 # Parent fba96e95e329f68e5c50211995686940a175d5d7 pubsub_admin: catch errors on publish, and send an iq error diff -r fba96e95e329 -r 1d2222a91e6b src/pubsub_admin.py --- a/src/pubsub_admin.py Fri Feb 15 18:04:05 2019 +0100 +++ b/src/pubsub_admin.py Fri Feb 15 18:05:02 2019 +0100 @@ -24,7 +24,8 @@ from zope.interface import implements from twisted.python import log from twisted.internet import defer -from twisted.words.protocols.jabber import jid, error, xmlstream +from twisted.words.protocols.jabber import jid, error as jabber_error, xmlstream +from sat_pubsub import error from wokkel.subprotocols import XMPPHandler from wokkel import disco, iwokkel, pubsub @@ -43,7 +44,7 @@ self.xmlstream.addObserver(ADMIN_REQUEST, self.onAdminRequest) def sendError(self, iq_elt, condition=u'bad-request'): - stanza_error = error.StanzaError(u'bad-request') + stanza_error = jabber_error.StanzaError(condition) iq_error = stanza_error.toResponse(iq_elt) self.parent.xmlstream.send(iq_error) @@ -101,12 +102,21 @@ # we don't use a DeferredList because we want to be sure that # each request is done in order - payload = yield self.backend.publish( - nodeIdentifier=node, - items=[item], - requestor=requestor, - pep=pep, - recipient=recipient) + try: + payload = yield self.backend.publish( + nodeIdentifier=node, + items=[item], + requestor=requestor, + pep=pep, + recipient=recipient) + except (error.Forbidden, error.ItemForbidden): + __import__('pudb').set_trace() + self.sendError(iq_elt, u"forbidden") + return + except Exception as e: + self.sendError(iq_elt, u"internal-server-error") + log.msg(u"INTERNAL ERROR: {msg}".format(msg=e)) + return result_item_elt = result_publish_elt.addElement(u'item') # either the id was given and it is available in item