From afd904e290ed2993bec053eb896e8577651e6b41 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Wed, 22 Jul 2026 08:02:22 +0200 Subject: [PATCH] Use hosted address for webmail sender --- src/www/bongo-web.py.in | 8 +++++++- src/www/bongo_web/compose.py | 3 ++- src/www/tests/test_compose.py | 14 ++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/www/bongo-web.py.in b/src/www/bongo-web.py.in index 63beda7..f490a75 100644 --- a/src/www/bongo-web.py.in +++ b/src/www/bongo-web.py.in @@ -279,7 +279,12 @@ class BongoWebHandler(BaseHTTPRequestHandler): self._client_ip()) def _available_identities(self, owner): - identities = [{"address": owner, "source": "local", "label": "Bongo"}] + local_address = owner + domains = self.server.config.get("login_domains", []) + if "@" not in local_address and domains: + local_address = f"{local_address}@{domains[0]}" + identities = [{"address": local_address, "source": "local", + "label": "Bongo"}] for identity in list_external_identities(owner): if int(identity.get("verified_at", 0)) <= 0: continue @@ -1238,6 +1243,7 @@ class BongoWebHandler(BaseHTTPRequestHandler): preference = self.server.identities.signature_for_sender( session["user"], identity["address"]) send_message(session["user"], data, sender=identity["address"], + authenticated_address=available[0]["address"], display_name=preference["display_name"], signature=preference["signature"]) except OverflowError: diff --git a/src/www/bongo_web/compose.py b/src/www/bongo_web/compose.py index 310f32d..486b745 100644 --- a/src/www/bongo_web/compose.py +++ b/src/www/bongo_web/compose.py @@ -127,6 +127,7 @@ def build_message(sender: str, data: dict, *, display_name: str = "", def send_message(owner: str, data: dict, queue_factory=None, *, sender: str | None = None, + authenticated_address: str | None = None, display_name: str = "", signature: dict | None = None) -> None: """Submit a composed message to Bongo's native queue service.""" sender = _address(sender or owner) @@ -140,7 +141,7 @@ def send_message(owner: str, data: dict, queue_factory=None, *, sender: str | No try: queue.Create() created = True - queue.StoreFrom(_address(owner), sender) + queue.StoreFrom(_address(authenticated_address or owner), sender) for recipient in recipients: queue.StoreTo(recipient, recipient) # SMTP policy emits a seven/eight-bit clean wire representation with CRLF. diff --git a/src/www/tests/test_compose.py b/src/www/tests/test_compose.py index 20213e0..e4d1e9b 100644 --- a/src/www/tests/test_compose.py +++ b/src/www/tests/test_compose.py @@ -117,6 +117,20 @@ class ComposeTests(unittest.TestCase): self.assertIn("From: Alice ", wire_message) self.assertIn("-- \r\nRegards", wire_message) + def test_store_account_may_use_hosted_mail_address(self): + queues = [] + def factory(user): + queue = FakeQueue(user) + queues.append(queue) + return queue + send_message("admin", {"to": "to@example.test", "text": "Hello"}, + factory, sender="admin@example.test", + authenticated_address="admin@example.test") + self.assertEqual(queues[0].user, "admin") + self.assertEqual(queues[0].calls[1], + ("StoreFrom", "admin@example.test", + "admin@example.test")) + def test_html_signature_is_a_multipart_alternative(self): message, _recipients = build_message( "sender@example.test",