From d6363ba9dd38e98c8f2d48085677c4bafdfdc7cd Mon Sep 17 00:00:00 2001
From: mcramer <m.cramer@pixcept.de>
Date: Thu, 27 Sep 2012 08:46:29 +0000
Subject: [PATCH] Fixed: Added missing idn converts to mail functions Added:
 Changed idn function to support multi-line fields (like mail forward)

---
 interface/lib/classes/functions.inc.php       | 88 ++++++++++---------
 interface/lib/classes/tform.inc.php           | 11 +++
 interface/web/mail/form/mail_user.tform.php   |  7 ++
 interface/web/mail/list/mail_user.list.php    |  3 +
 interface/web/mail/mail_alias_edit.php        | 10 ++-
 interface/web/mail/mail_aliasdomain_edit.php  | 15 ++--
 .../web/mail/mail_domain_catchall_edit.php    | 12 +--
 interface/web/mail/mail_forward_edit.php      | 12 +--
 interface/web/mail/mail_user_edit.php         | 14 +--
 9 files changed, 103 insertions(+), 69 deletions(-)

diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php
index fcb6055c6f..0801c1c370 100644
--- a/interface/lib/classes/functions.inc.php
+++ b/interface/lib/classes/functions.inc.php
@@ -315,7 +315,7 @@ class functions {
     /** IDN converter wrapper.
      * all converter classes should be placed in ISPC_CLASS_PATH.'/idn/'
      */
-    public function idn_encode($domain) {
+    private function _idn_encode_decode($domain, $encode = true) {
         if($domain == '') return '';
         if(preg_match('/^[0-9\.]+$/', $domain)) return $domain; // may be an ip address - anyway does not need to bee encoded
         
@@ -326,56 +326,60 @@ class functions {
             $domain = substr($domain, strrpos($domain, '@') + 1);
         }
         
-        if(function_exists('idn_to_ascii')) {
-            $domain = idn_to_ascii($domain);
-        } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) {
-             /* use idna class:
-             * @author  Matthias Sommerfeld <mso@phlylabs.de>
-             * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de
-             * @version 0.8.0 2011-03-11
-             */
-            
-            if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') {
-                include_once(ISPC_CLASS_PATH.'/idn/idna_convert.class.php');
-                $this->idn_converter = new idna_convert(array('idn_version' => 2008));
-                $this->idn_converter_name = 'idna_convert.class';
+        if($encode == true) {
+            if(function_exists('idn_to_ascii')) {
+                $domain = idn_to_ascii($domain);
+            } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) {
+                 /* use idna class:
+                 * @author  Matthias Sommerfeld <mso@phlylabs.de>
+                 * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de
+                 * @version 0.8.0 2011-03-11
+                 */
+                
+                if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') {
+                    include_once(ISPC_CLASS_PATH.'/idn/idna_convert.class.php');
+                    $this->idn_converter = new idna_convert(array('idn_version' => 2008));
+                    $this->idn_converter_name = 'idna_convert.class';
+                }
+                $domain = $this->idn_converter->encode($domain);
+            }
+        } else {
+            if(function_exists('idn_to_utf8')) {
+                $domain = idn_to_utf8($domain);
+            } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) {
+                 /* use idna class:
+                 * @author  Matthias Sommerfeld <mso@phlylabs.de>
+                 * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de
+                 * @version 0.8.0 2011-03-11
+                 */
+                
+                if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') {
+                    include_once(ISPC_CLASS_PATH.'/idn/idna_convert.class.php');
+                    $this->idn_converter = new idna_convert(array('idn_version' => 2008));
+                    $this->idn_converter_name = 'idna_convert.class';
+                }
+                $domain = $this->idn_converter->decode($domain);
             }
-            $domain = $this->idn_converter->encode($domain);
         }
         
         if($user_part !== false) return $user_part . '@' . $domain;
         else return $domain;
     }
+     
+    public function idn_encode($domain) {
+        $domains = explode("\n", $domain);
+        for($d = 0; $d < count($domains); $d++) {
+            $domains[$d] = $this->_idn_encode_decode($domains[$d], true);
+        }
+        return implode("\n", $domains);
+    }
     
     public function idn_decode($domain) {
-        if($domain == '') return '';
-        if(preg_match('/^[0-9\.]+$/', $domain)) return $domain; // may be an ip address - anyway does not need to bee decoded
-        
-        // get domain and user part if it is an email
-        $user_part = false;
-        if(strpos($domain, '@') !== false) {
-            $user_part = substr($domain, 0, strrpos($domain, '@'));
-            $domain = substr($domain, strrpos($domain, '@') + 1);
+        $domains = explode("\n", $domain);
+        for($d = 0; $d < count($domains); $d++) {
+            $domains[$d] = $this->_idn_encode_decode($domains[$d], false);
         }
-        if(function_exists('idn_to_utf8')) {
-            $domain = idn_to_utf8($domain);
-        } elseif(file_exists(ISPC_CLASS_PATH.'/idn/idna_convert.class.php')) {
-             /* use idna class:
-             * @author  Matthias Sommerfeld <mso@phlylabs.de>
-             * @copyright 2004-2011 phlyLabs Berlin, http://phlylabs.de
-             * @version 0.8.0 2011-03-11
-             */
-            
-            if(!is_object($this->idn_converter) || $this->idn_converter_name != 'idna_convert.class') {
-                include_once(ISPC_CLASS_PATH.'/idn/idna_convert.class.php');
-                $this->idn_converter = new idna_convert(array('idn_version' => 2008));
-                $this->idn_converter_name = 'idna_convert.class';
-            }
-            $domain = $this->idn_converter->decode($domain);
-        }
-        
-        if($user_part !== false) return $user_part . '@' . $domain;
-        else return $domain;
+        return implode("\n", $domains);
     }
 		
 }
diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php
index b6cc343e6e..7789a81e36 100644
--- a/interface/lib/classes/tform.inc.php
+++ b/interface/lib/classes/tform.inc.php
@@ -276,6 +276,17 @@ class tform {
                                 $this->errorMessage .= "Custom datasource class or function is empty<br />\r\n";
                         }
                 }
+                
+                if(isset($field['filters']) && is_array($field['filters'])) {
+                    $new_values = array();
+                    foreach($values as $index => $value) {
+                        $new_index = $this->filterField($index, $index, $field['filters'], 'SHOW');
+                        $new_values[$new_index] = $this->filterField($index, (isset($values[$index]))?$values[$index]:'', $field['filters'], 'SHOW');
+                    }
+                    $values = $new_values;
+                    unset($new_values);
+                    unset($new_index);
+                }
 
                 return $values;
 
diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php
index f01e96eda1..8d27e56ada 100644
--- a/interface/web/mail/form/mail_user.tform.php
+++ b/interface/web/mail/form/mail_user.tform.php
@@ -96,6 +96,13 @@ $form["tabs"]['mailuser'] = array (
     'login' => array (
       'datatype'  => 'VARCHAR',
       'formtype'  => 'TEXT',
+            'filters'   => array( 0 => array( 'event' => 'SAVE',
+                                              'type' => 'IDNTOASCII'),
+                                  1 => array( 'event' => 'SHOW',
+                                              'type' => 'IDNTOUTF8'),
+                                  2 => array( 'event' => 'SAVE',
+                                              'type' => 'TOLOWER')
+                                ),
       'validators'  => array (
                     0 => array (  'type'  => 'UNIQUE',
                             'errmsg'=> 'login_error_unique'),
diff --git a/interface/web/mail/list/mail_user.list.php b/interface/web/mail/list/mail_user.list.php
index 7e7868391f..8d0377355b 100644
--- a/interface/web/mail/list/mail_user.list.php
+++ b/interface/web/mail/list/mail_user.list.php
@@ -61,6 +61,9 @@ $liste["item"][] = array(   'field'     => "email",
 
 $liste["item"][] = array(   'field'     => "login",
                             'datatype'  => "VARCHAR",
+                            'filters'   => array( 0 => array( 'event' => 'SHOW',
+                                                              'type' => 'IDNTOUTF8')
+                                                ),
                             'formtype'  => "TEXT",
                             'op'        => "like",
                             'prefix'    => "%",
diff --git a/interface/web/mail/mail_alias_edit.php b/interface/web/mail/mail_alias_edit.php
index ebc3a87625..b7219d71c9 100644
--- a/interface/web/mail/mail_alias_edit.php
+++ b/interface/web/mail/mail_alias_edit.php
@@ -72,6 +72,7 @@ class page_action extends tform_actions {
 		$email = $this->dataRecord["source"];
 		$email_parts = explode("@",$email);
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
+        $email_parts[1] = $app->functions->idn_decode($email_parts[1]);
 		
 		// Getting Domains of the user
 		// $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
@@ -80,6 +81,7 @@ class page_action extends tform_actions {
 		$domain_select = '';
 		if(is_array($domains)) {
 			foreach( $domains as $domain) {
+                $domain['domain'] = $app->functions->idn_decode($domain['domain']);
 				$selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':'';
 				$domain_select .= "<option value='$domain[domain]' $selected>$domain[domain]</option>\r\n";
 			}
@@ -93,8 +95,8 @@ class page_action extends tform_actions {
 		global $app, $conf;
 		
 		// Check if Domain belongs to user
-		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
-		if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
+		if($domain["domain"] != $app->functions->idn_encode($_POST["email_domain"])) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
 		
 		// Check the client limits, if user is not the admin
 		if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
@@ -114,7 +116,7 @@ class page_action extends tform_actions {
 		
 		 		
 		// compose the email field
-		$this->dataRecord["source"] = $_POST["email_local_part"]."@".$_POST["email_domain"];
+		$this->dataRecord["source"] = $_POST["email_local_part"]."@".$app->functions->idn_encode($_POST["email_domain"]);
 		// Set the server id of the mailbox = server ID of mail domain.
 		$this->dataRecord["server_id"] = $domain["server_id"];
 		
@@ -141,7 +143,7 @@ class page_action extends tform_actions {
 	function onAfterInsert() {
 		global $app;
 		
-		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
+		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
 		$app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id);
 		
 	}
diff --git a/interface/web/mail/mail_aliasdomain_edit.php b/interface/web/mail/mail_aliasdomain_edit.php
index e993c4db89..8c7b554b2e 100644
--- a/interface/web/mail/mail_aliasdomain_edit.php
+++ b/interface/web/mail/mail_aliasdomain_edit.php
@@ -69,8 +69,8 @@ class page_action extends tform_actions {
 	function onShowEnd() {
 		global $app, $conf;
 		
-		$source_domain = substr($this->dataRecord["source"],1);
-		$destination_domain = substr($this->dataRecord["destination"],1);
+		$source_domain = $app->functions->idn_decode(substr($this->dataRecord["source"],1));
+		$destination_domain = $app->functions->idn_decode(substr($this->dataRecord["destination"],1));
 		
 		// Getting Domains of the user
 		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
@@ -80,6 +80,7 @@ class page_action extends tform_actions {
 		$destination_select = '';
 		if(is_array($domains)) {
 			foreach( $domains as $domain) {
+                $domain['domain'] = $app->functions->idn_decode($domain['domain']);
 				$selected = ($domain["domain"] == @$source_domain)?'SELECTED':'';
 				$source_select .= "<option value='$domain[domain]' $selected>$domain[domain]</option>\r\n";
 				$selected = ($domain["domain"] == @$destination_domain)?'SELECTED':'';
@@ -96,12 +97,12 @@ class page_action extends tform_actions {
 		global $app, $conf;
 		
 		// Check if source Domain belongs to user
-		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["source"])."' AND ".$app->tform->getAuthSQL('r'));
-		if($domain["domain"] != $_POST["source"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["source"]))."' AND ".$app->tform->getAuthSQL('r'));
+		if($domain["domain"] != $app->functions->idn_encode($_POST["source"])) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
 		
 		// Check if the destination domain belongs to the user
-		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["destination"])."' AND ".$app->tform->getAuthSQL('r'));
-		if($domain["domain"] != $_POST["destination"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["destination"]))."' AND ".$app->tform->getAuthSQL('r'));
+		if($domain["domain"] != $app->functions->idn_encode($_POST["destination"])) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
 		
 		// Check the client limits, if user is not the admin
 		if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
@@ -127,7 +128,7 @@ class page_action extends tform_actions {
 	function onAfterInsert() {
 		global $app;
 		
-		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["destination"])."' AND ".$app->tform->getAuthSQL('r'));
+		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["destination"]))."' AND ".$app->tform->getAuthSQL('r'));
 		$app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id);
 		
 	}
diff --git a/interface/web/mail/mail_domain_catchall_edit.php b/interface/web/mail/mail_domain_catchall_edit.php
index c3338cc319..7dc73306c6 100644
--- a/interface/web/mail/mail_domain_catchall_edit.php
+++ b/interface/web/mail/mail_domain_catchall_edit.php
@@ -72,13 +72,15 @@ class page_action extends tform_actions {
 		$email = $this->dataRecord["source"];
 		$email_parts = explode("@",$email);
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
-		
+		$email_parts[1] = $app->functions->idn_decode($email_parts[1]);
+        
 		// Getting Domains of the user
 		$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r');
 		$domains = $app->db->queryAllRecords($sql);
 		$domain_select = '';
 		if(is_array($domains)) {
 			foreach( $domains as $domain) {
+                $domain['domain'] = $app->functions->idn_decode($domain['domain']);
 				$selected = (isset($email_parts[1]) && $domain["domain"] == $email_parts[1])?'SELECTED':'';
 				$domain_select .= "<option value='$domain[domain]' $selected>$domain[domain]</option>\r\n";
 			}
@@ -92,8 +94,8 @@ class page_action extends tform_actions {
 		global $app, $conf;
 		
 		// Check if Domain belongs to user
-		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
-		if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
+		if($domain["domain"] != $app->functions->idn_encode($_POST["email_domain"])) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
 		
 		// Check the client limits, if user is not the admin
 		if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
@@ -112,7 +114,7 @@ class page_action extends tform_actions {
 		} // end if user is not admin
 		 		
 		// compose the email field
-		$this->dataRecord["source"] = "@".$_POST["email_domain"];
+		$this->dataRecord["source"] = "@".$app->functions->idn_encode($_POST["email_domain"]);
 		// Set the server id of the mailbox = server ID of mail domain.
 		$this->dataRecord["server_id"] = $domain["server_id"];
 		
@@ -125,7 +127,7 @@ class page_action extends tform_actions {
 	function onAfterInsert() {
 		global $app;
 		
-		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
+		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
 		$app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id);
 		
 	}
diff --git a/interface/web/mail/mail_forward_edit.php b/interface/web/mail/mail_forward_edit.php
index b8c8d9283d..e9fca47470 100644
--- a/interface/web/mail/mail_forward_edit.php
+++ b/interface/web/mail/mail_forward_edit.php
@@ -72,13 +72,15 @@ class page_action extends tform_actions {
 		$email = $this->dataRecord["source"];
 		$email_parts = explode("@",$email);
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
-		
+		$email_parts[1] = $app->functions->idn_decode($email_parts[1]);
+        
 		// Getting Domains of the user
 		//$sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
 		$sql = "SELECT domain FROM mail_domain WHERE domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain') AND ".$app->tform->getAuthSQL('r')." ORDER BY domain";
 		$domains = $app->db->queryAllRecords($sql);
 		$domain_select = '';
 		foreach( $domains as $domain) {
+            $domain['domain'] = $app->functions->idn_decode($domain['domain']);
 			$selected = (isset($email_parts[1]) && $domain["domain"] == $email_parts[1])?'SELECTED':'';
 			$domain_select .= "<option value='$domain[domain]' $selected>$domain[domain]</option>\r\n";
 		}
@@ -91,8 +93,8 @@ class page_action extends tform_actions {
 		global $app, $conf;
 		
 		// Check if Domain belongs to user
-		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
-		if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
+		$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
+		if($domain["domain"] != $app->functions->idn_encode($_POST["email_domain"])) $app->tform->errorMessage .= $app->tform->wordbook["no_domain_perm"];
 		
 		// Check the client limits, if user is not the admin
 		if($_SESSION["s"]["user"]["typ"] != 'admin') { // if user is not admin
@@ -111,7 +113,7 @@ class page_action extends tform_actions {
 		} // end if user is not admin
 		 		
 		// compose the email field
-		$this->dataRecord["source"] = $_POST["email_local_part"]."@".$_POST["email_domain"];
+		$this->dataRecord["source"] = $_POST["email_local_part"]."@".$app->functions->idn_encode($_POST["email_domain"]);
 		// Set the server id of the mailbox = server ID of mail domain.
 		$this->dataRecord["server_id"] = $domain["server_id"];
 		
@@ -129,7 +131,7 @@ class page_action extends tform_actions {
 	function onAfterInsert() {
 		global $app;
 		
-		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
+		$domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
 		$app->db->query("update mail_forwarding SET sys_groupid = ".$domain['sys_groupid']." WHERE forwarding_id = ".$this->id);
 		
 	}
diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php
index 9fd3d5b971..b80e3eea17 100644
--- a/interface/web/mail/mail_user_edit.php
+++ b/interface/web/mail/mail_user_edit.php
@@ -73,7 +73,8 @@ class page_action extends tform_actions {
 		$email = $this->dataRecord["email"];
 		$email_parts = explode("@",$email);
 		$app->tpl->setVar("email_local_part",$email_parts[0]);
-		
+		$email_parts[1] = $app->functions->idn_decode($email_parts[1]);
+        
 		// Getting Domains of the user
 		// $sql = "SELECT domain, server_id FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain';
 		$sql = "SELECT domain, server_id FROM mail_domain WHERE domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain') AND ".$app->tform->getAuthSQL('r')." ORDER BY domain";
@@ -81,6 +82,7 @@ class page_action extends tform_actions {
 		$domain_select = '';
 		if(is_array($domains)) {
 			foreach( $domains as $domain) {
+                $domain['domain'] = $app->functions->idn_decode($domain['domain']);
 				$selected = ($domain["domain"] == @$email_parts[1])?'SELECTED':'';
 				$domain_select .= "<option value='$domain[domain]' $selected>$domain[domain]</option>\r\n";
 			}
@@ -131,8 +133,8 @@ class page_action extends tform_actions {
 		
 		//* Check if Domain belongs to user
 		if(isset($_POST["email_domain"])) {
-			$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
-			if($domain["domain"] != $_POST["email_domain"]) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm");
+			$domain = $app->db->queryOneRecord("SELECT server_id, domain FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
+			if($domain["domain"] != $app->functions->idn_encode($_POST["email_domain"])) $app->tform->errorMessage .= $app->tform->lng("no_domain_perm");
 		}
 		
 		
@@ -179,7 +181,7 @@ class page_action extends tform_actions {
 		
 		//* compose the email field
 		if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) {
-			$this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$_POST["email_domain"]);
+			$this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$app->functions->idn_encode($_POST["email_domain"]));
 		
 			// Set the server id of the mailbox = server ID of mail domain.
 			$this->dataRecord["server_id"] = $domain["server_id"];
@@ -225,7 +227,7 @@ class page_action extends tform_actions {
 		global $app, $conf;
 		
 		// Set the domain owner as mailbox owner
-		$domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
+		$domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
 		$app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id);
 		
 		// Spamfilter policy
@@ -261,7 +263,7 @@ class page_action extends tform_actions {
 		
 		// Set the domain owner as mailbox owner
 		if(isset($_POST["email_domain"])) {
-			$domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($_POST["email_domain"])."' AND ".$app->tform->getAuthSQL('r'));
+			$domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = '".$app->db->quote($app->functions->idn_encode($_POST["email_domain"]))."' AND ".$app->tform->getAuthSQL('r'));
 			$app->db->query("UPDATE mail_user SET sys_groupid = ".$domain["sys_groupid"]." WHERE mailuser_id = ".$this->id);
 		
 			// Spamfilter policy
-- 
GitLab