diff --git a/lib/classes/api/commands/class.DomainZones.php b/lib/classes/api/commands/class.DomainZones.php
index dbdacad6..0a7dcdf3 100644
--- a/lib/classes/api/commands/class.DomainZones.php
+++ b/lib/classes/api/commands/class.DomainZones.php
@@ -42,8 +42,11 @@ class DomainZones extends ApiCommand implements ResourceEntity
$content = $this->getParam('content', true, null);
$ttl = $this->getParam('ttl', true, 18000);
- // validation
- if ($result['isbinddomain'] != '1') {
+ if ($result['parentdomainid'] != '0') {
+ throw new Exception("DNS zones can only be generated for the main domain, not for subdomains", 406);
+ }
+
+ if ($result['subisbinddomain'] != '1') {
standard_error('dns_domain_nodns', '', true);
}
@@ -291,7 +294,11 @@ class DomainZones extends ApiCommand implements ResourceEntity
));
$id = $result['id'];
- if ($result['isbinddomain'] != '1') {
+ if ($result['parentdomainid'] != '0') {
+ throw new Exception("DNS zones can only be generated for the main domain, not for subdomains", 406);
+ }
+
+ if ($result['subisbinddomain'] != '1') {
standard_error('dns_domain_nodns', '', true);
}
@@ -335,8 +342,11 @@ class DomainZones extends ApiCommand implements ResourceEntity
'id' => $entry_id,
'did' => $id
), true, true);
- // re-generate bind configs
- inserttask('4');
- return $this->response(200, "successfull", true);
+ if ($del_stmt->rowCount() > 0) {
+ // re-generate bind configs
+ inserttask('4');
+ return $this->response(200, "successfull", true);
+ }
+ return $this->response(304, "successfull", true);
}
}
diff --git a/lib/classes/api/commands/class.SubDomains.php b/lib/classes/api/commands/class.SubDomains.php
index 9159587f..b7be8393 100644
--- a/lib/classes/api/commands/class.SubDomains.php
+++ b/lib/classes/api/commands/class.SubDomains.php
@@ -347,7 +347,7 @@ class SubDomains extends ApiCommand implements ResourceEntity
}
if (count($customer_ids) > 0) {
$result_stmt = Database::prepare("
- SELECT d.*, pd.`subcanemaildomain`
+ SELECT d.*, pd.`subcanemaildomain`, pd.`isbinddomain` as subisbinddomain
FROM `" . TABLE_PANEL_DOMAINS . "` d, `" . TABLE_PANEL_DOMAINS . "` pd
WHERE " . ($id > 0 ? "d.`id` = :iddn" : "d.`domain` = :iddn") . " AND d.`customerid` IN (:customerids)
AND ((d.`parentdomainid`!='0' AND pd.`id` = d.`parentdomainid`) OR (d.`parentdomainid`='0' AND pd.`id` = d.`id`))
@@ -361,7 +361,7 @@ class SubDomains extends ApiCommand implements ResourceEntity
}
} else {
$result_stmt = Database::prepare("
- SELECT d.*, pd.`subcanemaildomain`
+ SELECT d.*, pd.`subcanemaildomain`, pd.`isbinddomain` as subisbinddomain
FROM `" . TABLE_PANEL_DOMAINS . "` d, `" . TABLE_PANEL_DOMAINS . "` pd
WHERE " . ($id > 0 ? "d.`id` = :iddn" : "d.`domain` = :iddn") . "
AND ((d.`parentdomainid`!='0' AND pd.`id` = d.`parentdomainid`) OR (d.`parentdomainid`='0' AND pd.`id` = d.`id`))
@@ -375,7 +375,7 @@ class SubDomains extends ApiCommand implements ResourceEntity
throw new Exception("You cannot access this resource", 405);
}
$result_stmt = Database::prepare("
- SELECT d.*, pd.`subcanemaildomain`
+ SELECT d.*, pd.`subcanemaildomain`, pd.`isbinddomain` as subisbinddomain
FROM `" . TABLE_PANEL_DOMAINS . "` d, `" . TABLE_PANEL_DOMAINS . "` pd
WHERE d.`customerid`= :customerid AND " . ($id > 0 ? "d.`id` = :iddn" : "d.`domain` = :iddn") . "
AND ((d.`parentdomainid`!='0' AND pd.`id` = d.`parentdomainid`) OR (d.`parentdomainid`='0' AND pd.`id` = d.`id`))
diff --git a/phpunit.xml b/phpunit.xml
index 33b73837..ceeb519c 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -19,6 +19,7 @@
tests/Emails
tests/Extras
tests/Backup
+ tests/DomainZones
diff --git a/tests/DomainZones/DomainZonesTest.php b/tests/DomainZones/DomainZonesTest.php
new file mode 100644
index 00000000..3833084f
--- /dev/null
+++ b/tests/DomainZones/DomainZonesTest.php
@@ -0,0 +1,68 @@
+ 'test1'
+ ))->get();
+ $customer_userdata = json_decode($json_result, true)['data'];
+
+ $data = [
+ 'domainname' => 'test2.local'
+ ];
+ $json_result = DomainZones::getLocal($customer_userdata, $data)->get();
+ $result = json_decode($json_result, true)['data'];
+ $this->assertTrue(count($result) > 1);
+ $this->assertEquals('$ORIGIN test2.local.', $result[1]);
+ }
+
+ public function testCustomerDomainZonesGetNoSubdomains()
+ {
+ global $admin_userdata;
+
+ Settings::Set('system.dnsenabled', 1, true);
+
+ // get customer
+ $json_result = Customers::getLocal($admin_userdata, array(
+ 'loginname' => 'test1'
+ ))->get();
+ $customer_userdata = json_decode($json_result, true)['data'];
+
+ $data = [
+ 'domainname' => 'mysub2.test2.local'
+ ];
+ $this->expectExceptionCode(406);
+ $this->expectExceptionMessage("DNS zones can only be generated for the main domain, not for subdomains");
+ DomainZones::getLocal($customer_userdata, $data)->get();
+ }
+
+ public function testAdminDomainZonesListing()
+ {
+ global $admin_userdata;
+ $this->expectExceptionCode(303);
+ DomainZones::getLocal($admin_userdata)->listing();
+ }
+
+ public function testAdminDomainZonesUpdate()
+ {
+ global $admin_userdata;
+ $this->expectExceptionCode(303);
+ DomainZones::getLocal($admin_userdata)->update();
+ }
+}
diff --git a/tests/Domains/DomainsTest.php b/tests/Domains/DomainsTest.php
index efc41901..4e899eb2 100644
--- a/tests/Domains/DomainsTest.php
+++ b/tests/Domains/DomainsTest.php
@@ -68,7 +68,8 @@ class DomainsTest extends TestCase
$reseller_userdata['caneditphpsettings'] = 1;
$data = [
'domain' => 'test2.local',
- 'customerid' => 1
+ 'customerid' => 1,
+ 'isbinddomain' => 1
];
// the reseller is not allowed to use the default ip/port
$this->expectExceptionMessage("The ip/port combination you have chosen doesn't exist.");