config: validate domains when formatting them

This commit is contained in:
missytake
2026-04-16 14:31:52 +02:00
parent 3d5b7b3b2b
commit 27df0a407e
4 changed files with 61 additions and 2 deletions

View File

@@ -10,6 +10,7 @@ dependencies = [
"filelock",
"requests",
"crypt-r >= 3.13.1 ; python_version >= '3.11'",
"domain-validator",
]
[tool.setuptools]

View File

@@ -2,6 +2,7 @@ import ipaddress
from pathlib import Path
import iniconfig
from domain_validator import DomainValidator
from chatmaild.user import User
@@ -194,10 +195,12 @@ def is_valid_ipv4(address: str) -> bool:
def format_arpa_address(address: str) -> str:
if is_valid_ipv4(address):
return ipaddress.IPv4Address(address).reverse_pointer
DomainValidator().validate_domain_re(address)
return address
def format_deliverable_domain(mail_domain: str) -> str:
if is_valid_ipv4(mail_domain):
return f"[{mail_domain}]"
DomainValidator().validate_domain_re(mail_domain)
return mail_domain

View File

@@ -1,6 +1,14 @@
from contextlib import nullcontext as does_not_raise
import pytest
from chatmaild.config import parse_size_mb, read_config
from chatmaild.config import (
format_arpa_address,
format_deliverable_domain,
is_valid_ipv4,
parse_size_mb,
read_config,
)
def test_read_config_basic(example_config):
@@ -16,6 +24,11 @@ def test_read_config_basic(example_config):
assert example_config.mail_domain_deliverable == "chat.example.org"
def test_read_config_deliverable(ipv4_config):
assert ipv4_config.mail_domain == "1.3.3.7"
assert ipv4_config.mail_domain_deliverable == "[1.3.3.7]"
def test_read_config_basic_using_defaults(tmp_path, maildomain):
inipath = tmp_path.joinpath("chatmail.ini")
inipath.write_text(f"[params]\nmail_domain = {maildomain}")
@@ -136,3 +149,45 @@ def test_max_mailbox_size_mb(make_config):
config = make_config("chat.example.org")
assert config.max_mailbox_size == "500M"
assert config.max_mailbox_size_mb == 500
@pytest.mark.parametrize(
["input", "result"],
[
("example.org", False),
("1.3.3.7", True),
("fe::1", False),
("ad.1e.dag.adf", False),
("12394142", False),
],
)
def test_is_valid_ipv4(input, result):
assert result == is_valid_ipv4(input)
@pytest.mark.parametrize(
["input", "result", "exception"],
[
("example.org", "example.org", does_not_raise()),
("1.3.3.7", "7.3.3.1.in-addr.arpa", does_not_raise()),
("fe::1", None, pytest.raises(ValueError)),
("12394142", None, pytest.raises(ValueError)),
],
)
def test_format_arpa_address(input, result, exception):
with exception:
assert result == format_arpa_address(input)
@pytest.mark.parametrize(
["input", "result", "exception"],
[
("example.org", "example.org", does_not_raise()),
("1.3.3.7", "[1.3.3.7]", does_not_raise()),
("fe::1", None, pytest.raises(ValueError)),
("12394142", None, pytest.raises(ValueError)),
],
)
def test_format_deliverable_domain(input, result, exception):
with exception:
assert result == format_deliverable_domain(input)

View File

@@ -297,7 +297,7 @@ def gencreds(chatmail_config):
password = "".join(
random.choices(alphanumeric, k=chatmail_config.password_min_length)
)
yield f"{user}@{addr_domain}", f"{password}"
yield f"{user}@{domain}", f"{password}"
return lambda domain=None: next(gen(domain))