From aa370627b211a51dc46891cfa4b6e3d2ef3e52db Mon Sep 17 00:00:00 2001
From: mcramer <m.cramer@pixcept.de>
Date: Tue, 16 Jul 2013 10:45:17 -0400
Subject: [PATCH] - Fixed FS#2924 - the month will not set automatically in the autoresponder by click now   Along with this fixed some display problems with the combo boxes introduced in 3.0.5.   Some fields were not correctly displayed with the predefined values if value and text of the underlying option element differ.

---
 interface/lib/classes/validate_domain.inc.php |  190 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 184 insertions(+), 6 deletions(-)

diff --git a/interface/lib/classes/validate_domain.inc.php b/interface/lib/classes/validate_domain.inc.php
index 25f16af..ca137f6 100644
--- a/interface/lib/classes/validate_domain.inc.php
+++ b/interface/lib/classes/validate_domain.inc.php
@@ -79,6 +79,25 @@
         if(!$result) return $this->get_error('domain_error_unique');
     }
     
+    /* Validator function for checking the auto subdomain of a web/aliasdomain */
+    function web_domain_autosub($field_name, $field_value, $validator) {
+        global $app;
+        if(empty($field_value) || $field_name != 'subdomain') return; // none set
+        
+        $check_domain = $_POST['domain'];
+        $app->uses('ini_parser,getconf');
+        $settings = $app->getconf->get_global_config('domains');
+        if ($settings['use_domain_module'] == 'y') {
+            $sql = "SELECT domain_id, domain FROM domain WHERE domain_id = " . $app->functions->intval($check_domain);
+            $domain_check = $app->db->queryOneRecord($sql);
+            if(!$domain_check) return;
+            $check_domain = $domain_check['domain'];
+        }
+        
+        $result = $this->_check_unique($field_value . '.' . $check_domain, true);
+        if(!$result) return $this->get_error('domain_error_autosub');
+    }
+    
     /* internal validator function to match regexp */
     function _regex_validate($domain_name, $allow_wildcard = false) {
         $pattern = '/^' . ($allow_wildcard == true ? '(\*\.)?' : '') . '[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/';
@@ -86,14 +105,173 @@
     }
     
     /* check if the domain hostname is unique (keep in mind the auto subdomains!) */
-    function _check_unique($domain_name) {
-        global $app;
+    function _check_unique($domain_name, $only_domain = false) {
+        global $app, $page;
         
-        $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_domain` WHERE `domain` = '" . $app->db->quote($domain_name) . "' AND `domain_id` != " . intval($app->tform->primary_id));
-        if($check['cnt'] > 0) return false;
+        if(isset($app->remoting_lib->primary_id)) {
+            $primary_id = $app->remoting_lib->primary_id;
+			$domain = $app->remoting_lib->dataRecord;
+        } else {
+            $primary_id = $app->tform->primary_id;
+			$domain = $page->dataRecord;
+        }
+
+		if($domain['ip_address'] == '' || $domain['ipv6_address'] == ''){
+			if($domain['parent_domain_id'] > 0){
+				$parent_domain = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".$domain['parent_domain_id']);
+			}
+		}
+		
+		// check if domain has alias/subdomains - if we move a web to another IP, make sure alias/subdomains are checked as well
+		$aliassubdomains = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ".$app->functions->intval($primary_id)." AND (type = 'alias' OR type = 'subdomain')");
+		$additional_sql1 = '';
+		$additional_sql2 = '';
+		if(is_array($aliassubdomains) && !empty($aliassubdomains)){
+			foreach($aliassubdomains as $aliassubdomain){
+				$additional_sql1 .= " OR `domain` = '".$app->db->quote($aliassubdomain['domain'])."'";
+				$additional_sql2 .= " OR CONCAT(`subdomain`, '.', `domain`) = '".$app->db->quote($aliassubdomain['domain'])."'";
+			}
+		}
+		
+        //$check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_domain` WHERE `domain` = '" . $app->db->quote($domain_name) . "' AND `domain_id` != " . $app->functions->intval($primary_id));
+		//if($check['cnt'] > 0) return false;
+		
+		// we can have the same domain on different servers or different IPs, so we have to check for identical domains on the same IP (or wildcard IPs)
+		$checks = $app->db->queryAllRecords("SELECT * FROM `web_domain` WHERE (`domain` = '" . $app->db->quote($domain_name) . "'".$additional_sql1.") AND `server_id` = ".intval($domain['server_id'])." AND `domain_id` != " . $app->functions->intval($primary_id).($additional_sql1 != '' ? " AND `parent_domain_id` != ".$app->functions->intval($primary_id) : ""));
+
+		if(is_array($checks) && !empty($checks)){
+			foreach($checks as $check){
+				if($domain['ip_address'] == '*') return false;
+				if($check['ip_address'] == '*') return false;
+				if($domain['ip_address'] != '' && $check['ip_address'] == $domain['ip_address']) return false;
+				if($domain['ipv6_address'] != '' && $check['ipv6_address'] == $domain['ipv6_address']) return false;
+				// if alias/subdomain: check IP addresses of parent domain
+				if($check['ip_address'] == '' || $check['ipv6_address'] == ''){
+					if($check['parent_domain_id'] > 0){
+						$check_parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ".$check['parent_domain_id']);
+					}
+				}
+					
+				if($domain['ip_address'] == '' && $check['ip_address'] != ''){
+					if(is_array($parent_domain) && !empty($parent_domain)){
+						if($parent_domain['ip_address'] == '*') return false;
+						if($parent_domain['ip_address'] != '' && $check['ip_address'] == $parent_domain['ip_address']) return false;
+					}
+				}
+				
+				if($domain['ip_address'] == '' && $check['ip_address'] == ''){
+					if($check['parent_domain_id'] > 0){
+						if(is_array($check_parent_domain) && !empty($check_parent_domain)){
+							if($check_parent_domain['ip_address'] == '*') return false;
+						}
+					}
+					if(is_array($parent_domain) && !empty($parent_domain)){
+						if($parent_domain['ip_address'] == '*') return false;
+						if($parent_domain['ip_address'] != '' && $check_parent_domain['ip_address'] == $parent_domain['ip_address']) return false;
+					}
+				}
+				
+				if($check['ip_address'] == '' && $domain['ip_address'] != ''){
+					if($check['parent_domain_id'] > 0){
+						if(is_array($check_parent_domain) && !empty($check_parent_domain)){
+							if($check_parent_domain['ip_address'] == '*') return false;
+							if($check_parent_domain['ip_address'] != '' && $check_parent_domain['ip_address'] == $domain['ip_address']) return false;
+						}
+					}
+				}
+				
+				if($domain['ipv6_address'] == '' && $check['ipv6_address'] != ''){
+					if(is_array($parent_domain) && !empty($parent_domain)){
+						if($parent_domain['ipv6_address'] != '' && $check['ipv6_address'] == $parent_domain['ipv6_address']) return false;
+					}
+				}
+				
+				if($domain['ipv6_address'] == '' && $check['ipv6_address'] == ''){
+					if(is_array($parent_domain) && !empty($parent_domain)){
+						if($parent_domain['ipv6_address'] != '' && $check_parent_domain['ipv6_address'] == $parent_domain['ipv6_address']) return false;
+					}
+				}
+				
+				if($check['ipv6_address'] == '' && $domain['ipv6_address'] != ''){
+					if($check['parent_domain_id'] > 0){
+						if(is_array($check_parent_domain) && !empty($check_parent_domain)){
+							if($check_parent_domain['ipv6_address'] != '' && $check_parent_domain['ipv6_address'] == $domain['ipv6_address']) return false;
+						}
+					}
+				}
+			}
+		}
         
-        $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_domain` WHERE CONCAT(`subdomain`, '.', `domain`) = '" . $app->db->quote($domain_name) . "' AND `domain_id` != " . intval($app->tform->primary_id));
-        if($check['cnt'] > 0) return false;
+        
+        if($only_domain == false) {
+            //$check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_domain` WHERE CONCAT(`subdomain`, '.', `domain`) = '" . $app->db->quote($domain_name) . "' AND `domain_id` != " . $app->functions->intval($primary_id));
+			//if($check['cnt'] > 0) return false;
+			// we can have the same domain on different servers or different IPs, so we have to check for identical domains on the same IP (or wildcard IPs)
+			$checks = $app->db->queryAllRecords("SELECT * FROM `web_domain` WHERE (CONCAT(`subdomain`, '.', `domain`) = '" . $app->db->quote($domain_name) . "'".$additional_sql2.") AND `server_id` = ".intval($domain['server_id'])." AND `domain_id` != " . $app->functions->intval($primary_id).($additional_sql2 != '' ? " AND `parent_domain_id` != ".$app->functions->intval($primary_id) : ""));
+			if(is_array($checks) && !empty($checks)){
+				foreach($checks as $check){
+					if($domain['ip_address'] == '*') return false;
+					if($check['ip_address'] == '*') return false;
+					if($domain['ip_address'] != '' && $check['ip_address'] == $domain['ip_address']) return false;
+					if($domain['ipv6_address'] != '' && $check['ipv6_address'] == $domain['ipv6_address']) return false;
+					// if alias/subdomain: check IP addresses of parent domain
+					if($check['ip_address'] == '' || $check['ipv6_address'] == ''){
+						if($check['parent_domain_id'] > 0){
+							$check_parent_domain = $app->db->queryOneRecord("SELECT * FROM `web_domain` WHERE `domain_id` = ".$check['parent_domain_id']);
+						}
+					}
+					
+					if($domain['ip_address'] == '' && $check['ip_address'] != ''){
+						if(is_array($parent_domain) && !empty($parent_domain)){
+							if($parent_domain['ip_address'] == '*') return false;
+							if($parent_domain['ip_address'] != '' && $check['ip_address'] == $parent_domain['ip_address']) return false;
+						}
+					}
+				
+					if($domain['ip_address'] == '' && $check['ip_address'] == ''){
+						if($check['parent_domain_id'] > 0){
+							if(is_array($check_parent_domain) && !empty($check_parent_domain)){
+								if($check_parent_domain['ip_address'] == '*') return false;
+							}
+						}
+						if(is_array($parent_domain) && !empty($parent_domain)){
+							if($parent_domain['ip_address'] == '*') return false;
+							if($parent_domain['ip_address'] != '' && $check_parent_domain['ip_address'] == $parent_domain['ip_address']) return false;
+						}
+					}
+				
+					if($check['ip_address'] == '' && $domain['ip_address'] != ''){
+						if($check['parent_domain_id'] > 0){
+							if(is_array($check_parent_domain) && !empty($check_parent_domain)){
+								if($check_parent_domain['ip_address'] == '*') return false;
+								if($check_parent_domain['ip_address'] != '' && $check_parent_domain['ip_address'] == $domain['ip_address']) return false;
+							}
+						}
+					}
+				
+					if($domain['ipv6_address'] == '' && $check['ipv6_address'] != ''){
+						if(is_array($parent_domain) && !empty($parent_domain)){
+							if($parent_domain['ipv6_address'] != '' && $check['ipv6_address'] == $parent_domain['ipv6_address']) return false;
+						}
+					}
+				
+					if($domain['ipv6_address'] == '' && $check['ipv6_address'] == ''){
+						if(is_array($parent_domain) && !empty($parent_domain)){
+							if($parent_domain['ipv6_address'] != '' && $check_parent_domain['ipv6_address'] == $parent_domain['ipv6_address']) return false;
+						}
+					}
+				
+					if($check['ipv6_address'] == '' && $domain['ipv6_address'] != ''){
+						if($check['parent_domain_id'] > 0){
+							if(is_array($check_parent_domain) && !empty($check_parent_domain)){
+								if($check_parent_domain['ipv6_address'] != '' && $check_parent_domain['ipv6_address'] == $domain['ipv6_address']) return false;
+							}
+						}
+					}
+				}
+			}
+            
+        }
         
         return true;
     }

--
Gitblit v1.9.1