From d544011b66a3f22c8f0d530d644d4ceb7595f7c1 Mon Sep 17 00:00:00 2001 From: Julian Rother Date: Thu, 28 Aug 2025 00:21:21 +0200 Subject: [PATCH] Fix inconsistent alias domain catchall behaviour Postfix lookups for catchall case on non-alias domain: 1. user@domain - virtual_alias_maps.cf -> no match - virtual_alias_domain_maps.cf -> no match - virtual_alias_domain_catchall_maps.cf -> no match - custom virtual_alias_maps -> no match 2. user -> not relevant 3. @domain - virtual_alias_maps.cf -> **match**, lookup ends here With an alias domain the behaviour was: 1. user@domain - virtual_alias_maps.cf -> no match - virtual_alias_domain_maps.cf -> no match - virtual_alias_domain_catchall_maps.cf -> **match**, lookup ends here In this case custom virtual_alias_maps are ignored. With this change the behaviour is: 1. user@domain - virtual_alias_maps.cf -> no match - virtual_alias_domain_maps.cf -> no match - virtual_alias_domain_catchall_maps.cf -> no match - custom virtual_alias_maps -> no match 2. user -> not relevant 3. @domain - virtual_alias_maps.cf -> no match - virtual_alias_domain_maps.cf -> **match**, lookup ends here The change removes virtual_alias_domain_catchall_maps.cf entirely and rewrites virtual_alias_domain_maps.cf to also work for catchall lookups. --- tasks/main.yml | 1 - templates/postfix/main.cf.j2 | 2 +- .../postfix/pgsql/virtual_alias_domain_catchall_maps.cf.j2 | 4 ---- templates/postfix/pgsql/virtual_alias_domain_maps.cf.j2 | 2 +- 4 files changed, 2 insertions(+), 7 deletions(-) delete mode 100644 templates/postfix/pgsql/virtual_alias_domain_catchall_maps.cf.j2 diff --git a/tasks/main.yml b/tasks/main.yml index 88938ee..538d1d6 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -216,7 +216,6 @@ - pgsql/relay_domains.cf - pgsql/virtual_alias_maps.cf - pgsql/virtual_alias_domain_maps.cf - - pgsql/virtual_alias_domain_catchall_maps.cf - pgsql/virtual_domains_maps.cf - pgsql/virtual_mailbox_maps.cf - pgsql/virtual_sender_maps.cf diff --git a/templates/postfix/main.cf.j2 b/templates/postfix/main.cf.j2 index ddb53b6..3eafed2 100644 --- a/templates/postfix/main.cf.j2 +++ b/templates/postfix/main.cf.j2 @@ -73,7 +73,7 @@ smtp_tls_security_level = may # Postfixadmin and dovecot integration relay_domains = $mydestination pgsql:/etc/postfix/pgsql/relay_domains.cf {{ mailserver.postfix.relay_domains }} -virtual_alias_maps = pgsql:/etc/postfix/pgsql/virtual_alias_maps.cf pgsql:/etc/postfix/pgsql/virtual_alias_domain_maps.cf pgsql:/etc/postfix/pgsql/virtual_alias_domain_catchall_maps.cf {{ mailserver.postfix.virtual_alias_maps }} +virtual_alias_maps = pgsql:/etc/postfix/pgsql/virtual_alias_maps.cf pgsql:/etc/postfix/pgsql/virtual_alias_domain_maps.cf {{ mailserver.postfix.virtual_alias_maps }} virtual_mailbox_domains = pgsql:/etc/postfix/pgsql/virtual_domains_maps.cf virtual_mailbox_maps = pgsql:/etc/postfix/pgsql/virtual_mailbox_maps.cf virtual_transport = dovecot diff --git a/templates/postfix/pgsql/virtual_alias_domain_catchall_maps.cf.j2 b/templates/postfix/pgsql/virtual_alias_domain_catchall_maps.cf.j2 deleted file mode 100644 index 3f369fb..0000000 --- a/templates/postfix/pgsql/virtual_alias_domain_catchall_maps.cf.j2 +++ /dev/null @@ -1,4 +0,0 @@ -dbname = postfixadmin -user = postfix -hosts = unix:/var/run/postgresql -query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = '@' || alias_domain.target_domain AND alias.active = true AND alias_domain.active = true diff --git a/templates/postfix/pgsql/virtual_alias_domain_maps.cf.j2 b/templates/postfix/pgsql/virtual_alias_domain_maps.cf.j2 index 0871b3d..275227c 100644 --- a/templates/postfix/pgsql/virtual_alias_domain_maps.cf.j2 +++ b/templates/postfix/pgsql/virtual_alias_domain_maps.cf.j2 @@ -1,4 +1,4 @@ dbname = postfixadmin user = postfix hosts = unix:/var/run/postgresql -query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' and alias.address = '%u' || '@' || alias_domain.target_domain AND alias.active = true AND alias_domain.active = true +query = SELECT goto FROM alias, alias_domain WHERE alias_domain.alias_domain = '%d' AND alias_domain.target_domain = alias.domain AND left(alias.address, -length(alias.domain)) || alias_domain.alias_domain = '%s' AND left(alias.address, -length(alias.domain)) || alias.domain = alias.address AND alias.active = true AND alias_domain.active = true