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: