Mercurial > libervia-backend
annotate sat/plugins/plugin_xep_0384.py @ 3786:cebfdfff3e99
doc (components): message delivery documentation:
fix 366
author | Goffi <goffi@goffi.org> |
---|---|
date | Tue, 24 May 2022 17:57:41 +0200 |
parents | 11f7ca8afd15 |
children | cc653b2685f0 |
rev | line source |
---|---|
3028 | 1 #!/usr/bin/env python3 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
2 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
3 # SAT plugin for OMEMO encryption |
3479 | 4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
5 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
6 # This program is free software: you can redistribute it and/or modify |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
7 # it under the terms of the GNU Affero General Public License as published by |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
8 # the Free Software Foundation, either version 3 of the License, or |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
9 # (at your option) any later version. |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
10 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
11 # This program is distributed in the hope that it will be useful, |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
14 # GNU Affero General Public License for more details. |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
15 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
16 # You should have received a copy of the GNU Affero General Public License |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
17 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
18 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
19 import logging |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
20 import random |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
21 import base64 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
22 from functools import partial |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
23 from xml.sax.saxutils import quoteattr |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
24 from sat.core.i18n import _, D_ |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
25 from sat.core.constants import Const as C |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
26 from sat.core.log import getLogger |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
27 from sat.core import exceptions |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
28 from twisted.internet import defer, reactor |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
29 from twisted.words.xish import domish |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
30 from twisted.words.protocols.jabber import jid |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
31 from twisted.words.protocols.jabber import error as jabber_error |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
32 from sat.memory import persistent |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
33 from sat.tools import xml_tools |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
34 try: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
35 import omemo |
3084
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
36 from omemo import exceptions as omemo_excpt |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
37 from omemo.extendedpublicbundle import ExtendedPublicBundle |
3084
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
38 except ImportError: |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
39 raise exceptions.MissingModule( |
3028 | 40 'Missing module omemo, please download/install it. You can use ' |
41 '"pip install omemo"' | |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
42 ) |
3084
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
43 try: |
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
44 from omemo_backend_signal import BACKEND as omemo_backend |
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
45 except ImportError: |
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
46 raise exceptions.MissingModule( |
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
47 'Missing module omemo-backend-signal, please download/install it. You can use ' |
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
48 '"pip install omemo-backend-signal"' |
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
49 ) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
50 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
51 log = getLogger(__name__) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
52 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
53 PLUGIN_INFO = { |
3028 | 54 C.PI_NAME: "OMEMO", |
55 C.PI_IMPORT_NAME: "XEP-0384", | |
56 C.PI_TYPE: "SEC", | |
57 C.PI_PROTOCOLS: ["XEP-0384"], | |
58 C.PI_DEPENDENCIES: ["XEP-0163", "XEP-0280", "XEP-0334", "XEP-0060"], | |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
59 C.PI_RECOMMENDATIONS: ["XEP-0045", "XEP-0359", C.TEXT_CMDS], |
3028 | 60 C.PI_MAIN: "OMEMO", |
61 C.PI_HANDLER: "no", | |
62 C.PI_DESCRIPTION: _("""Implementation of OMEMO"""), | |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
63 } |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
64 |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
65 OMEMO_MIN_VER = (0, 11, 0) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
66 NS_OMEMO = "eu.siacs.conversations.axolotl" |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
67 NS_OMEMO_DEVICES = NS_OMEMO + ".devicelist" |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
68 NS_OMEMO_BUNDLE = NS_OMEMO + ".bundles:{device_id}" |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
69 KEY_STATE = "STATE" |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
70 KEY_DEVICE_ID = "DEVICE_ID" |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
71 KEY_SESSION = "SESSION" |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
72 KEY_TRUST = "TRUST" |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
73 # devices which have been automatically trusted by policy like BTBV |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
74 KEY_AUTO_TRUST = "AUTO_TRUST" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
75 # list of peer bare jids where trust UI has been used at least once |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
76 # this is useful to activate manual trust with BTBV policy |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
77 KEY_MANUAL_TRUST = "MANUAL_TRUST" |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
78 KEY_ACTIVE_DEVICES = "DEVICES" |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
79 KEY_INACTIVE_DEVICES = "INACTIVE_DEVICES" |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
80 KEY_ALL_JIDS = "ALL_JIDS" |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
81 # time before plaintext cache for MUC is expired |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
82 # expressed in seconds, reset on each new MUC message |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
83 MUC_CACHE_TTL = 60 * 5 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
84 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
85 PARAM_CATEGORY = "Security" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
86 PARAM_NAME = "omemo_policy" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
87 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
88 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
89 # we want to manage log emitted by omemo module ourselves |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
90 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
91 class SatHandler(logging.Handler): |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
92 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
93 def emit(self, record): |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
94 log.log(record.levelname, record.getMessage()) |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
95 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
96 @staticmethod |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
97 def install(): |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
98 omemo_sm_logger = logging.getLogger("omemo.SessionManager") |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
99 omemo_sm_logger.propagate = False |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
100 omemo_sm_logger.addHandler(SatHandler()) |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
101 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
102 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
103 SatHandler.install() |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
104 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
105 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
106 def b64enc(data): |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
107 return base64.b64encode(bytes(bytearray(data))).decode("US-ASCII") |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
108 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
109 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
110 def promise2Deferred(promise_): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
111 """Create a Deferred and fire it when promise is resolved |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
112 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
113 @param promise_(promise.Promise): promise to convert |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
114 @return (defer.Deferred): deferred instance linked to the promise |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
115 """ |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
116 d = defer.Deferred() |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
117 promise_.then( |
3672
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
118 lambda result: reactor.callFromThread(d.callback, result), |
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
119 lambda exc: reactor.callFromThread(d.errback, exc) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
120 ) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
121 return d |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
122 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
123 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
124 class OmemoStorage(omemo.Storage): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
125 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
126 def __init__(self, client, device_id, all_jids): |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
127 self.own_bare_jid_s = client.jid.userhost() |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
128 self.device_id = device_id |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
129 self.all_jids = all_jids |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
130 self.data = client._xep_0384_data |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
131 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
132 @property |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
133 def is_async(self): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
134 return True |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
135 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
136 def setCb(self, deferred, callback): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
137 """Associate Deferred and callback |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
138 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
139 callback of omemo.Storage expect a boolean with success state then result |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
140 Deferred on the other hand use 2 methods for callback and errback |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
141 This method use partial to call callback with boolean then result when |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
142 Deferred is called |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
143 """ |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
144 deferred.addCallback(partial(callback, True)) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
145 deferred.addErrback(partial(callback, False)) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
146 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
147 def _callMainThread(self, callback, method, *args, check_jid=None): |
3672
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
148 if check_jid is None: |
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
149 d = method(*args) |
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
150 else: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
151 check_jid_d = self._checkJid(check_jid) |
3672
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
152 check_jid_d.addCallback(lambda __: method(*args)) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
153 d = check_jid_d |
3672
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
154 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
155 if callback is not None: |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
156 d.addCallback(partial(callback, True)) |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
157 d.addErrback(partial(callback, False)) |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
158 |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
159 def _call(self, callback, method, *args, check_jid=None): |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
160 """Create Deferred and add Promise callback to it |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
161 |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
162 This method use reactor.callLater to launch Deferred in main thread |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
163 @param check_jid: run self._checkJid before method |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
164 """ |
3672
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
165 reactor.callFromThread( |
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
166 self._callMainThread, callback, method, *args, check_jid=check_jid |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
167 ) |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
168 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
169 def _checkJid(self, bare_jid): |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
170 """Check if jid is known, and store it if not |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
171 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
172 @param bare_jid(unicode): bare jid to check |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
173 @return (D): Deferred fired when jid is stored |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
174 """ |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
175 if bare_jid in self.all_jids: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
176 return defer.succeed(None) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
177 else: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
178 self.all_jids.add(bare_jid) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
179 d = self.data.force(KEY_ALL_JIDS, self.all_jids) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
180 return d |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
181 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
182 def loadOwnData(self, callback): |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
183 callback(True, {'own_bare_jid': self.own_bare_jid_s, |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
184 'own_device_id': self.device_id}) |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
185 |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
186 def storeOwnData(self, callback, own_bare_jid, own_device_id): |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
187 if own_bare_jid != self.own_bare_jid_s or own_device_id != self.device_id: |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
188 raise exceptions.InternalError('bare jid or device id inconsistency!') |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
189 callback(True, None) |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
190 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
191 def loadState(self, callback): |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
192 self._call(callback, self.data.get, KEY_STATE) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
193 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
194 def storeState(self, callback, state): |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
195 self._call(callback, self.data.force, KEY_STATE, state) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
196 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
197 def loadSession(self, callback, bare_jid, device_id): |
3028 | 198 key = '\n'.join([KEY_SESSION, bare_jid, str(device_id)]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
199 self._call(callback, self.data.get, key) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
200 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
201 def storeSession(self, callback, bare_jid, device_id, session): |
3028 | 202 key = '\n'.join([KEY_SESSION, bare_jid, str(device_id)]) |
3717
11f7ca8afd15
plugin XEP-0384: fix typo in attribute
Goffi <goffi@goffi.org>
parents:
3709
diff
changeset
|
203 self._call(callback, self.data.force, key, session) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
204 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
205 def deleteSession(self, callback, bare_jid, device_id): |
3028 | 206 key = '\n'.join([KEY_SESSION, bare_jid, str(device_id)]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
207 self._call(callback, self.data.remove, key) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
208 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
209 def loadActiveDevices(self, callback, bare_jid): |
3028 | 210 key = '\n'.join([KEY_ACTIVE_DEVICES, bare_jid]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
211 self._call(callback, self.data.get, key, {}) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
212 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
213 def loadInactiveDevices(self, callback, bare_jid): |
3028 | 214 key = '\n'.join([KEY_INACTIVE_DEVICES, bare_jid]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
215 self._call(callback, self.data.get, key, {}) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
216 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
217 def storeActiveDevices(self, callback, bare_jid, devices): |
3028 | 218 key = '\n'.join([KEY_ACTIVE_DEVICES, bare_jid]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
219 self._call(callback, self.data.force, key, devices, check_jid=bare_jid) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
220 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
221 def storeInactiveDevices(self, callback, bare_jid, devices): |
3028 | 222 key = '\n'.join([KEY_INACTIVE_DEVICES, bare_jid]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
223 self._call(callback, self.data.force, key, devices, check_jid=bare_jid) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
224 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
225 def storeTrust(self, callback, bare_jid, device_id, trust): |
3028 | 226 key = '\n'.join([KEY_TRUST, bare_jid, str(device_id)]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
227 self._call(callback, self.data.force, key, trust) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
228 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
229 def loadTrust(self, callback, bare_jid, device_id): |
3028 | 230 key = '\n'.join([KEY_TRUST, bare_jid, str(device_id)]) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
231 self._call(callback, self.data.get, key) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
232 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
233 def listJIDs(self, callback): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
234 if callback is not None: |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
235 callback(True, self.all_jids) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
236 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
237 def _deleteJID_logResults(self, results): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
238 failed = [success for success, __ in results if not success] |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
239 if failed: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
240 log.warning( |
3028 | 241 "delete JID failed for {failed_count} on {total_count} operations" |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
242 .format(failed_count=len(failed), total_count=len(results))) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
243 else: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
244 log.info( |
3028 | 245 "Delete JID operation succeed ({total_count} operations)." |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
246 .format(total_count=len(results))) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
247 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
248 def _deleteJID_gotDevices(self, results, bare_jid): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
249 assert len(results) == 2 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
250 active_success, active_devices = results[0] |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
251 inactive_success, inactive_devices = results[0] |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
252 d_list = [] |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
253 for success, devices in results: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
254 if not success: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
255 log.warning("Can't retrieve devices for {bare_jid}: {reason}" |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
256 .format(bare_jid=bare_jid, reason=active_devices)) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
257 else: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
258 for device_id in devices: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
259 for key in (KEY_SESSION, KEY_TRUST): |
3028 | 260 k = '\n'.join([key, bare_jid, str(device_id)]) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
261 d_list.append(self.data.remove(k)) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
262 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
263 d_list.append(self.data.remove(KEY_ACTIVE_DEVICES, bare_jid)) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
264 d_list.append(self.data.remove(KEY_INACTIVE_DEVICES, bare_jid)) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
265 d_list.append(lambda __: self.all_jids.discard(bare_jid)) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
266 # FIXME: there is a risk of race condition here, |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
267 # if self.all_jids is modified between discard and force) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
268 d_list.append(lambda __: self.data.force(KEY_ALL_JIDS, self.all_jids)) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
269 d = defer.DeferredList(d_list) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
270 d.addCallback(self._deleteJID_logResults) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
271 return d |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
272 |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
273 def _deleteJID(self, callback, bare_jid): |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
274 d_list = [] |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
275 |
3028 | 276 key = '\n'.join([KEY_ACTIVE_DEVICES, bare_jid]) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
277 d_list.append(self.data.get(key, [])) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
278 |
3028 | 279 key = '\n'.join([KEY_INACTIVE_DEVICES, bare_jid]) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
280 d_inactive = self.data.get(key, {}) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
281 # inactive devices are returned as a dict mapping from devices_id to timestamp |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
282 # but we only need devices ids |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
283 d_inactive.addCallback(lambda devices: [k for k, __ in devices]) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
284 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
285 d_list.append(d_inactive) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
286 d = defer.DeferredList(d_list) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
287 d.addCallback(self._deleteJID_gotDevices, bare_jid) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
288 if callback is not None: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
289 self.setCb(d, callback) |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
290 |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
291 def deleteJID(self, callback, bare_jid): |
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
292 """Retrieve all (in)actives devices of bare_jid, and delete all related keys""" |
3672
e4054b648111
plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents:
3584
diff
changeset
|
293 reactor.callFromThread(self._deleteJID, callback, bare_jid) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
294 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
295 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
296 class SatOTPKPolicy(omemo.DefaultOTPKPolicy): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
297 pass |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
298 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
299 |
3236
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
300 class OmemoSession: |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
301 """Wrapper to use omemo.OmemoSession with Deferred""" |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
302 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
303 def __init__(self, session): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
304 self._session = session |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
305 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
306 @property |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
307 def republish_bundle(self): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
308 return self._session.republish_bundle |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
309 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
310 @property |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
311 def public_bundle(self): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
312 return self._session.public_bundle |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
313 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
314 @classmethod |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
315 def create(cls, client, storage, my_device_id = None): |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
316 omemo_session_p = omemo.SessionManager.create( |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
317 storage, |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
318 SatOTPKPolicy, |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
319 omemo_backend, |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
320 client.jid.userhost(), |
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
321 my_device_id) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
322 d = promise2Deferred(omemo_session_p) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
323 d.addCallback(lambda session: cls(session)) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
324 return d |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
325 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
326 def newDeviceList(self, jid, devices): |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
327 jid = jid.userhost() |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
328 new_device_p = self._session.newDeviceList(jid, devices) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
329 return promise2Deferred(new_device_p) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
330 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
331 def getDevices(self, bare_jid=None): |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
332 bare_jid = bare_jid.userhost() |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
333 get_devices_p = self._session.getDevices(bare_jid=bare_jid) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
334 return promise2Deferred(get_devices_p) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
335 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
336 def buildSession(self, bare_jid, device, bundle): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
337 bare_jid = bare_jid.userhost() |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
338 build_session_p = self._session.buildSession(bare_jid, int(device), bundle) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
339 return promise2Deferred(build_session_p) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
340 |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
341 def deleteSession(self, bare_jid, device): |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
342 bare_jid = bare_jid.userhost() |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
343 delete_session_p = self._session.deleteSession( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
344 bare_jid=bare_jid, device=int(device)) |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
345 return promise2Deferred(delete_session_p) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
346 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
347 def encryptMessage(self, bare_jids, message, bundles=None, expect_problems=None): |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
348 """Encrypt a message |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
349 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
350 @param bare_jids(iterable[jid.JID]): destinees of the message |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
351 @param message(unicode): message to encode |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
352 @param bundles(dict[jid.JID, dict[int, ExtendedPublicBundle]): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
353 entities => devices => bundles map |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
354 @return D(dict): encryption data |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
355 """ |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
356 bare_jids = [e.userhost() for e in bare_jids] |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
357 if bundles is not None: |
3028 | 358 bundles = {e.userhost(): v for e, v in bundles.items()} |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
359 encrypt_mess_p = self._session.encryptMessage( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
360 bare_jids=bare_jids, |
3084
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
361 plaintext=message.encode(), |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
362 bundles=bundles, |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
363 expect_problems=expect_problems) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
364 return promise2Deferred(encrypt_mess_p) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
365 |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
366 def encryptRatchetForwardingMessage( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
367 self, bare_jids, bundles=None, expect_problems=None): |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
368 bare_jids = [e.userhost() for e in bare_jids] |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
369 if bundles is not None: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
370 bundles = {e.userhost(): v for e, v in bundles.items()} |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
371 encrypt_ratchet_fwd_p = self._session.encryptRatchetForwardingMessage( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
372 bare_jids=bare_jids, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
373 bundles=bundles, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
374 expect_problems=expect_problems) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
375 return promise2Deferred(encrypt_ratchet_fwd_p) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
376 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
377 def decryptMessage(self, bare_jid, device, iv, message, is_pre_key_message, |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
378 ciphertext, additional_information=None, allow_untrusted=False): |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
379 bare_jid = bare_jid.userhost() |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
380 decrypt_mess_p = self._session.decryptMessage( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
381 bare_jid=bare_jid, |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
382 device=int(device), |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
383 iv=iv, |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
384 message=message, |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
385 is_pre_key_message=is_pre_key_message, |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
386 ciphertext=ciphertext, |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
387 additional_information=additional_information, |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
388 allow_untrusted=allow_untrusted |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
389 ) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
390 return promise2Deferred(decrypt_mess_p) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
391 |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
392 def decryptRatchetForwardingMessage( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
393 self, bare_jid, device, iv, message, is_pre_key_message, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
394 additional_information=None, allow_untrusted=False): |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
395 bare_jid = bare_jid.userhost() |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
396 decrypt_ratchet_fwd_p = self._session.decryptRatchetForwardingMessage( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
397 bare_jid=bare_jid, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
398 device=int(device), |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
399 iv=iv, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
400 message=message, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
401 is_pre_key_message=is_pre_key_message, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
402 additional_information=additional_information, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
403 allow_untrusted=allow_untrusted |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
404 ) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
405 return promise2Deferred(decrypt_ratchet_fwd_p) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
406 |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
407 def setTrust(self, bare_jid, device, key, trusted): |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
408 bare_jid = bare_jid.userhost() |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
409 setTrust_p = self._session.setTrust( |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
410 bare_jid=bare_jid, |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
411 device=int(device), |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
412 key=key, |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
413 trusted=trusted, |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
414 ) |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
415 return promise2Deferred(setTrust_p) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
416 |
3236
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
417 def resetTrust(self, bare_jid, device): |
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
418 bare_jid = bare_jid.userhost() |
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
419 resetTrust_p = self._session.resetTrust( |
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
420 bare_jid=bare_jid, |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
421 device=int(device), |
3236
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
422 ) |
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
423 return promise2Deferred(resetTrust_p) |
9477f3197981
plugin XEP-0384: added resetTrust in OmemoSession
Goffi <goffi@goffi.org>
parents:
3231
diff
changeset
|
424 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
425 def getTrustForJID(self, bare_jid): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
426 bare_jid = bare_jid.userhost() |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
427 get_trust_p = self._session.getTrustForJID(bare_jid=bare_jid) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
428 return promise2Deferred(get_trust_p) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
429 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
430 |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
431 class OMEMO: |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
432 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
433 params = """ |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
434 <params> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
435 <individual> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
436 <category name="{category_name}" label="{category_label}"> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
437 <param name="{param_name}" label={param_label} type="list" security="3"> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
438 <option value="manual" label={opt_manual_lbl} /> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
439 <option value="btbv" label={opt_btbv_lbl} selected="true" /> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
440 </param> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
441 </category> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
442 </individual> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
443 </params> |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
444 """.format( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
445 category_name=PARAM_CATEGORY, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
446 category_label=D_("Security"), |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
447 param_name=PARAM_NAME, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
448 param_label=quoteattr(D_("OMEMO default trust policy")), |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
449 opt_manual_lbl=quoteattr(D_("Manual trust (more secure)")), |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
450 opt_btbv_lbl=quoteattr( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
451 D_("Blind Trust Before Verification (more user friendly)")), |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
452 ) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
453 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
454 def __init__(self, host): |
3028 | 455 log.info(_("OMEMO plugin initialization (omemo module v{version})").format( |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
456 version=omemo.__version__)) |
3028 | 457 version = tuple(map(int, omemo.__version__.split('.')[:3])) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
458 if version < OMEMO_MIN_VER: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
459 log.warning(_( |
3028 | 460 "Your version of omemo module is too old: {v[0]}.{v[1]}.{v[2]} is " |
3098 | 461 "minimum required, please update.").format(v=OMEMO_MIN_VER)) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
462 raise exceptions.CancelError("module is too old") |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
463 self.host = host |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
464 host.memory.updateParams(self.params) |
3028 | 465 self._p_hints = host.plugins["XEP-0334"] |
466 self._p_carbons = host.plugins["XEP-0280"] | |
467 self._p = host.plugins["XEP-0060"] | |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
468 self._m = host.plugins.get("XEP-0045") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
469 self._sid = host.plugins.get("XEP-0359") |
3172
dcebc585c29f
core: renamed "MessageReceived" trigger to "messageReceived" for consistency.
Goffi <goffi@goffi.org>
parents:
3142
diff
changeset
|
470 host.trigger.add("messageReceived", self._messageReceivedTrigger, priority=100050) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
471 host.trigger.add("sendMessageData", self._sendMessageDataTrigger) |
3028 | 472 self.host.registerEncryptionPlugin(self, "OMEMO", NS_OMEMO, 100) |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
473 pep = host.plugins['XEP-0163'] |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
474 pep.addPEPEvent( |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
475 "OMEMO_DEVICES", NS_OMEMO_DEVICES, |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
476 lambda itemsEvent, profile: defer.ensureDeferred( |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
477 self.onNewDevices(itemsEvent, profile)) |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
478 ) |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
479 try: |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
480 self.text_cmds = self.host.plugins[C.TEXT_CMDS] |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
481 except KeyError: |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
482 log.info(_("Text commands not available")) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
483 else: |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
484 self.text_cmds.registerTextCommands(self) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
485 |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
486 # Text commands # |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
487 |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
488 async def cmd_omemo_reset(self, client, mess_data): |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
489 """reset OMEMO session (use only if encryption is broken) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
490 |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
491 @command(one2one): |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
492 """ |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
493 if not client.encryption.isEncryptionRequested(mess_data, NS_OMEMO): |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
494 feedback = _( |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
495 "You need to have OMEMO encryption activated to reset the session") |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
496 self.text_cmds.feedBack(client, feedback, mess_data) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
497 return False |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
498 to_jid = mess_data["to"].userhostJID() |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
499 session = client._xep_0384_session |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
500 devices = await session.getDevices(to_jid) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
501 |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
502 for device in devices['active']: |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
503 log.debug(f"deleting session for device {device}") |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
504 await session.deleteSession(to_jid, device=device) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
505 |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
506 log.debug("Sending an empty message to trigger key exchange") |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
507 await client.sendMessage(to_jid, {'': ''}) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
508 |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
509 feedback = _("OMEMO session has been reset") |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
510 self.text_cmds.feedBack(client, feedback, mess_data) |
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
511 return False |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
512 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
513 async def trustUICb( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
514 self, xmlui_data, trust_data, expect_problems=None, profile=C.PROF_KEY_NONE): |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
515 if C.bool(xmlui_data.get('cancelled', 'false')): |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
516 return {} |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
517 client = self.host.getClient(profile) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
518 session = client._xep_0384_session |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
519 stored_data = client._xep_0384_data |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
520 manual_trust = await stored_data.get(KEY_MANUAL_TRUST, set()) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
521 auto_trusted_cache = {} |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
522 answer = xml_tools.XMLUIResult2DataFormResult(xmlui_data) |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
523 blind_trust = C.bool(answer.get('blind_trust', C.BOOL_FALSE)) |
3028 | 524 for key, value in answer.items(): |
525 if key.startswith('trust_'): | |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
526 trust_id = key[6:] |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
527 else: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
528 continue |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
529 data = trust_data[trust_id] |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
530 if blind_trust: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
531 # user request to restore blind trust for this entity |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
532 # so if the entity is present in manual trust, we remove it |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
533 if data["jid"].full() in manual_trust: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
534 manual_trust.remove(data["jid"].full()) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
535 await stored_data.aset(KEY_MANUAL_TRUST, manual_trust) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
536 elif data["jid"].full() not in manual_trust: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
537 # validating this trust UI implies that we activate manual mode for |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
538 # this entity (used for BTBV policy) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
539 manual_trust.add(data["jid"].full()) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
540 await stored_data.aset(KEY_MANUAL_TRUST, manual_trust) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
541 trust = C.bool(value) |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
542 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
543 if not trust: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
544 # if device is not trusted, we check if it must be removed from auto |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
545 # trusted devices list |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
546 bare_jid_s = data['jid'].userhost() |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
547 key = f"{KEY_AUTO_TRUST}\n{bare_jid_s}" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
548 if bare_jid_s not in auto_trusted_cache: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
549 auto_trusted_cache[bare_jid_s] = await stored_data.get( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
550 key, default=set()) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
551 auto_trusted = auto_trusted_cache[bare_jid_s] |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
552 if data['device'] in auto_trusted: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
553 # as we don't trust this device anymore, we can remove it from the |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
554 # list of automatically trusted devices |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
555 auto_trusted.remove(data['device']) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
556 await stored_data.aset(key, auto_trusted) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
557 log.info(D_( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
558 "device {device} from {peer_jid} is not an auto-trusted device " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
559 "anymore").format(device=data['device'], peer_jid=bare_jid_s)) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
560 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
561 await session.setTrust( |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
562 data["jid"], |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
563 data["device"], |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
564 data["ik"], |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
565 trusted=trust, |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
566 ) |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
567 if not trust and expect_problems is not None: |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
568 expect_problems.setdefault(data['jid'].userhost(), set()).add( |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
569 data['device'] |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
570 ) |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
571 return {} |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
572 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
573 async def getTrustUI(self, client, entity_jid=None, trust_data=None, submit_id=None): |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
574 """Generate a XMLUI to manage trust |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
575 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
576 @param entity_jid(None, jid.JID): jid of entity to manage |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
577 None to use trust_data |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
578 @param trust_data(None, dict): devices data: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
579 None to use entity_jid |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
580 else a dict mapping from trust ids (unicode) to devices data, |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
581 where a device data must have the following keys: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
582 - jid(jid.JID): bare jid of the device owner |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
583 - device(int): device id |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
584 - ik(bytes): identity key |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
585 and may have the following key: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
586 - trusted(bool): True if device is trusted |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
587 @param submit_id(None, unicode): submit_id to use |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
588 if None set UI callback to trustUICb |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
589 @return D(xmlui): trust management form |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
590 """ |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
591 # we need entity_jid xor trust_data |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
592 assert entity_jid and not trust_data or not entity_jid and trust_data |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
593 if entity_jid and entity_jid.resource: |
3028 | 594 raise ValueError("A bare jid is expected") |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
595 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
596 session = client._xep_0384_session |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
597 stored_data = client._xep_0384_data |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
598 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
599 if trust_data is None: |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
600 cache = client._xep_0384_cache.setdefault(entity_jid, {}) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
601 trust_data = {} |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
602 if self._m is not None and self._m.isJoinedRoom(client, entity_jid): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
603 trust_jids = self.getJIDsForRoom(client, entity_jid) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
604 else: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
605 trust_jids = [entity_jid] |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
606 for trust_jid in trust_jids: |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
607 trust_session_data = await session.getTrustForJID(trust_jid) |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
608 bare_jid_s = trust_jid.userhost() |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
609 for device_id, trust_info in trust_session_data['active'].items(): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
610 if trust_info is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
611 # device has never been (un)trusted, we have to retrieve its |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
612 # fingerprint (i.e. identity key or "ik") through public bundle |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
613 if device_id not in cache: |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
614 bundles, missing = await self.getBundles(client, |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
615 trust_jid, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
616 [device_id]) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
617 if device_id not in bundles: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
618 log.warning(_( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
619 "Can't find bundle for device {device_id} of user " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
620 "{bare_jid}, ignoring").format(device_id=device_id, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
621 bare_jid=bare_jid_s)) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
622 continue |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
623 cache[device_id] = bundles[device_id] |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
624 # TODO: replace False below by None when undecided |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
625 # trusts are handled |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
626 trust_info = { |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
627 "key": cache[device_id].ik, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
628 "trusted": False |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
629 } |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
630 |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
631 ik = trust_info["key"] |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
632 trust_id = str(hash((bare_jid_s, device_id, ik))) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
633 trust_data[trust_id] = { |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
634 "jid": trust_jid, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
635 "device": device_id, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
636 "ik": ik, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
637 "trusted": trust_info["trusted"], |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
638 } |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
639 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
640 if submit_id is None: |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
641 submit_id = self.host.registerCallback( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
642 lambda data, profile: defer.ensureDeferred( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
643 self.trustUICb(data, trust_data=trust_data, profile=profile)), |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
644 with_data=True, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
645 one_shot=True) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
646 xmlui = xml_tools.XMLUI( |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
647 panel_type = C.XMLUI_FORM, |
3028 | 648 title = D_("OMEMO trust management"), |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
649 submit_id = submit_id |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
650 ) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
651 xmlui.addText(D_( |
3028 | 652 "This is OMEMO trusting system. You'll see below the devices of your " |
653 "contacts, and a checkbox to trust them or not. A trusted device " | |
654 "can read your messages in plain text, so be sure to only validate " | |
655 "devices that you are sure are belonging to your contact. It's better " | |
656 "to do this when you are next to your contact and her/his device, so " | |
657 "you can check the \"fingerprint\" (the number next to the device) " | |
658 "yourself. Do *not* validate a device if the fingerprint is wrong!")) | |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
659 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
660 xmlui.changeContainer("label") |
3028 | 661 xmlui.addLabel(D_("This device ID")) |
662 xmlui.addText(str(client._xep_0384_device_id)) | |
663 xmlui.addLabel(D_("This device fingerprint")) | |
3084
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
664 ik_hex = session.public_bundle.ik.hex().upper() |
3028 | 665 fp_human = ' '.join([ik_hex[i:i+8] for i in range(0, len(ik_hex), 8)]) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
666 xmlui.addText(fp_human) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
667 xmlui.addEmpty() |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
668 xmlui.addEmpty() |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
669 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
670 if entity_jid is not None: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
671 omemo_policy = self.host.memory.getParamA( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
672 PARAM_NAME, PARAM_CATEGORY, profile_key=client.profile |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
673 ) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
674 if omemo_policy == 'btbv': |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
675 xmlui.addLabel(D_("Automatically trust new devices?")) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
676 # blind trust is always disabled when UI is requested |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
677 # as submitting UI is a verification which should disable it. |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
678 xmlui.addBool("blind_trust", value=C.BOOL_FALSE) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
679 xmlui.addEmpty() |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
680 xmlui.addEmpty() |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
681 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
682 auto_trust_cache = {} |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
683 |
3028 | 684 for trust_id, data in trust_data.items(): |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
685 bare_jid_s = data['jid'].userhost() |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
686 if bare_jid_s not in auto_trust_cache: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
687 key = f"{KEY_AUTO_TRUST}\n{bare_jid_s}" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
688 auto_trust_cache[bare_jid_s] = await stored_data.get(key, set()) |
3028 | 689 xmlui.addLabel(D_("Contact")) |
690 xmlui.addJid(data['jid']) | |
691 xmlui.addLabel(D_("Device ID")) | |
692 xmlui.addText(str(data['device'])) | |
693 xmlui.addLabel(D_("Fingerprint")) | |
3084
ffcdd93b61fa
plugin XEP-0384: specific warning on missing omemo-backend-signal + fixed encoding following Python 3 port
Goffi <goffi@goffi.org>
parents:
3028
diff
changeset
|
694 ik_hex = data['ik'].hex().upper() |
3028 | 695 fp_human = ' '.join([ik_hex[i:i+8] for i in range(0, len(ik_hex), 8)]) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
696 xmlui.addText(fp_human) |
3028 | 697 xmlui.addLabel(D_("Trust this device?")) |
698 xmlui.addBool("trust_{}".format(trust_id), | |
699 value=C.boolConst(data.get('trusted', False))) | |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
700 if data['device'] in auto_trust_cache[bare_jid_s]: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
701 xmlui.addEmpty() |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
702 xmlui.addLabel(D_("(automatically trusted)")) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
703 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
704 |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
705 xmlui.addEmpty() |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
706 xmlui.addEmpty() |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
707 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
708 return xmlui |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
709 |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
710 async def profileConnected(self, client): |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
711 if self._m is not None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
712 # we keep plain text message for MUC messages we send |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
713 # as we can't encrypt for our own device |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
714 client._xep_0384_muc_cache = {} |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
715 # and we keep them only for some time, in case something goes wrong |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
716 # with the MUC |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
717 client._xep_0384_muc_cache_timer = None |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
718 |
2925
03a09e16bf28
plugin XEP-0384: wait for client to be ready if session is missing when onNewDevices is called
Goffi <goffi@goffi.org>
parents:
2860
diff
changeset
|
719 # FIXME: is _xep_0384_ready needed? can we use profileConnecting? |
03a09e16bf28
plugin XEP-0384: wait for client to be ready if session is missing when onNewDevices is called
Goffi <goffi@goffi.org>
parents:
2860
diff
changeset
|
720 # Workflow should be checked |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
721 client._xep_0384_ready = defer.Deferred() |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
722 # we first need to get devices ids (including our own) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
723 persistent_dict = persistent.LazyPersistentBinaryDict("XEP-0384", client.profile) |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
724 client._xep_0384_data = persistent_dict |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
725 # all known devices of profile |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
726 devices = await self.getDevices(client) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
727 # and our own device id |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
728 device_id = await persistent_dict.get(KEY_DEVICE_ID) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
729 if device_id is None: |
3028 | 730 log.info(_("We have no identity for this device yet, let's generate one")) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
731 # we have a new device, we create device_id |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
732 device_id = random.randint(1, 2**31-1) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
733 # we check that it's really unique |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
734 while device_id in devices: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
735 device_id = random.randint(1, 2**31-1) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
736 # and we save it |
3541
888109774673
core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
737 await persistent_dict.aset(KEY_DEVICE_ID, device_id) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
738 |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
739 log.debug(f"our OMEMO device id is {device_id}") |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
740 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
741 if device_id not in devices: |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
742 log.debug(f"our device id ({device_id}) is not in the list, adding it") |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
743 devices.add(device_id) |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
744 await defer.ensureDeferred(self.setDevices(client, devices)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
745 |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
746 all_jids = await persistent_dict.get(KEY_ALL_JIDS, set()) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
747 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
748 omemo_storage = OmemoStorage(client, device_id, all_jids) |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
749 omemo_session = await OmemoSession.create(client, omemo_storage, device_id) |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
750 client._xep_0384_cache = {} |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
751 client._xep_0384_session = omemo_session |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
752 client._xep_0384_device_id = device_id |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
753 await omemo_session.newDeviceList(client.jid, devices) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
754 if omemo_session.republish_bundle: |
3028 | 755 log.info(_("Saving public bundle for this device ({device_id})").format( |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
756 device_id=device_id)) |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
757 await defer.ensureDeferred( |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
758 self.setBundle(client, omemo_session.public_bundle, device_id) |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
759 ) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
760 client._xep_0384_ready.callback(None) |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
761 del client._xep_0384_ready |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
762 |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
763 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
764 ## XMPP PEP nodes manipulation |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
765 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
766 # devices |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
767 |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
768 def parseDevices(self, items): |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
769 """Parse devices found in items |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
770 |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
771 @param items(iterable[domish.Element]): items as retrieved by getItems |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
772 @return set[int]: parsed devices |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
773 """ |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
774 devices = set() |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
775 if len(items) > 1: |
3028 | 776 log.warning(_("OMEMO devices list is stored in more that one items, " |
777 "this is not expected")) | |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
778 if items: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
779 try: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
780 list_elt = next(items[0].elements(NS_OMEMO, 'list')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
781 except StopIteration: |
3028 | 782 log.warning(_("no list element found in OMEMO devices list")) |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
783 return devices |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
784 for device_elt in list_elt.elements(NS_OMEMO, 'device'): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
785 try: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
786 device_id = int(device_elt['id']) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
787 except KeyError: |
3028 | 788 log.warning(_('device element is missing "id" attribute: {elt}') |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
789 .format(elt=device_elt.toXml())) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
790 except ValueError: |
3028 | 791 log.warning(_('invalid device id: {device_id}').format( |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
792 device_id=device_elt['id'])) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
793 else: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
794 devices.add(device_id) |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
795 return devices |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
796 |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
797 async def getDevices(self, client, entity_jid=None): |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
798 """Retrieve list of registered OMEMO devices |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
799 |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
800 @param entity_jid(jid.JID, None): get devices from this entity |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
801 None to get our own devices |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
802 @return (set(int)): list of devices |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
803 """ |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
804 if entity_jid is not None: |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
805 assert not entity_jid.resource |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
806 try: |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
807 items, metadata = await self._p.getItems(client, entity_jid, NS_OMEMO_DEVICES) |
3142
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
808 except exceptions.NotFound: |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
809 log.info(_("there is no node to handle OMEMO devices")) |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
810 return set() |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
811 |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
812 devices = self.parseDevices(items) |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
813 return devices |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
814 |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
815 async def setDevices(self, client, devices): |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
816 log.debug(f"setting devices with {', '.join(str(d) for d in devices)}") |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
817 list_elt = domish.Element((NS_OMEMO, 'list')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
818 for device in devices: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
819 device_elt = list_elt.addElement('device') |
3028 | 820 device_elt['id'] = str(device) |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
821 try: |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
822 await self._p.sendItem( |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
823 client, None, NS_OMEMO_DEVICES, list_elt, |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
824 item_id=self._p.ID_SINGLETON, |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
825 extra={ |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
826 self._p.EXTRA_PUBLISH_OPTIONS: {self._p.OPT_MAX_ITEMS: 1}, |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
827 self._p.EXTRA_ON_PRECOND_NOT_MET: "publish_without_options", |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
828 } |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
829 ) |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
830 except Exception as e: |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
831 log.warning(_("Can't set devices: {reason}").format(reason=e)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
832 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
833 # bundles |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
834 |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
835 async def getBundles(self, client, entity_jid, devices_ids): |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
836 """Retrieve public bundles of an entity devices |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
837 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
838 @param entity_jid(jid.JID): bare jid of entity |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
839 @param devices_id(iterable[int]): ids of the devices bundles to retrieve |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
840 @return (tuple(dict[int, ExtendedPublicBundle], list(int))): |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
841 - bundles collection: |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
842 * key is device_id |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
843 * value is parsed bundle |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
844 - set of bundles not found |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
845 """ |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
846 assert not entity_jid.resource |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
847 bundles = {} |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
848 missing = set() |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
849 for device_id in devices_ids: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
850 node = NS_OMEMO_BUNDLE.format(device_id=device_id) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
851 try: |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
852 items, metadata = await self._p.getItems(client, entity_jid, node) |
3142
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
853 except exceptions.NotFound: |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
854 log.warning(_("Bundle missing for device {device_id}") |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
855 .format(device_id=device_id)) |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
856 missing.add(device_id) |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
857 continue |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
858 except jabber_error.StanzaError as e: |
3142
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
859 log.warning(_("Can't get bundle for device {device_id}: {reason}") |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
860 .format(device_id=device_id, reason=e)) |
cd90c24b2836
plugin XEP-0384: fixed exception catching on getItems
Goffi <goffi@goffi.org>
parents:
3136
diff
changeset
|
861 continue |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
862 if not items: |
3028 | 863 log.warning(_("no item found in node {node}, can't get public bundle " |
864 "for device {device_id}").format(node=node, | |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
865 device_id=device_id)) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
866 continue |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
867 if len(items) > 1: |
3028 | 868 log.warning(_("more than one item found in {node}, " |
869 "this is not expected").format(node=node)) | |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
870 item = items[0] |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
871 try: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
872 bundle_elt = next(item.elements(NS_OMEMO, 'bundle')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
873 signedPreKeyPublic_elt = next(bundle_elt.elements( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
874 NS_OMEMO, 'signedPreKeyPublic')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
875 signedPreKeySignature_elt = next(bundle_elt.elements( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
876 NS_OMEMO, 'signedPreKeySignature')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
877 identityKey_elt = next(bundle_elt.elements( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
878 NS_OMEMO, 'identityKey')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
879 prekeys_elt = next(bundle_elt.elements( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
880 NS_OMEMO, 'prekeys')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
881 except StopIteration: |
3028 | 882 log.warning(_("invalid bundle for device {device_id}, ignoring").format( |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
883 device_id=device_id)) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
884 continue |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
885 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
886 try: |
3028 | 887 spkPublic = base64.b64decode(str(signedPreKeyPublic_elt)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
888 spkSignature = base64.b64decode( |
3028 | 889 str(signedPreKeySignature_elt)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
890 |
3028 | 891 ik = base64.b64decode(str(identityKey_elt)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
892 spk = { |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
893 "key": spkPublic, |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
894 "id": int(signedPreKeyPublic_elt['signedPreKeyId']) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
895 } |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
896 otpks = [] |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
897 for preKeyPublic_elt in prekeys_elt.elements(NS_OMEMO, 'preKeyPublic'): |
3028 | 898 preKeyPublic = base64.b64decode(str(preKeyPublic_elt)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
899 otpk = { |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
900 "key": preKeyPublic, |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
901 "id": int(preKeyPublic_elt['preKeyId']) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
902 } |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
903 otpks.append(otpk) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
904 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
905 except Exception as e: |
3028 | 906 log.warning(_("error while decoding key for device {device_id}: {msg}") |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
907 .format(device_id=device_id, msg=e)) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
908 continue |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
909 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
910 bundles[device_id] = ExtendedPublicBundle.parse(omemo_backend, ik, spk, |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
911 spkSignature, otpks) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
912 |
3584
edc79cefe968
plugin XEP-0060: `getItem(s)`, `publish` and `(un)subscribe` are now coroutines
Goffi <goffi@goffi.org>
parents:
3541
diff
changeset
|
913 return (bundles, missing) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
914 |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
915 async def setBundle(self, client, bundle, device_id): |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
916 """Set public bundle for this device. |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
917 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
918 @param bundle(ExtendedPublicBundle): bundle to publish |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
919 """ |
3028 | 920 log.debug(_("updating bundle for {device_id}").format(device_id=device_id)) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
921 bundle = bundle.serialize(omemo_backend) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
922 bundle_elt = domish.Element((NS_OMEMO, 'bundle')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
923 signedPreKeyPublic_elt = bundle_elt.addElement( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
924 "signedPreKeyPublic", |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
925 content=b64enc(bundle["spk"]['key'])) |
3028 | 926 signedPreKeyPublic_elt['signedPreKeyId'] = str(bundle["spk"]['id']) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
927 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
928 bundle_elt.addElement( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
929 "signedPreKeySignature", |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
930 content=b64enc(bundle["spk_signature"])) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
931 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
932 bundle_elt.addElement( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
933 "identityKey", |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
934 content=b64enc(bundle["ik"])) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
935 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
936 prekeys_elt = bundle_elt.addElement('prekeys') |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
937 for otpk in bundle["otpks"]: |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
938 preKeyPublic_elt = prekeys_elt.addElement( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
939 'preKeyPublic', |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
940 content=b64enc(otpk["key"])) |
3028 | 941 preKeyPublic_elt['preKeyId'] = str(otpk['id']) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
942 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
943 node = NS_OMEMO_BUNDLE.format(device_id=device_id) |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
944 try: |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
945 await self._p.sendItem( |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
946 client, None, node, bundle_elt, item_id=self._p.ID_SINGLETON, |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
947 extra={ |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
948 self._p.EXTRA_PUBLISH_OPTIONS: {self._p.OPT_MAX_ITEMS: 1}, |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
949 self._p.EXTRA_ON_PRECOND_NOT_MET: "publish_without_options", |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
950 } |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
951 ) |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
952 except Exception as e: |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
953 log.warning(_("Can't set bundle: {reason}").format(reason=e)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
954 |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
955 ## PEP node events callbacks |
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
956 |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
957 async def onNewDevices(self, itemsEvent, profile): |
3218
806a7936a591
plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents:
3214
diff
changeset
|
958 log.debug("devices list has been updated") |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
959 client = self.host.getClient(profile) |
2925
03a09e16bf28
plugin XEP-0384: wait for client to be ready if session is missing when onNewDevices is called
Goffi <goffi@goffi.org>
parents:
2860
diff
changeset
|
960 try: |
03a09e16bf28
plugin XEP-0384: wait for client to be ready if session is missing when onNewDevices is called
Goffi <goffi@goffi.org>
parents:
2860
diff
changeset
|
961 omemo_session = client._xep_0384_session |
03a09e16bf28
plugin XEP-0384: wait for client to be ready if session is missing when onNewDevices is called
Goffi <goffi@goffi.org>
parents:
2860
diff
changeset
|
962 except AttributeError: |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
963 await client._xep_0384_ready |
2925
03a09e16bf28
plugin XEP-0384: wait for client to be ready if session is missing when onNewDevices is called
Goffi <goffi@goffi.org>
parents:
2860
diff
changeset
|
964 omemo_session = client._xep_0384_session |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
965 entity = itemsEvent.sender |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
966 |
2662
0bef44f8e8ca
plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents:
2654
diff
changeset
|
967 devices = self.parseDevices(itemsEvent.items) |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
968 await omemo_session.newDeviceList(entity, devices) |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
969 |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
970 if entity == client.jid.userhostJID(): |
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
971 own_device = client._xep_0384_device_id |
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
972 if own_device not in devices: |
3028 | 973 log.warning(_("Our own device is missing from devices list, fixing it")) |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
974 devices.add(own_device) |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
975 await self.setDevices(client, devices) |
2744
e6716d90c2fe
plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents:
2738
diff
changeset
|
976 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
977 ## triggers |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
978 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
979 async def policyBTBV(self, client, feedback_jid, expect_problems, undecided): |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
980 session = client._xep_0384_session |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
981 stored_data = client._xep_0384_data |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
982 for pb in undecided.values(): |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
983 peer_jid = jid.JID(pb.bare_jid) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
984 device = pb.device |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
985 ik = pb.ik |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
986 key = f"{KEY_AUTO_TRUST}\n{pb.bare_jid}" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
987 auto_trusted = await stored_data.get(key, default=set()) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
988 auto_trusted.add(device) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
989 await stored_data.aset(key, auto_trusted) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
990 await session.setTrust(peer_jid, device, ik, True) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
991 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
992 user_msg = D_( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
993 "Not all destination devices are trusted, unknown devices will be blind " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
994 "trusted due to the OMEMO Blind Trust Before Verification policy. If you " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
995 "want a more secure workflow, please activate \"manual\" OMEMO policy in " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
996 "settings' \"Security\" tab.\nFollowing fingerprint have been automatically " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
997 "trusted:\n{devices}" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
998 ).format( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
999 devices = ', '.join( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1000 f"- {pb.device} ({pb.bare_jid}): {pb.ik.hex().upper()}" |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1001 for pb in undecided.values() |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1002 ) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1003 ) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1004 client.feedback(feedback_jid, user_msg) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1005 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1006 async def policyManual(self, client, feedback_jid, expect_problems, undecided): |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1007 trust_data = {} |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1008 for trust_id, data in undecided.items(): |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1009 trust_data[trust_id] = { |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1010 'jid': jid.JID(data.bare_jid), |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1011 'device': data.device, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1012 'ik': data.ik} |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1013 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1014 user_msg = D_("Not all destination devices are trusted, we can't encrypt " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1015 "message in such a situation. Please indicate if you trust " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1016 "those devices or not in the trust manager before we can " |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1017 "send this message") |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1018 client.feedback(feedback_jid, user_msg) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1019 xmlui = await self.getTrustUI(client, trust_data=trust_data, submit_id="") |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1020 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1021 answer = await xml_tools.deferXMLUI( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1022 self.host, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1023 xmlui, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1024 action_extra={ |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1025 "meta_encryption_trust": NS_OMEMO, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1026 }, |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1027 profile=client.profile) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1028 await self.trustUICb(answer, trust_data, expect_problems, client.profile) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1029 |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1030 async def handleProblems( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1031 self, client, feedback_jid, bundles, expect_problems, problems): |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1032 """Try to solve problems found by EncryptMessage |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1033 |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1034 @param feedback_jid(jid.JID): bare jid where the feedback message must be sent |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1035 @param bundles(dict): bundles data as used in EncryptMessage |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1036 already filled with known bundles, missing bundles |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1037 need to be added to it |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1038 This dict is updated |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1039 @param problems(list): exceptions raised by EncryptMessage |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1040 @param expect_problems(dict): known problems to expect, used in encryptMessage |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1041 This dict will list devices where problems can be ignored |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1042 (those devices won't receive the encrypted data) |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1043 This dict is updated |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1044 """ |
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1045 # FIXME: not all problems are handled yet |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1046 undecided = {} |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1047 missing_bundles = {} |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1048 found_bundles = None |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1049 cache = client._xep_0384_cache |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1050 for problem in problems: |
2857
88f10630d5ea
plugin XEP-0384: removed version restriction, it is now compatible with (and require) last version of python-omemo (0.10.4)
Goffi <goffi@goffi.org>
parents:
2823
diff
changeset
|
1051 if isinstance(problem, omemo_excpt.TrustException): |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1052 if problem.problem == 'undecided': |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1053 undecided[str(hash(problem))] = problem |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1054 elif problem.problem == 'untrusted': |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1055 expect_problems.setdefault(problem.bare_jid, set()).add( |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1056 problem.device) |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1057 log.info(_( |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1058 "discarding untrusted device {device_id} with key {device_key} " |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1059 "for {entity}").format( |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1060 device_id=problem.device, |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1061 device_key=problem.ik.hex().upper(), |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1062 entity=problem.bare_jid, |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1063 ) |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1064 ) |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1065 else: |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1066 log.error( |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1067 f"Unexpected trust problem: {problem.problem!r} for device " |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1068 f"{problem.device} for {problem.bare_jid}, ignoring device") |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1069 expect_problems.setdefault(problem.bare_jid, set()).add( |
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1070 problem.device) |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1071 elif isinstance(problem, omemo_excpt.MissingBundleException): |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1072 pb_entity = jid.JID(problem.bare_jid) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1073 entity_cache = cache.setdefault(pb_entity, {}) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1074 entity_bundles = bundles.setdefault(pb_entity, {}) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1075 if problem.device in entity_cache: |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1076 entity_bundles[problem.device] = entity_cache[problem.device] |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1077 else: |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1078 found_bundles, missing = await self.getBundles( |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1079 client, pb_entity, [problem.device]) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1080 entity_cache.update(bundles) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1081 entity_bundles.update(found_bundles) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1082 if problem.device in missing: |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1083 missing_bundles.setdefault(pb_entity, set()).add( |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1084 problem.device) |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1085 expect_problems.setdefault(problem.bare_jid, set()).add( |
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1086 problem.device) |
2860
851c47cc4ae7
plugin XEP-0384: handle NoEligibleDevicesException
Goffi <goffi@goffi.org>
parents:
2859
diff
changeset
|
1087 elif isinstance(problem, omemo_excpt.NoEligibleDevicesException): |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1088 if undecided or found_bundles: |
2860
851c47cc4ae7
plugin XEP-0384: handle NoEligibleDevicesException
Goffi <goffi@goffi.org>
parents:
2859
diff
changeset
|
1089 # we may have new devices after this run, so let's continue for now |
851c47cc4ae7
plugin XEP-0384: handle NoEligibleDevicesException
Goffi <goffi@goffi.org>
parents:
2859
diff
changeset
|
1090 continue |
851c47cc4ae7
plugin XEP-0384: handle NoEligibleDevicesException
Goffi <goffi@goffi.org>
parents:
2859
diff
changeset
|
1091 else: |
851c47cc4ae7
plugin XEP-0384: handle NoEligibleDevicesException
Goffi <goffi@goffi.org>
parents:
2859
diff
changeset
|
1092 raise problem |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1093 else: |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1094 raise problem |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1095 |
3028 | 1096 for peer_jid, devices in missing_bundles.items(): |
1097 devices_s = [str(d) for d in devices] | |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1098 log.warning( |
3028 | 1099 _("Can't retrieve bundle for device(s) {devices} of entity {peer}, " |
1100 "the message will not be readable on this/those device(s)").format( | |
1101 devices=", ".join(devices_s), peer=peer_jid.full())) | |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1102 client.feedback( |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1103 feedback_jid, |
3028 | 1104 D_("You're destinee {peer} has missing encryption data on some of " |
1105 "his/her device(s) (bundle on device {devices}), the message won't " | |
1106 "be readable on this/those device.").format( | |
1107 peer=peer_jid.full(), devices=", ".join(devices_s))) | |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1108 |
3085
c048fc192739
plugin XEP-0384: update to latest python-omemo + better trust management:
Goffi <goffi@goffi.org>
parents:
3084
diff
changeset
|
1109 if undecided: |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1110 omemo_policy = self.host.memory.getParamA( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1111 PARAM_NAME, PARAM_CATEGORY, profile_key=client.profile |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1112 ) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1113 if omemo_policy == 'btbv': |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1114 # we first separate entities which have been trusted manually |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1115 manual_trust = await client._xep_0384_data.get(KEY_MANUAL_TRUST) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1116 if manual_trust: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1117 manual_undecided = {} |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1118 for hash_, pb in undecided.items(): |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1119 if pb.bare_jid in manual_trust: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1120 manual_undecided[hash_] = pb |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1121 for hash_ in manual_undecided: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1122 del undecided[hash_] |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1123 else: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1124 manual_undecided = None |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1125 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1126 if undecided: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1127 # we do the automatic trust here |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1128 await self.policyBTBV( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1129 client, feedback_jid, expect_problems, undecided) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1130 if manual_undecided: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1131 # here user has to manually trust new devices from entities already |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1132 # verified |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1133 await self.policyManual( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1134 client, feedback_jid, expect_problems, manual_undecided) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1135 elif omemo_policy == 'manual': |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1136 await self.policyManual( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1137 client, feedback_jid, expect_problems, undecided) |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1138 else: |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1139 raise exceptions.InternalError(f"Unexpected OMEMO policy: {omemo_policy}") |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1140 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1141 async def encryptMessage(self, client, entity_bare_jids, message, feedback_jid=None): |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1142 if feedback_jid is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1143 if len(entity_bare_jids) != 1: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1144 log.error( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1145 "feedback_jid must be provided when message is encrypted for more " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1146 "than one entities") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1147 feedback_jid = entity_bare_jids[0] |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1148 omemo_session = client._xep_0384_session |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1149 expect_problems = {} |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1150 bundles = {} |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1151 loop_idx = 0 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1152 try: |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1153 while True: |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1154 if loop_idx > 10: |
3028 | 1155 msg = _("Too many iterations in encryption loop") |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1156 log.error(msg) |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1157 raise exceptions.InternalError(msg) |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1158 # encryptMessage may fail, in case of e.g. trust issue or missing bundle |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1159 try: |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1160 if not message: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1161 encrypted = await omemo_session.encryptRatchetForwardingMessage( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1162 entity_bare_jids, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1163 bundles, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1164 expect_problems = expect_problems) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1165 else: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1166 encrypted = await omemo_session.encryptMessage( |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1167 entity_bare_jids, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1168 message, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1169 bundles, |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1170 expect_problems = expect_problems) |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1171 except omemo_excpt.EncryptionProblemsException as e: |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1172 # we know the problem to solve, we can try to fix them |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1173 await self.handleProblems( |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1174 client, |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1175 feedback_jid=feedback_jid, |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1176 bundles=bundles, |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1177 expect_problems=expect_problems, |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1178 problems=e.problems) |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1179 loop_idx += 1 |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1180 else: |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1181 break |
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1182 except Exception as e: |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1183 msg = _("Can't encrypt message for {entities}: {reason}".format( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1184 entities=', '.join(e.full() for e in entity_bare_jids), reason=e)) |
2859
4e875d9eea48
plugin XEP-0384: give feedback to client when encryption failed
Goffi <goffi@goffi.org>
parents:
2858
diff
changeset
|
1185 log.warning(msg) |
4e875d9eea48
plugin XEP-0384: give feedback to client when encryption failed
Goffi <goffi@goffi.org>
parents:
2858
diff
changeset
|
1186 extra = {C.MESS_EXTRA_INFO: C.EXTRA_INFO_ENCR_ERR} |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1187 client.feedback(feedback_jid, msg, extra) |
2858
31a5038cdf79
plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents:
2857
diff
changeset
|
1188 raise e |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1189 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1190 defer.returnValue(encrypted) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1191 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1192 @defer.inlineCallbacks |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1193 def _messageReceivedTrigger(self, client, message_elt, post_treat): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1194 try: |
3028 | 1195 encrypted_elt = next(message_elt.elements(NS_OMEMO, "encrypted")) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1196 except StopIteration: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1197 # no OMEMO message here |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1198 defer.returnValue(True) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1199 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1200 # we have an encrypted message let's decrypt it |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1201 |
2654
e7bfbded652a
plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents:
2648
diff
changeset
|
1202 from_jid = jid.JID(message_elt['from']) |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1203 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1204 if message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1205 # with group chat, we must get the real jid for decryption |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1206 # and use the room as feedback_jid |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1207 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1208 if self._m is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1209 # plugin XEP-0045 (MUC) is not available |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1210 defer.returnValue(True) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1211 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1212 room_jid = from_jid.userhostJID() |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1213 feedback_jid = room_jid |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1214 if self._sid is not None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1215 mess_id = self._sid.getOriginId(message_elt) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1216 else: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1217 mess_id = None |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1218 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1219 if mess_id is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1220 mess_id = message_elt.getAttribute('id') |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1221 cache_key = (room_jid, mess_id) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1222 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1223 try: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1224 room = self._m.getRoom(client, room_jid) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1225 except exceptions.NotFound: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1226 log.warning( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1227 f"Received an OMEMO encrypted msg from a room {room_jid} which has " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1228 f"not been joined, ignoring") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1229 defer.returnValue(True) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1230 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1231 user = room.getUser(from_jid.resource) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1232 if user is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1233 log.warning(f"Can't find user {user} in room {room_jid}, ignoring") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1234 defer.returnValue(True) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1235 if not user.entity: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1236 log.warning( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1237 f"Real entity of user {user} in room {room_jid} can't be established," |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1238 f" OMEMO encrypted message can't be decrypted") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1239 defer.returnValue(True) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1240 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1241 # now we have real jid of the entity, we use it instead of from_jid |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1242 from_jid = user.entity.userhostJID() |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1243 |
2817
0ab62dd3cf05
plugin XEP-0384: better bundle handling + misc improvments
Goffi <goffi@goffi.org>
parents:
2771
diff
changeset
|
1244 else: |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1245 # we have a one2one message, we can user "from" and "to" normally |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1246 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1247 if from_jid.userhostJID() == client.jid.userhostJID(): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1248 feedback_jid = jid.JID(message_elt['to']) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1249 else: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1250 feedback_jid = from_jid |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1251 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1252 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1253 if (message_elt.getAttribute("type") == C.MESS_TYPE_GROUPCHAT |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1254 and mess_id is not None |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1255 and cache_key in client._xep_0384_muc_cache): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1256 plaintext = client._xep_0384_muc_cache.pop(cache_key) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1257 if not client._xep_0384_muc_cache: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1258 client._xep_0384_muc_cache_timer.cancel() |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1259 client._xep_0384_muc_cache_timer = None |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1260 else: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1261 try: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1262 omemo_session = client._xep_0384_session |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1263 except AttributeError: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1264 # on startup, message can ve received before session actually exists |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1265 # so we need to synchronise here |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1266 yield client._xep_0384_ready |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1267 omemo_session = client._xep_0384_session |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1268 |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1269 device_id = client._xep_0384_device_id |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1270 try: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1271 header_elt = next(encrypted_elt.elements(NS_OMEMO, 'header')) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1272 iv_elt = next(header_elt.elements(NS_OMEMO, 'iv')) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1273 except StopIteration: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1274 log.warning(_("Invalid OMEMO encrypted stanza, ignoring: {xml}") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1275 .format(xml=message_elt.toXml())) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1276 defer.returnValue(False) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1277 try: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1278 s_device_id = header_elt['sid'] |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1279 except KeyError: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1280 log.warning(_("Invalid OMEMO encrypted stanza, missing sender device ID, " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1281 "ignoring: {xml}") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1282 .format(xml=message_elt.toXml())) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1283 defer.returnValue(False) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1284 try: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1285 key_elt = next((e for e in header_elt.elements(NS_OMEMO, 'key') |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1286 if int(e['rid']) == device_id)) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1287 except StopIteration: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1288 log.warning(_("This OMEMO encrypted stanza has not been encrypted " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1289 "for our device (device_id: {device_id}, fingerprint: " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1290 "{fingerprint}): {xml}").format( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1291 device_id=device_id, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1292 fingerprint=omemo_session.public_bundle.ik.hex().upper(), |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1293 xml=encrypted_elt.toXml())) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1294 user_msg = (D_("An OMEMO message from {sender} has not been encrypted for " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1295 "our device, we can't decrypt it").format( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1296 sender=from_jid.full())) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1297 extra = {C.MESS_EXTRA_INFO: C.EXTRA_INFO_DECR_ERR} |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1298 client.feedback(feedback_jid, user_msg, extra) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1299 defer.returnValue(False) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1300 except ValueError as e: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1301 log.warning(_("Invalid recipient ID: {msg}".format(msg=e))) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1302 defer.returnValue(False) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1303 is_pre_key = C.bool(key_elt.getAttribute('prekey', 'false')) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1304 payload_elt = next(encrypted_elt.elements(NS_OMEMO, 'payload'), None) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1305 additional_information = { |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1306 "from_storage": bool(message_elt.delay) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1307 } |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1308 |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1309 kwargs = { |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1310 "bare_jid": from_jid.userhostJID(), |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1311 "device": s_device_id, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1312 "iv": base64.b64decode(bytes(iv_elt)), |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1313 "message": base64.b64decode(bytes(key_elt)), |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1314 "is_pre_key_message": is_pre_key, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1315 "additional_information": additional_information, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1316 } |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1317 |
2738
eb58f26ed236
plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents:
2662
diff
changeset
|
1318 try: |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1319 if payload_elt is None: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1320 omemo_session.decryptRatchetForwardingMessage(**kwargs) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1321 plaintext = None |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1322 else: |
3240
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1323 kwargs["ciphertext"] = base64.b64decode(bytes(payload_elt)) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1324 try: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1325 plaintext = yield omemo_session.decryptMessage(**kwargs) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1326 except omemo_excpt.TrustException: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1327 post_treat.addCallback(client.encryption.markAsUntrusted) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1328 kwargs['allow_untrusted'] = True |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1329 plaintext = yield omemo_session.decryptMessage(**kwargs) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1330 else: |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1331 post_treat.addCallback(client.encryption.markAsTrusted) |
d85b68e44297
plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents:
3237
diff
changeset
|
1332 plaintext = plaintext.decode() |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1333 except Exception as e: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1334 log.warning(_("Can't decrypt message: {reason}\n{xml}").format( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1335 reason=e, xml=message_elt.toXml())) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1336 user_msg = (D_( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1337 "An OMEMO message from {sender} can't be decrypted: {reason}") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1338 .format(sender=from_jid.full(), reason=e)) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1339 extra = {C.MESS_EXTRA_INFO: C.EXTRA_INFO_DECR_ERR} |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1340 client.feedback(feedback_jid, user_msg, extra) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1341 defer.returnValue(False) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1342 finally: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1343 if omemo_session.republish_bundle: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1344 # we don't wait for the Deferred (i.e. no yield) on purpose |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1345 # there is no need to block the whole message workflow while |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1346 # updating the bundle |
3214
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
1347 defer.ensureDeferred( |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
1348 self.setBundle(client, omemo_session.public_bundle, device_id) |
8d92d4d829fb
plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents:
3172
diff
changeset
|
1349 ) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1350 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1351 message_elt.children.remove(encrypted_elt) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1352 if plaintext: |
3028 | 1353 message_elt.addElement("body", content=plaintext) |
3231
e756e0eb1be4
core (memory/encryption): automatic start encryption if peer send encrypted message:
Goffi <goffi@goffi.org>
parents:
3218
diff
changeset
|
1354 post_treat.addCallback(client.encryption.markAsEncrypted, namespace=NS_OMEMO) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1355 defer.returnValue(True) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1356 |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1357 def getJIDsForRoom(self, client, room_jid): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1358 if self._m is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1359 exceptions.InternalError("XEP-0045 plugin missing, can't encrypt for group chat") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1360 room = self._m.getRoom(client, room_jid) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1361 return [u.entity.userhostJID() for u in room.roster.values()] |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1362 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1363 def _expireMUCCache(self, client): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1364 client._xep_0384_muc_cache_timer = None |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1365 for (room_jid, uid), msg in client._xep_0384_muc_cache.items(): |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1366 client.feedback( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1367 room_jid, |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1368 D_("Our message with UID {uid} has not been received in time, it has " |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1369 "probably been lost. The message was: {msg!r}").format( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1370 uid=uid, msg=str(msg))) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1371 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1372 client._xep_0384_muc_cache.clear() |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1373 log.warning("Cache for OMEMO MUC has expired") |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1374 |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1375 @defer.inlineCallbacks |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1376 def _sendMessageDataTrigger(self, client, mess_data): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1377 encryption = mess_data.get(C.MESS_KEY_ENCRYPTION) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1378 if encryption is None or encryption['plugin'].namespace != NS_OMEMO: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1379 return |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1380 message_elt = mess_data["xml"] |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1381 if mess_data['type'] == C.MESS_TYPE_GROUPCHAT: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1382 feedback_jid = room_jid = mess_data['to'] |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1383 to_jids = self.getJIDsForRoom(client, room_jid) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1384 else: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1385 feedback_jid = to_jid = mess_data["to"].userhostJID() |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1386 to_jids = [to_jid] |
3028 | 1387 log.debug("encrypting message") |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1388 body = None |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1389 for child in list(message_elt.children): |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1390 if child.name == "body": |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1391 # we remove all unencrypted body, |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1392 # and will only encrypt the first one |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1393 if body is None: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1394 body = child |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1395 message_elt.children.remove(child) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1396 elif child.name == "html": |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1397 # we don't want any XHTML-IM element |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1398 message_elt.children.remove(child) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1399 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1400 if body is None: |
3028 | 1401 log.warning("No message found") |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1402 return |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1403 |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1404 body = str(body) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1405 |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1406 if mess_data['type'] == C.MESS_TYPE_GROUPCHAT: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1407 key = (room_jid, mess_data['uid']) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1408 # XXX: we can't encrypt message for our own device for security reason |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1409 # so we keep the plain text version in cache until we receive the |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1410 # message. We don't send it directly to bridge to keep a workflow |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1411 # similar to plain text MUC, so when we see it in frontend we know |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1412 # that it has been sent correctly. |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1413 client._xep_0384_muc_cache[key] = body |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1414 timer = client._xep_0384_muc_cache_timer |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1415 if timer is None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1416 client._xep_0384_muc_cache_timer = reactor.callLater( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1417 MUC_CACHE_TTL, self._expireMUCCache, client) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1418 else: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1419 timer.reset(MUC_CACHE_TTL) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1420 # we use origin-id when possible, to identifiy the message in a stable way |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1421 if self._sid is not None: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1422 self._sid.addOriginId(message_elt, mess_data['uid']) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1423 |
3237
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1424 encryption_data = yield defer.ensureDeferred(self.encryptMessage( |
b0c57c9a4bd8
plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents:
3236
diff
changeset
|
1425 client, to_jids, body, feedback_jid=feedback_jid)) |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1426 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1427 encrypted_elt = message_elt.addElement((NS_OMEMO, 'encrypted')) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1428 header_elt = encrypted_elt.addElement('header') |
3028 | 1429 header_elt['sid'] = str(encryption_data['sid']) |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1430 |
3696
52ee22d78e18
plugin XEP-0384: fix encryption for user own devices:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1431 for key_data in encryption_data['keys'].values(): |
52ee22d78e18
plugin XEP-0384: fix encryption for user own devices:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1432 for rid, data in key_data.items(): |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1433 key_elt = header_elt.addElement( |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1434 'key', |
3696
52ee22d78e18
plugin XEP-0384: fix encryption for user own devices:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1435 content=b64enc(data['data']) |
52ee22d78e18
plugin XEP-0384: fix encryption for user own devices:
Goffi <goffi@goffi.org>
parents:
3479
diff
changeset
|
1436 ) |
3104
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1437 key_elt['rid'] = str(rid) |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1438 if data['pre_key']: |
118d91c932a7
plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents:
3098
diff
changeset
|
1439 key_elt['prekey'] = 'true' |
2648
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1440 |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1441 header_elt.addElement( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1442 'iv', |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1443 content=b64enc(encryption_data['iv'])) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1444 try: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1445 encrypted_elt.addElement( |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1446 'payload', |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1447 content=b64enc(encryption_data['payload'])) |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1448 except KeyError: |
0f76813afc57
plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff
changeset
|
1449 pass |