# HG changeset patch # User souliane # Date 1418985504 -3600 # Node ID f7977b2b727ecfefd813240e39d76c29abf5b5e8 # Parent 7fbc858cd1cd7a6807010e9b08d73d583c60094b plugin XEP-0203: first draft diff -r 7fbc858cd1cd -r f7977b2b727e src/plugins/plugin_xep_0203.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/plugins/plugin_xep_0203.py Fri Dec 19 11:38:24 2014 +0100 @@ -0,0 +1,84 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# SAT plugin for Delayed Delivery (XEP-0203) +# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org) +# Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +from sat.core.i18n import _ +from sat.core.log import getLogger +log = getLogger(__name__) + +from wokkel import disco, iwokkel, delay +try: + from twisted.words.protocols.xmlstream import XMPPHandler +except ImportError: + from wokkel.subprotocols import XMPPHandler +from zope.interface import implements + + +NS_DD = 'urn:xmpp:delay' + +PLUGIN_INFO = { + "name": "Delayed Delivery", + "import_name": "XEP-0203", + "type": "XEP", + "protocols": ["XEP-0203"], + "main": "XEP_0203", + "handler": "yes", + "description": _("""Implementation of Delayed Delivery""") +} + + +class XEP_0203(object): + + def __init__(self, host): + log.info(_("Delayed Delivery plugin initialization")) + self.host = host + + def getHandler(self, profile): + return XEP_0203_handler(self, profile) + + def delay(self, stamp, sender=None, desc='', parent=None): + """Build a delay element, eventually append it to the given parent element. + + @param stamp (datetime): offset-aware timestamp of the original sending. + @param sender (JID): entity that originally sent or delayed the message. + @param desc (unicode): optional natural language description. + @param parent (domish.Element): add the delay element to this element. + @return: the delay element (domish.Element) + """ + elt = delay.Delay(stamp, sender).toElement() + if desc: + elt.addContent(desc) + if parent: + parent.addChild(elt) + return elt + + +class XEP_0203_handler(XMPPHandler): + implements(iwokkel.IDisco) + + def __init__(self, plugin_parent, profile): + self.plugin_parent = plugin_parent + self.host = plugin_parent.host + self.profile = profile + + def getDiscoInfo(self, requestor, target, nodeIdentifier=''): + return [disco.DiscoFeature(NS_DD)] + + def getDiscoItems(self, requestor, target, nodeIdentifier=''): + return [] diff -r 7fbc858cd1cd -r f7977b2b727e src/test/test_plugin_xep_0203.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/test_plugin_xep_0203.py Fri Dec 19 11:38:24 2014 +0100 @@ -0,0 +1,65 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# SAT: a jabber client +# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org) +# Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org) + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. + +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . + +""" Plugin XEP-0203 """ + +from sat.test import helpers +from sat.plugins.plugin_xep_0203 import XEP_0203 +from twisted.words.xish import domish +from twisted.words.protocols.jabber.jid import JID +from dateutil.tz import tzutc +import datetime + +NS_PUBSUB = 'http://jabber.org/protocol/pubsub' + + +class XEP_0203Test(helpers.SatTestCase): + + def setUp(self): + self.host = helpers.FakeSAT() + self.plugin = XEP_0203(self.host) + + def test_delay(self): + delay_xml = """ + + Offline Storage + + """ + message_xml = """ + + text + %s + + """ % delay_xml + + parent = domish.Element((None, 'message')) + parent['from'] = 'romeo@montague.net/orchard' + parent['to'] = 'juliet@capulet.com' + parent['type'] = 'chat' + parent.addElement('body', None, 'text') + stamp = datetime.datetime(2002, 9, 10, 23, 8, 25, tzinfo=tzutc()) + elt = self.plugin.delay(stamp, JID('capulet.com'), 'Offline Storage', parent) + self.assertEqualXML(elt.toXml(), delay_xml, True) + self.assertEqualXML(parent.toXml(), message_xml, True)