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
This commit is contained in:
parent
5681435532
commit
2a0f4e28f8
2 changed files with 11 additions and 4 deletions
|
|
@ -57,7 +57,7 @@ from libervia.backend.plugins.plugin_comp_email_gateway.pubsub_service import (
|
||||||
EmailGWPubsubService,
|
EmailGWPubsubService,
|
||||||
)
|
)
|
||||||
from libervia.backend.plugins.plugin_exp_gre import GRE, GetDataHandler
|
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_sec_gre_formatter_mime import NS_GRE_MIME
|
||||||
from libervia.backend.plugins.plugin_xep_0033 import (
|
from libervia.backend.plugins.plugin_xep_0033 import (
|
||||||
AddressType,
|
AddressType,
|
||||||
|
|
@ -69,6 +69,7 @@ from libervia.backend.plugins.plugin_xep_0106 import XEP_0106
|
||||||
from libervia.backend.plugins.plugin_xep_0131 import HeadersData, Urgency, XEP_0131
|
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_0373 import binary_to_ascii_armor
|
||||||
from libervia.backend.plugins.plugin_xep_0498 import XEP_0498
|
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 libervia.backend.tools.utils import aio
|
||||||
|
|
||||||
from .imap import IMAPClientFactory
|
from .imap import IMAPClientFactory
|
||||||
|
|
@ -105,8 +106,6 @@ CONF_SECTION = f"component {IMPORT_NAME}"
|
||||||
PREFIX_KEY_CREDENTIALS = "CREDENTIALS_"
|
PREFIX_KEY_CREDENTIALS = "CREDENTIALS_"
|
||||||
KEY_CREDENTIALS = f"{PREFIX_KEY_CREDENTIALS}{{from_jid}}"
|
KEY_CREDENTIALS = f"{PREFIX_KEY_CREDENTIALS}{{from_jid}}"
|
||||||
|
|
||||||
email_pattern = re.compile(r"[^@]+@[^@]+\.[^@]+")
|
|
||||||
|
|
||||||
|
|
||||||
class FileMetadata(NamedTuple):
|
class FileMetadata(NamedTuple):
|
||||||
path: Path
|
path: Path
|
||||||
|
|
@ -535,6 +534,8 @@ class EmailGatewayComponent(GetDataHandler):
|
||||||
else:
|
else:
|
||||||
importance = urgency
|
importance = urgency
|
||||||
msg["Importance"] = importance
|
msg["Importance"] = importance
|
||||||
|
if getattr(extra.headers, "autocrypt", None):
|
||||||
|
msg["Autocrypt"] = extra.headers.autocrypt
|
||||||
|
|
||||||
await smtp.sendmail(
|
await smtp.sendmail(
|
||||||
credentials["smtp_host"].encode(),
|
credentials["smtp_host"].encode(),
|
||||||
|
|
@ -722,7 +723,7 @@ class EmailGatewayComponent(GetDataHandler):
|
||||||
if key == "user_email":
|
if key == "user_email":
|
||||||
# XXX: This is a minimal check. A complete email validation is notoriously
|
# XXX: This is a minimal check. A complete email validation is notoriously
|
||||||
# difficult.
|
# difficult.
|
||||||
if not email_pattern.match(value):
|
if not regex.RE_EMAIL.match(value):
|
||||||
raise StanzaError(
|
raise StanzaError(
|
||||||
"bad-request", text=f"Invalid email address: {value}"
|
"bad-request", text=f"Invalid email address: {value}"
|
||||||
)
|
)
|
||||||
|
|
@ -907,6 +908,10 @@ class EmailGatewayComponent(GetDataHandler):
|
||||||
else:
|
else:
|
||||||
log.warning("Ignoring invalid importance header: {importance!r}")
|
log.warning("Ignoring invalid importance header: {importance!r}")
|
||||||
|
|
||||||
|
autocrypt = email["autocrypt"]
|
||||||
|
if autocrypt:
|
||||||
|
headers["autocrypt"] = autocrypt
|
||||||
|
|
||||||
if headers:
|
if headers:
|
||||||
extra["headers"] = HeadersData(**headers).model_dump(
|
extra["headers"] = HeadersData(**headers).model_dump(
|
||||||
mode="json", exclude_none=True
|
mode="json", exclude_none=True
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,8 @@ RE_TEXT_URL = re.compile(r"[^a-zA-Z0-9,_]+")
|
||||||
TEXT_MAX_LEN = 60
|
TEXT_MAX_LEN = 60
|
||||||
# min lenght is currently deactivated
|
# min lenght is currently deactivated
|
||||||
TEXT_WORD_MIN_LENGHT = 0
|
TEXT_WORD_MIN_LENGHT = 0
|
||||||
|
# basic email validation
|
||||||
|
RE_EMAIL = re.compile(r"[^@]+@[^@]+\.[^@]+")
|
||||||
|
|
||||||
|
|
||||||
def re_join(exps):
|
def re_join(exps):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue