From db05ea5f32aa078d4a20e4889f9e19b4f8d03d73 Mon Sep 17 00:00:00 2001 From: "Michael Kaufmann (d00p)" Date: Fri, 15 Oct 2010 10:41:58 +0000 Subject: [PATCH] - added possibility to set a custom docroot for any ip/port combination, fixes #417 - sort vhosts-file by type (subdomain, sub-of-main, main-domain), fixes #437 --- admin_ipsandports.php | 26 ++++++++++++++-- install/froxlor.sql | 3 +- .../updates/froxlor/0.9/update_0.9.inc.php | 11 +++++++ lib/tables.inc.php | 2 +- lng/english.lng.php | 4 +++ lng/german.lng.php | 4 +++ .../jobs/cron_tasks.inc.http.10.apache.php | 30 ++++++++++++++----- .../jobs/cron_tasks.inc.http.20.lighttpd.php | 24 ++++++++++++--- .../admin/ipsandports/ipsandports_add.tpl | 4 +++ .../admin/ipsandports/ipsandports_edit.tpl | 4 +++ 10 files changed, 97 insertions(+), 15 deletions(-) diff --git a/admin_ipsandports.php b/admin_ipsandports.php index f6ea239f..d6e6f2a3 100644 --- a/admin_ipsandports.php +++ b/admin_ipsandports.php @@ -147,6 +147,7 @@ if($page == 'ipsandports' $ssl_ca_file = validate($_POST['ssl_ca_file'], 'ssl_ca_file'); $ssl_cert_chainfile = validate($_POST['ssl_cert_chainfile'], 'ssl_cert_chainfile'); $default_vhostconf_domain = validate(str_replace("\r\n", "\n", $_POST['default_vhostconf_domain']), 'default_vhostconf_domain', '/^[^\0]*$/'); + $docroot = validate($_POST['docroot'], 'docroot'); if($listen_statement != '1') { @@ -193,6 +194,15 @@ if($page == 'ipsandports' $ssl_cert_chainfile = makeCorrectFile($ssl_cert_chainfile); } + if(strlen(trim($docroot)) > 0) + { + $docroot = makeCorrectDir($docroot); + } + else + { + $docroot = ''; + } + $result_checkfordouble = $db->query_first("SELECT `id` FROM `" . TABLE_PANEL_IPSANDPORTS . "` WHERE `ip`='" . $db->escape($ip) . "' AND `port`='" . (int)$port . "'"); if($result_checkfordouble['id'] != '') @@ -215,7 +225,8 @@ if($page == 'ipsandports' `ssl_key_file` = '" . $db->escape($ssl_key_file) . "', `ssl_ca_file` = '" . $db->escape($ssl_ca_file) . "', `ssl_cert_chainfile` = '" . $db->escape($ssl_cert_chainfile) . "', - `default_vhostconf_domain` = '" . $db->escape($default_vhostconf_domain) . "'; + `default_vhostconf_domain` = '" . $db->escape($default_vhostconf_domain) . "', + `docroot` = '" . $db->escape($docroot) . "'; "); if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) @@ -264,6 +275,7 @@ if($page == 'ipsandports' $ssl_ca_file = validate($_POST['ssl_ca_file'], 'ssl_ca_file'); $ssl_cert_chainfile = validate($_POST['ssl_cert_chainfile'], 'ssl_cert_chainfile'); $default_vhostconf_domain = validate(str_replace("\r\n", "\n", $_POST['default_vhostconf_domain']), 'default_vhostconf_domain', '/^[^\0]*$/'); + $docroot = validate($_POST['docroot'], 'docroot'); if($listen_statement != '1') { @@ -310,6 +322,15 @@ if($page == 'ipsandports' $ssl_cert_chainfile = makeCorrectFile($ssl_cert_chainfile); } + if(strlen(trim($docroot)) > 0) + { + $docroot = makeCorrectDir($docroot); + } + else + { + $docroot = ''; + } + if($result['ip'] != $ip && $result['ip'] == $settings['system']['ipaddress'] && $result_sameipotherport['id'] == '') @@ -338,7 +359,8 @@ if($page == 'ipsandports' `ssl_key_file` = '" . $db->escape($ssl_key_file) . "', `ssl_ca_file` = '" . $db->escape($ssl_ca_file) . "', `ssl_cert_chainfile` = '" . $db->escape($ssl_cert_chainfile) . "', - `default_vhostconf_domain` = '" . $db->escape($default_vhostconf_domain) . "' + `default_vhostconf_domain` = '" . $db->escape($default_vhostconf_domain) . "', + `docroot` = '" . $db->escape($docroot) . "' WHERE `id`='" . (int)$id . "' "); diff --git a/install/froxlor.sql b/install/froxlor.sql index 194aa58c..88a1a1b7 100644 --- a/install/froxlor.sql +++ b/install/froxlor.sql @@ -338,6 +338,7 @@ CREATE TABLE `panel_ipsandports` ( `ssl_ca_file` varchar(255) NOT NULL, `default_vhostconf_domain` text NOT NULL, `ssl_cert_chainfile` varchar(255) NOT NULL, + `docroot` varchar(255) NOT NULL default '', PRIMARY KEY (`id`) ) TYPE=MyISAM ; @@ -461,7 +462,7 @@ INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) V INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (18, 'system', 'vmail_homedir', '/var/customers/mail/'); INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (19, 'system', 'bindconf_directory', '/etc/bind/'); INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (20, 'system', 'bindreload_command', '/etc/init.d/bind9 reload'); -INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (22, 'panel', 'version', '0.9.14-svn4'); +INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (22, 'panel', 'version', '0.9.14-svn5'); INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (23, 'system', 'hostname', 'SERVERNAME'); INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (24, 'login', 'maxloginattempts', '3'); INSERT INTO `panel_settings` (`settingid`, `settinggroup`, `varname`, `value`) VALUES (25, 'login', 'deactivatetime', '900'); diff --git a/install/updates/froxlor/0.9/update_0.9.inc.php b/install/updates/froxlor/0.9/update_0.9.inc.php index a9433db1..55916d2f 100644 --- a/install/updates/froxlor/0.9/update_0.9.inc.php +++ b/install/updates/froxlor/0.9/update_0.9.inc.php @@ -1139,3 +1139,14 @@ if(isFroxlorVersion('0.9.14-svn3')) updateToVersion('0.9.14-svn4'); } + +if(isFroxlorVersion('0.9.14-svn4')) +{ + showUpdateStep("Updating from 0.9.14-svn4 to 0.9.14-svn5", false); + + showUpdateStep("Adding docroot-field to IPs and ports for custom-docroot settings"); + $db->query("ALTER TABLE `".TABLE_PANEL_IPSANDPORTS."` ADD `docroot` varchar(255) NOT NULL default '' AFTER `ssl_cert_chainfile`;"); + lastStepStatus(0); + + updateToVersion('0.9.14-svn5'); +} diff --git a/lib/tables.inc.php b/lib/tables.inc.php index 5628aed8..4b2494de 100644 --- a/lib/tables.inc.php +++ b/lib/tables.inc.php @@ -72,7 +72,7 @@ define('PACKAGE_ENABLED', 2); // VERSION INFO -$version = '0.9.14-svn4'; +$version = '0.9.14-svn5'; $dbversion = '2'; $branding = ''; diff --git a/lng/english.lng.php b/lng/english.lng.php index 834cbc9c..5882599d 100644 --- a/lng/english.lng.php +++ b/lng/english.lng.php @@ -1506,4 +1506,8 @@ $lng['serversettings']['awstats_icons']['description'] = 'e.g. /usr/share/awstat // ADDED IN FROXLOR 0.9.14-svn4 $lng['admin']['ipsandports']['ssl_cert_chainfile'] = 'Path to the SSL CertificateChainFile'; +// ADDED IN FROXLOR 0.9.14-svn5 +$lng['admin']['ipsandports']['docroot']['title'] = 'Custom docroot (empty = point to Froxlor)'; +$lng['admin']['ipsandports']['docroot']['description'] = 'You can define a custom document-root (the destination for a request) for this ip/port combination here.
ATTENTION: Please be careful with what you enter here!'; + ?> diff --git a/lng/german.lng.php b/lng/german.lng.php index 561e9f8c..0655fdd3 100644 --- a/lng/german.lng.php +++ b/lng/german.lng.php @@ -1489,4 +1489,8 @@ $lng['serversettings']['awstats_icons']['description'] = 'z.B. /usr/share/awstat // ADDED IN FROXLOR 0.9.14-svn4 $lng['admin']['ipsandports']['ssl_cert_chainfile'] = 'Pfad zu dem SSL CertificateChainFile'; +// ADDED IN FROXLOR 0.9.14-svn5 +$lng['admin']['ipsandports']['docroot']['title'] = 'Benutzerdefinierter Docroot (leer = zeige auf Froxlor)'; +$lng['admin']['ipsandports']['docroot']['description'] = 'Hier kann ein benutzerdefinierter Document-Root (der Zeilordner für einen Zugriff) für diese IP/Port Kombination gesetzt werden.
ACHTUNG: Bitte überlege vorher, welchen Pfad du hier angibst!'; + ?> diff --git a/scripts/jobs/cron_tasks.inc.http.10.apache.php b/scripts/jobs/cron_tasks.inc.http.10.apache.php index 51c10b4b..2cbe042c 100644 --- a/scripts/jobs/cron_tasks.inc.http.10.apache.php +++ b/scripts/jobs/cron_tasks.inc.http.10.apache.php @@ -189,17 +189,26 @@ class apache { $this->virtualhosts_data[$vhosts_filename].= '' . "\n"; - /** - * add 'real'-vhost content here, like doc-root :) - */ - if($this->settings['system']['froxlordirectlyviahostname']) + if($row_ipsandports['docroot'] == '') { - $mypath = makeCorrectDir(dirname(dirname(dirname(__FILE__)))); + /** + * add 'real'-vhost content here, like doc-root :) + */ + if($this->settings['system']['froxlordirectlyviahostname']) + { + $mypath = makeCorrectDir(dirname(dirname(dirname(__FILE__)))); + } + else + { + $mypath = makeCorrectDir(dirname(dirname(dirname(dirname(__FILE__))))); + } } - else + else { - $mypath = makeCorrectDir(dirname(dirname(dirname(dirname(__FILE__))))); + // user-defined docroot, #417 + $mypath = makeCorrectDir($row_ipsandports['docroot']); } + $this->virtualhosts_data[$vhosts_filename].= 'DocumentRoot "'.$mypath.'"'."\n"; if($row_ipsandports['vhostcontainer_servername_statement'] == '1') @@ -1111,6 +1120,13 @@ class apache // Save one big file $vhosts_file = ''; + // sort by filename so the order is: + // 1. subdomains 20 + // 2. subdomains as main-domains 21 + // 3. main-domains 22 + // #437 + ksort($this->virtualhosts_data); + foreach($this->virtualhosts_data as $vhosts_filename => $vhost_content) { $vhosts_file.= $vhost_content . "\n\n"; diff --git a/scripts/jobs/cron_tasks.inc.http.20.lighttpd.php b/scripts/jobs/cron_tasks.inc.http.20.lighttpd.php index ae94f800..48cc5899 100644 --- a/scripts/jobs/cron_tasks.inc.http.20.lighttpd.php +++ b/scripts/jobs/cron_tasks.inc.http.20.lighttpd.php @@ -107,14 +107,23 @@ class lighttpd $this->lighttpd_data[$vhost_filename].= '# Froxlor default vhost' . "\n"; $this->lighttpd_data[$vhost_filename].= '$HTTP["host"] =~ "^(?:www\.|)' . $myhost . '$" {' . "\n"; - if($this->settings['system']['froxlordirectlyviahostname']) + if($row_ipsandports['docroot'] == '') { - $mypath = makeCorrectDir(dirname(dirname(dirname(__FILE__)))); + if($this->settings['system']['froxlordirectlyviahostname']) + { + $mypath = makeCorrectDir(dirname(dirname(dirname(__FILE__)))); + } + else + { + $mypath = makeCorrectDir(dirname(dirname(dirname(dirname(__FILE__))))); + } } - else + else { - $mypath = makeCorrectDir(dirname(dirname(dirname(dirname(__FILE__))))); + // user-defined docroot, #417 + $mypath = makeCorrectDir($row_ipsandports['docroot']); } + $this->lighttpd_data[$vhost_filename].= ' server.document-root = "'.$mypath.'"'."\n"; /** @@ -855,6 +864,13 @@ class lighttpd // Save one big file $vhosts_file = ''; + // sort by filename so the order is: + // 1. subdomains + // 2. subdomains as main-domains + // 3. main-domains + // #437 + ksort($this->lighttpd_data); + foreach($this->lighttpd_data as $vhosts_filename => $vhost_content) { $vhosts_file.= $vhost_content . "\n\n"; diff --git a/templates/admin/ipsandports/ipsandports_add.tpl b/templates/admin/ipsandports/ipsandports_add.tpl index 1bf4342f..7e9d2c92 100644 --- a/templates/admin/ipsandports/ipsandports_add.tpl +++ b/templates/admin/ipsandports/ipsandports_add.tpl @@ -47,6 +47,10 @@ $header $vhostcontainer + + {$lng['admin']['ipsandports']['docroot']}: + + {$lng['admin']['ownvhostsettings']}:
{$lng['serversettings']['default_vhostconf']['description']}
{$lng['panel']['not_supported']}lighttpd
diff --git a/templates/admin/ipsandports/ipsandports_edit.tpl b/templates/admin/ipsandports/ipsandports_edit.tpl index f944c0eb..a5012d43 100644 --- a/templates/admin/ipsandports/ipsandports_edit.tpl +++ b/templates/admin/ipsandports/ipsandports_edit.tpl @@ -46,6 +46,10 @@ $header {$lng['admin']['ipsandports']['create_vhostcontainer']}: $vhostcontainer + + {$lng['admin']['ipsandports']['docroot']}: + + {$lng['admin']['ownvhostsettings']}:
{$lng['serversettings']['default_vhostconf']['description']}