From 7b7b47657c9dbf1764980b207397715dee9192de Mon Sep 17 00:00:00 2001 From: Alexander Schlarb Date: Sun, 9 Dec 2018 20:30:43 +0000 Subject: [PATCH 1/5] Allow users to send emails from alias domains MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### Problem Currently, if I have a domain `bla.com` that is an alias of `blub.com` and John has user account as `john@blub.com`, then will not be able to send e-mails as `john@bla.com` because the system will not recognize / communicate to Postfix that `john@bla.com` is the same as `john@blub.com` and hence Postfix will reject this attempt. ### Proposed Solution When calculating the allowed SASL usernames for an email address, also include aliases from aliased domains in the result of the query. (This will also work for the primary username, since that is added as “internal” alias to that table as well.) ### Caveats I only tested the proposed query with PostgreSQL. --- modoboa/admin/postfix_maps.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index a1c58d410..328d734cd 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -118,8 +118,9 @@ class SenderLoginMap(object): "(SELECT concat(mb.address, '@', dom.name) FROM admin_mailbox mb " "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id" " INNER JOIN admin_domain dom ON dom.id=mb.domain_id" + " INNER JOIN admin_domainalias adom ON adom.target_id=dom.id" " INNER JOIN admin_alias al ON alr.alias_id=al.id " - "WHERE al.enabled=1 AND al.address='%s')" + "WHERE al.enabled=1 AND (al.address='%s' OR (adom.name='@d' AND al.address='%u'||'@'||dom.name)))" ) postgres = ( "(SELECT email FROM core_user WHERE email='%s' AND is_active) " @@ -132,8 +133,9 @@ class SenderLoginMap(object): "(SELECT mb.address || '@' || dom.name FROM admin_mailbox mb " "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id" " INNER JOIN admin_domain dom ON dom.id=mb.domain_id" + " INNER JOIN admin_domainalias adom ON adom.target_id=dom.id" " INNER JOIN admin_alias al ON alr.alias_id=al.id " - "WHERE al.enabled AND al.address='%s')" + "WHERE al.enabled AND (al.address='%s' OR (adom.name='@d' AND al.address='%u'||'@'||dom.name)))" ) sqlite = ( "SELECT email FROM core_user WHERE email='%s' AND is_active=1 " @@ -146,6 +148,7 @@ class SenderLoginMap(object): "SELECT mb.address || '@' || dom.name FROM admin_mailbox mb " "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " + "INNER JOIN admin_domainalias adom ON adom.target_id=dom.id " "INNER JOIN admin_alias al ON alr.alias_id=al.id " - "WHERE al.enabled=1 AND al.address='%s'" + "WHERE al.enabled=1 AND (al.address='%s' OR (adom.name='@d' AND al.address='%u'||'@'||dom.name))" ) From 1fbc12ec1e44cd322fc1efa2536e820a56875200 Mon Sep 17 00:00:00 2001 From: Alexander Schlarb Date: Sun, 9 Dec 2018 20:47:21 +0000 Subject: [PATCH 2/5] Code style checkers suck :slightly_frowning_face: --- modoboa/admin/postfix_maps.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index 328d734cd..14aca3026 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -120,7 +120,10 @@ class SenderLoginMap(object): " INNER JOIN admin_domain dom ON dom.id=mb.domain_id" " INNER JOIN admin_domainalias adom ON adom.target_id=dom.id" " INNER JOIN admin_alias al ON alr.alias_id=al.id " - "WHERE al.enabled=1 AND (al.address='%s' OR (adom.name='@d' AND al.address='%u'||'@'||dom.name)))" + "WHERE al.enabled=1 AND (" + " al.address='%s' OR (" + " adom.name='@d' AND al.address='%u'||'@'||dom.name" + ")))" ) postgres = ( "(SELECT email FROM core_user WHERE email='%s' AND is_active) " @@ -135,7 +138,10 @@ class SenderLoginMap(object): " INNER JOIN admin_domain dom ON dom.id=mb.domain_id" " INNER JOIN admin_domainalias adom ON adom.target_id=dom.id" " INNER JOIN admin_alias al ON alr.alias_id=al.id " - "WHERE al.enabled AND (al.address='%s' OR (adom.name='@d' AND al.address='%u'||'@'||dom.name)))" + "WHERE al.enabled AND (" + " al.address='%s' OR (" + " adom.name='@d' AND al.address='%u'||'@'||dom.name" + ")))" ) sqlite = ( "SELECT email FROM core_user WHERE email='%s' AND is_active=1 " @@ -150,5 +156,8 @@ class SenderLoginMap(object): "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " "INNER JOIN admin_domainalias adom ON adom.target_id=dom.id " "INNER JOIN admin_alias al ON alr.alias_id=al.id " - "WHERE al.enabled=1 AND (al.address='%s' OR (adom.name='@d' AND al.address='%u'||'@'||dom.name))" + "WHERE al.enabled=1 AND (" + " al.address='%s' OR (" + " adom.name='@d' AND al.address='%u'||'@'||dom.name" + "))" ) From ee22c50e044be280c0e821831e6e75e303053433 Mon Sep 17 00:00:00 2001 From: Alexander Schlarb Date: Mon, 10 Dec 2018 11:28:50 +0000 Subject: [PATCH 3/5] Fix critical issue that would prevent any address aliases from being resolved if a domain has no domain alias --- modoboa/admin/postfix_maps.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index 14aca3026..a1df168fb 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -116,10 +116,10 @@ class SenderLoginMap(object): "WHERE sad.address='%s') " "UNION " "(SELECT concat(mb.address, '@', dom.name) FROM admin_mailbox mb " - "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id" - " INNER JOIN admin_domain dom ON dom.id=mb.domain_id" - " INNER JOIN admin_domainalias adom ON adom.target_id=dom.id" - " INNER JOIN admin_alias al ON alr.alias_id=al.id " + "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " + "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " + "INNER JOIN admin_alias al ON alr.alias_id=al.id " + "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " "WHERE al.enabled=1 AND (" " al.address='%s' OR (" " adom.name='@d' AND al.address='%u'||'@'||dom.name" @@ -134,10 +134,10 @@ class SenderLoginMap(object): "WHERE sad.address='%s') " "UNION " "(SELECT mb.address || '@' || dom.name FROM admin_mailbox mb " - "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id" - " INNER JOIN admin_domain dom ON dom.id=mb.domain_id" - " INNER JOIN admin_domainalias adom ON adom.target_id=dom.id" - " INNER JOIN admin_alias al ON alr.alias_id=al.id " + "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " + "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " + "INNER JOIN admin_alias al ON alr.alias_id=al.id " + "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " "WHERE al.enabled AND (" " al.address='%s' OR (" " adom.name='@d' AND al.address='%u'||'@'||dom.name" @@ -154,8 +154,8 @@ class SenderLoginMap(object): "SELECT mb.address || '@' || dom.name FROM admin_mailbox mb " "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " - "INNER JOIN admin_domainalias adom ON adom.target_id=dom.id " "INNER JOIN admin_alias al ON alr.alias_id=al.id " + "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " "WHERE al.enabled=1 AND (" " al.address='%s' OR (" " adom.name='@d' AND al.address='%u'||'@'||dom.name" From 10457f4ffd6439708ec56206c271ebcd1d86c129 Mon Sep 17 00:00:00 2001 From: Alexander Schlarb Date: Wed, 23 Jan 2019 23:22:35 +0100 Subject: [PATCH 4/5] Fix typo --- modoboa/admin/postfix_maps.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index a1df168fb..1866a5907 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -122,7 +122,7 @@ class SenderLoginMap(object): "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " "WHERE al.enabled=1 AND (" " al.address='%s' OR (" - " adom.name='@d' AND al.address='%u'||'@'||dom.name" + " adom.name='%d' AND al.address='%u'||'@'||dom.name" ")))" ) postgres = ( @@ -140,7 +140,7 @@ class SenderLoginMap(object): "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " "WHERE al.enabled AND (" " al.address='%s' OR (" - " adom.name='@d' AND al.address='%u'||'@'||dom.name" + " adom.name='%d' AND al.address='%u'||'@'||dom.name" ")))" ) sqlite = ( @@ -158,6 +158,6 @@ class SenderLoginMap(object): "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " "WHERE al.enabled=1 AND (" " al.address='%s' OR (" - " adom.name='@d' AND al.address='%u'||'@'||dom.name" + " adom.name='%d' AND al.address='%u'||'@'||dom.name" "))" ) From e676261ec03951146bfb656c7d6527dffd931dad Mon Sep 17 00:00:00 2001 From: Alexander Schlarb Date: Wed, 23 Jan 2019 23:41:03 +0100 Subject: [PATCH 5/5] Compare aliased domain with domain of alias rather then mailbox when the alias domain is different from the mailbox one --- modoboa/admin/postfix_maps.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/modoboa/admin/postfix_maps.py b/modoboa/admin/postfix_maps.py index 1866a5907..1550fe7e6 100644 --- a/modoboa/admin/postfix_maps.py +++ b/modoboa/admin/postfix_maps.py @@ -119,10 +119,11 @@ class SenderLoginMap(object): "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " "INNER JOIN admin_alias al ON alr.alias_id=al.id " - "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " + "LEFT JOIN admin_domainalias adoma ON adoma.target_id=al.domain_id " + "LEFT JOIN admin_domain adom ON adom.id=adoma.target_id " "WHERE al.enabled=1 AND (" " al.address='%s' OR (" - " adom.name='%d' AND al.address='%u'||'@'||dom.name" + " adoma.name='%d' AND al.address=concat('%u', '@', adom.name)" ")))" ) postgres = ( @@ -137,10 +138,11 @@ class SenderLoginMap(object): "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " "INNER JOIN admin_alias al ON alr.alias_id=al.id " - "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " + "LEFT JOIN admin_domainalias adoma ON adoma.target_id=al.domain_id " + "LEFT JOIN admin_domain adom ON adom.id=adoma.target_id " "WHERE al.enabled AND (" " al.address='%s' OR (" - " adom.name='%d' AND al.address='%u'||'@'||dom.name" + " adoma.name='%d' AND al.address='%u'||'@'||adom.name" ")))" ) sqlite = ( @@ -155,9 +157,10 @@ class SenderLoginMap(object): "INNER JOIN modoboa_admin_aliasrecipient alr ON alr.r_mailbox_id=mb.id " "INNER JOIN admin_domain dom ON dom.id=mb.domain_id " "INNER JOIN admin_alias al ON alr.alias_id=al.id " - "LEFT JOIN admin_domainalias adom ON adom.target_id=dom.id " + "LEFT JOIN admin_domainalias adoma ON adoma.target_id=al.domain_id " + "LEFT JOIN admin_domain adom ON adom.id=adoma.target_id " "WHERE al.enabled=1 AND (" " al.address='%s' OR (" - " adom.name='%d' AND al.address='%u'||'@'||dom.name" + " adoma.name='%d' AND al.address='%u'||'@'||adom.name" "))" )