Mercurial > libervia-backend
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 |
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 [] |