annotate libervia/backend/plugins/plugin_exp_gre.py @ 4351:6a0a081485b8

plugin autocrypt: Autocrypt protocol implementation: Implementation of autocrypt: `autocrypt` header is checked, and if present and no public key is known for the peer, the key is imported. `autocrypt` header is also added to outgoing message (only if an email gateway is detected). For the moment, the JID is use as identifier, but the real email used by gateway should be used in the future. rel 456
author Goffi <goffi@goffi.org>
date Fri, 28 Feb 2025 09:23:35 +0100
parents 95f8309f86cf
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4344
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Libervia plugin
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Copyright (C) 2009-2025 Jérôme Poisson (goffi@goffi.org)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 from abc import ABC, abstractmethod
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from typing import Final, TYPE_CHECKING, Self, Type, cast
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
21
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.internet import defer
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from twisted.words.protocols.jabber import jid, error as jabber_error
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from twisted.words.protocols.jabber import xmlstream
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from twisted.words.protocols.jabber.xmlstream import XMPPHandler
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from twisted.words.xish import domish
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 from wokkel import data_form, disco, iwokkel
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 from zope.interface import implementer
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
29
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 from libervia.backend.core import exceptions
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 from libervia.backend.core.constants import Const as C
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 from libervia.backend.core.core_types import SatXMPPEntity
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 from libervia.backend.core.i18n import _
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 from libervia.backend.core.log import getLogger
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 from libervia.backend.plugins.plugin_xep_0106 import XEP_0106
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 from libervia.backend.tools import xml_tools
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
37
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 if TYPE_CHECKING:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 from libervia.backend.core.main import LiberviaBackend
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
40
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 log = getLogger(__name__)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
42
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
43
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 PLUGIN_INFO = {
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 C.PI_NAME: "Gateway Relayer Encryption",
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 C.PI_IMPORT_NAME: "GRE",
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 C.PI_TYPE: "XEP",
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 C.PI_MODES: C.PLUG_MODE_BOTH,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 C.PI_PROTOCOLS: [],
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 C.PI_DEPENDENCIES: ["XEP-0106"],
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 C.PI_RECOMMENDATIONS: [],
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 C.PI_MAIN: "GRE",
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 C.PI_HANDLER: "yes",
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 C.PI_DESCRIPTION: _(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 "Handle formatting and encryption to support end-to-end encryption with gateways."
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 ),
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
57 }
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
58
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 NS_GRE_PREFIX: Final = "urn:xmpp:gre:"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 NS_GRE: Final = f"{NS_GRE_PREFIX}0"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
61 NS_GRE_FORMATTER_PREFIX: Final = f"{NS_GRE_PREFIX}formatter:"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
62 NS_GRE_ENCRYPTER_PREFIX: Final = f"{NS_GRE_PREFIX}encrypter:"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 NS_GRE_DATA: Final = f"{NS_GRE_PREFIX}data"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
64
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 IQ_DATA_REQUEST = C.IQ_GET + '/data[@xmlns="' + NS_GRE + '"]'
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
66
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
67
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 class Formatter(ABC):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
69
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 formatters_classes: dict[str, Type[Self]] = {}
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 name: str = ""
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 namespace: str = ""
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 _instance: Self | None = None
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
74
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 def __init_subclass__(cls, **kwargs) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 Registers the subclass in the formatters dictionary.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
78
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 @param kwargs: Additional keyword arguments.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 assert cls.name and cls.namespace, "name and namespace must be set"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 super().__init_subclass__(**kwargs)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 cls.formatters_classes[cls.namespace] = cls
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
84
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 def __init__(self, host: "LiberviaBackend") -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 assert self.__class__._instance is None, "Formatter class must be singleton."
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 self.__class__._instance = self
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 self.host = host
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
89
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 @classmethod
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 def get_instance(cls) -> Self:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
92 if cls._instance is None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 raise exceptions.InternalError("Formatter instance should be set.")
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 return cls._instance
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
95
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 @abstractmethod
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 async def format(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 self,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 client: SatXMPPEntity,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 recipient_id: str,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 message_elt: domish.Element,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 encryption_data_form: data_form.Form,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 ) -> bytes:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 raise NotImplementedError
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
105
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
106
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 class Encrypter(ABC):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
108
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 encrypters_classes: dict[str, Type[Self]] = {}
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 name: str = ""
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 namespace: str = ""
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
112 _instance: Self | None = None
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
113
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 def __init_subclass__(cls, **kwargs) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 Registers the subclass in the encrypters dictionary.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
117
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 @param kwargs: Additional keyword arguments.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 assert cls.name and cls.namespace, "name and namespace must be set"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 super().__init_subclass__(**kwargs)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 cls.encrypters_classes[cls.namespace] = cls
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
123
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 def __init__(self, host: "LiberviaBackend") -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 assert self.__class__._instance is None, "Encrypter class must be singleton."
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 self.__class__._instance = self
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 self.host = host
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
128
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 @classmethod
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 def get_instance(cls) -> Self:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 if cls._instance is None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 raise exceptions.InternalError("Encrypter instance should be set.")
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 return cls._instance
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
134
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 @abstractmethod
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 async def encrypt(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 self,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 client: SatXMPPEntity,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 recipient_id: str,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 message_elt: domish.Element,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 formatted_payload: bytes,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 encryption_data_form: data_form.Form,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 ) -> str:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 raise NotImplementedError
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
145
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
146
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 class GetDataHandler(ABC):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 gre_formatters: list[str] = []
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 gre_encrypters: list[str] = []
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
150
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 def __init_subclass__(cls, **kwargs):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 super().__init_subclass__(**kwargs)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 if not cls.gre_formatters or not cls.gre_encrypters:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 raise TypeError(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 f'{cls.__name__} must define "gre_formatters" and "gre_encrypters"'
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
157
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 @abstractmethod
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 async def on_relayed_encryption_data(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 self, client: SatXMPPEntity, iq_elt: domish.Element, form: data_form.Form
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 ) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 raise NotImplementedError
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
163
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
164
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 class GRE:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 namespace = NS_GRE
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
167
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 def __init__(self, host: "LiberviaBackend") -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 log.info(f"plugin {PLUGIN_INFO[C.PI_NAME]!r} initialization")
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 self.host = host
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 self._e = cast(XEP_0106, host.plugins["XEP-0106"])
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 self._data_handlers: dict[SatXMPPEntity, GetDataHandler] = {}
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 host.register_namespace("gre", NS_GRE)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 self.host.register_encryption_plugin(self, "Relayed", NS_GRE)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 host.trigger.add("send", self.send_trigger, priority=0)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
176
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 def register_get_data_handler(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 self, client: SatXMPPEntity, handler: GetDataHandler
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 ) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 if client in self._data_handlers:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 raise exceptions.InternalError(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 '"register_get_data_handler" should not be called twice for the same '
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 "handler."
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 self._data_handlers[client] = handler
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
186
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 def _on_component_data_request(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 self, iq_elt: domish.Element, client: SatXMPPEntity
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 ) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 iq_elt.handled = True
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
191 defer.ensureDeferred(self.on_component_data_request(client, iq_elt))
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
192
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 async def on_component_data_request(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 self, client: SatXMPPEntity, iq_elt: domish.Element
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 ) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 form = data_form.Form(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 "result", "Relayed Data Encryption", formNamespace=NS_GRE_DATA
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 try:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
200 handler = self._data_handlers[client]
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 except KeyError:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 pass
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 else:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
204 await handler.on_relayed_encryption_data(client, iq_elt, form)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 iq_result_elt = xmlstream.toResponse(iq_elt, "result")
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
206 data_elt = iq_result_elt.addElement((NS_GRE, "data"))
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
207 data_elt.addChild(form.toElement())
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
208 client.send(iq_result_elt)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
209
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
210 async def get_formatter_and_encrypter(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
211 self, client: SatXMPPEntity, gateway_jid: jid.JID
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 ) -> tuple[Formatter, Encrypter]:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
213 """Retrieve Formatter and Encrypter instances for given gateway.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
214
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
215 @param client: client session.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
216 @param gateway_jid: bare jid of the gateway.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 @return: Formatter and Encrypter instances.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
218 @raise exceptions.FeatureNotFound: No relevant Formatter or Encrypter could be
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
219 found.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 disco_infos = await self.host.memory.disco.get_infos(client, gateway_jid)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
222 try:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
223 formatter_ns = next(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
224 f for f in disco_infos.features if f.startswith(NS_GRE_FORMATTER_PREFIX)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
225 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
226 encrypter_ns = next(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
227 f for f in disco_infos.features if f.startswith(NS_GRE_ENCRYPTER_PREFIX)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
228 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
229 formatter_cls = Formatter.formatters_classes[formatter_ns]
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 encrypter_cls = Encrypter.encrypters_classes[encrypter_ns]
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
231 except StopIteration as e:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 raise exceptions.FeatureNotFound("No relayed encryption found.") from e
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 except KeyError as e:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 raise exceptions.FeatureNotFound(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 "No compatible relayed encryption found."
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
236 ) from e
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
237
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 return formatter_cls.get_instance(), encrypter_cls.get_instance()
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
239
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
240 def get_encrypted_payload(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 self,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 message_elt: domish.Element,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
243 ) -> str | None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
244 """Return encrypted payload if any.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
245
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 @param message_elt: The message element.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
247 @return: Encrypted payload if any, None otherwise.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 encrypted_elt = next(message_elt.elements(NS_GRE, "encrypted"), None)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 if encrypted_elt is None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 return None
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 return str(encrypted_elt)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
253
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
254 async def send_trigger(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 self, client: SatXMPPEntity, stanza_elt: domish.Element
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 ) -> bool:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
258 @param client: Profile session.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
259 @param stanza: The stanza that is about to be sent.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
260 @return: Whether the send message flow should continue or not.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 if stanza_elt.name != "message":
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 return True
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
264
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 try:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 recipient = jid.JID(stanza_elt["to"])
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 except (jabber_error.StanzaError, RuntimeError, jid.InvalidFormat) as e:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 raise exceptions.InternalError(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 "Message without recipient encountered. Blocking further processing to"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 f" avoid leaking plaintext data: {stanza_elt.toXml()}"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 ) from e
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
272
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 recipient_bare_jid = recipient.userhostJID()
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
274
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
275 encryption_session = client.encryption.getSession(recipient_bare_jid)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
276 if encryption_session is None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 return True
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 if encryption_session["plugin"].namespace != NS_GRE:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 return True
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
280
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
281 # We are in a relayed encryption session.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
282
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
283 encryption_data_form = await self.get_data(client, recipient_bare_jid)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
284
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
285 formatter, encrypter = await self.get_formatter_and_encrypter(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
286 client, recipient_bare_jid
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
287 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
288
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 try:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
290 recipient_id = self._e.unescape(recipient.user)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 except ValueError as e:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
292 raise exceptions.DataError('"to" attribute is not in expected fomat') from e
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
293
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 formatted_payload = await formatter.format(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
295 client, recipient_id, stanza_elt, encryption_data_form
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
296 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
297 encrypted_payload = await encrypter.encrypt(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
298 client, recipient_id, stanza_elt, formatted_payload, encryption_data_form
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
299 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
300
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 for body_elt in list(stanza_elt.elements(None, "body")):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 stanza_elt.children.remove(body_elt)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 for subject_elt in list(stanza_elt.elements(None, "subject")):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 stanza_elt.children.remove(subject_elt)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
305
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 encrypted_elt = stanza_elt.addElement(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 (NS_GRE, "encrypted"), content=encrypted_payload
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 encrypted_elt["formatter"] = formatter.namespace
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 encrypted_elt["encrypter"] = encrypter.namespace
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
311
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 return True
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
313
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 async def get_data(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
315 self, client: SatXMPPEntity, recipient_jid: jid.JID
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
316 ) -> data_form.Form:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
317 """Retrieve relayed encryption data form.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
318
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 @param client: Client session.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
320 @param recipient_id: Bare jid of the entity to whom we want to send encrypted
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
321 mesasge.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
322 @return: Found data form, or None if no data form has been found.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
323 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 assert recipient_jid.resource is None, "recipient_jid must be a bare jid."
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 iq_elt = client.IQ("get")
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 iq_elt["to"] = recipient_jid.full()
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 data_elt = iq_elt.addElement((NS_GRE, "data"))
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
328 iq_result_elt = await iq_elt.send()
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
329 try:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
330 data_elt = next(iq_result_elt.elements(NS_GRE, "data"))
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
331 except StopIteration:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 raise exceptions.DataError(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 f"Relayed data payload is missing: {iq_result_elt.toXml()}"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
334 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
335 form = data_form.findForm(data_elt, NS_GRE_DATA)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 if form is None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
337 raise exceptions.DataError(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
338 f"Relayed data form is missing: {iq_result_elt.toXml()}"
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
340 return form
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
341
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
342 async def get_trust_ui(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
343 self, client: SatXMPPEntity, entity: jid.JID
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 ) -> xml_tools.XMLUI:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
345 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 @param client: The client session.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
347 @param entity: The entity whose device trust levels to manage.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
348 @return: An XMLUI Dialog to handle trust for given entity.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
349 """
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
350 # We just return an enmpty form for now.
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
351 return xml_tools.XMLUI(C.XMLUI_FORM)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
352
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
353 def get_handler(self, client: SatXMPPEntity) -> XMPPHandler:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
354 return GREHandler(self)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
355
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
356
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
357 @implementer(iwokkel.IDisco)
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
358 class GREHandler(XMPPHandler):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
359
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 def __init__(self, plugin_parent: GRE) -> None:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 self.plugin_parent = plugin_parent
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
362
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
363 def connectionInitialized(self):
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 assert self.parent is not None and self.xmlstream is not None
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 if self.parent.is_component:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
366 self.xmlstream.addObserver(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
367 IQ_DATA_REQUEST,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
368 self.plugin_parent._on_component_data_request,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 client=self.parent,
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
370 )
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
371
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
372 def getDiscoInfo(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
373 self, requestor: jid.JID, target: jid.JID, nodeIdentifier: str = ""
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
374 ) -> list[disco.DiscoFeature]:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
375 return [
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
376 disco.DiscoFeature(NS_GRE),
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
377 ]
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
378
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 def getDiscoItems(
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
380 self, requestor: jid.JID, target: jid.JID, nodeIdentifier: str = ""
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 ) -> list[disco.DiscoItems]:
95f8309f86cf plugin GRE: implements Gateway Relayed Encryption:
Goffi <goffi@goffi.org>
parents:
diff changeset
382 return []