annotate libervia/backend/plugins/plugin_xep_0384.py @ 4219:1b5cf2ee1d86

plugin XEP-0384, XEP-0391: download missing devices list: when a peer jid was not in our roster, devices list was not retrieved, resulting in failed en/decryption. This patch does check it and download missing devices list in necessary. There is no subscription managed yet, so the list won't be updated in case of new devices, this should be addressed at some point.
author Goffi <goffi@goffi.org>
date Tue, 05 Mar 2024 17:31:36 +0100
parents c0f3f29377f1
children e11b13418ba6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
1 #!/usr/bin/env python3
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
3 # Libervia plugin for OMEMO encryption
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
4 # Copyright (C) 2022-2022 Tim Henkes (me@syndace.dev)
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
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
19 import base64
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
20 from datetime import datetime
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
21 import enum
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
22 import logging
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
23 import time
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
24 from typing import \
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
25 Any, Dict, FrozenSet, Iterable, List, Literal, NamedTuple, Optional, Set, Type, Union, cast
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
26 import uuid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
27 import xml.etree.ElementTree as ET
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
28 from xml.sax.saxutils import quoteattr
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
29
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
30 from typing_extensions import Final, Never, assert_never
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
31 from wokkel import muc, pubsub # type: ignore[import]
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
32 import xmlschema
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
33
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
34 from libervia.backend.core import exceptions
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
35 from libervia.backend.core.constants import Const as C
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
36 from libervia.backend.core.core_types import MessageData, SatXMPPEntity
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
37 from libervia.backend.core.i18n import _, D_
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
38 from libervia.backend.core.log import getLogger, Logger
4073
7c5654c54fed refactoring: rename `core.sat_main` to `core.main`
Goffi <goffi@goffi.org>
parents: 4072
diff changeset
39 from libervia.backend.core.main import LiberviaBackend
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
40 from libervia.backend.core.xmpp import SatXMPPClient
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
41 from libervia.backend.memory import persistent
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
42 from libervia.backend.plugins.plugin_misc_text_commands import TextCommands
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
43 from libervia.backend.plugins.plugin_xep_0045 import XEP_0045
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
44 from libervia.backend.plugins.plugin_xep_0060 import XEP_0060
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
45 from libervia.backend.plugins.plugin_xep_0163 import XEP_0163
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
46 from libervia.backend.plugins.plugin_xep_0334 import XEP_0334
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
47 from libervia.backend.plugins.plugin_xep_0359 import XEP_0359
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
48 from libervia.backend.plugins.plugin_xep_0420 import \
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
49 XEP_0420, SCEAffixPolicy, SCEAffixValues, SCEProfile
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 4051
diff changeset
50 from libervia.backend.tools import xml_tools
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
51 from twisted.internet import defer
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
52 from twisted.words.protocols.jabber import error, jid
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 from twisted.words.xish import domish
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
54
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 try:
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 import omemo
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
57 import omemo.identity_key_pair
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
58 import twomemo
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
59 import twomemo.etree
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
60 import oldmemo
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
61 import oldmemo.etree
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
62 import oldmemo.migrations
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
63 from xmlschema import XMLSchemaValidationError
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
64
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
65 # An explicit version check of the OMEMO libraries should not be required here, since
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
66 # the stored data is fully versioned and the library will complain if a downgrade is
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
67 # attempted.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
68 except ImportError as import_error:
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 raise exceptions.MissingModule(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
70 "You are missing one or more package required by the OMEMO plugin. Please"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
71 " download/install the pip packages 'omemo', 'twomemo', 'oldmemo' and"
3976
db45d49518f6 plugin XEP-0384: log `import_error` when import is failing
Goffi <goffi@goffi.org>
parents: 3972
diff changeset
72 f" 'xmlschema'.\nexception: {import_error}"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
73 ) from import_error
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
74
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
75
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
76 __all__ = [ # pylint: disable=unused-variable
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
77 "PLUGIN_INFO",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
78 "OMEMO"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
79 ]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
80
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
81 log = cast(Logger, getLogger(__name__)) # type: ignore[no-untyped-call]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
82
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
83
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 PLUGIN_INFO = {
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
85 C.PI_NAME: "OMEMO",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
86 C.PI_IMPORT_NAME: "XEP-0384",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
87 C.PI_TYPE: "SEC",
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
88 C.PI_PROTOCOLS: [ "XEP-0384" ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
89 C.PI_DEPENDENCIES: [ "XEP-0163", "XEP-0280", "XEP-0334", "XEP-0060", "XEP-0420" ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
90 C.PI_RECOMMENDATIONS: [ "XEP-0045", "XEP-0359", C.TEXT_CMDS ],
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
91 C.PI_MAIN: "OMEMO",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
92 C.PI_HANDLER: "no",
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2925
diff changeset
93 C.PI_DESCRIPTION: _("""Implementation of OMEMO"""),
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 }
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
95
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
96
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
97 PARAM_CATEGORY = "Security"
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
98 PARAM_NAME = "omemo_policy"
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
99
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
100 NamespaceType = Literal["urn:xmpp:omemo:2", "eu.siacs.conversations.axolotl"]
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
101
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
102
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
103 class LogHandler(logging.Handler):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
104 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
105 Redirect python-omemo's log output to Libervia's log system.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
106 """
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
107
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
108 def emit(self, record: logging.LogRecord) -> None:
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
109 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
110
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
111
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
112 sm_logger = logging.getLogger(omemo.SessionManager.LOG_TAG)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
113 sm_logger.setLevel(logging.DEBUG)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
114 sm_logger.propagate = False
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
115 sm_logger.addHandler(LogHandler())
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
116
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
117
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
118 ikp_logger = logging.getLogger(omemo.identity_key_pair.IdentityKeyPair.LOG_TAG)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
119 ikp_logger.setLevel(logging.DEBUG)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
120 ikp_logger.propagate = False
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
121 ikp_logger.addHandler(LogHandler())
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
122
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
123
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
124 # TODO: Add handling for device labels, i.e. show device labels in the trust UI and give
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
125 # the user a way to change their own device label.
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
126
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
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
128 class MUCPlaintextCacheKey(NamedTuple):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
129 # pylint: disable=invalid-name
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
130 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
131 Structure identifying an encrypted message sent to a MUC.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
132 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
133
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
134 client: SatXMPPClient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
135 room_jid: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
136 message_uid: str
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
137
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
138
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
139 @enum.unique
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
140 class TrustLevel(enum.Enum):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
141 """
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
142 The trust levels required for ATM and BTBV.
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
143 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
144
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
145 TRUSTED: str = "TRUSTED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
146 BLINDLY_TRUSTED: str = "BLINDLY_TRUSTED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
147 UNDECIDED: str = "UNDECIDED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
148 DISTRUSTED: str = "DISTRUSTED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
149
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
150
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
151 TWOMEMO_DEVICE_LIST_NODE = "urn:xmpp:omemo:2:devices"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
152 OLDMEMO_DEVICE_LIST_NODE = "eu.siacs.conversations.axolotl.devicelist"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
153
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
154
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
155 class StorageImpl(omemo.Storage):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
156 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
157 Storage implementation for OMEMO based on :class:`persistent.LazyPersistentBinaryDict`
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
158 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
159
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
160 def __init__(self, profile: str) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
161 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
162 @param profile: The profile this OMEMO data belongs to.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
163 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
164
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
165 # persistent.LazyPersistentBinaryDict does not cache at all, so keep the caching
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
166 # option of omemo.Storage enabled.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
167 super().__init__()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
168
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
169 self.__storage = persistent.LazyPersistentBinaryDict("XEP-0384", profile)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
170
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
171 async def _load(self, key: str) -> omemo.Maybe[omemo.JSONType]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
172 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
173 return omemo.Just(await self.__storage[key])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
174 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
175 return omemo.Nothing()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
176 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
177 raise omemo.StorageException(f"Error while loading key {key}") from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
178
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
179 async def _store(self, key: str, value: omemo.JSONType) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
180 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
181 await self.__storage.force(key, value)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
182 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
183 raise omemo.StorageException(f"Error while storing key {key}: {value}") from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
184
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
185 async def _delete(self, key: str) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
186 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
187 await self.__storage.remove(key)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
188 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
189 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
190 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
191 raise omemo.StorageException(f"Error while deleting key {key}") from e
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
192
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
193
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
194 class LegacyStorageImpl(oldmemo.migrations.LegacyStorage):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
195 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
196 Legacy storage implementation to migrate data from the old XEP-0384 plugin.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
197 """
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
198
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
199 KEY_DEVICE_ID = "DEVICE_ID"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
200 KEY_STATE = "STATE"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
201 KEY_SESSION = "SESSION"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
202 KEY_ACTIVE_DEVICES = "DEVICES"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
203 KEY_INACTIVE_DEVICES = "INACTIVE_DEVICES"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
204 KEY_TRUST = "TRUST"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
205 KEY_ALL_JIDS = "ALL_JIDS"
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
206
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
207 def __init__(self, profile: str, own_bare_jid: str) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
208 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
209 @param profile: The profile this OMEMO data belongs to.
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
210 @param own_bare_jid: The own bare JID, to return by the :meth:`load_own_data` call.
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
211 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
212
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
213 self.__storage = persistent.LazyPersistentBinaryDict("XEP-0384", profile)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
214 self.__own_bare_jid = own_bare_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
215
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
216 async def loadOwnData(self) -> Optional[oldmemo.migrations.OwnData]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
217 own_device_id = await self.__storage.get(LegacyStorageImpl.KEY_DEVICE_ID, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
218 if own_device_id is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
219 return None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
220
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
221 return oldmemo.migrations.OwnData(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
222 own_bare_jid=self.__own_bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
223 own_device_id=own_device_id
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
224 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
225
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
226 async def deleteOwnData(self) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
227 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
228 await self.__storage.remove(LegacyStorageImpl.KEY_DEVICE_ID)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
229 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
230 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
231
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
232 async def loadState(self) -> Optional[oldmemo.migrations.State]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
233 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
234 Optional[oldmemo.migrations.State],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
235 await self.__storage.get(LegacyStorageImpl.KEY_STATE, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
236 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
237
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
238 async def deleteState(self) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
239 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
240 await self.__storage.remove(LegacyStorageImpl.KEY_STATE)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
241 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
242 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
243
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
244 async def loadSession(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
245 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
246 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
247 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
248 ) -> Optional[oldmemo.migrations.Session]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
249 key = "\n".join([ LegacyStorageImpl.KEY_SESSION, bare_jid, str(device_id) ])
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
250
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
251 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
252 Optional[oldmemo.migrations.Session],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
253 await self.__storage.get(key, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
254 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
255
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
256 async def deleteSession(self, bare_jid: str, device_id: int) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
257 key = "\n".join([ LegacyStorageImpl.KEY_SESSION, bare_jid, str(device_id) ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
258
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
259 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
260 await self.__storage.remove(key)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
261 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
262 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
263
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
264 async def loadActiveDevices(self, bare_jid: str) -> Optional[List[int]]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
265 key = "\n".join([ LegacyStorageImpl.KEY_ACTIVE_DEVICES, bare_jid ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
266
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
267 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
268 Optional[List[int]],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
269 await self.__storage.get(key, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
270 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
271
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
272 async def loadInactiveDevices(self, bare_jid: str) -> Optional[Dict[int, int]]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
273 key = "\n".join([ LegacyStorageImpl.KEY_INACTIVE_DEVICES, bare_jid ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
274
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
275 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
276 Optional[Dict[int, int]],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
277 await self.__storage.get(key, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
278 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
279
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
280 async def deleteActiveDevices(self, bare_jid: str) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
281 key = "\n".join([ LegacyStorageImpl.KEY_ACTIVE_DEVICES, bare_jid ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
282
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
283 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
284 await self.__storage.remove(key)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
285 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
286 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
287
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
288 async def deleteInactiveDevices(self, bare_jid: str) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
289 key = "\n".join([ LegacyStorageImpl.KEY_INACTIVE_DEVICES, bare_jid ])
3672
e4054b648111 plugin XEP-0384: fix calls outside of main thread:
Goffi <goffi@goffi.org>
parents: 3584
diff changeset
290
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
291 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
292 await self.__storage.remove(key)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
293 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
294 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
295
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
296 async def loadTrust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
297 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
298 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
299 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
300 ) -> Optional[oldmemo.migrations.Trust]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
301 key = "\n".join([ LegacyStorageImpl.KEY_TRUST, bare_jid, str(device_id) ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
302
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
303 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
304 Optional[oldmemo.migrations.Trust],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
305 await self.__storage.get(key, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
306 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
307
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
308 async def deleteTrust(self, bare_jid: str, device_id: int) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
309 key = "\n".join([ LegacyStorageImpl.KEY_TRUST, bare_jid, str(device_id) ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
310
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
311 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
312 await self.__storage.remove(key)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
313 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
314 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
315
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
316 async def listJIDs(self) -> Optional[List[str]]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
317 bare_jids = await self.__storage.get(LegacyStorageImpl.KEY_ALL_JIDS, None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
318
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
319 return None if bare_jids is None else list(bare_jids)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
320
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
321 async def deleteJIDList(self) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
322 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
323 await self.__storage.remove(LegacyStorageImpl.KEY_ALL_JIDS)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
324 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
325 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
326
3541
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
327
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
328 async def download_oldmemo_bundle(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
329 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
330 xep_0060: XEP_0060,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
331 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
332 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
333 ) -> oldmemo.oldmemo.BundleImpl:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
334 """Download the oldmemo bundle corresponding to a specific device.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
335
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
336 @param client: The client.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
337 @param xep_0060: The XEP-0060 plugin instance to use for pubsub interactions.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
338 @param bare_jid: The bare JID the device belongs to.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
339 @param device_id: The id of the device.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
340 @return: The bundle.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
341 @raise BundleDownloadFailed: if the download failed. Feel free to raise a subclass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
342 instead.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
343 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
344 # Bundle downloads are needed by the session manager and for migrations from legacy,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
345 # thus it is made a separate function.
3541
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
346
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
347 namespace = oldmemo.oldmemo.NAMESPACE
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
348 node = f"eu.siacs.conversations.axolotl.bundles:{device_id}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
349
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
350 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
351 items, __ = await xep_0060.get_items(client, jid.JID(bare_jid), node, max_items=1)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
352 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
353 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
354 f"Bundle download failed for {bare_jid}: {device_id} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
355 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
356 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
357
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
358 if len(items) != 1:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
359 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
360 f"Bundle download failed for {bare_jid}: {device_id} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
361 f" {namespace}: Unexpected number of items retrieved: {len(items)}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
362 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
363
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
364 element = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
365 next(iter(xml_tools.domish_elt_2_et_elt(cast(domish.Element, items[0]))), None)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
366 if element is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
367 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
368 f"Bundle download failed for {bare_jid}: {device_id} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
369 f" {namespace}: Item download succeeded but parsing failed: {element}."
3541
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
370 )
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
371
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
372 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
373 return oldmemo.etree.parse_bundle(element, bare_jid, device_id)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
374 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
375 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
376 f"Bundle parsing failed for {bare_jid}: {device_id} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
377 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
378 ) from e
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
379
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
380
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
381 # ATM only supports protocols based on SCE, which is currently only omemo:2, and relies on
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
382 # so many implementation details of the encryption protocol that it makes more sense to
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
383 # add ATM to the OMEMO plugin directly instead of having it a separate Libervia plugin.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
384 NS_TM: Final = "urn:xmpp:tm:1"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
385 NS_ATM: Final = "urn:xmpp:atm:1"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
386
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
387
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
388 TRUST_MESSAGE_SCHEMA = xmlschema.XMLSchema("""<?xml version='1.0' encoding='UTF-8'?>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
389 <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
390 targetNamespace='urn:xmpp:tm:1'
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
391 xmlns='urn:xmpp:tm:1'
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
392 elementFormDefault='qualified'>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
393
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
394 <xs:element name='trust-message'>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
395 <xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
396 <xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
397 <xs:element ref='key-owner' minOccurs='1' maxOccurs='unbounded'/>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
398 </xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
399 <xs:attribute name='usage' type='xs:string' use='required'/>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
400 <xs:attribute name='encryption' type='xs:string' use='required'/>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
401 </xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
402 </xs:element>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
403
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
404 <xs:element name='key-owner'>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
405 <xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
406 <xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
407 <xs:element
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
408 name='trust' type='xs:base64Binary' minOccurs='0' maxOccurs='unbounded'/>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
409 <xs:element
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
410 name='distrust' type='xs:base64Binary' minOccurs='0' maxOccurs='unbounded'/>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
411 </xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
412 <xs:attribute name='jid' type='xs:string' use='required'/>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
413 </xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
414 </xs:element>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
415 </xs:schema>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
416 """)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
417
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
418
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
419 # This is compatible with omemo:2's SCE profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
420 TM_SCE_PROFILE = SCEProfile(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
421 rpad_policy=SCEAffixPolicy.REQUIRED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
422 time_policy=SCEAffixPolicy.REQUIRED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
423 to_policy=SCEAffixPolicy.OPTIONAL,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
424 from_policy=SCEAffixPolicy.OPTIONAL,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
425 custom_policies={}
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
426 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
427
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
428
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
429 class TrustUpdate(NamedTuple):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
430 # pylint: disable=invalid-name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
431 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
432 An update to the trust status of an identity key, used by Automatic Trust Management.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
433 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
434
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
435 target_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
436 target_key: bytes
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
437 target_trust: bool
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
438
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
439 def to_dict(self) -> dict[str, Any]:
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
440 """Convert the instance to a serialised dictionary"""
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
441 data = {
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
442 "target_jid": self.target_jid.full(),
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
443 "target_key": self.target_key.hex(),
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
444 "target_trust": self.target_trust,
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
445 }
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
446 return data
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
447
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
448 @staticmethod
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
449 def from_dict(data: dict[str, Any]) -> "TrustUpdate":
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
450 """Load a serialized dictionary"""
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
451 data["target_jid"] = jid.JID(data["target_jid"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
452 data["target_key"] = bytes.fromhex(data["target_key"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
453 return TrustUpdate(**data)
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
454
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
455
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
456 class TrustMessageCacheEntry(NamedTuple):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
457 # pylint: disable=invalid-name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
458 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
459 An entry in the trust message cache used by ATM.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
460 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
461
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
462 sender_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
463 sender_key: bytes
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
464 timestamp: datetime
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
465 trust_update: TrustUpdate
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
466
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
467 def to_dict(self) -> dict[str, Any]:
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
468 """Convert the instance to a serialised dictionary"""
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
469 data = {
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
470 "sender_jid": self.sender_jid.full(),
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
471 "sender_key": self.sender_key.hex(),
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
472 "timestamp": self.timestamp.isoformat(),
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
473 "trust_update": self.trust_update.to_dict()
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
474 }
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
475 return data
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
476
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
477 @staticmethod
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
478 def from_dict(data: dict[str, Any]) -> "TrustMessageCacheEntry":
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
479 """Load a serialized dictionary"""
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
480 data["sender_jid"] = jid.JID(data["sender_jid"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
481 data["sender_key"] = bytes.fromhex(data["sender_key"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
482 data["timestamp"] = datetime.fromisoformat(data["timestamp"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
483 data["trust_update"] = TrustUpdate.from_dict(data["trust_update"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
484 return TrustMessageCacheEntry(**data)
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
485
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
486
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
487 class PartialTrustMessage(NamedTuple):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
488 # pylint: disable=invalid-name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
489 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
490 A structure representing a partial trust message, used by :func:`send_trust_messages`
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
491 to build trust messages.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
492 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
493
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
494 recipient_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
495 updated_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
496 trust_updates: FrozenSet[TrustUpdate]
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
497
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
498
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
499 async def manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
500 client: SatXMPPClient,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
501 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
502 applied_trust_updates: FrozenSet[TrustUpdate]
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
503 ) -> None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
504 """Manage the ATM trust message cache after trust updates have been applied.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
505
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
506 @param client: The client this operation runs under.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
507 @param session_manager: The session manager to use.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
508 @param applied_trust_updates: The trust updates that have already been applied,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
509 triggering this cache management run.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
510 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
511
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
512 trust_message_cache = persistent.LazyPersistentBinaryDict(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
513 "XEP-0384/TM",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
514 client.profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
515 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
516
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
517 # Load cache entries
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
518 cache_entries = {
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
519 TrustMessageCacheEntry.from_dict(d)
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
520 for d in await trust_message_cache.get("cache", [])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
521 }
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
522
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
523 # Expire cache entries that were overwritten by the applied trust updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
524 cache_entries_by_target = {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
525 (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
526 cache_entry.trust_update.target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
527 cache_entry.trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
528 ): cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
529 for cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
530 in cache_entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
531 }
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
532
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
533 for trust_update in applied_trust_updates:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
534 cache_entry = cache_entries_by_target.get(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
535 (trust_update.target_jid.userhostJID(), trust_update.target_key),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
536 None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
537 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
538
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
539 if cache_entry is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
540 cache_entries.remove(cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
541
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
542 # Apply cached Trust Messages by newly trusted devices
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
543 new_trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
544
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
545 for trust_update in applied_trust_updates:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
546 if trust_update.target_trust:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
547 # Iterate over a copy such that cache_entries can be modified
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
548 for cache_entry in set(cache_entries):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
549 if (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
550 cache_entry.sender_jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
551 == trust_update.target_jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
552 and cache_entry.sender_key == trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
553 ):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
554 trust_level = (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
555 TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
556 if cache_entry.trust_update.target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
557 else TrustLevel.DISTRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
558 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
559
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
560 # Apply the trust update
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
561 await session_manager.set_trust(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
562 cache_entry.trust_update.target_jid.userhost(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
563 cache_entry.trust_update.target_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
564 trust_level.name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
565 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
566
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
567 # Track the fact that this trust update has been applied
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
568 new_trust_updates.add(cache_entry.trust_update)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
569
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
570 # Remove the corresponding cache entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
571 cache_entries.remove(cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
572
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
573 # Store the updated cache entries
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
574 await trust_message_cache.force(
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
575 "cache",
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
576 [tm.to_dict() for tm in cache_entries]
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
577 )
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
578
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
579 # TODO: Notify the user ("feedback") about automatically updated trust?
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
580
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
581 if len(new_trust_updates) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
582 # If any trust has been updated, recursively perform another run of cache
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
583 # management
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
584 await manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
585 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
586 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
587 frozenset(new_trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
588 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
589
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
590
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
591 async def get_trust_as_trust_updates(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
592 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
593 target_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
594 ) -> FrozenSet[TrustUpdate]:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
595 """Get the trust status of all known keys of a JID as trust updates for use with ATM.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
596
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
597 @param session_manager: The session manager to load the trust from.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
598 @param target_jid: The JID to load the trust for.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
599 @return: The trust updates encoding the trust status of all known keys of the JID that
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
600 are either explicitly trusted or distrusted. Undecided keys are not included in
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
601 the trust updates.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
602 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
603
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
604 devices = await session_manager.get_device_information(target_jid.userhost())
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
605
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
606 trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
607
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
608 for device in devices:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
609 trust_level = TrustLevel(device.trust_level_name)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
610 target_trust: bool
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
611
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
612 if trust_level is TrustLevel.TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
613 target_trust = True
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
614 elif trust_level is TrustLevel.DISTRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
615 target_trust = False
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
616 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
617 # Skip devices that are not explicitly trusted or distrusted
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
618 continue
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
619
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
620 trust_updates.add(TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
621 target_jid=target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
622 target_key=device.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
623 target_trust=target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
624 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
625
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
626 return frozenset(trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
627
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
628
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
629 async def send_trust_messages(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
630 client: SatXMPPClient,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
631 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
632 applied_trust_updates: FrozenSet[TrustUpdate]
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
633 ) -> None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
634 """Send information about updated trust to peers via ATM (XEP-0450).
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
635
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
636 @param client: The client.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
637 @param session_manager: The session manager.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
638 @param applied_trust_updates: The trust updates that have already been applied, to
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
639 notify other peers about.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
640 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
641 # NOTE: This currently sends information about oldmemo trust too. This is not
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
642 # specified and experimental, but since twomemo and oldmemo share the same identity
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
643 # keys and trust systems, this could be a cool side effect.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
644
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
645 # Send Trust Messages for newly trusted and distrusted devices
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
646 own_jid = client.jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
647 own_trust_updates = await get_trust_as_trust_updates(session_manager, own_jid)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
648
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
649 # JIDs of which at least one device's trust has been updated
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
650 updated_jids = frozenset({
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
651 trust_update.target_jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
652 for trust_update
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
653 in applied_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
654 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
655
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
656 trust_messages: Set[PartialTrustMessage] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
657
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
658 for updated_jid in updated_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
659 # Get the trust updates for that JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
660 trust_updates = frozenset({
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
661 trust_update for trust_update in applied_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
662 if trust_update.target_jid.userhostJID() == updated_jid
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
663 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
664
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
665 if updated_jid == own_jid:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
666 # If the own JID is updated, _all_ peers have to be notified
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
667 # TODO: Using my author's privilege here to shamelessly access private fields
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
668 # and storage keys until I've added public API to get a list of peers to
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
669 # python-omemo.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
670 storage: omemo.Storage = getattr(session_manager, "_SessionManager__storage")
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
671 peer_jids = frozenset({
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
672 jid.JID(bare_jid).userhostJID() for bare_jid in (await storage.load_list(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
673 f"/{OMEMO.NS_TWOMEMO}/bare_jids",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
674 str
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
675 )).maybe([])
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
676 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
677
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
678 if len(peer_jids) == 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
679 # If there are no peers to notify, notify our other devices about the
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
680 # changes directly
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
681 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
682 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
683 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
684 trust_updates=trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
685 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
686 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
687 # Otherwise, notify all peers about the changes in trust and let carbons
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
688 # handle the copy to our own JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
689 for peer_jid in peer_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
690 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
691 recipient_jid=peer_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
692 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
693 trust_updates=trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
694 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
695
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
696 # Also send full trust information about _every_ peer to our newly
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
697 # trusted devices
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
698 peer_trust_updates = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
699 await get_trust_as_trust_updates(session_manager, peer_jid)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
700
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
701 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
702 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
703 updated_jid=peer_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
704 trust_updates=peer_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
705 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
706
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
707 # Send information about our own devices to our newly trusted devices
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
708 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
709 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
710 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
711 trust_updates=own_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
712 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
713 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
714 # Notify our other devices about the changes in trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
715 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
716 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
717 updated_jid=updated_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
718 trust_updates=trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
719 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
720
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
721 # Send a summary of our own trust to newly trusted devices
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
722 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
723 recipient_jid=updated_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
724 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
725 trust_updates=own_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
726 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
727
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
728 # All trust messages prepared. Merge all trust messages directed at the same
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
729 # recipient.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
730 recipient_jids = { trust_message.recipient_jid for trust_message in trust_messages }
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
731
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
732 for recipient_jid in recipient_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
733 updated: Dict[jid.JID, Set[TrustUpdate]] = {}
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
734
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
735 for trust_message in trust_messages:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
736 # Merge trust messages directed at that recipient
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
737 if trust_message.recipient_jid == recipient_jid:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
738 # Merge the trust updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
739 updated[trust_message.updated_jid] = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
740 updated.get(trust_message.updated_jid, set())
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
741
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
742 updated[trust_message.updated_jid] |= trust_message.trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
743
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
744 # Build the trust message
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
745 trust_message_elt = domish.Element((NS_TM, "trust-message"))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
746 trust_message_elt["usage"] = NS_ATM
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
747 trust_message_elt["encryption"] = twomemo.twomemo.NAMESPACE
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
748
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
749 for updated_jid, trust_updates in updated.items():
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
750 key_owner_elt = trust_message_elt.addElement((NS_TM, "key-owner"))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
751 key_owner_elt["jid"] = updated_jid.userhost()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
752
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
753 for trust_update in trust_updates:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
754 serialized_identity_key = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
755 base64.b64encode(trust_update.target_key).decode("ASCII")
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
756
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
757 if trust_update.target_trust:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
758 key_owner_elt.addElement(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
759 (NS_TM, "trust"),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
760 content=serialized_identity_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
761 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
762 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
763 key_owner_elt.addElement(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
764 (NS_TM, "distrust"),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
765 content=serialized_identity_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
766 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
767
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
768 # Finally, encrypt and send the trust message!
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
769 message_data = client.generate_message_xml(MessageData({
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
770 "from": own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
771 "to": recipient_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
772 "uid": str(uuid.uuid4()),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
773 "message": {},
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
774 "subject": {},
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
775 "type": C.MESS_TYPE_CHAT,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
776 "extra": {},
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
777 "timestamp": time.time()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
778 }))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
779
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
780 message_data["xml"].addChild(trust_message_elt)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
781
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
782 plaintext = XEP_0420.pack_stanza(TM_SCE_PROFILE, message_data["xml"])
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
783
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
784 feedback_jid = recipient_jid
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
785
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
786 # TODO: The following is mostly duplicate code
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
787 try:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
788 messages, encryption_errors = await session_manager.encrypt(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
789 frozenset({ own_jid.userhost(), recipient_jid.userhost() }),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
790 { OMEMO.NS_TWOMEMO: plaintext },
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
791 backend_priority_order=[ OMEMO.NS_TWOMEMO ],
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
792 identifier=feedback_jid.userhost()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
793 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
794 except Exception as e:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
795 msg = _(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
796 # pylint: disable=consider-using-f-string
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
797 "Can't encrypt message for {entities}: {reason}".format(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
798 entities=', '.join({ own_jid.userhost(), recipient_jid.userhost() }),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
799 reason=e
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
800 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
801 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
802 log.warning(msg)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
803 client.feedback(feedback_jid, msg, {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
804 C.MESS_EXTRA_INFO: C.EXTRA_INFO_ENCR_ERR
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
805 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
806 raise e
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
807
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
808 if len(encryption_errors) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
809 log.warning(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
810 f"Ignored the following non-critical encryption errors:"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
811 f" {encryption_errors}"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
812 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
813
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
814 encrypted_errors_stringified = ", ".join([
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
815 f"device {err.device_id} of {err.bare_jid} under namespace"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
816 f" {err.namespace}"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
817 for err
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
818 in encryption_errors
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
819 ])
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
820
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
821 client.feedback(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
822 feedback_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
823 D_(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
824 "There were non-critical errors during encryption resulting in some"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
825 " of your destinees' devices potentially not receiving the message."
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
826 " This happens when the encryption data/key material of a device is"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
827 " incomplete or broken, which shouldn't happen for actively used"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
828 " devices, and can usually be ignored. The following devices are"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
829 f" affected: {encrypted_errors_stringified}."
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
830 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
831 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
832
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
833 message = next(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
834 message for message in messages
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
835 if message.namespace == OMEMO.NS_TWOMEMO
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
836 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
837
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
838 # Add the encrypted element
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
839 message_data["xml"].addChild(xml_tools.et_elt_2_domish_elt(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
840 twomemo.etree.serialize_message(message)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
841 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
842
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
843 await client.a_send(message_data["xml"])
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
844
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
845
4072
040095a5dc7f refactoring: rename `SAT` class to `LiberviaBackend`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
846 def make_session_manager(sat: LiberviaBackend, profile: str) -> Type[omemo.SessionManager]:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
847 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
848 @param sat: The SAT instance.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
849 @param profile: The profile.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
850 @return: A non-abstract subclass of :class:`~omemo.session_manager.SessionManager`
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
851 with XMPP interactions and trust handled via the SAT instance.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
852 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
853
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
854 client = sat.get_client(profile)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
855 xep_0060 = cast(XEP_0060, sat.plugins["XEP-0060"])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
856
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
857 class SessionManagerImpl(omemo.SessionManager):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
858 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
859 Session manager implementation handling XMPP interactions and trust via an
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
860 instance of :class:`~sat.core.sat_main.SAT`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
861 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
862
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
863 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
864 async def _upload_bundle(bundle: omemo.Bundle) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
865 if isinstance(bundle, twomemo.twomemo.BundleImpl):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
866 element = twomemo.etree.serialize_bundle(bundle)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
867
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
868 node = "urn:xmpp:omemo:2:bundles"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
869 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
870 await xep_0060.send_item(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
871 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
872 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
873 node,
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
874 xml_tools.et_elt_2_domish_elt(element),
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
875 item_id=str(bundle.device_id),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
876 extra={
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
877 XEP_0060.EXTRA_PUBLISH_OPTIONS: {
4218
c0f3f29377f1 plugin XEP-0384: be sure to have `open` access model for created nodes.
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
878 XEP_0060.OPT_ACCESS_MODEL: "open",
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
879 XEP_0060.OPT_MAX_ITEMS: "max"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
880 },
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
881 XEP_0060.EXTRA_ON_PRECOND_NOT_MET: "raise"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
882 }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
883 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
884 except (error.StanzaError, Exception) as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
885 if (
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
886 isinstance(e, error.StanzaError)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
887 and e.condition == "conflict"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
888 and e.appCondition is not None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
889 # pylint: disable=no-member
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
890 and e.appCondition.name == "precondition-not-met"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
891 ):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
892 # publish options couldn't be set on the fly, manually reconfigure
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
893 # the node and publish again
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
894 raise omemo.BundleUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
895 f"precondition-not-met: {bundle}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
896 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
897 # TODO: What can I do here? The correct node configuration is a
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
898 # MUST in the XEP.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
899
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
900 raise omemo.BundleUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
901 f"Bundle upload failed: {bundle}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
902 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
903
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
904 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
905
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
906 if isinstance(bundle, oldmemo.oldmemo.BundleImpl):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
907 element = oldmemo.etree.serialize_bundle(bundle)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
908
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
909 node = f"eu.siacs.conversations.axolotl.bundles:{bundle.device_id}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
910 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
911 await xep_0060.send_item(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
912 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
913 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
914 node,
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
915 xml_tools.et_elt_2_domish_elt(element),
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
916 item_id=xep_0060.ID_SINGLETON,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
917 extra={
4218
c0f3f29377f1 plugin XEP-0384: be sure to have `open` access model for created nodes.
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
918 XEP_0060.EXTRA_PUBLISH_OPTIONS: {
c0f3f29377f1 plugin XEP-0384: be sure to have `open` access model for created nodes.
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
919 XEP_0060.OPT_ACCESS_MODEL: "open",
c0f3f29377f1 plugin XEP-0384: be sure to have `open` access model for created nodes.
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
920 XEP_0060.OPT_MAX_ITEMS: 1
c0f3f29377f1 plugin XEP-0384: be sure to have `open` access model for created nodes.
Goffi <goffi@goffi.org>
parents: 4216
diff changeset
921 },
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
922 XEP_0060.EXTRA_ON_PRECOND_NOT_MET: "publish_without_options"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
923 }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
924 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
925 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
926 raise omemo.BundleUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
927 f"Bundle upload failed: {bundle}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
928 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
929
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
930 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
931
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
932 raise omemo.UnknownNamespace(f"Unknown namespace: {bundle.namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
933
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
934 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
935 async def _download_bundle(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
936 namespace: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
937 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
938 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
939 ) -> omemo.Bundle:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
940 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
941 node = "urn:xmpp:omemo:2:bundles"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
942
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
943 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
944 items, __ = await xep_0060.get_items(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
945 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
946 jid.JID(bare_jid),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
947 node,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
948 item_ids=[ str(device_id) ]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
949 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
950 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
951 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
952 f"Bundle download failed for {bare_jid}: {device_id} under"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
953 f" namespace {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
954 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
955
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
956 if len(items) != 1:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
957 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
958 f"Bundle download failed for {bare_jid}: {device_id} under"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
959 f" namespace {namespace}: Unexpected number of items retrieved:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
960 f" {len(items)}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
961 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
962
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
963 element = next(
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
964 iter(xml_tools.domish_elt_2_et_elt(cast(domish.Element, items[0]))),
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
965 None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
966 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
967 if element is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
968 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
969 f"Bundle download failed for {bare_jid}: {device_id} under"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
970 f" namespace {namespace}: Item download succeeded but parsing"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
971 f" failed: {element}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
972 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
973
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
974 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
975 return twomemo.etree.parse_bundle(element, bare_jid, device_id)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
976 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
977 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
978 f"Bundle parsing failed for {bare_jid}: {device_id} under"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
979 f" namespace {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
980 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
981
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
982 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
983 return await download_oldmemo_bundle(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
984 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
985 xep_0060,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
986 bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
987 device_id
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
988 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
989
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
990 raise omemo.UnknownNamespace(f"Unknown namespace: {namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
991
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
992 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
993 async def _delete_bundle(namespace: str, device_id: int) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
994 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
995 node = "urn:xmpp:omemo:2:bundles"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
996
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
997 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
998 await xep_0060.retract_items(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
999 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1000 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1001 node,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1002 [ str(device_id) ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1003 notify=False
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1004 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1005 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1006 raise omemo.BundleDeletionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1007 f"Bundle deletion failed for {device_id} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1008 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1009 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1010
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1011 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1012
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1013 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1014 node = f"eu.siacs.conversations.axolotl.bundles:{device_id}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1015
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1016 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1017 await xep_0060.deleteNode(client, client.jid.userhostJID(), node)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1018 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1019 raise omemo.BundleDeletionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1020 f"Bundle deletion failed for {device_id} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1021 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1022 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1023
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1024 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1025
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1026 raise omemo.UnknownNamespace(f"Unknown namespace: {namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1027
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1028 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1029 async def _upload_device_list(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1030 namespace: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1031 device_list: Dict[int, Optional[str]]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1032 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1033 element: Optional[ET.Element] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1034 node: Optional[str] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1035
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1036 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1037 element = twomemo.etree.serialize_device_list(device_list)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1038 node = TWOMEMO_DEVICE_LIST_NODE
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1039 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1040 element = oldmemo.etree.serialize_device_list(device_list)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1041 node = OLDMEMO_DEVICE_LIST_NODE
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1042
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1043 if element is None or node is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1044 raise omemo.UnknownNamespace(f"Unknown namespace: {namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1045
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1046 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1047 await xep_0060.send_item(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1048 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1049 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1050 node,
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1051 xml_tools.et_elt_2_domish_elt(element),
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1052 item_id=xep_0060.ID_SINGLETON,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1053 extra={
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
1054 XEP_0060.EXTRA_PUBLISH_OPTIONS: {
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
1055 XEP_0060.OPT_MAX_ITEMS: 1,
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
1056 XEP_0060.OPT_ACCESS_MODEL: "open"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1057 },
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
1058 XEP_0060.EXTRA_ON_PRECOND_NOT_MET: "raise"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1059 }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1060 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1061 except (error.StanzaError, Exception) as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1062 if (
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1063 isinstance(e, error.StanzaError)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1064 and e.condition == "conflict"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1065 and e.appCondition is not None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1066 # pylint: disable=no-member
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1067 and e.appCondition.name == "precondition-not-met"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1068 ):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1069 # publish options couldn't be set on the fly, manually reconfigure the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1070 # node and publish again
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1071 raise omemo.DeviceListUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1072 f"precondition-not-met for namespace {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1073 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1074 # TODO: What can I do here? The correct node configuration is a MUST
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1075 # in the XEP.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1076
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1077 raise omemo.DeviceListUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1078 f"Device list upload failed for namespace {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1079 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1080
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1081 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1082 async def _download_device_list(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1083 namespace: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1084 bare_jid: str
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1085 ) -> Dict[int, Optional[str]]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1086 node: Optional[str] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1087
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1088 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1089 node = TWOMEMO_DEVICE_LIST_NODE
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1090 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1091 node = OLDMEMO_DEVICE_LIST_NODE
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1092
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1093 if node is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1094 raise omemo.UnknownNamespace(f"Unknown namespace: {namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1095
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1096 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1097 items, __ = await xep_0060.get_items(client, jid.JID(bare_jid), node)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1098 except exceptions.NotFound:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1099 return {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1100 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1101 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1102 f"Device list download failed for {bare_jid} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1103 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1104 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1105
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1106 if len(items) == 0:
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1107 return {}
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1108
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1109 if len(items) != 1:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1110 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1111 f"Device list download failed for {bare_jid} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1112 f" {namespace}: Unexpected number of items retrieved: {len(items)}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1113 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1114
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1115 element = next(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1116 iter(xml_tools.domish_elt_2_et_elt(cast(domish.Element, items[0]))),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1117 None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1118 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1119
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1120 if element is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1121 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1122 f"Device list download failed for {bare_jid} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1123 f" {namespace}: Item download succeeded but parsing failed:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1124 f" {element}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1125 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1126
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1127 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1128 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1129 return twomemo.etree.parse_device_list(element)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1130 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1131 return oldmemo.etree.parse_device_list(element)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1132 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1133 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1134 f"Device list download failed for {bare_jid} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1135 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1136 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1137
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1138 raise omemo.UnknownNamespace(f"Unknown namespace: {namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1139
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1140 async def _evaluate_custom_trust_level(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1141 self,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1142 device: omemo.DeviceInformation
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1143 ) -> omemo.TrustLevel:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1144 # Get the custom trust level
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1145 try:
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1146 trust_level = TrustLevel(device.trust_level_name)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1147 except ValueError as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1148 raise omemo.UnknownTrustLevel(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1149 f"Unknown trust level name {device.trust_level_name}"
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1150 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1151
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1152 # The first three cases are a straight-forward mapping
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1153 if trust_level is TrustLevel.TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1154 return omemo.TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1155 if trust_level is TrustLevel.UNDECIDED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1156 return omemo.TrustLevel.UNDECIDED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1157 if trust_level is TrustLevel.DISTRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1158 return omemo.TrustLevel.DISTRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1159
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1160 # The blindly trusted case is more complicated, since its evaluation depends
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1161 # on the trust system and phase
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1162 if trust_level is TrustLevel.BLINDLY_TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1163 # Get the name of the active trust system
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1164 trust_system = cast(str, sat.memory.param_get_a(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1165 PARAM_NAME,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1166 PARAM_CATEGORY,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1167 profile_key=profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1168 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1169
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1170 # If the trust model is BTBV, blind trust is always enabled
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1171 if trust_system == "btbv":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1172 return omemo.TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1173
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1174 # If the trust model is ATM, blind trust is disabled in the second phase
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1175 # and counts as undecided
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1176 if trust_system == "atm":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1177 # Find out whether we are in phase one or two
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1178 devices = await self.get_device_information(device.bare_jid)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1179
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1180 phase_one = all(TrustLevel(device.trust_level_name) in {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1181 TrustLevel.UNDECIDED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1182 TrustLevel.BLINDLY_TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1183 } for device in devices)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1184
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1185 if phase_one:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1186 return omemo.TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1187
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1188 return omemo.TrustLevel.UNDECIDED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1189
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1190 raise exceptions.InternalError(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1191 f"Unknown trust system active: {trust_system}"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1192 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1193
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1194 assert_never(trust_level)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1195
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1196 async def _make_trust_decision(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1197 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1198 undecided: FrozenSet[omemo.DeviceInformation],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1199 identifier: Optional[str]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1200 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1201 if identifier is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1202 raise omemo.TrustDecisionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1203 "The identifier must contain the feedback JID."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1204 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1205
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1206 # The feedback JID is transferred via the identifier
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1207 feedback_jid = jid.JID(identifier).userhostJID()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1208
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1209 # Both the ATM and the BTBV trust models work with blind trust before the
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1210 # first manual verification is performed. Thus, we can separate bare JIDs into
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1211 # two pools here, one pool of bare JIDs for which blind trust is active, and
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1212 # one pool of bare JIDs for which manual trust is used instead.
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1213 bare_jids = { device.bare_jid for device in undecided }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1214
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1215 blind_trust_bare_jids: Set[str] = set()
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1216 manual_trust_bare_jids: Set[str] = set()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1217
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1218 # For each bare JID, decide whether blind trust applies
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1219 for bare_jid in bare_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1220 # Get all known devices belonging to the bare JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1221 devices = await self.get_device_information(bare_jid)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1222
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1223 # If the trust levels of all devices correspond to those used by blind
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1224 # trust, blind trust applies. Otherwise, fall back to manual trust.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1225 if all(TrustLevel(device.trust_level_name) in {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1226 TrustLevel.UNDECIDED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1227 TrustLevel.BLINDLY_TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1228 } for device in devices):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1229 blind_trust_bare_jids.add(bare_jid)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1230 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1231 manual_trust_bare_jids.add(bare_jid)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1232
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1233 # With the JIDs sorted into their respective pools, the undecided devices can
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1234 # be categorized too
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1235 blindly_trusted_devices = \
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1236 { dev for dev in undecided if dev.bare_jid in blind_trust_bare_jids }
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1237 manually_trusted_devices = \
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1238 { dev for dev in undecided if dev.bare_jid in manual_trust_bare_jids }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1239
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1240 # Blindly trust devices handled by blind trust
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1241 if len(blindly_trusted_devices) > 0:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1242 for device in blindly_trusted_devices:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1243 await self.set_trust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1244 device.bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1245 device.identity_key,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1246 TrustLevel.BLINDLY_TRUSTED.name
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1247 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1248
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1249 blindly_trusted_devices_stringified = ", ".join([
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1250 f"device {device.device_id} of {device.bare_jid} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1251 f" {device.namespaces}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1252 for device
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1253 in blindly_trusted_devices
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1254 ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1255
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1256 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1257 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1258 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1259 "Not all destination devices are trusted, unknown devices will be"
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1260 " blindly trusted.\nFollowing devices have been automatically"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1261 f" trusted: {blindly_trusted_devices_stringified}."
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1262 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1263 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1264
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1265 # Prompt the user for manual trust decisions on the devices handled by manual
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1266 # trust
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1267 if len(manually_trusted_devices) > 0:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1268 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1269 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1270 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1271 "Not all destination devices are trusted, we can't encrypt"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1272 " message in such a situation. Please indicate if you trust"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1273 " those devices or not in the trust manager before we can"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1274 " send this message."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1275 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1276 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1277 await self.__prompt_manual_trust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1278 frozenset(manually_trusted_devices),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1279 feedback_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1280 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1281
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1282 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1283 async def _send_message(message: omemo.Message, bare_jid: str) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1284 element: Optional[ET.Element] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1285
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1286 if message.namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1287 element = twomemo.etree.serialize_message(message)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1288 if message.namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1289 element = oldmemo.etree.serialize_message(message)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1290
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1291 if element is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1292 raise omemo.UnknownNamespace(f"Unknown namespace: {message.namespace}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1293
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1294 message_data = client.generate_message_xml(MessageData({
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1295 "from": client.jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1296 "to": jid.JID(bare_jid),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1297 "uid": str(uuid.uuid4()),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1298 "message": {},
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1299 "subject": {},
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1300 "type": C.MESS_TYPE_CHAT,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1301 "extra": {},
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1302 "timestamp": time.time()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1303 }))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1304
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1305 message_data["xml"].addChild(xml_tools.et_elt_2_domish_elt(element))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1306
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1307 try:
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1308 await client.a_send(message_data["xml"])
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1309 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1310 raise omemo.MessageSendingFailed() from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1311
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1312 async def __prompt_manual_trust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1313 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1314 undecided: FrozenSet[omemo.DeviceInformation],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1315 feedback_jid: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1316 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1317 """Asks the user to decide on the manual trust level of a set of devices.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1318
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1319 Blocks until the user has made a decision and updates the trust levels of all
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1320 devices using :meth:`set_trust`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1321
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1322 @param undecided: The set of devices to prompt manual trust for.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1323 @param feedback_jid: The bare JID to redirect feedback to. In case of a one to
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1324 one message, the recipient JID. In case of a MUC message, the room JID.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1325 @raise TrustDecisionFailed: if the user cancels the prompt.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1326 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1327
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1328 # This session manager handles encryption with both twomemo and oldmemo, but
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1329 # both are currently registered as different plugins and the `defer_xmlui`
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1330 # below requires a single namespace identifying the encryption plugin. Thus,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1331 # get the namespace of the requested encryption method from the encryption
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1332 # session using the feedback JID.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1333 encryption = client.encryption.getSession(feedback_jid)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1334 if encryption is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1335 raise omemo.TrustDecisionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1336 f"Encryption not requested for {feedback_jid.userhost()}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1337 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1338
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1339 namespace = encryption["plugin"].namespace
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1340
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1341 # Casting this to Any, otherwise all calls on the variable cause type errors
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1342 # pylint: disable=no-member
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1343 trust_ui = cast(Any, xml_tools.XMLUI(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1344 panel_type=C.XMLUI_FORM,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1345 title=D_("OMEMO trust management"),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1346 submit_id=""
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1347 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1348 trust_ui.addText(D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1349 "This is OMEMO trusting system. You'll see below the devices of your "
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1350 "contacts, and a checkbox to trust them or not. A trusted device "
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1351 "can read your messages in plain text, so be sure to only validate "
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1352 "devices that you are sure are belonging to your contact. It's better "
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1353 "to do this when you are next to your contact and their device, so "
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1354 "you can check the \"fingerprint\" (the number next to the device) "
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1355 "yourself. Do *not* validate a device if the fingerprint is wrong!"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1356 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1357
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1358 own_device, __ = await self.get_own_device_information()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1359
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1360 trust_ui.change_container("label")
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1361 trust_ui.addLabel(D_("This device ID"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1362 trust_ui.addText(str(own_device.device_id))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1363 trust_ui.addLabel(D_("This device's fingerprint"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1364 trust_ui.addText(" ".join(self.format_identity_key(own_device.identity_key)))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1365 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1366 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1367
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1368 # At least sort the devices by bare JID such that they aren't listed
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1369 # completely random
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1370 undecided_ordered = sorted(undecided, key=lambda device: device.bare_jid)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1371
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1372 for index, device in enumerate(undecided_ordered):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1373 trust_ui.addLabel(D_("Contact"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1374 trust_ui.addJid(jid.JID(device.bare_jid))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1375 trust_ui.addLabel(D_("Device ID"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1376 trust_ui.addText(str(device.device_id))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1377 trust_ui.addLabel(D_("Fingerprint"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1378 trust_ui.addText(" ".join(self.format_identity_key(device.identity_key)))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1379 trust_ui.addLabel(D_("Trust this device?"))
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1380 trust_ui.addBool(f"trust_{index}", value=C.bool_const(False))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1381 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1382 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1383
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1384 trust_ui_result = await xml_tools.defer_xmlui(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1385 sat,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1386 trust_ui,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1387 action_extra={ "meta_encryption_trust": namespace },
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1388 profile=profile
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1389 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1390
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1391 if C.bool(trust_ui_result.get("cancelled", "false")):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1392 raise omemo.TrustDecisionFailed("Trust UI cancelled.")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1393
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1394 data_form_result = cast(Dict[str, str], xml_tools.xmlui_result_2_data_form_result(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1395 trust_ui_result
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1396 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1397
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1398 trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1399
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1400 for key, value in data_form_result.items():
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1401 if not key.startswith("trust_"):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1402 continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1403
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1404 device = undecided_ordered[int(key[len("trust_"):])]
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1405 target_trust = C.bool(value)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1406 trust_level = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1407 TrustLevel.TRUSTED if target_trust else TrustLevel.DISTRUSTED
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1408
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1409 await self.set_trust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1410 device.bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1411 device.identity_key,
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1412 trust_level.name
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1413 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1414
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1415 trust_updates.add(TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1416 target_jid=jid.JID(device.bare_jid).userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1417 target_key=device.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1418 target_trust=target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1419 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1420
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1421 # Check whether ATM is enabled and handle everything in case it is
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1422 trust_system = cast(str, sat.memory.param_get_a(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1423 PARAM_NAME,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1424 PARAM_CATEGORY,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1425 profile_key=profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1426 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1427
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1428 if trust_system == "atm":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1429 await manage_trust_message_cache(client, self, frozenset(trust_updates))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1430 await send_trust_messages(client, self, frozenset(trust_updates))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1431
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1432 return SessionManagerImpl
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1433
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1434
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1435 async def prepare_for_profile(
4072
040095a5dc7f refactoring: rename `SAT` class to `LiberviaBackend`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
1436 sat: LiberviaBackend,
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1437 profile: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1438 initial_own_label: Optional[str],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1439 signed_pre_key_rotation_period: int = 7 * 24 * 60 * 60,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1440 pre_key_refill_threshold: int = 99,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1441 max_num_per_session_skipped_keys: int = 1000,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1442 max_num_per_message_skipped_keys: Optional[int] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1443 ) -> omemo.SessionManager:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1444 """Prepare the OMEMO library (storage, backends, core) for a specific profile.
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1445
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1446 @param sat: The SAT instance.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1447 @param profile: The profile.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1448 @param initial_own_label: The initial (optional) label to assign to this device if
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1449 supported by any of the backends.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1450 @param signed_pre_key_rotation_period: The rotation period for the signed pre key, in
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1451 seconds. The rotation period is recommended to be between one week (the default)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1452 and one month.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1453 @param pre_key_refill_threshold: The number of pre keys that triggers a refill to 100.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1454 Defaults to 99, which means that each pre key gets replaced with a new one right
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1455 away. The threshold can not be configured to lower than 25.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1456 @param max_num_per_session_skipped_keys: The maximum number of skipped message keys to
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1457 keep around per session. Once the maximum is reached, old message keys are deleted
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1458 to make space for newer ones. Accessible via
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1459 :attr:`max_num_per_session_skipped_keys`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1460 @param max_num_per_message_skipped_keys: The maximum number of skipped message keys to
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1461 accept in a single message. When set to ``None`` (the default), this parameter
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1462 defaults to the per-session maximum (i.e. the value of the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1463 ``max_num_per_session_skipped_keys`` parameter). This parameter may only be 0 if
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1464 the per-session maximum is 0, otherwise it must be a number between 1 and the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1465 per-session maximum. Accessible via :attr:`max_num_per_message_skipped_keys`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1466 @return: A session manager with ``urn:xmpp:omemo:2`` and
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1467 ``eu.siacs.conversations.axolotl`` capabilities, specifically for the given
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1468 profile.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1469 @raise BundleUploadFailed: if a bundle upload failed. Forwarded from
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1470 :meth:`~omemo.session_manager.SessionManager.create`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1471 @raise BundleDownloadFailed: if a bundle download failed. Forwarded from
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1472 :meth:`~omemo.session_manager.SessionManager.create`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1473 @raise BundleDeletionFailed: if a bundle deletion failed. Forwarded from
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1474 :meth:`~omemo.session_manager.SessionManager.create`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1475 @raise DeviceListUploadFailed: if a device list upload failed. Forwarded from
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1476 :meth:`~omemo.session_manager.SessionManager.create`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1477 @raise DeviceListDownloadFailed: if a device list download failed. Forwarded from
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1478 :meth:`~omemo.session_manager.SessionManager.create`.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1479 """
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1480
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1481 client = sat.get_client(profile)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1482 xep_0060 = cast(XEP_0060, sat.plugins["XEP-0060"])
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1483
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1484 storage = StorageImpl(profile)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1485
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1486 # TODO: Untested
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1487 await oldmemo.migrations.migrate(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1488 LegacyStorageImpl(profile, client.jid.userhost()),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1489 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1490 # TODO: Do we want BLINDLY_TRUSTED or TRUSTED here?
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1491 TrustLevel.BLINDLY_TRUSTED.name,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1492 TrustLevel.UNDECIDED.name,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1493 TrustLevel.DISTRUSTED.name,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1494 lambda bare_jid, device_id: download_oldmemo_bundle(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1495 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1496 xep_0060,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1497 bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1498 device_id
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1499 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1500 )
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1501
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1502 session_manager = await make_session_manager(sat, profile).create(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1503 [
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1504 twomemo.Twomemo(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1505 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1506 max_num_per_session_skipped_keys,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1507 max_num_per_message_skipped_keys
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1508 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1509 oldmemo.Oldmemo(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1510 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1511 max_num_per_session_skipped_keys,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1512 max_num_per_message_skipped_keys
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1513 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1514 ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1515 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1516 client.jid.userhost(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1517 initial_own_label,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1518 TrustLevel.UNDECIDED.value,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1519 signed_pre_key_rotation_period,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1520 pre_key_refill_threshold,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1521 omemo.AsyncFramework.TWISTED
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1522 )
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1523
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1524 # This shouldn't hurt here since we're not running on overly constrainted devices.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1525 # TODO: Consider ensuring data consistency regularly/in response to certain events
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1526 await session_manager.ensure_data_consistency()
3240
d85b68e44297 plugin XEP-0384: fixed /omemo_reset + device ID type:
Goffi <goffi@goffi.org>
parents: 3237
diff changeset
1527
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1528 # TODO: Correct entering/leaving of the history synchronization mode isn't terribly
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1529 # important for now, since it only prevents an extremely unlikely race condition of
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1530 # multiple devices choosing the same pre key for new sessions while the device was
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1531 # offline. I don't believe other clients seriously defend against that race condition
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1532 # either. In the long run, it might still be cool to have triggers for when history
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1533 # sync starts and ends (MAM, MUC catch-up, etc.) and to react to those triggers.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1534 await session_manager.after_history_sync()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1535
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1536 return session_manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1537
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1538
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1539 DEFAULT_TRUST_MODEL_PARAM = f"""
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1540 <params>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1541 <individual>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1542 <category name="{PARAM_CATEGORY}" label={quoteattr(D_('Security'))}>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1543 <param name="{PARAM_NAME}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1544 label={quoteattr(D_('OMEMO default trust policy'))}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1545 type="list" security="3">
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1546 <option value="atm"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1547 label={quoteattr(D_('Automatic Trust Management (more secure)'))} />
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1548 <option value="btbv"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1549 label={quoteattr(D_('Blind Trust Before Verification (more user friendly)'))}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1550 selected="true" />
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1551 </param>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1552 </category>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1553 </individual>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1554 </params>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1555 """
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1556
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1557
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1558 class OMEMO:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1559 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1560 Plugin equipping Libervia with OMEMO capabilities under the (modern)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1561 ``urn:xmpp:omemo:2`` namespace and the (legacy) ``eu.siacs.conversations.axolotl``
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1562 namespace. Both versions of the protocol are handled by this plugin and compatibility
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1563 between the two is maintained. MUC messages are supported next to one to one messages.
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1564 For trust management, the two trust models "ATM" and "BTBV" are supported.
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1565 """
3918
e63f96e60f7b plugin XEP-0384: expose OLDMEMO and TWOMEMO namespaces:
Goffi <goffi@goffi.org>
parents: 3914
diff changeset
1566 NS_TWOMEMO = twomemo.twomemo.NAMESPACE
e63f96e60f7b plugin XEP-0384: expose OLDMEMO and TWOMEMO namespaces:
Goffi <goffi@goffi.org>
parents: 3914
diff changeset
1567 NS_OLDMEMO = oldmemo.oldmemo.NAMESPACE
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1568
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1569 # For MUC/MIX message stanzas, the <to/> affix is a MUST
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1570 SCE_PROFILE_GROUPCHAT = SCEProfile(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1571 rpad_policy=SCEAffixPolicy.REQUIRED,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1572 time_policy=SCEAffixPolicy.OPTIONAL,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1573 to_policy=SCEAffixPolicy.REQUIRED,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1574 from_policy=SCEAffixPolicy.OPTIONAL,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1575 custom_policies={}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1576 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1577
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1578 # For everything but MUC/MIX message stanzas, the <to/> affix is a MAY
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1579 SCE_PROFILE = SCEProfile(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1580 rpad_policy=SCEAffixPolicy.REQUIRED,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1581 time_policy=SCEAffixPolicy.OPTIONAL,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1582 to_policy=SCEAffixPolicy.OPTIONAL,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1583 from_policy=SCEAffixPolicy.OPTIONAL,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1584 custom_policies={}
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1585 )
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1586
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1587 def __init__(self, host: LiberviaBackend) -> None:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1588 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1589 @param sat: The SAT instance.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1590 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1591
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1592 self.host = host
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1593
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1594 # Add configuration option to choose between manual trust and BTBV as the trust
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1595 # model
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1596 host.memory.update_params(DEFAULT_TRUST_MODEL_PARAM)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1597
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1598 # Plugins
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1599 self._j = cast(XEP_0060, host.plugins["XEP-0060"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1600 self.__xep_0045 = cast(Optional[XEP_0045], host.plugins.get("XEP-0045"))
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1601 self.__xep_0334 = cast(XEP_0334, host.plugins["XEP-0334"])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1602 self.__xep_0359 = cast(Optional[XEP_0359], host.plugins.get("XEP-0359"))
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1603 self.__xep_0420 = cast(XEP_0420, host.plugins["XEP-0420"])
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1604
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1605 # In contrast to one to one messages, MUC messages are reflected to the sender.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1606 # Thus, the sender does not add messages to their local message log when sending
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1607 # them, but when the reflection is received. This approach does not pair well with
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1608 # OMEMO, since for security reasons it is forbidden to encrypt messages for the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1609 # own device. Thus, when the reflection of an OMEMO message is received, it can't
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1610 # be decrypted and added to the local message log as usual. To counteract this,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1611 # the plaintext of encrypted messages sent to MUCs are cached in this field, such
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1612 # that when the reflection is received, the plaintext can be looked up from the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1613 # cache and added to the local message log.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1614 # TODO: The old plugin expired this cache after some time. I'm not sure that's
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1615 # really necessary.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1616 self.__muc_plaintext_cache: Dict[MUCPlaintextCacheKey, bytes] = {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1617
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1618 # Mapping from profile name to corresponding session manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1619 self.__session_managers: Dict[str, omemo.SessionManager] = {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1620
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1621 # Calls waiting for a specific session manager to be built
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1622 self.__session_manager_waiters: Dict[str, List[defer.Deferred]] = {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1623
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1624 # These triggers are used by oldmemo, which doesn't do SCE and only applies to
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1625 # messages. Temporarily, until a more fitting trigger for SCE-based encryption is
4051
c23cad65ae99 core: renamed `messageReceived` trigger to `message_received`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
1626 # added, the message_received trigger is also used for twomemo.
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1627 host.trigger.add(
4051
c23cad65ae99 core: renamed `messageReceived` trigger to `message_received`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
1628 "message_received",
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
1629 self._message_received_trigger,
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1630 priority=100050
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
1631 )
4164
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
1632
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1633 host.trigger.add("send", self.__send_trigger, priority=0)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1634 # TODO: Add new triggers here for freshly received and about-to-be-sent stanzas,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1635 # including IQs.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1636
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1637 # Give twomemo a (slightly) higher priority than oldmemo
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1638 host.register_encryption_plugin(self, "OMEMO", twomemo.twomemo.NAMESPACE, 101)
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1639 host.register_encryption_plugin(
4150
26534d959d2d Plugin XEP-0384: rename the pun names "OLDMEMO" and "TWOMEMO" to "OMEMO_legacy" and "OMEMO" for clarity.
Goffi <goffi@goffi.org>
parents: 4073
diff changeset
1640 self, "OMEMO_legacy", oldmemo.oldmemo.NAMESPACE, 100
26534d959d2d Plugin XEP-0384: rename the pun names "OLDMEMO" and "TWOMEMO" to "OMEMO_legacy" and "OMEMO" for clarity.
Goffi <goffi@goffi.org>
parents: 4073
diff changeset
1641 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1642
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1643 xep_0163 = cast(XEP_0163, host.plugins["XEP-0163"])
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1644 xep_0163.add_pep_event(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1645 "TWOMEMO_DEVICES",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1646 TWOMEMO_DEVICE_LIST_NODE,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1647 lambda items_event, profile: defer.ensureDeferred(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1648 self.__on_device_list_update(items_event, profile)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1649 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1650 )
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1651 xep_0163.add_pep_event(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1652 "OLDMEMO_DEVICES",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1653 OLDMEMO_DEVICE_LIST_NODE,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1654 lambda items_event, profile: defer.ensureDeferred(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1655 self.__on_device_list_update(items_event, profile)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1656 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1657 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1658
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1659 try:
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1660 self.__text_commands = cast(TextCommands, host.plugins[C.TEXT_CMDS])
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1661 except KeyError:
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1662 log.info(_("Text commands not available"))
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1663 else:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1664 self.__text_commands.register_text_commands(self)
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1665
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1666 def profile_connected( # pylint: disable=invalid-name
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1667 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1668 client: SatXMPPClient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1669 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1670 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1671 @param client: The client.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1672 """
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1673
4004
cd6f70015738 plugin XEP-0384: run `profileConnected` workflow in background:
Goffi <goffi@goffi.org>
parents: 3976
diff changeset
1674 defer.ensureDeferred(self.get_session_manager(
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1675 cast(str, client.profile)
4004
cd6f70015738 plugin XEP-0384: run `profileConnected` workflow in background:
Goffi <goffi@goffi.org>
parents: 3976
diff changeset
1676 ))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1677
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1678 async def cmd_omemo_reset(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1679 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1680 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1681 mess_data: MessageData
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1682 ) -> Literal[False]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1683 """Reset all sessions of devices that belong to the recipient of ``mess_data``.
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1684
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1685 This must only be callable manually by the user. Use this when a session is
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1686 apparently broken, i.e. sending and receiving encrypted messages doesn't work and
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1687 something being wrong has been confirmed manually with the recipient.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1688
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1689 @param client: The client.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1690 @param mess_data: The message data, whose ``to`` attribute will be the bare JID to
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1691 reset all sessions with.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1692 @return: The constant value ``False``, indicating to the text commands plugin that
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1693 the message is not supposed to be sent.
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1694 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1695
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1696 twomemo_requested = \
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1697 client.encryption.is_encryption_requested(mess_data, twomemo.twomemo.NAMESPACE)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1698 oldmemo_requested = \
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1699 client.encryption.is_encryption_requested(mess_data, oldmemo.oldmemo.NAMESPACE)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1700
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1701 if not (twomemo_requested or oldmemo_requested):
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1702 self.__text_commands.feed_back(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1703 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1704 _("You need to have OMEMO encryption activated to reset the session"),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1705 mess_data
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1706 )
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1707 return False
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1708
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1709 bare_jid = mess_data["to"].userhost()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1710
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1711 session_manager = await self.get_session_manager(client.profile)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1712 devices = await session_manager.get_device_information(bare_jid)
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1713
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1714 for device in devices:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1715 log.debug(f"Replacing sessions with device {device}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1716 await session_manager.replace_sessions(device)
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1717
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1718 self.__text_commands.feed_back(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1719 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1720 _("OMEMO session has been reset"),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1721 mess_data
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1722 )
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1723
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1724 return False
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1725
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1726 async def get_trust_ui( # pylint: disable=invalid-name
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1727 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1728 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1729 entity: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1730 ) -> xml_tools.XMLUI:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1731 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1732 @param client: The client.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1733 @param entity: The entity whose device trust levels to manage.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1734 @return: An XMLUI instance which opens a form to manage the trust level of all
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1735 devices belonging to the entity.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1736 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1737
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1738 if entity.resource:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1739 raise ValueError("A bare JID is expected.")
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1740
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1741 bare_jids: Set[str]
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1742 if self.__xep_0045 is not None and self.__xep_0045.is_joined_room(client, entity):
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1743 bare_jids = self.__get_joined_muc_users(client, self.__xep_0045, entity)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1744 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1745 bare_jids = { entity.userhost() }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1746
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1747 session_manager = await self.get_session_manager(client.profile)
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1748
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1749 # At least sort the devices by bare JID such that they aren't listed completely
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1750 # random
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1751 devices = sorted(cast(Set[omemo.DeviceInformation], set()).union(*[
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1752 await session_manager.get_device_information(bare_jid)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1753 for bare_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1754 in bare_jids
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1755 ]), key=lambda device: device.bare_jid)
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1756
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1757 async def callback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1758 data: Any,
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1759 profile: str
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1760 ) -> Dict[Never, Never]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1761 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1762 @param data: The XMLUI result produces by the trust UI form.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1763 @param profile: The profile.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1764 @return: An empty dictionary. The type of the return value was chosen
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1765 conservatively since the exact options are neither known not needed here.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1766 """
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1767
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1768 if C.bool(data.get("cancelled", "false")):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1769 return {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1770
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1771 data_form_result = cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1772 Dict[str, str],
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1773 xml_tools.xmlui_result_2_data_form_result(data)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1774 )
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1775
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1776 trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1777
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1778 for key, value in data_form_result.items():
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1779 if not key.startswith("trust_"):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1780 continue
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1781
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1782 device = devices[int(key[len("trust_"):])]
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1783 trust_level_name = value
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1784
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1785 if device.trust_level_name != trust_level_name:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1786 await session_manager.set_trust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1787 device.bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1788 device.identity_key,
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1789 trust_level_name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1790 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1791
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1792 target_trust: Optional[bool] = None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1793
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1794 if TrustLevel(trust_level_name) is TrustLevel.TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1795 target_trust = True
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1796 if TrustLevel(trust_level_name) is TrustLevel.DISTRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1797 target_trust = False
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1798
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1799 if target_trust is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1800 trust_updates.add(TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1801 target_jid=jid.JID(device.bare_jid).userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1802 target_key=device.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1803 target_trust=target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1804 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1805
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1806 # Check whether ATM is enabled and handle everything in case it is
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1807 trust_system = cast(str, self.host.memory.param_get_a(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1808 PARAM_NAME,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1809 PARAM_CATEGORY,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1810 profile_key=profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1811 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1812
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1813 if trust_system == "atm":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1814 if len(trust_updates) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1815 await manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1816 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1817 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1818 frozenset(trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1819 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1820
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1821 await send_trust_messages(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1822 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1823 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1824 frozenset(trust_updates)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1825 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1826
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1827 return {}
2744
e6716d90c2fe plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents: 2738
diff changeset
1828
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1829 submit_id = self.host.register_callback(callback, with_data=True, one_shot=True)
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1830
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1831 result = xml_tools.XMLUI(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1832 panel_type=C.XMLUI_FORM,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1833 title=D_("OMEMO trust management"),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1834 submit_id=submit_id
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1835 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1836 # Casting this to Any, otherwise all calls on the variable cause type errors
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1837 # pylint: disable=no-member
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1838 trust_ui = cast(Any, result)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1839 trust_ui.addText(D_(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1840 "This is OMEMO trusting system. You'll see below the devices of your"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1841 " contacts, and a list selection to trust them or not. A trusted device"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1842 " can read your messages in plain text, so be sure to only validate"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1843 " devices that you are sure are belonging to your contact. It's better"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1844 " to do this when you are next to your contact and their device, so"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1845 " you can check the \"fingerprint\" (the number next to the device)"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1846 " yourself. Do *not* validate a device if the fingerprint is wrong!"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1847 " Note that manually validating a fingerprint disables any form of automatic"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1848 " trust."
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1849 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1850
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1851 own_device, __ = await session_manager.get_own_device_information()
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1852
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1853 trust_ui.change_container("label")
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1854 trust_ui.addLabel(D_("This device ID"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1855 trust_ui.addText(str(own_device.device_id))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1856 trust_ui.addLabel(D_("This device's fingerprint"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1857 trust_ui.addText(" ".join(session_manager.format_identity_key(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1858 own_device.identity_key
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1859 )))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1860 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1861 trust_ui.addEmpty()
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1862
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1863 for index, device in enumerate(devices):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1864 trust_ui.addLabel(D_("Contact"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1865 trust_ui.addJid(jid.JID(device.bare_jid))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1866 trust_ui.addLabel(D_("Device ID"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1867 trust_ui.addText(str(device.device_id))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1868 trust_ui.addLabel(D_("Fingerprint"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1869 trust_ui.addText(" ".join(session_manager.format_identity_key(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1870 device.identity_key
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1871 )))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1872 trust_ui.addLabel(D_("Trust this device?"))
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1873
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1874 current_trust_level = TrustLevel(device.trust_level_name)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1875 avaiable_trust_levels = \
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1876 { TrustLevel.DISTRUSTED, TrustLevel.TRUSTED, current_trust_level }
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1877
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1878 trust_ui.addList(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1879 f"trust_{index}",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1880 options=[ trust_level.name for trust_level in avaiable_trust_levels ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1881 selected=current_trust_level.name,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1882 styles=[ "inline" ]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1883 )
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1884
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1885 twomemo_active = dict(device.active).get(twomemo.twomemo.NAMESPACE)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1886 if twomemo_active is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1887 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1888 trust_ui.addLabel(D_("(not available for Twomemo)"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1889 if twomemo_active is False:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1890 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1891 trust_ui.addLabel(D_("(inactive for Twomemo)"))
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
1892
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1893 oldmemo_active = dict(device.active).get(oldmemo.oldmemo.NAMESPACE)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1894 if oldmemo_active is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1895 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1896 trust_ui.addLabel(D_("(not available for Oldmemo)"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1897 if oldmemo_active is False:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1898 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1899 trust_ui.addLabel(D_("(inactive for Oldmemo)"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1900
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1901 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1902 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1903
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1904 return result
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1905
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1906 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1907 def __get_joined_muc_users(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1908 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1909 xep_0045: XEP_0045,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1910 room_jid: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1911 ) -> Set[str]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1912 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1913 @param client: The client.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1914 @param xep_0045: A MUC plugin instance.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1915 @param room_jid: The room JID.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1916 @return: A set containing the bare JIDs of the MUC participants.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1917 @raise InternalError: if the MUC is not joined or the entity information of a
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1918 participant isn't available.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1919 """
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1920
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1921 bare_jids: Set[str] = set()
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1922
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1923 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1924 room = cast(muc.Room, xep_0045.get_room(client, room_jid))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1925 except exceptions.NotFound as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1926 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1927 "Participant list of unjoined MUC requested."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1928 ) from e
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1929
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1930 for user in cast(Dict[str, muc.User], room.roster).values():
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1931 entity = cast(Optional[SatXMPPEntity], user.entity)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1932 if entity is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1933 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1934 f"Participant list of MUC requested, but the entity information of"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1935 f" the participant {user} is not available."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1936 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1937
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1938 bare_jids.add(entity.jid.userhost())
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1939
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1940 return bare_jids
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1941
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1942 async def get_session_manager(self, profile: str) -> omemo.SessionManager:
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1943 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1944 @param profile: The profile to prepare for.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1945 @return: A session manager instance for this profile. Creates a new instance if
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1946 none was prepared before.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1947 """
2662
0bef44f8e8ca plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents: 2654
diff changeset
1948
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
1949 try:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1950 # Try to return the session manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1951 return self.__session_managers[profile]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1952 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1953 # If a session manager for that profile doesn't exist yet, check whether it is
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1954 # currently being built. A session manager being built is signified by the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1955 # profile key existing on __session_manager_waiters.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1956 if profile in self.__session_manager_waiters:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1957 # If the session manager is being built, add ourselves to the waiting
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1958 # queue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1959 deferred = defer.Deferred()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1960 self.__session_manager_waiters[profile].append(deferred)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1961 return cast(omemo.SessionManager, await deferred)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1962
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1963 # If the session manager is not being built, do so here.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1964 self.__session_manager_waiters[profile] = []
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1965
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1966 # Build and store the session manager
3929
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1967 try:
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1968 session_manager = await prepare_for_profile(
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
1969 self.host,
3929
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1970 profile,
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1971 initial_own_label="Libervia"
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1972 )
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1973 except Exception as e:
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1974 # In case of an error during initalization, notify the waiters accordingly
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1975 # and delete them
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1976 for waiter in self.__session_manager_waiters[profile]:
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1977 waiter.errback(e)
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1978 del self.__session_manager_waiters[profile]
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1979
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1980 # Re-raise the exception
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1981 raise
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1982
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1983 self.__session_managers[profile] = session_manager
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1984
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1985 # Notify the waiters and delete them
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1986 for waiter in self.__session_manager_waiters[profile]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1987 waiter.callback(session_manager)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1988 del self.__session_manager_waiters[profile]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1989
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1990 return session_manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1991
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1992 async def __message_received_trigger_atm(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1993 self,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1994 client: SatXMPPClient,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1995 message_elt: domish.Element,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1996 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1997 sender_device_information: omemo.DeviceInformation,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1998 timestamp: datetime
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1999 ) -> None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2000 """Check a newly decrypted message stanza for ATM content and perform ATM in case.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2001
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2002 @param client: The client which received the message.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2003 @param message_elt: The message element. Can be modified.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2004 @param session_manager: The session manager.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2005 @param sender_device_information: Information about the device that sent/encrypted
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2006 the message.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2007 @param timestamp: Timestamp extracted from the SCE time affix.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2008 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2009
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2010 trust_message_cache = persistent.LazyPersistentBinaryDict(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2011 "XEP-0384/TM",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2012 client.profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2013 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2014
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2015 new_cache_entries: Set[TrustMessageCacheEntry] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2016
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2017 for trust_message_elt in message_elt.elements(NS_TM, "trust-message"):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2018 assert isinstance(trust_message_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2019
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2020 try:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2021 TRUST_MESSAGE_SCHEMA.validate(trust_message_elt.toXml())
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2022 except xmlschema.XMLSchemaValidationError as e:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2023 raise exceptions.ParsingError(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2024 "<trust-message/> element doesn't pass schema validation."
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2025 ) from e
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2026
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2027 if trust_message_elt["usage"] != NS_ATM:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2028 # Skip non-ATM trust message
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2029 continue
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2030
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2031 if trust_message_elt["encryption"] != OMEMO.NS_TWOMEMO:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2032 # Skip non-twomemo trust message
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2033 continue
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2034
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2035 for key_owner_elt in trust_message_elt.elements(NS_TM, "key-owner"):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2036 assert isinstance(key_owner_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2037
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2038 key_owner_jid = jid.JID(key_owner_elt["jid"]).userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2039
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2040 for trust_elt in key_owner_elt.elements(NS_TM, "trust"):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2041 assert isinstance(trust_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2042
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2043 new_cache_entries.add(TrustMessageCacheEntry(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2044 sender_jid=jid.JID(sender_device_information.bare_jid),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2045 sender_key=sender_device_information.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2046 timestamp=timestamp,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2047 trust_update=TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2048 target_jid=key_owner_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2049 target_key=base64.b64decode(str(trust_elt)),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2050 target_trust=True
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2051 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2052 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2053
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2054 for distrust_elt in key_owner_elt.elements(NS_TM, "distrust"):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2055 assert isinstance(distrust_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2056
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2057 new_cache_entries.add(TrustMessageCacheEntry(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2058 sender_jid=jid.JID(sender_device_information.bare_jid),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2059 sender_key=sender_device_information.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2060 timestamp=timestamp,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2061 trust_update=TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2062 target_jid=key_owner_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2063 target_key=base64.b64decode(str(distrust_elt)),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2064 target_trust=False
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2065 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2066 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2067
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2068 # Load existing cache entries
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
2069 existing_cache_entries = {
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
2070 TrustMessageCacheEntry.from_dict(d)
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
2071 for d in await trust_message_cache.get("cache", [])
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
2072 }
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2073
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2074 # Discard cache entries by timestamp comparison
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2075 existing_by_target = {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2076 (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2077 cache_entry.trust_update.target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2078 cache_entry.trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2079 ): cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2080 for cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2081 in existing_cache_entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2082 }
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2083
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2084 # Iterate over a copy here, such that new_cache_entries can be modified
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2085 for new_cache_entry in set(new_cache_entries):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2086 existing_cache_entry = existing_by_target.get(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2087 (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2088 new_cache_entry.trust_update.target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2089 new_cache_entry.trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2090 ),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2091 None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2092 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2093
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2094 if existing_cache_entry is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2095 if existing_cache_entry.timestamp > new_cache_entry.timestamp:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2096 # If the existing cache entry is newer than the new cache entry,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2097 # discard the new one in favor of the existing one
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2098 new_cache_entries.remove(new_cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2099 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2100 # Otherwise, discard the existing cache entry. This includes the case
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2101 # when both cache entries have matching timestamps.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2102 existing_cache_entries.remove(existing_cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2103
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2104 # If the sending device is trusted, apply the new cache entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2105 applied_trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2106
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2107 if TrustLevel(sender_device_information.trust_level_name) is TrustLevel.TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2108 # Iterate over a copy such that new_cache_entries can be modified
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2109 for cache_entry in set(new_cache_entries):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2110 trust_update = cache_entry.trust_update
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2111
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2112 trust_level = (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2113 TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2114 if trust_update.target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2115 else TrustLevel.DISTRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2116 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2117
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2118 await session_manager.set_trust(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2119 trust_update.target_jid.userhost(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2120 trust_update.target_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2121 trust_level.name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2122 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2123
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2124 applied_trust_updates.add(trust_update)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2125
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2126 new_cache_entries.remove(cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2127
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2128 # Store the remaining existing and new cache entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2129 await trust_message_cache.force(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2130 "cache",
4216
1a7a3e4b52a4 core (memory/migration):
Goffi <goffi@goffi.org>
parents: 4164
diff changeset
2131 [tm.to_dict() for tm in existing_cache_entries | new_cache_entries]
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2132 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2133
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2134 # If the trust of at least one device was modified, run the ATM cache update logic
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2135 if len(applied_trust_updates) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2136 await manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2137 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2138 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2139 frozenset(applied_trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2140 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2141
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2142 async def _message_received_trigger(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2143 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2144 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2145 message_elt: domish.Element,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2146 post_treat: defer.Deferred
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2147 ) -> bool:
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2148 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2149 @param client: The client which received the message.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2150 @param message_elt: The message element. Can be modified.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2151 @param post_treat: A deferred which evaluates to a :class:`MessageData` once the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2152 message has fully progressed through the message receiving flow. Can be used
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2153 to apply treatments to the fully processed message, like marking it as
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2154 encrypted.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2155 @return: Whether to continue the message received flow.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2156 """
4007
1d5a81e3c9e8 plugin XEP-0384: skip MessageReceived trigger when in a component:
Goffi <goffi@goffi.org>
parents: 4004
diff changeset
2157 if client.is_component:
1d5a81e3c9e8 plugin XEP-0384: skip MessageReceived trigger when in a component:
Goffi <goffi@goffi.org>
parents: 4004
diff changeset
2158 return True
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2159 muc_plaintext_cache_key: Optional[MUCPlaintextCacheKey] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2160
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2161 sender_jid = jid.JID(message_elt["from"])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2162 feedback_jid: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2163
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2164 message_type = message_elt.getAttribute("type", C.MESS_TYPE_NORMAL)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2165 is_muc_message = message_type == C.MESS_TYPE_GROUPCHAT
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2166 if is_muc_message:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2167 if self.__xep_0045 is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2168 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2169 "Ignoring MUC message since plugin XEP-0045 is not available."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2170 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2171 # Can't handle a MUC message without XEP-0045, let the flow continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2172 # normally
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2173 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2174
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2175 room_jid = feedback_jid = sender_jid.userhostJID()
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2176
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2177 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2178 room = cast(muc.Room, self.__xep_0045.get_room(client, room_jid))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2179 except exceptions.NotFound:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2180 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2181 f"Ignoring MUC message from a room that has not been joined:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2182 f" {room_jid}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2183 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2184 # Whatever, let the flow continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2185 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2186
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2187 sender_user = cast(Optional[muc.User], room.getUser(sender_jid.resource))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2188 if sender_user is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2189 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2190 f"Ignoring MUC message from room {room_jid} since the sender's user"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2191 f" wasn't found {sender_jid.resource}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2192 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2193 # Whatever, let the flow continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2194 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2195
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2196 sender_user_jid = cast(Optional[jid.JID], sender_user.entity)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2197 if sender_user_jid is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2198 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2199 f"Ignoring MUC message from room {room_jid} since the sender's bare"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2200 f" JID couldn't be found from its user information: {sender_user}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2201 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2202 # Whatever, let the flow continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2203 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2204
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2205 sender_jid = sender_user_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2206
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2207 message_uid: Optional[str] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2208 if self.__xep_0359 is not None:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2209 message_uid = self.__xep_0359.get_origin_id(message_elt)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2210 if message_uid is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2211 message_uid = message_elt.getAttribute("id")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2212 if message_uid is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2213 muc_plaintext_cache_key = MUCPlaintextCacheKey(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2214 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2215 room_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2216 message_uid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2217 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2218 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2219 # I'm not sure why this check is required, this code is copied from the old
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2220 # plugin.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2221 if sender_jid.userhostJID() == client.jid.userhostJID():
3944
748094d5a74d plugin XEP-0374, XEP-0384: handle cases where "to" is not set in <message> for `feedback_jid`
Goffi <goffi@goffi.org>
parents: 3943
diff changeset
2222 try:
748094d5a74d plugin XEP-0374, XEP-0384: handle cases where "to" is not set in <message> for `feedback_jid`
Goffi <goffi@goffi.org>
parents: 3943
diff changeset
2223 feedback_jid = jid.JID(message_elt["to"])
748094d5a74d plugin XEP-0374, XEP-0384: handle cases where "to" is not set in <message> for `feedback_jid`
Goffi <goffi@goffi.org>
parents: 3943
diff changeset
2224 except KeyError:
748094d5a74d plugin XEP-0374, XEP-0384: handle cases where "to" is not set in <message> for `feedback_jid`
Goffi <goffi@goffi.org>
parents: 3943
diff changeset
2225 feedback_jid = client.server_jid
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2226 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2227 feedback_jid = sender_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2228
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2229 sender_bare_jid = sender_jid.userhost()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2230
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2231 message: Optional[omemo.Message] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2232 encrypted_elt: Optional[domish.Element] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2233
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2234 twomemo_encrypted_elt = cast(Optional[domish.Element], next(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2235 message_elt.elements(twomemo.twomemo.NAMESPACE, "encrypted"),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2236 None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2237 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2238
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2239 oldmemo_encrypted_elt = cast(Optional[domish.Element], next(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2240 message_elt.elements(oldmemo.oldmemo.NAMESPACE, "encrypted"),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2241 None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2242 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2243
3943
8dc6a4cfda4b plugin XEP-0384: continue workflow and log error in case of issue in self.__prepare_for_profile:
Goffi <goffi@goffi.org>
parents: 3933
diff changeset
2244 try:
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2245 session_manager = await self.get_session_manager(cast(str, client.profile))
3943
8dc6a4cfda4b plugin XEP-0384: continue workflow and log error in case of issue in self.__prepare_for_profile:
Goffi <goffi@goffi.org>
parents: 3933
diff changeset
2246 except Exception as e:
8dc6a4cfda4b plugin XEP-0384: continue workflow and log error in case of issue in self.__prepare_for_profile:
Goffi <goffi@goffi.org>
parents: 3933
diff changeset
2247 log.error(f"error while preparing profile for {client.profile}: {e}")
8dc6a4cfda4b plugin XEP-0384: continue workflow and log error in case of issue in self.__prepare_for_profile:
Goffi <goffi@goffi.org>
parents: 3933
diff changeset
2248 # we don't want to block the workflow
8dc6a4cfda4b plugin XEP-0384: continue workflow and log error in case of issue in self.__prepare_for_profile:
Goffi <goffi@goffi.org>
parents: 3933
diff changeset
2249 return True
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2250
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2251 if twomemo_encrypted_elt is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2252 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2253 message = twomemo.etree.parse_message(
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
2254 xml_tools.domish_elt_2_et_elt(twomemo_encrypted_elt),
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2255 sender_bare_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2256 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2257 except (ValueError, XMLSchemaValidationError):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2258 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2259 f"Ingoring malformed encrypted message for namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2260 f" {twomemo.twomemo.NAMESPACE}: {twomemo_encrypted_elt.toXml()}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2261 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2262 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2263 encrypted_elt = twomemo_encrypted_elt
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2264
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2265 if oldmemo_encrypted_elt is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2266 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2267 message = await oldmemo.etree.parse_message(
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
2268 xml_tools.domish_elt_2_et_elt(oldmemo_encrypted_elt),
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2269 sender_bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2270 client.jid.userhost(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2271 session_manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2272 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2273 except (ValueError, XMLSchemaValidationError):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2274 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2275 f"Ingoring malformed encrypted message for namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2276 f" {oldmemo.oldmemo.NAMESPACE}: {oldmemo_encrypted_elt.toXml()}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2277 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2278 except omemo.SenderNotFound:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2279 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2280 f"Ingoring encrypted message for namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2281 f" {oldmemo.oldmemo.NAMESPACE} by unknown sender:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2282 f" {oldmemo_encrypted_elt.toXml()}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2283 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2284 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2285 encrypted_elt = oldmemo_encrypted_elt
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2286
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2287 if message is None or encrypted_elt is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2288 # None of our business, let the flow continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2289 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2290
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2291 message_elt.children.remove(encrypted_elt)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2292
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2293 log.debug(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2294 f"{message.namespace} message of type {message_type} received from"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2295 f" {sender_bare_jid}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2296 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2297
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2298 plaintext: Optional[bytes]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2299 device_information: omemo.DeviceInformation
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2300
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2301 if (
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2302 muc_plaintext_cache_key is not None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2303 and muc_plaintext_cache_key in self.__muc_plaintext_cache
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2304 ):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2305 # Use the cached plaintext
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2306 plaintext = self.__muc_plaintext_cache.pop(muc_plaintext_cache_key)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2307
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2308 # Since this message was sent by us, use the own device information here
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2309 device_information, __ = await session_manager.get_own_device_information()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2310 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2311 try:
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2312 plaintext, device_information, __ = await session_manager.decrypt(message)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2313 except omemo.MessageNotForUs:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2314 # The difference between this being a debug or a warning is whether there
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2315 # is a body included in the message. Without a body, we can assume that
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2316 # it's an empty OMEMO message used for protocol stability reasons, which
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2317 # is not expected to be sent to all devices of all recipients. If a body
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2318 # is included, we can assume that the message carries content and we
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2319 # missed out on something.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2320 if len(list(message_elt.elements(C.NS_CLIENT, "body"))) > 0:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2321 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2322 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2323 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2324 f"An OMEMO message from {sender_jid.full()} has not been"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2325 f" encrypted for our device, we can't decrypt it."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2326 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2327 { C.MESS_EXTRA_INFO: C.EXTRA_INFO_DECR_ERR }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2328 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2329 log.warning("Message not encrypted for us.")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2330 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2331 log.debug("Message not encrypted for us.")
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2332
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2333 # No point in further processing this message.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2334 return False
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2335 except Exception as e:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2336 log.warning(_("Can't decrypt message: {reason}\n{xml}").format(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2337 reason=e,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2338 xml=message_elt.toXml()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2339 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2340 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2341 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2342 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2343 f"An OMEMO message from {sender_jid.full()} can't be decrypted:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2344 f" {e}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2345 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2346 { C.MESS_EXTRA_INFO: C.EXTRA_INFO_DECR_ERR }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2347 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2348 # No point in further processing this message
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2349 return False
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2350
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2351 affix_values: Optional[SCEAffixValues] = None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2352
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2353 if message.namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2354 if plaintext is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2355 # XEP_0420.unpack_stanza handles the whole unpacking, including the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2356 # relevant modifications to the element
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2357 sce_profile = \
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2358 OMEMO.SCE_PROFILE_GROUPCHAT if is_muc_message else OMEMO.SCE_PROFILE
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2359 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2360 affix_values = self.__xep_0420.unpack_stanza(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2361 sce_profile,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2362 message_elt,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2363 plaintext
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2364 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2365 except Exception as e:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2366 log.warning(D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2367 f"Error unpacking SCE-encrypted message: {e}\n{plaintext}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2368 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2369 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2370 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2371 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2372 f"An OMEMO message from {sender_jid.full()} was rejected:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2373 f" {e}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2374 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2375 { C.MESS_EXTRA_INFO: C.EXTRA_INFO_DECR_ERR }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2376 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2377 # No point in further processing this message
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2378 return False
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2379 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2380 if affix_values.timestamp is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2381 # TODO: affix_values.timestamp contains the timestamp included in
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2382 # the encrypted element here. The XEP says it SHOULD be displayed
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2383 # with the plaintext by clients.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2384 pass
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2385
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2386 if message.namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2387 # Remove all body elements from the original element, since those act as
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2388 # fallbacks in case the encryption protocol is not supported
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2389 for child in message_elt.elements():
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2390 if child.name == "body":
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2391 message_elt.children.remove(child)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2392
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2393 if plaintext is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2394 # Add the decrypted body
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2395 message_elt.addElement("body", content=plaintext.decode("utf-8"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2396
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2397 # Mark the message as trusted or untrusted. Undecided counts as untrusted here.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2398 trust_level = \
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2399 await session_manager._evaluate_custom_trust_level(device_information)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2400
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2401 if trust_level is omemo.TrustLevel.TRUSTED:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2402 post_treat.addCallback(client.encryption.mark_as_trusted)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2403 else:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2404 post_treat.addCallback(client.encryption.mark_as_untrusted)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2405
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2406 # Mark the message as originally encrypted
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2407 post_treat.addCallback(
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2408 client.encryption.mark_as_encrypted,
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2409 namespace=message.namespace
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2410 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2411
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2412 # Handle potential ATM trust updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2413 if affix_values is not None and affix_values.timestamp is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2414 await self.__message_received_trigger_atm(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2415 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2416 message_elt,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2417 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2418 device_information,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2419 affix_values.timestamp
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2420 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2421
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2422 # Message processed successfully, continue with the flow
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2423 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2424
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2425 async def __send_trigger(self, client: SatXMPPClient, stanza: domish.Element) -> bool:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2426 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2427 @param client: The client sending this message.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2428 @param stanza: The stanza that is about to be sent. Can be modified.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2429 @return: Whether the send message flow should continue or not.
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2430 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2431 # SCE is only applicable to message and IQ stanzas
3919
7b2c51bcc8f5 plugin XEP-0384: temporarily disable `<iq>` stanza encryption:
Goffi <goffi@goffi.org>
parents: 3918
diff changeset
2432 # FIXME: temporary disabling IQ stanza encryption
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2433 if stanza.name not in { "message" }: # , "iq" }:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2434 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2435
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2436 # Get the intended recipient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2437 recipient = stanza.getAttribute("to", None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2438 if recipient is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2439 if stanza.name == "message":
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2440 # Message stanzas must have a recipient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2441 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2442 f"Message without recipient encountered. Blocking further processing"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2443 f" to avoid leaking plaintext data: {stanza.toXml()}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2444 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2445
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2446 # IQs without a recipient are a thing, I believe those simply target the
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2447 # server and are thus not eligible for e2ee anyway.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2448 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2449
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2450 # Parse the JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2451 recipient_bare_jid = jid.JID(recipient).userhostJID()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2452
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2453 # Check whether encryption with twomemo is requested
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2454 encryption = client.encryption.getSession(recipient_bare_jid)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2455
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2456 if encryption is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2457 # Encryption is not requested for this recipient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2458 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2459
4164
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2460 encryption_ns = encryption["plugin"].namespace
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2461 # All pre-checks done, we can start encrypting!
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2462 if encryption_ns in (twomemo.twomemo.NAMESPACE, oldmemo.oldmemo.NAMESPACE):
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2463 await self.encrypt(
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2464 client,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2465 encryption_ns,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2466 stanza,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2467 recipient_bare_jid,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2468 stanza.getAttribute("type", C.MESS_TYPE_NORMAL) == C.MESS_TYPE_GROUPCHAT,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2469 stanza.getAttribute("id", None)
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2470 )
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2471 else:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2472 # Encryption is requested for this recipient, but not with twomemo
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2473 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2474
4164
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2475
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2476
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2477 # Add a store hint if this is a message stanza
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2478 if stanza.name == "message":
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2479 self.__xep_0334.add_hint_elements(stanza, [ "store" ])
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2480
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2481 # Let the flow continue.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2482 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2483
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2484 async def download_missing_device_lists(
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2485 self,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2486 client: SatXMPPClient,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2487 namespace: NamespaceType,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2488 recipients: Iterable[jid.JID],
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2489 session_manager: omemo.SessionManager,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2490 ) -> None:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2491 """Retrieves missing device lists for recipients outside the profile's roster.
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2492
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2493 @param client: XMPP client.
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2494 @param namespace: The namespace of the OMEMO version to use.
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2495 @param recipients: Recipients to verify device list presence.
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2496 @param session_manager: OMEMO session manager.
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2497 """
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2498 recipients = [j.userhostJID() for j in recipients]
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2499 not_in_roster = [j for j in recipients if not client.roster.is_jid_in_roster(j)]
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2500 for bare_jid in not_in_roster:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2501 device_information = await session_manager.get_device_information(
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2502 bare_jid.userhost()
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2503 )
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2504 if (
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2505 not device_information
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2506 or not all(namespace in di.namespaces for di in device_information)
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2507 ):
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2508 if namespace == self.NS_TWOMEMO:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2509 algo, node = "OMEMO", TWOMEMO_DEVICE_LIST_NODE
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2510 elif namespace == self.NS_OLDMEMO:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2511 algo, node = "OMEMO_legacy", OLDMEMO_DEVICE_LIST_NODE
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2512 else:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2513 raise ValueError(f"Invalid namespace: {namespace!r}")
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2514
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2515 try:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2516 items, __ = await self._j.get_items(client, bare_jid, node, 1)
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2517
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2518 except Exception:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2519 log.exception(f"Can't find {algo} devices list for {bare_jid}.")
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2520 else:
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2521 await self._update_device_list(client, bare_jid, items)
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2522 log.warning(f"{algo} devices list updated for {bare_jid}.")
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2523
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2524 async def encrypt(
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2525 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2526 client: SatXMPPClient,
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2527 namespace: NamespaceType,
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2528 stanza: domish.Element,
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2529 recipient_jids: Union[jid.JID, Set[jid.JID]],
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2530 is_muc_message: bool,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2531 stanza_id: Optional[str]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2532 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2533 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2534 @param client: The client.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2535 @param namespace: The namespace of the OMEMO version to use.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2536 @param stanza: The stanza. Twomemo will encrypt the whole stanza using SCE,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2537 oldmemo will encrypt only the body. The stanza is modified by this call.
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2538 @param recipient_jid: The JID of the recipients.
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2539 Can be a bare (aka "userhost") JIDs but doesn't have to.
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2540 A single JID can be used.
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2541 @param is_muc_message: Whether the stanza is a message stanza to a MUC room.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2542 @param stanza_id: The id of this stanza. Especially relevant for message stanzas
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2543 to MUC rooms such that the outgoing plaintext can be cached for MUC message
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2544 reflection handling.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2545
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2546 @warning: The calling code MUST take care of adding the store message processing
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2547 hint to the stanza if applicable! This can be done before or after this call,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2548 the order doesn't matter.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2549 """
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2550 if isinstance(recipient_jids, jid.JID):
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2551 recipient_jids = {recipient_jids}
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2552 if not recipient_jids:
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2553 raise exceptions.InternalError("At least one JID must be specified")
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2554 recipient_jid = next(iter(recipient_jids))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2555
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2556 muc_plaintext_cache_key: Optional[MUCPlaintextCacheKey] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2557
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2558 recipient_bare_jids: Set[str]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2559 feedback_jid: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2560
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2561 if is_muc_message:
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2562 if len(recipient_jids) != 1:
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2563 raise exceptions.InternalError(
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2564 'Only one JID can be set when "is_muc_message" is set'
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2565 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2566 if self.__xep_0045 is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2567 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2568 "Encryption of MUC message requested, but plugin XEP-0045 is not"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2569 " available."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2570 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2571
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2572 if stanza_id is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2573 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2574 "Encryption of MUC message requested, but stanza id not available."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2575 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2576
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2577 room_jid = feedback_jid = recipient_jid.userhostJID()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2578
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2579 recipient_bare_jids = self.__get_joined_muc_users(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2580 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2581 self.__xep_0045,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2582 room_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2583 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2584
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2585 muc_plaintext_cache_key = MUCPlaintextCacheKey(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2586 client=client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2587 room_jid=room_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2588 message_uid=stanza_id
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2589 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2590 else:
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2591 recipient_bare_jids = {r.userhost() for r in recipient_jids}
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2592 feedback_jid = recipient_jid.userhostJID()
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2593
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2594 log.debug(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2595 f"Intercepting message that is to be encrypted by {namespace} for"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2596 f" {recipient_bare_jids}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2597 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2598
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2599 def prepare_stanza() -> Optional[bytes]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2600 """Prepares the stanza for encryption.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2601
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2602 Does so by removing all parts that are not supposed to be sent in plain. Also
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2603 extracts/prepares the plaintext to encrypt.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2604
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2605 @return: The plaintext to encrypt. Returns ``None`` in case body-only
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2606 encryption is requested and no body was found. The function should
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2607 gracefully return in that case, i.e. it's not a critical error that should
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2608 abort the message sending flow.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2609 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2610
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2611 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2612 return self.__xep_0420.pack_stanza(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2613 OMEMO.SCE_PROFILE_GROUPCHAT if is_muc_message else OMEMO.SCE_PROFILE,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2614 stanza
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2615 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2616
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2617 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2618 plaintext: Optional[bytes] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2619
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2620 for child in stanza.elements():
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2621 if child.name == "body" and plaintext is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2622 plaintext = str(child).encode("utf-8")
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2623
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2624 # Any other sensitive elements to remove here?
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2625 if child.name in { "body", "html" }:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2626 stanza.children.remove(child)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2627
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2628 if plaintext is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2629 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2630 "No body found in intercepted message to be encrypted with"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2631 " oldmemo."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2632 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2633
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2634 return plaintext
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2635
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2636 return assert_never(namespace)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2637
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2638 # The stanza/plaintext preparation was moved into its own little function for type
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2639 # safety reasons.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2640 plaintext = prepare_stanza()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2641 if plaintext is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2642 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2643
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2644 log.debug(f"Plaintext to encrypt: {plaintext}")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2645
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2646 session_manager = await self.get_session_manager(client.profile)
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2647 await self.download_missing_device_lists(client, namespace, recipient_jids, session_manager)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2648
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
2649 try:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2650 messages, encryption_errors = await session_manager.encrypt(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2651 frozenset(recipient_bare_jids),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2652 { namespace: plaintext },
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2653 backend_priority_order=[ namespace ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2654 identifier=feedback_jid.userhost()
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
2655 )
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
2656 except Exception as e:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2657 msg = _(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2658 # pylint: disable=consider-using-f-string
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2659 "Can't encrypt message for {entities}: {reason}".format(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2660 entities=', '.join(recipient_bare_jids),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2661 reason=e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2662 )
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
2663 )
2859
4e875d9eea48 plugin XEP-0384: give feedback to client when encryption failed
Goffi <goffi@goffi.org>
parents: 2858
diff changeset
2664 log.warning(msg)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2665 client.feedback(feedback_jid, msg, {
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2666 C.MESS_EXTRA_INFO: C.EXTRA_INFO_ENCR_ERR
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2667 })
2858
31a5038cdf79 plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents: 2857
diff changeset
2668 raise e
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
2669
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2670 if len(encryption_errors) > 0:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2671 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2672 f"Ignored the following non-critical encryption errors:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2673 f" {encryption_errors}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2674 )
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2675
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2676 encrypted_errors_stringified = ", ".join([
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2677 f"device {err.device_id} of {err.bare_jid} under namespace"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2678 f" {err.namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2679 for err
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2680 in encryption_errors
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2681 ])
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2682
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2683 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2684 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2685 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2686 "There were non-critical errors during encryption resulting in some"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2687 " of your destinees' devices potentially not receiving the message."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2688 " This happens when the encryption data/key material of a device is"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2689 " incomplete or broken, which shouldn't happen for actively used"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2690 " devices, and can usually be ignored. The following devices are"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2691 f" affected: {encrypted_errors_stringified}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2692 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2693 )
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2694
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2695 message = next(message for message in messages if message.namespace == namespace)
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
2696
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2697 if namespace == twomemo.twomemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2698 # Add the encrypted element
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2699 stanza.addChild(xml_tools.et_elt_2_domish_elt(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2700 twomemo.etree.serialize_message(message)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2701 ))
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2702
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2703 if namespace == oldmemo.oldmemo.NAMESPACE:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2704 # Add the encrypted element
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2705 stanza.addChild(xml_tools.et_elt_2_domish_elt(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2706 oldmemo.etree.serialize_message(message)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2707 ))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2708
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2709 if muc_plaintext_cache_key is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2710 self.__muc_plaintext_cache[muc_plaintext_cache_key] = plaintext
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2711
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2712 async def __on_device_list_update(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2713 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2714 items_event: pubsub.ItemsEvent,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2715 profile: str
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2716 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2717 """Handle device list updates fired by PEP.
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2718
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2719 @param items_event: The event.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2720 @param profile: The profile this event belongs to.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2721 """
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2722
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2723 sender = cast(jid.JID, items_event.sender)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2724 items = cast(List[domish.Element], items_event.items)
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2725 client = self.host.get_client(profile)
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2726 await self._update_device_list(client, sender, items)
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2727
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2728 async def _update_device_list(
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2729 self,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2730 client: SatXMPPEntity,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2731 sender: jid.JID,
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2732 items: list[domish.Element]
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2733 ) -> None:
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2734
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2735 if len(items) > 1:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2736 log.warning("Ignoring device list update with more than one element.")
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2737 return
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2738
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2739 item = next(iter(items), None)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2740 if item is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2741 log.debug("Ignoring empty device list update.")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2742 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2743
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
2744 item_elt = xml_tools.domish_elt_2_et_elt(item)
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2745
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2746 device_list: Dict[int, Optional[str]] = {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2747 namespace: Optional[str] = None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2748
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2749 list_elt = item_elt.find(f"{{{twomemo.twomemo.NAMESPACE}}}devices")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2750 if list_elt is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2751 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2752 device_list = twomemo.etree.parse_device_list(list_elt)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2753 except XMLSchemaValidationError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2754 pass
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2755 else:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2756 namespace = twomemo.twomemo.NAMESPACE
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2757
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2758 list_elt = item_elt.find(f"{{{oldmemo.oldmemo.NAMESPACE}}}list")
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2759 if list_elt is not None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2760 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2761 device_list = oldmemo.etree.parse_device_list(list_elt)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2762 except XMLSchemaValidationError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2763 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2764 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2765 namespace = oldmemo.oldmemo.NAMESPACE
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2766
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2767 if namespace is None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2768 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2769 f"Malformed device list update item:"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2770 f" {ET.tostring(item_elt, encoding='unicode')}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2771 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2772 return
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2773
4219
1b5cf2ee1d86 plugin XEP-0384, XEP-0391: download missing devices list:
Goffi <goffi@goffi.org>
parents: 4218
diff changeset
2774 session_manager = await self.get_session_manager(client.profile)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2775
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2776 await session_manager.update_device_list(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2777 namespace,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2778 sender.userhost(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2779 device_list
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2780 )