Mercurial > libervia-backend
annotate src/plugins/plugin_xep_0313.py @ 1285:ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
author | souliane <souliane@mailoo.org> |
---|---|
date | Wed, 14 Jan 2015 10:44:49 +0100 |
parents | 41ffe2c2dddc |
children | 2eaa98f7b84c |
rev | line source |
---|---|
1277 | 1 #!/usr/bin/python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 # SAT plugin for Message Archive Management (XEP-0313) | |
5 # Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014 Jérôme Poisson (goffi@goffi.org) | |
6 # Copyright (C) 2013, 2014 Adrien Cossa (souliane@mailoo.org) | |
7 | |
8 # This program is free software: you can redistribute it and/or modify | |
9 # it under the terms of the GNU Affero General Public License as published by | |
10 # the Free Software Foundation, either version 3 of the License, or | |
11 # (at your option) any later version. | |
12 | |
13 # This program is distributed in the hope that it will be useful, | |
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 # GNU Affero General Public License for more details. | |
17 | |
18 # You should have received a copy of the GNU Affero General Public License | |
19 # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
20 | |
21 from sat.core.constants import Const as C | |
22 from sat.core.i18n import _ | |
23 from sat.core.log import getLogger | |
24 log = getLogger(__name__) | |
25 | |
26 try: | |
27 from twisted.words.protocols.xmlstream import XMPPHandler | |
28 except ImportError: | |
29 from wokkel.subprotocols import XMPPHandler | |
30 from twisted.words.xish import domish | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
31 from twisted.words.protocols.jabber import jid |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
32 |
1277 | 33 from zope.interface import implements |
34 | |
1285
ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents:
1284
diff
changeset
|
35 from wokkel import disco, data_form |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
36 from wokkel.generic import parseXml |
1277 | 37 |
1285
ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents:
1284
diff
changeset
|
38 # TODO: change this when RSM and MAM are in wokkel |
ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents:
1284
diff
changeset
|
39 from sat.tmp.wokkel.rsm import RSMRequest |
ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents:
1284
diff
changeset
|
40 from sat.tmp.wokkel import mam |
ed2c718bfe03
tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents:
1284
diff
changeset
|
41 |
1277 | 42 |
43 NS_MAM = 'urn:xmpp:mam:0' | |
44 NS_SF = 'urn:xmpp:forward:0' | |
45 NS_DD = 'urn:xmpp:delay' | |
46 NS_CLIENT = 'jabber:client' | |
47 | |
48 PLUGIN_INFO = { | |
49 "name": "Message Archive Management", | |
50 "import_name": "XEP-0313", | |
51 "type": "XEP", | |
52 "protocols": ["XEP-0313"], | |
53 "dependencies": ["XEP-0059", "XEP-0297", "XEP-0203"], | |
54 "recommendations": ["XEP-0334"], | |
55 "main": "XEP_0313", | |
56 "handler": "yes", | |
57 "description": _("""Implementation of Message Archive Management""") | |
58 } | |
59 | |
60 | |
61 class XEP_0313(object): | |
62 | |
63 def __init__(self, host): | |
64 log.info(_("Message Archive Management plugin initialization")) | |
65 self.host = host | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
66 self.clients = {} # bind profile name to SatMAMClient |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
67 host.bridge.addMethod("MAMqueryFields", ".plugin", in_sign='ss', out_sign='s', |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
68 method=self._queryFields, |
1277 | 69 async=True, |
70 doc={}) | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
71 host.bridge.addMethod("MAMqueryArchive", ".plugin", in_sign='ssa{ss}ss', out_sign='s', |
1277 | 72 method=self._queryArchive, |
73 async=True, | |
74 doc={}) | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
75 host.bridge.addMethod("MAMgetPrefs", ".plugin", in_sign='ss', out_sign='s', |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
76 method=self._getPrefs, |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
77 async=True, |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
78 doc={}) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
79 host.bridge.addMethod("MAMsetPrefs", ".plugin", in_sign='ssasass', out_sign='s', |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
80 method=self._setPrefs, |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
81 async=True, |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
82 doc={}) |
1277 | 83 host.trigger.add("MessageReceived", self.messageReceivedTrigger) |
84 | |
85 def getHandler(self, profile): | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
86 self.clients[profile] = SatMAMClient(self, profile) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
87 return self.clients[profile] |
1277 | 88 |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
89 def profileDisconnected(self, profile): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
90 try: |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
91 del self.clients[profile] |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
92 except KeyError: |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
93 pass |
1277 | 94 |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
95 def _queryFields(self, service_s=None, profile_key=C.PROF_KEY_NONE): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
96 service = jid.JID(service_s) if service_s else None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
97 return self.queryFields(service, profile_key) |
1277 | 98 |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
99 def queryFields(self, service=None, profile_key=C.PROF_KEY_NONE): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
100 """Ask the server about additional supported fields. |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
101 |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
102 @param service: entity offering the MAM service (None for user archives) |
1277 | 103 @param profile_key (unicode): %(doc_profile_key)s |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
104 @return: the server response as a Deferred domish.Element |
1277 | 105 """ |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
106 # http://xmpp.org/extensions/xep-0313.html#query-form |
1277 | 107 def eb(failure): |
108 # typically StanzaError with condition u'service-unavailable' | |
109 log.error(failure.getErrorMessage()) | |
110 return '' | |
111 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
112 profile = self.host.memory.getProfileName(profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
113 d = self.clients[profile].queryFields(service) |
1277 | 114 return d.addCallbacks(lambda elt: elt.toXml(), eb) |
115 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
116 def _queryArchive(self, service_s=None, form_xml=None, rsm_dict=None, node=None, profile_key=C.PROF_KEY_NONE): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
117 service = jid.JID(service_s) if service_s else None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
118 if form_xml: |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
119 form = data_form.Form.fromElement(parseXml(form_xml)) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
120 if form.formNamespace != NS_MAM: |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
121 log.error(_("Expected a MAM Data Form, got instead: %s") % form.formNamespace) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
122 form = None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
123 else: |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
124 form = None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
125 rsm = RSMRequest(**rsm_dict) if rsm_dict else None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
126 return self.queryArchive(service, form, rsm, node, profile_key) |
1277 | 127 |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
128 def queryArchive(self, service=None, form=None, rsm=None, node=None, profile_key=C.PROF_KEY_NONE): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
129 """Query a user, MUC or pubsub archive. |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
130 |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
131 @param service: entity offering the MAM service (None for user archives) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
132 @param form (Form): data form to filter the request |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
133 @param rsm (RSMRequest): RSM request instance |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
134 @param node (unicode): pubsub node to query, or None if inappropriate |
1277 | 135 @param profile_key (unicode): %(doc_profile_key)s |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
136 @return: a Deferred when the message has been sent |
1277 | 137 """ |
138 def eb(failure): | |
139 # typically StanzaError with condition u'service-unavailable' | |
140 log.error(failure.getErrorMessage()) | |
141 return '' | |
142 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
143 profile = self.host.memory.getProfileName(profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
144 d = self.clients[profile].queryArchive(service, form, rsm, node) |
1277 | 145 return d.addCallbacks(lambda elt: elt.toXml(), eb) |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
146 # TODO: add the handler for receiving the final message |
1277 | 147 |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
148 def _getPrefs(self, service_s=None, profile_key=C.PROF_KEY_NONE): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
149 service = jid.JID(service_s) if service_s else None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
150 return self.getPrefs(service, profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
151 |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
152 def getPrefs(self, service=None, profile_key=C.PROF_KEY_NONE): |
1277 | 153 """Retrieve the current user preferences. |
154 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
155 @param service: entity offering the MAM service (None for user archives) |
1277 | 156 @param profile_key (unicode): %(doc_profile_key)s |
157 @return: the server response as a Deferred domish.Element | |
158 """ | |
159 # http://xmpp.org/extensions/xep-0313.html#prefs | |
160 def eb(failure): | |
161 # typically StanzaError with condition u'service-unavailable' | |
162 log.error(failure.getErrorMessage()) | |
163 return '' | |
164 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
165 profile = self.host.memory.getProfileName(profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
166 d = self.clients[profile].queryPrefs(service) |
1277 | 167 return d.addCallbacks(lambda elt: elt.toXml(), eb) |
168 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
169 def _setPrefs(self, service_s=None, default='roster', always=None, never=None, profile_key=C.PROF_KEY_NONE): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
170 service = jid.JID(service_s) if service_s else None |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
171 always_jid = [jid.JID(entity) for entity in always] |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
172 never_jid = [jid.JID(entity) for entity in never] |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
173 #TODO: why not build here a MAMPrefs object instead of passing the args separately? |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
174 return self.setPrefs(service, default, always_jid, never_jid, profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
175 |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
176 def setPrefs(self, service=None, default='roster', always=None, never=None, profile_key=C.PROF_KEY_NONE): |
1277 | 177 """Set news user preferences. |
178 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
179 @param service: entity offering the MAM service (None for user archives) |
1277 | 180 @param default (unicode): a value in ('always', 'never', 'roster') |
181 @param always (list): a list of JID instances | |
182 @param never (list): a list of JID instances | |
183 @param profile_key (unicode): %(doc_profile_key)s | |
184 @return: the server response as a Deferred domish.Element | |
185 """ | |
186 # http://xmpp.org/extensions/xep-0313.html#prefs | |
187 def eb(failure): | |
188 # typically StanzaError with condition u'service-unavailable' | |
189 log.error(failure.getErrorMessage()) | |
190 return '' | |
191 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
192 profile = self.host.memory.getProfileName(profile_key) |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
193 d = self.clients[profile].setPrefs(service, default, always, never) |
1277 | 194 return d.addCallbacks(lambda elt: elt.toXml(), eb) |
195 | |
196 def messageReceivedTrigger(self, message, post_treat, profile): | |
197 """Check if the message is a MAM result. If so, extract the original | |
198 message, stop processing the current message and process the original | |
199 message instead. | |
200 """ | |
201 try: | |
202 result = domish.generateElementsQNamed(message.elements(), "result", NS_MAM).next() | |
203 except StopIteration: | |
204 return True | |
205 try: | |
206 forwarded = domish.generateElementsQNamed(result.elements(), "forwarded", NS_SF).next() | |
207 except StopIteration: | |
208 log.error(_("MAM result misses its <forwarded/> mandatory element!")) | |
209 return False | |
210 try: | |
211 # TODO: delay is not here for nothing, get benefice of it! | |
212 delay = domish.generateElementsQNamed(forwarded.elements(), "delay", NS_DD).next() | |
213 msg = domish.generateElementsQNamed(forwarded.elements(), "message", NS_CLIENT).next() | |
214 except StopIteration: | |
215 log.error(_("<forwarded/> element misses a mandatory child!")) | |
216 return False | |
217 log.debug(_("MAM found a forwarded message")) | |
218 client = self.host.getClient(profile) | |
219 client.messageProt.onMessage(msg) | |
220 return False | |
221 | |
222 | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
223 class SatMAMClient(mam.MAMClient): |
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
224 implements(disco.IDisco) |
1277 | 225 |
226 def __init__(self, plugin_parent, profile): | |
227 self.plugin_parent = plugin_parent | |
228 self.host = plugin_parent.host | |
229 self.profile = profile | |
1284
41ffe2c2dddc
plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents:
1277
diff
changeset
|
230 mam.MAMClient.__init__(self) |
1277 | 231 |
232 def getDiscoInfo(self, requestor, target, nodeIdentifier=''): | |
233 return [disco.DiscoFeature(NS_MAM)] | |
234 | |
235 def getDiscoItems(self, requestor, target, nodeIdentifier=''): | |
236 return [] |