comparison sat_tmp/wokkel/mam.py @ 69:0721b6254c9e

python 3 port: - applied 2to3 - replaced zope's implements by @implementer decorator - replaced references to python2 by python3
author Goffi <goffi@goffi.org>
date Tue, 13 Aug 2019 18:58:11 +0200
parents 938c740d31fe
children
comparison
equal deleted inserted replaced
68:042a926cf3b2 69:0721b6254c9e
25 U{XEP-0313<http://xmpp.org/extensions/xep-0313.html>}. 25 U{XEP-0313<http://xmpp.org/extensions/xep-0313.html>}.
26 """ 26 """
27 27
28 from dateutil import tz 28 from dateutil import tz
29 29
30 from zope.interface import implements 30 from zope.interface import implementer
31 from zope.interface import Interface 31 from zope.interface import Interface
32 32
33 from twisted.words.protocols.jabber import xmlstream 33 from twisted.words.protocols.jabber import xmlstream
34 from twisted.words.xish import domish 34 from twisted.words.xish import domish
35 from twisted.words.protocols.jabber import jid 35 from twisted.words.protocols.jabber import jid
40 from wokkel import subprotocols 40 from wokkel import subprotocols
41 from wokkel import disco 41 from wokkel import disco
42 from wokkel import data_form 42 from wokkel import data_form
43 from wokkel import delay 43 from wokkel import delay
44 44
45 import rsm 45 from . import rsm
46 46
47 NS_MAM = 'urn:xmpp:mam:2' 47 NS_MAM = 'urn:xmpp:mam:2'
48 NS_FORWARD = 'urn:xmpp:forward:0' 48 NS_FORWARD = 'urn:xmpp:forward:0'
49 NS_ORDER_BY = u"urn:xmpp:order-by:0" 49 NS_ORDER_BY = "urn:xmpp:order-by:0"
50 50
51 FIELDS_REQUEST = "/iq[@type='get']/query[@xmlns='%s']" % NS_MAM 51 FIELDS_REQUEST = "/iq[@type='get']/query[@xmlns='%s']" % NS_MAM
52 ARCHIVE_REQUEST = "/iq[@type='set']/query[@xmlns='%s']" % NS_MAM 52 ARCHIVE_REQUEST = "/iq[@type='set']/query[@xmlns='%s']" % NS_MAM
53 PREFS_GET_REQUEST = "/iq[@type='get']/prefs[@xmlns='%s']" % NS_MAM 53 PREFS_GET_REQUEST = "/iq[@type='get']/prefs[@xmlns='%s']" % NS_MAM
54 PREFS_SET_REQUEST = "/iq[@type='set']/prefs[@xmlns='%s']" % NS_MAM 54 PREFS_SET_REQUEST = "/iq[@type='set']/prefs[@xmlns='%s']" % NS_MAM
123 @rtype: L{MAMRequest} 123 @rtype: L{MAMRequest}
124 """ 124 """
125 sender = jid.JID(iq.getAttribute('from')) 125 sender = jid.JID(iq.getAttribute('from'))
126 recipient = jid.JID(iq.getAttribute('to')) 126 recipient = jid.JID(iq.getAttribute('to'))
127 try: 127 try:
128 query = iq.elements(NS_MAM, 'query').next() 128 query = next(iq.elements(NS_MAM, 'query'))
129 except StopIteration: 129 except StopIteration:
130 raise MAMError("Can't find MAM <query/> in element") 130 raise MAMError("Can't find MAM <query/> in element")
131 form = data_form.findForm(query, NS_MAM) 131 form = data_form.findForm(query, NS_MAM)
132 try: 132 try:
133 rsm_request = rsm.RSMRequest.fromElement(query) 133 rsm_request = rsm.RSMRequest.fromElement(query)
229 229
230 prefs = {} 230 prefs = {}
231 for attr in ('always', 'never'): 231 for attr in ('always', 'never'):
232 prefs[attr] = [] 232 prefs[attr] = []
233 try: 233 try:
234 pref = prefs_elt.elements(NS_MAM, attr).next() 234 pref = next(prefs_elt.elements(NS_MAM, attr))
235 except StopIteration: 235 except StopIteration:
236 # FIXME: return proper error here 236 # FIXME: return proper error here
237 raise MAMError('Element provided is not a valid MAM <prefs/> request') 237 raise MAMError('Element provided is not a valid MAM <prefs/> request')
238 else: 238 else:
239 for jid_s in pref.elements(NS_MAM, 'jid'): 239 for jid_s in pref.elements(NS_MAM, 'jid'):
294 @rtype: L{Deferred<twisted.internet.defer.Deferred>} 294 @rtype: L{Deferred<twisted.internet.defer.Deferred>}
295 """ 295 """
296 iq = xmlstream.IQ(self.xmlstream, 'set') 296 iq = xmlstream.IQ(self.xmlstream, 'set')
297 mam_query.render(iq) 297 mam_query.render(iq)
298 if sender is not None: 298 if sender is not None:
299 iq['from'] = unicode(sender) 299 iq['from'] = str(sender)
300 return iq.send(to=service.full() if service else None) 300 return iq.send(to=service.full() if service else None)
301 301
302 def queryFields(self, service=None, sender=None): 302 def queryFields(self, service=None, sender=None):
303 """Ask the server about supported fields. 303 """Ask the server about supported fields.
304 304
313 """ 313 """
314 # http://xmpp.org/extensions/xep-0313.html#query-form 314 # http://xmpp.org/extensions/xep-0313.html#query-form
315 iq = xmlstream.IQ(self.xmlstream, 'get') 315 iq = xmlstream.IQ(self.xmlstream, 'get')
316 MAMRequest().render(iq) 316 MAMRequest().render(iq)
317 if sender is not None: 317 if sender is not None:
318 iq['from'] = unicode(sender) 318 iq['from'] = str(sender)
319 d = iq.send(to=service.full() if service else None) 319 d = iq.send(to=service.full() if service else None)
320 d.addCallback(lambda iq_result: iq_result.elements(NS_MAM, 'query').next()) 320 d.addCallback(lambda iq_result: next(iq_result.elements(NS_MAM, 'query')))
321 d.addCallback(data_form.findForm, NS_MAM) 321 d.addCallback(data_form.findForm, NS_MAM)
322 return d 322 return d
323 323
324 def queryPrefs(self, service=None, sender=None): 324 def queryPrefs(self, service=None, sender=None):
325 """Retrieve the current user preferences. 325 """Retrieve the current user preferences.
335 """ 335 """
336 # http://xmpp.org/extensions/xep-0313.html#prefs 336 # http://xmpp.org/extensions/xep-0313.html#prefs
337 iq = xmlstream.IQ(self.xmlstream, 'get') 337 iq = xmlstream.IQ(self.xmlstream, 'get')
338 MAMPrefs().render(iq) 338 MAMPrefs().render(iq)
339 if sender is not None: 339 if sender is not None:
340 iq['from'] = unicode(sender) 340 iq['from'] = str(sender)
341 return iq.send(to=service.full() if service else None) 341 return iq.send(to=service.full() if service else None)
342 342
343 def setPrefs(self, service=None, default='roster', always=None, never=None, sender=None): 343 def setPrefs(self, service=None, default='roster', always=None, never=None, sender=None):
344 """Set new user preferences. 344 """Set new user preferences.
345 345
364 # http://xmpp.org/extensions/xep-0313.html#prefs 364 # http://xmpp.org/extensions/xep-0313.html#prefs
365 assert default is not None 365 assert default is not None
366 iq = xmlstream.IQ(self.xmlstream, 'set') 366 iq = xmlstream.IQ(self.xmlstream, 'set')
367 MAMPrefs(default, always, never).render(iq) 367 MAMPrefs(default, always, never).render(iq)
368 if sender is not None: 368 if sender is not None:
369 iq['from'] = unicode(sender) 369 iq['from'] = str(sender)
370 return iq.send(to=service.full() if service else None) 370 return iq.send(to=service.full() if service else None)
371 371
372 372
373 class IMAMResource(Interface): 373 class IMAMResource(Interface):
374 374
417 @param field: data form field of the filter 417 @param field: data form field of the filter
418 @type field: L{Form<wokkel.data_form.Field>} 418 @type field: L{Form<wokkel.data_form.Field>}
419 """ 419 """
420 420
421 421
422 @implementer(IMAMService, disco.IDisco)
422 class MAMService(subprotocols.XMPPHandler, subprotocols.IQHandlerMixin): 423 class MAMService(subprotocols.XMPPHandler, subprotocols.IQHandlerMixin):
423 """ 424 """
424 Protocol implementation for a MAM service. 425 Protocol implementation for a MAM service.
425 426
426 This handler waits for XMPP Ping requests and sends a response. 427 This handler waits for XMPP Ping requests and sends a response.
427 """ 428 """
428 implements(IMAMService, disco.IDisco)
429 429
430 _request_class = MAMRequest 430 _request_class = MAMRequest
431 431
432 iqHandlers = {FIELDS_REQUEST: '_onFieldsRequest', 432 iqHandlers = {FIELDS_REQUEST: '_onFieldsRequest',
433 ARCHIVE_REQUEST: '_onArchiveRequest', 433 ARCHIVE_REQUEST: '_onArchiveRequest',
503 mam_ = self._request_class.fromElement(iq) 503 mam_ = self._request_class.fromElement(iq)
504 504
505 # remove unsupported filters 505 # remove unsupported filters
506 unsupported_fields = [] 506 unsupported_fields = []
507 if mam_.form: 507 if mam_.form:
508 for key, field in mam_.form.fields.iteritems(): 508 for key, field in mam_.form.fields.items():
509 if key not in self._mainFilters and key not in self.extra_fields: 509 if key not in self._mainFilters and key not in self.extra_fields:
510 log.msg('Ignored unsupported MAM filter: %s' % field) 510 log.msg('Ignored unsupported MAM filter: %s' % field)
511 unsupported_fields.append(key) 511 unsupported_fields.append(key)
512 for key in unsupported_fields: 512 for key in unsupported_fields:
513 del mam_.form.fields[key] 513 del mam_.form.fields[key]
528 msg_data, rsm_elt, attributes = result 528 msg_data, rsm_elt, attributes = result
529 for data in msg_data: 529 for data in msg_data:
530 forwardMessage(*data) 530 forwardMessage(*data)
531 531
532 fin_elt = domish.Element((NS_MAM, 'fin')) 532 fin_elt = domish.Element((NS_MAM, 'fin'))
533 for key, value in attributes.items(): 533 for key, value in list(attributes.items()):
534 fin_elt[key] = value 534 fin_elt[key] = value
535 535
536 if rsm_elt is not None: 536 if rsm_elt is not None:
537 fin_elt.addChild(rsm_elt) 537 fin_elt.addChild(rsm_elt)
538 return fin_elt 538 return fin_elt
618 @rtype: L{Form<wokkel.data_form.Form>} 618 @rtype: L{Form<wokkel.data_form.Form>}
619 """ 619 """
620 form = data_form.Form(formType, formNamespace=NS_MAM) 620 form = data_form.Form(formType, formNamespace=NS_MAM)
621 621
622 if formType == 'form': 622 if formType == 'form':
623 for kwargs in MAMService._mainFilters.values(): 623 for kwargs in list(MAMService._mainFilters.values()):
624 form.addField(data_form.Field(**kwargs)) 624 form.addField(data_form.Field(**kwargs))
625 elif formType == 'submit': 625 elif formType == 'submit':
626 if start: 626 if start:
627 form.addField(data_form.Field(var='start', value=datetime2utc(start))) 627 form.addField(data_form.Field(var='start', value=datetime2utc(start)))
628 if end: 628 if end: