changeset 4350:6baea959dc33

component email gateway: convert `autocrypt` header: Autocrypt header must be transmitted in both directions to allow opportunistic end-to-end encryption with this protocol. Moved email validation regex to `tools/common/regex.py`, as it can be used in other locations. rel 456
author Goffi <goffi@goffi.org>
date Fri, 28 Feb 2025 09:23:35 +0100
parents 1bedcc6712e9
children 6a0a081485b8
files libervia/backend/plugins/plugin_comp_email_gateway/__init__.py libervia/backend/tools/common/regex.py
diffstat 2 files changed, 11 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/libervia/backend/plugins/plugin_comp_email_gateway/__init__.py	Fri Feb 28 09:23:35 2025 +0100
+++ b/libervia/backend/plugins/plugin_comp_email_gateway/__init__.py	Fri Feb 28 09:23:35 2025 +0100
@@ -57,7 +57,7 @@
     EmailGWPubsubService,
 )
 from libervia.backend.plugins.plugin_exp_gre import GRE, GetDataHandler
-from libervia.backend.plugins.plugin_sec_gre_encrypted_openpgp import NS_GRE_OPENPGP
+from libervia.backend.plugins.plugin_sec_gre_encrypter_openpgp import NS_GRE_OPENPGP
 from libervia.backend.plugins.plugin_sec_gre_formatter_mime import NS_GRE_MIME
 from libervia.backend.plugins.plugin_xep_0033 import (
     AddressType,
@@ -69,6 +69,7 @@
 from libervia.backend.plugins.plugin_xep_0131 import HeadersData, Urgency, XEP_0131
 from libervia.backend.plugins.plugin_xep_0373 import binary_to_ascii_armor
 from libervia.backend.plugins.plugin_xep_0498 import XEP_0498
+from libervia.backend.tools.common import regex
 from libervia.backend.tools.utils import aio
 
 from .imap import IMAPClientFactory
@@ -105,8 +106,6 @@
 PREFIX_KEY_CREDENTIALS = "CREDENTIALS_"
 KEY_CREDENTIALS = f"{PREFIX_KEY_CREDENTIALS}{{from_jid}}"
 
-email_pattern = re.compile(r"[^@]+@[^@]+\.[^@]+")
-
 
 class FileMetadata(NamedTuple):
     path: Path
@@ -535,6 +534,8 @@
                 else:
                     importance = urgency
                 msg["Importance"] = importance
+            if getattr(extra.headers, "autocrypt", None):
+                msg["Autocrypt"] = extra.headers.autocrypt
 
         await smtp.sendmail(
             credentials["smtp_host"].encode(),
@@ -722,7 +723,7 @@
             if key == "user_email":
                 # XXX: This is a minimal check. A complete email validation is notoriously
                 #   difficult.
-                if not email_pattern.match(value):
+                if not regex.RE_EMAIL.match(value):
                     raise StanzaError(
                         "bad-request", text=f"Invalid email address: {value}"
                     )
@@ -907,6 +908,10 @@
             else:
                 log.warning("Ignoring invalid importance header: {importance!r}")
 
+        autocrypt = email["autocrypt"]
+        if autocrypt:
+            headers["autocrypt"] = autocrypt
+
         if headers:
             extra["headers"] = HeadersData(**headers).model_dump(
                 mode="json", exclude_none=True
--- a/libervia/backend/tools/common/regex.py	Fri Feb 28 09:23:35 2025 +0100
+++ b/libervia/backend/tools/common/regex.py	Fri Feb 28 09:23:35 2025 +0100
@@ -31,6 +31,8 @@
 TEXT_MAX_LEN = 60
 # min lenght is currently deactivated
 TEXT_WORD_MIN_LENGHT = 0
+# basic email validation
+RE_EMAIL = re.compile(r"[^@]+@[^@]+\.[^@]+")
 
 
 def re_join(exps):