From 90aee5ce47306de128ad148cf0fabc70c0703a76 Mon Sep 17 00:00:00 2001
From: Adam <adam@freshost.cz>
Date: Sun, 23 Apr 2023 10:27:47 +0000
Subject: [PATCH] Move dns wizard function to class

---
 interface/lib/classes/dns_wizard.inc.php   | 297 +++++++++++++++++++++
 interface/lib/classes/remote.d/dns.inc.php | 156 ++---------
 interface/web/dns/dns_wizard.php           | 238 +----------------
 3 files changed, 328 insertions(+), 363 deletions(-)
 create mode 100644 interface/lib/classes/dns_wizard.inc.php

diff --git a/interface/lib/classes/dns_wizard.inc.php b/interface/lib/classes/dns_wizard.inc.php
new file mode 100644
index 0000000000..10c6eae473
--- /dev/null
+++ b/interface/lib/classes/dns_wizard.inc.php
@@ -0,0 +1,297 @@
+<?php
+/*
+Copyright (c) 2023, Adam Biciste <adam@freshost.cz>
+All rights reserved.
+
+Copyright (c) 2008, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+class dns_wizard
+{
+	function create(array $data)
+	{
+        global $app;
+        $app->uses('getconf');
+
+        // get the correct server_id
+        if (isset($data['server_id'])) {
+            $server_id = $app->functions->intval($data['server_id']);
+            $post_server_id = true;
+        } elseif (isset($data['server_id_value'])) {
+            $server_id = $app->functions->intval($data['server_id_value']);
+            $post_server_id = true;
+        } else {
+            $settings = $app->getconf->get_global_config('dns');
+            $server_id = $app->functions->intval($settings['default_dnsserver']);
+            $post_server_id = false;
+        }
+
+        $error = '';
+
+        if ($post_server_id)
+        {
+            $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]);
+            $client = $app->db->queryOneRecord("SELECT dns_servers FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+
+            $client['dns_servers_ids'] = explode(',', $client['dns_servers']);
+
+            // Check if chosen server is in authorized servers for this client
+            if (!(is_array($client['dns_servers_ids']) && in_array($server_id, $client['dns_servers_ids'])) && $_SESSION["s"]["user"]["typ"] != 'admin') {
+                $error .= $app->lng('error_not_allowed_server_id').'<br />';
+            }
+        }
+        /*
+        else
+        {
+            $error .= $app->lng('error_no_server_id').'<br />';
+        }
+        */
+
+        // apply filters
+        if(isset($data['domain']) && $data['domain'] != ''){
+            /* check if the domain module is used - and check if the selected domain can be used! */
+            if ($domains_settings['use_domain_module'] == 'y') {
+                if ($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
+                    $data['client_group_id'] = $app->tools_sites->getClientIdForDomain($data['domain']);
+                }
+                $domain_check = $app->tools_sites->checkDomainModuleDomain($data['domain']);
+                if(!$domain_check) {
+                    // invalid domain selected
+                    $data['domain'] = '';
+                } else {
+                    $data['domain'] = $domain_check;
+                }
+            } else {
+                $data['domain'] = $app->functions->idn_encode($data['domain']);
+                $data['domain'] = strtolower($data['domain']);
+            }
+        }
+        if(isset($data['ns1']) && $data['ns1'] != ''){
+            $data['ns1'] = $app->functions->idn_encode($data['ns1']);
+            $data['ns1'] = strtolower($data['ns1']);
+        }
+        if(isset($data['ns2']) && $data['ns2'] != ''){
+            $data['ns2'] = $app->functions->idn_encode($data['ns2']);
+            $data['ns2'] = strtolower($data['ns2']);
+        }
+        if(isset($data['email']) && $data['email'] != ''){
+            $data['email'] = $app->functions->idn_encode($data['email']);
+            $data['email'] = strtolower($data['email']);
+        }
+
+
+        # fixme: this regex is pretty poor for domain validation
+        if(isset($data['domain']) && $data['domain'] == '') $error .= $app->lng('error_domain_empty').'<br />';
+        elseif(isset($data['domain']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $data['domain'])) $error .= $app->lng('error_domain_regex').'<br />';
+
+        if(isset($data['ip']) && $data['ip'] == '') $error .= $app->lng('error_ip_empty').'<br />';
+
+        if(isset($data['ipv6']) && $data['ipv6'] == '') $error .= $app->lng('error_ipv6_empty').'<br />';
+
+        # fixme: this regex is pretty poor for hostname validation
+        if(isset($data['ns1']) && $data['ns1'] == '') $error .= $app->lng('error_ns1_empty').'<br />';
+        elseif(isset($data['ns1']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $data['ns1'])) $error .= $app->lng('error_ns1_regex').'<br />';
+
+        if(isset($data['ns2']) && $data['ns2'] == '') $error .= $app->lng('error_ns2_empty').'<br />';
+        elseif(isset($data['ns2']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $data['ns2'])) $error .= $app->lng('error_ns2_regex').'<br />';
+
+        if(isset($data['email']) && $data['email'] == '') $error .= $app->lng('error_email_empty').'<br />';
+        elseif(isset($data['email']) && filter_var($data['email'], FILTER_VALIDATE_EMAIL) === false) $error .= $app->lng('error_email_regex').'<br />';
+
+        // make sure that the record belongs to the client group and not the admin group when admin inserts it
+        if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($data['client_group_id'])) {
+            $sys_groupid = $app->functions->intval($data['client_group_id']);
+        } elseif($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($data['client_group_id'])) {
+            $sys_groupid = $app->functions->intval($data['client_group_id']);
+        } else {
+            $sys_groupid = $_SESSION["s"]["user"]["default_group"];
+        }
+
+        $tform_def_file = "../../web/dns/form/dns_soa.tform.php";
+        $app->uses('tform');
+        $app->tform->loadFormDef($tform_def_file);
+
+        if($_SESSION['s']['user']['typ'] != 'admin') {
+            if(!$app->tform->checkClientLimit('limit_dns_zone')) {
+                $error .= $app->tform->wordbook["limit_dns_zone_txt"];
+            }
+            if(!$app->tform->checkResellerLimit('limit_dns_zone')) {
+                $error .= $app->tform->wordbook["limit_dns_zone_txt"];
+            }
+        }
+
+
+        // replace template placeholders
+        $template_id = (isset($data['template_id']))?$app->functions->intval($data['template_id']):0;
+        $template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = ?", $template_id);
+        $tpl_content = $template_record['template'];
+        if($data['domain'] != '') $tpl_content = str_replace('{DOMAIN}', $data['domain'], $tpl_content);
+        if($data['ip'] != '') $tpl_content = str_replace('{IP}', $data['ip'], $tpl_content);
+        if($data['ipv6'] != '') $tpl_content = str_replace('{IPV6}',$data['ipv6'],$tpl_content);
+        if($data['ns1'] != '') $tpl_content = str_replace('{NS1}', $data['ns1'], $tpl_content);
+        if($data['ns2'] != '') $tpl_content = str_replace('{NS2}', $data['ns2'], $tpl_content);
+        if($data['email'] != '') $tpl_content = str_replace('{EMAIL}', $data['email'], $tpl_content);
+        // $enable_dnssec = (($data['dnssec'] == 'Y') ? 'Y' : 'N');
+        // if(isset($data['dnssec'])) $vars['dnssec_wanted'] = 'Y';
+        if(isset($data['dnssec'])) $tpl_content = str_replace('[ZONE]', '[ZONE]'."\n".'dnssec_wanted=Y', $tpl_content);
+        if(isset($data['dkim']) && preg_match('/^[\w\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $data['domain'])) {
+            $sql = $app->db->queryOneRecord("SELECT dkim_public, dkim_selector FROM mail_domain WHERE domain = ? AND dkim = 'y' AND ".$app->tform->getAuthSQL('r'), $data['domain']);
+            $public_key = $sql['dkim_public'];
+            if ($public_key!='') {
+                if (empty($sql['dkim_selector'])) $sql['dkim_selector'] = 'default';
+                $dns_record=str_replace(array("\r\n", "\n", "\r", "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----"), '', $public_key);
+                $tpl_content .= "\n".'TXT|'.$sql['dkim_selector'].'._domainkey.'.$data['domain'].'.|v=DKIM1; t=s; p='.$dns_record;
+            }
+        }
+
+        // Parse the template
+        $tpl_rows = explode("\n", $tpl_content);
+        $section = '';
+        $vars = array();
+        $vars['xfer']='';
+        $vars['dnssec_wanted']='N';
+        $vars['dnssec_algo']='ECDSAP256SHA256';
+        $dns_rr = array();
+        foreach($tpl_rows as $row) {
+            $row = trim($row);
+            if(substr($row, 0, 1) == '[') {
+                if($row == '[ZONE]') {
+                    $section = 'zone';
+                } elseif($row == '[DNS_RECORDS]') {
+                    $section = 'dns_records';
+                } else {
+                    die('Unknown section type');
+                }
+            } else {
+                if($row != '') {
+                    // Handle zone section
+                    if($section == 'zone') {
+                        $parts = explode('=', $row);
+                        $key = trim($parts[0]);
+                        $val = trim($parts[1]);
+                        if($key != '') $vars[$key] = $val;
+                    }
+                    // Handle DNS Record rows
+                    if($section == 'dns_records') {
+                        $parts = explode('|', $row);
+                        $dns_rr[] = array(
+                            'name' => $parts[1],
+                            'type' => $parts[0],
+                            'data' => $parts[2],
+                            'aux'  => $parts[3],
+                            'ttl'  => $parts[4]
+                        );
+                    }
+                }
+            }
+
+        } // end foreach
+
+        if($vars['origin'] == '') $error .= $app->lng('error_origin_empty').'<br />';
+        if($vars['ns'] == '') $error .= $app->lng('error_ns_empty').'<br />';
+        if($vars['mbox'] == '') $error .= $app->lng('error_mbox_empty').'<br />';
+        if($vars['refresh'] == '') $error .= $app->lng('error_refresh_empty').'<br />';
+        if($vars['retry'] == '') $error .= $app->lng('error_retry_empty').'<br />';
+        if($vars['expire'] == '') $error .= $app->lng('error_expire_empty').'<br />';
+        if($vars['minimum'] == '') $error .= $app->lng('error_minimum_empty').'<br />';
+        if($vars['ttl'] == '') $error .= $app->lng('error_ttl_empty').'<br />';
+
+        if($error == '') {
+            // Insert the soa record
+            $sys_userid = $_SESSION['s']['user']['userid'];
+            $origin = $vars['origin'];
+            $ns = $vars['ns'];
+            $mbox = str_replace('@', '.', $vars['mbox']);
+            $refresh = $vars['refresh'];
+            $retry = $vars['retry'];
+            $expire = $vars['expire'];
+            $minimum = $vars['minimum'];
+            $ttl = $vars['ttl'];
+            $xfer = $vars['xfer'];
+            $also_notify = $vars['also_notify'];
+            $update_acl = $vars['update_acl'];
+            $dnssec_wanted = $vars['dnssec_wanted'];
+            $dnssec_algo = $vars['dnssec_algo'];
+            $serial = $app->validate_dns->increase_serial(0);
+
+            $insert_data = array(
+                "sys_userid" => $sys_userid,
+                "sys_groupid" => $sys_groupid,
+                "sys_perm_user" => 'riud',
+                "sys_perm_group" => 'riud',
+                "sys_perm_other" => '',
+                "server_id" => $server_id,
+                "origin" => $origin,
+                "ns" => $ns,
+                "mbox" => $mbox,
+                "serial" => $serial,
+                "refresh" => $refresh,
+                "retry" => $retry,
+                "expire" => $expire,
+                "minimum" => $minimum,
+                "ttl" => $ttl,
+                "active" => 'Y',
+                "xfer" => $xfer,
+                "also_notify" => $also_notify,
+                "update_acl" => $update_acl,
+                "dnssec_wanted" => $dnssec_wanted,
+                "dnssec_algo" => $dnssec_algo
+            );
+
+            $dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
+            if($dns_soa_id > 0) $app->plugin->raiseEvent('dns:wizard:on_after_insert', $dns_soa_id);
+
+            // Insert the dns_rr records
+            if(is_array($dns_rr) && $dns_soa_id > 0) {
+                foreach($dns_rr as $rr) {
+                    $insert_data = array(
+                        "sys_userid" => $sys_userid,
+                        "sys_groupid" => $sys_groupid,
+                        "sys_perm_user" => 'riud',
+                        "sys_perm_group" => 'riud',
+                        "sys_perm_other" => '',
+                        "server_id" => $server_id,
+                        "zone" => $dns_soa_id,
+                        "name" => $rr['name'],
+                        "type" => $rr['type'],
+                        "data" => $rr['data'],
+                        "aux" => $rr['aux'],
+                        "ttl" => $rr['ttl'],
+                        "active" => 'Y'
+                    );
+                    $dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
+                }
+            }
+
+            return 'ok';
+
+        } else {
+            return $error;
+        }
+	}
+
+}
diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php
index 67b97e722d..3a2b11022f 100644
--- a/interface/lib/classes/remote.d/dns.inc.php
+++ b/interface/lib/classes/remote.d/dns.inc.php
@@ -44,143 +44,41 @@ class remoting_dns extends remoting {
 	//* Create Zone with Template
 	public function dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email, $ipv6 = '') {
 		global $app, $conf;
+
 		if(!$this->checkPerm($session_id, 'dns_templatezone_add')) {
 			throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.');
 		}
 
-		$client = $app->db->queryOneRecord("SELECT default_dnsserver FROM client WHERE client_id = ?", $client_id);
-		$server_id = $client["default_dnsserver"];
-		$template_record = $app->db->queryOneRecord("SELECT * FROM dns_template WHERE template_id = ?", $template_id);
-		$fields = explode(',', $template_record['fields']);
-		$tform_def_file = "../../web/dns/form/dns_soa.tform.php";
-		$app->uses('tform');
-		$app->tform->loadFormDef($tform_def_file);
-		$app->uses('tpl,validate_dns,remoting_lib');
+		$client_id = $app->functions->intval($client_id);
+
+		// Get client group id
+		$rec = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $client_id);
+		if(isset($rec['groupid'])) {
+			$client_group_id = $app->functions->intval($rec['groupid']);
+		} else {
+			throw new SoapFault('no_group_found', 'There is no group for this client ID.');
+			return false;
+		}
 
+		$app->uses('remoting_lib,dns_wizard');
 		$app->remoting_lib->loadUserProfile($client_id);
 
-		//* replace template placeholders
-		$tpl_content = $template_record['template'];
-		if($domain != '') $tpl_content = str_replace('{DOMAIN}', $domain, $tpl_content);
-		if($ip != '') $tpl_content = str_replace('{IP}', $ip, $tpl_content);
-		if($ipv6 != '') $tpl_content = str_replace('{IPV6}', $ipv6, $tpl_content);
-		if($ns1 != '') $tpl_content = str_replace('{NS1}', $ns1, $tpl_content);
-		if($ns2 != '') $tpl_content = str_replace('{NS2}', $ns2, $tpl_content);
-		if($email != '') $tpl_content = str_replace('{EMAIL}', $email, $tpl_content);
-
-		//* Parse the template
-		$tpl_rows = explode("\n", $tpl_content);
-		$section = '';
-		$vars = array();
-		$dns_rr = array();
-		foreach($tpl_rows as $row) {
-			$row = trim($row);
-			if(substr($row, 0, 1) == '[') {
-				if($row == '[ZONE]') {
-					$section = 'zone';
-				} elseif($row == '[DNS_RECORDS]') {
-					$section = 'dns_records';
-				} else {
-					die('Unknown section type');
-				}
-			} else {
-				if($row != '') {
-					//* Handle zone section
-					if($section == 'zone') {
-						$parts = explode('=', $row);
-						$key = trim($parts[0]);
-						$val = trim($parts[1]);
-						if($key != '') $vars[$key] = $val;
-					}
-					//* Handle DNS Record rows
-					if($section == 'dns_records') {
-						$parts = explode('|', $row);
-						$dns_rr[] = array(
-							'name' => $parts[1],
-							'type' => $parts[0],
-							'data' => $parts[2],
-							'aux'  => $parts[3],
-							'ttl'  => $parts[4]
-						);
-					}
-				}
-			}
-		} // end foreach
-
-		if($vars['origin'] == '') $error .= $app->lng('error_origin_empty').'<br />';
-		if($vars['ns'] == '') $error .= $app->lng('error_ns_empty').'<br />';
-		if($vars['mbox'] == '') $error .= $app->lng('error_mbox_empty').'<br />';
-		if($vars['refresh'] == '') $error .= $app->lng('error_refresh_empty').'<br />';
-		if($vars['retry'] == '') $error .= $app->lng('error_retry_empty').'<br />';
-		if($vars['expire'] == '') $error .= $app->lng('error_expire_empty').'<br />';
-		if($vars['minimum'] == '') $error .= $app->lng('error_minimum_empty').'<br />';
-		if($vars['ttl'] == '') $error .= $app->lng('error_ttl_empty').'<br />';
-		if(!isset($vars['xfer'])) $vars['xfer'] = '';
-
-		if($error == '') {
-			// Insert the soa record
-			$tmp = $app->db->queryOneRecord("SELECT userid,default_group FROM sys_user WHERE client_id = ?", $client_id);
-			$sys_userid = $tmp['userid'];
-			$sys_groupid = $tmp['default_group'];
-			unset($tmp);
-			$origin = $vars['origin'];
-			$ns = $vars['ns'];
-			$mbox = str_replace('@', '.', $vars['mbox']);
-			$refresh = $vars['refresh'];
-			$retry = $vars['retry'];
-			$expire = $vars['expire'];
-			$minimum = $vars['minimum'];
-			$ttl = $vars['ttl'];
-			$xfer = $vars['xfer'];
-			$also_notify = $vars['also_notify'];
-			$update_acl = $vars['update_acl'];
-			$serial = $app->validate_dns->increase_serial(0);
-			$insert_data = array(
-				"sys_userid" => $sys_userid,
-				"sys_groupid" => $sys_groupid,
-				"sys_perm_user" => 'riud',
-				"sys_perm_group" => 'riud',
-				"sys_perm_other" => '',
-				"server_id" => $server_id,
-				"origin" => $origin,
-				"ns" => $ns,
-				"mbox" => $mbox,
-				"serial" => $serial,
-				"refresh" => $refresh,
-				"retry" => $retry,
-				"expire" => $expire,
-				"minimum" => $minimum,
-				"ttl" => $ttl,
-				"active" => 'Y',
-				"xfer" => $xfer,
-				"also_notify" => $also_notify,
-				"update_acl" => $update_acl
-			);
-			$dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
-			// Insert the dns_rr records
-			if(is_array($dns_rr) && $dns_soa_id > 0) {
-				foreach($dns_rr as $rr) {
-					$insert_data = array(
-						"sys_userid" => $sys_userid,
-						"sys_groupid" => $sys_groupid,
-						"sys_perm_user" => 'riud',
-						"sys_perm_group" => 'riud',
-						"sys_perm_other" => '',
-						"server_id" => $server_id,
-						"zone" => $dns_soa_id,
-						"name" => $rr['name'],
-						"type" => $rr['type'],
-						"data" => $rr['data'],
-						"aux" => $rr['aux'],
-						"ttl" => $rr['ttl'],
-						"active" => 'Y'
-					);
-					$dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
-				}
-			}
-			exit;
+		$create = $app->dns_wizard->create([
+			'client_group_id' => $client_group_id,
+			'template_id' => $template_id,
+			'domain' => $domain,
+			'ip' => $ip,
+			'ns1' => $ns1,
+			'ns2' => $ns2,
+			'email' => $email,
+			'ipv6' => $ipv6,
+		]);
+
+		if ($create == 'ok') {
+			return true;
 		} else {
-			throw new SoapFault('permission_denied', $error);
+			throw new SoapFault('dns_wizard_error', $create);
+			return false;
 		}
 	}
 
diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php
index 90e2fef1c4..2859b6f9e1 100644
--- a/interface/web/dns/dns_wizard.php
+++ b/interface/web/dns/dns_wizard.php
@@ -224,243 +224,13 @@ if($_POST['create'] == 1) {
 	//* CSRF Check
 	$app->auth->csrf_token_check();
 
-	$error = '';
-
-	if ($post_server_id)
-	{
-		$client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]);
-		$client = $app->db->queryOneRecord("SELECT dns_servers FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
-
-		$client['dns_servers_ids'] = explode(',', $client['dns_servers']);
-
-		// Check if chosen server is in authorized servers for this client
-		if (!(is_array($client['dns_servers_ids']) && in_array($server_id, $client['dns_servers_ids'])) && $_SESSION["s"]["user"]["typ"] != 'admin') {
-			$error .= $app->lng('error_not_allowed_server_id').'<br />';
-		}
-	}
-	else
-	{
-		$error .= $app->lng('error_no_server_id').'<br />';
-	}
-
-	// apply filters
-	if(isset($_POST['domain']) && $_POST['domain'] != ''){
-		/* check if the domain module is used - and check if the selected domain can be used! */
-		if ($domains_settings['use_domain_module'] == 'y') {
-			if ($_SESSION["s"]["user"]["typ"] == 'admin' || $app->auth->has_clients($_SESSION['s']['user']['userid'])) {
-				$_POST['client_group_id'] = $app->tools_sites->getClientIdForDomain($_POST['domain']);
-			}
-			$domain_check = $app->tools_sites->checkDomainModuleDomain($_POST['domain']);
-			if(!$domain_check) {
-				// invalid domain selected
-				$_POST['domain'] = '';
-			} else {
-				$_POST['domain'] = $domain_check;
-			}
-		} else {
-			$_POST['domain'] = $app->functions->idn_encode($_POST['domain']);
-			$_POST['domain'] = strtolower($_POST['domain']);
-		}
-	}
-	if(isset($_POST['ns1']) && $_POST['ns1'] != ''){
-		$_POST['ns1'] = $app->functions->idn_encode($_POST['ns1']);
-		$_POST['ns1'] = strtolower($_POST['ns1']);
-	}
-	if(isset($_POST['ns2']) && $_POST['ns2'] != ''){
-		$_POST['ns2'] = $app->functions->idn_encode($_POST['ns2']);
-		$_POST['ns2'] = strtolower($_POST['ns2']);
-	}
-	if(isset($_POST['email']) && $_POST['email'] != ''){
-		$_POST['email'] = $app->functions->idn_encode($_POST['email']);
-		$_POST['email'] = strtolower($_POST['email']);
-	}
-
-
-	# fixme: this regex is pretty poor for domain validation
-	if(isset($_POST['domain']) && $_POST['domain'] == '') $error .= $app->lng('error_domain_empty').'<br />';
-	elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'<br />';
-
-	if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'<br />';
-
-	if(isset($_POST['ipv6']) && $_POST['ipv6'] == '') $error .= $app->lng('error_ipv6_empty').'<br />';
-
-	# fixme: this regex is pretty poor for hostname validation
-	if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'<br />';
-	elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'<br />';
-
-	if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'<br />';
-	elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'<br />';
-
-	if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'<br />';
-	elseif(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) $error .= $app->lng('error_email_regex').'<br />';
-
-	// make sure that the record belongs to the client group and not the admin group when admin inserts it
-	if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($_POST['client_group_id'])) {
-		$sys_groupid = $app->functions->intval($_POST['client_group_id']);
-	} elseif($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($_POST['client_group_id'])) {
-		$sys_groupid = $app->functions->intval($_POST['client_group_id']);
-	} else {
-		$sys_groupid = $_SESSION["s"]["user"]["default_group"];
-	}
-
-	$tform_def_file = "form/dns_soa.tform.php";
-	$app->uses('tform');
-	$app->tform->loadFormDef($tform_def_file);
-
-	if($_SESSION['s']['user']['typ'] != 'admin') {
-		if(!$app->tform->checkClientLimit('limit_dns_zone')) {
-			$error .= $app->tform->wordbook["limit_dns_zone_txt"];
-		}
-		if(!$app->tform->checkResellerLimit('limit_dns_zone')) {
-			$error .= $app->tform->wordbook["limit_dns_zone_txt"];
-		}
-	}
-
-
-	// replace template placeholders
-	$tpl_content = $template_record['template'];
-	if($_POST['domain'] != '') $tpl_content = str_replace('{DOMAIN}', $_POST['domain'], $tpl_content);
-	if($_POST['ip'] != '') $tpl_content = str_replace('{IP}', $_POST['ip'], $tpl_content);
-	if($_POST['ipv6'] != '') $tpl_content = str_replace('{IPV6}',$_POST['ipv6'],$tpl_content);
-	if($_POST['ns1'] != '') $tpl_content = str_replace('{NS1}', $_POST['ns1'], $tpl_content);
-	if($_POST['ns2'] != '') $tpl_content = str_replace('{NS2}', $_POST['ns2'], $tpl_content);
-	if($_POST['email'] != '') $tpl_content = str_replace('{EMAIL}', $_POST['email'], $tpl_content);
-	// $enable_dnssec = (($_POST['dnssec'] == 'Y') ? 'Y' : 'N');
-	// if(isset($_POST['dnssec'])) $vars['dnssec_wanted'] = 'Y';
-	if(isset($_POST['dnssec'])) $tpl_content = str_replace('[ZONE]', '[ZONE]'."\n".'dnssec_wanted=Y', $tpl_content);
-	if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $_POST['domain'])) {
-		$sql = $app->db->queryOneRecord("SELECT dkim_public, dkim_selector FROM mail_domain WHERE domain = ? AND dkim = 'y' AND ".$app->tform->getAuthSQL('r'), $_POST['domain']);
-		$public_key = $sql['dkim_public'];
-		if ($public_key!='') {
-			if (empty($sql['dkim_selector'])) $sql['dkim_selector'] = 'default';
-			$dns_record=str_replace(array("\r\n", "\n", "\r", "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----"), '', $public_key);
-			$tpl_content .= "\n".'TXT|'.$sql['dkim_selector'].'._domainkey.'.$_POST['domain'].'.|v=DKIM1; t=s; p='.$dns_record;
-		}
-	}
-
-	// Parse the template
-	$tpl_rows = explode("\n", $tpl_content);
-	$section = '';
-	$vars = array();
-	$vars['xfer']='';
-	$vars['dnssec_wanted']='N';
-	$vars['dnssec_algo']='ECDSAP256SHA256';
-	$dns_rr = array();
-	foreach($tpl_rows as $row) {
-		$row = trim($row);
-		if(substr($row, 0, 1) == '[') {
-			if($row == '[ZONE]') {
-				$section = 'zone';
-			} elseif($row == '[DNS_RECORDS]') {
-				$section = 'dns_records';
-			} else {
-				die('Unknown section type');
-			}
-		} else {
-			if($row != '') {
-				// Handle zone section
-				if($section == 'zone') {
-					$parts = explode('=', $row);
-					$key = trim($parts[0]);
-					$val = trim($parts[1]);
-					if($key != '') $vars[$key] = $val;
-				}
-				// Handle DNS Record rows
-				if($section == 'dns_records') {
-					$parts = explode('|', $row);
-					$dns_rr[] = array(
-						'name' => $parts[1],
-						'type' => $parts[0],
-						'data' => $parts[2],
-						'aux'  => $parts[3],
-						'ttl'  => $parts[4]
-					);
-				}
-			}
-		}
-
-	} // end foreach
-
-	if($vars['origin'] == '') $error .= $app->lng('error_origin_empty').'<br />';
-	if($vars['ns'] == '') $error .= $app->lng('error_ns_empty').'<br />';
-	if($vars['mbox'] == '') $error .= $app->lng('error_mbox_empty').'<br />';
-	if($vars['refresh'] == '') $error .= $app->lng('error_refresh_empty').'<br />';
-	if($vars['retry'] == '') $error .= $app->lng('error_retry_empty').'<br />';
-	if($vars['expire'] == '') $error .= $app->lng('error_expire_empty').'<br />';
-	if($vars['minimum'] == '') $error .= $app->lng('error_minimum_empty').'<br />';
-	if($vars['ttl'] == '') $error .= $app->lng('error_ttl_empty').'<br />';
-
-	if($error == '') {
-		// Insert the soa record
-		$sys_userid = $_SESSION['s']['user']['userid'];
-		$origin = $vars['origin'];
-		$ns = $vars['ns'];
-		$mbox = str_replace('@', '.', $vars['mbox']);
-		$refresh = $vars['refresh'];
-		$retry = $vars['retry'];
-		$expire = $vars['expire'];
-		$minimum = $vars['minimum'];
-		$ttl = $vars['ttl'];
-		$xfer = $vars['xfer'];
-		$also_notify = $vars['also_notify'];
-		$update_acl = $vars['update_acl'];
-		$dnssec_wanted = $vars['dnssec_wanted'];
-		$dnssec_algo = $vars['dnssec_algo'];
-		$serial = $app->validate_dns->increase_serial(0);
-
-		$insert_data = array(
-			"sys_userid" => $sys_userid,
-			"sys_groupid" => $sys_groupid,
-			"sys_perm_user" => 'riud',
-			"sys_perm_group" => 'riud',
-			"sys_perm_other" => '',
-			"server_id" => $server_id,
-			"origin" => $origin,
-			"ns" => $ns,
-			"mbox" => $mbox,
-			"serial" => $serial,
-			"refresh" => $refresh,
-			"retry" => $retry,
-			"expire" => $expire,
-			"minimum" => $minimum,
-			"ttl" => $ttl,
-			"active" => 'Y',
-			"xfer" => $xfer,
-			"also_notify" => $also_notify,
-			"update_acl" => $update_acl,
-			"dnssec_wanted" => $dnssec_wanted,
-			"dnssec_algo" => $dnssec_algo
-		);
-		$dns_soa_id = $app->db->datalogInsert('dns_soa', $insert_data, 'id');
-		if($dns_soa_id > 0) $app->plugin->raiseEvent('dns:wizard:on_after_insert', $dns_soa_id);
-
-		// Insert the dns_rr records
-		if(is_array($dns_rr) && $dns_soa_id > 0) {
-			foreach($dns_rr as $rr) {
-				$insert_data = array(
-					"sys_userid" => $sys_userid,
-					"sys_groupid" => $sys_groupid,
-					"sys_perm_user" => 'riud',
-					"sys_perm_group" => 'riud',
-					"sys_perm_other" => '',
-					"server_id" => $server_id,
-					"zone" => $dns_soa_id,
-					"name" => $rr['name'],
-					"type" => $rr['type'],
-					"data" => $rr['data'],
-					"aux" => $rr['aux'],
-					"ttl" => $rr['ttl'],
-					"active" => 'Y'
-				);
-				$dns_rr_id = $app->db->datalogInsert('dns_rr', $insert_data, 'id');
-			}
-		}
-
+	$app->uses('dns_wizard');
+	$create = $app->dns_wizard->create($_POST);
+	if ($create == 'ok') {
 		header("Location: dns_soa_list.php");
 		exit;
-
 	} else {
-		$app->tpl->setVar("error", $error);
+		$app->tpl->setVar("error", $create);
 	}
 
 }
-- 
GitLab