From 62e25488daa4f857f717d2687e820091ffaa8a13 Mon Sep 17 00:00:00 2001
From: Marius Cramer <m.cramer@pixcept.de>
Date: Fri, 19 Dec 2014 12:21:38 -0500
Subject: [PATCH] Merge remote-tracking branch 'ispc/master' into new-layout-3.1

---
 server/conf/nginx_vhost.conf.master                         |    6 
 interface/web/admin/templates/server_config_web_edit.htm    |   10 +
 interface/web/mail/lib/lang/en_mail_forward.lng             |    1 
 interface/web/login/password_reset.php                      |    2 
 interface/web/sites/lib/lang/en_web_vhost_domain.lng        |    3 
 server/conf/php-fcgi-starter.master                         |    3 
 interface/web/client/lib/lang/en_reseller.lng               |    1 
 interface/web/sites/lib/lang/de_web_directive_snippets.lng  |    3 
 install/tpl/server.ini.master                               |    1 
 interface/web/admin/form/server_config.tform.php            |   11 +
 interface/web/client/lib/lang/en_client.lng                 |   25 +-
 interface/web/sites/templates/web_directive_snippets.htm    |   14 +
 server/conf/vhost.conf.master                               |    3 
 interface/web/admin/lib/lang/de_server_config.lng           |    7 
 interface/web/mail/lib/lang/de_mail_forward.lng             |    1 
 interface/web/sites/templates/web_vhost_domain_edit.htm     |   23 ++
 install/sql/ispconfig3.sql                                  |    3 
 server/plugins-available/apache2_plugin.inc.php             |    6 
 interface/web/admin/form/directive_snippets.tform.php       |    6 
 server/plugins-available/nginx_plugin.inc.php               |   11 +
 interface/lib/classes/db_mysql.inc.php                      |    2 
 interface/web/admin/lib/lang/de_directive_snippets.lng      |    1 
 interface/web/js/scrigo.js.php                              |    4 
 interface/web/sites/form/web_vhost_domain.tform.php         |   17 ++
 interface/web/sites/web_vhost_domain_edit.php               |   12 +
 server/conf/php-cgi-starter.master                          |    4 
 server/conf/apache_apps.vhost.master                        |   10 +
 interface/web/client/templates/client_edit_limits.htm       |    4 
 server/lib/classes/db_mysql.inc.php                         |    4 
 interface/web/admin/lib/lang/en_directive_snippets.lng      |    1 
 interface/web/sites/templates/web_vhost_domain_advanced.htm |    2 
 interface/web/client/form/client.tform.php                  |    7 
 interface/web/themes/default/templates/main.tpl.htm         |    1 
 interface/lib/classes/validate_client.inc.php               |   78 +++++++++
 interface/web/sites/ajax_get_json.php                       |   11 +
 interface/web/admin/lib/lang/en_server_config.lng           |    6 
 interface/web/client/lib/lang/de_reseller.lng               |    3 
 interface/web/sites/lib/lang/en_web_directive_snippets.lng  |    3 
 interface/web/client/lib/lang/de_client.lng                 |   28 +++
 interface/web/sites/lib/lang/de_web_vhost_domain.lng        |    3 
 install/sql/incremental/upd_0079.sql                        |    2 
 install/sql/incremental/upd_0080.sql                        |    1 
 interface/web/admin/templates/directive_snippets_edit.htm   |   17 ++
 interface/lib/lang/en.lng                                   |    2 
 interface/lib/classes/plugin_directive_snippets.inc.php     |   72 +++++++++
 interface/web/client/form/reseller.tform.php                |    7 
 interface/web/sites/templates/web_vhost_domain_ssl.htm      |   10 +
 server/conf/php_fpm_pool.conf.master                        |    4 
 48 files changed, 412 insertions(+), 44 deletions(-)

diff --git a/install/sql/incremental/upd_0079.sql b/install/sql/incremental/upd_0079.sql
new file mode 100644
index 0000000..5dd0152
--- /dev/null
+++ b/install/sql/incremental/upd_0079.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `directive_snippets` ADD `customer_viewable` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `snippet`;
+ALTER TABLE `web_domain` ADD `directive_snippets_id` int(11) unsigned NOT NULL default '0';
\ No newline at end of file
diff --git a/install/sql/incremental/upd_0080.sql b/install/sql/incremental/upd_0080.sql
new file mode 100644
index 0000000..fcdcb62
--- /dev/null
+++ b/install/sql/incremental/upd_0080.sql
@@ -0,0 +1 @@
+ALTER TABLE `web_domain` ADD COLUMN `enable_spdy` ENUM('y','n') NULL DEFAULT 'n' AFTER `proxy_directives`;
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 3f65bfe..b6390e7 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -429,6 +429,7 @@
   `name` varchar(255) DEFAULT NULL,
   `type` varchar(255) DEFAULT NULL,
   `snippet` mediumtext,
+  `customer_viewable` ENUM('n','y') NOT NULL DEFAULT 'n',
   `active` enum('n','y') NOT NULL DEFAULT 'y',
   PRIMARY KEY (`directive_snippets_id`)
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
@@ -1876,10 +1877,12 @@
   `traffic_quota_lock` enum('n','y') NOT NULL default 'n',
   `fastcgi_php_version` varchar(255) DEFAULT NULL,
   `proxy_directives` mediumtext,
+  `enable_spdy` ENUM('y','n') NULL DEFAULT 'n',
   `last_quota_notification` date NULL default NULL,
   `rewrite_rules` mediumtext,
   `added_date` date NOT NULL DEFAULT '0000-00-00',
   `added_by` varchar(255) DEFAULT NULL,
+  `directive_snippets_id` int(11) unsigned NOT NULL default '0',
   PRIMARY KEY  (`domain_id`),
   UNIQUE KEY `serverdomain` (  `server_id` , `ip_address`,  `domain` )
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index c563650..7805988 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -85,6 +85,7 @@
 php_ini_path_cgi=/etc/php5/cgi/php.ini
 check_apache_config=y
 enable_sni=y
+enable_spdy=n
 enable_ip_wildcard=y
 overtraffic_notify_admin=y
 overtraffic_notify_client=y
diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php
index c8d569b..d9ec9b8 100644
--- a/interface/lib/classes/db_mysql.inc.php
+++ b/interface/lib/classes/db_mysql.inc.php
@@ -86,7 +86,7 @@
 			$this->_sqlerror('Zugriff auf Datenbankserver fehlgeschlagen! / Database server not accessible!');
 			return false;
 		}
-		if(!((bool)mysqli_query( $this->_iConnId, "USE $this->dbName"))) {
+		if(!((bool)mysqli_query( $this->_iConnId, 'USE `' . $this->dbName . '`'))) {
 			$this->close();
 			$this->_sqlerror('Datenbank nicht gefunden / Database not found');
 			return false;
diff --git a/interface/lib/classes/plugin_directive_snippets.inc.php b/interface/lib/classes/plugin_directive_snippets.inc.php
new file mode 100644
index 0000000..dbc7d48
--- /dev/null
+++ b/interface/lib/classes/plugin_directive_snippets.inc.php
@@ -0,0 +1,72 @@
+<?php
+
+
+class plugin_directive_snippets extends plugin_base
+{
+	var $module;
+	var $form;
+	var $tab;
+	var $record_id;
+	var $formdef;
+	var $options;
+
+	public function onShow()
+	{
+		global $app;
+
+		$listTpl = new tpl;
+		$listTpl->newTemplate('templates/web_directive_snippets.htm');
+
+		//* Loading language file
+		$lng_file = "lib/lang/".$_SESSION["s"]["language"]."_web_directive_snippets.lng";
+
+		include $lng_file;
+		$listTpl->setVar($wb);
+
+		$message = '';
+		$error   = '';
+
+		$server_type = $app->getconf->get_server_config($this->form->dataRecord['server_id'], 'web');
+		$server_type = $server_type['server_type'];
+		$records = $app->db->queryAllRecords("SELECT directive_snippets_id, name FROM directive_snippets WHERE customer_viewable = 'y' AND type = ? ORDER BY name ASC", $server_type);
+
+		for ($i = 0, $c = count($records); $i < $c; $i++)
+		{
+			$records[$i]['is_selected'] = false;
+
+			if ($this->form->dataRecord['directive_snippets_id'] === $records[$i]['directive_snippets_id'])
+				$records[$i]['is_selected'] = true;
+		}
+
+		$listTpl->setLoop('records', $records);
+
+		$list_name = 'directive_snippets_list';
+		$_SESSION["s"]["list"][$list_name]["parent_id"] = $this->form->id;
+		$_SESSION["s"]["list"][$list_name]["parent_name"] = $app->tform->formDef["name"];
+		$_SESSION["s"]["list"][$list_name]["parent_tab"] = $_SESSION["s"]["form"]["tab"];
+		$_SESSION["s"]["list"][$list_name]["parent_script"] = $app->tform->formDef["action"];
+		$_SESSION["s"]["form"]["return_to"] = $list_name;
+
+		return $listTpl->grab();
+	}
+	
+	public function onUpdate()
+	{
+		global $app, $conf;
+
+		if (isset($this->form->dataRecord['directive_snippets_id']) && $this->form->oldDataRecord['directive_snippets_id'] !== $this->form->dataRecord['directive_snippets_id']) {
+			$app->db->query('UPDATE web_domain SET directive_snippets_id = ? WHERE domain_id = ?', $this->form->dataRecord['directive_snippets_id'], $this->form->id);
+		}
+	}
+
+	public function onInsert()
+	{
+		global $app, $conf;
+
+		if (isset($this->form->dataRecord['directive_snippets_id'])) {
+			$app->db->query('UPDATE web_domain SET directive_snippets_id = ? WHERE domain_id = ?', $this->form->dataRecord['directive_snippets_id'], $this->form->id);
+		}
+	}
+
+}
+?>
\ No newline at end of file
diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php
index 0f90a5b..198701b 100644
--- a/interface/lib/classes/validate_client.inc.php
+++ b/interface/lib/classes/validate_client.inc.php
@@ -136,7 +136,85 @@
 		}
 	}
 
+	function check_vat_id ($field_name, $field_value, $validator){
+		global $app, $page;
+		
+		$vatid = trim($field_value);
+		if(isset($app->remoting_lib->primary_id)) {
+			$country = $app->remoting_lib->dataRecord['country'];
+		} else {
+			$country = $page->dataRecord['country'];
+		}
+		
+		// check if country is member of EU
+		$country_details = $app->db->queryOneRecord("SELECT * FROM country WHERE iso = '".$country."'");
+		if($country_details['eu'] == 'y' && $vatid != ''){
+		
+			$vatid = preg_replace('/\s+/', '', $vatid);
+			$vatid = str_replace(array('.', '-', ','), '', $vatid);
+			$cc = substr($vatid, 0, 2);
+			$vn = substr($vatid, 2);
 
+			// Test if the country of the VAT-ID matches the country of the customer
+			if($country != ''){
+				if(strtoupper($cc) != $country){
+					$errmsg = $validator['errmsg'];
+					if(isset($app->tform->wordbook[$errmsg])) {
+						return $app->tform->wordbook[$errmsg]."<br>\r\n";
+					} else {
+						return $errmsg."<br>\r\n";
+					}
+				}
+			}
+
+			$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl");
+
+			if($client){
+				$params = array('countryCode' => $cc, 'vatNumber' => $vn);
+				try{
+					$r = $client->checkVat($params);
+					if($r->valid == true){
+					} else {
+						$errmsg = $validator['errmsg'];
+							if(isset($app->tform->wordbook[$errmsg])) {
+								return $app->tform->wordbook[$errmsg]."<br>\r\n";
+							} else {
+								return $errmsg."<br>\r\n";
+							}
+					}
+
+					// This foreach shows every single line of the returned information
+					/*
+					foreach($r as $k=>$prop){
+						echo $k . ': ' . $prop;
+					}
+					*/
+
+				} catch(SoapFault $e) {
+					//echo 'Error, see message: '.$e->faultstring;
+					switch ($e->faultstring) {
+						case 'INVALID_INPUT':
+							$errmsg = $validator['errmsg'];
+							if(isset($app->tform->wordbook[$errmsg])) {
+								return $app->tform->wordbook[$errmsg]."<br>\r\n";
+							} else {
+								return $errmsg."<br>\r\n";
+							}
+							break;
+						// the following cases shouldn't be the user's fault, so we return no error
+						case 'SERVICE_UNAVAILABLE':
+						case 'MS_UNAVAILABLE':
+						case 'TIMEOUT':
+						case 'SERVER_BUSY':
+							break;
+					}
+				}
+			} else {
+				// Connection to host not possible, europe.eu down?
+				// this shouldn't be the user's fault, so we return no error
+			}
+		}
+	}
 
 
 }
diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng
index c89c97a..3c2bfaf 100644
--- a/interface/lib/lang/en.lng
+++ b/interface/lib/lang/en.lng
@@ -26,7 +26,7 @@
 $wb['filter_txt'] = "Filter";
 $wb['add_new_record_txt'] = "Add new record";
 $wb['btn_save_txt'] = "Save";
-$wb['btn_cancel_txt'] = "Back";
+$wb['btn_cancel_txt'] = "Cancel";
 $wb['top_menu_system'] = 'System';
 $wb['top_menu_client'] = 'Client';
 $wb['top_menu_email'] = 'Email';
diff --git a/interface/web/admin/form/directive_snippets.tform.php b/interface/web/admin/form/directive_snippets.tform.php
index 2af05af..8db725b 100644
--- a/interface/web/admin/form/directive_snippets.tform.php
+++ b/interface/web/admin/form/directive_snippets.tform.php
@@ -93,6 +93,12 @@
 			'maxlength' => '255',
 			'searchable' => 2
 		),
+		'customer_viewable' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default' => 'n',
+			'value'  => array(0 => 'n', 1 => 'y')
+		),
 		'active' => array (
 			'datatype' => 'VARCHAR',
 			'formtype' => 'CHECKBOX',
diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php
index aa9adc5..190c8c4 100644
--- a/interface/web/admin/form/server_config.tform.php
+++ b/interface/web/admin/form/server_config.tform.php
@@ -993,7 +993,7 @@
 			'datatype' => 'VARCHAR',
 			'formtype' => 'SELECT',
 			'default' => 'fast-cgi',
-			'value' => array('no' => 'disabled_txt', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM'),
+			'value' => array('no' => 'disabled_txt', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM'),
 			'searchable' => 2
 		),
 		'nginx_cgi_socket' => array(
@@ -1021,6 +1021,15 @@
 			'width' => '40',
 			'maxlength' => '255'
 		),
+		'enable_spdy' => array (
+			'datatype' => 'VARCHAR',
+			'formtype' => 'CHECKBOX',
+			'default'  => 'n',
+			'value' => array (
+				0 => 'n',
+				1 => 'y'
+			)
+		),
 		'apps_vhost_port' => array(
 			'datatype' => 'VARCHAR',
 			'formtype' => 'TEXT',
diff --git a/interface/web/admin/lib/lang/de_directive_snippets.lng b/interface/web/admin/lib/lang/de_directive_snippets.lng
index 18ce2d5..83a6b3c 100644
--- a/interface/web/admin/lib/lang/de_directive_snippets.lng
+++ b/interface/web/admin/lib/lang/de_directive_snippets.lng
@@ -7,4 +7,5 @@
 $wb['directive_snippets_name_empty'] = 'Bitte geben Sie einen Namen für den Schnipsel an.';
 $wb['directive_snippets_name_error_unique'] = 'Es existiert schon ein Direktiven-Schnipsel mit diesem Namen.';
 $wb['variables_txt'] = 'Variablen';
+$wb['customer_viewable_txt'] = 'Sichtbar für Kunden';
 ?>
diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng
index 9afd35c..1447411 100644
--- a/interface/web/admin/lib/lang/de_server_config.lng
+++ b/interface/web/admin/lib/lang/de_server_config.lng
@@ -256,4 +256,11 @@
 $wb['crontab_dir_error_regex'] = 'Invalid crontab directory.';
 $wb['cron_wget_error_regex'] = 'Invalid cron wget path.';
 $wb['network_filesystem_txt'] = 'Netzwerk-Dateisystem';
+$wb['overquota_db_notify_admin_txt'] = 'Datenbank-Quota-Warnungen an den Administrator senden';
+$wb['overquota_db_notify_client_txt'] = 'Datenbank-Quota-Warnungen an den Kunden senden';
+$wb['php_ini_check_minutes_txt'] = 'Prüfe php.ini alle X Minuten auf Änderungen';
+$wb['php_ini_check_minutes_error_empty'] = 'Bitte geben Sie einen Wert an, wie oft die php.ini auf Änderungen geprüft werden soll.';
+$wb['php_ini_check_minutes_info_txt'] = '0 = keine Prüfung';
+$wb['php_handler_txt'] = 'Standard-PHP-Handler';
+$wb['enable_spdy_txt'] = 'Stellt SPDY zur Verfügung';
 ?>
diff --git a/interface/web/admin/lib/lang/en_directive_snippets.lng b/interface/web/admin/lib/lang/en_directive_snippets.lng
index 9d9b0ae..e8733cd 100644
--- a/interface/web/admin/lib/lang/en_directive_snippets.lng
+++ b/interface/web/admin/lib/lang/en_directive_snippets.lng
@@ -7,4 +7,5 @@
 $wb["directive_snippets_name_empty"] = 'Please specify a name for the snippet.';
 $wb["directive_snippets_name_error_unique"] = 'There is already a directive snippet with this name.';
 $wb['variables_txt'] = 'Variables';
+$wb['customer_viewable_txt'] = 'Customer viewable';
 ?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng
index dde50a0..8affba0 100644
--- a/interface/web/admin/lib/lang/en_server_config.lng
+++ b/interface/web/admin/lib/lang/en_server_config.lng
@@ -205,7 +205,7 @@
 $wb["overquota_db_notify_admin_txt"] = 'Send DB quota warnings to admin';
 $wb["overquota_db_notify_client_txt"] = 'Send DB quota warnings to client';
 $wb['monitor_system_updates_txt'] = 'Check for Linux updates';
-$wb['php_handler_txt'] = "PHP Handler";
+$wb['php_handler_txt'] = "Default PHP Handler";
 $wb['disabled_txt'] = 'Disabled';
 $wb['dkim_strength_txt'] = 'DKIM strength';
 $wb['monitor_system_updates_txt'] = 'Check for Linux updates';
@@ -260,4 +260,8 @@
 $wb['crontab_dir_error_regex'] = 'Invalid crontab directory.';
 $wb['cron_wget_error_regex'] = 'Invalid cron wget path.';
 $wb['network_filesystem_txt'] = 'Network Filesystem';
+$wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes';
+$wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.';
+$wb['php_ini_check_minutes_info_txt'] = '0 = no check';
+$wb['enable_spdy_txt'] = 'Makes SPDY available';
 ?>
diff --git a/interface/web/admin/templates/directive_snippets_edit.htm b/interface/web/admin/templates/directive_snippets_edit.htm
index 7a17cb6..ca5cb96 100644
--- a/interface/web/admin/templates/directive_snippets_edit.htm
+++ b/interface/web/admin/templates/directive_snippets_edit.htm
@@ -19,6 +19,12 @@
                 <label for="snippet">{tmpl_var name='snippet_txt'}</label>
                 <textarea name="snippet" id="snippet" rows='10' cols='50' style="width:400px;">{tmpl_var name='snippet'}</textarea><span class="nginx"> &nbsp; {tmpl_var name='variables_txt'}: </span><a href="javascript:void(0);" class="addPlaceholder nginx">{DOCROOT}</a><span class="nginx">, </span><a href="javascript:void(0);" class="addPlaceholder nginx">{FASTCGIPASS}</a>
             </div>
+			<div class="ctrlHolder">
+                <p class="label">{tmpl_var name='customer_viewable_txt'}</p>
+                <div class="multiField">
+                    {tmpl_var name='customer_viewable'}
+                </div>
+            </div>
             <div class="ctrlHolder">
                 <p class="label">{tmpl_var name='active_txt'}</p>
                 <div class="multiField">
@@ -43,8 +49,19 @@
     } else {
         jQuery('.nginx:visible').hide();
     }
+	
+	if (jQuery('#type').val() != 'nginx' && jQuery('#type').val() != 'apache') {
+		jQuery('#customer_viewable').closest('div.ctrlHolder:visible').hide();
+	}else {
+		jQuery('#customer_viewable').closest('div.ctrlHolder:hidden').show();
+	}
     
     jQuery('#type').change(function(){
+		if (jQuery(this).val() != 'nginx' && jQuery(this).val() != 'apache') {
+			jQuery('#customer_viewable').closest('div.ctrlHolder:visible').hide();
+		} else {
+			jQuery('#customer_viewable').closest('div.ctrlHolder:hidden').show();
+		}
         if(jQuery(this).val() == 'nginx'){
             jQuery('.nginx:hidden').show();
         } else {
diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm
index 04a8c22..c4079bf 100644
--- a/interface/web/admin/templates/server_config_web_edit.htm
+++ b/interface/web/admin/templates/server_config_web_edit.htm
@@ -161,6 +161,14 @@
                         {tmpl_var name='enable_sni'}
                     </div>
                 </div>
+				<div class="ctrlHolder">
+					<p class="label">
+						<tmpl_var name="enable_spdy_txt">
+					</p>
+					<div class="multiField">
+						<tmpl_var name="enable_spdy">
+					</div>
+				</div>
                 <div class="ctrlHolder">
                     <label for="CA_path">{tmpl_var name='CA_path_txt'}</label>
                     <input name="CA_path" id="CA_path" value="{tmpl_var name='CA_path'}" size="40" maxlength="255" type="text" autocomplete="off" class="textInput" />
@@ -237,7 +245,7 @@
                 </div>
                 <div class="ctrlHolder">
                     <label for="php_ini_check_minutes">{tmpl_var name='php_ini_check_minutes_txt'}</label>
-                    <input name="php_ini_check_minutes" id="php_ini_check_minutes" value="{tmpl_var name='php_ini_check_minutes'}" size="40" type="text" class="textInput" /> {tmpl_var name='php_ini_check_minutes_info_txt'}
+                    <input name="php_ini_check_minutes" id="php_ini_check_minutes" value="{tmpl_var name='php_ini_check_minutes'}" size="40" type="text" class="textInput" /> &nbsp;{tmpl_var name='php_ini_check_minutes_info_txt'}
                 </div>
                 <div class="ctrlHolder">
                     <label for="php_handler">{tmpl_var name='php_handler_txt'}</label>
diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php
index 3625452..8d2ce89 100644
--- a/interface/web/client/form/client.tform.php
+++ b/interface/web/client/form/client.tform.php
@@ -367,7 +367,12 @@
 			'width'  => '30',
 			'maxlength' => '255',
 			'rows'  => '',
-			'cols'  => ''
+			'cols'  => '',
+			'validators' => array (  0 => array ( 'type' => 'CUSTOM',
+					'class' => 'validate_client',
+					'function' => 'check_vat_id',
+					'errmsg'=> 'invalid_vat_id'),
+				),
 		),
 		'company_id' => array (
 			'datatype' => 'VARCHAR',
diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php
index 8efedf7..b70c765 100644
--- a/interface/web/client/form/reseller.tform.php
+++ b/interface/web/client/form/reseller.tform.php
@@ -364,7 +364,12 @@
 			'width'  => '30',
 			'maxlength' => '255',
 			'rows'  => '',
-			'cols'  => ''
+			'cols'  => '',
+			'validators' => array (  0 => array ( 'type' => 'CUSTOM',
+					'class' => 'validate_client',
+					'function' => 'check_vat_id',
+					'errmsg'=> 'invalid_vat_id'),
+				),
 		),
 		'company_id' => array (
 			'datatype' => 'VARCHAR',
diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng
index dbaa9a5..7ee7226 100644
--- a/interface/web/client/lib/lang/de_client.lng
+++ b/interface/web/client/lib/lang/de_client.lng
@@ -110,7 +110,7 @@
 $wb['limit_backup_txt'] = 'Backupfunktion verfügbar';
 $wb['limit_dns_slave_zone_error_notint'] = 'Das Secondary DNS Zonen Limit muss eine Zahl sein.';
 $wb['customer_no_txt'] = 'Kundennummer';
-$wb['vat_id_txt'] = 'USt-ID';
+$wb['vat_id_txt'] = 'USt.-ID';
 $wb['required_fields_txt'] = '* Benötigte Felder';
 $wb['limit_mailmailinglist_txt'] = 'Max. Anzahl an Mailinglisten';
 $wb['limit_mailmailinglist_error_notint'] = 'Das Mailinglisten Limit muss eine Zahl sein.';
@@ -151,8 +151,30 @@
 $wb['gender_txt'] = 'Anrede';
 $wb['gender_m_txt'] = 'Herr';
 $wb['gender_f_txt'] = 'Frau';
+$wb["web_servers_txt"] = 'Webserver';
+$wb["web_servers_placeholder"] = 'Webserver auswählen';
+$wb['no_web_server_error'] = 'Bitte wählen Sie mind. einen Webserver aus.';
+$wb['web_servers_used'] = 'Der Server, den Sie entfernen möchten, wird als Webserver verwendet. Bitte stellen Sie sicher, daß dieser Server nicht von diesem Kunden benutzt wird, bevor Sie ihn entfernen.';
+$wb["dns_servers_txt"] = 'DNS-Server';
+$wb["dns_servers_placeholder"] = 'DNS-Server wählen';
+$wb['no_dns_server_error'] = 'Bitte wählen Sie mind. einen DNS-Server aus.';
+$wb['dns_servers_used'] = 'Der Server, den Sie entfernen möchten, wird als DNS-Server verwendet. Bitte stellen Sie sicher, daß dieser Server nicht von diesem Kunden benutzt wird, bevor Sie ihn entfernen.';
+$wb["db_servers_txt"] = 'Datenbank-Server';
+$wb["db_servers_placeholder"] = 'Datenbank-Server wählen';
+$wb['no_db_server_error'] = 'Bitte wählen Sie mind. einen Datenbank-Server aus.';
+$wb['db_servers_used'] = 'Der Server, den Sie entfernen möchten, wird als Datenbank-Server verwendet. Bitte stellen Sie sicher, daß dieser Server nicht von diesem Kunden benutzt wird, bevor Sie ihn entfernen.';
+$wb["mail_servers_txt"] = 'Mailserver';
+$wb["mail_servers_placeholder"] = 'Mailserver wählen';
+$wb['no_mail_server_error'] = 'Bitte wählen Sie mind. einen Mailserver aus.';
+$wb['mail_servers_used'] = 'Der Server, den Sie entfernen möchten, wird als Mailserver verwendet. Bitte stellen Sie sicher, daß dieser Server nicht von diesem Kunden benutzt wird, bevor Sie ihn entfernen.';
 $wb['added_by_txt'] = 'Added by';
 $wb['added_date_txt'] = 'Added date';
-$wb['parent_client_id_txt'] = 'Client of reseller';
-$wb['none_txt'] = 'none';
+$wb['parent_client_id_txt'] = 'Kunde von Reseller';
+$wb['none_txt'] = 'keiner';
+$wb['limit_database_quota_txt'] = 'Datenbank-Quota';
+$wb['limit_database_quota_error_notint'] = 'Das Datenbank-quota muß eine Nummer sein.';
+$wb['reseller_txt'] = 'Reseller';
+$wb['btn_save_txt'] = 'Speichern';
+$wb['btn_cancel_txt'] = 'Abbrechen';
+$wb['invalid_vat_id'] = 'Die USt.-ID ist ungültig.';
 ?>
diff --git a/interface/web/client/lib/lang/de_reseller.lng b/interface/web/client/lib/lang/de_reseller.lng
index 1595e56..541b5d2 100644
--- a/interface/web/client/lib/lang/de_reseller.lng
+++ b/interface/web/client/lib/lang/de_reseller.lng
@@ -106,7 +106,7 @@
 $wb['limit_dns_slave_zone_error_notint'] = 'Das Secondary DNS Zonen Limit muss eine Zahl sein.';
 $wb['limit_dns_record_error_notint'] = 'Das DNS Eintrag Limit muss eine Zahl sein.';
 $wb['customer_no_txt'] = 'Kundennummer';
-$wb['vat_id_txt'] = 'USt-ID';
+$wb['vat_id_txt'] = 'USt.-ID';
 $wb['required_fields_txt'] = '* Benötigte Felder';
 $wb['limit_webdav_user_txt'] = 'Max. Anzahl an WebDAV Benutzern';
 $wb['limit_webdav_user_error_notint'] = 'Das WebDAV Benutzer Limit muss eine Zahl sein.';
@@ -160,4 +160,5 @@
 $wb['limit_domainmodule_txt'] = 'Domainmodule Limit';
 $wb['client_limits_txt'] = 'Client Limits';
 $wb['err_msg_master_tpl_set'] = 'All custom limit settings are ignored if any master template other than \\"custom\\" is selected.';
+$wb['invalid_vat_id'] = 'Die USt.-ID ist ungültig.';
 ?>
diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng
index d14df62..e7e634b 100644
--- a/interface/web/client/lib/lang/en_client.lng
+++ b/interface/web/client/lib/lang/en_client.lng
@@ -155,21 +155,21 @@
 $wb['gender_m_txt'] = 'Mr.';
 $wb['gender_f_txt'] = 'Ms.';
 $wb["web_servers_txt"] = 'Webservers';
-$wb["web_servers_placeholder"] = 'Select Webservers';
+$wb["web_servers_placeholder"] = 'Select webservers';
 $wb['no_web_server_error'] = 'At least one webserver must be selected.';
-$wb['web_servers_used'] = 'The server you are trying to remove from this client is used as a webserver. Be sure that this server is not used by this client before to remove it.';
-$wb["dns_servers_txt"] = 'DNS Server';
-$wb["dns_servers_placeholder"] = 'Select DNS Servers';
+$wb['web_servers_used'] = 'The server you are trying to remove from this client is used as a webserver. Be sure that this server is not used by this client before you remove it.';
+$wb["dns_servers_txt"] = 'DNS servers';
+$wb["dns_servers_placeholder"] = 'Select DNS servers';
 $wb['no_dns_server_error'] = 'At least one DNS server must be selected.';
-$wb['dns_servers_used'] = 'The server you are trying to remove from this client is used as a DNS server. Be sure that this server is not used by this client before to remove it.';
-$wb["db_servers_txt"] = 'Database Server';
-$wb["db_servers_placeholder"] = 'Select Database Servers';
+$wb['dns_servers_used'] = 'The server you are trying to remove from this client is used as a DNS server. Be sure that this server is not used by this client before you remove it.';
+$wb["db_servers_txt"] = 'Database servers';
+$wb["db_servers_placeholder"] = 'Select database servers';
 $wb['no_db_server_error'] = 'At least one Database server must be selected.';
-$wb['db_servers_used'] = 'The server you are trying to remove from this client is used as a Database server. Be sure that this server is not used by this client before to remove it.';
+$wb['db_servers_used'] = 'The server you are trying to remove from this client is used as a Database server. Be sure that this server is not used by this client before you remove it.';
 $wb["mail_servers_txt"] = 'Mailservers';
-$wb["mail_servers_placeholder"] = 'Select Mailservers';
-$wb['no_mail_server_error'] = 'At least one Mailserver must be selected.';
-$wb['mail_servers_used'] = 'The server you are trying to remove from this client is used as a Mailserver. Be sure that this server is not used by this client before to remove it.';
+$wb["mail_servers_placeholder"] = 'Select mailservers';
+$wb['no_mail_server_error'] = 'At least one mailserver must be selected.';
+$wb['mail_servers_used'] = 'The server you are trying to remove from this client is used as a Mailserver. Be sure that this server is not used by this client before you remove it.';
 $wb['added_by_txt'] = 'Added by';
 $wb['added_date_txt'] = 'Added date';
 $wb['parent_client_id_txt'] = 'Client of reseller';
@@ -177,4 +177,7 @@
 $wb['limit_database_quota_txt'] = 'Database quota';
 $wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.';
 $wb['reseller_txt'] = 'Reseller';
+$wb['btn_save_txt'] = "Save";
+$wb['btn_cancel_txt'] = "Cancel";
+$wb['invalid_vat_id'] = 'The VAT ID is invalid.';
 ?>
diff --git a/interface/web/client/lib/lang/en_reseller.lng b/interface/web/client/lib/lang/en_reseller.lng
index b94c30e..e23657c 100644
--- a/interface/web/client/lib/lang/en_reseller.lng
+++ b/interface/web/client/lib/lang/en_reseller.lng
@@ -178,4 +178,5 @@
 $wb['limit_domainmodule_txt'] = 'Domainmodule Limit';
 $wb['client_limits_txt'] = 'Client Limits';
 $wb['err_msg_master_tpl_set'] = 'All custom limit settings are ignored if any master template other than "custom" is selected.';
+$wb['invalid_vat_id'] = 'The VAT ID is invalid.';
 ?>
diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm
index 2d40fc4..43aad6f 100644
--- a/interface/web/client/templates/client_edit_limits.htm
+++ b/interface/web/client/templates/client_edit_limits.htm
@@ -326,10 +326,6 @@
     return ($('#template_master').val() == '0' ? true : false);
 }
 
-$('.subsectiontoggle').on("click", function(){
-    $(this).children().toggleClass('showing').end().next().slideToggle();
-});
-
 $('#template_additional_list').find('li > a').click(function(e) {
     e.preventDefault();
     delAdditionalTemplate($(this).parent().attr('rel'));
diff --git a/interface/web/js/scrigo.js.php b/interface/web/js/scrigo.js.php
index 6768f8f..54f7c5d 100644
--- a/interface/web/js/scrigo.js.php
+++ b/interface/web/js/scrigo.js.php
@@ -855,13 +855,13 @@
     return Math.floor(Math.random() * (max - min + 1)) + min;
 }
 
-jQuery('.addPlaceholder').on("click", function(){
+jQuery(document).on("click", ".addPlaceholder", function(){
 	var placeholderText = jQuery(this).text();
 	var template = jQuery(this).siblings(':input');
 	template.insertAtCaret(placeholderText);
 });
 
-jQuery('.addPlaceholderContent').on("click", function(){
+jQuery(document).on("click", ".addPlaceholderContent", function(){
 	var placeholderContentText = jQuery(this).find('.addPlaceholderContent').text();
 	var template2 = jQuery(this).siblings(':input');
 	template2.insertAtCaret(placeholderContentText);
diff --git a/interface/web/login/password_reset.php b/interface/web/login/password_reset.php
index f2e4e95..5eac46a 100644
--- a/interface/web/login/password_reset.php
+++ b/interface/web/login/password_reset.php
@@ -54,7 +54,7 @@
 	$username = $app->db->quote($_POST['username']);
 	$email = $app->db->quote($_POST['email']);
 
-	$client = $app->db->queryOneRecord("SELECT client.*, sys_user.lost_password_function FROM client,sys_user WHERE client.username = '$username' AND client.email = '$email' AND client.client_id = sys_user.client_id");
+	$client = $app->db->queryOneRecord("SELECT client.*, sys_user.lost_password_function FROM client,sys_user WHERE client.username = ? AND client.email = ? AND client.client_id = sys_user.client_id", $username, $email);
 
 	if($client['lost_password_function'] == 0) {
 		$app->tpl->setVar("error", $wb['lost_password_function_disabled_txt']);
diff --git a/interface/web/mail/lib/lang/de_mail_forward.lng b/interface/web/mail/lib/lang/de_mail_forward.lng
index a392ac4..e0ef8c7 100644
--- a/interface/web/mail/lib/lang/de_mail_forward.lng
+++ b/interface/web/mail/lib/lang/de_mail_forward.lng
@@ -6,4 +6,5 @@
 $wb['duplicate_mailbox_txt'] = 'Es existiert bereits ein E-Mail Konto mit dieser Adresse.';
 $wb['domain_txt'] = 'Domain';
 $wb['source_txt'] = 'Quell E-Mail Adresse';
+$wb['email_error_isemail'] = 'Bitte geben Sie eine gültige E-Mail Adresse an.';
 ?>
diff --git a/interface/web/mail/lib/lang/en_mail_forward.lng b/interface/web/mail/lib/lang/en_mail_forward.lng
index 4482593..5d371ee 100644
--- a/interface/web/mail/lib/lang/en_mail_forward.lng
+++ b/interface/web/mail/lib/lang/en_mail_forward.lng
@@ -6,4 +6,5 @@
 $wb["duplicate_mailbox_txt"] = 'There is already a mailbox with this email address';
 $wb['domain_txt'] = 'Domain';
 $wb["source_txt"] = 'Source Email';
+$wb['email_error_isemail'] = 'Please enter a valid email address.';
 ?>
diff --git a/interface/web/sites/ajax_get_json.php b/interface/web/sites/ajax_get_json.php
index ddf7d85..fb2f1c0 100644
--- a/interface/web/sites/ajax_get_json.php
+++ b/interface/web/sites/ajax_get_json.php
@@ -190,6 +190,17 @@
 	$json .= '"}';
 }
 
+if ($type == 'getdirectivesnippet') {
+	$server_type = 'apache';
+	$web_config = $app->getconf->get_server_config($server_id, 'web');
+	if (!empty($web_config['server_type']))
+		$server_type = $web_config['server_type'];
+
+	$snippets = $app->db->queryAllRecords("SELECT directive_snippets_id, name FROM directive_snippets WHERE customer_viewable = 'y' AND type = ? ORDER BY name ASC", $server_type);
+
+	$json = json_encode($snippets);
+}
+
 //}
 
 header('Content-type: application/json');
diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php
index 7d50b97..c342605 100644
--- a/interface/web/sites/form/web_vhost_domain.tform.php
+++ b/interface/web/sites/form/web_vhost_domain.tform.php
@@ -282,7 +282,13 @@
 		//#################################
 		// ENDE Datatable fields
 		//#################################
-	)
+	),
+	'plugins' => array (
+		// needs serverId for web.server_type
+		'directive_snippets_id' => array (
+			'class' => 'plugin_directive_snippets'
+		),
+ 	)
 );
 
 // add type-specific field attributes
@@ -517,6 +523,15 @@
 				'default' => '',
 				'value'  => array('' => 'none_txt', 'save' => 'save_certificate_txt', 'create' => 'create_certificate_txt', 'del' => 'delete_certificate_txt')
 			),
+			'enable_spdy' => array (
+				'datatype' => 'VARCHAR',
+				'formtype' => 'CHECKBOX',
+				'default'  => 'n',
+				'value' => array (
+					0 => 'n',
+					1 => 'y'
+				)
+			),
 			//#################################
 			// ENDE Datatable fields
 			//#################################
diff --git a/interface/web/sites/lib/lang/de_web_directive_snippets.lng b/interface/web/sites/lib/lang/de_web_directive_snippets.lng
new file mode 100644
index 0000000..b6d8984
--- /dev/null
+++ b/interface/web/sites/lib/lang/de_web_directive_snippets.lng
@@ -0,0 +1,3 @@
+<?php
+$wb['directive_snippets_id_txt'] = 'Gewünschte Konfiguration';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng
index 197d5ce..a6b866d 100644
--- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng
@@ -134,4 +134,7 @@
 $wb['invalid_custom_php_ini_settings_txt'] = 'Unzulässige php.ini-Einstellungen';
 $wb['invalid_system_user_or_group_txt'] = 'Invalid system user or group';
 $wb['apache_directive_blocked_error'] = 'Die Apache Direktive wurde durch die Sicherheitsrichtline blockiert:';
+$wb['btn_save_txt'] = 'Speichern';
+$wb['btn_cancel_txt'] = 'Abbrechen';
+$wb['enable_spdy_txt'] = 'Aktiviere SPDY';
 ?>
diff --git a/interface/web/sites/lib/lang/en_web_directive_snippets.lng b/interface/web/sites/lib/lang/en_web_directive_snippets.lng
new file mode 100644
index 0000000..05a004f
--- /dev/null
+++ b/interface/web/sites/lib/lang/en_web_directive_snippets.lng
@@ -0,0 +1,3 @@
+<?php
+$wb['directive_snippets_id_txt'] = 'Desired configuration';
+?>
\ No newline at end of file
diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng
index f68ebb8..3be30d0 100644
--- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng
@@ -137,4 +137,7 @@
 $wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)';
 $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.';
 $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.';
+$wb['btn_save_txt'] = "Save";
+$wb['btn_cancel_txt'] = "Cancel";
+$wb['enable_spdy_txt'] = 'Enable SPDY';
 ?>
diff --git a/interface/web/sites/templates/web_directive_snippets.htm b/interface/web/sites/templates/web_directive_snippets.htm
new file mode 100644
index 0000000..664a07f
--- /dev/null
+++ b/interface/web/sites/templates/web_directive_snippets.htm
@@ -0,0 +1,14 @@
+<div class="ctrlHolder">
+	<label for="directive_snippets_id">
+		{tmpl_var name='directive_snippets_id_txt'}
+	</label>
+
+	<select name="directive_snippets_id" id="directive_snippets_id" class="selectInput formLengthHalf">
+		<option value="0"></option>
+		<tmpl_loop name="records">
+		<option {tmpl_if name='is_selected' op='==' value='true'}selected="selected" {/tmpl_if}value="{tmpl_var name='directive_snippets_id'}">
+			{tmpl_var name='name'}
+		</option>
+		</tmpl_loop>
+	</select>
+</div>
\ No newline at end of file
diff --git a/interface/web/sites/templates/web_vhost_domain_advanced.htm b/interface/web/sites/templates/web_vhost_domain_advanced.htm
index d2c3bb8..8529819 100644
--- a/interface/web/sites/templates/web_vhost_domain_advanced.htm
+++ b/interface/web/sites/templates/web_vhost_domain_advanced.htm
@@ -176,4 +176,4 @@
         });
     }
 			
-</script>
\ No newline at end of file
+</script>
diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm
index 0e0897a..6548e82 100644
--- a/interface/web/sites/templates/web_vhost_domain_edit.htm
+++ b/interface/web/sites/templates/web_vhost_domain_edit.htm
@@ -219,6 +219,7 @@
                     {tmpl_var name='fastcgi_php_version'}
                 </select>
             </div>
+			{tmpl_var name="directive_snippets_id"}
             <div class="ctrlHolder">
                 <p class="label">{tmpl_var name='active_txt'}</p>
                 <div class="multiField">
@@ -249,6 +250,7 @@
             adjustForm();
             reloadWebIP();
             reloadFastcgiPHPVersions();
+			reloadDirectiveSnippets();
         });
     }
     adjustForm(true);
@@ -316,6 +318,23 @@
             }
         });
     }
+	
+	function reloadDirectiveSnippets() {
+        jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {server_id : serverId, type : "getdirectivesnippet"}, function(data) {
+            var options = '<option value="0"></option>';
+			for (var i = 0, len = data.length; i < len; i++) {
+				var isSelected = '';
+
+				 if ($('#directive_snippets_id').val() == i + 1) {
+					 isSelected = 'selected="selected"';
+				 }
+
+				 options += '<option ' + isSelected + ' value="' + data[i]['directive_snippets_id'] + '">' + data[i]['name'] + '</option>';
+			}
+
+			$('#directive_snippets_id').html(options).change();
+		});
+	}
 		
     function reloadWebIP() {
         loadOptionInto('ip_address','sites/ajax_get_ip.php?ip_type=IPv4&server_id='+serverId+'&client_group_id='+clientGroupId);
@@ -340,9 +359,9 @@
     }
     
     <tmpl_if name="readonly_tab">
-        jQuery('div.panel_web_domain').find('fieldset').find('input,select,button').bind('click mousedown', function(e) { e.preventDefault(); }).focus(function() { $(this).blur(); });
+        jQuery('div.panel_web_domain').find('fieldset').find('input,select,button').not('#directive_snippets_id').bind('click mousedown', function(e) { e.preventDefault(); }).focus(function() { $(this).blur(); });
         jQuery('#dom-edit-submit').click(function() {
-               submitForm('pageForm','sites/web_vhost_domain_edit.php');
+			submitForm('pageForm','sites/web_vhost_domain_edit.php');
         });
     <tmpl_else>
         jQuery('#dom-edit-submit').click(function() {
diff --git a/interface/web/sites/templates/web_vhost_domain_ssl.htm b/interface/web/sites/templates/web_vhost_domain_ssl.htm
index 4869c19..e910e22 100644
--- a/interface/web/sites/templates/web_vhost_domain_ssl.htm
+++ b/interface/web/sites/templates/web_vhost_domain_ssl.htm
@@ -64,6 +64,14 @@
                     {tmpl_var name='ssl_action'}
                 </select>
             </div>
+			{tmpl_if name="is_spdy_enabled"}
+			<div class="ctrlHolder">
+				<p class="label">{tmpl_var name='enable_spdy_txt'}</p>
+				<div class="multiField">
+					{tmpl_var name="enable_spdy"}
+				</div>
+			</div>
+			{/tmpl_if}
         </fieldset>
 
         <input type="hidden" name="id" value="{tmpl_var name='id'}">
@@ -74,4 +82,4 @@
         </div>
     </div>
 
-</div>
\ No newline at end of file
+</div>
diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php
index 057d263..27ece43 100644
--- a/interface/web/sites/web_vhost_domain_edit.php
+++ b/interface/web/sites/web_vhost_domain_edit.php
@@ -121,6 +121,10 @@
 			$server_id = intval($settings['default_webserver']);
 			$app->tform->formDef['tabs']['domain']['fields']['server_id']['default'] = $server_id;
 		}
+		if(!$server_id){
+			$default_web_server = $app->db->queryOneRecord("SELECT server_id FROM server WHERE web_server = ? ORDER BY server_id LIMIT 0,1", 1);
+			$server_id = $default_web_server['server_id'];
+		}
 		$web_config = $app->getconf->get_server_config($server_id, 'web');
 		$app->tform->formDef['tabs']['domain']['fields']['php']['default'] = $web_config['php_handler'];
 		$app->tform->formDef['tabs']['domain']['readonly'] = false;
@@ -187,7 +191,7 @@
 			if($app->functions->intval($this->dataRecord["server_id"]) > 0) {
 				// check if server is in client's servers or add it.
 				$chk_sid = explode(',', $client['web_servers']);
-				if(in_array($this->dataRecord["server_id"], $client['web_servers']) == false) {
+				if(in_array($this->dataRecord["server_id"], explode(',', $client['web_servers'])) == false) {
 					if($client['web_servers'] != '') $client['web_servers'] .= ',';
 					$client['web_servers'] .= $app->functions->intval($this->dataRecord["server_id"]);
 				}
@@ -695,6 +699,8 @@
 		
 		$app->tpl->setVar('vhostdomain_type', $this->_vhostdomain_type);
 
+		$app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y'));
+
 		parent::onShowEnd();
 	}
 
@@ -1064,6 +1070,10 @@
 			}
 		}
 
+		if($web_config['enable_spdy'] === 'n') {
+			unset($app->tform->formDef["tabs"]['ssl']['fields']['enable_spdy']);
+		}
+
 		parent::onSubmit();
 	}
 
diff --git a/interface/web/themes/default/templates/main.tpl.htm b/interface/web/themes/default/templates/main.tpl.htm
index 160aa78..5192d1e 100644
--- a/interface/web/themes/default/templates/main.tpl.htm
+++ b/interface/web/themes/default/templates/main.tpl.htm
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <html lang='en'>
-
 <head>
   <meta charset='utf-8' />
 
diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master
index bc6c6bc..7d6d665 100644
--- a/server/conf/apache_apps.vhost.master
+++ b/server/conf/apache_apps.vhost.master
@@ -10,11 +10,17 @@
 <VirtualHost {tmpl_var name='apps_vhost_ip'}:{tmpl_var name='apps_vhost_port'}>
   ServerAdmin webmaster@localhost
   {tmpl_var name='apps_vhost_servername'}
-  
+
   <FilesMatch "\.ph(p3?|tml)$">
     SetHandler None
   </FilesMatch>
-  
+
+  {tmpl_if name="enable_spdy" op="==" value="y"}
+  <IfModule spdy_module>
+	SpdyEnabled on
+  </IfModule>
+  {/tmpl_if}
+
   <IfModule mod_php5.c>
     DocumentRoot {tmpl_var name='apps_vhost_dir'}
     AddType application/x-httpd-php .php
diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master
index 222bf29..5236a19 100644
--- a/server/conf/nginx_vhost.conf.master
+++ b/server/conf/nginx_vhost.conf.master
@@ -5,10 +5,10 @@
 </tmpl_if>
 		
 <tmpl_if name='ssl_enabled'>
-        listen <tmpl_var name='ip_address'>:443 ssl;
+        listen <tmpl_var name='ip_address'>:443 ssl{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if};
 		ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 <tmpl_if name='ipv6_enabled'>
-        listen [<tmpl_var name='ipv6_address'>]:443 ssl;
+        listen [<tmpl_var name='ipv6_address'>]:443 ssl{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if};;
 </tmpl_if>
         ssl_certificate <tmpl_var name='document_root'>/ssl/<tmpl_var name='ssl_domain'>.crt;
         ssl_certificate_key <tmpl_var name='document_root'>/ssl/<tmpl_var name='ssl_domain'>.key;
@@ -242,4 +242,4 @@
         }
 </tmpl_if>
 }
-</tmpl_loop>
\ No newline at end of file
+</tmpl_loop>
diff --git a/server/conf/php-cgi-starter.master b/server/conf/php-cgi-starter.master
index be30993..03d0554 100644
--- a/server/conf/php-cgi-starter.master
+++ b/server/conf/php-cgi-starter.master
@@ -4,6 +4,10 @@
 export PHPRC="<tmpl_var name='php_ini_path'>"
 </tmpl_if>
 
+export TMP=<tmpl_var name='document_root'>/tmp
+export TMPDIR=<tmpl_var name='document_root'>/tmp
+export TEMP=<tmpl_var name='document_root'>/tmp
+
 exec <tmpl_var name='php_cgi_bin'> \
 -d open_basedir=<tmpl_var name='open_basedir'> \
 -d upload_tmp_dir=<tmpl_var name='document_root'>/tmp \
diff --git a/server/conf/php-fcgi-starter.master b/server/conf/php-fcgi-starter.master
index 92edf86..679f1b2 100644
--- a/server/conf/php-fcgi-starter.master
+++ b/server/conf/php-fcgi-starter.master
@@ -9,6 +9,9 @@
 # export PHP_FCGI_CHILDREN
 PHP_FCGI_MAX_REQUESTS=<tmpl_var name='php_fcgi_max_requests'>
 export PHP_FCGI_MAX_REQUESTS
+export TMP=<tmpl_var name='document_root'>/tmp
+export TMPDIR=<tmpl_var name='document_root'>/tmp
+export TEMP=<tmpl_var name='document_root'>/tmp
 exec <tmpl_var name='php_fcgi_bin'> \
 <tmpl_if name="security_level" op="==" value="20"> -d open_basedir="<tmpl_var name='open_basedir'>" \
 -d disable_functions="" \
diff --git a/server/conf/php_fpm_pool.conf.master b/server/conf/php_fpm_pool.conf.master
index 7f5c8e1..d7a3478 100644
--- a/server/conf/php_fpm_pool.conf.master
+++ b/server/conf/php_fpm_pool.conf.master
@@ -28,6 +28,10 @@
 
 chdir = /
 
+env[TMP] = <tmpl_var name='document_root'>/tmp
+env[TMPDIR] = <tmpl_var name='document_root'>/tmp
+env[TEMP] = <tmpl_var name='document_root'>/tmp
+
 <tmpl_if name='security_level' op='==' value='20'>
 <tmpl_var name='enable_php_open_basedir'>php_admin_value[open_basedir] = <tmpl_var name='php_open_basedir'>
 php_admin_value[session.save_path] = <tmpl_var name='document_root'>/tmp
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index 955b18a..e7a5035 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -204,6 +204,9 @@
 <tmpl_if name='php' op='==' value='mod'>
 		# mod_php enabled
 		AddType application/x-httpd-php .php .php3 .php4 .php5
+		SetEnv TMP <tmpl_var name='document_root'>/tmp
+		SetEnv TMPDIR <tmpl_var name='document_root'>/tmp
+		SetEnv TEMP <tmpl_var name='document_root'>/tmp
 		php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -fwebmaster@<tmpl_var name='domain'>"
 		php_admin_value upload_tmp_dir <tmpl_var name='document_root'>/tmp
 		php_admin_value session.save_path <tmpl_var name='document_root'>/tmp
diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php
index 51cad86..6f443fb 100644
--- a/server/lib/classes/db_mysql.inc.php
+++ b/server/lib/classes/db_mysql.inc.php
@@ -86,7 +86,7 @@
 			$this->_sqlerror('Zugriff auf Datenbankserver fehlgeschlagen! / Database server not accessible!');
 			return false;
 		}
-		if(!((bool)mysqli_query( $this->_iConnId, "USE $this->dbName"))) {
+		if(!((bool)mysqli_query( $this->_iConnId, 'USE `' . $this->dbName . '`'))) {
 			$this->close();
 			$this->_sqlerror('Datenbank nicht gefunden / Database not found');
 			return false;
@@ -176,7 +176,7 @@
 	private function _query($sQuery = '') {
 		global $app;
 
-		if($this->isConnected == false) return false;
+		//if($this->isConnected == false) return false;
 		if ($sQuery == '') {
 			$this->_sqlerror('Keine Anfrage angegeben / No query given');
 			return false;
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 2bf4dfe..ec98e84 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -1030,6 +1030,12 @@
 		$vhost_data['custom_php_ini_dir'] = escapeshellcmd($custom_php_ini_dir);
 
 		// Custom Apache directives
+		if(intval($data['new']['directive_snippets_id']) > 0){
+			$snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'apache' AND active = 'y' AND customer_viewable = 'y'", intval($data['new']['directive_snippets_id']));
+			if(isset($snippet['snippet'])){
+				$vhost_data['apache_directives'] = $snippet['snippet'];
+			}
+		}
 		// Make sure we only have Unix linebreaks
 		$vhost_data['apache_directives'] = str_replace("\r\n", "\n", $vhost_data['apache_directives']);
 		$vhost_data['apache_directives'] = str_replace("\r", "\n", $vhost_data['apache_directives']);
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index 57044ef..c256ae1 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -1089,7 +1089,16 @@
 
 		// Custom nginx directives
 		$final_nginx_directives = array();
-		$nginx_directives = $data['new']['nginx_directives'];
+		if(intval($data['new']['directive_snippets_id']) > 0){
+			$snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'nginx' AND active = 'y' AND customer_viewable = 'y'", intval($data['new']['directive_snippets_id']));
+			if(isset($snippet['snippet'])){
+				$nginx_directives = $snippet['snippet'];
+			} else {
+				$nginx_directives = $data['new']['nginx_directives'];
+			}
+		} else {
+			$nginx_directives = $data['new']['nginx_directives'];
+		}
 		// Make sure we only have Unix linebreaks
 		$nginx_directives = str_replace("\r\n", "\n", $nginx_directives);
 		$nginx_directives = str_replace("\r", "\n", $nginx_directives);

--
Gitblit v1.9.1