comparison sat_tmp/wokkel/pubsub.py @ 86:636d48c2b77a

wokkel (pubsub): fix subscriptions node and unsubscribe response element: - `subscriptions` was incorrectly using `nodeOrEmpty`, while node can be omitted, thus `nodeOrNone` is now used. - fix missing `<subscription>` element in `unsubscribe` response - typing
author Goffi <goffi@goffi.org>
date Wed, 11 May 2022 13:13:32 +0200
parents 46894097e7ee
children 298dac50ca73
comparison
equal deleted inserted replaced
85:ba3f695fff34 86:636d48c2b77a
54 54
55 This protocol is specified in 55 This protocol is specified in
56 U{XEP-0060<http://xmpp.org/extensions/xep-0060.html>}. 56 U{XEP-0060<http://xmpp.org/extensions/xep-0060.html>}.
57 """ 57 """
58 58
59 from typing import Optional
59 from zope.interface import implementer 60 from zope.interface import implementer
60 61
61 from twisted.internet import defer 62 from twisted.internet import defer
62 from twisted.python import log 63 from twisted.python import log
63 from twisted.words.protocols.jabber import jid, error 64 from twisted.words.protocols.jabber import jid, error
334 'publish': ['node', 'items', 'publishOptionsOrNone'], 335 'publish': ['node', 'items', 'publishOptionsOrNone'],
335 'subscribe': ['nodeOrEmpty', 'jid', 'optionsWithSubscribe'], 336 'subscribe': ['nodeOrEmpty', 'jid', 'optionsWithSubscribe'],
336 'unsubscribe': ['nodeOrEmpty', 'jid', 'subidOrNone'], 337 'unsubscribe': ['nodeOrEmpty', 'jid', 'subidOrNone'],
337 'optionsGet': ['nodeOrEmpty', 'jid', 'subidOrNone'], 338 'optionsGet': ['nodeOrEmpty', 'jid', 'subidOrNone'],
338 'optionsSet': ['nodeOrEmpty', 'jid', 'options', 'subidOrNone'], 339 'optionsSet': ['nodeOrEmpty', 'jid', 'options', 'subidOrNone'],
339 'subscriptions': ['nodeOrEmpty'], 340 'subscriptions': ['nodeOrNone'],
340 'affiliations': ['nodeOrNone'], 341 'affiliations': ['nodeOrNone'],
341 'create': ['nodeOrNone', 'configureOrNone'], 342 'create': ['nodeOrNone', 'configureOrNone'],
342 'default': ['default'], 343 'default': ['default'],
343 'configureGet': ['nodeOrEmpty'], 344 'configureGet': ['nodeOrEmpty'],
344 'configureSet': ['nodeOrEmpty', 'configureOrNone'], 345 'configureSet': ['nodeOrEmpty', 'configureOrNone'],
1215 request.options = form 1216 request.options = form
1216 1217
1217 d = request.send(self.xmlstream) 1218 d = request.send(self.xmlstream)
1218 return d 1219 return d
1219 1220
1221
1222 @implementer(IPubSubResource)
1223 class PubSubResource(object):
1224
1225
1226 features = []
1227 discoIdentity = disco.DiscoIdentity('pubsub',
1228 'service',
1229 'Publish-Subscribe Service')
1230
1231
1232 def locateResource(self, request):
1233 return self
1234
1235
1236 def getInfo(self, requestor, service, nodeIdentifier):
1237 return defer.succeed(None)
1238
1239
1240 def getNodes(self, requestor, service, nodeIdentifier):
1241 return defer.succeed([])
1242
1243
1244 def getConfigurationOptions(self):
1245 return {}
1246
1247
1248 def publish(self, request):
1249 return defer.fail(Unsupported('publish'))
1250
1251
1252 def subscribe(self, request):
1253 return defer.fail(Unsupported('subscribe'))
1254
1255
1256 def unsubscribe(self, request):
1257 return defer.fail(Unsupported('subscribe'))
1258
1259
1260 def subscriptions(self, request):
1261 return defer.fail(Unsupported('retrieve-subscriptions'))
1262
1263
1264 def affiliations(self, request):
1265 return defer.fail(Unsupported('retrieve-affiliations'))
1266
1267
1268 def create(self, request):
1269 return defer.fail(Unsupported('create-nodes'))
1270
1271
1272 def default(self, request):
1273 return defer.fail(Unsupported('retrieve-default'))
1274
1275
1276 def configureGet(self, request):
1277 return defer.fail(Unsupported('config-node'))
1278
1279
1280 def configureSet(self, request):
1281 return defer.fail(Unsupported('config-node'))
1282
1283
1284 def items(self, request):
1285 return defer.fail(Unsupported('retrieve-items'))
1286
1287
1288 def retract(self, request):
1289 return defer.fail(Unsupported('retract-items'))
1290
1291
1292 def purge(self, request):
1293 return defer.fail(Unsupported('purge-nodes'))
1294
1295
1296 def delete(self, request):
1297 return defer.fail(Unsupported('delete-nodes'))
1298
1299
1300 def affiliationsGet(self, request):
1301 return defer.fail(Unsupported('retrieve-affiliations'))
1302
1303
1304 def affiliationsSet(self, request):
1305 return defer.fail(Unsupported('modify-affiliations'))
1306
1307
1308 def subscriptionsGet(self, request):
1309 return defer.fail(Unsupported('manage-subscriptions'))
1310
1311
1312 def subscriptionsSet(self, request):
1313 return defer.fail(Unsupported('manage-subscriptions'))
1220 1314
1221 1315
1222 @implementer(IPubSubService, disco.IDisco) 1316 @implementer(IPubSubService, disco.IDisco)
1223 class PubSubService(XMPPHandler, IQHandlerMixin): 1317 class PubSubService(XMPPHandler, IQHandlerMixin):
1224 """ 1318 """
1431 d.addCallback(cb, resource, request) 1525 d.addCallback(cb, resource, request)
1432 1526
1433 return d 1527 return d
1434 1528
1435 1529
1436 def _toResponse_subscribe(self, result, resource, request): 1530 def _toResponse_subscribe(
1531 self,
1532 result: Subscription,
1533 resource: PubSubResource,
1534 request: PubSubRequest
1535 ) -> domish.Element:
1437 response = domish.Element((NS_PUBSUB, "pubsub")) 1536 response = domish.Element((NS_PUBSUB, "pubsub"))
1537 response.addChild(result.toElement(NS_PUBSUB))
1538 return response
1539
1540
1541 def _toResponse_unsubscribe(
1542 self,
1543 result: Optional[Subscription],
1544 resource: PubSubResource,
1545 request: PubSubRequest
1546 ) -> domish.Element:
1547 response = domish.Element((NS_PUBSUB, "pubsub"))
1548 if result is None:
1549 result = Subscription(request.nodeIdentifier, request.subscriber, "none")
1438 response.addChild(result.toElement(NS_PUBSUB)) 1550 response.addChild(result.toElement(NS_PUBSUB))
1439 return response 1551 return response
1440 1552
1441 1553
1442 def _toResponse_subscriptions(self, result, resource, request): 1554 def _toResponse_subscriptions(self, result, resource, request):
1693 def delete(self, requestor, service, nodeIdentifier): 1805 def delete(self, requestor, service, nodeIdentifier):
1694 raise Unsupported('delete-nodes') 1806 raise Unsupported('delete-nodes')
1695 1807
1696 1808
1697 1809
1698 @implementer(IPubSubResource)
1699 class PubSubResource(object):
1700
1701
1702 features = []
1703 discoIdentity = disco.DiscoIdentity('pubsub',
1704 'service',
1705 'Publish-Subscribe Service')
1706
1707
1708 def locateResource(self, request):
1709 return self
1710
1711
1712 def getInfo(self, requestor, service, nodeIdentifier):
1713 return defer.succeed(None)
1714
1715
1716 def getNodes(self, requestor, service, nodeIdentifier):
1717 return defer.succeed([])
1718
1719
1720 def getConfigurationOptions(self):
1721 return {}
1722
1723
1724 def publish(self, request):
1725 return defer.fail(Unsupported('publish'))
1726
1727
1728 def subscribe(self, request):
1729 return defer.fail(Unsupported('subscribe'))
1730
1731
1732 def unsubscribe(self, request):
1733 return defer.fail(Unsupported('subscribe'))
1734
1735
1736 def subscriptions(self, request):
1737 return defer.fail(Unsupported('retrieve-subscriptions'))
1738
1739
1740 def affiliations(self, request):
1741 return defer.fail(Unsupported('retrieve-affiliations'))
1742
1743
1744 def create(self, request):
1745 return defer.fail(Unsupported('create-nodes'))
1746
1747
1748 def default(self, request):
1749 return defer.fail(Unsupported('retrieve-default'))
1750
1751
1752 def configureGet(self, request):
1753 return defer.fail(Unsupported('config-node'))
1754
1755
1756 def configureSet(self, request):
1757 return defer.fail(Unsupported('config-node'))
1758
1759
1760 def items(self, request):
1761 return defer.fail(Unsupported('retrieve-items'))
1762
1763
1764 def retract(self, request):
1765 return defer.fail(Unsupported('retract-items'))
1766
1767
1768 def purge(self, request):
1769 return defer.fail(Unsupported('purge-nodes'))
1770
1771
1772 def delete(self, request):
1773 return defer.fail(Unsupported('delete-nodes'))
1774
1775
1776 def affiliationsGet(self, request):
1777 return defer.fail(Unsupported('retrieve-affiliations'))
1778
1779
1780 def affiliationsSet(self, request):
1781 return defer.fail(Unsupported('modify-affiliations'))
1782
1783
1784 def subscriptionsGet(self, request):
1785 return defer.fail(Unsupported('manage-subscriptions'))
1786
1787
1788 def subscriptionsSet(self, request):
1789 return defer.fail(Unsupported('manage-subscriptions'))