annotate libervia/backend/plugins/plugin_xep_0384.py @ 4177:0f1a4ffcd419

doc (cli/blog): Document new `--alt-link` option
author Goffi <goffi@goffi.org>
date Tue, 05 Dec 2023 13:14:55 +0100
parents 15482dc0b5d1
children 1a7a3e4b52a4
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 \
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
25 Any, Dict, FrozenSet, 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
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
100
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
101 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
102 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
103 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
104 """
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
105
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
106 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
107 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
108
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
109
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
110 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
111 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
112 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
113 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
114
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
115
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
116 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
117 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
118 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
119 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
120
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
121
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
122 # 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
123 # 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
124
e7bfbded652a plugin XEP-0384, install: adapted plugin to omemo module changes + added omemo module to dependencies:
Goffi <goffi@goffi.org>
parents: 2648
diff changeset
125
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
126 class MUCPlaintextCacheKey(NamedTuple):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
127 # 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
128 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
129 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
130 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
131
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
132 client: SatXMPPClient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
133 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
134 message_uid: str
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
135
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
136
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
137 @enum.unique
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
138 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
139 """
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
140 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
141 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
142
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
143 TRUSTED: str = "TRUSTED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
144 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
145 UNDECIDED: str = "UNDECIDED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
146 DISTRUSTED: str = "DISTRUSTED"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
147
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
148
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
149 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
150 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
151
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
152
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
153 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
154 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
155 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
156 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
157
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
158 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
159 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
160 @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
161 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
162
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
163 # 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
164 # 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
165 super().__init__()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
166
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
167 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
168
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
169 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
170 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
171 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
172 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
173 return omemo.Nothing()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
174 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
175 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
176
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
177 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
178 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
179 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
180 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
181 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
182
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
183 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
184 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
185 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
186 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
187 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
188 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
189 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
190
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
191
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
192 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
193 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
194 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
195 """
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
196
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
197 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
198 KEY_STATE = "STATE"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
199 KEY_SESSION = "SESSION"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
200 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
201 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
202 KEY_TRUST = "TRUST"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
203 KEY_ALL_JIDS = "ALL_JIDS"
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
204
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
205 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
206 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
207 @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
208 @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
209 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
210
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
211 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
212 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
213
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
214 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
215 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
216 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
217 return None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
218
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
219 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
220 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
221 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
222 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
223
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
224 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
225 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
226 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
227 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
228 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
229
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
230 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
231 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
232 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 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
234 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
235
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
236 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
237 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
238 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
239 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
240 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
241
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
242 async def loadSession(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
243 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
244 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
245 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
246 ) -> 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
247 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
248
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
249 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
250 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
251 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
252 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
253
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
254 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
255 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
256
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
257 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
258 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
259 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
260 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
261
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
262 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
263 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
264
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
265 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
266 Optional[List[int]],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
267 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
268 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
269
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
270 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
271 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
272
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
273 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
274 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
275 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
276 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
277
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
278 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
279 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
280
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
281 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
282 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
283 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
284 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
285
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
286 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
287 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
288
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
289 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
290 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
291 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
292 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
293
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
294 async def loadTrust(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
295 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
296 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
297 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
298 ) -> 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
299 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
300
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
301 return cast(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
302 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
303 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
304 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
305
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
306 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
307 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
308
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
309 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
310 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
311 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
312 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
313
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
314 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
315 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
316
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
317 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
318
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
319 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
320 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
321 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
322 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
323 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
324
3541
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
325
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
326 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
327 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
328 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
329 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
330 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
331 ) -> oldmemo.oldmemo.BundleImpl:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
332 """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
333
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
334 @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
335 @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
336 @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
337 @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
338 @return: The bundle.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
339 @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
340 instead.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
341 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
342 # 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
343 # 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
344
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
345 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
346 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
347
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
348 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
349 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
350 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
351 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
352 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
353 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
354 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
355
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
356 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
357 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
358 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
359 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
360 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
361
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
362 element = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
363 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
364 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
365 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
366 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
367 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
368 )
888109774673 core: various changes and fixes to work with new storage and D-Bus bridge:
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
369
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
370 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
371 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
372 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
373 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
374 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
375 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
376 ) from e
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
377
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
378
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
379 # 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
380 # 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
381 # 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
382 NS_TM: Final = "urn:xmpp:tm:1"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
383 NS_ATM: Final = "urn:xmpp:atm:1"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
384
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
385
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
386 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
387 <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
388 targetNamespace='urn:xmpp:tm:1'
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
389 xmlns='urn:xmpp:tm:1'
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
390 elementFormDefault='qualified'>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
391
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
392 <xs:element name='trust-message'>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
393 <xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
394 <xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
395 <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
396 </xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
397 <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
398 <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
399 </xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
400 </xs:element>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
401
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
402 <xs:element name='key-owner'>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
403 <xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
404 <xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
405 <xs:element
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
406 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
407 <xs:element
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
408 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
409 </xs:sequence>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
410 <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
411 </xs:complexType>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
412 </xs:element>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
413 </xs:schema>
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
414 """)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
415
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 # 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
418 TM_SCE_PROFILE = SCEProfile(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
419 rpad_policy=SCEAffixPolicy.REQUIRED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
420 time_policy=SCEAffixPolicy.REQUIRED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
421 to_policy=SCEAffixPolicy.OPTIONAL,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
422 from_policy=SCEAffixPolicy.OPTIONAL,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
423 custom_policies={}
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
424 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
425
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 class TrustUpdate(NamedTuple):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
428 # pylint: disable=invalid-name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
429 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
430 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
431 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
432
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
433 target_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
434 target_key: bytes
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
435 target_trust: bool
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
436
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
437
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
438 class TrustMessageCacheEntry(NamedTuple):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
439 # pylint: disable=invalid-name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
440 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
441 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
442 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
443
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
444 sender_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
445 sender_key: bytes
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
446 timestamp: datetime
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
447 trust_update: TrustUpdate
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
448
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
449
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
450 class PartialTrustMessage(NamedTuple):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
451 # pylint: disable=invalid-name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
452 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
453 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
454 to build trust messages.
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
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
457 recipient_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
458 updated_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
459 trust_updates: FrozenSet[TrustUpdate]
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 async def manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
463 client: SatXMPPClient,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
464 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
465 applied_trust_updates: FrozenSet[TrustUpdate]
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
466 ) -> None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
467 """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
468
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
469 @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
470 @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
471 @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
472 triggering this cache management run.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
473 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
474
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
475 trust_message_cache = persistent.LazyPersistentBinaryDict(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
476 "XEP-0384/TM",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
477 client.profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
478 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
479
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
480 # Load cache entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
481 cache_entries = cast(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
482 Set[TrustMessageCacheEntry],
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
483 await trust_message_cache.get("cache", set())
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
484 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
485
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
486 # 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
487 cache_entries_by_target = {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
488 (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
489 cache_entry.trust_update.target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
490 cache_entry.trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
491 ): cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
492 for cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
493 in cache_entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
494 }
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
495
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
496 for trust_update in applied_trust_updates:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
497 cache_entry = cache_entries_by_target.get(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
498 (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
499 None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
500 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
501
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
502 if cache_entry is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
503 cache_entries.remove(cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
504
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
505 # 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
506 new_trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
507
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
508 for trust_update in applied_trust_updates:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
509 if trust_update.target_trust:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
510 # 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
511 for cache_entry in set(cache_entries):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
512 if (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
513 cache_entry.sender_jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
514 == trust_update.target_jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
515 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
516 ):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
517 trust_level = (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
518 TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
519 if cache_entry.trust_update.target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
520 else TrustLevel.DISTRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
521 )
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 # Apply the trust update
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
524 await session_manager.set_trust(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
525 cache_entry.trust_update.target_jid.userhost(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
526 cache_entry.trust_update.target_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
527 trust_level.name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
528 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
529
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
530 # 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
531 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
532
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
533 # Remove the corresponding cache entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
534 cache_entries.remove(cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
535
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
536 # Store the updated cache entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
537 await trust_message_cache.force("cache", cache_entries)
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 # 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
540
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
541 if len(new_trust_updates) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
542 # 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
543 # management
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
544 await manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
545 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
546 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
547 frozenset(new_trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
548 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
549
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
550
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
551 async def get_trust_as_trust_updates(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
552 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
553 target_jid: jid.JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
554 ) -> FrozenSet[TrustUpdate]:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
555 """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
556
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
557 @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
558 @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
559 @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
560 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
561 the trust updates.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
562 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
563
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
564 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
565
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
566 trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
567
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
568 for device in devices:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
569 trust_level = TrustLevel(device.trust_level_name)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
570 target_trust: bool
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
571
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
572 if trust_level is TrustLevel.TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
573 target_trust = True
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
574 elif trust_level is TrustLevel.DISTRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
575 target_trust = False
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
576 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
577 # 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
578 continue
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
579
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
580 trust_updates.add(TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
581 target_jid=target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
582 target_key=device.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
583 target_trust=target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
584 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
585
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
586 return frozenset(trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
587
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 async def send_trust_messages(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
590 client: SatXMPPClient,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
591 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
592 applied_trust_updates: FrozenSet[TrustUpdate]
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
593 ) -> None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
594 """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
595
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
596 @param client: The client.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
597 @param session_manager: The session manager.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
598 @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
599 notify other peers about.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
600 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
601 # 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
602 # 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
603 # 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
604
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
605 # 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
606 own_jid = client.jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
607 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
608
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
609 # 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
610 updated_jids = frozenset({
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
611 trust_update.target_jid.userhostJID()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
612 for trust_update
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
613 in applied_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
614 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
615
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
616 trust_messages: Set[PartialTrustMessage] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
617
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
618 for updated_jid in updated_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
619 # Get the trust updates for that JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
620 trust_updates = frozenset({
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
621 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
622 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
623 })
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 if updated_jid == own_jid:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
626 # 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
627 # 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
628 # 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
629 # python-omemo.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
630 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
631 peer_jids = frozenset({
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
632 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
633 f"/{OMEMO.NS_TWOMEMO}/bare_jids",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
634 str
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
635 )).maybe([])
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
636 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
637
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
638 if len(peer_jids) == 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
639 # 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
640 # changes directly
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
641 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
642 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
643 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
644 trust_updates=trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
645 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
646 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
647 # 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
648 # handle the copy to our own JID
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
649 for peer_jid in peer_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
650 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
651 recipient_jid=peer_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
652 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
653 trust_updates=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 # 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
657 # trusted devices
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
658 peer_trust_updates = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
659 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
660
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
661 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
662 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
663 updated_jid=peer_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
664 trust_updates=peer_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
665 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
666
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
667 # 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
668 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
669 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
670 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
671 trust_updates=own_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
672 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
673 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
674 # 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
675 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
676 recipient_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
677 updated_jid=updated_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
678 trust_updates=trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
679 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
680
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
681 # 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
682 trust_messages.add(PartialTrustMessage(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
683 recipient_jid=updated_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
684 updated_jid=own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
685 trust_updates=own_trust_updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
686 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
687
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
688 # 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
689 # recipient.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
690 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
691
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
692 for recipient_jid in recipient_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
693 updated: Dict[jid.JID, Set[TrustUpdate]] = {}
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 for trust_message in trust_messages:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
696 # Merge trust messages directed at that recipient
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
697 if trust_message.recipient_jid == recipient_jid:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
698 # Merge the trust updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
699 updated[trust_message.updated_jid] = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
700 updated.get(trust_message.updated_jid, set())
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
701
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
702 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
703
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
704 # Build the trust message
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
705 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
706 trust_message_elt["usage"] = NS_ATM
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
707 trust_message_elt["encryption"] = twomemo.twomemo.NAMESPACE
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
708
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
709 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
710 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
711 key_owner_elt["jid"] = updated_jid.userhost()
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 for trust_update in trust_updates:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
714 serialized_identity_key = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
715 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
716
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
717 if trust_update.target_trust:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
718 key_owner_elt.addElement(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
719 (NS_TM, "trust"),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
720 content=serialized_identity_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
721 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
722 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
723 key_owner_elt.addElement(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
724 (NS_TM, "distrust"),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
725 content=serialized_identity_key
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 # 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
729 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
730 "from": own_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
731 "to": recipient_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
732 "uid": str(uuid.uuid4()),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
733 "message": {},
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
734 "subject": {},
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
735 "type": C.MESS_TYPE_CHAT,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
736 "extra": {},
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
737 "timestamp": time.time()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
738 }))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
739
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
740 message_data["xml"].addChild(trust_message_elt)
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 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
743
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
744 feedback_jid = recipient_jid
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
745
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
746 # TODO: The following is mostly duplicate code
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
747 try:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
748 messages, encryption_errors = await session_manager.encrypt(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
749 frozenset({ own_jid.userhost(), recipient_jid.userhost() }),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
750 { OMEMO.NS_TWOMEMO: plaintext },
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
751 backend_priority_order=[ OMEMO.NS_TWOMEMO ],
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
752 identifier=feedback_jid.userhost()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
753 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
754 except Exception as e:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
755 msg = _(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
756 # pylint: disable=consider-using-f-string
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
757 "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
758 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
759 reason=e
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
760 )
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 log.warning(msg)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
763 client.feedback(feedback_jid, msg, {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
764 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
765 })
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
766 raise e
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 if len(encryption_errors) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
769 log.warning(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
770 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
771 f" {encryption_errors}"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
772 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
773
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
774 encrypted_errors_stringified = ", ".join([
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
775 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
776 f" {err.namespace}"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
777 for err
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
778 in encryption_errors
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
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
781 client.feedback(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
782 feedback_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
783 D_(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
784 "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
785 " 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
786 " 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
787 " 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
788 " 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
789 f" affected: {encrypted_errors_stringified}."
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
790 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
791 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
792
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
793 message = next(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
794 message for message in messages
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
795 if message.namespace == OMEMO.NS_TWOMEMO
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
796 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
797
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
798 # Add the encrypted element
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
799 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
800 twomemo.etree.serialize_message(message)
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
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
803 await client.a_send(message_data["xml"])
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
804
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
805
4072
040095a5dc7f refactoring: rename `SAT` class to `LiberviaBackend`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
806 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
807 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
808 @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
809 @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
810 @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
811 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
812 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
813
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
814 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
815 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
816
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
817 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
818 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
819 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
820 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
821 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
822
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
823 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
824 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
825 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
826 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
827
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
828 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
829 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
830 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
831 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
832 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
833 node,
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
834 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
835 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
836 extra={
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
837 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
838 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
839 },
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
840 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
841 }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
842 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
843 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
844 if (
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
845 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
846 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
847 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
848 # 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
849 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
850 ):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
851 # 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
852 # 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
853 raise omemo.BundleUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
854 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
855 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
856 # 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
857 # 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
858
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
859 raise omemo.BundleUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
860 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
861 ) from e
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 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
864
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, oldmemo.oldmemo.BundleImpl):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
866 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
867
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
868 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
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=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
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: { 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
878 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
879 }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
880 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
881 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
882 raise omemo.BundleUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
883 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
884 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
885
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
886 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
887
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
888 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
889
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
890 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
891 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
892 namespace: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
893 bare_jid: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
894 device_id: int
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
895 ) -> omemo.Bundle:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
896 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
897 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
898
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
899 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
900 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
901 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
902 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
903 node,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
904 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
905 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
906 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
907 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
908 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
909 f" namespace {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
910 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
912 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
913 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
914 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
915 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
916 f" {len(items)}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
917 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
918
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
919 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
920 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
921 None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
922 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
923 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
924 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
925 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
926 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
927 f" failed: {element}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
928 )
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 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
931 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
932 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
933 raise omemo.BundleDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
934 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
935 f" namespace {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
936 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
937
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
938 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
939 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
940 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
941 xep_0060,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
942 bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
943 device_id
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
944 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
945
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
946 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
947
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
948 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
949 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
950 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
951 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
952
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
953 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
954 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
955 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
956 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
957 node,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
958 [ str(device_id) ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
959 notify=False
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
960 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
961 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
962 raise omemo.BundleDeletionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
963 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
964 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
965 ) from e
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 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
968
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
969 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
970 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
971
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
972 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
973 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
974 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
975 raise omemo.BundleDeletionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
976 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
977 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
978 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
979
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
980 return
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 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
983
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
984 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
985 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
986 namespace: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
987 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
988 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
989 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
990 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
991
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
992 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
993 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
994 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
995 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
996 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
997 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
998
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
999 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
1000 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
1001
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1002 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1003 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
1004 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1005 client.jid.userhostJID(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1006 node,
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1007 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
1008 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
1009 extra={
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
1010 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
1011 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
1012 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
1013 },
3933
cecf45416403 plugin XEP-0373 and XEP-0374: Implementation of OX and OXIM:
Syndace <me@syndace.dev>
parents: 3929
diff changeset
1014 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
1015 }
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1016 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1017 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
1018 if (
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1019 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
1020 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
1021 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
1022 # 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
1023 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
1024 ):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1025 # 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
1026 # 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
1027 raise omemo.DeviceListUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1028 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
1029 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1030 # 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
1031 # in the XEP.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1032
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1033 raise omemo.DeviceListUploadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1034 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
1035 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1036
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1037 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1038 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
1039 namespace: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1040 bare_jid: str
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1041 ) -> 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
1042 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
1043
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1044 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
1045 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
1046 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
1047 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
1048
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1049 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
1050 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
1051
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1052 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1053 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
1054 except exceptions.NotFound:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1055 return {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1056 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
1057 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1058 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
1059 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1060 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1061
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1062 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
1063 return {}
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1064
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1065 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
1066 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1067 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
1068 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
1069 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1070
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1071 element = next(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1072 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
1073 None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1074 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1075
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1076 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
1077 raise omemo.DeviceListDownloadFailed(
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 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
1079 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
1080 f" {element}."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1081 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1082
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1083 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1084 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
1085 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
1086 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
1087 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
1088 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
1089 raise omemo.DeviceListDownloadFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1090 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
1091 f" {namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1092 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1093
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
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1096 async def _evaluate_custom_trust_level(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1097 self,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1098 device: omemo.DeviceInformation
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1099 ) -> omemo.TrustLevel:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1100 # 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
1101 try:
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1102 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
1103 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
1104 raise omemo.UnknownTrustLevel(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1105 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
1106 ) from e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1107
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1108 # 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
1109 if trust_level is TrustLevel.TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1110 return omemo.TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1111 if trust_level is TrustLevel.UNDECIDED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1112 return omemo.TrustLevel.UNDECIDED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1113 if trust_level is TrustLevel.DISTRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1114 return omemo.TrustLevel.DISTRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1115
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1116 # 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
1117 # on the trust system and phase
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1118 if trust_level is TrustLevel.BLINDLY_TRUSTED:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1119 # 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
1120 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
1121 PARAM_NAME,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1122 PARAM_CATEGORY,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1123 profile_key=profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1124 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1125
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1126 # 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
1127 if trust_system == "btbv":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1128 return omemo.TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1129
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1130 # 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
1131 # and counts as undecided
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1132 if trust_system == "atm":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1133 # 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
1134 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
1135
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1136 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
1137 TrustLevel.UNDECIDED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1138 TrustLevel.BLINDLY_TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1139 } for device in devices)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1140
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1141 if phase_one:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1142 return omemo.TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1143
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1144 return omemo.TrustLevel.UNDECIDED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1145
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1146 raise exceptions.InternalError(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1147 f"Unknown trust system active: {trust_system}"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1148 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1149
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1150 assert_never(trust_level)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1151
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1152 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
1153 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1154 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
1155 identifier: Optional[str]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1156 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1157 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
1158 raise omemo.TrustDecisionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1159 "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
1160 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1161
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1162 # 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
1163 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
1164
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1165 # 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
1166 # 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
1167 # 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
1168 # 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
1169 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
1170
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1171 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
1172 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
1173
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1174 # 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
1175 for bare_jid in bare_jids:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1176 # 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
1177 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
1178
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1179 # 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
1180 # 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
1181 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
1182 TrustLevel.UNDECIDED,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1183 TrustLevel.BLINDLY_TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1184 } for device in devices):
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1185 blind_trust_bare_jids.add(bare_jid)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1186 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1187 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
1188
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1189 # 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
1190 # be categorized too
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1191 blindly_trusted_devices = \
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1192 { 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
1193 manually_trusted_devices = \
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1194 { 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
1195
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1196 # 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
1197 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
1198 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
1199 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
1200 device.bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1201 device.identity_key,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1202 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
1203 )
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 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
1206 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
1207 f" {device.namespaces}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1208 for device
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1209 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
1210 ])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1211
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1212 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1213 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1214 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1215 "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
1216 " blindly trusted.\nFollowing devices have been automatically"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1217 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
1218 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1219 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1220
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1221 # 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
1222 # trust
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1223 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
1224 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1225 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1226 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1227 "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
1228 " 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
1229 " 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
1230 " send this message."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1231 )
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 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
1234 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
1235 feedback_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1236 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1237
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1238 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1239 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
1240 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
1241
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1242 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
1243 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
1244 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
1245 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
1246
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1247 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
1248 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
1249
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1250 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
1251 "from": client.jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1252 "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
1253 "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
1254 "message": {},
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1255 "subject": {},
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1256 "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
1257 "extra": {},
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1258 "timestamp": time.time()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1259 }))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1260
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1261 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
1262
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1263 try:
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
1264 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
1265 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
1266 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
1267
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1268 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
1269 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1270 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
1271 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
1272 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1273 """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
1274
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1275 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
1276 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
1277
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1278 @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
1279 @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
1280 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
1281 @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
1282 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1283
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1284 # 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
1285 # 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
1286 # 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
1287 # 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
1288 # 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
1289 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
1290 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
1291 raise omemo.TrustDecisionFailed(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1292 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
1293 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1294
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1295 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
1296
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1297 # 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
1298 # 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
1299 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
1300 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
1301 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
1302 submit_id=""
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 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
1305 "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
1306 "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
1307 "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
1308 "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
1309 "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
1310 "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
1311 "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
1312 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1313
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1314 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
1315
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1316 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
1317 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
1318 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
1319 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
1320 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
1321 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1322 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1323
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1324 # 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
1325 # completely random
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1326 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
1327
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1328 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
1329 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
1330 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
1331 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
1332 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
1333 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
1334 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
1335 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
1336 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
1337 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1338 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1339
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1340 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
1341 sat,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1342 trust_ui,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1343 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
1344 profile=profile
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1345 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1346
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1347 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
1348 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
1349
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1350 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
1351 trust_ui_result
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1352 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1353
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1354 trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1355
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1356 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
1357 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
1358 continue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1359
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1360 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
1361 target_trust = C.bool(value)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1362 trust_level = \
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1363 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
1364
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1365 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
1366 device.bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1367 device.identity_key,
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1368 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
1369 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1370
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1371 trust_updates.add(TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1372 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
1373 target_key=device.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1374 target_trust=target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1375 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1376
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1377 # 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
1378 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
1379 PARAM_NAME,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1380 PARAM_CATEGORY,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1381 profile_key=profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1382 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1383
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1384 if trust_system == "atm":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1385 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
1386 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
1387
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1388 return SessionManagerImpl
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1389
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1390
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1391 async def prepare_for_profile(
4072
040095a5dc7f refactoring: rename `SAT` class to `LiberviaBackend`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
1392 sat: LiberviaBackend,
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1393 profile: str,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1394 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
1395 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
1396 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
1397 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
1398 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
1399 ) -> omemo.SessionManager:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1400 """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
1401
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1402 @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
1403 @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
1404 @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
1405 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
1406 @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
1407 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
1408 and one month.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1409 @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
1410 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
1411 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
1412 @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
1413 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
1414 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
1415 :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
1416 @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
1417 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
1418 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
1419 ``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
1420 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
1421 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
1422 @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
1423 ``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
1424 profile.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1425 @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
1426 :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
1427 @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
1428 :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
1429 @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
1430 :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
1431 @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
1432 :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
1433 @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
1434 :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
1435 """
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1436
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1437 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
1438 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
1439
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1440 storage = StorageImpl(profile)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1441
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1442 # TODO: Untested
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1443 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
1444 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
1445 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1446 # 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
1447 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
1448 TrustLevel.UNDECIDED.name,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1449 TrustLevel.DISTRUSTED.name,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1450 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
1451 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1452 xep_0060,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1453 bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1454 device_id
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1455 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1456 )
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1457
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1458 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
1459 [
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1460 twomemo.Twomemo(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1461 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1462 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
1463 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
1464 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1465 oldmemo.Oldmemo(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1466 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1467 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
1468 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
1469 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1470 ],
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1471 storage,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1472 client.jid.userhost(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1473 initial_own_label,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1474 TrustLevel.UNDECIDED.value,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1475 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
1476 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
1477 omemo.AsyncFramework.TWISTED
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1478 )
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1479
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1480 # 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
1481 # 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
1482 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
1483
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1484 # 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
1485 # 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
1486 # 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
1487 # 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
1488 # 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
1489 # 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
1490 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
1491
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1492 return session_manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1493
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1494
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1495 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
1496 <params>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1497 <individual>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1498 <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
1499 <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
1500 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
1501 type="list" security="3">
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1502 <option value="atm"
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1503 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
1504 <option value="btbv"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1505 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
1506 selected="true" />
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1507 </param>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1508 </category>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1509 </individual>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1510 </params>
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1511 """
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1512
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1513
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1514 class OMEMO:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1515 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1516 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
1517 ``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
1518 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
1519 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
1520 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
1521 """
3918
e63f96e60f7b plugin XEP-0384: expose OLDMEMO and TWOMEMO namespaces:
Goffi <goffi@goffi.org>
parents: 3914
diff changeset
1522 NS_TWOMEMO = twomemo.twomemo.NAMESPACE
e63f96e60f7b plugin XEP-0384: expose OLDMEMO and TWOMEMO namespaces:
Goffi <goffi@goffi.org>
parents: 3914
diff changeset
1523 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
1524
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1525 # 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
1526 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
1527 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
1528 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
1529 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
1530 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
1531 custom_policies={}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1532 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1533
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1534 # 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
1535 SCE_PROFILE = SCEProfile(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1536 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
1537 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
1538 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
1539 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
1540 custom_policies={}
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1541 )
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1542
4072
040095a5dc7f refactoring: rename `SAT` class to `LiberviaBackend`
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
1543 def __init__(self, sat: LiberviaBackend) -> None:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1544 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1545 @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
1546 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1547
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1548 self.__sat = sat
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1549
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1550 # 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
1551 # model
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1552 sat.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
1553
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1554 # Plugins
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1555 self.__xep_0045 = cast(Optional[XEP_0045], sat.plugins.get("XEP-0045"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1556 self.__xep_0334 = cast(XEP_0334, sat.plugins["XEP-0334"])
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1557 self.__xep_0359 = cast(Optional[XEP_0359], sat.plugins.get("XEP-0359"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1558 self.__xep_0420 = cast(XEP_0420, sat.plugins["XEP-0420"])
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 # 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
1561 # 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
1562 # 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
1563 # 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
1564 # 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
1565 # 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
1566 # 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
1567 # 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
1568 # 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
1569 # 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
1570 # really necessary.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1571 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
1572
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1573 # 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
1574 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
1575
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1576 # 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
1577 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
1578
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1579 # 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
1580 # 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
1581 # added, the message_received trigger is also used for twomemo.
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1582 sat.trigger.add(
4051
c23cad65ae99 core: renamed `messageReceived` trigger to `message_received`
Goffi <goffi@goffi.org>
parents: 4037
diff changeset
1583 "message_received",
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
1584 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
1585 priority=100050
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
1586 )
4164
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
1587
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1588 sat.trigger.add("send", self.__send_trigger, priority=0)
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1589 # 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
1590 # including IQs.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1591
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1592 # Give twomemo a (slightly) higher priority than oldmemo
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
1593 sat.register_encryption_plugin(self, "OMEMO", twomemo.twomemo.NAMESPACE, 101)
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
1594 sat.register_encryption_plugin(
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
1595 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
1596 )
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 xep_0163 = cast(XEP_0163, sat.plugins["XEP-0163"])
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1599 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
1600 "TWOMEMO_DEVICES",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1601 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
1602 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
1603 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
1604 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1605 )
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1606 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
1607 "OLDMEMO_DEVICES",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1608 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
1609 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
1610 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
1611 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1612 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1613
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1614 try:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1615 self.__text_commands = cast(TextCommands, sat.plugins[C.TEXT_CMDS])
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1616 except KeyError:
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1617 log.info(_("Text commands not available"))
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1618 else:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1619 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
1620
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1621 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
1622 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1623 client: SatXMPPClient
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1624 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1625 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1626 @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
1627 """
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1628
4004
cd6f70015738 plugin XEP-0384: run `profileConnected` workflow in background:
Goffi <goffi@goffi.org>
parents: 3976
diff changeset
1629 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
1630 cast(str, client.profile)
4004
cd6f70015738 plugin XEP-0384: run `profileConnected` workflow in background:
Goffi <goffi@goffi.org>
parents: 3976
diff changeset
1631 ))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1632
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1633 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
1634 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1635 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1636 mess_data: MessageData
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1637 ) -> Literal[False]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1638 """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
1639
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1640 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
1641 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
1642 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
1643
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1644 @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
1645 @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
1646 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
1647 @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
1648 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
1649 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1650
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1651 twomemo_requested = \
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1652 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
1653 oldmemo_requested = \
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1654 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
1655
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1656 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
1657 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
1658 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1659 _("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
1660 mess_data
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1661 )
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1662 return False
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1663
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1664 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
1665
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1666 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
1667 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
1668
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1669 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
1670 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
1671 await session_manager.replace_sessions(device)
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1672
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1673 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
1674 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1675 _("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
1676 mess_data
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1677 )
3218
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1678
806a7936a591 plugin XEP-0384: added "/omemo_reset" text command:
Goffi <goffi@goffi.org>
parents: 3214
diff changeset
1679 return False
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1680
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1681 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
1682 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1683 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1684 entity: jid.JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1685 ) -> xml_tools.XMLUI:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1686 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1687 @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
1688 @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
1689 @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
1690 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
1691 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1692
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1693 if entity.resource:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1694 raise ValueError("A bare JID is expected.")
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1695
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1696 bare_jids: Set[str]
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1697 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
1698 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
1699 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1700 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
1701
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1702 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
1703
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1704 # 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
1705 # random
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1706 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
1707 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
1708 for bare_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1709 in bare_jids
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1710 ]), 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
1711
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1712 async def callback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1713 data: Any,
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1714 profile: str
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1715 ) -> Dict[Never, Never]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1716 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1717 @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
1718 @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
1719 @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
1720 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
1721 """
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1722
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1723 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
1724 return {}
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1725
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1726 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
1727 Dict[str, str],
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1728 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
1729 )
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1730
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1731 trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1732
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1733 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
1734 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
1735 continue
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1736
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1737 device = devices[int(key[len("trust_"):])]
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1738 trust_level_name = value
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1739
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1740 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
1741 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
1742 device.bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1743 device.identity_key,
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1744 trust_level_name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1745 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1746
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1747 target_trust: Optional[bool] = None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1748
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1749 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
1750 target_trust = True
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1751 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
1752 target_trust = False
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1753
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1754 if target_trust is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1755 trust_updates.add(TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1756 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
1757 target_key=device.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1758 target_trust=target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1759 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1760
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1761 # 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
1762 trust_system = cast(str, self.__sat.memory.param_get_a(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1763 PARAM_NAME,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1764 PARAM_CATEGORY,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1765 profile_key=profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1766 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1767
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1768 if trust_system == "atm":
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1769 if len(trust_updates) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1770 await manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1771 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1772 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1773 frozenset(trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1774 )
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 await send_trust_messages(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1777 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1778 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1779 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
1780 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1781
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1782 return {}
2744
e6716d90c2fe plugin XEP-0384: various bug fixes:
Goffi <goffi@goffi.org>
parents: 2738
diff changeset
1783
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1784 submit_id = self.__sat.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
1785
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1786 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
1787 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
1788 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
1789 submit_id=submit_id
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1790 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1791 # 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
1792 # 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
1793 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
1794 trust_ui.addText(D_(
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1795 "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
1796 " 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
1797 " 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
1798 " 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
1799 " 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
1800 " 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
1801 " 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
1802 " 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
1803 " trust."
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1804 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1805
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1806 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
1807
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1808 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
1809 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
1810 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
1811 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
1812 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
1813 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
1814 )))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1815 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1816 trust_ui.addEmpty()
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1817
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1818 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
1819 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
1820 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
1821 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
1822 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
1823 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
1824 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
1825 device.identity_key
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 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
1828
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1829 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
1830 avaiable_trust_levels = \
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1831 { TrustLevel.DISTRUSTED, TrustLevel.TRUSTED, current_trust_level }
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
1832
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1833 trust_ui.addList(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1834 f"trust_{index}",
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1835 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
1836 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
1837 styles=[ "inline" ]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1838 )
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1839
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1840 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
1841 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
1842 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1843 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
1844 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
1845 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1846 trust_ui.addLabel(D_("(inactive for Twomemo)"))
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
1847
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1848 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
1849 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
1850 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1851 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
1852 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
1853 trust_ui.addEmpty()
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_("(inactive for Oldmemo)"))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1855
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1856 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1857 trust_ui.addEmpty()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1858
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1859 return result
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1860
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1861 @staticmethod
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1862 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
1863 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1864 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
1865 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
1866 ) -> Set[str]:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1867 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1868 @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
1869 @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
1870 @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
1871 @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
1872 @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
1873 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
1874 """
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
1875
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1876 bare_jids: Set[str] = set()
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
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 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
1879 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
1880 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
1881 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1882 "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
1883 ) from e
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
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 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
1886 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
1887 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
1888 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1889 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
1890 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
1891 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1892
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1893 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
1894
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1895 return bare_jids
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1896
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
1897 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
1898 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1899 @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
1900 @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
1901 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
1902 """
2662
0bef44f8e8ca plugin XEP-0384: PEP handling + mark as encrypted:
Goffi <goffi@goffi.org>
parents: 2654
diff changeset
1903
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
1904 try:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1905 # 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
1906 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
1907 except KeyError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1908 # 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
1909 # 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
1910 # 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
1911 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
1912 # 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
1913 # queue
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1914 deferred = defer.Deferred()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1915 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
1916 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
1917
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1918 # 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
1919 self.__session_manager_waiters[profile] = []
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
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 # 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
1922 try:
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1923 session_manager = await prepare_for_profile(
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1924 self.__sat,
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1925 profile,
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1926 initial_own_label="Libervia"
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1927 )
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1928 except Exception as e:
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1929 # 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
1930 # and delete them
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1931 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
1932 waiter.errback(e)
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1933 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
1934
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1935 # Re-raise the exception
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1936 raise
42d3110ac9b1 plugin XEP-0384: proper handling of exceptions in `prepare_for_profile`
Syndace <me@syndace.dev>
parents: 3919
diff changeset
1937
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1938 self.__session_managers[profile] = session_manager
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
1939
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1940 # 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
1941 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
1942 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
1943 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
1944
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1945 return session_manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
1946
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1947 async def __message_received_trigger_atm(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1948 self,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1949 client: SatXMPPClient,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1950 message_elt: domish.Element,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1951 session_manager: omemo.SessionManager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1952 sender_device_information: omemo.DeviceInformation,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1953 timestamp: datetime
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1954 ) -> None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1955 """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
1956
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1957 @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
1958 @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
1959 @param session_manager: The session manager.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1960 @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
1961 the message.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1962 @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
1963 """
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1964
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1965 trust_message_cache = persistent.LazyPersistentBinaryDict(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1966 "XEP-0384/TM",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1967 client.profile
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1968 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1969
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1970 new_cache_entries: Set[TrustMessageCacheEntry] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1971
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1972 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
1973 assert isinstance(trust_message_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1974
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1975 try:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1976 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
1977 except xmlschema.XMLSchemaValidationError as e:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1978 raise exceptions.ParsingError(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1979 "<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
1980 ) from e
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1981
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1982 if trust_message_elt["usage"] != NS_ATM:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1983 # Skip non-ATM trust message
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1984 continue
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1985
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1986 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
1987 # Skip non-twomemo trust message
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1988 continue
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1989
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1990 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
1991 assert isinstance(key_owner_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1992
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1993 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
1994
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1995 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
1996 assert isinstance(trust_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1997
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1998 new_cache_entries.add(TrustMessageCacheEntry(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
1999 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
2000 sender_key=sender_device_information.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2001 timestamp=timestamp,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2002 trust_update=TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2003 target_jid=key_owner_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2004 target_key=base64.b64decode(str(trust_elt)),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2005 target_trust=True
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2006 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2007 ))
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 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
2010 assert isinstance(distrust_elt, domish.Element)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2011
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2012 new_cache_entries.add(TrustMessageCacheEntry(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2013 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
2014 sender_key=sender_device_information.identity_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2015 timestamp=timestamp,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2016 trust_update=TrustUpdate(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2017 target_jid=key_owner_jid,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2018 target_key=base64.b64decode(str(distrust_elt)),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2019 target_trust=False
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2020 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2021 ))
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2022
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2023 # Load existing cache entries
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2024 existing_cache_entries = cast(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2025 Set[TrustMessageCacheEntry],
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2026 await trust_message_cache.get("cache", set())
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2027 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2028
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2029 # Discard cache entries by timestamp comparison
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2030 existing_by_target = {
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2031 (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2032 cache_entry.trust_update.target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2033 cache_entry.trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2034 ): cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2035 for cache_entry
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2036 in existing_cache_entries
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
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2039 # 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
2040 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
2041 existing_cache_entry = existing_by_target.get(
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_entry.trust_update.target_jid.userhostJID(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2044 new_cache_entry.trust_update.target_key
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2045 ),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2046 None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2047 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2048
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2049 if existing_cache_entry is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2050 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
2051 # 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
2052 # 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
2053 new_cache_entries.remove(new_cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2054 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2055 # 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
2056 # when both cache entries have matching timestamps.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2057 existing_cache_entries.remove(existing_cache_entry)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2058
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2059 # 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
2060 applied_trust_updates: Set[TrustUpdate] = set()
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2061
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2062 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
2063 # 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
2064 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
2065 trust_update = cache_entry.trust_update
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 trust_level = (
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2068 TrustLevel.TRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2069 if trust_update.target_trust
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2070 else TrustLevel.DISTRUSTED
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2071 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2072
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2073 await session_manager.set_trust(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2074 trust_update.target_jid.userhost(),
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2075 trust_update.target_key,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2076 trust_level.name
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2077 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2078
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2079 applied_trust_updates.add(trust_update)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2080
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2081 new_cache_entries.remove(cache_entry)
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 # 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
2084 await trust_message_cache.force(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2085 "cache",
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2086 existing_cache_entries | new_cache_entries
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
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2089 # 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
2090 if len(applied_trust_updates) > 0:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2091 await manage_trust_message_cache(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2092 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2093 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2094 frozenset(applied_trust_updates)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2095 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2096
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2097 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
2098 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2099 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2100 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
2101 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
2102 ) -> bool:
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2103 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2104 @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
2105 @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
2106 @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
2107 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
2108 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
2109 encrypted.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2110 @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
2111 """
4007
1d5a81e3c9e8 plugin XEP-0384: skip MessageReceived trigger when in a component:
Goffi <goffi@goffi.org>
parents: 4004
diff changeset
2112 if client.is_component:
1d5a81e3c9e8 plugin XEP-0384: skip MessageReceived trigger when in a component:
Goffi <goffi@goffi.org>
parents: 4004
diff changeset
2113 return True
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2114 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
2115
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2116 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
2117 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
2118
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2119 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
2120 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
2121 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
2122 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
2123 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2124 "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
2125 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2126 # 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
2127 # normally
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2128 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2129
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2130 room_jid = feedback_jid = sender_jid.userhostJID()
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2131
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2132 try:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2133 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
2134 except exceptions.NotFound:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2135 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2136 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
2137 f" {room_jid}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2138 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2139 # 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
2140 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2141
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2142 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
2143 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
2144 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2145 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
2146 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
2147 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2148 # 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
2149 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2150
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2151 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
2152 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
2153 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2154 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
2155 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
2156 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2157 # 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
2158 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2159
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2160 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
2161
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2162 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
2163 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
2164 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
2165 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
2166 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
2167 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
2168 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
2169 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2170 room_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2171 message_uid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2172 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2173 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2174 # 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
2175 # plugin.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2176 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
2177 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
2178 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
2179 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
2180 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
2181 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2182 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
2183
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2184 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
2185
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2186 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
2187 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
2188
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2189 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
2190 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
2191 None
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
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2194 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
2195 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
2196 None
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2197 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2198
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
2199 try:
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2200 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
2201 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
2202 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
2203 # 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
2204 return True
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2205
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2206 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
2207 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2208 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
2209 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
2210 sender_bare_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2211 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2212 except (ValueError, XMLSchemaValidationError):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2213 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2214 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
2215 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
2216 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2217 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2218 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
2219
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2220 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
2221 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2222 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
2223 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
2224 sender_bare_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2225 client.jid.userhost(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2226 session_manager
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2227 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2228 except (ValueError, XMLSchemaValidationError):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2229 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2230 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
2231 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
2232 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2233 except omemo.SenderNotFound:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2234 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2235 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
2236 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
2237 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
2238 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2239 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2240 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
2241
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2242 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
2243 # 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
2244 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2245
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2246 message_elt.children.remove(encrypted_elt)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2247
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2248 log.debug(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2249 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
2250 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
2251 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2252
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2253 plaintext: Optional[bytes]
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2254 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
2255
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2256 if (
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2257 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
2258 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
2259 ):
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2260 # 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
2261 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
2262
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2263 # 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
2264 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
2265 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2266 try:
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2267 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
2268 except omemo.MessageNotForUs:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2269 # 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
2270 # 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
2271 # 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
2272 # 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
2273 # 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
2274 # 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
2275 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
2276 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2277 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2278 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2279 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
2280 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
2281 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2282 { 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
2283 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2284 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
2285 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2286 log.debug("Message not encrypted for us.")
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2287
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2288 # 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
2289 return False
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2290 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
2291 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
2292 reason=e,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2293 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
2294 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2295 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2296 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2297 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2298 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
2299 f" {e}"
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 { 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
2302 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2303 # 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
2304 return False
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2305
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2306 affix_values: Optional[SCEAffixValues] = None
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2307
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2308 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
2309 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
2310 # 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
2311 # 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
2312 sce_profile = \
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2313 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
2314 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2315 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
2316 sce_profile,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2317 message_elt,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2318 plaintext
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2319 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2320 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
2321 log.warning(D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2322 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
2323 ))
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2324 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2325 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2326 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2327 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
2328 f" {e}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2329 ),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2330 { 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
2331 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2332 # 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
2333 return False
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2334 else:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2335 if affix_values.timestamp is not None:
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2336 # 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
2337 # 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
2338 # with the plaintext by clients.
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2339 pass
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2340
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2341 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
2342 # 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
2343 # 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
2344 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
2345 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
2346 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
2347
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2348 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
2349 # 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
2350 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
2351
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2352 # 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
2353 trust_level = \
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2354 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
2355
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2356 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
2357 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
2358 else:
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2359 post_treat.addCallback(client.encryption.mark_as_untrusted)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2360
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2361 # 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
2362 post_treat.addCallback(
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2363 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
2364 namespace=message.namespace
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2365 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2366
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2367 # Handle potential ATM trust updates
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2368 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
2369 await self.__message_received_trigger_atm(
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2370 client,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2371 message_elt,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2372 session_manager,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2373 device_information,
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2374 affix_values.timestamp
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2375 )
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2376
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2377 # 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
2378 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2379
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2380 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
2381 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2382 @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
2383 @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
2384 @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
2385 """
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2386 # 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
2387 # FIXME: temporary disabling IQ stanza encryption
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2388 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
2389 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2390
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2391 # 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
2392 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
2393 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
2394 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
2395 # 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
2396 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2397 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
2398 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
2399 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2400
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2401 # 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
2402 # 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
2403 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2404
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2405 # Parse the JID
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2406 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
2407
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2408 # 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
2409 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
2410
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2411 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
2412 # 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
2413 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2414
4164
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2415 encryption_ns = encryption["plugin"].namespace
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2416 # 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
2417 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
2418 await self.encrypt(
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2419 client,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2420 encryption_ns,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2421 stanza,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2422 recipient_bare_jid,
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2423 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
2424 stanza.getAttribute("id", None)
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2425 )
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2426 else:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2427 # 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
2428 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2429
4164
15482dc0b5d1 plugin XEP-0384: fix trigger used for OLDMEMO:
Goffi <goffi@goffi.org>
parents: 4150
diff changeset
2430
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2431
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2432 # 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
2433 if stanza.name == "message":
4037
524856bd7b19 massive refactoring to switch from camelCase to snake_case:
Goffi <goffi@goffi.org>
parents: 4007
diff changeset
2434 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
2435
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2436 # 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
2437 return True
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2438
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2439 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
2440 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2441 client: SatXMPPClient,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2442 namespace: Literal["urn:xmpp:omemo:2", "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
2443 stanza: domish.Element,
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2444 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
2445 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
2446 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
2447 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2448 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2449 @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
2450 @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
2451 @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
2452 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
2453 @param recipient_jid: The JID of the recipients.
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2454 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
2455 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
2456 @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
2457 @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
2458 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
2459 reflection handling.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2460
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2461 @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
2462 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
2463 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
2464 """
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2465 if isinstance(recipient_jids, jid.JID):
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2466 recipient_jids = {recipient_jids}
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2467 if not recipient_jids:
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2468 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
2469 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
2470
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2471 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
2472
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2473 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
2474 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
2475
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2476 if is_muc_message:
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2477 if len(recipient_jids) != 1:
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2478 raise exceptions.InternalError(
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2479 '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
2480 )
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2481 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
2482 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2483 "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
2484 " available."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2485 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2486
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2487 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
2488 raise exceptions.InternalError(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2489 "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
2490 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2491
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2492 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
2493
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2494 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
2495 client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2496 self.__xep_0045,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2497 room_jid
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2498 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2499
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2500 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
2501 client=client,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2502 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
2503 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
2504 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2505 else:
3972
5fbdf986670c plugin pte: Pubsub Target Encryption implementation:
Goffi <goffi@goffi.org>
parents: 3969
diff changeset
2506 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
2507 feedback_jid = recipient_jid.userhostJID()
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2508
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2509 log.debug(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2510 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
2511 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
2512 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2513
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2514 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
2515 """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
2516
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2517 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
2518 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
2519
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2520 @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
2521 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
2522 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
2523 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
2524 """
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2525
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2526 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
2527 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
2528 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
2529 stanza
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2530 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2531
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2532 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
2533 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
2534
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2535 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
2536 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
2537 plaintext = str(child).encode("utf-8")
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2538
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2539 # 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
2540 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
2541 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
2542
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2543 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
2544 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2545 "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
2546 " oldmemo."
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2547 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2548
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2549 return plaintext
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2550
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2551 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
2552
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2553 # 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
2554 # safety reasons.
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2555 plaintext = prepare_stanza()
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2556 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
2557 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2558
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2559 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
2560
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2561 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
2562
3214
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
2563 try:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2564 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
2565 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
2566 { namespace: plaintext },
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2567 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
2568 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
2569 )
8d92d4d829fb plugin XEP-0384: use "max_items=1" for devices and bundles nodes:
Goffi <goffi@goffi.org>
parents: 3172
diff changeset
2570 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
2571 msg = _(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2572 # 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
2573 "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
2574 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
2575 reason=e
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2576 )
3237
b0c57c9a4bd8 plugin XEP-0384: OMEMO trust policy:
Goffi <goffi@goffi.org>
parents: 3236
diff changeset
2577 )
2859
4e875d9eea48 plugin XEP-0384: give feedback to client when encryption failed
Goffi <goffi@goffi.org>
parents: 2858
diff changeset
2578 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
2579 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
2580 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
2581 })
2858
31a5038cdf79 plugin XEP-0384: small refactoring to encrypt messages + bugfix:
Goffi <goffi@goffi.org>
parents: 2857
diff changeset
2582 raise e
2738
eb58f26ed236 plugin XEP-0384: update to last python-omemo + trust management:
Goffi <goffi@goffi.org>
parents: 2662
diff changeset
2583
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2584 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
2585 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2586 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
2587 f" {encryption_errors}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2588 )
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2589
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2590 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
2591 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
2592 f" {err.namespace}"
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2593 for err
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2594 in encryption_errors
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2595 ])
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2596
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2597 client.feedback(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2598 feedback_jid,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2599 D_(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2600 "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
2601 " 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
2602 " 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
2603 " 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
2604 " 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
2605 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
2606 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2607 )
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2608
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2609 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
2610
3911
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 # Add the encrypted element
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2613 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
2614 twomemo.etree.serialize_message(message)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2615 ))
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2616
3911
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 # Add the encrypted element
3967
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2619 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
2620 oldmemo.etree.serialize_message(message)
f461f11ea176 plugin XEP-0384: Implementation of Automatic Trust Management:
Syndace <me@syndace.dev>
parents: 3944
diff changeset
2621 ))
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2622
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2623 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
2624 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
2625
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2626 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
2627 self,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2628 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
2629 profile: str
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2630 ) -> None:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2631 """Handle device list updates fired by PEP.
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2632
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2633 @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
2634 @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
2635 """
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2636
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2637 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
2638 items = cast(List[domish.Element], items_event.items)
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2639
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2640 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
2641 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
2642 return
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2643
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2644 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
2645 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
2646 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
2647 return
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2648
3914
4cb38c8312a1 plugin XEP-0384, xml_tools: avoid `getItems` timeout + fix empty node crash + parsing:
Goffi <goffi@goffi.org>
parents: 3911
diff changeset
2649 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
2650
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2651 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
2652 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
2653
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2654 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
2655 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
2656 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2657 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
2658 except XMLSchemaValidationError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2659 pass
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2660 else:
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2661 namespace = twomemo.twomemo.NAMESPACE
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2662
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2663 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
2664 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
2665 try:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2666 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
2667 except XMLSchemaValidationError:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2668 pass
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2669 else:
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2670 namespace = oldmemo.oldmemo.NAMESPACE
3104
118d91c932a7 plugin XEP-0384: OMEMO for MUC implementation:
Goffi <goffi@goffi.org>
parents: 3098
diff changeset
2671
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2672 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
2673 log.warning(
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2674 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
2675 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
2676 )
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2677 return
2648
0f76813afc57 plugin XEP-0384: OMEMO implementation first draft:
Goffi <goffi@goffi.org>
parents:
diff changeset
2678
3969
8e7d5796fb23 plugin XEP-0391: implement XEP-0391 (Jingle Encrypted Transports) + XEP-0396 (JET-OMEMO):
Goffi <goffi@goffi.org>
parents: 3967
diff changeset
2679 session_manager = await self.get_session_manager(profile)
3911
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2680
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2681 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
2682 namespace,
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2683 sender.userhost(),
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2684 device_list
8289ac1b34f4 plugin XEP-0384: Fully reworked to adjust to the reworked python-omemo:
Syndace <me@syndace.dev>
parents: 3797
diff changeset
2685 )