From 15a031bbb95705c727cbdf502efcc1c7cb9083b4 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 9 Aug 2023 21:06:20 +0200 Subject: [PATCH 1/5] Extend virtual_forwardings to handle alias address on alias domain, #6535 --- .../tpl/mysql-virtual_forwardings.cf.master | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index 8607735c93..d2352f7804 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -3,9 +3,34 @@ password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} query = SELECT s.destination AS target FROM mail_forwarding AS s - WHERE (s.source = '%s' OR s.source = {address_without_extension}) AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} + WHERE (s.source = '%s' OR s.source = {address_without_extension}) + AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination AS target FROM mail_forwarding AS s WHERE s.source = '@%d' AND s.type = 'catchall' AND s.active = 'y' AND s.server_id = {server_id} - AND NOT EXISTS (SELECT email FROM mail_user WHERE (email = '%s' OR email = {address_without_extension}) AND EXISTS (SELECT domain_id FROM mail_domain WHERE domain = SUBSTRING_INDEX('%s', '@', -1) AND active = 'y' AND server_id = {server_id}) AND server_id = {server_id}) - AND NOT EXISTS (SELECT source FROM mail_forwarding WHERE (source = '%s' OR source = {address_without_extension}) AND active = 'y' AND server_id = {server_id}) + AND NOT EXISTS ( + SELECT email FROM mail_user + WHERE (email = '%s' OR email = {address_without_extension}) + AND EXISTS ( + SELECT domain_id FROM mail_domain + WHERE domain = SUBSTRING_INDEX('%s', '@', -1) + AND active = 'y' AND server_id = {server_id} + ) + AND server_id = {server_id} + ) + AND NOT EXISTS ( + SELECT source FROM mail_forwarding + WHERE (source = '%s' OR source = {address_without_extension}) + AND active = 'y' AND server_id = {server_id} + ) + UNION + SELECT s.destination AS target FROM mail_forwarding AS s + INNER JOIN mail_forwarding AS s2 + ON ( s2.source = '@%d' + AND s2.type = 'aliasdomain' + AND s2.active = 'y' + AND s2.server_id = {server_id}) + WHERE s.source = {address_without_extension} + AND s.type IN ('alias', 'forward') + AND s.active = 'y' + AND s.server_id = {server_id} -- GitLab From b57e784b96359b74053e15f929d2d5f6513b2152 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 19 Mar 2024 21:36:42 +0100 Subject: [PATCH 2/5] Add an extra placeholder address_without_extension_alt_domain as this should look for the joined alias domain, not %d --- install/lib/installer_base.lib.php | 3 +++ install/tpl/mysql-virtual_forwardings.cf.master | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 0041670225..e6f290f9c5 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -883,8 +883,10 @@ class installer_base extends stdClass { $addr_cleanup = "SUBSTRING_INDEX({$addr_cleanup}, '{$recipient_delimiter}', 1)"; } $no_addr_extension = "CONCAT({$addr_cleanup}, '@%d')"; + $no_addr_extension_alt_domain = "CONCAT({$addr_cleanup}, 's2.destination')"; } else { $no_addr_extension = "''"; + $no_addr_extension_alt_domain = "''"; } unset($out); @@ -896,6 +898,7 @@ class installer_base extends stdClass { $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content); $content = str_replace('{server_id}', $conf['server_id'], $content); $content = str_replace('{address_without_extension}', $no_addr_extension, $content); + $content = str_replace('{address_without_extension_alt_domain}', $no_addr_extension_alt_domain, $content); wf($full_file_name, $content); //* Changing mode and group of the new created config file diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index d2352f7804..aa47e7991b 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -30,7 +30,7 @@ query = SELECT s.destination AS target FROM mail_forwarding AS s AND s2.type = 'aliasdomain' AND s2.active = 'y' AND s2.server_id = {server_id}) - WHERE s.source = {address_without_extension} + WHERE s.source = {address_without_extension_alt_domain} AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} -- GitLab From ab0992deecf40be9c51a071dd81d3e5f5e079b36 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 19 Mar 2024 21:37:07 +0100 Subject: [PATCH 3/5] Add Additional UNION suggested by doekia --- install/tpl/mysql-virtual_forwardings.cf.master | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index aa47e7991b..15b164e9c8 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -34,3 +34,12 @@ query = SELECT s.destination AS target FROM mail_forwarding AS s AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} + UNION + SELECT u.email AS target FROM mail_user AS u + INNER JOIN mail_forwarding AS s2 + ON ( s2.source = '@%d' + AND s2.type = 'aliasdomain' + AND s2.active = 'y' + AND s2.server_id = {server_id}) + WHERE (u.email = {address_without_extension_alt_domain}) + AND u.server_id = 1 -- GitLab From aab73c0d8afddb73238bd6a1d079b504551541fc Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 19 Mar 2024 21:45:19 +0100 Subject: [PATCH 4/5] Add inline comments to explain the parts --- install/tpl/mysql-virtual_forwardings.cf.master | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index 15b164e9c8..d376cfc85d 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -2,13 +2,16 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT s.destination AS target FROM mail_forwarding AS s +query = /* The most basic forward */ + SELECT s.destination AS target FROM mail_forwarding AS s WHERE (s.source = '%s' OR s.source = {address_without_extension}) AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} UNION + /* Handle catchall */ SELECT s.destination AS target FROM mail_forwarding AS s WHERE s.source = '@%d' AND s.type = 'catchall' AND s.active = 'y' AND s.server_id = {server_id} AND NOT EXISTS ( + /* Exclude an address that exists as a mail_user */ SELECT email FROM mail_user WHERE (email = '%s' OR email = {address_without_extension}) AND EXISTS ( @@ -19,11 +22,13 @@ query = SELECT s.destination AS target FROM mail_forwarding AS s AND server_id = {server_id} ) AND NOT EXISTS ( + /* Exclude an address that has a specific forward */ SELECT source FROM mail_forwarding WHERE (source = '%s' OR source = {address_without_extension}) AND active = 'y' AND server_id = {server_id} ) UNION + /* Get all forwards, lookup localpart on active alias domains on this server*/ SELECT s.destination AS target FROM mail_forwarding AS s INNER JOIN mail_forwarding AS s2 ON ( s2.source = '@%d' @@ -35,6 +40,7 @@ query = SELECT s.destination AS target FROM mail_forwarding AS s AND s.active = 'y' AND s.server_id = {server_id} UNION + /* Get all users, lookup localpart on active alias domains on this server */ SELECT u.email AS target FROM mail_user AS u INNER JOIN mail_forwarding AS s2 ON ( s2.source = '@%d' -- GitLab From dcbf40070b181c3275780243f5238d1060a1ab32 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 9 Apr 2024 08:17:52 +0200 Subject: [PATCH 5/5] space OCD --- install/tpl/mysql-virtual_forwardings.cf.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index d376cfc85d..d21721d136 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -28,7 +28,7 @@ query = /* The most basic forward */ AND active = 'y' AND server_id = {server_id} ) UNION - /* Get all forwards, lookup localpart on active alias domains on this server*/ + /* Get all forwards, lookup localpart on active alias domains on this server */ SELECT s.destination AS target FROM mail_forwarding AS s INNER JOIN mail_forwarding AS s2 ON ( s2.source = '@%d' -- GitLab