From aa370627b211a51dc46891cfa4b6e3d2ef3e52db Mon Sep 17 00:00:00 2001
From: mcramer <m.cramer@pixcept.de>
Date: Tue, 16 Jul 2013 10:45:17 -0400
Subject: [PATCH] - Fixed FS#2924 - the month will not set automatically in the autoresponder by click now Along with this fixed some display problems with the combo boxes introduced in 3.0.5. Some fields were not correctly displayed with the predefined values if value and text of the underlying option element differ.
---
server/plugins-available/apache2_plugin.inc.php | 550 +++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 418 insertions(+), 132 deletions(-)
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 182a738..0c6ed54 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -100,7 +100,7 @@
$app->uses('getconf');
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
if ($web_config['CA_path']!='' && !file_exists($web_config['CA_path'].'/openssl.cnf'))
- $app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.conf',LOGLEVEL_ERROR);
+ $app->log("CA path error, file does not exist:".$web_config['CA_path'].'/openssl.cnf',LOGLEVEL_ERROR);
//* Only vhosts can have a ssl cert
if($data["new"]["type"] != "vhost" && $data["new"]["type"] != "vhostsubdomain") return;
@@ -121,8 +121,14 @@
$this->ssl_certificate_changed = true;
//* Rename files if they exist
- if(file_exists($key_file)) $app->system->rename($key_file,$key_file.'.bak');
- if(file_exists($key_file2)) $app->system->rename($key_file2,$key_file2.'.bak');
+ if(file_exists($key_file)){
+ $app->system->rename($key_file,$key_file.'.bak');
+ $app->system->chmod($key_file.'.bak',0400);
+ }
+ if(file_exists($key_file2)){
+ $app->system->rename($key_file2,$key_file2.'.bak');
+ $app->system->chmod($key_file2.'.bak',0400);
+ }
if(file_exists($csr_file)) $app->system->rename($csr_file,$csr_file.'.bak');
if(file_exists($crt_file)) $app->system->rename($crt_file,$crt_file.'.bak');
@@ -165,11 +171,15 @@
$rand_file = escapeshellcmd($rand_file);
$key_file = escapeshellcmd($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);
+ 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);
+ 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);
+ 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)) {
@@ -190,6 +200,7 @@
}
+ $app->system->chmod($key_file,0400);
$app->system->chmod($key_file2,0400);
@$app->system->unlink($config_file);
@$app->system->unlink($rand_file);
@@ -216,8 +227,14 @@
$bundle_file = $ssl_dir.'/'.$domain.".bundle";
//* Backup files
- if(file_exists($key_file)) $app->system->copy($key_file,$key_file.'~');
- if(file_exists($key_file2)) $app->system->copy($key_file2,$key_file2.'~');
+ if(file_exists($key_file)){
+ $app->system->copy($key_file,$key_file.'~');
+ $app->system->chmod($key_file.'~',0400);
+ }
+ if(file_exists($key_file2)){
+ $app->system->copy($key_file2,$key_file2.'~');
+ $app->system->chmod($key_file2.'~',0400);
+ }
if(file_exists($csr_file)) $app->system->copy($csr_file,$csr_file.'~');
if(file_exists($crt_file)) $app->system->copy($crt_file,$crt_file.'~');
if(file_exists($bundle_file)) $app->system->copy($bundle_file,$bundle_file.'~');
@@ -226,7 +243,18 @@
if(trim($data["new"]["ssl_request"]) != '') $app->system->file_put_contents($csr_file,$data["new"]["ssl_request"]);
if(trim($data["new"]["ssl_cert"]) != '') $app->system->file_put_contents($crt_file,$data["new"]["ssl_cert"]);
if(trim($data["new"]["ssl_bundle"]) != '') $app->system->file_put_contents($bundle_file,$data["new"]["ssl_bundle"]);
- if(trim($data["new"]["ssl_key"]) != '') $app->system->file_put_contents($key_file2,$data["new"]["ssl_key"]);
+
+ //* Write the key file, if field is empty then import the key into the db
+ if(trim($data["new"]["ssl_key"]) != '') {
+ $app->system->file_put_contents($key_file2,$data["new"]["ssl_key"]);
+ $app->system->chmod($key_file2,0400);
+ } else {
+ $ssl_key2 = $app->db->quote($app->system->file_get_contents($key_file2));
+ /* Update the DB of the (local) Server */
+ $app->db->query("UPDATE web_domain SET ssl_key = '$ssl_key2' WHERE domain = '".$data['new']['domain']."'");
+ /* Update also the master-DB of the Server-Farm */
+ $app->dbmaster->query("UPDATE web_domain SET ssl_key = '$ssl_key2' WHERE domain = '".$data['new']['domain']."'");
+ }
/* Update the DB of the (local) Server */
$app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = '".$data['new']['domain']."'");
@@ -313,7 +341,7 @@
}
if($data['new']['document_root'] == '') {
- $app->log('document_root not set',LOGLEVEL_WARN);
+ if($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain') $app->log('document_root not set',LOGLEVEL_WARN);
return 0;
}
if($data['new']['system_user'] == 'root' or $data['new']['system_group'] == 'root') {
@@ -403,43 +431,52 @@
//* Remove protection of old folders
$app->system->web_folder_protection($data['old']['document_root'],false);
+
+ if($data["new"]["type"] != "vhostsubdomain") {
+ //* Move the site data
+ $tmp_docroot = explode('/',$data['new']['document_root']);
+ unset($tmp_docroot[count($tmp_docroot)-1]);
+ $new_dir = implode('/',$tmp_docroot);
- //* Move the site data
- $tmp_docroot = explode('/',$data['new']['document_root']);
- unset($tmp_docroot[count($tmp_docroot)-1]);
- $new_dir = implode('/',$tmp_docroot);
+ $tmp_docroot = explode('/',$data['old']['document_root']);
+ unset($tmp_docroot[count($tmp_docroot)-1]);
+ $old_dir = implode('/',$tmp_docroot);
- $tmp_docroot = explode('/',$data['old']['document_root']);
- unset($tmp_docroot[count($tmp_docroot)-1]);
- $old_dir = implode('/',$tmp_docroot);
+ //* Check if there is already some data in the new docroot and rename it as we need a clean path to move the existing site to the new path
+ if(@is_dir($data['new']['document_root'])) {
+ $app->system->web_folder_protection($data['new']['document_root'],false);
+ $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);
+ }
+
+ //* Create new base directory, if it does not exist yet
+ if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir);
+ $app->system->web_folder_protection($data['old']['document_root'],false);
+ exec('mv '.escapeshellarg($data['old']['document_root']).' '.escapeshellarg($new_dir));
+ //$app->system->rename($data['old']['document_root'],$new_dir);
+ $app->log('Moving site to new document root: mv '.$data['old']['document_root'].' '.$new_dir,LOGLEVEL_DEBUG);
- //* Check if there is already some data in the new docroot and rename it as we need a clean path to move the existing site to the new path
- if(@is_dir($data['new']['document_root'])) {
- $app->system->rename($data['new']['document_root'],$data['new']['document_root'].'_bak_'.date('Y_m_d'));
- $app->log('Renaming existing directory in new docroot location. mv '.$data['new']['document_root'].' '.$data['new']['document_root'].'_bak_'.date('Y_m_d'),LOGLEVEL_DEBUG);
- }
-
- //* Create new base directory, if it does not exist yet
- if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir);
- //exec('mv '.$data['old']['document_root'].' '.$new_dir);
- $app->system->rename($data['old']['document_root'],$new_dir);
- $app->log('Moving site to new document root: mv '.$data['old']['document_root'].' '.$new_dir,LOGLEVEL_DEBUG);
+ // Handle the change in php_open_basedir
+ $data['new']['php_open_basedir'] = str_replace($data['old']['document_root'],$data['new']['document_root'],$data['old']['php_open_basedir']);
- // Handle the change in php_open_basedir
- $data['new']['php_open_basedir'] = str_replace($data['old']['document_root'],$data['new']['document_root'],$data['old']['php_open_basedir']);
+ //* Change the owner of the website files to the new website owner
+ exec('chown --recursive --from='.escapeshellcmd($data['old']['system_user']).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data['new']['system_user']).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir);
- //* Change the owner of the website files to the new website owner
- exec('chown --recursive --from='.escapeshellcmd($data['old']['system_user']).':'.escapeshellcmd($data['old']['system_group']).' '.escapeshellcmd($data['new']['system_user']).':'.escapeshellcmd($data['new']['system_group']).' '.$new_dir);
-
- //* Change the home directory and group of the website user
- $command = 'usermod';
- $command .= ' --home '.escapeshellcmd($data['new']['document_root']);
- $command .= ' --gid '.escapeshellcmd($data['new']['system_group']);
- $command .= ' '.escapeshellcmd($data['new']['system_user']);
- exec($command);
-
+ //* Change the home directory and group of the website user
+ $command = 'killall -u '.escapeshellcmd($data['new']['system_user']).' ; usermod';
+ $command .= ' --home '.escapeshellcmd($data['new']['document_root']);
+ $command .= ' --gid '.escapeshellcmd($data['new']['system_group']);
+ $command .= ' '.escapeshellcmd($data['new']['system_user']).' 2>/dev/null';
+ exec($command);
+ }
+
if($apache_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'].'/'.$log_folder.' none bind';
+ $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 0 0';
+ $app->system->replaceLine('/etc/fstab',$fstab_line,$fstab_line,1,1);
}
@@ -469,19 +506,26 @@
if($this->action == 'update' && $data['old']['domain'] != '' && $data['new']['domain'] != $data['old']['domain']) {
if(is_dir('/var/log/ispconfig/httpd/'.$data['old']['domain'])) exec('rm -rf /var/log/ispconfig/httpd/'.$data['old']['domain']);
if(is_link($data['old']['document_root'].'/'.$log_folder)) $app->system->unlink($data['old']['document_root'].'/'.$log_folder);
+
+ //* remove old log mount
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$log_folder.' none bind';
+ $app->system->removeLine('/etc/fstab',$fstab_line);
+
+ //* Unmount log directory
+ exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
}
//* Create the log dir if nescessary and mount it
- if(!is_dir('/var/log/ispconfig/httpd/'.$data['new']['domain'])) exec('mkdir -p /var/log/ispconfig/httpd/'.$data['new']['domain']);
- if(!is_dir($data['new']['document_root'].'/'.$log_folder) || is_link($data['new']['document_root'].'/'.$log_folder)) {
+ if(!is_dir($data['new']['document_root'].'/'.$log_folder) || !is_dir('/var/log/ispconfig/httpd/'.$data['new']['domain']) || is_link($data['new']['document_root'].'/'.$log_folder)) {
if(is_link($data['new']['document_root'].'/'.$log_folder)) unlink($data['new']['document_root'].'/'.$log_folder);
+ if(!is_dir('/var/log/ispconfig/httpd/'.$data['new']['domain'])) exec('mkdir -p /var/log/ispconfig/httpd/'.$data['new']['domain']);
$app->system->mkdirpath($data['new']['document_root'].'/'.$log_folder);
$app->system->chown($data['new']['document_root'].'/'.$log_folder,'root');
$app->system->chgrp($data['new']['document_root'].'/'.$log_folder,'root');
$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 0 0';
+ $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,$fstab_line,1,1);
}
@@ -608,8 +652,8 @@
exec('chown -R '.$data['new']['system_user'].':'.$data['new']['system_group'].' '.$error_page_path);
} // end copy error docs
- // Set the quota for the user
- if($username != '' && $app->system->is_user($username)) {
+ // Set the quota for the user, but only for vhosts, not vhostsubdomains
+ if($username != '' && $app->system->is_user($username) && $data['new']['type'] == 'vhost') {
if($data['new']['hd_quota'] > 0) {
$blocks_soft = $data['new']['hd_quota'] * 1024;
$blocks_hard = $blocks_soft + 1024;
@@ -630,6 +674,9 @@
$this->_exec('chown root:root '.escapeshellcmd($data['new']['document_root']).'/' . $web_folder);
}
}
+
+ //* add the Apache user to the client group if this is a vhost and security level is set to high, no matter if this is an insert or update and regardless of set_folder_permissions_on_update
+ if($data['new']['type'] == 'vhost' && $web_config['security_level'] == 20) $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['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')) {
@@ -658,7 +705,7 @@
if($web_config['add_web_users_to_sshusers_group'] == 'y') {
$command = 'usermod';
$command .= ' --groups sshusers';
- $command .= ' '.escapeshellcmd($data['new']['system_user']);
+ $command .= ' '.escapeshellcmd($data['new']['system_user']).' 2>/dev/null';
$this->_exec($command);
}
@@ -673,9 +720,6 @@
$app->system->server_conf['group_datei'] = $tmp_groupfile;
unset($tmp_groupfile);
}
-
- //* add the Apache user to the client group
- $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
//* Chown all default directories
$app->system->chown($data['new']['document_root'],'root');
@@ -779,20 +823,42 @@
if(!stristr($data['new']['custom_php_ini'],'open_basedir') && $data['new']['php'] == 'suphp') {
$data['new']['custom_php_ini'] .= "\nopen_basedir = '".$data['new']['php_open_basedir']."'\n";
}
+
+ $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi');
+
+ if(trim($data['new']['fastcgi_php_version']) != ''){
+ list($custom_fastcgi_php_name, $custom_fastcgi_php_executable, $custom_fastcgi_php_ini_dir) = explode(':', trim($data['new']['fastcgi_php_version']));
+ if(is_file($custom_fastcgi_php_ini_dir)) $custom_fastcgi_php_ini_dir = dirname($custom_fastcgi_php_ini_dir);
+ if(substr($custom_fastcgi_php_ini_dir,-1) == '/') $custom_fastcgi_php_ini_dir = substr($custom_fastcgi_php_ini_dir,0,-1);
+ }
+
//* Create custom php.ini
if(trim($data['new']['custom_php_ini']) != '') {
$has_custom_php_ini = true;
- if(!is_dir($custom_php_ini_dir)) $app->system->mkdir($custom_php_ini_dir);
+ if(!is_dir($custom_php_ini_dir)) $app->system->mkdirpath($custom_php_ini_dir);
$php_ini_content = '';
if($data['new']['php'] == 'mod') {
$master_php_ini_path = $web_config['php_ini_path_apache'];
} else {
- if($data["new"]['php'] == 'fast-cgi' && file_exists($fastcgi_config["fastcgi_phpini_path"])) {
- $master_php_ini_path = $fastcgi_config["fastcgi_phpini_path"];
+ if($data["new"]['php'] == 'fast-cgi') {
+ if(trim($data['new']['fastcgi_php_version']) != '' && file_exists($custom_fastcgi_php_ini_dir)){
+ $master_php_ini_path = $custom_fastcgi_php_ini_dir;
+ } elseif(file_exists($fastcgi_config["fastcgi_phpini_path"])){
+ $master_php_ini_path = $fastcgi_config["fastcgi_phpini_path"];
+ } else {
+ $master_php_ini_path = $web_config['php_ini_path_cgi'];
+ }
} else {
$master_php_ini_path = $web_config['php_ini_path_cgi'];
}
}
+
+ //* Add php.ini to the path in case that the master_php_ini_path is a directory
+ if($master_php_ini_path != '' && is_dir($master_php_ini_path) && is_file($master_php_ini_path.'/php.ini')) {
+ if(substr($master_php_ini_path,-1) == '/') $master_php_ini_path = substr($master_php_ini_path,0,-1);
+ $master_php_ini_path .= '/php.ini';
+ }
+
if($master_php_ini_path != '' && substr($master_php_ini_path,-7) == 'php.ini' && is_file($master_php_ini_path)) {
$php_ini_content .= $app->system->file_get_contents($master_php_ini_path)."\n";
}
@@ -849,15 +915,15 @@
//$vhost_data['document_root'] = $data['new']['document_root'].'/' . $web_folder;
// Set SEO Redirect
- if($data['new']['seo_redirect'] != '' && ($data['new']['subdomain'] == 'www' || $data['new']['subdomain'] == '*')){
+ if($data['new']['seo_redirect'] != ''){
$vhost_data['seo_redirect_enabled'] = 1;
- if($data['new']['seo_redirect'] == 'non_www_to_www'){
- $vhost_data['seo_redirect_origin_domain'] = $data['new']['domain'];
- $vhost_data['seo_redirect_target_domain'] = 'www.'.$data['new']['domain'];
- }
- if($data['new']['seo_redirect'] == 'www_to_non_www'){
- $vhost_data['seo_redirect_origin_domain'] = 'www.'.$data['new']['domain'];
- $vhost_data['seo_redirect_target_domain'] = $data['new']['domain'];
+ $tmp_seo_redirects = $this->get_seo_redirects($data['new']);
+ if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
+ foreach($tmp_seo_redirects as $key => $val){
+ $vhost_data[$key] = $val;
+ }
+ } else {
+ $vhost_data['seo_redirect_enabled'] = 0;
}
} else {
$vhost_data['seo_redirect_enabled'] = 0;
@@ -868,7 +934,7 @@
// Rewrite rules
$rewrite_rules = array();
if($data['new']['redirect_type'] != '' && $data['new']['redirect_path'] != '') {
- if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/';
+ if(substr($data['new']['redirect_path'],-1) != '/' && !preg_match('/^(https?|\[scheme\]):\/\//', $data['new']['redirect_path'])) $data['new']['redirect_path'] .= '/';
if(substr($data['new']['redirect_path'],0,8) == '[scheme]'){
$rewrite_target = 'http'.substr($data['new']['redirect_path'],8);
$rewrite_target_ssl = 'https'.substr($data['new']['redirect_path'],8);
@@ -888,26 +954,30 @@
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
$rewrite_rules[] = array( 'rewrite_domain' => '^' . $this->_rewrite_quote('www.'.$data['new']['domain']),
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
break;
case '*':
$rewrite_rules[] = array( 'rewrite_domain' => '(^|\.)'.$this->_rewrite_quote($data['new']['domain']),
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
break;
default:
$rewrite_rules[] = array( 'rewrite_domain' => '^'.$this->_rewrite_quote($data['new']['domain']),
'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
}
}
@@ -929,6 +999,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'");
+ $alias_seo_redirects = array();
switch($data['new']['subdomain']) {
case 'www':
$server_alias[] .= 'www.'.$data['new']['domain'].' ';
@@ -951,9 +1022,18 @@
break;
}
$app->log('Add server alias: '.$alias['domain'],LOGLEVEL_DEBUG);
+
+ // Add SEO redirects for alias domains
+ if($alias['seo_redirect'] != '' && $data['new']['seo_redirect'] != '*_to_www_domain_tld' && $data['new']['seo_redirect'] != '*_to_domain_tld' && ($alias['type'] == 'alias' || ($alias['type'] == 'subdomain' && $data['new']['seo_redirect'] != '*_domain_tld_to_www_domain_tld' && $data['new']['seo_redirect'] != '*_domain_tld_to_domain_tld'))){
+ $tmp_seo_redirects = $this->get_seo_redirects($alias, 'alias_');
+ if(is_array($tmp_seo_redirects) && !empty($tmp_seo_redirects)){
+ $alias_seo_redirects[] = $tmp_seo_redirects;
+ }
+ }
+
// Rewriting
if($alias['redirect_type'] != '' && $alias['redirect_path'] != '') {
- if(substr($alias['redirect_path'],-1) != '/') $alias['redirect_path'] .= '/';
+ if(substr($alias['redirect_path'],-1) != '/' && !preg_match('/^(https?|\[scheme\]):\/\//', $alias['redirect_path'])) $alias['redirect_path'] .= '/';
if(substr($alias['redirect_path'],0,8) == '[scheme]'){
$rewrite_target = 'http'.substr($alias['redirect_path'],8);
$rewrite_target_ssl = 'https'.substr($alias['redirect_path'],8);
@@ -973,19 +1053,22 @@
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
$rewrite_rules[] = array( 'rewrite_domain' => '^' . $this->_rewrite_quote('www.'.$alias['domain']),
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
break;
case '*':
$rewrite_rules[] = array( 'rewrite_domain' => '(^|\.)'.$this->_rewrite_quote($alias['domain']),
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
break;
default:
if(substr($alias['domain'], 0, 2) === '*.') $domain_rule = '(^|\.)'.$this->_rewrite_quote(substr($alias['domain'], 2));
@@ -994,7 +1077,8 @@
'rewrite_type' => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']',
'rewrite_target' => $rewrite_target,
'rewrite_target_ssl' => $rewrite_target_ssl,
- 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'));
+ 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'),
+ 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n'));
}
}
}
@@ -1017,7 +1101,7 @@
$tpl->setVar('alias','');
}
- if(count($rewrite_rules) > 0 || $vhost_data['seo_redirect_enabled'] > 0) {
+ if(count($rewrite_rules) > 0 || $vhost_data['seo_redirect_enabled'] > 0 || count($alias_seo_redirects) > 0) {
$tpl->setVar('rewrite_enabled',1);
} else {
$tpl->setVar('rewrite_enabled',0);
@@ -1033,7 +1117,6 @@
*/
if ($data['new']['php'] == 'fast-cgi') {
- $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi');
$fastcgi_starter_path = str_replace('[system_user]',$data['new']['system_user'],$fastcgi_config['fastcgi_starter_path']);
$fastcgi_starter_path = str_replace('[client_id]',$client_id,$fastcgi_starter_path);
@@ -1056,7 +1139,6 @@
// Support for multiple PHP versions (FastCGI)
if(trim($data['new']['fastcgi_php_version']) != ''){
$default_fastcgi_php = false;
- list($custom_fastcgi_php_name, $custom_fastcgi_php_executable, $custom_fastcgi_php_ini_dir) = explode(':', trim($data['new']['fastcgi_php_version']));
if(substr($custom_fastcgi_php_ini_dir,-1) != '/') $custom_fastcgi_php_ini_dir .= '/';
} else {
$default_fastcgi_php = true;
@@ -1098,11 +1180,11 @@
$tpl->setVar('fastcgi_starter_path',$fastcgi_starter_path);
$tpl->setVar('fastcgi_starter_script',$fastcgi_config['fastcgi_starter_script'].($data['new']['type'] == 'vhostsubdomain' ? '_web' . $data['new']['domain_id'] : ''));
$tpl->setVar('fastcgi_config_syntax',$fastcgi_config['fastcgi_config_syntax']);
+ $tpl->setVar('fastcgi_max_requests',$fastcgi_config['fastcgi_max_requests']);
} else {
//remove the php fastgi starter script if available
if ($data['old']['php'] == 'fast-cgi') {
- $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi');
$fastcgi_starter_path = str_replace('[system_user]',$data['old']['system_user'],$fastcgi_config['fastcgi_starter_path']);
$fastcgi_starter_path = str_replace('[client_id]',$client_id,$fastcgi_starter_path);
if($data['old']['type'] == 'vhost') {
@@ -1232,12 +1314,12 @@
//* create empty vhost array
$vhosts = array();
- //* Add vhost for ipv4 IP
- if(count($rewrite_rules) > 0){
- $vhosts[] = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 0, 'port' => 80, 'redirects' => $rewrite_rules);
- } else {
- $vhosts[] = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 0, 'port' => 80);
- }
+ //* Add vhost for ipv4 IP
+ $tmp_vhost_arr = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 0, 'port' => 80);
+ if(count($rewrite_rules) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('redirects' => $rewrite_rules);
+ if(count($alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $alias_seo_redirects);
+ $vhosts[] = $tmp_vhost_arr;
+ unset($tmp_vhost_arr);
//* Add vhost for ipv4 IP with SSL
$ssl_dir = $data['new']['document_root'].'/ssl';
@@ -1246,30 +1328,53 @@
$crt_file = $ssl_dir.'/'.$domain.'.crt';
if($data['new']['ssl_domain'] != '' && $data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file) && (@filesize($crt_file)>0) && (@filesize($key_file)>0)) {
- if(count($rewrite_rules) > 0){
- $vhosts[] = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 1, 'port' => '443', 'redirects' => $rewrite_rules);
- } else {
- $vhosts[] = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 1, 'port' => '443');
+ $tmp_vhost_arr = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 1, 'port' => '443');
+ if(count($rewrite_rules) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('redirects' => $rewrite_rules);
+ $ipv4_ssl_alias_seo_redirects = $alias_seo_redirects;
+ if(is_array($ipv4_ssl_alias_seo_redirects) && !empty($ipv4_ssl_alias_seo_redirects)){
+ for($i=0;$i<count($ipv4_ssl_alias_seo_redirects);$i++){
+ $ipv4_ssl_alias_seo_redirects[$i]['ssl_enabled'] = 1;
+ }
}
- $app->log('Enable SSL for: '.$domain,LOGLEVEL_DEBUG);
- }
-
- //* Add vhost for IPv6 IP
- if($data['new']['ipv6_address'] != '') {
- if(count($rewrite_rules) > 0){
- $vhosts[] = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 0, 'port' => 80, 'redirects' => $rewrite_rules);
- } else {
- $vhosts[] = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 0, 'port' => 80);
- }
+ if(count($ipv4_ssl_alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $ipv4_ssl_alias_seo_redirects);
+ $vhosts[] = $tmp_vhost_arr;
+ unset($tmp_vhost_arr, $ipv4_ssl_alias_seo_redirects);
+ $app->log('Enable SSL for: '.$domain,LOGLEVEL_DEBUG);
+ }
+
+ //* Add vhost for IPv6 IP
+ if($data['new']['ipv6_address'] != '') {
+ if ($conf['serverconfig']['web']['vhost_rewrite_v6'] == 'y') {
+ if (isset($conf['serverconfig']['server']['v6_prefix']) && $conf['serverconfig']['server']['v6_prefix'] <> '') {
+ $explode_v6prefix=explode(':',$conf['serverconfig']['server']['v6_prefix']);
+ $explode_v6=explode(':',$data['new']['ipv6_address']);
+
+ for ( $i = 0; $i <= count($explode_v6prefix)-3; $i++ ) {
+ $explode_v6[$i] = $explode_v6prefix[$i];
+ }
+ $data['new']['ipv6_address'] = implode(':',$explode_v6);
+ }
+ }
+
+ $tmp_vhost_arr = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 0, 'port' => 80);
+ if(count($rewrite_rules) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('redirects' => $rewrite_rules);
+ if(count($alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $alias_seo_redirects);
+ $vhosts[] = $tmp_vhost_arr;
+ unset($tmp_vhost_arr);
//* Add vhost for ipv6 IP with SSL
if($data['new']['ssl_domain'] != '' && $data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file) && (@filesize($crt_file)>0) && (@filesize($key_file)>0)) {
-
- if(count($rewrite_rules) > 0){
- $vhosts[] = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 1, 'port' => '443', 'redirects' => $rewrite_rules);
- } else {
- $vhosts[] = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 1, 'port' => '443');
+ $tmp_vhost_arr = array('ip_address' => '['.$data['new']['ipv6_address'].']', 'ssl_enabled' => 1, 'port' => '443');
+ if(count($rewrite_rules) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('redirects' => $rewrite_rules);
+ $ipv6_ssl_alias_seo_redirects = $alias_seo_redirects;
+ if(is_array($ipv6_ssl_alias_seo_redirects) && !empty($ipv6_ssl_alias_seo_redirects)){
+ for($i=0;$i<count($ipv6_ssl_alias_seo_redirects);$i++){
+ $ipv6_ssl_alias_seo_redirects[$i]['ssl_enabled'] = 1;
+ }
}
+ if(count($ipv6_ssl_alias_seo_redirects) > 0) $tmp_vhost_arr = $tmp_vhost_arr + array('alias_seo_redirects' => $ipv6_ssl_alias_seo_redirects);
+ $vhosts[] = $tmp_vhost_arr;
+ unset($tmp_vhost_arr, $ipv6_ssl_alias_seo_redirects);
$app->log('Enable SSL for IPv6: '.$domain,LOGLEVEL_DEBUG);
}
}
@@ -1340,21 +1445,21 @@
}
//* Create .htaccess and .htpasswd file for website statistics
- if(!is_file($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess') or $data['old']['document_root'] != $data['new']['document_root']) {
- if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdir($data['new']['document_root'].'/' . $web_folder . '/stats');
- $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/.htpasswd_stats\nrequire valid-user";
- $app->system->file_put_contents($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess',$ht_file);
- $app->system->chmod($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess',0755);
- unset($ht_file);
- }
+ //if(!is_file($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess') or $data['old']['document_root'] != $data['new']['document_root']) {
+ if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdir($data['new']['document_root'].'/' . $web_folder . '/stats');
+ $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user";
+ $app->system->file_put_contents($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess',$ht_file);
+ $app->system->chmod($data['new']['document_root'].'/' . $web_folder . '/stats/.htaccess',0755);
+ unset($ht_file);
+ //}
- if(!is_file($data['new']['document_root'].'/.htpasswd_stats') || $data['new']['stats_password'] != $data['old']['stats_password']) {
+ if(!is_file($data['new']['document_root'].'/web/stats/.htpasswd_stats') || $data['new']['stats_password'] != $data['old']['stats_password']) {
if(trim($data['new']['stats_password']) != '') {
$htp_file = 'admin:'.trim($data['new']['stats_password']);
$app->system->web_folder_protection($data['new']['document_root'],false);
- $app->system->file_put_contents($data['new']['document_root'].'/.htpasswd_stats',$htp_file);
+ $app->system->file_put_contents($data['new']['document_root'].'/web/stats/.htpasswd_stats',$htp_file);
$app->system->web_folder_protection($data['new']['document_root'],true);
- $app->system->chmod($data['new']['document_root'].'/.htpasswd_stats',0750);
+ $app->system->chmod($data['new']['document_root'].'/web/stats/.htpasswd_stats',0755);
unset($htp_file);
}
}
@@ -1371,17 +1476,23 @@
$apache_online_status_before_restart = $this->_checkTcp('localhost',80);
$app->log('Apache status is: '.$apache_online_status_before_restart,LOGLEVEL_DEBUG);
- $app->services->restartService('httpd','restart');
+ $retval = $app->services->restartService('httpd','restart'); // $retval['retval'] is 0 on success and > 0 on failure
+ $app->log('Apache restart return value is: '.$retval['retval'],LOGLEVEL_DEBUG);
// wait a few seconds, before we test the apache status again
+ $apache_online_status_after_restart = false;
sleep(2);
-
+ for($i = 0; $i < 5; $i++) {
+ $apache_online_status_after_restart = $this->_checkTcp('localhost',80);
+ if($apache_online_status_after_restart) break;
+ sleep(1);
+ }
//* Check if apache restarted successfully if it was online before
- $apache_online_status_after_restart = $this->_checkTcp('localhost',80);
$app->log('Apache online status after restart is: '.$apache_online_status_after_restart,LOGLEVEL_DEBUG);
- if($apache_online_status_before_restart && !$apache_online_status_after_restart) {
- $app->log('Apache did not restart after the configuration change for website '.$data['new']['domain'].' Reverting the configuration. Saved non-working config as '.$vhost_file.'.err',LOGLEVEL_WARN);
+ if($apache_online_status_before_restart && !$apache_online_status_after_restart || $retval['retval'] > 0) {
+ $app->log('Apache did not restart after the configuration change for website '.$data['new']['domain'].'. Reverting the configuration. Saved non-working config as '.$vhost_file.'.err',LOGLEVEL_WARN);
$app->system->copy($vhost_file,$vhost_file.'.err');
+ if(is_array($retval['output']) && !empty($retval['output'])) $app->log('Reason for Apache restart failure: '.implode("\n", $retval['output']),LOGLEVEL_WARN);
if(is_file($vhost_file.'~')) {
//* Copy back the last backup file
$app->system->copy($vhost_file.'~',$vhost_file);
@@ -1400,8 +1511,14 @@
$bundle_file = $ssl_dir.'/'.$domain.'.bundle';
//* Backup the files that might have caused the error
- if(is_file($key_file)) $app->system->copy($key_file,$key_file.'.err');
- if(is_file($key_file2)) $app->system->copy($key_file2,$key_file2.'.err');
+ if(is_file($key_file)){
+ $app->system->copy($key_file,$key_file.'.err');
+ $app->system->chmod($key_file.'.err',0400);
+ }
+ if(is_file($key_file2)){
+ $app->system->copy($key_file2,$key_file2.'.err');
+ $app->system->chmod($key_file2.'.err',0400);
+ }
if(is_file($csr_file)) $app->system->copy($csr_file,$csr_file.'.err');
if(is_file($crt_file)) $app->system->copy($crt_file,$crt_file.'.err');
if(is_file($bundle_file)) $app->system->copy($bundle_file,$bundle_file.'.err');
@@ -1461,8 +1578,9 @@
$app->uses('getconf');
$app->uses('system');
$web_config = $app->getconf->get_server_config($conf['server_id'], 'web');
+ $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi');
- $app->system->web_folder_protection($data['old']['document_root'],false);
+ if($data['old']['type'] == 'vhost' || $data['old']['type'] == 'vhostsubdomain') $app->system->web_folder_protection($data['old']['document_root'],false);
//* Check if this is a chrooted setup
if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) {
@@ -1476,18 +1594,73 @@
$web_folder = '';
if($data['old']['type'] == 'vhostsubdomain') {
$tmp = $app->db->queryOneRecord('SELECT `domain`,`document_root` FROM web_domain WHERE domain_id = '.intval($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'];
- $web_folder = $data['old']['web_folder'];
- $log_folder .= '/' . $subdomain_host;
+ if($tmp['domain'] != ''){
+ $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $data['old']['domain']);
+ } else {
+ // get log folder from /etc/fstab
+ /*
+ $bind_mounts = $app->system->file_get_contents('/etc/fstab');
+ $bind_mount_lines = explode("\n", $bind_mounts);
+ if(is_array($bind_mount_lines) && !empty($bind_mount_lines)){
+ foreach($bind_mount_lines as $bind_mount_line){
+ $bind_mount_line = preg_replace('/\s+/', ' ', $bind_mount_line);
+ $bind_mount_parts = explode(' ', $bind_mount_line);
+ if(is_array($bind_mount_parts) && !empty($bind_mount_parts)){
+ if($bind_mount_parts[0] == '/var/log/ispconfig/httpd/'.$data['old']['domain'] && $bind_mount_parts[2] == 'none' && strpos($bind_mount_parts[3], 'bind') !== false){
+ $subdomain_host = str_replace($data['old']['document_root'].'/log/', '', $bind_mount_parts[1]);
+ }
+ }
+ }
+ }
+ */
+ // we are deleting the parent domain, so we can delete everything in the log directory
+ $subdomain_hosts = array();
+ $files = array_diff(scandir($data['old']['document_root'].'/'.$log_folder), array('.','..'));
+ if(is_array($files) && !empty($files)){
+ foreach($files as $file){
+ if(is_dir($data['old']['document_root'].'/'.$log_folder.'/'.$file)){
+ $subdomain_hosts[] = $file;
+ }
+ }
+ }
+ }
+ if(is_array($subdomain_hosts) && !empty($subdomain_hosts)){
+ $log_folders = array();
+ foreach($subdomain_hosts as $subdomain_host){
+ $log_folders[] = $log_folder.'/'.$subdomain_host;
+ }
+ } else {
+ if($subdomain_host == '') $subdomain_host = 'web'.$data['old']['domain_id'];
+ $log_folder .= '/' . $subdomain_host;
+ }
+ $web_folder = $data['old']['web_folder'];
unset($tmp);
+ unset($subdomain_hosts);
}
- exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
+ if($data['old']['type'] == 'vhost' || $data['old']['type'] == 'vhostsubdomain'){
+ 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('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('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
+ }
+ }
//* remove mountpoint from fstab
- $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$log_folder.' none bind 0 0';
- $app->system->removeLine('/etc/fstab',$fstab_line);
+ if(is_array($log_folders) && !empty($log_folders)){
+ foreach($log_folders as $log_folder){
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$log_folder.' none bind';
+ $app->system->removeLine('/etc/fstab',$fstab_line);
+ }
+ } else {
+ $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$log_folder.' none bind';
+ $app->system->removeLine('/etc/fstab',$fstab_line);
+ }
+ unset($log_folders);
if($data['old']['type'] != 'vhost' && $data['old']['type'] != 'vhostsubdomain' && $data['old']['parent_domain_id'] > 0) {
//* This is a alias domain or subdomain, so we have to update the website instead
@@ -1526,19 +1699,74 @@
if($data['old']['type'] == 'vhost' || $data['old']['type'] == 'vhostsubdomain') {
$docroot = escapeshellcmd($data['old']['document_root']);
if($docroot != '' && !stristr($docroot,'..')) {
- if($data['old']['type'] == 'vhost') exec('rm -rf '.$docroot);
- elseif(!stristr($data['old']['web_folder'], '..')) exec('rm -rf '.$docroot.'/'.$web_folder);
+ if($data['old']['type'] == 'vhost') {
+ // this is a vhost - we delete everything in here.
+ exec('rm -rf '.$docroot);
+ } elseif(!stristr($data['old']['web_folder'], '..')) {
+ // this is a vhost subdomain
+ // IMPORTANT: do some folder checks before we delete this!
+ $do_delete = true;
+ $delete_folder = preg_replace('/[\/]{2,}/', '/', $web_folder); // replace / occuring multiple times
+ if(substr($delete_folder, 0, 1) === '/') $delete_folder = substr($delete_folder, 1);
+ if(substr($delete_folder, -1) === '/') $delete_folder = substr($delete_folder, 0, -1);
+
+ $path_elements = explode('/', $delete_folder);
+
+ if($path_elements[0] == 'web' || $path_elements[0] === '') {
+ // paths beginning with /web should NEVER EVER be deleted, empty paths should NEVER occur - but for safety reasons we check it here!
+ // we use strict check as otherwise directories named '0' may not be deleted
+ $do_delete = false;
+ } 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' AND parent_domain_id = ".intval($data['old']['parent_domain_id'])." AND domain_id != ".intval($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
+ if(substr($tmp_folder, 0, 1) === '/') $tmp_folder = substr($tmp_folder, 1);
+ if(substr($tmp_folder, -1) === '/') $tmp_folder = substr($tmp_folder, 0, -1);
+
+ // add this path and it's parent paths to used_paths array
+ while(strpos($tmp_folder, '/') !== false) {
+ if(in_array($tmp_folder, $used_paths) == false) $used_paths[] = $tmp_folder;
+ $tmp_folder = substr($tmp_folder, 0, strrpos($tmp_folder, '/'));
+ }
+ if(in_array($tmp_folder, $used_paths) == false) $used_paths[] = $tmp_folder;
+ }
+ unset($tmp);
+
+ // loop and check if the path is still used and stop at first used one
+ // set do_delete to false so nothing gets deleted if the web_folder itself is still used
+ $do_delete = false;
+ while(count($path_elements) > 0) {
+ $tmp_folder = implode('/', $path_elements);
+ if(in_array($tmp_folder, $used_paths) == true) break;
+
+ // this path is not used - set it as path to delete, strip the last element from the array and set do_delete to true
+ $delete_folder = $tmp_folder;
+ $do_delete = true;
+ array_pop($path_elements);
+ }
+ unset($tmp_folder);
+ unset($used_paths);
+ }
+
+ if($do_delete === true && $delete_folder !== '') exec('rm -rf '.$docroot.'/'.$delete_folder);
+
+ unset($delete_folder);
+ unset($path_elements);
+ }
}
//remove the php fastgi starter script if available
if ($data['old']['php'] == 'fast-cgi') {
- $fastcgi_starter_path = str_replace('[system_user]',$data['old']['system_user'],$web_config['fastcgi_starter_path']);
+ $fastcgi_starter_path = str_replace('[system_user]',$data['old']['system_user'],$fastcgi_config['fastcgi_starter_path']);
if($data['old']['type'] == 'vhost') {
if (is_dir($fastcgi_starter_path)) {
exec('rm -rf '.$fastcgi_starter_path);
}
} else {
- $fcgi_starter_script = $fastcgi_starter_path.$web_config['fastcgi_starter_script'].'_web'.$data['old']['domain_id'];
+ $fcgi_starter_script = $fastcgi_starter_path.$fastcgi_config['fastcgi_starter_script'].'_web'.$data['old']['domain_id'];
if (file_exists($fcgi_starter_script)) {
exec('rm -f '.$fcgi_starter_script);
}
@@ -1581,7 +1809,7 @@
$tmp_symlink = str_replace('[website_domain]',$data['old']['domain'],$tmp_symlink);
// Remove trailing slash
if(substr($tmp_symlink, -1, 1) == '/') $tmp_symlink = substr($tmp_symlink, 0, -1);
- // create the symlinks, if not exist
+ // delete the symlink
if(is_link($tmp_symlink)) {
$app->system->unlink($tmp_symlink);
$app->log('Removing symlink: '.$tmp_symlink,LOGLEVEL_DEBUG);
@@ -1598,8 +1826,8 @@
if($data['old']['type'] == 'vhost') {
//delete the web user
- $command = 'userdel';
- $command .= ' '.$data['old']['system_user'];
+ $command = 'killall -u '.escapeshellcmd($data['old']['system_user']).' ; userdel';
+ $command .= ' '.escapeshellcmd($data['old']['system_user']);
exec($command);
if($apache_chrooted) $this->_exec('chroot '.escapeshellcmd($web_config['website_basedir']).' '.$command);
@@ -2198,7 +2426,7 @@
$files = @scandir($webdavRoot);
if(is_array($files)) {
foreach($files as $file) {
- if (substr($file, strlen($file) - strlen('.htdigest')) == '.htdigest' && preg_match("[a-zA-Z0-9\-_\.]",$file)) {
+ if (substr($file, strlen($file) - strlen('.htdigest')) == '.htdigest' && preg_match("/^[a-zA-Z0-9\-_\.]*$/",$file)) {
/*
* found a htdigest - file, so add it to webdav
*/
@@ -2526,12 +2754,25 @@
$client_dir = $web_config['website_basedir'].'/clients/client'.$client_id;
if(is_dir($client_dir) && !stristr($client_dir,'..')) {
+ // remove symlinks from $client_dir
+ $files = array_diff(scandir($client_dir), array('.','..'));
+ if(is_array($files) && !empty($files)){
+ foreach($files as $file){
+ if(is_link($client_dir.'/'.$file)){
+ unlink($client_dir.'/'.$file);
+ $app->log('Removed symlink: '.$client_dir.'/'.$file,LOGLEVEL_DEBUG);
+ }
+ }
+ }
+
@rmdir($client_dir);
$app->log('Removed client directory: '.$client_dir,LOGLEVEL_DEBUG);
}
- $this->_exec('groupdel client'.$client_id);
- $app->log('Removed group client'.$client_id,LOGLEVEL_DEBUG);
+ if($app->system->is_group('client'.$client_id)){
+ $this->_exec('groupdel client'.$client_id);
+ $app->log('Removed group client'.$client_id,LOGLEVEL_DEBUG);
+ }
}
}
@@ -2556,6 +2797,8 @@
}
public function create_relative_link($f, $t) {
+ global $app;
+
// $from already exists
$from = realpath($f);
@@ -2588,6 +2831,49 @@
private function _is_url($string) {
return preg_match('/^(f|ht)tp(s)?:\/\//i', $string);
}
+
+ private function get_seo_redirects($web, $prefix = ''){
+ $seo_redirects = array();
+
+ if(substr($web['domain'], 0, 2) === '*.') $web['subdomain'] = '*';
+
+ if($web['subdomain'] == 'www' || $web['subdomain'] == '*'){
+ if($web['seo_redirect'] == 'non_www_to_www'){
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = str_replace('.', '\.', $web['domain']);
+ $seo_redirects[$prefix.'seo_redirect_target_domain'] = 'www.'.$web['domain'];
+ $seo_redirects[$prefix.'seo_redirect_operator'] = '';
+ }
+ if($web['seo_redirect'] == '*_domain_tld_to_www_domain_tld'){
+ // ^(example\.com|(?!\bwww\b)\.example\.com)$
+ // ^(example\.com|((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.example\.com))$
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = '('.str_replace('.', '\.', $web['domain']).'|((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.'.str_replace('.', '\.', $web['domain']).'))';
+ $seo_redirects[$prefix.'seo_redirect_target_domain'] = 'www.'.$web['domain'];
+ $seo_redirects[$prefix.'seo_redirect_operator'] = '';
+ }
+ if($web['seo_redirect'] == '*_to_www_domain_tld'){
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = 'www\.'.str_replace('.', '\.', $web['domain']);
+ $seo_redirects[$prefix.'seo_redirect_target_domain'] = 'www.'.$web['domain'];
+ $seo_redirects[$prefix.'seo_redirect_operator'] = '!';
+ }
+ }
+ if($web['seo_redirect'] == 'www_to_non_www'){
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = 'www\.'.str_replace('.', '\.', $web['domain']);
+ $seo_redirects[$prefix.'seo_redirect_target_domain'] = $web['domain'];
+ $seo_redirects[$prefix.'seo_redirect_operator'] = '';
+ }
+ if($web['seo_redirect'] == '*_domain_tld_to_domain_tld'){
+ // ^(.+)\.example\.com$
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = '(.+)\.'.str_replace('.', '\.', $web['domain']);
+ $seo_redirects[$prefix.'seo_redirect_target_domain'] = $web['domain'];
+ $seo_redirects[$prefix.'seo_redirect_operator'] = '';
+ }
+ if($web['seo_redirect'] == '*_to_domain_tld'){
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = str_replace('.', '\.', $web['domain']);
+ $seo_redirects[$prefix.'seo_redirect_target_domain'] = $web['domain'];
+ $seo_redirects[$prefix.'seo_redirect_operator'] = '!';
+ }
+ return $seo_redirects;
+ }
} // end class
--
Gitblit v1.9.1