annotate sat/plugins/plugin_xep_0352.py @ 4002:5245b675f7ad

plugin XEP-0313: don't wait for MAM to be retrieved in connection workflow: MAM retrieval can be long, and can be done after connection, message just need to be sorted when being inserted (i.e. frontends must do insort). To avoid blocking connection for too long and result in bad UX and timeout risk, one2one MAM message are not retrieved in background.
author Goffi <goffi@goffi.org>
date Fri, 10 Mar 2023 17:22:45 +0100
parents be6d91572633
children 524856bd7b19
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
1 #!/usr/bin/env python3
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
3
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for Explicit Message Encryption
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
5 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
6
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
11
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
16
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
19
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from twisted.words.xish import domish
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from sat.core.i18n import _, D_
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from sat.core.constants import Const as C
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from sat.core.log import getLogger
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
24
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
25 log = getLogger(__name__)
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
26
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
27 PLUGIN_INFO = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
28 C.PI_NAME: "Client State Indication",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
29 C.PI_IMPORT_NAME: "XEP-0352",
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
30 C.PI_TYPE: C.PLUG_TYPE_XEP,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
31 C.PI_PROTOCOLS: ["XEP-0352"],
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
32 C.PI_DEPENDENCIES: [],
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
33 C.PI_MAIN: "XEP_0352",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
34 C.PI_HANDLER: "no",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
35 C.PI_DESCRIPTION: D_("Notify server when frontend is not actively used, to limit "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
36 "traffic and save bandwidth and battery life"),
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
37 }
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
38
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
39 NS_CSI = "urn:xmpp:csi:0"
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
40
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
41
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
42 class XEP_0352(object):
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
43
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
44 def __init__(self, host):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
45 log.info(_("Client State Indication plugin initialization"))
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
46 self.host = host
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
47 host.registerNamespace("csi", NS_CSI)
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
48
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
49 def isActive(self, client):
2882
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
50 try:
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
51 if not client._xep_0352_enabled:
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
52 return True
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
53 return client._xep_0352_active
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
54 except AttributeError:
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
55 # _xep_0352_active can not be set if isActive is called before
0c54970d8e6e plugin android: fixed csi_timer reset in setActive + crash on call of isActive before session initialisation
Goffi <goffi@goffi.org>
parents: 2871
diff changeset
56 # profileConnected has been called
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
57 log.debug("isActive called when XEP-0352 plugin has not yet set the "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
58 "attributes")
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
59 return True
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
60
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
61 def profileConnected(self, client):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
62 if (NS_CSI, 'csi') in client.xmlstream.features:
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
63 log.info(_("Client State Indication is available on this server"))
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
64 client._xep_0352_enabled = True
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
65 client._xep_0352_active = True
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
66 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
67 log.warning(_("Client State Indication is not available on this server, some"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
68 " bandwidth optimisations can't be used."))
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
69 client._xep_0352_enabled = False
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
70
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
71 def setInactive(self, client):
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
72 if self.isActive(client):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
73 inactive_elt = domish.Element((NS_CSI, 'inactive'))
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
74 client.send(inactive_elt)
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
75 client._xep_0352_active = False
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
76 log.info("inactive state set")
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
77
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
78 def setActive(self, client):
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
79 if not self.isActive(client):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
80 active_elt = domish.Element((NS_CSI, 'active'))
2871
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
81 client.send(active_elt)
9a019db21f3c plugin XEP-0352: implementation of Client State Indication
Goffi <goffi@goffi.org>
parents:
diff changeset
82 client._xep_0352_active = True
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2882
diff changeset
83 log.info("active state set")