From 776bb56b24883dac64ce087e72d3faa477f004a2 Mon Sep 17 00:00:00 2001 From: Michael Kaufmann Date: Sun, 18 Nov 2018 15:07:06 +0100 Subject: [PATCH] add more phpdoc to DomainZones ApiCommand; minor fixes in DirOptions and DirProtections Signed-off-by: Michael Kaufmann --- lib/classes/api/commands/class.DirOptions.php | 2 +- .../api/commands/class.DirProtections.php | 4 +- .../api/commands/class.DomainZones.php | 112 ++++++++++++------ 3 files changed, 81 insertions(+), 37 deletions(-) diff --git a/lib/classes/api/commands/class.DirOptions.php b/lib/classes/api/commands/class.DirOptions.php index 2c5588fa..8b951c92 100644 --- a/lib/classes/api/commands/class.DirOptions.php +++ b/lib/classes/api/commands/class.DirOptions.php @@ -337,7 +337,7 @@ class DirOptions extends ApiCommand implements ResourceEntity * delete a directory-options by id * * @param int $id - * optional, the directory-option-id + * id of dir-protection entry * * @access admin, customer * @throws Exception diff --git a/lib/classes/api/commands/class.DirProtections.php b/lib/classes/api/commands/class.DirProtections.php index f7faa0f4..bb746bbf 100644 --- a/lib/classes/api/commands/class.DirProtections.php +++ b/lib/classes/api/commands/class.DirProtections.php @@ -120,7 +120,7 @@ class DirProtections extends ApiCommand implements ResourceEntity * return a directory-protection entry by either id or username * * @param int $id - * optional, the entry-id + * optional, the directory-protection-id * @param string $username * optional, the username * @@ -185,7 +185,7 @@ class DirProtections extends ApiCommand implements ResourceEntity * update htaccess protection of a given directory * * @param int $id - * optional, the entry-id + * optional the directory-protection-id * @param string $username * optional, the username * @param int $customerid diff --git a/lib/classes/api/commands/class.DomainZones.php b/lib/classes/api/commands/class.DomainZones.php index 1383a7c2..748006d2 100644 --- a/lib/classes/api/commands/class.DomainZones.php +++ b/lib/classes/api/commands/class.DomainZones.php @@ -18,55 +18,78 @@ class DomainZones extends ApiCommand implements ResourceEntity { + /** + * add a new dns zone for a given domain by id or domainname + * + * @param int $id + * optional domain id + * @param string $domainname + * optional domain name + * @param string $record + * optional, default empty + * @param string $type + * optional, zone-entry type (A, AAAA, TXT, etc.), default 'A' + * @param int $prio + * optional, priority, default empty + * @param string $content + * optional, default empty + * @param int $ttl + * optional, default 18000 + * + * @access admin, customer + * @throws Exception + * @return array + */ public function add() { if (Settings::Get('system.dnsenabled') != '1') { throw new Exception("DNS server not enabled on this system", 405); } - + $id = $this->getParam('id', true, 0); $dn_optional = ($id <= 0 ? false : true); $domainname = $this->getParam('domainname', $dn_optional, ''); - + // get requested domain $result = $this->apiCall('SubDomains.get', array( 'id' => $id, 'domainname' => $domainname )); $id = $result['id']; - + // parameters $record = $this->getParam('record', true, null); $type = $this->getParam('type', true, 'A'); $prio = $this->getParam('prio', true, null); $content = $this->getParam('content', true, null); $ttl = $this->getParam('ttl', true, 18000); - + 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); } - + $idna_convert = new idna_convert_wrapper(); $domain = $idna_convert->encode($result['domain']); - + // select all entries $sel_stmt = Database::prepare("SELECT * FROM `" . TABLE_DOMAIN_DNS . "` WHERE domain_id = :did"); Database::pexecute($sel_stmt, array( 'did' => $id ), true, true); $dom_entries = $sel_stmt->fetchAll(PDO::FETCH_ASSOC); - + // validation + $errors = array(); if (empty($record)) { $record = "@"; } - + $record = trim(strtolower($record)); - + if ($record != '@' && $record != '*') { // validate record if (strpos($record, '--') !== false) { @@ -80,28 +103,28 @@ class DomainZones extends ApiCommand implements ResourceEntity } // convert entry $record = $idna_convert->encode($record); - + if ($add_wildcard_again) { $record = '*.' . $record; } - + if (strlen($record) > 63) { $errors[] = $this->lng['error']['dns_record_toolong']; } } } - + // TODO regex validate content for invalid characters - + if ($ttl <= 0) { $ttl = 18000; } - + $content = trim($content); if (empty($content)) { $errors[] = $this->lng['error']['dns_content_empty']; } - + // types if ($type == 'A' && filter_var($content, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) === false) { $errors[] = $this->lng['error']['dns_arec_noipv4']; @@ -202,7 +225,7 @@ class DomainZones extends ApiCommand implements ResourceEntity $content .= '.'; } } - + $new_entry = array( 'record' => $record, 'type' => $type, @@ -212,7 +235,7 @@ class DomainZones extends ApiCommand implements ResourceEntity 'domain_id' => (int) $id ); ksort($new_entry); - + // check for duplicate foreach ($dom_entries as $existing_entry) { // compare json-encoded string of array @@ -235,7 +258,7 @@ class DomainZones extends ApiCommand implements ResourceEntity break; } } - + if (empty($errors)) { $ins_stmt = Database::prepare(" INSERT INTO `" . TABLE_DOMAIN_DNS . "` SET @@ -248,14 +271,14 @@ class DomainZones extends ApiCommand implements ResourceEntity "); Database::pexecute($ins_stmt, $new_entry, true, true); $new_entry_id = Database::lastInsertId(); - + // add temporary to the entries-array (no reread of DB necessary) $new_entry['id'] = $new_entry_id; $dom_entries[] = $new_entry; - + // re-generate bind configs inserttask('4'); - + $result = $this->apiCall('DomainZones.get', array( 'id' => $id )); @@ -269,11 +292,11 @@ class DomainZones extends ApiCommand implements ResourceEntity * return a domain-dns entry by either id or domainname * * @param int $id - * optional, the domain-id + * optional, the domain id * @param string $domainname - * optional, the domainname + * optional, the domain name * - * @access admin + * @access admin, customer * @throws Exception * @return array */ @@ -282,61 +305,82 @@ class DomainZones extends ApiCommand implements ResourceEntity if (Settings::Get('system.dnsenabled') != '1') { throw new Exception("DNS server not enabled on this system", 405); } - + $id = $this->getParam('id', true, 0); $dn_optional = ($id <= 0 ? false : true); $domainname = $this->getParam('domainname', $dn_optional, ''); - + // get requested domain $result = $this->apiCall('SubDomains.get', array( 'id' => $id, 'domainname' => $domainname )); $id = $result['id']; - + 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); } - + $zone = createDomainZone($id); $zonefile = (string) $zone; - + $this->logger()->logAction($this->isAdmin() ? ADM_ACTION : USR_ACTION, LOG_NOTICE, "[API] get dns-zone for '" . $result['domain'] . "'"); return $this->response(200, "successfull", explode("\n", $zonefile)); } + /** + * You cannot update a dns zone entry. + * You need to delete it and re-add it. + */ public function update() { throw new Exception('You cannot update a dns zone entry. You need to delete it and re-add it.', 303); } + /** + * You cannot list dns zones. + * To get all domains use Domains.listing() or SubDomains.listing() + */ public function listing() { throw new Exception('You cannot list dns zones. To get all domains use Domains.listing() or SubDomains.listing()', 303); } + /** + * deletes a domain-dns entry by id + * + * @param int $entry_id + * @param int $id + * optional, the domain id + * @param string $domainname + * optional, the domain name + * + * @access admin, customer + * @throws Exception + * @return bool + */ public function delete() { if (Settings::Get('system.dnsenabled') != '1') { throw new Exception("DNS server not enabled on this system", 405); } - + $entry_id = $this->getParam('entry_id'); $id = $this->getParam('id', true, 0); $dn_optional = ($id <= 0 ? false : true); $domainname = $this->getParam('domainname', $dn_optional, ''); - + // get requested domain $result = $this->apiCall('SubDomains.get', array( 'id' => $id, 'domainname' => $domainname )); $id = $result['id']; - + $del_stmt = Database::prepare("DELETE FROM `" . TABLE_DOMAIN_DNS . "` WHERE `id` = :id AND `domain_id` = :did"); Database::pexecute($del_stmt, array( 'id' => $entry_id,