comparison sat/plugins/plugin_xep_0465.py @ 4008:56e5b18f4d06

plugin XEP-0465: log a warning and return empty list/dict when `forbidden` error is received: this error probably means that the service doesn't support PPS.
author Goffi <goffi@goffi.org>
date Thu, 16 Mar 2023 12:33:33 +0100
parents b7cef1b24f83
children 524856bd7b19
comparison
equal deleted inserted replaced
4007:1d5a81e3c9e8 4008:56e5b18f4d06
18 18
19 from typing import Optional, List, Dict, Union 19 from typing import Optional, List, Dict, Union
20 20
21 from twisted.words.protocols.jabber.xmlstream import XMPPHandler 21 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
22 from twisted.words.protocols.jabber import jid 22 from twisted.words.protocols.jabber import jid
23 from twisted.words.protocols.jabber import error
23 from twisted.words.xish import domish 24 from twisted.words.xish import domish
24 from zope.interface import implementer 25 from zope.interface import implementer
25 from wokkel import disco, iwokkel 26 from wokkel import disco, iwokkel
26 27
27 from sat.core.constants import Const as C 28 from sat.core.constants import Const as C
48 49
49 NS_PPS = "urn:xmpp:pps:0" 50 NS_PPS = "urn:xmpp:pps:0"
50 NS_PPS_SUBSCRIPTIONS = "urn:xmpp:pps:subscriptions:0" 51 NS_PPS_SUBSCRIPTIONS = "urn:xmpp:pps:subscriptions:0"
51 NS_PPS_SUBSCRIBERS = "urn:xmpp:pps:subscribers:0" 52 NS_PPS_SUBSCRIBERS = "urn:xmpp:pps:subscribers:0"
52 SUBSCRIBERS_NODE_PREFIX = f"{NS_PPS_SUBSCRIBERS}/" 53 SUBSCRIBERS_NODE_PREFIX = f"{NS_PPS_SUBSCRIBERS}/"
54 NOT_IMPLEMENTED_MSG = (
55 "The service at {service!s} doesn't seem to support Pubsub Public Subscriptions "
56 "(XEP-0465), please request support from your service administrator."
57 )
53 58
54 59
55 class XEP_0465: 60 class XEP_0465:
56 61
57 def __init__(self, host): 62 def __init__(self, host):
137 @param nodeIdentifier(unicode, None): node to filter 142 @param nodeIdentifier(unicode, None): node to filter
138 None to get all subscriptions 143 None to get all subscriptions
139 """ 144 """
140 if service is None: 145 if service is None:
141 service = client.jid.userhostJID() 146 service = client.jid.userhostJID()
142 items, __ = await self.host.plugins["XEP-0060"].getItems( 147 try:
143 client, service, NS_PPS_SUBSCRIPTIONS 148 items, __ = await self.host.plugins["XEP-0060"].getItems(
144 ) 149 client, service, NS_PPS_SUBSCRIPTIONS
150 )
151 except error.StanzaError as e:
152 if e.condition == "forbidden":
153 log.warning(NOT_IMPLEMENTED_MSG.format(service=service))
154 return []
155 else:
156 raise e
145 ret = [] 157 ret = []
146 for item in items: 158 for item in items:
147 try: 159 try:
148 subscription_elt = next(item.elements(NS_PPS, "subscription")) 160 subscription_elt = next(item.elements(NS_PPS, "subscription"))
149 except StopIteration: 161 except StopIteration:
202 if service is None: 214 if service is None:
203 service = client.jid.userhostJID() 215 service = client.jid.userhostJID()
204 216
205 subscribers_node = self.getPublicSubscribersNode(nodeIdentifier) 217 subscribers_node = self.getPublicSubscribersNode(nodeIdentifier)
206 218
207 items, __ = await self.host.plugins["XEP-0060"].getItems( 219 try:
208 client, service, subscribers_node 220 items, __ = await self.host.plugins["XEP-0060"].getItems(
209 ) 221 client, service, subscribers_node
222 )
223 except error.StanzaError as e:
224 if e.condition == "forbidden":
225 log.warning(NOT_IMPLEMENTED_MSG.format(service=service))
226 return {}
227 else:
228 raise e
210 ret = {} 229 ret = {}
211 for item in items: 230 for item in items:
212 try: 231 try:
213 subscriber_elt = next(item.elements(NS_PPS, "subscriber")) 232 subscriber_elt = next(item.elements(NS_PPS, "subscriber"))
214 except StopIteration: 233 except StopIteration: