Mercurial > sat_tmp
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: |