From 45e9406a0fd6e872219a09d913bdfa49bd22e87b Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Mon, 29 Feb 2016 14:25:40 -0500
Subject: [PATCH] Merge branch 'stable-3.1'

---
 TODO.txt                                                 |   96 -----------------------
 install/lib/installer_base.lib.php                       |    7 +
 interface/web/admin/form/server_ip.tform.php             |    2 
 install/lib/update.lib.php                               |    7 +
 server/plugins-available/apache2_plugin.inc.php          |   20 ++--
 interface/web/admin/form/server_ip_map.tform.php         |    2 
 interface/lib/classes/validate_server.inc.php            |   61 +++++++++++++++
 server/plugins-available/network_settings_plugin.inc.php |    4 
 server/plugins-available/nginx_plugin.inc.php            |   21 ++--
 install/uninstall.php                                    |   10 +-
 10 files changed, 106 insertions(+), 124 deletions(-)

diff --git a/TODO.txt b/TODO.txt
index 5c6fe38..17f2a20 100644
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,96 +1,4 @@
 
----------------------------------------
-- ISPConfig 3 ToDo list
----------------------------------------
+Please see issue tracker for feature requests and bug reports.
 
-Please feel free to edit this file, add new tasks,
-remove done tasks or assign yourself to a task.
-
-Form Validators
---------------------------------------
-
-Installer
---------------------------------------
-
-- Add a function to let a server join a existing installation.
-- Add Package haveged to requirements (at least if entropy is low) as it raises available entropy significantly which is very needed for DNSSEC Key-generation
-	If it is not installed and entropy is low generating dnssec-keys lasts minutes (and would time out the server thus is not done) and new signing keys are not generated.
-	If there are no keys the zones can not be signed and will only be availableas a unsigned copy.
-
-Uninstaller
---------------------------------------
-
-- Add a function to remove ispconfig user
-
-Server
---------------------------------------
-
-
-Mail module
---------------------------------------
-
-
-Administration module
---------------------------------------
-
-
-- Firewall Solution -- Andrew lathama Latham lathama@gmail.com
-	* Monitor existing IPTABLES rules is done and in the monitor page.
-	* Add IPTABLES rules
-		semi-functional and in development also functional in multiserver
-	* Delete IPTABLES rules
-		semi-functional and in development also functional in multiserver
-	* Merge IPTABLES rules made from the CLI with those made from ISPConfig3
-		Interesting topic about merging control with with the GUI and the CLI
-		interface for a systems adminitstrator who might add a rule during an
-		attack or for trouble shooting and forget to remove it.
-	* Fail2Ban
-		Add configuration for fail2ban on certian systems.  Imagine an admin
-		wishes to use fail2ban on one service but not others. Rare but an issue
-		when a large number of clients use a single NAT for all users and failed
-		logins and traffic looks like an attack.  Maybe a whitelist configuration
-		as an optional setting.
-	* Remoting
-		Enable remoting hooks for updating IPTABLES
-	* Service Checks
-		Adding saftey checks to make sure that the admin does not lock his/herself
-		out of the system by accident.  We all make mistakes.
-
--- Note: I'd love a pure iptables firewall as well. I've made such a script for
-   my work, which uses a simple config file to open/close ports and support for 
-   ip exclusions. I think we could use it as a base to start with, it's up on the dev forum
-   url: http://www.howtoforge.com/forums/showthread.php?p=261311 (Mark_NL)
-
-Clients module
---------------------------------------
-
-
-Sites (web) module
---------------------------------------
-
-
-BE-Designer module
---------------------------------------
-
-WARNING: Please do not use the BE Designer at the moment, the serializing
- function of the module editor may break some of the existing modules.
-
-
-Remoting framework
---------------------------------------
-- Add more connections to other data.  Remoting hooks for FS and Email Quota
-
-Interface
---------------------------------------
-- Enhance the paging in lists (e.g. like this: [1 2 3 4 ... 10])
-- DNS: Add Checkbox to switch dnssec_wanted between Y and N to templates and/or wizard. I recommend doing it in the wizard though.
-
-General tasks
---------------------------------------
-
-- Add, extend or modify comments in PEAR syntax so that they can be read with
-  phpdocumentor.
-
-- Doxygen might be a good idea (phpdocumentor looks nice but no active development)
--- http://drupal.org/node/1354 may have some good ideas.
--- http://engineeredweb.com/blog/10/9/4-reasons-consider-doxygen-over-phpdocumentor
+http://git.ispconfig.org/ispconfig/ispconfig3/issues
\ No newline at end of file
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 363a38c..bbf8cfd 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -217,7 +217,12 @@
 		//* check sql-mode
 		$check_sql_mode = $this->db->queryOneRecord("SELECT @@sql_mode");
 
-		if ($check_sql_mode['@@sql_mode'] != '' && $check_sql_mode['@@sql_mode'] != 'NO_ENGINE_SUBSTITUTION') die('Wrong SQL-mode. You should use NO_ENGINE_SUBSTITUTION');
+		if ($check_sql_mode['@@sql_mode'] != '' && $check_sql_mode['@@sql_mode'] != 'NO_ENGINE_SUBSTITUTION') {
+			echo "Wrong SQL-mode. You should use NO_ENGINE_SUBSTITUTION. Add\n\n";
+			echo "    sql-mode=\"NO_ENGINE_SUBSTITUTION\"\n\n";
+			echo"to the mysqld-section in /etc/mysql/my.cnf and restart mysqld afterwards\n";
+			die();
+		}
 
 		//** Create the database
 		if(!$this->db->query('CREATE DATABASE IF NOT EXISTS ?? DEFAULT CHARACTER SET ?', $conf['mysql']['database'], $conf['mysql']['charset'])) {
diff --git a/install/lib/update.lib.php b/install/lib/update.lib.php
index 9fb57cb..a6bb42d 100644
--- a/install/lib/update.lib.php
+++ b/install/lib/update.lib.php
@@ -125,7 +125,12 @@
 
 	//* check sql-mode
 	$check_sql_mode = $inst->db->queryOneRecord("SELECT @@sql_mode");
-	if ($check_sql_mode['@@sql_mode'] != '' && $check_sql_mode['@@sql_mode'] != 'NO_ENGINE_SUBSTITUTION') die('Wrong SQL-mode. You should use NO_ENGINE_SUBSTITUTION');
+	if ($check_sql_mode['@@sql_mode'] != '' && $check_sql_mode['@@sql_mode'] != 'NO_ENGINE_SUBSTITUTION') {
+		echo "Wrong SQL-mode. You should use NO_ENGINE_SUBSTITUTION. Add\n\n";
+		echo "    sql-mode=\"NO_ENGINE_SUBSTITUTION\"\n\n";
+		echo"to the mysqld-section in /etc/mysql/my.cnf and restart mysqld afterwards\n";
+		die();
+	}
 
 	//* Update $conf array with values from the server.ini that shall be preserved
 	$tmp = $inst->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']);
diff --git a/install/uninstall.php b/install/uninstall.php
index 198a145..c565d46 100644
--- a/install/uninstall.php
+++ b/install/uninstall.php
@@ -36,7 +36,7 @@
 
 require_once "/usr/local/ispconfig/server/lib/config.inc.php";
 require_once "/usr/local/ispconfig/server/lib/app.inc.php";
-require "/usr/local/ispconfig/server/mysql_clientdb.conf";
+require "/usr/local/ispconfig/server/lib/mysql_clientdb.conf";
 
 //** The banner on the command line
 echo "\n\n".str_repeat('-', 80)."\n";
@@ -51,7 +51,7 @@
 echo "\n".str_repeat('-', 80)."\n";
 echo "\n\n>> Uninstall  \n\n";
 
-echo "Are you sure you want to uninsatll ISPConfig? [no]";
+echo "Are you sure you want to uninstall ISPConfig? [no]";
 $input = fgets(STDIN);
 $do_uninstall = rtrim($input);
 
@@ -62,11 +62,11 @@
 
 	$link = mysqli_connect($clientdb_host, $clientdb_user, $clientdb_password);
 	if (!$link) {
-		echo "Unable to connect to the database'.mysql_error($link)";
+		echo "Unable to connect to the database. mysql_error($link)";
 	} else {
-		$result=mysqli_query($link,"DROP DATABASE ".$conf['db_database']."';");
+		$result=mysqli_query($link,"DROP DATABASE ".$conf['db_database'].";");
 		if (!$result) echo "Unable to remove the ispconfig-database ".$conf['db_database']." ".mysqli_error($link)."\n";
-		$result=mysqli_query($link,"DROP USER '".$conf['db_user'] ."';");
+		$result=mysqli_query($link,"DROP USER '".$conf['db_user']."'@'".$conf['db_host']."';");
 	        if (!$result) echo "Unable to remove the ispconfig-database-user ".$conf['db_user']." ".mysqli_error($link)."\n";
 	}
 	mysqli_close($link);
diff --git a/interface/lib/classes/validate_server.inc.php b/interface/lib/classes/validate_server.inc.php
new file mode 100644
index 0000000..6361fb4
--- /dev/null
+++ b/interface/lib/classes/validate_server.inc.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ Copyright (c) 2016, Florian Schaal, schaal @it
+ 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.
+
+ @author Florian Schaal, info@schaal-24.de
+*/
+
+
+class validate_server {
+
+	function get_error($errmsg) {
+		global $app;
+		if(isset($app->tform->wordbook[$errmsg])) {
+			return $app->tform->wordbook[$errmsg]."<br>\r\n";
+		} else {
+			 return $errmsg."<br>\r\n";
+		}
+	}
+
+	/**
+	 * Validator function for server-ip
+	*/
+	function check_server_ip($field_name, $field_value, $validator) {
+		if($_POST['ip_type'] == 'IPv4') {
+			if(!filter_var($field_value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+				return $this->get_error($validator['errmsg']);
+			}
+		} elseif ($_POST['ip_type'] == 'IPv6') {
+			if(!filter_var($field_value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+				return $this->get_error($validator['errmsg']);
+			}
+		} else return $this->get_error($validator['errmsg']);
+	}
+
+}
+
diff --git a/interface/web/admin/form/server_ip.tform.php b/interface/web/admin/form/server_ip.tform.php
index 0dbdfe1..cd7190e 100644
--- a/interface/web/admin/form/server_ip.tform.php
+++ b/interface/web/admin/form/server_ip.tform.php
@@ -121,7 +121,7 @@
 		'ip_address' => array (
 			'datatype' => 'VARCHAR',
 			'formtype' => 'TEXT',
-			'validators' => array (  0 => array ( 'type' => 'ISIP',
+			'validators' => array (  0 => array ( 'type' => 'CUSTOM', 'class' => 'validate_server', 'function' => 'check_server_ip',
 					'errmsg'=> 'ip_error_wrong'),
 				1 => array ( 'type' => 'UNIQUE',
 					'errmsg'=> 'ip_error_unique'),
diff --git a/interface/web/admin/form/server_ip_map.tform.php b/interface/web/admin/form/server_ip_map.tform.php
index fb61022..4f7ed3d 100644
--- a/interface/web/admin/form/server_ip_map.tform.php
+++ b/interface/web/admin/form/server_ip_map.tform.php
@@ -69,7 +69,7 @@
 			'datatype' => 'VARCHAR',
 			'formtype' => 'TEXT',
 			'validators' => array (  
-				0 => array ( 'type' => 'ISIP', 'errmsg'=> 'ip_error_wrong'),
+				0 => array ( 'type' => 'ISIPV4', 'errmsg'=> 'ip_error_wrong'),
 				1 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'destination_ip_empty'),
             ),
 			'default' => '',
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 3237bb5..a8377f5 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -1119,14 +1119,7 @@
 		}
 		*/
 
-		//* Generate Let's Encrypt SSL certificat
-		if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y' && ( // ssl and let's encrypt is active
-			($data['old']['ssl'] == 'n' || $data['old']['ssl_letsencrypt'] == 'n') // we have new let's encrypt configuration
-			|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
-			|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
-			|| ($data['new']['type'] == 'subdomain') // we have new or update on subdomain
-			|| ($data['old']['type'] == 'alias' || $data['new']['type'] == 'alias') // we have new or update on aliasdomain
-		)) {
+		if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y') {
 			if(substr($domain, 0, 2) === '*.') {
 				// wildcard domain not yet supported by letsencrypt!
 				$app->log('Wildcard domains not yet supported by letsencrypt, so changing ' . $domain . ' to ' . substr($domain, 2), LOGLEVEL_WARN);
@@ -1135,7 +1128,16 @@
 			
 			$data['new']['ssl_domain'] = $domain;
 			$vhost_data['ssl_domain'] = $domain;
+		}
 
+		//* Generate Let's Encrypt SSL certificat
+		if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y' && ( // ssl and let's encrypt is active
+			($data['old']['ssl'] == 'n' || $data['old']['ssl_letsencrypt'] == 'n') // we have new let's encrypt configuration
+			|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
+			|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
+			|| ($data['new']['type'] == 'subdomain') // we have new or update on subdomain
+			|| ($data['old']['type'] == 'alias' || $data['new']['type'] == 'alias') // we have new or update on aliasdomain
+		)) {
 			// default values
 			$temp_domains = array();
 			$lddomain = $domain;
@@ -1709,7 +1711,7 @@
 					$data['new']['ipv6_address'] = implode(':', $explode_v6);
 				}
 			}
-
+			if($data['new']['ipv6_address'] == '*') $data['new']['ipv6_address'] = '::';
 			$tmp_vhost_arr = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 0, 'port' => 80);
 			if(count($rewrite_rules) > 0)  $tmp_vhost_arr = $tmp_vhost_arr + array('redirects' => $rewrite_rules);
 			if(count($alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $alias_seo_redirects);
diff --git a/server/plugins-available/network_settings_plugin.inc.php b/server/plugins-available/network_settings_plugin.inc.php
index 13dbf3c..5ce6f93 100644
--- a/server/plugins-available/network_settings_plugin.inc.php
+++ b/server/plugins-available/network_settings_plugin.inc.php
@@ -110,7 +110,7 @@
 						/*
 						 * don't insert the main-ip again!
 						 */
-						if ($rec['ip_address'] != $server_config['ip_address'])
+						if ($rec['ip_address'] != $server_config['ip_address'] && filter_var($rec['ip_address'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
 						{
 							$ip_records[$n] = array(
 								'id' => $n,
@@ -188,7 +188,7 @@
 						/*
 						 * don't insert the main-ip again!
 						 */
-						if ($rec['ip_address'] != $server_config['ip_address'])
+						if ($rec['ip_address'] != $server_config['ip_address'] && filter_var($rec['ip_address'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
 						{
 							$ip_records[$n] = array(
 								'id' => $n,
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index b50d4eb..b3276e4 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -1232,15 +1232,7 @@
 
 		$tpl->setVar('ssl_letsencrypt', "n");
 		
-		//* Generate Let's Encrypt SSL certificat
-		if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y' && ( // ssl and let's encrypt is active
-			($data['old']['ssl'] == 'n' || $data['old']['ssl_letsencrypt'] == 'n') // we have new let's encrypt configuration
-			|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
-			|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
-			|| ($data['new']['type'] == 'subdomain') // we have new or update on subdomain
-			|| ($data['old']['type'] == 'alias' || $data['new']['type'] == 'alias') // we have new or update on alias domain
-		)) {
-
+		if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y') {
 			//* be sure to have good domain
 			if(substr($domain, 0, 2) === '*.') {
 				// wildcard domain not yet supported by letsencrypt!
@@ -1250,7 +1242,16 @@
 
 			$data['new']['ssl_domain'] = $domain;
 			$vhost_data['ssl_domain'] = $domain;
-			
+		}
+		
+		//* Generate Let's Encrypt SSL certificat
+		if($data['new']['ssl'] == 'y' && $data['new']['ssl_letsencrypt'] == 'y' && ( // ssl and let's encrypt is active
+			($data['old']['ssl'] == 'n' || $data['old']['ssl_letsencrypt'] == 'n') // we have new let's encrypt configuration
+			|| ($data['old']['domain'] != $data['new']['domain']) // we have domain update
+			|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
+			|| ($data['new']['type'] == 'subdomain') // we have new or update on subdomain
+			|| ($data['old']['type'] == 'alias' || $data['new']['type'] == 'alias') // we have new or update on alias domain
+		)) {
 			// default values
 			$temp_domains = array();
 			$lddomain     = $domain;

--
Gitblit v1.9.1