annotate sat/plugins/plugin_sec_otr.py @ 3101:ab7e8ade848a

plugin XEP-0045: added room statuses to metadata: room statuses are now sent with other metadata on bridge signals, and saved in Room instance. They give useful data on the room, for instance they can be used to know if a full jid is used in this room.
author Goffi <goffi@goffi.org>
date Mon, 30 Dec 2019 20:44:02 +0100
parents 0408df45ebe7
children 9d0df638c8b4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
1 #!/usr/bin/env python3
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
3
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # SAT plugin for OTR encryption
2771
003b8b4b56a7 date update
Goffi <goffi@goffi.org>
parents: 2753
diff changeset
5 # Copyright (C) 2009-2019 Jérôme Poisson (goffi@goffi.org)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
6
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # This program is free software: you can redistribute it and/or modify
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
10 # (at your option) any later version.
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
11
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # This program is distributed in the hope that it will be useful,
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
15 # GNU Affero General Public License for more details.
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
16
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
19
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
20 # XXX: thanks to Darrik L Mazey for his documentation
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
21 # (https://blog.darmasoft.net/2013/06/30/using-pure-python-otr.html)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
22 # this implentation is based on it
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
23
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
24 import copy
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
25 import time
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
26 import uuid
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
27 from binascii import hexlify, unhexlify
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
28 from sat.core.i18n import _, D_
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
29 from sat.core.constants import Const as C
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from sat.core.log import getLogger
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
31 from sat.core import exceptions
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
32 from sat.tools import xml_tools
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
33 from twisted.words.protocols.jabber import jid
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
34 from twisted.python import failure
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
35 from twisted.internet import defer
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1249
diff changeset
36 from sat.memory import persistent
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
37 import potr
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
38
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
39 log = getLogger(__name__)
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
40
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
41
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
42 PLUGIN_INFO = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
43 C.PI_NAME: "OTR",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
44 C.PI_IMPORT_NAME: "OTR",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
45 C.PI_TYPE: "SEC",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
46 C.PI_PROTOCOLS: ["XEP-0364"],
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
47 C.PI_DEPENDENCIES: ["XEP-0280", "XEP-0334"],
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
48 C.PI_MAIN: "OTR",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
49 C.PI_HANDLER: "no",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
50 C.PI_DESCRIPTION: _("""Implementation of OTR"""),
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
51 }
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
52
2657
9190874a8ac5 plugin otr: use namespace specified in XEP-0378
Goffi <goffi@goffi.org>
parents: 2653
diff changeset
53 NS_OTR = "urn:xmpp:otr:0"
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
54 PRIVATE_KEY = "PRIVATE KEY"
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
55 OTR_MENU = D_("OTR")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
56 AUTH_TXT = D_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
57 "To authenticate your correspondent, you need to give your below fingerprint "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
58 "*BY AN EXTERNAL CANAL* (i.e. not in this chat), and check that the one he gives "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
59 "you is the same as below. If there is a mismatch, there can be a spy between you!"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
60 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
61 DROP_TXT = D_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
62 "You private key is used to encrypt messages for your correspondent, nobody except "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
63 "you must know it, if you are in doubt, you should drop it!\n\nAre you sure you "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
64 "want to drop your private key?"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
65 )
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
66 # NO_LOG_AND = D_(u"/!\\Your history is not logged anymore, and") # FIXME: not used at the moment
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
67 NO_ADV_FEATURES = D_("Some of advanced features are disabled !")
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
68
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
69 DEFAULT_POLICY_FLAGS = {"ALLOW_V1": False, "ALLOW_V2": True, "REQUIRE_ENCRYPTION": True}
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
70
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
71 OTR_STATE_TRUSTED = "trusted"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
72 OTR_STATE_UNTRUSTED = "untrusted"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
73 OTR_STATE_UNENCRYPTED = "unencrypted"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
74 OTR_STATE_ENCRYPTED = "encrypted"
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
75
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
76
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
77 class Context(potr.context.Context):
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
78 def __init__(self, context_manager, other_jid):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
79 self.context_manager = context_manager
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
80 super(Context, self).__init__(context_manager.account, other_jid)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
81
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
82 @property
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
83 def host(self):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
84 return self.context_manager.host
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
85
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
86 @property
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
87 def _p_hints(self):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
88 return self.context_manager.parent._p_hints
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
89
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
90 @property
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
91 def _p_carbons(self):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
92 return self.context_manager.parent._p_carbons
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
93
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
94 def getPolicy(self, key):
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
95 if key in DEFAULT_POLICY_FLAGS:
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
96 return DEFAULT_POLICY_FLAGS[key]
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
97 else:
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
98 return False
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
99
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
100 def inject(self, msg_str, appdata=None):
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
101 """Inject encrypted data in the stream
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
102
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
103 if appdata is not None, we are sending a message in sendMessageDataTrigger
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
104 stanza will be injected directly if appdata is None,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
105 else we just update the element and follow normal workflow
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
106 @param msg_str(str): encrypted message body
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
107 @param appdata(None, dict): None for signal message,
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
108 message data when an encrypted message is going to be sent
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
109 """
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
110 assert isinstance(self.peer, jid.JID)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
111 msg = msg_str.decode('utf-8')
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
112 client = self.user.client
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
113 log.debug("injecting encrypted message to {to}".format(to=self.peer))
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
114 if appdata is None:
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
115 mess_data = {
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
116 "from": client.jid,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
117 "to": self.peer,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
118 "uid": str(uuid.uuid4()),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
119 "message": {"": msg},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
120 "subject": {},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
121 "type": "chat",
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
122 "extra": {},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
123 "timestamp": time.time(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
124 }
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
125 client.generateMessageXML(mess_data)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
126 xml = mess_data['xml']
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
127 self._p_carbons.setPrivate(xml)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
128 self._p_hints.addHintElements(xml, [
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
129 self._p_hints.HINT_NO_COPY,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
130 self._p_hints.HINT_NO_PERMANENT_STORE])
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
131 client.send(mess_data["xml"])
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
132 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
133 message_elt = appdata["xml"]
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
134 assert message_elt.name == "message"
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
135 message_elt.addElement("body", content=msg)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
136
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
137 def stopCb(self, __, feedback):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
138 client = self.user.client
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
139 self.host.bridge.otrState(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
140 OTR_STATE_UNENCRYPTED, self.peer.full(), client.profile
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
141 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
142 client.feedback(self.peer, feedback)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
143
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
144 def stopEb(self, failure_):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
145 # encryption may be already stopped in case of manual stop
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
146 if not failure_.check(exceptions.NotFound):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
147 log.error("Error while stopping OTR encryption: {msg}".format(msg=failure_))
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
148
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
149 def isTrusted(self):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
150 # we have to check value because potr code says that a 2-tuples should be
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
151 # returned while in practice it's either None or u"trusted"
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
152 trusted = self.getCurrentTrust()
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
153 if trusted is None:
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
154 return False
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
155 elif trusted == 'trusted':
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
156 return True
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
157 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
158 log.error("Unexpected getCurrentTrust() value: {value}".format(
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
159 value=trusted))
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
160 return False
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
161
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
162 def setState(self, state):
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
163 client = self.user.client
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
164 old_state = self.state
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
165 super(Context, self).setState(state)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
166 log.debug("setState: %s (old_state=%s)" % (state, old_state))
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
167
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
168 if state == potr.context.STATE_PLAINTEXT:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
169 feedback = _("/!\\ conversation with %(other_jid)s is now UNENCRYPTED") % {
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
170 "other_jid": self.peer.full()
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
171 }
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
172 d = client.encryption.stop(self.peer, NS_OTR)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
173 d.addCallback(self.stopCb, feedback=feedback)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
174 d.addErrback(self.stopEb)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
175 return
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
176 elif state == potr.context.STATE_ENCRYPTED:
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
177 client.encryption.start(self.peer, NS_OTR)
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
178 try:
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
179 trusted = self.isTrusted()
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
180 except TypeError:
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
181 trusted = False
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
182 trusted_str = _("trusted") if trusted else _("untrusted")
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
183
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
184 if old_state == potr.context.STATE_ENCRYPTED:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
185 feedback = D_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
186 "{trusted} OTR conversation with {other_jid} REFRESHED"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
187 ).format(trusted=trusted_str, other_jid=self.peer.full())
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
188 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
189 feedback = D_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
190 "{trusted} encrypted OTR conversation started with {other_jid}\n"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
191 "{extra_info}"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
192 ).format(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
193 trusted=trusted_str,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
194 other_jid=self.peer.full(),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
195 extra_info=NO_ADV_FEATURES,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
196 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
197 self.host.bridge.otrState(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
198 OTR_STATE_ENCRYPTED, self.peer.full(), client.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
199 )
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
200 elif state == potr.context.STATE_FINISHED:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
201 feedback = D_("OTR conversation with {other_jid} is FINISHED").format(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
202 other_jid=self.peer.full()
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
203 )
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
204 d = client.encryption.stop(self.peer, NS_OTR)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
205 d.addCallback(self.stopCb, feedback=feedback)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
206 d.addErrback(self.stopEb)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
207 return
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
208 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
209 log.error(D_("Unknown OTR state"))
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
210 return
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
211
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
212 client.feedback(self.peer, feedback)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
213
1169
a3354063dfb6 plugin OTR: disconnect the active OTR sessions and delete the context on profile disconnection
souliane <souliane@mailoo.org>
parents: 1168
diff changeset
214 def disconnect(self):
a3354063dfb6 plugin OTR: disconnect the active OTR sessions and delete the context on profile disconnection
souliane <souliane@mailoo.org>
parents: 1168
diff changeset
215 """Disconnect the session."""
a3354063dfb6 plugin OTR: disconnect the active OTR sessions and delete the context on profile disconnection
souliane <souliane@mailoo.org>
parents: 1168
diff changeset
216 if self.state != potr.context.STATE_PLAINTEXT:
a3354063dfb6 plugin OTR: disconnect the active OTR sessions and delete the context on profile disconnection
souliane <souliane@mailoo.org>
parents: 1168
diff changeset
217 super(Context, self).disconnect()
a3354063dfb6 plugin OTR: disconnect the active OTR sessions and delete the context on profile disconnection
souliane <souliane@mailoo.org>
parents: 1168
diff changeset
218
1170
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1169
diff changeset
219 def finish(self):
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
220 """Finish the session
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
221
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
222 avoid to send any message but the user still has to end the session himself.
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
223 """
1170
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1169
diff changeset
224 if self.state == potr.context.STATE_ENCRYPTED:
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1169
diff changeset
225 self.processTLVs([potr.proto.DisconnectTLV()])
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1169
diff changeset
226
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
227
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
228 class Account(potr.context.Account):
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
229 # TODO: manage trusted keys: if a fingerprint is not used anymore,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
230 # we have no way to remove it from database yet (same thing for a
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
231 # correspondent jid)
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
232 # TODO: manage explicit message encryption
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
233
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
234 def __init__(self, host, client):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
235 log.debug("new account: %s" % client.jid)
1135
3158f9e08760 plugin OTR: a warning is logged when Account is instancied with a bare jid.
Goffi <goffi@goffi.org>
parents: 1134
diff changeset
236 if not client.jid.resource:
3158f9e08760 plugin OTR: a warning is logged when Account is instancied with a bare jid.
Goffi <goffi@goffi.org>
parents: 1134
diff changeset
237 log.warning("Account created without resource")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
238 super(Account, self).__init__(str(client.jid), "xmpp", 1024)
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
239 self.host = host
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
240 self.client = client
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
241
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
242 def loadPrivkey(self):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
243 log.debug("loadPrivkey")
1146
1ac5ea74dbdf plugin OTR: remove unnecessary attribute SatXMPPClient.otr_priv_key
souliane <souliane@mailoo.org>
parents: 1144
diff changeset
244 return self.privkey
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
245
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
246 def savePrivkey(self):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
247 log.debug("savePrivkey")
1137
768f1f1ef12c plugin otr: priv_key is better than getPrivKey here, as it should not be None + fixed private key encryption/decryption
Goffi <goffi@goffi.org>
parents: 1136
diff changeset
248 if self.privkey is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
249 raise exceptions.InternalError(_("Save is called but privkey is None !"))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
250 priv_key = hexlify(self.privkey.serializePrivateKey())
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
251 d = self.host.memory.encryptValue(priv_key, self.client.profile)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
252
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
253 def save_encrypted_key(encrypted_priv_key):
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
254 self.client._otr_data[PRIVATE_KEY] = encrypted_priv_key
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
255
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
256 d.addCallback(save_encrypted_key)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
257
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
258 def loadTrusts(self):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
259 trust_data = self.client._otr_data.get("trust", {})
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
260 for jid_, jid_data in trust_data.items():
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
261 for fingerprint, trust_level in jid_data.items():
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
262 log.debug(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
263 'setting trust for {jid}: [{fingerprint}] = "{trust_level}"'.format(
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
264 jid=jid_, fingerprint=fingerprint, trust_level=trust_level
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
265 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
266 )
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
267 self.trusts.setdefault(jid.JID(jid_), {})[fingerprint] = trust_level
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
268
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
269 def saveTrusts(self):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
270 log.debug("saving trusts for {profile}".format(profile=self.client.profile))
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
271 log.debug("trusts = {}".format(self.client._otr_data["trust"]))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
272 self.client._otr_data.force("trust")
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
273
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
274 def setTrust(self, other_jid, fingerprint, trustLevel):
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
275 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
276 trust_data = self.client._otr_data["trust"]
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
277 except KeyError:
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
278 trust_data = {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
279 self.client._otr_data["trust"] = trust_data
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
280 jid_data = trust_data.setdefault(other_jid.full(), {})
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
281 jid_data[fingerprint] = trustLevel
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
282 super(Account, self).setTrust(other_jid, fingerprint, trustLevel)
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
283
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
284
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
285 class ContextManager(object):
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
286 def __init__(self, parent, client):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
287 self.parent = parent
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
288 self.account = Account(parent.host, client)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
289 self.contexts = {}
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
290
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
291 @property
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
292 def host(self):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
293 return self.parent.host
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
294
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
295 def startContext(self, other_jid):
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
296 assert isinstance(other_jid, jid.JID)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
297 context = self.contexts.setdefault(
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
298 other_jid, Context(self, other_jid)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
299 )
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
300 return context
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
301
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
302 def getContextForUser(self, other):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
303 log.debug("getContextForUser [%s]" % other)
1135
3158f9e08760 plugin OTR: a warning is logged when Account is instancied with a bare jid.
Goffi <goffi@goffi.org>
parents: 1134
diff changeset
304 if not other.resource:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
305 log.warning("getContextForUser called with a bare jid: %s" % other.full())
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
306 return self.startContext(other)
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
307
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
308
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
309 class OTR(object):
2659
c26492bd2144 plugin OTR: use new "directed" attribute when registering + use new markAsEncrypted
Goffi <goffi@goffi.org>
parents: 2657
diff changeset
310
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
311 def __init__(self, host):
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
312 log.info(_("OTR plugin initialization"))
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
313 self.host = host
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
314 self.context_managers = {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
315 self.skipped_profiles = (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
316 set()
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
317 ) #  FIXME: OTR should not be skipped per profile, this need to be refactored
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
318 self._p_hints = host.plugins["XEP-0334"]
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
319 self._p_carbons = host.plugins["XEP-0280"]
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
320 host.trigger.add("MessageReceived", self.MessageReceivedTrigger, priority=100000)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
321 host.trigger.add("sendMessage", self.sendMessageTrigger, priority=100000)
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
322 host.trigger.add("sendMessageData", self._sendMessageDataTrigger)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
323 host.bridge.addMethod(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
324 "skipOTR", ".plugin", in_sign="s", out_sign="", method=self._skipOTR
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
325 ) # FIXME: must be removed, must be done on per-message basis
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
326 host.bridge.addSignal(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
327 "otrState", ".plugin", signature="sss"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
328 ) # args: state, destinee_jid, profile
2811
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
329 # XXX: menus are disabled in favor to the new more generic encryption menu
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
330 # there are let here commented for a little while as a reference
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
331 # host.importMenu(
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
332 # (OTR_MENU, D_(u"Start/Refresh")),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
333 # self._otrStartRefresh,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
334 # security_limit=0,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
335 # help_string=D_(u"Start or refresh an OTR session"),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
336 # type_=C.MENU_SINGLE,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
337 # )
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
338 # host.importMenu(
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
339 # (OTR_MENU, D_(u"End session")),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
340 # self._otrSessionEnd,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
341 # security_limit=0,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
342 # help_string=D_(u"Finish an OTR session"),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
343 # type_=C.MENU_SINGLE,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
344 # )
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
345 # host.importMenu(
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
346 # (OTR_MENU, D_(u"Authenticate")),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
347 # self._otrAuthenticate,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
348 # security_limit=0,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
349 # help_string=D_(u"Authenticate user/see your fingerprint"),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
350 # type_=C.MENU_SINGLE,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
351 # )
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
352 # host.importMenu(
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
353 # (OTR_MENU, D_(u"Drop private key")),
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
354 # self._dropPrivKey,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
355 # security_limit=0,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
356 # type_=C.MENU_SINGLE,
a26b1ad2d3a4 plugin OTR: disabled menu as the new generic encryption menu allows to start/stop OTR or display the trust UI.
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
357 # )
2820
7ab8684784c6 core: renamed presenceReceived to presence_reveiced + use "client" as first arguments instead of "profile"
Goffi <goffi@goffi.org>
parents: 2812
diff changeset
358 host.trigger.add("presence_received", self._presenceReceivedTrigger)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
359 self.host.registerEncryptionPlugin(self, "OTR", NS_OTR, directed=True)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
360
1149
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
361 def _skipOTR(self, profile):
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
362 """Tell the backend to not handle OTR for this profile.
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
363
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
364 @param profile (str): %(doc_profile)s
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
365 """
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
366 # FIXME: should not be done per profile but per message, using extra data
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
367 # for message received, profile wide hook may be need, but client
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
368 # should be used anyway instead of a class attribute
1149
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
369 self.skipped_profiles.add(profile)
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
370
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
371 @defer.inlineCallbacks
2812
ba2e03ee7c4f plugin OTR: do profile session init in profileConnecting, so it is done before receiving any stanza
Goffi <goffi@goffi.org>
parents: 2811
diff changeset
372 def profileConnecting(self, client):
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
373 if client.profile in self.skipped_profiles:
1149
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
374 return
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
375 ctxMng = client._otr_context_manager = ContextManager(self, client)
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
376 client._otr_data = persistent.PersistentBinaryDict(NS_OTR, client.profile)
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
377 yield client._otr_data.load()
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
378 encrypted_priv_key = client._otr_data.get(PRIVATE_KEY, None)
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
379 if encrypted_priv_key is not None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
380 priv_key = yield self.host.memory.decryptValue(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
381 encrypted_priv_key, client.profile
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
382 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
383 ctxMng.account.privkey = potr.crypt.PK.parsePrivateKey(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
384 unhexlify(priv_key.encode('utf-8'))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
385 )[0]
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
386 else:
1146
1ac5ea74dbdf plugin OTR: remove unnecessary attribute SatXMPPClient.otr_priv_key
souliane <souliane@mailoo.org>
parents: 1144
diff changeset
387 ctxMng.account.privkey = None
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
388 ctxMng.account.loadTrusts()
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
389
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
390 def profileDisconnected(self, client):
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
391 if client.profile in self.skipped_profiles:
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
392 self.skipped_profiles.remove(client.profile)
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
393 return
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
394 for context in list(client._otr_context_manager.contexts.values()):
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
395 context.disconnect()
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
396 del client._otr_context_manager
1149
652cd93dfdb4 plugin OTR: add bridge method skipOTR to desactivate OTR handling for a given profile
souliane <souliane@mailoo.org>
parents: 1147
diff changeset
397
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
398 # encryption plugin methods
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
399
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
400 def startEncryption(self, client, entity_jid):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
401 self.startRefresh(client, entity_jid)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
402
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
403 def stopEncryption(self, client, entity_jid):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
404 self.endSession(client, entity_jid)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
405
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
406 def getTrustUI(self, client, entity_jid):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
407 if not entity_jid.resource:
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
408 entity_jid.resource = self.host.memory.getMainResource(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
409 client, entity_jid
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
410 ) # FIXME: temporary and unsecure, must be changed when frontends
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
411 # are refactored
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
412 ctxMng = client._otr_context_manager
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
413 otrctx = ctxMng.getContextForUser(entity_jid)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
414 priv_key = ctxMng.account.privkey
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
415
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
416 if priv_key is None:
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
417 # we have no private key yet
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
418 dialog = xml_tools.XMLUI(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
419 C.XMLUI_DIALOG,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
420 dialog_opt={
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
421 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_MESSAGE,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
422 C.XMLUI_DATA_MESS: _(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
423 "You have no private key yet, start an OTR conversation to "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
424 "have one"
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
425 ),
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
426 C.XMLUI_DATA_LVL: C.XMLUI_DATA_LVL_WARNING,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
427 },
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
428 title=_("No private key"),
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
429 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
430 return dialog
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
431
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
432 other_fingerprint = otrctx.getCurrentKey()
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
433
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
434 if other_fingerprint is None:
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
435 # we have a private key, but not the fingerprint of our correspondent
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
436 dialog = xml_tools.XMLUI(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
437 C.XMLUI_DIALOG,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
438 dialog_opt={
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
439 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_MESSAGE,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
440 C.XMLUI_DATA_MESS: _(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
441 "Your fingerprint is:\n{fingerprint}\n\n"
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
442 "Start an OTR conversation to have your correspondent one."
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
443 ).format(fingerprint=priv_key),
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
444 C.XMLUI_DATA_LVL: C.XMLUI_DATA_LVL_INFO,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
445 },
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
446 title=_("Fingerprint"),
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
447 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
448 return dialog
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
449
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
450 def setTrust(raw_data, profile):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
451 if xml_tools.isXMLUICancelled(raw_data):
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
452 return {}
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
453 # This method is called when authentication form is submited
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
454 data = xml_tools.XMLUIResult2DataFormResult(raw_data)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
455 if data["match"] == "yes":
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
456 otrctx.setCurrentTrust(OTR_STATE_TRUSTED)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
457 note_msg = _("Your correspondent {correspondent} is now TRUSTED")
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
458 self.host.bridge.otrState(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
459 OTR_STATE_TRUSTED, entity_jid.full(), client.profile
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
460 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
461 else:
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
462 otrctx.setCurrentTrust("")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
463 note_msg = _("Your correspondent {correspondent} is now UNTRUSTED")
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
464 self.host.bridge.otrState(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
465 OTR_STATE_UNTRUSTED, entity_jid.full(), client.profile
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
466 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
467 note = xml_tools.XMLUI(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
468 C.XMLUI_DIALOG,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
469 dialog_opt={
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
470 C.XMLUI_DATA_TYPE: C.XMLUI_DIALOG_NOTE,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
471 C.XMLUI_DATA_MESS: note_msg.format(correspondent=otrctx.peer),
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
472 },
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
473 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
474 return {"xmlui": note.toXml()}
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
475
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
476 submit_id = self.host.registerCallback(setTrust, with_data=True, one_shot=True)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
477 trusted = otrctx.isTrusted()
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
478
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
479 xmlui = xml_tools.XMLUI(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
480 C.XMLUI_FORM,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
481 title=_("Authentication ({entity_jid})").format(entity_jid=entity_jid.full()),
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
482 submit_id=submit_id,
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
483 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
484 xmlui.addText(_(AUTH_TXT))
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
485 xmlui.addDivider()
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
486 xmlui.addText(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
487 D_("Your own fingerprint is:\n{fingerprint}").format(fingerprint=priv_key)
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
488 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
489 xmlui.addText(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
490 D_("Your correspondent fingerprint should be:\n{fingerprint}").format(
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
491 fingerprint=other_fingerprint
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
492 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
493 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
494 xmlui.addDivider("blank")
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
495 xmlui.changeContainer("pairs")
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
496 xmlui.addLabel(D_("Is your correspondent fingerprint the same as here ?"))
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
497 xmlui.addList(
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
498 "match", [("yes", _("yes")), ("no", _("no"))], ["yes" if trusted else "no"]
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
499 )
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
500 return xmlui
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
501
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
502 def _otrStartRefresh(self, menu_data, profile):
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
503 """Start or refresh an OTR session
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
504
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
505 @param menu_data: %(menu_data)s
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
506 @param profile: %(doc_profile)s
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
507 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
508 client = self.host.getClient(profile)
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
509 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
510 to_jid = jid.JID(menu_data["jid"])
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
511 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
512 log.error(_("jid key is not present !"))
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
513 return defer.fail(exceptions.DataError)
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
514 self.startRefresh(client, to_jid)
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
515 return {}
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
516
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
517 def startRefresh(self, client, to_jid):
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
518 """Start or refresh an OTR session
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
519
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
520 @param to_jid(jid.JID): jid to start encrypted session with
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
521 """
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
522 encrypted_session = client.encryption.getSession(to_jid.userhostJID())
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
523 if encrypted_session and encrypted_session['plugin'].namespace != NS_OTR:
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
524 raise exceptions.ConflictError(_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
525 "Can't start an OTR session, there is already an encrypted session "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
526 "with {name}").format(name=encrypted_session['plugin'].name))
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
527 if not to_jid.resource:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
528 to_jid.resource = self.host.memory.getMainResource(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
529 client, to_jid
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
530 ) # FIXME: temporary and unsecure, must be changed when frontends
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
531 # are refactored
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
532 otrctx = client._otr_context_manager.getContextForUser(to_jid)
3040
fee60f17ebac jp: jp asyncio port:
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
533 query = otrctx.sendMessage(0, b"?OTRv?")
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
534 otrctx.inject(query)
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
535
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
536 def _otrSessionEnd(self, menu_data, profile):
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
537 """End an OTR session
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
538
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
539 @param menu_data: %(menu_data)s
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
540 @param profile: %(doc_profile)s
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
541 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
542 client = self.host.getClient(profile)
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
543 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
544 to_jid = jid.JID(menu_data["jid"])
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
545 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
546 log.error(_("jid key is not present !"))
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
547 return defer.fail(exceptions.DataError)
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
548 self.endSession(client, to_jid)
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
549 return {}
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
550
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
551 def endSession(self, client, to_jid):
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
552 """End an OTR session"""
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
553 if not to_jid.resource:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
554 to_jid.resource = self.host.memory.getMainResource(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
555 client, to_jid
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
556 ) # FIXME: temporary and unsecure, must be changed when frontends
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
557 # are refactored
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
558 otrctx = client._otr_context_manager.getContextForUser(to_jid)
1136
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
559 otrctx.disconnect()
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
560 return {}
ea2bbdf5b541 plugin OTR: added start/refresh and end session menus
Goffi <goffi@goffi.org>
parents: 1135
diff changeset
561
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
562 def _otrAuthenticate(self, menu_data, profile):
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
563 """End an OTR session
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
564
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
565 @param menu_data: %(menu_data)s
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
566 @param profile: %(doc_profile)s
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
567 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
568 client = self.host.getClient(profile)
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
569 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
570 to_jid = jid.JID(menu_data["jid"])
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
571 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
572 log.error(_("jid key is not present !"))
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
573 return defer.fail(exceptions.DataError)
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
574 return self.authenticate(client, to_jid)
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
575
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
576 def authenticate(self, client, to_jid):
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
577 """Authenticate other user and see our own fingerprint"""
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
578 xmlui = self.getTrustUI(client, to_jid)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
579 return {"xmlui": xmlui.toXml()}
1141
7fcafc3206b1 plugin OTR: authentication management + fixed a bug in setState (due to a wrong docstring in potr.context.getCurrentTrust)
Goffi <goffi@goffi.org>
parents: 1137
diff changeset
580
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
581 def _dropPrivKey(self, menu_data, profile):
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
582 """Drop our private Key
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
583
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
584 @param menu_data: %(menu_data)s
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
585 @param profile: %(doc_profile)s
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
586 """
1970
200cd707a46d plugin XEP-0045, quick_frontend + primitivus (chat): cleaning of XEP-0045 (first pass):
Goffi <goffi@goffi.org>
parents: 1963
diff changeset
587 client = self.host.getClient(profile)
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
588 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
589 to_jid = jid.JID(menu_data["jid"])
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
590 if not to_jid.resource:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
591 to_jid.resource = self.host.memory.getMainResource(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
592 client, to_jid
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
593 ) # FIXME: temporary and unsecure, must be changed when frontends
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
594 # are refactored
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
595 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
596 log.error(_("jid key is not present !"))
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
597 return defer.fail(exceptions.DataError)
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
598
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
599 ctxMng = client._otr_context_manager
1146
1ac5ea74dbdf plugin OTR: remove unnecessary attribute SatXMPPClient.otr_priv_key
souliane <souliane@mailoo.org>
parents: 1144
diff changeset
600 if ctxMng.account.privkey is None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
601 return {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
602 "xmlui": xml_tools.note(_("You don't have a private key yet !")).toXml()
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
603 }
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
604
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
605 def dropKey(data, profile):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
606 if C.bool(data["answer"]):
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
607 # we end all sessions
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
608 for context in list(ctxMng.contexts.values()):
1169
a3354063dfb6 plugin OTR: disconnect the active OTR sessions and delete the context on profile disconnection
souliane <souliane@mailoo.org>
parents: 1168
diff changeset
609 context.disconnect()
1147
736f1dd6e142 plugin OTR: two small fixes
souliane <souliane@mailoo.org>
parents: 1146
diff changeset
610 ctxMng.account.privkey = None
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
611 ctxMng.account.getPrivkey() # as account.privkey is None, getPrivkey
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
612 # will generate a new key, and save it
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
613 return {
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
614 "xmlui": xml_tools.note(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
615 D_("Your private key has been dropped")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
616 ).toXml()
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
617 }
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
618 return {}
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
619
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
620 submit_id = self.host.registerCallback(dropKey, with_data=True, one_shot=True)
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
621
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
622 confirm = xml_tools.XMLUI(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
623 C.XMLUI_DIALOG,
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
624 title=_("Confirm private key drop"),
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
625 dialog_opt={"type": C.XMLUI_DIALOG_CONFIRM, "message": _(DROP_TXT)},
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
626 submit_id=submit_id,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
627 )
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
628 return {"xmlui": confirm.toXml()}
1144
2481fa96ac1c plugin OTR: added ability to drop private key
Goffi <goffi@goffi.org>
parents: 1141
diff changeset
629
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
630 def _receivedTreatment(self, data, client):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
631 from_jid = data["from"]
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
632 log.debug("_receivedTreatment [from_jid = %s]" % from_jid)
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
633 otrctx = client._otr_context_manager.getContextForUser(from_jid)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
634
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
635 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
636 message = (
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
637 next(iter(data["message"].values()))
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
638 ) # FIXME: Q&D fix for message refactoring, message is now a dict
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
639 res = otrctx.receiveMessage(message.encode("utf-8"))
3058
0408df45ebe7 plugin OTR: work around a bad exception raised in potr
Goffi <goffi@goffi.org>
parents: 3040
diff changeset
640 except (potr.context.UnencryptedMessage, potr.context.NotOTRMessage):
0408df45ebe7 plugin OTR: work around a bad exception raised in potr
Goffi <goffi@goffi.org>
parents: 3040
diff changeset
641 # potr has a bug with Python 3 and test message against str while bytes are
0408df45ebe7 plugin OTR: work around a bad exception raised in potr
Goffi <goffi@goffi.org>
parents: 3040
diff changeset
642 # expected, resulting in a NoOTRMessage raised instead of UnencryptedMessage;
0408df45ebe7 plugin OTR: work around a bad exception raised in potr
Goffi <goffi@goffi.org>
parents: 3040
diff changeset
643 # so we catch NotOTRMessage as a workaround
0408df45ebe7 plugin OTR: work around a bad exception raised in potr
Goffi <goffi@goffi.org>
parents: 3040
diff changeset
644 # TODO: report this upstream
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
645 encrypted = False
1095
ef7b7dd5c5db plugin OTR: various improvments:
Goffi <goffi@goffi.org>
parents: 1055
diff changeset
646 if otrctx.state == potr.context.STATE_ENCRYPTED:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
647 log.warning(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
648 "Received unencrypted message in an encrypted context (from {jid})"
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
649 .format(jid=from_jid.full())
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
650 )
2125
ca82c97db195 plugin sec OTR: fixed OTR:
Goffi <goffi@goffi.org>
parents: 1970
diff changeset
651
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
652 feedback = (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
653 D_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
654 "WARNING: received unencrypted data in a supposedly encrypted "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
655 "context"
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
656 ),
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
657 )
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
658 client.feedback(from_jid, feedback)
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
659 except potr.context.NotEncryptedError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
660 msg = D_("WARNING: received OTR encrypted data in an unencrypted context")
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
661 log.warning(msg)
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
662 feedback = msg
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
663 client.feedback(from_jid, msg)
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
664 raise failure.Failure(exceptions.CancelError(msg))
2726
a86f494457c2 plugin OTR: catch and log potr.context.ErrorReceived instead of raising it.
Goffi <goffi@goffi.org>
parents: 2659
diff changeset
665 except potr.context.ErrorReceived as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
666 msg = D_("WARNING: received OTR error message: {msg}".format(msg=e))
2726
a86f494457c2 plugin OTR: catch and log potr.context.ErrorReceived instead of raising it.
Goffi <goffi@goffi.org>
parents: 2659
diff changeset
667 log.warning(msg)
a86f494457c2 plugin OTR: catch and log potr.context.ErrorReceived instead of raising it.
Goffi <goffi@goffi.org>
parents: 2659
diff changeset
668 feedback = msg
a86f494457c2 plugin OTR: catch and log potr.context.ErrorReceived instead of raising it.
Goffi <goffi@goffi.org>
parents: 2659
diff changeset
669 client.feedback(from_jid, msg)
a86f494457c2 plugin OTR: catch and log potr.context.ErrorReceived instead of raising it.
Goffi <goffi@goffi.org>
parents: 2659
diff changeset
670 raise failure.Failure(exceptions.CancelError(msg))
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
671 except potr.crypt.InvalidParameterError as e:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
672 msg = D_("Error while trying de decrypt OTR message: {msg}".format(msg=e))
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
673 log.warning(msg)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
674 feedback = msg
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
675 client.feedback(from_jid, msg)
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
676 raise failure.Failure(exceptions.CancelError(msg))
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
677 except StopIteration:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
678 return data
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
679 else:
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
680 encrypted = True
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
681
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
682 if encrypted:
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
683 if res[0] != None:
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
684 # decrypted messages handling.
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
685 # receiveMessage() will return a tuple,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
686 # the first part of which will be the decrypted message
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
687 data["message"] = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
688 "": res[0]
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
689 } # FIXME: Q&D fix for message refactoring, message is now a dict
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
690 try:
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
691 # we want to keep message in history, even if no store is
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
692 # requested in message hints
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
693 del data["history"]
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
694 except KeyError:
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
695 pass
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
696 # TODO: add skip history as an option, but by default we don't skip it
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
697 # data[u'history'] = C.HISTORY_SKIP # we send the decrypted message to
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
698 # frontends, but we don't want it in
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
699 # history
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
700 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
701 raise failure.Failure(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
702 exceptions.CancelError("Cancelled by OTR")
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
703 ) # no message at all (no history, no signal)
2753
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
704
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
705 client.encryption.markAsEncrypted(data)
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
706 trusted = otrctx.isTrusted()
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
707
2753
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
708 if trusted:
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
709 client.encryption.markAsTrusted(data)
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
710 else:
3dd265d281e1 plugin OTR: fixed a bug which was tagging every message as "encrypted"
Goffi <goffi@goffi.org>
parents: 2743
diff changeset
711 client.encryption.markAsUntrusted(data)
2743
da59ff099b32 core (memory/encryption), plugin OTR: finished OTR integration in encryption:
Goffi <goffi@goffi.org>
parents: 2726
diff changeset
712
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
713 return data
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
714
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
715 def _receivedTreatmentForSkippedProfiles(self, data):
1174
bc811915a96a plugin OTR: do not save in history the encrypted messages for skipped profiles
souliane <souliane@mailoo.org>
parents: 1171
diff changeset
716 """This profile must be skipped because the frontend manages OTR itself,
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
717
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
718 but we still need to check if the message must be stored in history or not
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
719 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
720 #  XXX: FIXME: this should not be done on a per-profile basis, but per-message
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
721 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
722 message = (
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
723 iter(data["message"].values()).next().encode("utf-8")
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
724 ) # FIXME: Q&D fix for message refactoring, message is now a dict
1955
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
725 except StopIteration:
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
726 return data
633b5c21aefd backend, frontend: messages refactoring (huge commit, not finished):
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
727 if message.startswith(potr.proto.OTRTAG):
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
728 #  FIXME: it may be better to cancel the message and send it direclty to
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
729 # bridge
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
730 # this is used by Libervia, but this may send garbage message to
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
731 # other frontends
2132
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
732 # if they are used at the same time as Libervia.
c0577837680a core: replaced SkipHistory exception by a key in mess_data:
Goffi <goffi@goffi.org>
parents: 2129
diff changeset
733 # Hard to avoid with decryption on Libervia though.
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
734 data["history"] = C.HISTORY_SKIP
1174
bc811915a96a plugin OTR: do not save in history the encrypted messages for skipped profiles
souliane <souliane@mailoo.org>
parents: 1171
diff changeset
735 return data
bc811915a96a plugin OTR: do not save in history the encrypted messages for skipped profiles
souliane <souliane@mailoo.org>
parents: 1171
diff changeset
736
1963
a2bc5089c2eb backend, frontends: message refactoring (huge commit):
Goffi <goffi@goffi.org>
parents: 1955
diff changeset
737 def MessageReceivedTrigger(self, client, message_elt, post_treat):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
738 if message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT:
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
739 # OTR is not possible in group chats
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
740 return True
2821
3d735e0ab2fa plugin OTR: ignore messages from sender without resource or from own jid
Goffi <goffi@goffi.org>
parents: 2820
diff changeset
741 from_jid = jid.JID(message_elt['from'])
3d735e0ab2fa plugin OTR: ignore messages from sender without resource or from own jid
Goffi <goffi@goffi.org>
parents: 2820
diff changeset
742 if not from_jid.resource or from_jid.userhostJID() == client.jid.userhostJID():
3d735e0ab2fa plugin OTR: ignore messages from sender without resource or from own jid
Goffi <goffi@goffi.org>
parents: 2820
diff changeset
743 # OTR is only usable when resources are present
3d735e0ab2fa plugin OTR: ignore messages from sender without resource or from own jid
Goffi <goffi@goffi.org>
parents: 2820
diff changeset
744 return True
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
745 if client.profile in self.skipped_profiles:
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
746 post_treat.addCallback(self._receivedTreatmentForSkippedProfiles)
1174
bc811915a96a plugin OTR: do not save in history the encrypted messages for skipped profiles
souliane <souliane@mailoo.org>
parents: 1171
diff changeset
747 else:
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
748 post_treat.addCallback(self._receivedTreatment, client)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
749 return True
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
750
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
751 def _sendMessageDataTrigger(self, client, mess_data):
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
752 encryption = mess_data.get(C.MESS_KEY_ENCRYPTION)
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
753 if encryption is None or encryption['plugin'].namespace != NS_OTR:
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
754 return
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
755 to_jid = mess_data['to']
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
756 if not to_jid.resource:
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
757 to_jid.resource = self.host.memory.getMainResource(
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
758 client, to_jid
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
759 ) # FIXME: temporary and unsecure, must be changed when frontends
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
760 otrctx = client._otr_context_manager.getContextForUser(to_jid)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
761 message_elt = mess_data["xml"]
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
762 if otrctx.state == potr.context.STATE_ENCRYPTED:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
763 log.debug("encrypting message")
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
764 body = None
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
765 for child in list(message_elt.children):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
766 if child.name == "body":
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
767 # we remove all unencrypted body,
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
768 # and will only encrypt the first one
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
769 if body is None:
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
770 body = child
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
771 message_elt.children.remove(child)
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
772 elif child.name == "html":
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
773 # we don't want any XHTML-IM element
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
774 message_elt.children.remove(child)
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
775 if body is None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
776 log.warning("No message found")
1168
39572f9d5249 plugin OTR: fixes handling of the FINISHED state
souliane <souliane@mailoo.org>
parents: 1149
diff changeset
777 else:
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
778 self._p_carbons.setPrivate(message_elt)
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
779 self._p_hints.addHintElements(message_elt, [
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
780 self._p_hints.HINT_NO_COPY,
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
781 self._p_hints.HINT_NO_PERMANENT_STORE])
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
782 otrctx.sendMessage(0, str(body).encode("utf-8"), appdata=mess_data)
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
783 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
784 feedback = D_(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
785 "Your message was not sent because your correspondent closed the "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
786 "encrypted conversation on his/her side. "
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
787 "Either close your own side, or refresh the session."
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
788 )
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
789 log.warning(_("Message discarded because closed encryption channel"))
2144
1d3f73e065e1 core, jp: component handling + client handling refactoring:
Goffi <goffi@goffi.org>
parents: 2138
diff changeset
790 client.feedback(to_jid, feedback)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2821
diff changeset
791 raise failure.Failure(exceptions.CancelError("Cancelled by OTR plugin"))
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
792
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
793 def sendMessageTrigger(self, client, mess_data, pre_xml_treatments,
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
794 post_xml_treatments):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
795 if mess_data["type"] == "groupchat":
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
796 return True
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
797
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
798 if client.profile in self.skipped_profiles:
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
799 #  FIXME: should not be done on a per-profile basis
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
800 return True
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
801
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
802 to_jid = copy.copy(mess_data["to"])
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
803 if client.encryption.getSession(to_jid.userhostJID()):
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
804 # there is already an encrypted session with this entity
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
805 return True
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
806
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
807 if not to_jid.resource:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
808 to_jid.resource = self.host.memory.getMainResource(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
809 client, to_jid
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
810 ) # FIXME: full jid may not be known
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
811
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
812 otrctx = client._otr_context_manager.getContextForUser(to_jid)
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
813
2138
6e509ee853a8 plugin OTR, core; use of new sendMessage + OTR mini refactoring:
Goffi <goffi@goffi.org>
parents: 2132
diff changeset
814 if otrctx.state != potr.context.STATE_PLAINTEXT:
2653
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
815 client.encryption.start(to_jid, NS_OTR)
7213caa5c5d0 plugin OTR: integrated in new encryption handler + fixed use of bare jid where full jid was expected
Goffi <goffi@goffi.org>
parents: 2643
diff changeset
816 client.encryption.setEncryptionFlag(mess_data)
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
817 if not mess_data["to"].resource:
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
818 # if not resource was given, we force it here
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
819 mess_data["to"] = to_jid
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
820 return True
1055
abcac1ac27a7 plugin otr: first draft
Goffi <goffi@goffi.org>
parents:
diff changeset
821
2820
7ab8684784c6 core: renamed presenceReceived to presence_reveiced + use "client" as first arguments instead of "profile"
Goffi <goffi@goffi.org>
parents: 2812
diff changeset
822 def _presenceReceivedTrigger(self, client, entity, show, priority, statuses):
1480
8d61160ee4b8 core, plugin watched: new plugin, show an alert when a watched entity goes online
Goffi <goffi@goffi.org>
parents: 1463
diff changeset
823 if show != C.PRESENCE_UNAVAILABLE:
1249
3be9d8ab2e15 plugin sec_otr: a trigger was not returning True
souliane <souliane@mailoo.org>
parents: 1246
diff changeset
824 return True
1170
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1169
diff changeset
825 if not entity.resource:
1657
62cd8fc1aef7 plugin sec_otr: fixes bad handling of entity disconnection
souliane <souliane@mailoo.org>
parents: 1480
diff changeset
826 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
827 entity.resource = self.host.memory.getMainResource(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
828 client, entity
2643
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
829 ) # FIXME: temporary and unsecure, must be changed when frontends
189e38fb11ff core: style improvments (90 chars limit)
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
830 # are refactored
1657
62cd8fc1aef7 plugin sec_otr: fixes bad handling of entity disconnection
souliane <souliane@mailoo.org>
parents: 1480
diff changeset
831 except exceptions.UnknownEntityError:
62cd8fc1aef7 plugin sec_otr: fixes bad handling of entity disconnection
souliane <souliane@mailoo.org>
parents: 1480
diff changeset
832 return True # entity was not connected
2128
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
833 if entity in client._otr_context_manager.contexts:
aa94f33fd2ad plugin otr: various improvments:
Goffi <goffi@goffi.org>
parents: 2125
diff changeset
834 otrctx = client._otr_context_manager.getContextForUser(entity)
1657
62cd8fc1aef7 plugin sec_otr: fixes bad handling of entity disconnection
souliane <souliane@mailoo.org>
parents: 1480
diff changeset
835 otrctx.disconnect()
1170
2df6427a5299 plugin OTR: forces FINISHED state if we are in ENCRYPTED state on contact disconnection
souliane <souliane@mailoo.org>
parents: 1169
diff changeset
836 return True