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