annotate sat/plugins/plugin_xep_0313.py @ 3011:93da7c6f8e0c

plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection: Missing one2one messages are now retrieved with MAM on hot reconnection, and buffered ones (which have most probably not been received by the server) are resent at the end of the reconnection workflow. IQ results are not re-sent on hot reconnection, as they don't make sense anymore with a new session. fix 330
author Goffi <goffi@goffi.org>
date Wed, 17 Jul 2019 09:28:35 +0200
parents 32b6893240e0
children 1f74cd0f22c3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1776
diff changeset
1 #!/usr/bin/env python2
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
3
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
4 # SAT plugin for Message Archive Management (XEP-0313)
2771
003b8b4b56a7 date update
Goffi <goffi@goffi.org>
parents: 2763
diff changeset
5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org)
1766
d17772b0fe22 copyright update
Goffi <goffi@goffi.org>
parents: 1409
diff changeset
6 # Copyright (C) 2013-2016 Adrien Cossa (souliane@mailoo.org)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
7
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
8 # This program is free software: you can redistribute it and/or modify
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
9 # it under the terms of the GNU Affero General Public License as published by
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
10 # the Free Software Foundation, either version 3 of the License, or
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
11 # (at your option) any later version.
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
12
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
13 # This program is distributed in the hope that it will be useful,
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
16 # GNU Affero General Public License for more details.
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
17
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
18 # You should have received a copy of the GNU Affero General Public License
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
20
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
21 from sat.core.constants import Const as C
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
22 from sat.core.i18n import _
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
23 from sat.core.log import getLogger
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
24 from sat.core import exceptions
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
25 from sat.tools.common import data_format
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
26 from twisted.words.protocols.jabber import jid
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
27 from twisted.internet import defer
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
28 from zope.interface import implements
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
29 from datetime import datetime
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
30 from dateutil import tz
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
31 from wokkel import disco
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
32 from wokkel import data_form
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
33 import uuid
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
34
2413
70399d1acb47 tmp: removed sat.tmp hierarchy and fixed references to it as it is now an independant sat_tmp repository
Goffi <goffi@goffi.org>
parents: 2145
diff changeset
35 # XXX: mam and rsm come from sat_tmp.wokkel
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
36 from wokkel import rsm
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
37 from wokkel import mam
1285
ed2c718bfe03 tmp, plugins: fixes the imports fron sat.tmp
souliane <souliane@mailoo.org>
parents: 1284
diff changeset
38
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
39
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
40 log = getLogger(__name__)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
41
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
42 PLUGIN_INFO = {
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
43 C.PI_NAME: u"Message Archive Management",
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
44 C.PI_IMPORT_NAME: u"XEP-0313",
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
45 C.PI_TYPE: u"XEP",
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
46 C.PI_PROTOCOLS: [u"XEP-0313"],
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
47 C.PI_DEPENDENCIES: [u"XEP-0059", u"XEP-0359"],
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
48 C.PI_MAIN: u"XEP_0313",
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
49 C.PI_HANDLER: u"yes",
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
50 C.PI_DESCRIPTION: _(u"""Implementation of Message Archive Management"""),
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
51 }
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
52
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
53 MAM_PREFIX = u"mam_"
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
54 FILTER_PREFIX = MAM_PREFIX + "filter_"
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
55 KEY_LAST_STANZA_ID = u"last_stanza_id"
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
56 MESSAGE_RESULT = "/message/result[@xmlns='{mam_ns}' and @queryid='{query_id}']"
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
57 MESSAGE_STANZA_ID = '/message/stanza-id[@xmlns="{ns_stanza_id}"]'
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
58
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
59
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
60 class XEP_0313(object):
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
61 def __init__(self, host):
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
62 log.info(_("Message Archive Management plugin initialization"))
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
63 self.host = host
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
64 self.host.registerNamespace(u"mam", mam.NS_MAM)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
65 self._rsm = host.plugins[u"XEP-0059"]
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
66 self._sid = host.plugins[u"XEP-0359"]
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
67 # Deferred used to store last stanza id in order of reception
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
68 self._last_stanza_id_d = defer.Deferred()
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
69 self._last_stanza_id_d.callback(None)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
70 host.bridge.addMethod(
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
71 "MAMGet", ".plugin", in_sign='sss',
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
72 out_sign='(a(sdssa{ss}a{ss}sa{ss})a{ss}s)', method=self._getArchives,
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
73 async=True)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
74
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
75 @defer.inlineCallbacks
3011
93da7c6f8e0c plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents: 2930
diff changeset
76 def resume(self, client):
93da7c6f8e0c plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents: 2930
diff changeset
77 """Retrieve one2one messages received since the last we have in local storage"""
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
78 stanza_id_data = yield self.host.memory.storage.getPrivates(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
79 mam.NS_MAM, [KEY_LAST_STANZA_ID], profile=client.profile)
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
80 stanza_id = stanza_id_data.get(KEY_LAST_STANZA_ID)
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
81 if stanza_id is None:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
82 log.info(u"can't retrieve last stanza ID, checking history")
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
83 last_mess = yield self.host.memory.historyGet(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
84 None, None, limit=1, filters={u'not_types': C.MESS_TYPE_GROUPCHAT,
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
85 u'last_stanza_id': True},
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
86 profile=client.profile)
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
87 if not last_mess:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
88 log.info(_(u"It seems that we have no MAM history yet"))
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
89 return
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
90 stanza_id = last_mess[0][-1][u'stanza_id']
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
91 rsm_req = rsm.RSMRequest(max_=100, after=stanza_id)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
92 mam_req = mam.MAMRequest(rsm_=rsm_req)
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
93 complete = False
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
94 count = 0
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
95 while not complete:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
96 mam_data = yield self.getArchives(client, mam_req,
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
97 service=client.jid.userhostJID())
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
98 elt_list, rsm_response, mam_response = mam_data
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
99 complete = mam_response[u"complete"]
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
100 # we update MAM request for next iteration
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
101 mam_req.rsm.after = rsm_response.last
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
102 if not elt_list:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
103 break
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
104 else:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
105 count += len(elt_list)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
106
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
107 for mess_elt in elt_list:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
108 try:
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
109 fwd_message_elt = self.getMessageFromResult(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
110 client, mess_elt, mam_req)
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
111 except exceptions.DataError:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
112 continue
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
113
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
114 try:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
115 destinee = jid.JID(fwd_message_elt['to'])
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
116 except KeyError:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
117 log.warning(_(u'missing "to" attribute in forwarded message'))
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
118 destinee = client.jid
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
119 if destinee.userhostJID() == client.jid.userhostJID():
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
120 # message to use, we insert the forwarded message in the normal
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
121 # workflow
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
122 client.xmlstream.dispatch(fwd_message_elt)
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
123 else:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
124 # this message should be from us, we just add it to history
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
125 try:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
126 from_jid = jid.JID(fwd_message_elt['from'])
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
127 except KeyError:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
128 log.warning(_(u'missing "from" attribute in forwarded message'))
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
129 from_jid = client.jid
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
130 if from_jid.userhostJID() != client.jid.userhostJID():
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
131 log.warning(_(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
132 u'was expecting a message sent by our jid, but this one if '
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
133 u'from {from_jid}, ignoring\n{xml}').format(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
134 from_jid=from_jid.full(), xml=mess_elt.toXml()))
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
135 continue
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
136 # adding message to history
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
137 mess_data = client.messageProt.parseMessage(fwd_message_elt)
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
138 yield client.messageProt.addToHistory(mess_data)
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
139
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
140 if not count:
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
141 log.info(_(u"We have received no message while offline"))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
142 else:
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
143 log.info(_(u"We have received {num_mess} message(s) while offline.")
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
144 .format(num_mess=count))
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
145
3011
93da7c6f8e0c plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents: 2930
diff changeset
146 def profileConnected(self, client):
93da7c6f8e0c plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents: 2930
diff changeset
147 return self.resume(client)
93da7c6f8e0c plugin XEP-0198: retrieve missing messages + send buffered ones on hot reconnection:
Goffi <goffi@goffi.org>
parents: 2930
diff changeset
148
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
149 def getHandler(self, client):
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
150 mam_client = client._mam = SatMAMClient(self)
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
151 return mam_client
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
152
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
153 def parseExtra(self, extra, with_rsm=True):
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
154 """Parse extra dictionnary to retrieve MAM arguments
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
155
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
156 @param extra(dict): data for parse
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
157 @param with_rsm(bool): if True, RSM data will be parsed too
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
158 @return (data_form, None): request with parsed arguments
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
159 or None if no MAM arguments have been found
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
160 """
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
161 mam_args = {}
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
162 form_args = {}
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
163 for arg in (u"start", u"end"):
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
164 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
165 value = extra.pop(MAM_PREFIX + arg)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
166 form_args[arg] = datetime.fromtimestamp(float(value), tz.tzutc())
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
167 except (TypeError, ValueError):
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
168 log.warning(u"Bad value for {arg} filter ({value}), ignoring".format(
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
169 arg=arg, value=value))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
170 except KeyError:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
171 continue
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
172
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
173 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
174 form_args[u"with_jid"] = jid.JID(extra.pop(
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
175 MAM_PREFIX + u"with"))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
176 except (jid.InvalidFormat):
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
177 log.warning(u"Bad value for jid filter")
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
178 except KeyError:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
179 pass
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
180
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
181 for name, value in extra.iteritems():
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
182 if name.startswith(FILTER_PREFIX):
2763
c4190d5340ab XEP-0059: max value check:
Goffi <goffi@goffi.org>
parents: 2760
diff changeset
183 var = name[len(FILTER_PREFIX):]
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
184 extra_fields = form_args.setdefault(u"extra_fields", [])
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
185 extra_fields.append(data_form.Field(var=var, value=value))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
186
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
187 for arg in (u"node", u"query_id"):
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
188 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
189 value = extra.pop(MAM_PREFIX + arg)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
190 mam_args[arg] = value
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
191 except KeyError:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
192 continue
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
193
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
194 if with_rsm:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
195 rsm_request = self._rsm.parseExtra(extra)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
196 if rsm_request is not None:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
197 mam_args["rsm_"] = rsm_request
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
198
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
199 if form_args:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
200 mam_args["form"] = mam.buildForm(**form_args)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
201
2760
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
202 # we only set orderBy if we have other MAM args
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
203 # else we would make a MAM query while it's not expected
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
204 if u"order_by" in extra and mam_args:
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
205 order_by = extra.pop(u"order_by")
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
206 assert isinstance(order_by, list)
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
207 mam_args["orderBy"] = order_by
3480d4fdf83a plugins XEP-0060, XEP-0313: implemented Order-By protoXEP:
Goffi <goffi@goffi.org>
parents: 2718
diff changeset
208
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
209 return mam.MAMRequest(**mam_args) if mam_args else None
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
210
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
211 def serialise(self, mam_response, data=None):
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
212 """Serialise data for MAM
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
213
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
214 Key set in data can be:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
215 - mam_complete: a bool const indicating if all items have been received
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
216 - mam_stable: a bool const which is False if items order may be changed
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
217 All values are set as strings.
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
218 @param mam_response(dict): response data to serialise
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
219 @param data(dict, None): dict to update with mam_* data.
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
220 If None, a new dict is created
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
221 @return (dict): data dict
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
222 """
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
223 if data is None:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
224 data = {}
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
225 data[u"mam_complete"] = C.boolConst(mam_response[u'complete'])
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
226 data[u"mam_stable"] = C.boolConst(mam_response[u'stable'])
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
227 return data
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
228
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
229 def getMessageFromResult(self, client, mess_elt, mam_req, service=None):
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
230 """Extract usable <message/> from MAM query result
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
231
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
232 The message will be validated, and stanza-id/delay will be added if necessary.
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
233 @param mess_elt(domish.Element): result <message/> element wrapping the message
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
234 to retrieve
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
235 @param mam_req(mam.MAMRequest): request used (needed to get query_id)
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
236 @param service(jid.JID, None): MAM service where the request has been sent
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
237 None if it's user server
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
238 @return domish.Element): <message/> that can be used directly with onMessage
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
239 """
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
240 if mess_elt.name != u"message":
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
241 log.warning(u"unexpected stanza in archive: {xml}".format(
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
242 xml=mess_elt.toXml()))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
243 raise exceptions.DataError(u"Invalid element")
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
244 service_jid = client.jid.userhostJID() if service is None else service
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
245 mess_from = mess_elt[u"from"]
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
246 # we check that the message has been sent by the right service
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
247 # if service is None (i.e. message expected from our own server)
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
248 # from can be server jid or user's bare jid
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
249 if (mess_from != service_jid.full()
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
250 and not (service is None and mess_from == client.jid.host)):
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
251 log.error(u"Message is not from our server, something went wrong: "
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
252 u"{xml}".format(xml=mess_elt.toXml()))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
253 raise exceptions.DataError(u"Invalid element")
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
254 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
255 result_elt = next(mess_elt.elements(mam.NS_MAM, u"result"))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
256 forwarded_elt = next(result_elt.elements(C.NS_FORWARD, u"forwarded"))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
257 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
258 delay_elt = next(forwarded_elt.elements(C.NS_DELAY, u"delay"))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
259 except StopIteration:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
260 # delay_elt is not mandatory
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
261 delay_elt = None
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
262 fwd_message_elt = next(forwarded_elt.elements(C.NS_CLIENT, u"message"))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
263 except StopIteration:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
264 log.warning(u"Invalid message received from MAM: {xml}".format(
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
265 xml=mess_elt.toXml()))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
266 raise exceptions.DataError(u"Invalid element")
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
267 else:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
268 if not result_elt[u"queryid"] == mam_req.query_id:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
269 log.error(u"Unexpected query id (was expecting {query_id}): {xml}"
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
270 .format(query_id=mam.query_id, xml=mess_elt.toXml()))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
271 raise exceptions.DataError(u"Invalid element")
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
272 stanza_id = self._sid.getStanzaId(fwd_message_elt,
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
273 service_jid)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
274 if stanza_id is None:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
275 # not stanza-id element is present, we add one so message
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
276 # will be archived with it, and we won't request several times
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
277 # the same MAM achive
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
278 try:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
279 stanza_id = result_elt[u"id"]
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
280 except AttributeError:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
281 log.warning(u'Invalid MAM result: missing "id" attribute: {xml}'
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
282 .format(xml=result_elt.toXml()))
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
283 raise exceptions.DataError(u"Invalid element")
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
284 self._sid.addStanzaId(client, fwd_message_elt, stanza_id, by=service_jid)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
285
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
286 if delay_elt is not None:
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
287 fwd_message_elt.addChild(delay_elt)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
288
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
289 return fwd_message_elt
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
290
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
291 def queryFields(self, client, service=None):
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
292 """Ask the server about supported fields.
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
293
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
294 @param service: entity offering the MAM service (None for user archives)
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
295 @return (D(data_form.Form)): form with the implemented fields (cf XEP-0313 §4.1.5)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
296 """
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
297 return client._mam.queryFields(service)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
298
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
299 def queryArchive(self, client, mam_req, service=None):
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
300 """Query a user, MUC or pubsub archive.
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
301
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
302 @param mam_req(mam.MAMRequest): MAM query instance
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
303 @param service(jid.JID, None): entity offering the MAM service
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
304 None for user server
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
305 @return (D(domish.Element)): <IQ/> result
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
306 """
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
307 return client._mam.queryArchive(mam_req, service)
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
308
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
309 def _appendMessage(self, elt_list, message_cb, message_elt):
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
310 if message_cb is not None:
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
311 elt_list.append(message_cb(message_elt))
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
312 else:
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
313 elt_list.append(message_elt)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
314
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
315 def _queryFinished(self, iq_result, client, elt_list, event):
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
316 client.xmlstream.removeObserver(event, self._appendMessage)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
317 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
318 fin_elt = iq_result.elements(mam.NS_MAM, "fin").next()
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
319 except StopIteration:
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
320 raise exceptions.DataError(u"Invalid MAM result")
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
321
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
322 mam_response = {u"complete": C.bool(fin_elt.getAttribute(u"complete", C.BOOL_FALSE)),
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
323 u"stable": C.bool(fin_elt.getAttribute(u"stable", C.BOOL_TRUE))}
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
324
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
325 try:
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
326 rsm_response = rsm.RSMResponse.fromElement(fin_elt)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
327 except rsm.RSMNotFoundError:
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
328 rsm_response = None
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
329
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
330 return (elt_list, rsm_response, mam_response)
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
331
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
332 def serializeArchiveResult(self, data, client, mam_req, service):
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
333 elt_list, rsm_response, mam_response = data
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
334 mess_list = []
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
335 for elt in elt_list:
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
336 fwd_message_elt = self.getMessageFromResult(client, elt, mam_req,
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
337 service=service)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
338 mess_data = client.messageProt.parseMessage(fwd_message_elt)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
339 mess_list.append(client.messageGetBridgeArgs(mess_data))
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
340 metadata = self._rsm.serialise(rsm_response)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
341 self.serialise(mam_response, metadata)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
342 return mess_list, metadata, client.profile
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
343
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
344 def _getArchives(self, service, extra_ser, profile_key):
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
345 """
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
346 @return: tuple with:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
347 - list of message with same data as in bridge.messageNew
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
348 - response metadata with:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
349 - rsm data (rsm_first, rsm_last, rsm_count, rsm_index)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
350 - mam data (mam_complete, mam_stable)
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
351 - profile
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
352 """
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
353 client = self.host.getClient(profile_key)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
354 service = jid.JID(service) if service else None
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
355 extra = data_format.deserialise(extra_ser, {})
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
356 mam_req = self.parseExtra(extra)
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
357
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
358 d = self.getArchives(client, mam_req, service=service)
2713
19000c506d0c plugin XEP-0313: improvments to prepare MUC MAM:
Goffi <goffi@goffi.org>
parents: 2701
diff changeset
359 d.addCallback(self.serializeArchiveResult, client, mam_req, service)
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
360 return d
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
361
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
362 def getArchives(self, client, query, service=None, message_cb=None):
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
363 """Query archive and gather page result
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
364
2718
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
365 @param query(mam.MAMRequest): MAM request
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
366 @param service(jid.JID, None): MAM service to use
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
367 None to use our own server
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
368 @param message_cb(callable, None): callback to use on each message
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
369 this method can be used to unwrap messages
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
370 @return (tuple[list[domish.Element], rsm.RSMResponse, dict): result data with:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
371 - list of found elements
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
372 - RSM response
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
373 - MAM response, which is a dict with following value:
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
374 - complete: a boolean which is True if all items have been received
bb6adaa580ee plugin XEP-0313, XEP-0045: loop MAM requests until whole archive is retrieved:
Goffi <goffi@goffi.org>
parents: 2713
diff changeset
375 - stable: a boolean which is False if items order may be changed
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
376 """
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
377 if query.query_id is None:
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
378 query.query_id = unicode(uuid.uuid4())
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
379 elt_list = []
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
380 event = MESSAGE_RESULT.format(mam_ns=mam.NS_MAM, query_id=query.query_id)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
381 client.xmlstream.addObserver(event, self._appendMessage, 0, elt_list, message_cb)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
382 d = self.queryArchive(client, query, service)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
383 d.addCallback(self._queryFinished, client, elt_list, event)
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
384 return d
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
385
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
386 def getPrefs(self, client, service=None):
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
387 """Retrieve the current user preferences.
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
388
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
389 @param service: entity offering the MAM service (None for user archives)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
390 @return: the server response as a Deferred domish.Element
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
391 """
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
392 # http://xmpp.org/extensions/xep-0313.html#prefs
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
393 return client._mam.queryPrefs(service)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
394
2701
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
395 def _setPrefs(self, service_s=None, default="roster", always=None, never=None,
2ea2369ae7de plugin XEP-0313: implementation of MAM for messages:
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
396 profile_key=C.PROF_KEY_NONE):
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
397 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
398 always_jid = [jid.JID(entity) for entity in always]
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
399 never_jid = [jid.JID(entity) for entity in never]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
400 # TODO: why not build here a MAMPrefs object instead of passing the args separately?
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
401 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
402
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
403 def setPrefs(self, client, service=None, default="roster", always=None, never=None):
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
404 """Set news user preferences.
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
405
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
406 @param service: entity offering the MAM service (None for user archives)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
407 @param default (unicode): a value in ('always', 'never', 'roster')
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
408 @param always (list): a list of JID instances
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
409 @param never (list): a list of JID instances
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
410 @param profile_key (unicode): %(doc_profile_key)s
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
411 @return: the server response as a Deferred domish.Element
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
412 """
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
413 # http://xmpp.org/extensions/xep-0313.html#prefs
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
414 return client._mam.setPrefs(service, default, always, never)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
415
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
416 def onMessageStanzaId(self, message_elt, client):
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
417 """Called when a message with a stanza-id is received
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
418
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
419 the messages' stanza ids are stored when received, so the last one can be used
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
420 to retrieve missing history on next connection
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
421 @param message_elt(domish.Element): <message> with a stanza-id
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
422 """
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
423 service_jid = client.jid.userhostJID()
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
424 stanza_id = self._sid.getStanzaId(message_elt, service_jid)
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
425 if stanza_id is None:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
426 log.debug(u"Ignoring <message>, stanza id is not from our server")
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
427 else:
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
428 # we use self._last_stanza_id_d do be sure that last_stanza_id is stored in
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
429 # the order of reception
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
430 self._last_stanza_id_d.addCallback(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
431 lambda __: self.host.memory.storage.setPrivateValue(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
432 namespace=mam.NS_MAM,
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
433 key=KEY_LAST_STANZA_ID,
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
434 value=stanza_id,
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
435 profile=client.profile))
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
436
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
437
1284
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
438 class SatMAMClient(mam.MAMClient):
41ffe2c2dddc plugin XEP-0313: update (still draft)
souliane <souliane@mailoo.org>
parents: 1277
diff changeset
439 implements(disco.IDisco)
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
440
2930
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
441 def __init__(self, plugin_parent):
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
442 self.plugin_parent = plugin_parent
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
443
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
444 @property
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
445 def host(self):
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
446 return self.parent.host_app
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
447
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
448 def connectionInitialized(self):
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
449 observer_xpath = MESSAGE_STANZA_ID.format(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
450 ns_stanza_id=self.host.ns_map[u'stanza_id'])
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
451 self.xmlstream.addObserver(
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
452 observer_xpath, self.plugin_parent.onMessageStanzaId, client=self.parent
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
453 )
32b6893240e0 plugin XEP-0313: fixed archive retrieval on connection:
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
454
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
455 def getDiscoInfo(self, requestor, target, nodeIdentifier=""):
1776
4fc1bf1af48f plugin XEP-0313: cleaning and improvments:
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
456 return [disco.DiscoFeature(mam.NS_MAM)]
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
457
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
458 def getDiscoItems(self, requestor, target, nodeIdentifier=""):
1277
3a3e3014f9f8 plugin XEP-0313: first draft:
souliane <souliane@mailoo.org>
parents:
diff changeset
459 return []