From 50306f0211e83560169a0f09fad1db3423befb62 Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Mon, 29 Feb 2016 14:24:40 -0500
Subject: [PATCH] - fixed ssl disabling on letsencrypt and added aliasdomain (Fixes: #3779)
---
server/plugins-available/nginx_plugin.inc.php | 584 +++++++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 494 insertions(+), 90 deletions(-)
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index 0512041..b3276e4 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -147,6 +147,7 @@
[ req ]
default_bits = 2048
+ default_md = sha256
default_keyfile = keyfile.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
@@ -155,10 +156,10 @@
[ req_distinguished_name ]
C = ".trim($data['new']['ssl_country'])."
- ST = ".trim($data['new']['ssl_state'])."
- L = ".trim($data['new']['ssl_locality'])."
- O = ".trim($data['new']['ssl_organisation'])."
- OU = ".trim($data['new']['ssl_organisation_unit'])."
+ " . (trim($data['new']['ssl_state']) == '' ? '' : "ST = ".trim($data['new']['ssl_state'])) . "
+ " . (trim($data['new']['ssl_locality']) == '' ? '' : "L = ".trim($data['new']['ssl_locality']))."
+ " . (trim($data['new']['ssl_organisation']) == '' ? '' : "O = ".trim($data['new']['ssl_organisation']))."
+ " . (trim($data['new']['ssl_organisation_unit']) == '' ? '' : "OU = ".trim($data['new']['ssl_organisation_unit']))."
CN = $domain
emailAddress = webmaster@".$data['new']['domain']."
@@ -170,30 +171,34 @@
$rand_file = escapeshellcmd($rand_file);
$key_file = escapeshellcmd($key_file);
+ $openssl_cmd_key_file = $key_file;
if(substr($domain, 0, 2) == '*.' && strpos($key_file, '/ssl/\*.') !== false) $key_file = str_replace('/ssl/\*.', '/ssl/*.', $key_file); // wildcard certificate
$key_file2 = escapeshellcmd($key_file2);
+ $openssl_cmd_key_file2 = $key_file2;
if(substr($domain, 0, 2) == '*.' && strpos($key_file2, '/ssl/\*.') !== false) $key_file2 = str_replace('/ssl/\*.', '/ssl/*.', $key_file2); // wildcard certificate
$ssl_days = 3650;
$csr_file = escapeshellcmd($csr_file);
+ $openssl_cmd_csr_file = $csr_file;
if(substr($domain, 0, 2) == '*.' && strpos($csr_file, '/ssl/\*.') !== false) $csr_file = str_replace('/ssl/\*.', '/ssl/*.', $csr_file); // wildcard certificate
$config_file = escapeshellcmd($ssl_cnf_file);
$crt_file = escapeshellcmd($crt_file);
+ $openssl_cmd_crt_file = $crt_file;
if(substr($domain, 0, 2) == '*.' && strpos($crt_file, '/ssl/\*.') !== false) $crt_file = str_replace('/ssl/\*.', '/ssl/*.', $crt_file); // wildcard certificate
if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) {
- exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $key_file 2048");
- exec("openssl req -new -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -out $csr_file -days $ssl_days -config $config_file");
- exec("openssl rsa -passin pass:$ssl_password -in $key_file -out $key_file2");
+ exec("openssl genrsa -des3 -rand $rand_file -passout pass:$ssl_password -out $openssl_cmd_key_file 2048");
+ exec("openssl req -new -sha256 -passin pass:$ssl_password -passout pass:$ssl_password -key $openssl_cmd_key_file -out $openssl_cmd_csr_file -days $ssl_days -config $config_file");
+ exec("openssl rsa -passin pass:$ssl_password -in $openssl_cmd_key_file -out $openssl_cmd_key_file2");
if(file_exists($web_config['CA_path'].'/openssl.cnf'))
{
- exec("openssl ca -batch -out $crt_file -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -in $csr_file");
+ exec("openssl ca -batch -out $openssl_cmd_crt_file -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -in $openssl_cmd_csr_file");
$app->log("Creating CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG);
- if (filesize($crt_file)==0 || !file_exists($crt_file)) $app->log("CA-Certificate signing failed. openssl ca -out $crt_file -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -in $csr_file", LOGLEVEL_ERROR);
+ if (filesize($crt_file)==0 || !file_exists($crt_file)) $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -in $openssl_cmd_csr_file", LOGLEVEL_ERROR);
};
if (@filesize($crt_file)==0 || !file_exists($crt_file)){
- exec("openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $key_file -in $csr_file -out $crt_file -days $ssl_days -config $config_file ");
+ exec("openssl req -x509 -passin pass:$ssl_password -passout pass:$ssl_password -key $openssl_cmd_key_file -in $openssl_cmd_csr_file -out $openssl_cmd_crt_file -days $ssl_days -config $config_file ");
$app->log("Creating self-signed SSL Cert for: $domain", LOGLEVEL_DEBUG);
};
@@ -203,15 +208,15 @@
$app->system->chmod($key_file2, 0400);
@$app->system->unlink($config_file);
@$app->system->unlink($rand_file);
- $ssl_request = $app->db->quote($app->system->file_get_contents($csr_file));
- $ssl_cert = $app->db->quote($app->system->file_get_contents($crt_file));
- $ssl_key2 = $app->db->quote($app->system->file_get_contents($key_file2));
+ $ssl_request = $app->system->file_get_contents($csr_file);
+ $ssl_cert = $app->system->file_get_contents($crt_file);
+ $ssl_key2 = $app->system->file_get_contents($key_file2);
/* Update the DB of the (local) Server */
- $app->db->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert', ssl_key = '$ssl_key2' WHERE domain = '".$data['new']['domain']."'");
- $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->db->query("UPDATE web_domain SET ssl_request = ?, ssl_cert = ?, ssl_key = ? WHERE domain = ?", $ssl_request, $ssl_cert, $ssl_key2, $data['new']['domain']);
+ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
- $app->dbmaster->query("UPDATE web_domain SET ssl_request = '$ssl_request', ssl_cert = '$ssl_cert', ssl_key = '$ssl_key2' WHERE domain = '".$data['new']['domain']."'");
- $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->dbmaster->query("UPDATE web_domain SET ssl_request = ?, ssl_cert = ?, ssl_key = ? WHERE domain = ?", $ssl_request, $ssl_cert, $ssl_key2, $data['new']['domain']);
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
}
//* Save a SSL certificate to disk
@@ -258,10 +263,10 @@
unset($crt_file_contents);
}
/* Update the DB of the (local) Server */
- $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
- $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
$app->log('Saving SSL Cert for: '.$domain, LOGLEVEL_DEBUG);
}
@@ -274,18 +279,18 @@
//$bundle_file = $ssl_dir.'/'.$domain.'.bundle';
if(file_exists($web_config['CA_path'].'/openssl.cnf') && !is_link($web_config['CA_path'].'/openssl.cnf'))
{
- exec("openssl ca -batch -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -revoke $crt_file");
+ exec("openssl ca -batch -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -revoke ".escapeshellcmd($crt_file));
$app->log("Revoking CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG);
};
$app->system->unlink($csr_file);
$app->system->unlink($crt_file);
//$app->system->unlink($bundle_file);
/* Update the DB of the (local) Server */
- $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data['new']['domain']."'");
- $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = ?", $data['new']['domain']);
+ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
- $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = '".$data['new']['domain']."'");
- $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '' WHERE domain = ?", $data['new']['domain']);
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
$app->log('Deleting SSL Cert for: '.$domain, LOGLEVEL_DEBUG);
}
@@ -321,7 +326,7 @@
// If the parent_domain_id has been changed, we will have to update the old site as well.
if($this->action == 'update' && $data['new']['parent_domain_id'] != $data['old']['parent_domain_id']) {
- $tmp = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = '.$old_parent_domain_id." AND active = 'y'");
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ? AND active = 'y'", $old_parent_domain_id);
$data['new'] = $tmp;
$data['old'] = $tmp;
$this->action = 'update';
@@ -329,7 +334,7 @@
}
// This is not a vhost, so we need to update the parent record instead.
- $tmp = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = '.$new_parent_domain_id." AND active = 'y'");
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ? AND active = 'y'", $new_parent_domain_id);
$data['new'] = $tmp;
$data['old'] = $tmp;
$this->action = 'update';
@@ -351,10 +356,13 @@
if($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') $app->log('document_root not set', LOGLEVEL_WARN);
return 0;
}
- if($data['new']['system_user'] == 'root' or $data['new']['system_group'] == 'root') {
- $app->log('Websites cannot be owned by the root user or group.', LOGLEVEL_WARN);
+
+ if($app->system->is_allowed_user($data['new']['system_user'], $app->system->is_user($data['new']['system_user']), true) == false
+ || $app->system->is_allowed_group($data['new']['system_group'], $app->system->is_group($data['new']['system_group']), true) == false) {
+ $app->log('Websites cannot be owned by the root user or group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN);
return 0;
}
+
if(trim($data['new']['domain']) == '') {
$app->log('domain is empty', LOGLEVEL_WARN);
return 0;
@@ -364,9 +372,22 @@
$log_folder = 'log';
$old_web_folder = 'web';
$old_log_folder = 'log';
+ if($data['new']['type'] == 'vhost'){
+ if($data['new']['web_folder'] != ''){
+ if(substr($data['new']['web_folder'],0,1) == '/') $data['new']['web_folder'] = substr($data['new']['web_folder'],1);
+ if(substr($data['new']['web_folder'],-1) == '/') $data['new']['web_folder'] = substr($data['new']['web_folder'],0,-1);
+ }
+ $web_folder .= '/'.$data['new']['web_folder'];
+
+ if($data['old']['web_folder'] != ''){
+ if(substr($data['old']['web_folder'],0,1) == '/') $data['old']['web_folder'] = substr($data['old']['web_folder'],1);
+ if(substr($data['old']['web_folder'],-1) == '/') $data['old']['web_folder'] = substr($data['old']['web_folder'],0,-1);
+ }
+ $old_web_folder .= '/'.$data['old']['web_folder'];
+ }
if($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') {
// new one
- $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = '.intval($data['new']['parent_domain_id']));
+ $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $data['new']['parent_domain_id']);
$subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $data['new']['domain']);
if($subdomain_host == '') $subdomain_host = 'web'.$data['new']['domain_id'];
$web_folder = $data['new']['web_folder'];
@@ -375,7 +396,7 @@
if(isset($data['old']['parent_domain_id'])) {
// old one
- $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = '.intval($data['old']['parent_domain_id']));
+ $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $data['old']['parent_domain_id']);
$subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $data['old']['domain']);
if($subdomain_host == '') $subdomain_host = 'web'.$data['old']['domain_id'];
$old_web_folder = $data['old']['web_folder'];
@@ -429,7 +450,7 @@
if($this->action == 'update' && $data['new']['document_root'] != $data['old']['document_root']) {
//* Get the old client ID
- $old_client = $app->dbmaster->queryOneRecord('SELECT client_id FROM sys_group WHERE sys_group.groupid = '.intval($data['old']['sys_groupid']));
+ $old_client = $app->dbmaster->queryOneRecord('SELECT client_id FROM sys_group WHERE sys_group.groupid = ?', $data['old']['sys_groupid']);
$old_client_id = intval($old_client['client_id']);
unset($old_client);
@@ -465,6 +486,9 @@
$app->system->rename($data['new']['document_root'], $data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s'));
$app->log('Renaming existing directory in new docroot location. mv '.$data['new']['document_root'].' '.$data['new']['document_root'].'_bak_'.date('Y_m_d_H_i_s'), LOGLEVEL_DEBUG);
}
+
+ //* Unmount the old log directory bfore we move the log dir
+ exec('umount '.escapeshellcmd($old_dir.'/log'));
//* Create new base directory, if it does not exist yet
if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir);
@@ -490,12 +514,26 @@
if($nginx_chrooted) $this->_exec('chroot '.escapeshellcmd($web_config['website_basedir']).' '.$command);
//* Change the log mount
+ /*
$fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind';
$app->system->removeLine('/etc/fstab', $fstab_line);
$fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait';
$app->system->removeLine('/etc/fstab', $fstab_line);
- $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait,_netdev 0 0';
- $app->system->replaceLine('/etc/fstab', $fstab_line, $fstab_line, 1, 1);
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait';
+ $app->system->removeLine('/etc/fstab', $fstab_line);
+ */
+
+ $fstab_line_old = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind';
+
+ if($web_config['network_filesystem'] == 'y') {
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait,_netdev 0 0';
+ $app->system->replaceLine('/etc/fstab', $fstab_line_old, $fstab_line, 0, 1);
+ } else {
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait 0 0';
+ $app->system->replaceLine('/etc/fstab', $fstab_line_old, $fstab_line, 0, 1);
+ }
+
+ exec('mount --bind '.escapeshellarg('/var/log/ispconfig/httpd/'.$data['new']['domain']).' '.escapeshellarg($data['new']['document_root'].'/'.$log_folder));
}
@@ -506,6 +544,7 @@
if(!is_dir($data['new']['document_root'].'/' . $web_folder)) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder);
if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/error') and $data['new']['errordocs']) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/error');
+ if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/stats');
//if(!is_dir($data['new']['document_root'].'/'.$log_folder)) exec('mkdir -p '.$data['new']['document_root'].'/'.$log_folder);
if(!is_dir($data['new']['document_root'].'/ssl')) $app->system->mkdirpath($data['new']['document_root'].'/ssl');
if(!is_dir($data['new']['document_root'].'/cgi-bin')) $app->system->mkdirpath($data['new']['document_root'].'/cgi-bin');
@@ -531,6 +570,7 @@
$app->system->removeLine('/etc/fstab', $fstab_line);
//* Unmount log directory
+ //exec('fuser -km '.escapeshellarg($data['old']['document_root'].'/'.$old_log_folder));
exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$old_log_folder));
}
@@ -544,14 +584,15 @@
$app->system->chmod($data['new']['document_root'].'/'.$log_folder, 0755);
exec('mount --bind '.escapeshellarg('/var/log/ispconfig/httpd/'.$data['new']['domain']).' '.escapeshellarg($data['new']['document_root'].'/'.$log_folder));
//* add mountpoint to fstab
- $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait,_netdev 0 0';
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait';
+ $fstab_line .= @($web_config['network_filesystem'] == 'y')?',_netdev 0 0':' 0 0';
$app->system->replaceLine('/etc/fstab', $fstab_line, $fstab_line, 1, 1);
}
$app->system->web_folder_protection($data['new']['document_root'], true);
// Get the client ID
- $client = $app->dbmaster->queryOneRecord('SELECT client_id FROM sys_group WHERE sys_group.groupid = '.intval($data['new']['sys_groupid']));
+ $client = $app->dbmaster->queryOneRecord('SELECT client_id FROM sys_group WHERE sys_group.groupid = ?', $data['new']['sys_groupid']);
$client_id = intval($client['client_id']);
unset($client);
@@ -627,27 +668,29 @@
}
if (file_exists($conf['rootpath'] . '/conf-custom/index/standard_index.html_'.substr(escapeshellcmd($conf['language']), 0, 2))) {
- exec('cp ' . $conf['rootpath'] . '/conf-custom/index/standard_index.html_'.substr(escapeshellcmd($conf['language']), 0, 2).' '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html');
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html')) exec('cp ' . $conf['rootpath'] . '/conf-custom/index/standard_index.html_'.substr(escapeshellcmd($conf['language']), 0, 2).' '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html');
if(is_file($conf['rootpath'] . '/conf-custom/index/favicon.ico')) {
- exec('cp ' . $conf['rootpath'] . '/conf-custom/index/favicon.ico '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/favicon.ico')) exec('cp ' . $conf['rootpath'] . '/conf-custom/index/favicon.ico '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
}
if(is_file($conf['rootpath'] . '/conf-custom/index/robots.txt')) {
- exec('cp ' . $conf['rootpath'] . '/conf-custom/index/robots.txt '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/robots.txt')) exec('cp ' . $conf['rootpath'] . '/conf-custom/index/robots.txt '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
}
- if(is_file($conf['rootpath'] . '/conf-custom/index/.htaccess')) {
- exec('cp ' . $conf['rootpath'] . '/conf-custom/index/.htaccess '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
- }
- }
- else {
+ //if(is_file($conf['rootpath'] . '/conf-custom/index/.htaccess')) {
+ // exec('cp ' . $conf['rootpath'] . '/conf-custom/index/.htaccess '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
+ //}
+ } else {
if (file_exists($conf['rootpath'] . '/conf-custom/index/standard_index.html')) {
- exec('cp ' . $conf['rootpath'] . '/conf-custom/index/standard_index.html '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html');
- }
- else {
- exec('cp ' . $conf['rootpath'] . '/conf/index/standard_index.html_'.substr(escapeshellcmd($conf['language']), 0, 2).' '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html');
- if(is_file($conf['rootpath'] . '/conf/index/favicon.ico')) exec('cp ' . $conf['rootpath'] . '/conf/index/favicon.ico '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
- if(is_file($conf['rootpath'] . '/conf/index/robots.txt')) exec('cp ' . $conf['rootpath'] . '/conf/index/robots.txt '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
- if(is_file($conf['rootpath'] . '/conf/index/.htaccess')) exec('cp ' . $conf['rootpath'] . '/conf/index/.htaccess '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html')) exec('cp ' . $conf['rootpath'] . '/conf-custom/index/standard_index.html '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html');
+ } else {
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html')) exec('cp ' . $conf['rootpath'] . '/conf/index/standard_index.html_'.substr(escapeshellcmd($conf['language']), 0, 2).' '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/index.html');
+ if(is_file($conf['rootpath'] . '/conf/index/favicon.ico')){
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/favicon.ico')) exec('cp ' . $conf['rootpath'] . '/conf/index/favicon.ico '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
+ }
+ if(is_file($conf['rootpath'] . '/conf/index/robots.txt')){
+ if(!file_exists(escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/robots.txt')) exec('cp ' . $conf['rootpath'] . '/conf/index/robots.txt '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
+ }
+ //if(is_file($conf['rootpath'] . '/conf/index/.htaccess')) exec('cp ' . $conf['rootpath'] . '/conf/index/.htaccess '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
}
}
exec('chmod -R a+r '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder . '/');
@@ -698,7 +741,7 @@
if($data['new']['type'] == 'vhost' && $web_config['security_level'] == 20) $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['nginx_user']));
//* If the security level is set to high
- if(($this->action == 'insert' && $data['new']['type'] == 'vhost') or ($web_config['set_folder_permissions_on_update'] == 'y' && $data['new']['type'] == 'vhost')) {
+ if(($this->action == 'insert' && $data['new']['type'] == 'vhost') or ($web_config['set_folder_permissions_on_update'] == 'y' && $data['new']['type'] == 'vhost') or ($web_folder != $old_web_folder && $data['new']['type'] == 'vhost')) {
$app->system->web_folder_protection($data['new']['document_root'], false);
@@ -708,13 +751,14 @@
if($web_config['security_level'] == 20) {
$app->system->chmod($data['new']['document_root'], 0755);
- $app->system->chmod($data['new']['document_root'].'/web', 0711);
+ $app->system->chmod($data['new']['document_root'].'/web', 0751);
//$app->system->chmod($data['new']['document_root'].'/webdav',0710);
$app->system->chmod($data['new']['document_root'].'/private', 0710);
$app->system->chmod($data['new']['document_root'].'/ssl', 0755);
+ if($web_folder != 'web') $app->system->chmod($data['new']['document_root'].'/'.$web_folder, 0751);
// make tmp directory writable for nginx and the website users
- $app->system->chmod($data['new']['document_root'].'/tmp', 0777);
+ $app->system->chmod($data['new']['document_root'].'/tmp', 0770);
// Set Log directory to 755 to make the logs accessible by the FTP user
if(realpath($data['new']['document_root'].'/'.$log_folder . '/error.log') == '/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log') {
@@ -763,6 +807,11 @@
//$app->system->chgrp($data['new']['document_root'].'/webdav',$groupname);
$app->system->chown($data['new']['document_root'].'/private', $username);
$app->system->chgrp($data['new']['document_root'].'/private', $groupname);
+
+ if($web_folder != 'web'){
+ $app->system->chown($data['new']['document_root'].'/'.$web_folder, $username);
+ $app->system->chgrp($data['new']['document_root'].'/'.$web_folder, $groupname);
+ }
// If the security Level is set to medium
} else {
@@ -772,9 +821,10 @@
//$app->system->chmod($data['new']['document_root'].'/webdav',0755);
$app->system->chmod($data['new']['document_root'].'/ssl', 0755);
$app->system->chmod($data['new']['document_root'].'/cgi-bin', 0755);
+ if($web_folder != 'web') $app->system->chmod($data['new']['document_root'].'/'.$web_folder, 0755);
// make temp directory writable for nginx and the website users
- $app->system->chmod($data['new']['document_root'].'/tmp', 0777);
+ $app->system->chmod($data['new']['document_root'].'/tmp', 0770);
// Set Log directory to 755 to make the logs accessible by the FTP user
if(realpath($data['new']['document_root'].'/'.$log_folder . '/error.log') == '/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log') {
@@ -802,6 +852,11 @@
$app->system->chgrp($data['new']['document_root'].'/web/stats', $groupname);
//$app->system->chown($data['new']['document_root'].'/webdav',$username);
//$app->system->chgrp($data['new']['document_root'].'/webdav',$groupname);
+
+ if($web_folder != 'web'){
+ $app->system->chown($data['new']['document_root'].'/'.$web_folder, $username);
+ $app->system->chgrp($data['new']['document_root'].'/'.$web_folder, $groupname);
+ }
}
} elseif((($data['new']['type'] == 'vhostsubdomain') || ($data['new']['type'] == 'vhostalias')) &&
(($this->action == 'insert') || ($web_config['set_folder_permissions_on_update'] == 'y'))) {
@@ -877,7 +932,18 @@
$tpl = new tpl();
$tpl->newTemplate('nginx_vhost.conf.master');
+ // IPv4
+
+ //* use ip-mapping for web-mirror
+ if($data['new']['ip_address'] != '*' && $conf['mirror_server_id'] > 0) {
+ $sql = "SELECT destination_ip FROM server_ip_map WHERE server_id = ? AND source_ip = ?";
+ $newip = $app->db->queryOneRecord($sql, $conf['server_id'], $data['new']['ip_address']);
+ $data['new']['ip_address'] = $newip['destination_ip'];
+ unset($newip);
+ }
+
$vhost_data = $data['new'];
+
//unset($vhost_data['ip_address']);
$vhost_data['web_document_root'] = $data['new']['document_root'].'/' . $web_folder;
$vhost_data['web_document_root_www'] = $web_config['website_basedir'].'/'.$data['new']['domain'].'/' . $web_folder;
@@ -911,7 +977,7 @@
$default_php_fpm = true;
}
*/
- if($data['new']['php'] != 'no'){
+ if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){
if(trim($data['new']['fastcgi_php_version']) != ''){
$default_php_fpm = false;
list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version']));
@@ -934,6 +1000,7 @@
} else {
$pool_dir = $custom_php_fpm_pool_dir;
}
+ $pool_dir = trim($pool_dir);
if(substr($pool_dir, -1) != '/') $pool_dir .= '/';
$pool_name = 'web'.$data['new']['domain_id'];
$socket_dir = escapeshellcmd($web_config['php_fpm_socket_dir']);
@@ -1064,13 +1131,89 @@
// 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'", $data['new']['directive_snippets_id']);
+ if(isset($snippet['snippet'])){
+ $nginx_directives = $snippet['snippet'];
+ } else {
+ $nginx_directives = $data['new']['nginx_directives'];
+ }
+ if($data['new']['enable_pagespeed'] == 'y'){
+ // if PageSpeed is already enabled, don't add configuration again
+ if(stripos($nginx_directives, 'pagespeed') !== false){
+ $vhost_data['enable_pagespeed'] = false;
+ } else {
+ $vhost_data['enable_pagespeed'] = true;
+ }
+ } else {
+ $vhost_data['enable_pagespeed'] = false;
+ }
+ } else {
+ $nginx_directives = $data['new']['nginx_directives'];
+ $vhost_data['enable_pagespeed'] = false;
+ }
+
+ // folder_directive_snippets
+ if(trim($data['new']['folder_directive_snippets']) != ''){
+ $data['new']['folder_directive_snippets'] = trim($data['new']['folder_directive_snippets']);
+ $data['new']['folder_directive_snippets'] = str_replace("\r\n", "\n", $data['new']['folder_directive_snippets']);
+ $data['new']['folder_directive_snippets'] = str_replace("\r", "\n", $data['new']['folder_directive_snippets']);
+ $folder_directive_snippets_lines = explode("\n", $data['new']['folder_directive_snippets']);
+
+ if(is_array($folder_directive_snippets_lines) && !empty($folder_directive_snippets_lines)){
+ foreach($folder_directive_snippets_lines as $folder_directive_snippets_line){
+ list($folder_directive_snippets_folder, $folder_directive_snippets_snippets_id) = explode(':', $folder_directive_snippets_line);
+
+ $folder_directive_snippets_folder = trim($folder_directive_snippets_folder);
+ $folder_directive_snippets_snippets_id = trim($folder_directive_snippets_snippets_id);
+
+ if($folder_directive_snippets_folder != '' && intval($folder_directive_snippets_snippets_id) > 0 && preg_match('@^((?!(.*\.\.)|(.*\./)|(.*//))[^/][\w/_\.\-]{1,100})?$@', $folder_directive_snippets_folder)){
+ if(substr($folder_directive_snippets_folder, -1) != '/') $folder_directive_snippets_folder .= '/';
+ if(substr($folder_directive_snippets_folder, 0, 1) == '/') $folder_directive_snippets_folder = substr($folder_directive_snippets_folder, 1);
+
+ $master_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'nginx' AND active = 'y' AND customer_viewable = 'y'", intval($folder_directive_snippets_snippets_id));
+ if(isset($master_snippet['snippet'])){
+ $folder_directive_snippets_trans = array('{FOLDER}' => $folder_directive_snippets_folder, '{FOLDERMD5}' => md5($folder_directive_snippets_folder));
+ $master_snippet['snippet'] = strtr($master_snippet['snippet'], $folder_directive_snippets_trans);
+ $nginx_directives .= "\n\n".$master_snippet['snippet'];
+
+ // create folder it it does not exist
+ if(!is_dir($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder)){
+ $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder);
+ $app->system->chown($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder, $username);
+ $app->system->chgrp($data['new']['document_root'].'/' . $web_folder.$folder_directive_snippets_folder, $groupname);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // use vLib for template logic
+ $nginx_directives_new = '';
+ $ngx_conf_tpl = new tpl();
+ $ngx_conf_tpl_tmp_file = tempnam($conf['temppath'], "ngx");
+ file_put_contents($ngx_conf_tpl_tmp_file, $nginx_directives);
+ $ngx_conf_tpl->newTemplate($ngx_conf_tpl_tmp_file);
+ $ngx_conf_tpl->setVar('use_tcp', $use_tcp);
+ $ngx_conf_tpl->setVar('use_socket', $use_socket);
+ $ngx_conf_tpl->setVar('fpm_socket', $fpm_socket);
+ $ngx_conf_tpl->setVar($vhost_data);
+ $nginx_directives_new = $ngx_conf_tpl->grab();
+ if(is_file($ngx_conf_tpl_tmp_file)) unlink($ngx_conf_tpl_tmp_file);
+ if($nginx_directives_new != '') $nginx_directives = $nginx_directives_new;
+ unset($nginx_directives_new);
+
// Make sure we only have Unix linebreaks
$nginx_directives = str_replace("\r\n", "\n", $nginx_directives);
$nginx_directives = str_replace("\r", "\n", $nginx_directives);
$nginx_directive_lines = explode("\n", $nginx_directives);
if(is_array($nginx_directive_lines) && !empty($nginx_directive_lines)){
- $trans = array('{DOCROOT}' => $vhost_data['web_document_root_www'], '{FASTCGIPASS}' => 'fastcgi_pass '.($data['new']['php_fpm_use_socket'] == 'y'? 'unix:'.$fpm_socket : '127.0.0.1:'.$vhost_data['fpm_port']).';');
+ $trans = array(
+ '{DOCROOT}' => $vhost_data['web_document_root_www'],
+ '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'],
+ '{FASTCGIPASS}' => 'fastcgi_pass '.($data['new']['php_fpm_use_socket'] == 'y'? 'unix:'.$fpm_socket : '127.0.0.1:'.$vhost_data['fpm_port']).';'
+ );
foreach($nginx_directive_lines as $nginx_directive_line){
$final_nginx_directives[] = array('nginx_directive' => strtr($nginx_directive_line, $trans));
}
@@ -1079,9 +1222,136 @@
// Check if a SSL cert exists
$ssl_dir = $data['new']['document_root'].'/ssl';
+ if(!isset($data['new']['ssl_domain']) OR empty($data['new']['ssl_domain'])) { $data['new']['ssl_domain'] = $data['new']['domain']; }
$domain = $data['new']['ssl_domain'];
+ if(!$domain) $domain = $data['new']['domain'];
+ $tpl->setVar('ssl_domain', $domain);
$key_file = $ssl_dir.'/'.$domain.'.key';
$crt_file = $ssl_dir.'/'.$domain.'.crt';
+
+
+ $tpl->setVar('ssl_letsencrypt', "n");
+
+ 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!
+ $app->log('Wildcard domains not yet supported by letsencrypt, so changing ' . $domain . ' to ' . substr($domain, 2), LOGLEVEL_WARN);
+ $domain = substr($domain, 2);
+ }
+
+ $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;
+ $subdomains = null;
+ $aliasdomains = null;
+ $sub_prefixes = array();
+
+ //* be sure to have good domain
+ if($data['new']['subdomain'] == "www" OR $data['new']['subdomain'] == "*") {
+ $temp_domains[] = "www." . $domain;
+ }
+
+ //* then, add subdomain if we have
+ $subdomains = $app->db->queryAllRecords('SELECT domain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'subdomain'");
+ if(is_array($subdomains)) {
+ foreach($subdomains as $subdomain) {
+ $temp_domains[] = $subdomain['domain'];
+ $sub_prefixes[] = str_replace($domain, "", $subdomain['domain']);
+ }
+ }
+
+ //* then, add alias domain if we have
+ $aliasdomains = $app->db->queryAllRecords('SELECT domain,subdomain FROM web_domain WHERE parent_domain_id = '.intval($data['new']['domain_id'])." AND active = 'y' AND type = 'alias'");
+ if(is_array($aliasdomains)) {
+ foreach($aliasdomains as $aliasdomain) {
+ $temp_domains[] = $aliasdomain['domain'];
+ if(isset($aliasdomain['subdomain']) && ! empty($aliasdomain['subdomain'])) {
+ $temp_domains[] = $aliasdomain['subdomain'] . "." . $aliasdomain['domain'];
+ }
+
+ foreach($sub_prefixes as $s) {
+ $temp_domains[] = $s . $aliasdomain['domain'];
+ }
+ }
+ }
+
+ // prevent duplicate
+ $temp_domains = array_unique($temp_domains);
+
+ // generate cli format
+ foreach($temp_domains as $temp_domain) {
+ $lddomain .= (string) " --domains " . $temp_domain;
+ }
+
+ // useless data
+ unset($subdomains);
+ unset($temp_domains);
+
+ $tpl->setVar('ssl_letsencrypt', "y");
+ //* TODO: check dns entry is correct
+ $crt_tmp_file = "/etc/letsencrypt/live/".$domain."/fullchain.pem";
+ $key_tmp_file = "/etc/letsencrypt/live/".$domain."/privkey.pem";
+ $webroot = $data['new']['document_root']."/web";
+
+ //* check if we have already a Let's Encrypt cert
+ if(!file_exists($crt_tmp_file) && !file_exists($key_tmp_file)) {
+ $app->log("Create Let's Encrypt SSL Cert for: $domain", LOGLEVEL_DEBUG);
+
+ if(file_exists("/root/.local/share/letsencrypt/bin/letsencrypt")) {
+ $this->_exec("/root/.local/share/letsencrypt/bin/letsencrypt auth --text --agree-tos --authenticator webroot --server https://acme-v01.api.letsencrypt.org/directory --rsa-key-size 4096 --email postmaster@$domain --domains $lddomain --webroot-path /usr/local/ispconfig/interface/acme");
+ }
+ };
+
+ //* check is been correctly created
+ if(file_exists($crt_tmp_file) OR file_exists($key_tmp_file)) {
+ $date = date("YmdHis");
+ //* TODO: check if is a symlink, if target same keep it, either remove it
+ if(is_file($key_file)) {
+ $app->system->copy($key_file, $key_file.'.old.'.$date);
+ $app->system->chmod($key_file.'.old.'.$date, 0400);
+ $app->system->unlink($key_file);
+ }
+
+ if ($web_config["website_symlinks_rel"] == 'y') {
+ $this->create_relative_link(escapeshellcmd($key_tmp_file), escapeshellcmd($key_file));
+ } else {
+ exec("ln -s ".escapeshellcmd($key_tmp_file)." ".escapeshellcmd($key_file));
+ }
+
+ if(is_file($crt_file)) {
+ $app->system->copy($crt_file, $crt_file.'.old.'.$date);
+ $app->system->chmod($crt_file.'.old.'.$date, 0400);
+ $app->system->unlink($crt_file);
+ }
+
+ if($web_config["website_symlinks_rel"] == 'y') {
+ $this->create_relative_link(escapeshellcmd($crt_tmp_file), escapeshellcmd($crt_file));
+ } else {
+ exec("ln -s ".escapeshellcmd($crt_tmp_file)." ".escapeshellcmd($crt_file));
+ }
+
+ /* we don't need to store it.
+ /* Update the DB of the (local) Server */
+ $app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '', ssl_key = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ /* Update also the master-DB of the Server-Farm */
+ $app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '', ssl_key = '' WHERE domain = '".$data['new']['domain']."'");
+ $app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
+ }
+ };
if($domain!='' && $data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file) && (@filesize($crt_file)>0) && (@filesize($key_file)>0)) {
$vhost_data['ssl_enabled'] = 1;
@@ -1293,6 +1563,18 @@
'use_proxy' => ($data['new']['redirect_type'] == 'proxy' ? true:false));
}
}
+
+ // http2 or spdy?
+ $vhost_data['enable_http2'] = 'n';
+ if($vhost_data['enable_spdy'] == 'y'){
+ // check if nginx support http_v2; if so, use that instead of spdy
+ exec("2>&1 nginx -V | tr -- - '\n' | grep http_v2_module", $tmp_output, $tmp_retval);
+ if($tmp_retval == 0){
+ $vhost_data['enable_http2'] = 'y';
+ $vhost_data['enable_spdy'] = 'n';
+ }
+ unset($tmp_output, $tmp_retval);
+ }
$tpl->setVar($vhost_data);
@@ -1302,7 +1584,7 @@
$auto_alias = $web_config['website_autoalias'];
if($auto_alias != '') {
// get the client username
- $client = $app->db->queryOneRecord("SELECT `username` FROM `client` WHERE `client_id` = '" . intval($client_id) . "'");
+ $client = $app->db->queryOneRecord("SELECT `username` FROM `client` WHERE `client_id` = ?", $client_id);
$aa_search = array('[client_id]', '[website_id]', '[client_username]', '[website_domain]');
$aa_replace = array($client_id, $data['new']['domain_id'], $client['username'], $data['new']['domain']);
$auto_alias = str_replace($aa_search, $aa_replace, $auto_alias);
@@ -1322,7 +1604,7 @@
}
// get alias domains (co-domains and subdomains)
- $aliases = $app->db->queryAllRecords('SELECT * FROM web_domain WHERE parent_domain_id = '.$data['new']['domain_id']." AND active = 'y' AND (type != 'vhostsubdomain' AND type != 'vhostalias')");
+ $aliases = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE parent_domain_id = ? AND active = 'y' AND (type != 'vhostsubdomain' AND type != 'vhostalias')", $data['new']['domain_id']);
$alias_seo_redirects = array();
if(is_array($aliases)) {
foreach($aliases as $alias) {
@@ -1644,6 +1926,7 @@
}
$this->php_fpm_pool_update($data, $web_config, $pool_dir, $pool_name, $socket_dir);
+ $this->hhvm_update($data, $web_config);
if($web_config['check_apache_config'] == 'y') {
//* Test if nginx starts with the new configuration file
@@ -1770,7 +2053,7 @@
$log_folder = 'log';
$web_folder = '';
if($data['old']['type'] == 'vhostsubdomain' || $data['old']['type'] == 'vhostalias') {
- $tmp = $app->db->queryOneRecord('SELECT `domain`,`document_root` FROM web_domain WHERE domain_id = '.intval($data['old']['parent_domain_id']));
+ $tmp = $app->db->queryOneRecord('SELECT `domain`,`document_root` FROM web_domain WHERE domain_id = ?', $data['old']['parent_domain_id']);
if($tmp['domain'] != ''){
$subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $data['old']['domain']);
} else {
@@ -1819,10 +2102,12 @@
if(is_array($log_folders) && !empty($log_folders)){
foreach($log_folders as $log_folder){
//if($app->system->is_mounted($data['old']['document_root'].'/'.$log_folder)) exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
+ //exec('fuser -km '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
}
} else {
//if($app->system->is_mounted($data['old']['document_root'].'/'.$log_folder)) exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
+ //exec('fuser -km '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
}
}
@@ -1842,7 +2127,7 @@
if($data['old']['type'] != 'vhost' && $data['old']['type'] != 'vhostsubdomain' && $data['old']['type'] != 'vhostalias' && $data['old']['parent_domain_id'] > 0) {
//* This is a alias domain or subdomain, so we have to update the website instead
$parent_domain_id = intval($data['old']['parent_domain_id']);
- $tmp = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = '.$parent_domain_id." AND active = 'y'");
+ $tmp = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ? AND active = 'y'", $parent_domain_id);
$data['new'] = $tmp;
$data['old'] = $tmp;
$this->action = 'update';
@@ -1896,7 +2181,7 @@
} else {
// read all vhost subdomains with same parent domain
$used_paths = array();
- $tmp = $app->db->queryAllRecords("SELECT `web_folder` FROM web_domain WHERE (type = 'vhostsubdomain' OR type = 'vhostalias') AND parent_domain_id = ".intval($data['old']['parent_domain_id'])." AND domain_id != ".intval($data['old']['domain_id']));
+ $tmp = $app->db->queryAllRecords("SELECT `web_folder` FROM web_domain WHERE (type = 'vhostsubdomain' OR type = 'vhostalias') AND parent_domain_id = ? AND domain_id != ?", $data['old']['parent_domain_id'], $data['old']['domain_id']);
foreach($tmp as $tmprec) {
// we normalize the folder entries because we need to compare them
$tmp_folder = preg_replace('/[\/]{2,}/', '/', $tmprec['web_folder']); // replace / occuring multiple times
@@ -1954,6 +2239,9 @@
// remove PHP-FPM pool
if ($data['old']['php'] == 'php-fpm') {
$this->php_fpm_pool_delete($data, $web_config);
+ } elseif($data['old']['php'] == 'hhvm') {
+ $this->hhvm_update($data, $web_config);
+ $this->php_fpm_pool_delete($data, $web_config);
}
//remove the php cgi starter script if available
@@ -1977,7 +2265,7 @@
$app->log('Removing website: '.$docroot, LOGLEVEL_DEBUG);
// Delete the symlinks for the sites
- $client = $app->db->queryOneRecord('SELECT client_id FROM sys_group WHERE sys_group.groupid = '.intval($data['old']['sys_groupid']));
+ $client = $app->db->queryOneRecord('SELECT client_id FROM sys_group WHERE sys_group.groupid = ?', $data['old']['sys_groupid']);
$client_id = intval($client['client_id']);
unset($client);
$tmp_symlinks_array = explode(':', $web_config['website_symlinks']);
@@ -2018,6 +2306,28 @@
$this->awstats_delete($data, $web_config);
}
+ //* Delete the web-backups
+ if($data['old']['type'] == 'vhost') {
+ $server_config = $app->getconf->get_server_config($conf['server_id'], 'server');
+ $backup_dir = $server_config['backup_dir'];
+ $mount_backup = true;
+ if($server_config['backup_dir'] != '' && $server_config['backup_delete'] == 'y') {
+ //* mount backup directory, if necessary
+ if( $server_config['backup_dir_is_mount'] == 'y' && !$app->system->mount_backup_dir($backup_dir) ) $mount_backup = false;
+ if($mount_backup){
+ $web_backup_dir = $backup_dir.'/web'.$data_old['domain_id'];
+ //** do not use rm -rf $web_backup_dir because database(s) may exits
+ exec(escapeshellcmd('rm -f '.$web_backup_dir.'/web'.$data_old['domain_id'].'_').'*');
+ //* cleanup database
+ $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename LIKE ?";
+ $app->db->query($sql, $conf['server_id'], $data_old['domain_id'], "web".$data_old['domain_id']."_%");
+ if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $data_old['domain_id'], "web".$data_old['domain_id']."_%");
+
+ $app->log('Deleted the web backup files', LOGLEVEL_DEBUG);
+ }
+ }
+ }
+
$app->services->restartServiceDelayed('httpd', 'reload');
}
@@ -2043,8 +2353,8 @@
$folder_id = $data['new']['web_folder_id'];
}
- $folder = $app->db->queryOneRecord("SELECT * FROM web_folder WHERE web_folder_id = ".intval($folder_id));
- $website = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($folder['parent_domain_id']));
+ $folder = $app->db->queryOneRecord("SELECT * FROM web_folder WHERE web_folder_id = ?", $folder_id);
+ $website = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $folder['parent_domain_id']);
if(!is_array($folder) or !is_array($website)) {
$app->log('Not able to retrieve folder or website record.', LOGLEVEL_DEBUG);
@@ -2080,19 +2390,6 @@
$app->log('Created file '.$folder_path.'.htpasswd', LOGLEVEL_DEBUG);
}
- /*
- $auth_users = $app->db->queryAllRecords("SELECT * FROM web_folder_user WHERE active = 'y' AND web_folder_id = ".intval($folder_id));
- $htpasswd_content = '';
- if(is_array($auth_users) && !empty($auth_users)){
- foreach($auth_users as $auth_user){
- $htpasswd_content .= $auth_user['username'].':'.$auth_user['password']."\n";
- }
- }
- $htpasswd_content = trim($htpasswd_content);
- @file_put_contents($folder_path.'.htpasswd', $htpasswd_content);
- $app->log('Changed .htpasswd file: '.$folder_path.'.htpasswd',LOGLEVEL_DEBUG);
- */
-
if(($data['new']['username'] != $data['old']['username'] || $data['new']['active'] == 'n') && $data['old']['username'] != '') {
$app->system->removeLine($folder_path.'.htpasswd', $data['old']['username'].':');
$app->log('Removed user: '.$data['old']['username'], LOGLEVEL_DEBUG);
@@ -2121,7 +2418,7 @@
$folder_id = $data['old']['web_folder_id'];
$folder = $data['old'];
- $website = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($folder['parent_domain_id']));
+ $website = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $folder['parent_domain_id']);
if(!is_array($folder) or !is_array($website)) {
$app->log('Not able to retrieve folder or website record.', LOGLEVEL_DEBUG);
@@ -2158,7 +2455,7 @@
function web_folder_update($event_name, $data) {
global $app, $conf;
- $website = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['new']['parent_domain_id']));
+ $website = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['new']['parent_domain_id']);
if(!is_array($website)) {
$app->log('Not able to retrieve folder or website record.', LOGLEVEL_DEBUG);
@@ -2227,7 +2524,7 @@
//$app->load('tpl');
//$tpl = new tpl();
//$tpl->newTemplate('nginx_http_authentication.auth.master');
- $website_auth_locations = $app->db->queryAllRecords("SELECT * FROM web_folder WHERE active = 'y' AND parent_domain_id = ".intval($website['domain_id']));
+ $website_auth_locations = $app->db->queryAllRecords("SELECT * FROM web_folder WHERE active = 'y' AND parent_domain_id = ?", $website['domain_id']);
$basic_auth_locations = array();
if(is_array($website_auth_locations) && !empty($website_auth_locations)){
foreach($website_auth_locations as $website_auth_location){
@@ -2301,9 +2598,89 @@
}
}
+ private function hhvm_update($data, $web_config) {
+ global $app, $conf;
+
+ if(file_exists($conf['rootpath'] . '/conf-custom/hhvm_starter.master')) {
+ $content = file_get_contents($conf['rootpath'] . '/conf-custom/hhvm_starter.master');
+ } else {
+ $content = file_get_contents($conf['rootpath'] . '/conf/hhvm_starter.master');
+ }
+ if(file_exists($conf['rootpath'] . '/conf-custom/hhvm_monit.master')) {
+ $monit_content = file_get_contents($conf['rootpath'] . '/conf-custom/hhvm_monit.master');
+ } else {
+ $monit_content = file_get_contents($conf['rootpath'] . '/conf/hhvm_monit.master');
+ }
+
+ if($data['new']['php'] == 'hhvm' && $data['old']['php'] != 'hhvm' || (isset($data['old']['custom_php_ini']) && isset($data['new']['custom_php_ini']) && $data['new']['custom_php_ini'] != $data['old']['custom_php_ini'])) {
+
+ // Custom php.ini settings
+ $custom_php_ini_settings = trim($data['new']['custom_php_ini']);
+ 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['required_php_snippets']) && trim($snippet['required_php_snippets']) != ''){
+ $required_php_snippets = explode(',', trim($snippet['required_php_snippets']));
+ if(is_array($required_php_snippets) && !empty($required_php_snippets)){
+ foreach($required_php_snippets as $required_php_snippet){
+ $required_php_snippet = intval($required_php_snippet);
+ if($required_php_snippet > 0){
+ $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE ".($snippet['master_directive_snippets_id'] > 0 ? 'master_' : '')."directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet);
+ $php_snippet['snippet'] = trim($php_snippet['snippet']);
+ if($php_snippet['snippet'] != ''){
+ $custom_php_ini_settings .= "\n".$php_snippet['snippet'];
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if($custom_php_ini_settings != ''){
+ // Make sure we only have Unix linebreaks
+ $custom_php_ini_settings = str_replace("\r\n", "\n", $custom_php_ini_settings);
+ $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings);
+ file_put_contents('/etc/hhvm/'.$data['new']['system_user'].'.ini', $custom_php_ini_settings);
+ } else {
+ if($data['old']['system_user'] != '' && is_file('/etc/hhvm/'.$data['old']['system_user'].'.ini')) unlink('/etc/hhvm/'.$data['old']['system_user'].'.ini');
+ }
+
+ $content = str_replace('{SYSTEM_USER}', $data['new']['system_user'], $content);
+ file_put_contents('/etc/init.d/hhvm_' . $data['new']['system_user'], $content);
+ exec('chmod +x /etc/init.d/hhvm_' . $data['new']['system_user'] . ' >/dev/null 2>&1');
+ exec('/usr/sbin/update-rc.d hhvm_' . $data['new']['system_user'] . ' defaults >/dev/null 2>&1');
+ exec('/etc/init.d/hhvm_' . $data['new']['system_user'] . ' restart >/dev/null 2>&1');
+
+ if(is_dir('/etc/monit/conf.d')){
+ $monit_content = str_replace('{SYSTEM_USER}', $data['new']['system_user'], $monit_content);
+ file_put_contents('/etc/monit/conf.d/00-hhvm_' . $data['new']['system_user'], $monit_content);
+ if(is_file('/etc/monit/conf.d/hhvm_' . $data['new']['system_user'])) unlink('/etc/monit/conf.d/hhvm_' . $data['new']['system_user']);
+ exec('/etc/init.d/monit restart >/dev/null 2>&1');
+ }
+
+ } elseif($data['new']['php'] != 'hhvm' && $data['old']['php'] == 'hhvm') {
+ if($data['old']['system_user'] != ''){
+ exec('/etc/init.d/hhvm_' . $data['old']['system_user'] . ' stop >/dev/null 2>&1');
+ exec('/usr/sbin/update-rc.d hhvm_' . $data['old']['system_user'] . ' remove >/dev/null 2>&1');
+ unlink('/etc/init.d/hhvm_' . $data['old']['system_user']);
+ if(is_file('/etc/hhvm/'.$data['old']['system_user'].'.ini')) unlink('/etc/hhvm/'.$data['old']['system_user'].'.ini');
+ }
+
+ if(is_file('/etc/monit/conf.d/hhvm_' . $data['old']['system_user']) || is_file('/etc/monit/conf.d/00-hhvm_' . $data['old']['system_user'])){
+ if(is_file('/etc/monit/conf.d/hhvm_' . $data['old']['system_user'])){
+ unlink('/etc/monit/conf.d/hhvm_' . $data['old']['system_user']);
+ }
+ if(is_file('/etc/monit/conf.d/00-hhvm_' . $data['old']['system_user'])){
+ unlink('/etc/monit/conf.d/00-hhvm_' . $data['old']['system_user']);
+ }
+ exec('/etc/init.d/monit restart >/dev/null 2>&1');
+ }
+ }
+ }
+
//* Update the PHP-FPM pool configuration file
private function php_fpm_pool_update ($data, $web_config, $pool_dir, $pool_name, $socket_dir) {
global $app, $conf;
+ $pool_dir = trim($pool_dir);
/*
if(trim($data['new']['fastcgi_php_version']) != ''){
$default_php_fpm = false;
@@ -2313,7 +2690,8 @@
$default_php_fpm = true;
}
*/
- if($data['new']['php'] != 'no'){
+ // HHVM => PHP-FPM-Fallback
+ if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){
if(trim($data['new']['fastcgi_php_version']) != ''){
$default_php_fpm = false;
list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version']));
@@ -2334,7 +2712,8 @@
$app->uses("getconf");
$web_config = $app->getconf->get_server_config($conf["server_id"], 'web');
- if($data['new']['php'] == 'no'){
+ // HHVM => PHP-FPM-Fallback
+ if($data['new']['php'] != 'php-fpm' && $data['new']['php'] != 'hhvm'){
if(@is_file($pool_dir.$pool_name.'.conf')){
$app->system->unlink($pool_dir.$pool_name.'.conf');
//$reload = true;
@@ -2393,6 +2772,26 @@
// Custom php.ini settings
$final_php_ini_settings = array();
$custom_php_ini_settings = trim($data['new']['custom_php_ini']);
+
+ 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['required_php_snippets']) && trim($snippet['required_php_snippets']) != ''){
+ $required_php_snippets = explode(',', trim($snippet['required_php_snippets']));
+ if(is_array($required_php_snippets) && !empty($required_php_snippets)){
+ foreach($required_php_snippets as $required_php_snippet){
+ $required_php_snippet = intval($required_php_snippet);
+ if($required_php_snippet > 0){
+ $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE ".($snippet['master_directive_snippets_id'] > 0 ? 'master_' : '')."directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet);
+ $php_snippet['snippet'] = trim($php_snippet['snippet']);
+ if($php_snippet['snippet'] != ''){
+ $custom_php_ini_settings .= "\n".$php_snippet['snippet'];
+ }
+ }
+ }
+ }
+ }
+ }
+
if($custom_php_ini_settings != ''){
// Make sure we only have Unix linebreaks
$custom_php_ini_settings = str_replace("\r\n", "\n", $custom_php_ini_settings);
@@ -2436,7 +2835,7 @@
unset($tpl);
// delete pool in all other PHP versions
- $default_pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
+ $default_pool_dir = trim(escapeshellcmd($web_config['php_fpm_pool_dir']));
if(substr($default_pool_dir, -1) != '/') $default_pool_dir .= '/';
if($default_pool_dir != $pool_dir){
if ( @is_file($default_pool_dir.$pool_name.'.conf') ) {
@@ -2445,9 +2844,10 @@
$app->services->restartService('php-fpm', 'reload:'.$conf['init_scripts'].'/'.$web_config['php_fpm_init_script']);
}
}
- $php_versions = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ".$conf["server_id"]);
+ $php_versions = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ?", $conf["server_id"]);
if(is_array($php_versions) && !empty($php_versions)){
foreach($php_versions as $php_version){
+ $php_version['php_fpm_pool_dir'] = trim($php_version['php_fpm_pool_dir']);
if(substr($php_version['php_fpm_pool_dir'], -1) != '/') $php_version['php_fpm_pool_dir'] .= '/';
if($php_version['php_fpm_pool_dir'] != $pool_dir){
if ( @is_file($php_version['php_fpm_pool_dir'].$pool_name.'.conf') ) {
@@ -2484,6 +2884,7 @@
} else {
$pool_dir = $custom_php_fpm_pool_dir;
}
+ $pool_dir = trim($pool_dir);
if(substr($pool_dir, -1) != '/') $pool_dir .= '/';
$pool_name = 'web'.$data['old']['domain_id'];
@@ -2494,7 +2895,7 @@
}
// delete pool in all other PHP versions
- $default_pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
+ $default_pool_dir = trim(escapeshellcmd($web_config['php_fpm_pool_dir']));
if(substr($default_pool_dir, -1) != '/') $default_pool_dir .= '/';
if($default_pool_dir != $pool_dir){
if ( @is_file($default_pool_dir.$pool_name.'.conf') ) {
@@ -2503,9 +2904,10 @@
$app->services->restartService('php-fpm', 'reload:'.$conf['init_scripts'].'/'.$web_config['php_fpm_init_script']);
}
}
- $php_versions = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ".$data['old']['server_id']);
+ $php_versions = $app->db->queryAllRecords("SELECT * FROM server_php WHERE php_fpm_init_script != '' AND php_fpm_ini_dir != '' AND php_fpm_pool_dir != '' AND server_id = ?", $data['old']['server_id']);
if(is_array($php_versions) && !empty($php_versions)){
foreach($php_versions as $php_version){
+ $php_version['php_fpm_pool_dir'] = trim($php_version['php_fpm_pool_dir']);
if(substr($php_version['php_fpm_pool_dir'], -1) != '/') $php_version['php_fpm_pool_dir'] .= '/';
if($php_version['php_fpm_pool_dir'] != $pool_dir){
if ( @is_file($php_version['php_fpm_pool_dir'].$pool_name.'.conf') ) {
@@ -2621,13 +3023,15 @@
} else {
if($islocation){
- if(strpos($l, '{') !== false){
+ $openingbracketpos = strrpos($l, '{');
+ if($openingbracketpos !== false){
$level += 1;
}
- if(strpos($l, '}') !== false && $level > 0){
+ $closingbracketpos = strrpos($l, '}');
+ if($closingbracketpos !== false && $level > 0 && $closingbracketpos >= intval($openingbracketpos)){
$level -= 1;
$locations[$location]['location'] .= $lines[$i]."\n";
- } elseif(strpos($l, '}') !== false && $level == 0){
+ } elseif($closingbracketpos !== false && $level == 0 && $closingbracketpos >= intval($openingbracketpos)){
$islocation = false;
} else {
$locations[$location]['location'] .= $lines[$i]."\n";
--
Gitblit v1.9.1