From f11ceacf896b5de2fa82363c4021d9340f2216cb Mon Sep 17 00:00:00 2001 From: Michael Kaufmann Date: Sat, 29 Feb 2020 09:50:29 +0100 Subject: [PATCH] store ace-string of domain besides idn-converted string to have correct sorting in the frontend; fixes #809 Signed-off-by: Michael Kaufmann --- admin_domains.php | 2 +- customer_domains.php | 2 +- customer_email.php | 6 ++--- install/froxlor.sql | 3 ++- .../updates/froxlor/0.10/update_0.10.inc.php | 23 ++++++++++++++++++- lib/Froxlor/Api/Commands/Domains.php | 2 ++ lib/Froxlor/Api/Commands/SubDomains.php | 5 +++- lib/Froxlor/Froxlor.php | 2 +- templates/Sparkle/admin/domains/domains.tpl | 2 +- .../Sparkle/customer/domains/domainlist.tpl | 2 +- tests/Certificates/CertificatesTest.php | 4 ++-- tests/Domains/DomainsTest.php | 23 +++++++++++++++++++ 12 files changed, 63 insertions(+), 13 deletions(-) diff --git a/admin_domains.php b/admin_domains.php index fa9686a7..b4f62e61 100644 --- a/admin_domains.php +++ b/admin_domains.php @@ -39,7 +39,7 @@ if ($page == 'domains' || $page == 'overview') { $log->logAction(\Froxlor\FroxlorLogger::ADM_ACTION, LOG_NOTICE, "viewed admin_domains"); $fields = array( - 'd.domain' => $lng['domains']['domainname'], + 'd.domain_ace' => $lng['domains']['domainname'], 'c.name' => $lng['customer']['name'], 'c.firstname' => $lng['customer']['firstname'], 'c.company' => $lng['customer']['company'], diff --git a/customer_domains.php b/customer_domains.php index ba285c95..26fe3833 100644 --- a/customer_domains.php +++ b/customer_domains.php @@ -42,7 +42,7 @@ if ($page == 'overview') { if ($action == '') { $log->logAction(\Froxlor\FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_domains::domains"); $fields = array( - 'd.domain' => $lng['domains']['domainname'], + 'd.domain_ace' => $lng['domains']['domainname'], 'd.aliasdomain' => $lng['domains']['aliasdomain'] ); try { diff --git a/customer_email.php b/customer_email.php index c776c707..3e8bd67e 100644 --- a/customer_email.php +++ b/customer_email.php @@ -44,7 +44,7 @@ if ($page == 'overview') { if ($action == '') { $log->logAction(\Froxlor\FroxlorLogger::USR_ACTION, LOG_NOTICE, "viewed customer_email::emails"); $fields = array( - 'd.domain' => $lng['domains']['domainname'], + 'd.domain_ace' => $lng['domains']['domainname'], 'm.email_full' => $lng['emails']['emailaddress'], 'm.destination' => $lng['emails']['forwarders'] ); @@ -76,7 +76,7 @@ if ($page == 'overview') { $emails[$row['domain']][$row['email_full']] = $row; } - if ($paging->sortfield == 'd.domain' && $paging->sortorder == 'desc') { + if ($paging->sortfield == 'd.domain_ace' && $paging->sortorder == 'desc') { krsort($emails); } else { ksort($emails); @@ -195,7 +195,7 @@ if ($page == 'overview') { $result_stmt = Database::prepare("SELECT `id`, `domain`, `customerid` FROM `" . TABLE_PANEL_DOMAINS . "` WHERE `customerid`= :cid AND `isemaildomain`='1' - ORDER BY `domain` ASC"); + ORDER BY `domain_ace` ASC"); Database::pexecute($result_stmt, array( "cid" => $userinfo['customerid'] )); diff --git a/install/froxlor.sql b/install/froxlor.sql index a0ff604e..3034a104 100644 --- a/install/froxlor.sql +++ b/install/froxlor.sql @@ -224,6 +224,7 @@ DROP TABLE IF EXISTS `panel_domains`; CREATE TABLE `panel_domains` ( `id` int(11) unsigned NOT NULL auto_increment, `domain` varchar(255) NOT NULL default '', + `domain_ace` varchar(255) NOT NULL default '', `adminid` int(11) unsigned NOT NULL default '0', `customerid` int(11) unsigned NOT NULL default '0', `aliasdomain` int(11) unsigned NULL, @@ -704,7 +705,7 @@ opcache.interned_strings_buffer'), ('panel', 'customer_hide_options', ''), ('panel', 'is_configured', '0'), ('panel', 'version', '0.10.13'), - ('panel', 'db_version', '201912313'); + ('panel', 'db_version', '202002290'); DROP TABLE IF EXISTS `panel_tasks`; diff --git a/install/updates/froxlor/0.10/update_0.10.inc.php b/install/updates/froxlor/0.10/update_0.10.inc.php index 3da2dea7..fa421aeb 100644 --- a/install/updates/froxlor/0.10/update_0.10.inc.php +++ b/install/updates/froxlor/0.10/update_0.10.inc.php @@ -546,7 +546,7 @@ if (\Froxlor\Froxlor::isFroxlorVersion('0.10.10')) { if (\Froxlor\Froxlor::isDatabaseVersion('201912311')) { showUpdateStep("Migrate logfiles_format setting"); $current_format = Settings::Set('system.logfiles_format'); - if (!empty($current_format)) { + if (! empty($current_format)) { Settings::Set('system.logfiles_format', '"' . Settings::Get('system.logfiles_format') . '"'); lastStepStatus(0); } else { @@ -571,3 +571,24 @@ if (\Froxlor\Froxlor::isFroxlorVersion('0.10.12')) { showUpdateStep("Updating from 0.10.12 to 0.10.13", false); \Froxlor\Froxlor::updateToVersion('0.10.13'); } + +if (\Froxlor\Froxlor::isDatabaseVersion('201912313')) { + showUpdateStep("Adding new field to domains table"); + Database::query("ALTER TABLE `" . TABLE_PANEL_DOMAINS . "` ADD `domain_ace` varchar(255) NOT NULL default '' AFTER `domain`;"); + lastStepStatus(0); + + showUpdateStep("Updating domain entries"); + $upd_stmt = Database::prepare("UPDATE `" . TABLE_PANEL_DOMAINS . "` SET `domain_ace` = :ace WHERE `id` = :domainid"); + $sel_stmt = Database::prepare("SELECT id, domain FROM `" . TABLE_PANEL_DOMAINS . "` ORDER BY id ASC"); + Database::pexecute($sel_stmt); + $idna_convert = new \Froxlor\Idna\IdnaWrapper(); + while ($domain = $sel_stmt->fetch(\PDO::FETCH_ASSOC)) { + Database::pexecute($upd_stmt, [ + 'ace' => $idna_convert->decode($domain['domain']), + 'domainid' => $domain['id'] + ]); + } + lastStepStatus(0); + + \Froxlor\Froxlor::updateToDbVersion('202002290'); +} diff --git a/lib/Froxlor/Api/Commands/Domains.php b/lib/Froxlor/Api/Commands/Domains.php index c9e6dfda..bc572b3c 100644 --- a/lib/Froxlor/Api/Commands/Domains.php +++ b/lib/Froxlor/Api/Commands/Domains.php @@ -684,6 +684,7 @@ class Domains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\ResourceEn $ins_data = array( 'domain' => $domain, + 'domain_ace' => $idna_convert->decode($domain), 'customerid' => $customerid, 'adminid' => $adminid, 'documentroot' => $documentroot, @@ -732,6 +733,7 @@ class Domains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\ResourceEn $ins_stmt = Database::prepare(" INSERT INTO `" . TABLE_PANEL_DOMAINS . "` SET `domain` = :domain, + `domain_ace` = :domain_ace, `customerid` = :customerid, `adminid` = :adminid, `documentroot` = :documentroot, diff --git a/lib/Froxlor/Api/Commands/SubDomains.php b/lib/Froxlor/Api/Commands/SubDomains.php index 91addb6d..18d332a3 100644 --- a/lib/Froxlor/Api/Commands/SubDomains.php +++ b/lib/Froxlor/Api/Commands/SubDomains.php @@ -256,6 +256,7 @@ class SubDomains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\Resourc `customerid` = :customerid, `adminid` = :adminid, `domain` = :domain, + `domain_ace` = :domain_ace, `documentroot` = :documentroot, `aliasdomain` = :aliasdomain, `parentdomainid` = :parentdomainid, @@ -287,6 +288,7 @@ class SubDomains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\Resourc "customerid" => $customer['customerid'], "adminid" => $customer['adminid'], "domain" => $completedomain, + "domain_ace" => $idna_convert->decode($completedomain), "documentroot" => $path, "aliasdomain" => $aliasdomain != 0 ? $aliasdomain : null, "parentdomainid" => $domain_check['id'], @@ -765,6 +767,7 @@ class SubDomains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\Resourc '`d`.`id`', '`d`.`customerid`', '`d`.`domain`', + '`d`.`domain_ace`', '`d`.`documentroot`', '`d`.`isbinddomain`', '`d`.`isemaildomain`', @@ -780,7 +783,7 @@ class SubDomains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\Resourc // prepare select statement $domains_stmt = Database::prepare(" - SELECT " . implode(",", $select_fields) . ", IF(`d`.`parentdomainid` > 0, `pd`.`domain`, `d`.`domain`) AS `parentdomainname`, `ad`.`id` AS `aliasdomainid`, `ad`.`domain` AS `aliasdomain`, `da`.`id` AS `domainaliasid`, `da`.`domain` AS `domainalias` + SELECT " . implode(",", $select_fields) . ", IF(`d`.`parentdomainid` > 0, `pd`.`domain_ace`, `d`.`domain_ace`) AS `parentdomainname`, `ad`.`id` AS `aliasdomainid`, `ad`.`domain` AS `aliasdomain`, `da`.`id` AS `domainaliasid`, `da`.`domain` AS `domainalias` FROM `" . TABLE_PANEL_DOMAINS . "` `d` LEFT JOIN `" . TABLE_PANEL_DOMAINS . "` `ad` ON `d`.`aliasdomain`=`ad`.`id` LEFT JOIN `" . TABLE_PANEL_DOMAINS . "` `da` ON `da`.`aliasdomain`=`d`.`id` diff --git a/lib/Froxlor/Froxlor.php b/lib/Froxlor/Froxlor.php index 3131a078..3ea62d39 100644 --- a/lib/Froxlor/Froxlor.php +++ b/lib/Froxlor/Froxlor.php @@ -10,7 +10,7 @@ final class Froxlor const VERSION = '0.10.13'; // Database version (YYYYMMDDC where C is a daily counter) - const DBVERSION = '201912313'; + const DBVERSION = '202002290'; // Distribution branding-tag (used for Debian etc.) const BRANDING = ''; diff --git a/templates/Sparkle/admin/domains/domains.tpl b/templates/Sparkle/admin/domains/domains.tpl index 952f94f5..0f90814d 100644 --- a/templates/Sparkle/admin/domains/domains.tpl +++ b/templates/Sparkle/admin/domains/domains.tpl @@ -30,7 +30,7 @@ - + diff --git a/templates/Sparkle/customer/domains/domainlist.tpl b/templates/Sparkle/customer/domains/domainlist.tpl index 5325ee92..ecce85a3 100644 --- a/templates/Sparkle/customer/domains/domainlist.tpl +++ b/templates/Sparkle/customer/domains/domainlist.tpl @@ -27,7 +27,7 @@
{$lng['domains']['domainname']} {$arrowcode['d.domain']}{$lng['domains']['domainname']} {$arrowcode['d.domain_ace']} {$lng['admin']['ipsandports']['ip']} {$lng['admin']['customer']} {$arrowcode['c.loginname']} {$lng['panel']['options']}
- + diff --git a/tests/Certificates/CertificatesTest.php b/tests/Certificates/CertificatesTest.php index cf33fbce..b1430bbc 100644 --- a/tests/Certificates/CertificatesTest.php +++ b/tests/Certificates/CertificatesTest.php @@ -64,7 +64,7 @@ class CertificatesTest extends TestCase 'ssl_key_file' => $certdata['key'] ))->add(); $result = json_decode($json_result, true)['data']; - $this->assertEquals(5, $result['domainid']); + $this->assertEquals(6, $result['domainid']); } public function testAdminCertificatesList() @@ -148,7 +148,7 @@ class CertificatesTest extends TestCase 'ssl_key_file' => $certdata['key'] ))->update(); $result = json_decode($json_result, true)['data']; - $this->assertEquals(5, $result['domainid']); + $this->assertEquals(6, $result['domainid']); $this->assertEquals(str_replace("\n", "", $certdata['cert']), str_replace("\n", "", $result['ssl_cert_file'])); } diff --git a/tests/Domains/DomainsTest.php b/tests/Domains/DomainsTest.php index f3aa40dc..ee186835 100644 --- a/tests/Domains/DomainsTest.php +++ b/tests/Domains/DomainsTest.php @@ -347,4 +347,27 @@ class DomainsTest extends TestCase $this->expectExceptionMessage("Not allowed to execute given command."); $json_result = Domains::getLocal($customer_userdata)->listingCount(); } + + public function testAdminIdnDomainsAdd() + { + global $admin_userdata; + // get customer + $json_result = Customers::getLocal($admin_userdata, array( + 'loginname' => 'test1' + ))->get(); + $customer_userdata = json_decode($json_result, true)['data']; + $data = [ + 'domain' => 'täst.local', + 'customerid' => $customer_userdata['customerid'] + ]; + $json_result = Domains::getLocal($admin_userdata, $data)->add(); + $result = json_decode($json_result, true)['data']; + $this->assertEquals($customer_userdata['documentroot'] . 'xn--tst-qla.local/', $result['documentroot']); + $this->assertEquals('xn--tst-qla.local', $result['domain']); + $this->assertEquals('täst.local', $result['domain_ace']); + + Domains::getLocal($admin_userdata, [ + 'domainname' => 'täst.local' + ])->delete(); + } }
{$lng['domains']['domainname']} {$arrowcode['d.domain']}{$lng['domains']['domainname']} {$arrowcode['d.domain_ace']} {$lng['panel']['path']} {$lng['panel']['options']}