Multi-domain compatibility #14

Open
opened 2026-01-28 18:28:30 +00:00 by peio · 2 comments
Owner

mailcloak should work correctly with no specific main domain name. Primary user emails can be from any domain.
local domains can be declared in database to help postfix manage them.
aliases can be from any local domain

mailcloak should work correctly with no specific main domain name. Primary user emails can be from any domain. local domains can be declared in database to help postfix manage them. aliases can be from any local domain
peio added this to the mailcloak project 2026-01-28 18:28:30 +00:00
peio moved this to In Progress in mailcloak on 2026-01-28 20:51:24 +00:00
Author
Owner

Règles simples que je te conseille

  • Alias source (alias@domain) : domaine doit être local (donc FK alias_domain_id → domains(id) non nullable).

  • Target :

    • si domaine target ∈ domains ⇒ target_domain_id FK non-null (forward interne)

    • sinon ⇒ target_domain_id = NULL (forward externe)

Et la policy RCPT fait :

  • si RCPT est alias local :

    • accepter si l’alias existe (et éventuellement si target interne existe Keycloak)

    • si target externe : accepter (ça devient un forward sortant, donc ce sera géré par ta politique relay + DKIM/ARC plus tard)

👉 Ça te laisse le temps de traiter ARC/DKIM sans bloquer la modélisation.

Côté socketmap

  • alias -> OK <target_email>

  • aucune vérification Keycloak nécessaire ici (tu l’as déjà conclu).

### Règles simples que je te conseille - *Alias source* (`alias@domain`) : domaine doit être local (donc FK `alias_domain_id → domains(id)` non nullable). - *Target* : - si domaine target ∈ domains ⇒ `target_domain_id` FK non-null (forward interne) - sinon ⇒ `target_domain_id = NULL` (forward externe) Et la policy RCPT fait : - si RCPT est alias local : - *accepter* si l’alias existe (et éventuellement si target interne existe Keycloak) - *si target externe* : accepter (ça devient un forward sortant, donc ce sera géré par ta politique relay + DKIM/ARC plus tard) 👉 Ça te laisse le temps de traiter ARC/DKIM sans bloquer la modélisation. ### Côté socketmap - `alias -> OK <target_email>` - aucune vérification Keycloak nécessaire ici (tu l’as déjà conclu).
Author
Owner

DB :

domains(domain TEXT PRIMARY KEY)
aliases(alias TEXT PRIMARY KEY, target, alias_domain_id, target_domain_id, enabled, ...)

FOREIGN KEY(alias_domain_id) REFERENCES domains(domain) ON DELETE CASCADE,
FOREIGN KEY(target_domain_id) REFERENCES domains(domain) ON DELETE CASCADE

Policy :
Tu fais en sorte que :

  • la policy soit stricte (reject RCPT inconnus)
  • le socketmap resolve alias SQLite + primary email Keycloak (et multi-domaines) vers une forme canonique livrable

Tu ajoutes une table domains (ou équivalent) dans la DB mailcloak avec is_local/enabled.
Tu modifies policy + socketmap pour considérer ces domaines comme locaux.
Tu passes virtual_mailbox_domains en SQL map (sqlite:/…) basée sur cette table.
(Optionnel) Tu peux supprimer virtual_mailbox_maps si la policy est vraiment stricte et fiable (et que tu acceptes le trade-off “filet de sécurité Postfix” en moins).

Config postfix :
main.cf

virtual_mailbox_domains = sqlite:/etc/postfix/sql/virtual_mailbox_domains.cf

/etc/postfix/sql/virtual_mailbox_domains.cf

dbpath = /var/lib/mailcloak/mailcloak.db
query = SELECT 1 FROM domains WHERE domain = '%s' AND is_local = 1 AND enabled = 1;
DB : ``` domains(domain TEXT PRIMARY KEY) aliases(alias TEXT PRIMARY KEY, target, alias_domain_id, target_domain_id, enabled, ...) FOREIGN KEY(alias_domain_id) REFERENCES domains(domain) ON DELETE CASCADE, FOREIGN KEY(target_domain_id) REFERENCES domains(domain) ON DELETE CASCADE ``` Policy : Tu fais en sorte que : - la policy soit stricte (reject RCPT inconnus) - le socketmap resolve alias SQLite + primary email Keycloak (et multi-domaines) vers une forme canonique livrable ✅ Tu ajoutes une table domains (ou équivalent) dans la DB mailcloak avec is_local/enabled. ✅ Tu modifies policy + socketmap pour considérer ces domaines comme locaux. ✅ Tu passes virtual_mailbox_domains en SQL map (sqlite:/…) basée sur cette table. ✅ (Optionnel) Tu peux supprimer virtual_mailbox_maps si la policy est vraiment stricte et fiable (et que tu acceptes le trade-off “filet de sécurité Postfix” en moins). Config postfix : main.cf ``` virtual_mailbox_domains = sqlite:/etc/postfix/sql/virtual_mailbox_domains.cf ``` /etc/postfix/sql/virtual_mailbox_domains.cf ``` dbpath = /var/lib/mailcloak/mailcloak.db query = SELECT 1 FROM domains WHERE domain = '%s' AND is_local = 1 AND enabled = 1; ```
peio moved this to In Review in mailcloak on 2026-02-02 15:15:07 +00:00
peio moved this to Done in mailcloak on 2026-02-07 00:32:38 +00:00
peio moved this to In Review in mailcloak on 2026-02-07 17:03:20 +00:00
peio moved this to Done in mailcloak on 2026-02-07 17:03:28 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: peio/mailcloak#14
No description provided.