Mercurial > sat_tmp
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')) |