From f15ee39b63463563a3430dc28188635c1e6bb654 Mon Sep 17 00:00:00 2001 From: PseudoResonance Date: Mon, 11 Nov 2024 22:00:27 -0800 Subject: [PATCH 1/2] Fix #2752: Domain recipient for address rewrite (cherry picked from commit 40f6d691d8774d6f813153974f8fe462a8db9ab3) --- .../inc/functions.address_rewriting.inc.php | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/data/web/inc/functions.address_rewriting.inc.php b/data/web/inc/functions.address_rewriting.inc.php index 140ae4764..87b882782 100644 --- a/data/web/inc/functions.address_rewriting.inc.php +++ b/data/web/inc/functions.address_rewriting.inc.php @@ -285,7 +285,13 @@ function recipient_map($_action, $_data = null, $attr = null) { ); return false; } - if (!filter_var($new_dest, FILTER_VALIDATE_EMAIL)) { + if (is_valid_domain_name($new_dest)) { + $new_dest_sane = '@' . idn_to_ascii($new_dest, 0, INTL_IDNA_VARIANT_UTS46); + } + elseif (filter_var($new_dest, FILTER_VALIDATE_EMAIL)) { + $new_dest_sane = $new_dest; + } + else { $_SESSION['return'][] = array( 'type' => 'danger', 'log' => array(__FUNCTION__, $_action, $_data, $_attr), @@ -308,7 +314,7 @@ function recipient_map($_action, $_data = null, $attr = null) { (:old_dest, :new_dest, :active)"); $stmt->execute(array( ':old_dest' => $old_dest_sane, - ':new_dest' => $new_dest, + ':new_dest' => $new_dest_sane, ':active' => $active )); $_SESSION['return'][] = array( @@ -351,7 +357,13 @@ function recipient_map($_action, $_data = null, $attr = null) { ); continue; } - if (!filter_var($new_dest, FILTER_VALIDATE_EMAIL)) { + if (is_valid_domain_name($new_dest)) { + $new_dest_sane = '@' . idn_to_ascii($new_dest, 0, INTL_IDNA_VARIANT_UTS46); + } + elseif (filter_var($new_dest, FILTER_VALIDATE_EMAIL)) { + $new_dest_sane = $new_dest; + } + else { $_SESSION['return'][] = array( 'type' => 'danger', 'log' => array(__FUNCTION__, $_action, $_data, $_attr), @@ -378,7 +390,7 @@ function recipient_map($_action, $_data = null, $attr = null) { WHERE `id`= :id"); $stmt->execute(array( ':old_dest' => $old_dest_sane, - ':new_dest' => $new_dest, + ':new_dest' => $new_dest_sane, ':active' => $active, ':id' => $id )); From e52323bf1dc6f0097d7dc7d103aa770c155b1c7f Mon Sep 17 00:00:00 2001 From: PseudoResonance Date: Mon, 24 Feb 2025 22:36:17 -0800 Subject: [PATCH 2/2] Fix @ prefixing domain rewrite and update localization --- data/web/edit.php | 3 +++ data/web/inc/functions.address_rewriting.inc.php | 6 ++++++ data/web/lang/lang.cs-cz.json | 4 ++-- data/web/lang/lang.da-dk.json | 4 ++-- data/web/lang/lang.de-de.json | 4 ++-- data/web/lang/lang.en-gb.json | 6 +++--- data/web/lang/lang.es-es.json | 2 +- data/web/lang/lang.fi-fi.json | 4 ++-- data/web/lang/lang.fr-fr.json | 4 ++-- data/web/lang/lang.it-it.json | 6 +++--- data/web/lang/lang.ja-jp.json | 2 +- data/web/lang/lang.ko-kr.json | 6 +++--- data/web/lang/lang.nl-nl.json | 4 ++-- data/web/lang/lang.pt-br.json | 4 ++-- data/web/lang/lang.ro-ro.json | 4 ++-- data/web/lang/lang.ru-ru.json | 4 ++-- data/web/lang/lang.sk-sk.json | 4 ++-- data/web/lang/lang.sv-se.json | 4 ++-- 18 files changed, 42 insertions(+), 33 deletions(-) diff --git a/data/web/edit.php b/data/web/edit.php index 4c5cd89e9..b7544a5af 100644 --- a/data/web/edit.php +++ b/data/web/edit.php @@ -166,6 +166,9 @@ if (isset($_SESSION['mailcow_cc_role'])) { if (substr($result['recipient_map_old'], 0, 1) == '@') { $result['recipient_map_old'] = substr($result['recipient_map_old'], 1); } + if (substr($result['recipient_map_new'], 0, 1) == '@') { + $result['recipient_map_new'] = substr($result['recipient_map_new'], 1); + } $template = 'edit/recipient_map.twig'; $template_data = ['map' => $map]; } diff --git a/data/web/inc/functions.address_rewriting.inc.php b/data/web/inc/functions.address_rewriting.inc.php index 87b882782..0c89d001e 100644 --- a/data/web/inc/functions.address_rewriting.inc.php +++ b/data/web/inc/functions.address_rewriting.inc.php @@ -270,6 +270,9 @@ function recipient_map($_action, $_data = null, $attr = null) { $old_dest = substr($old_dest, 1); } $new_dest = strtolower(trim($_data['recipient_map_new'])); + if (substr($new_dest, 0, 1) == '@') { + $new_dest = substr($new_dest, 1); + } $active = intval($_data['active']); if (is_valid_domain_name($old_dest)) { $old_dest_sane = '@' . idn_to_ascii($old_dest, 0, INTL_IDNA_VARIANT_UTS46); @@ -331,6 +334,9 @@ function recipient_map($_action, $_data = null, $attr = null) { $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $new_dest = (!empty($_data['recipient_map_new'])) ? $_data['recipient_map_new'] : $is_now['recipient_map_new']; $old_dest = (!empty($_data['recipient_map_old'])) ? $_data['recipient_map_old'] : $is_now['recipient_map_old']; + if (substr($new_dest, 0, 1) == '@') { + $new_dest = substr($new_dest, 1); + } if (substr($old_dest, 0, 1) == '@') { $old_dest = substr($old_dest, 1); } diff --git a/data/web/lang/lang.cs-cz.json b/data/web/lang/lang.cs-cz.json index e75601b5a..32b74efde 100644 --- a/data/web/lang/lang.cs-cz.json +++ b/data/web/lang/lang.cs-cz.json @@ -869,7 +869,7 @@ "recipient_map": "Mapa příjemce", "recipient_map_info": "Mapy příjemců slouží k nahrazení cílové adresy zprávy před doručením.", "recipient_map_new": "Nový přijemce", - "recipient_map_new_info": "Cílová adresa mapy příjemce musí být platná emailová adresa.", + "recipient_map_new_info": "Cílová adresa mapy příjemce musí být emailová adresa nebo název domény.", "recipient_map_old": "Původní příjemce", "recipient_map_old_info": "Původní příjemce musí být platná emailová adresa nebo název domény.", "recipient_maps": "Mapy příjemců", @@ -1307,4 +1307,4 @@ "session_token": "Token formuláře není platný: Token mismatch", "session_ua": "Token formuláře není platný: User-Agent validation error" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.da-dk.json b/data/web/lang/lang.da-dk.json index 9e7977e69..da97c1794 100644 --- a/data/web/lang/lang.da-dk.json +++ b/data/web/lang/lang.da-dk.json @@ -706,7 +706,7 @@ "recipient_map": "Modtagerkort", "recipient_map_info": "Modtagerkort bruges til at erstatte destinationsadressen i en meddelelse, før den leveres.", "recipient_map_new": "Ny modtager", - "recipient_map_new_info": "Modtagerkortdestination skal være en gyldig e-mail-adresse.", + "recipient_map_new_info": "Modtagerkortdestination skal være gyldige e-mail-adresser eller et domænenavn.", "recipient_map_old": "Original modtager", "recipient_map_old_info": "En modtager kortlægger den originale destination, skal være gyldige e-mail-adresser eller et domænenavn.", "recipient_maps": "Modtagerkort", @@ -1089,4 +1089,4 @@ "first": "Først" } } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.de-de.json b/data/web/lang/lang.de-de.json index d80799947..6047e9ef5 100644 --- a/data/web/lang/lang.de-de.json +++ b/data/web/lang/lang.de-de.json @@ -881,7 +881,7 @@ "recipient_map": "Empfängerumschreibung", "recipient_map_info": "Empfängerumschreibung ersetzen den Empfänger einer E-Mail vor dem Versand.", "recipient_map_new": "Neuer Empfänger", - "recipient_map_new_info": "Der neue Empfänger muss eine E-Mail-Adresse sein.", + "recipient_map_new_info": "Der neue Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.", "recipient_map_old": "Original-Empfänger", "recipient_map_old_info": "Der originale Empfänger muss eine E-Mail-Adresse oder ein Domainname sein.", "recipient_maps": "Empfängerumschreibungen", @@ -1336,4 +1336,4 @@ "hour": "Nachrichten / Stunde", "day": "Nachrichten / Tag" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index 6b1cdf00f..4138210ec 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -887,9 +887,9 @@ "recipient_map": "Recipient map", "recipient_map_info": "Recipient maps are used to replace the destination address on a message before it is delivered.", "recipient_map_new": "New recipient", - "recipient_map_new_info": "Recipient map destination must be a valid email address.", + "recipient_map_new_info": "Recipient map destination must be a valid email addresses or a domain name.", "recipient_map_old": "Original recipient", - "recipient_map_old_info": "A recipient maps original destination must be valid email addresses or a domain name.", + "recipient_map_old_info": "A recipient maps original destination must be a valid email addresses or a domain name.", "recipient_maps": "Recipient maps", "relay_all": "Relay all recipients", "relay_unknown": "Relay unknown mailboxes", @@ -1336,4 +1336,4 @@ "session_token": "Form token invalid: Token mismatch", "session_ua": "Form token invalid: User-Agent validation error" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.es-es.json b/data/web/lang/lang.es-es.json index 5547692ff..0bb1312b1 100644 --- a/data/web/lang/lang.es-es.json +++ b/data/web/lang/lang.es-es.json @@ -544,7 +544,7 @@ "recipient_map": "Regla de destinatario", "recipient_map_info": "Las reglas de destinatarios se utilizan para reemplazar la dirección de destino en un mensaje antes de que se entregue.", "recipient_map_new": "Destinatario nuevo", - "recipient_map_new_info": "El destino de la regla debe ser una dirección de correo válida.", + "recipient_map_new_info": "El destino de la regla debe ser una dirección de correo electrónico válida o un nombre de dominio.", "recipient_map_old": "Destinatario original", "recipient_map_old_info": "El destino original de una regla de destinatario debe ser una dirección de correo electrónico válida o un nombre de dominio.", "recipient_maps": "Reglas de destinatario", diff --git a/data/web/lang/lang.fi-fi.json b/data/web/lang/lang.fi-fi.json index 6919e1f73..9cb71cf38 100644 --- a/data/web/lang/lang.fi-fi.json +++ b/data/web/lang/lang.fi-fi.json @@ -607,7 +607,7 @@ "recipient_map": "Vastaanottajien yhdistämis määritykset", "recipient_map_info": "Vastaanottajan karttoja käytetään korvaamaan viestin kohde osoite ennen sen toimittamista.", "recipient_map_new": "Uusi vastaanottaja", - "recipient_map_new_info": "Vastaanottajan yhdistämis kartan kohteen on oltava kelvollinen sähköposti osoite.", + "recipient_map_new_info": "Vastaanottajan yhdistämis kartan kohteen on oltava kelvollinen sähköposti osoite tai verkkotunnus alueen nimi.", "recipient_map_old": "Alkuperäinen vastaanottaja", "recipient_map_old_info": "Vastaanottajan yhdistämis määritysten alkuperäisen kohteen on oltava kelvollinen sähköposti osoite tai verkkotunnus alueen nimi.", "recipient_maps": "Vastaanottajien yhdistämis määritykset", @@ -906,4 +906,4 @@ "last": "Edellinen" } } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.fr-fr.json b/data/web/lang/lang.fr-fr.json index 61d62fca3..d531cdc53 100644 --- a/data/web/lang/lang.fr-fr.json +++ b/data/web/lang/lang.fr-fr.json @@ -834,7 +834,7 @@ "recipient_map": "Carte du destinataire", "recipient_map_info": "Les cartes des destinataires sont utilisées pour remplacer l’adresse de destination d’un message avant sa livraison.", "recipient_map_new": "Nouveau destinataire", - "recipient_map_new_info": "La destination de la carte du destinataire doit être une adresse de courriel valide.", + "recipient_map_new_info": "La destination de la carte du destinataire doit être une adresse de courriel valide ou un nom de domaine.", "recipient_map_old": "Destinataire original", "recipient_map_old_info": "Une carte de destination originale doit être une adresse de courriel valide ou un nom de domaine.", "recipient_maps": "Cartes des bénéficiaires", @@ -1335,4 +1335,4 @@ "hour": "msgs / heure", "day": "msgs / jour" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.it-it.json b/data/web/lang/lang.it-it.json index 59a53c09d..69219864f 100644 --- a/data/web/lang/lang.it-it.json +++ b/data/web/lang/lang.it-it.json @@ -822,9 +822,9 @@ "recipient_map": "Recipient map", "recipient_map_info": "Recipient maps are used to replace the destination address on a message before it is delivered.", "recipient_map_new": "New recipient", - "recipient_map_new_info": "Recipient map destination must be a valid email address.", + "recipient_map_new_info": "Recipient map destination must be a valid email addresses or a domain name.", "recipient_map_old": "Original recipient", - "recipient_map_old_info": "A recipient maps original destination must be valid email addresses or a domain name.", + "recipient_map_old_info": "A recipient maps original destination must be a valid email addresses or a domain name.", "recipient_maps": "Recipient maps", "relay_all": "Trasmettere a tutti i destinatari", "remove": "Rimuovi", @@ -1306,4 +1306,4 @@ }, "decimal": "." } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.ja-jp.json b/data/web/lang/lang.ja-jp.json index c6efbb579..683cae373 100644 --- a/data/web/lang/lang.ja-jp.json +++ b/data/web/lang/lang.ja-jp.json @@ -887,7 +887,7 @@ "recipient_map": "受信者マップ", "recipient_map_info": "受信者マップは、メッセージが配信される前に宛先アドレスを置き換えるために使用されます。", "recipient_map_new": "新しい受信者", - "recipient_map_new_info": "受信者マップの宛先は有効なメールアドレスである必要があります。", + "recipient_map_new_info": "受信者マップの宛先は有効なメールアドレスまたはドメイン名である必要があります。", "recipient_map_old": "元の受信者", "recipient_map_old_info": "受信者マップの元の宛先は有効なメールアドレスまたはドメイン名である必要があります。", "recipient_maps": "受信者マップ", diff --git a/data/web/lang/lang.ko-kr.json b/data/web/lang/lang.ko-kr.json index a79793970..27b028cd4 100644 --- a/data/web/lang/lang.ko-kr.json +++ b/data/web/lang/lang.ko-kr.json @@ -673,9 +673,9 @@ "recipient_map": "Recipient map", "recipient_map_info": "Recipient maps are used to replace the destination address on a message before it is delivered.", "recipient_map_new": "New recipient", - "recipient_map_new_info": "Recipient map destination must be a valid email address.", + "recipient_map_new_info": "Recipient map destination must be a valid email addresses or a domain name.", "recipient_map_old": "Original recipient", - "recipient_map_old_info": "A recipient maps original destination must be valid email addresses or a domain name.", + "recipient_map_old_info": "A recipient maps original destination must be a valid email addresses or a domain name.", "recipient_maps": "Recipient maps", "relay_all": "모든 수신자에게 릴레이", "remove": "Remove", @@ -1018,4 +1018,4 @@ "session_token": "Form token invalid: Token mismatch", "session_ua": "Form token invalid: User-Agent validation error" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.nl-nl.json b/data/web/lang/lang.nl-nl.json index 79c8baa9a..e7308c379 100644 --- a/data/web/lang/lang.nl-nl.json +++ b/data/web/lang/lang.nl-nl.json @@ -764,7 +764,7 @@ "recipient_map": "Ontvanger-map", "recipient_map_info": "Ontvanger-maps worden gebruikt om het doeladres van een bericht te vervangen voordat het in een mailbox terecht komt.", "recipient_map_new": "Nieuwe ontvanger", - "recipient_map_new_info": "De bestemming van een ontvanger-map dient een geldig mailadres te zijn.", + "recipient_map_new_info": "De bestemming van een ontvanger-map dient een geldig mailadres of domeinnaam te zijn.", "recipient_map_old": "Oorspronkelijke ontvanger", "recipient_map_old_info": "De oorspronkelijke bestemming van een ontvanger-map dient een geldig mailadres of domeinnaam te zijn.", "recipient_maps": "Ontvanger-maps", @@ -1165,4 +1165,4 @@ "search": "Zoeken:", "zeroRecords": "Geen overeenkomsten gevonden" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.pt-br.json b/data/web/lang/lang.pt-br.json index b29298171..a8bdf06f4 100644 --- a/data/web/lang/lang.pt-br.json +++ b/data/web/lang/lang.pt-br.json @@ -882,7 +882,7 @@ "recipient_map": "Mapa do destinatário", "recipient_map_info": "Os mapas de destinatários são usados para substituir o endereço de destino em uma mensagem antes que ela seja entregue.", "recipient_map_new": "Novo destinatário", - "recipient_map_new_info": "O destino do mapa do destinatário deve ser um endereço de e-mail válido.", + "recipient_map_new_info": "O destino do mapa do destinatário deve ser um endereço de e-mail válido ou um nome de domínio.", "recipient_map_old": "Destinatário original", "recipient_map_old_info": "O destino original do mapa de um destinatário deve ser um endereço de e-mail válido ou um nome de domínio.", "recipient_maps": "Mapas de destinatários", @@ -1330,4 +1330,4 @@ "session_token": "Token de formulário inválido: incompatibilidade de token", "session_ua": "Token de formulário inválido: erro de validação do agente de usuário" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.ro-ro.json b/data/web/lang/lang.ro-ro.json index 0a3ef4ba3..9a8736c10 100644 --- a/data/web/lang/lang.ro-ro.json +++ b/data/web/lang/lang.ro-ro.json @@ -789,7 +789,7 @@ "recipient_map": "Hartă destinatar", "recipient_map_info": "Hărțile destinatarilor sunt folosite pentru a înlocui adresa de destinație a unui mesaj înainte de a fi livrat.", "recipient_map_new": "Destinatar nou", - "recipient_map_new_info": "Destinația hărții destinatarului trebuie să fie o adresă de email validă.", + "recipient_map_new_info": "Destinația hărții destinatarului trebuie să fie adrese de email valide sau nume de domeniu.", "recipient_map_old": "Destinatar original", "recipient_map_old_info": "Destinația originală a hărților destinatarilor trebuie să fie adrese de email valide sau nume de domeniu.", "recipient_maps": "Hărți destinatar", @@ -1208,4 +1208,4 @@ "expand_all": "Expandează tot", "decimal": "," } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.ru-ru.json b/data/web/lang/lang.ru-ru.json index a275d6dd5..6591a6028 100644 --- a/data/web/lang/lang.ru-ru.json +++ b/data/web/lang/lang.ru-ru.json @@ -887,7 +887,7 @@ "recipient_map": "Перезапись получателя", "recipient_map_info": "Перезапись получателя используются для замены получателя в сообщении до его доставки.", "recipient_map_new": "Перезапись на", - "recipient_map_new_info": "Должен быть действующим почтовым ящиком.", + "recipient_map_new_info": "Должен быть действующим почтовым ящиком или доменом.", "recipient_map_old": "Получатель", "recipient_map_old_info": "Должен быть действующим почтовым ящиком или доменом.", "recipient_maps": "Перезапись получателя", @@ -1336,4 +1336,4 @@ "session_token": "Неверный токен формы: несоответствие токена", "session_ua": "Неверный токен формы: ошибка проверки User-Agent" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.sk-sk.json b/data/web/lang/lang.sk-sk.json index 06343b732..d79b6ae03 100644 --- a/data/web/lang/lang.sk-sk.json +++ b/data/web/lang/lang.sk-sk.json @@ -822,7 +822,7 @@ "recipient_map": "Mapa príjemcu", "recipient_map_info": "Mapy príjemcov sú používané ako náhrada cieľovej adresy u správy pred doručením.", "recipient_map_new": "Nový príjemca", - "recipient_map_new_info": "Mapový cieľ príjemcu musí byť platná emailová adresa.", + "recipient_map_new_info": "Mapový cieľ príjemcu musí byť platná emailová adresa alebo meno domény.", "recipient_map_old": "Originálny príjemca", "recipient_map_old_info": "Originálny cieľ mapy príjemcu musí byť platná emailová adresa alebo meno domény.", "recipient_maps": "Mapy príjemcov", @@ -1256,4 +1256,4 @@ "session_token": "Formulárový token neplatný: Tokenová nezhoda", "session_ua": "Formulárový token neplatný: User-Agent validation error" } -} \ No newline at end of file +} diff --git a/data/web/lang/lang.sv-se.json b/data/web/lang/lang.sv-se.json index f9cf25d5e..7b1cf4994 100644 --- a/data/web/lang/lang.sv-se.json +++ b/data/web/lang/lang.sv-se.json @@ -726,7 +726,7 @@ "recipient_map": "Mottagaromskrivning", "recipient_map_info": "En omskrivning av mottagaradressen används för att ersätta destinationsadressen i ett meddelande innan den levereras.", "recipient_map_new": "Ny mottagare", - "recipient_map_new_info": "Den ursprungliga mottagaren måste vara en giltig e-postadress.", + "recipient_map_new_info": "Den ursprungliga mottagaren måste vara en giltiga e-postadresser eller ett domännamn.", "recipient_map_old": "Ursprunglig mottagaren", "recipient_map_old_info": "Den ursprungliga mottagaren måste vara en giltiga e-postadresser eller ett domännamn.", "recipient_maps": "Skriv om mottagaradressen", @@ -1110,4 +1110,4 @@ "session_token": "Formulär-nyckeln är ogiltig: Nyckeln matchar inte", "session_ua": "Formulär-nyckeln är ogiltig: User-Agenten kunde inte valideras" } -} \ No newline at end of file +}