diff --git a/install/sql/incremental/upd_0045.sql b/install/sql/incremental/upd_0045.sql new file mode 100644 index 0000000000000000000000000000000000000000..3be8b3431ea3101fc77143d56c5c52175dcd021e --- /dev/null +++ b/install/sql/incremental/upd_0045.sql @@ -0,0 +1 @@ +UPDATE `web_domain` SET `redirect_path` = CONCAT(`redirect_path`, '/') WHERE `redirect_path` != '' AND RIGHT(`redirect_path`, 1) != '/' AND (LEFT(`redirect_path`, 7) = 'http://' OR LEFT(`redirect_path`, 8) = 'https://' OR LEFT(`redirect_path`, 11) = '[scheme]://'); diff --git a/install/tpl/debian6_dovecot-sql.conf.master b/install/tpl/debian6_dovecot-sql.conf.master index 7d209fac24325dfbc3a82da84f8121ae6bb376af..1fb6101abc454d1ca782b341d25fbc2313021dd6 100644 --- a/install/tpl/debian6_dovecot-sql.conf.master +++ b/install/tpl/debian6_dovecot-sql.conf.master @@ -13,7 +13,7 @@ driver = mysql connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} default_pass_scheme = CRYPT -password_query = SELECT password FROM mail_user WHERE login = '%u' AND disable%Ls = 'n' +password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. diff --git a/install/tpl/debian_dovecot-sql.conf.master b/install/tpl/debian_dovecot-sql.conf.master index 81874a7a4dcd1b1b24c6a01a39cbde84ee3b4fc7..9c55df358f90f71291c3fdfa13d3d99c976d98af 100644 --- a/install/tpl/debian_dovecot-sql.conf.master +++ b/install/tpl/debian_dovecot-sql.conf.master @@ -120,7 +120,7 @@ driver = mysql connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} default_pass_scheme = CRYPT -password_query = SELECT password FROM mail_user WHERE login = '%u' AND disable%Ls = 'n' +password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. diff --git a/install/tpl/fedora_dovecot-sql.conf.master b/install/tpl/fedora_dovecot-sql.conf.master index 7a5f49176822f2a6fefaaf29a5e1aa34cb01edf2..d7389896ec98c57a70a4025bc5b4f83e58b66b71 100644 --- a/install/tpl/fedora_dovecot-sql.conf.master +++ b/install/tpl/fedora_dovecot-sql.conf.master @@ -133,7 +133,7 @@ driver = mysql connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} default_pass_scheme = CRYPT -password_query = SELECT password FROM mail_user WHERE login = '%u' AND disable%Ls = 'n' +password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. diff --git a/install/tpl/opensuse_dovecot-sql.conf.master b/install/tpl/opensuse_dovecot-sql.conf.master index 26615fe314818715aad8d419f48882f1309e33e2..de652c4fe1db081dec435922bf89f904e2f4c76d 100644 --- a/install/tpl/opensuse_dovecot-sql.conf.master +++ b/install/tpl/opensuse_dovecot-sql.conf.master @@ -133,7 +133,7 @@ driver = mysql connect = host={mysql_server_host} dbname={mysql_server_database} user={mysql_server_ispconfig_user} password={mysql_server_ispconfig_password} default_pass_scheme = CRYPT -password_query = SELECT password FROM mail_user WHERE login = '%u' AND disable%Ls = 'n' +password_query = SELECT password FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' user_query = SELECT email as user, maildir as home, CONCAT('maildir:', maildir, '/Maildir') as mail, uid, gid, CONCAT('*:storage=', quota, 'B') AS quota_rule, CONCAT(maildir, '/.sieve') as sieve FROM mail_user WHERE (login = '%u' OR email = '%u') AND disable%Ls = 'n' # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index c057ef8623e54d9179d16ff62ee889faa327fb25..fdaab8e86cf06d558a2ddd407dfdbfe2a4e901f0 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -5,12 +5,13 @@ dnsserver=mydns [server] -auto_network_configuration=n -ip_address=0.0.0.0 -netmask=255.255.255.0 -gateway=0.0.0.0 -hostname=server1.domain.tld -nameservers=8.8.8.8,8.8.4.4 +auto_network_configuration=n +ip_address=0.0.0.0 +netmask=255.255.255.0 +v6_prefix= +gateway=0.0.0.0 +hostname=server1.domain.tld +nameservers=8.8.8.8,8.8.4.4 firewall=bastille loglevel=2 backup_dir=/var/backup @@ -40,12 +41,13 @@ getmail_config_dir=/etc/getmail [web] server_type=apache website_basedir=/var/www -website_path=/var/www/clients/client[client_id]/web[website_id] -website_symlinks=/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/ -website_symlinks_rel=n -vhost_conf_dir=/etc/apache2/sites-available -vhost_conf_enabled_dir=/etc/apache2/sites-enabled -nginx_vhost_conf_dir=/etc/nginx/sites-available +website_path=/var/www/clients/client[client_id]/web[website_id] +website_symlinks=/var/www/[website_domain]/:/var/www/clients/client[client_id]/[website_domain]/ +website_symlinks_rel=n +vhost_rewrite_v6=n +vhost_conf_dir=/etc/apache2/sites-available +vhost_conf_enabled_dir=/etc/apache2/sites-enabled +nginx_vhost_conf_dir=/etc/nginx/sites-available nginx_vhost_conf_enabled_dir=/etc/nginx/sites-enabled security_level=20 user=www-data diff --git a/interface/lib/classes/listform.inc.php b/interface/lib/classes/listform.inc.php index 6128022acd4689bbf2c1c93c0c018c9aeae79fb3..e690a1ca7d9c48be602bad3a49462d006aed097d 100644 --- a/interface/lib/classes/listform.inc.php +++ b/interface/lib/classes/listform.inc.php @@ -243,21 +243,65 @@ class listform { public function getPagingHTML($vars) { global $app; - $content = '' - .'   '; + + // we want to show at max 17 page numbers (8 left, current, 8 right) + $show_pages_count = 17; + + $show_pages = array(0); // first page + if($vars['pages'] > 0) $show_pages[] = $vars['pages']; // last page + for($p = $vars['page'] - 2; $p <= $vars['page'] + 2; $p++) { // surrounding pages + if($p > 0 && $p < $vars['pages']) $show_pages[] = $p; + } + + $l_start = $vars['page'] - 13; + $l_start -= ($l_start % 10) + 1; + $h_end = $vars['page'] + 23; + $h_end -= ($h_end % 10) + 1; + for($p = $l_start; $p <= $h_end; $p += 10) { // surrounding pages + if($p > 0 && $p < $vars['pages'] && !in_array($p, $show_pages, true) && count($show_pages) < $show_pages_count) $show_pages[] = $p; + } + + $l_start = $vars['page'] - 503; + $l_start -= ($l_start % 100) + 1; + $h_end = $vars['page'] + 603; + $h_end -= ($h_end % 100) + 1; + for($p = $l_start; $p <= $h_end; $p += 100) { // surrounding pages + if($p > 0 && $p < $vars['pages'] && !in_array($p, $show_pages, true) && count($show_pages) < $show_pages_count) $show_pages[] = $p; + } + + $l_start = $vars['page'] - 203; + $l_start -= ($l_start % 25) + 1; + $h_end = $vars['page'] + 228; + $h_end -= ($h_end % 25) + 1; + for($p = $l_start; $p <= $h_end; $p += 25) { // surrounding pages + if($p > 0 && $p < $vars['pages'] && abs($p - $vars['page']) > 30 && !in_array($p, $show_pages, true) && count($show_pages) < $show_pages_count) $show_pages[] = $p; + } + + sort($show_pages); + $show_pages = array_unique($show_pages); + //* Show Back if(isset($vars['show_page_back']) && $vars['show_page_back'] == 1){ - $content .= '' + $content = '' + .'   '; + $content .= '' .'   '; } - $content .= ' '.$this->lng('page_txt').' '.$vars['next_page'].' '.$this->lng('page_of_txt').' '.$vars['max_pages'].'   '; + $content .= ' '.$this->lng('page_txt').' '; + $prev = -1; + foreach($show_pages as $p) { + if($prev != -1 && $p > $prev + 1) $content .= '...'; + $content .= ''. ($p+1) .''; + $prev = $p; + } + //.$vars['next_page'].' '.$this->lng('page_of_txt').' '.$vars['max_pages'].'   '; //* Show Next if(isset($vars['show_page_next']) && $vars['show_page_next'] == 1){ - $content .= '' + $content .= '' .'   '; - } - $content .= '' + $content .= '' .''; + } return $content; } diff --git a/interface/lib/classes/tform.inc.php b/interface/lib/classes/tform.inc.php index 66615d0eac14fb10c86f37eb664309d60b9e5913..b0b727ca28562251f45af4c3e089fc888b7dc63e 100644 --- a/interface/lib/classes/tform.inc.php +++ b/interface/lib/classes/tform.inc.php @@ -884,12 +884,43 @@ class tform { $this->errorMessage .= $this->wordbook[$errmsg]."
\r\n"; } else { $this->errorMessage .= $errmsg."
\r\n"; - } - } - break; - case 'ISIPV4': - $vip=1; - if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $field_value)){ + } + } + break; + case 'ISV6PREFIX': + $v6_prefix_ok = 0; + $explode_field_value = explode(':',$field_value); + if ($explode_field_value[count($explode_field_value)-1]=='' && $explode_field_value[count($explode_field_value)-2]=='' ){ + if ( count($explode_field_value) <= 9 ) { + if(filter_var(substr($field_value,0,strlen($field_value)-2),FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) or filter_var(substr($field_value,0,strlen($field_value)-2).'::0',FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) or filter_var(substr($field_value,0,strlen($field_value)-2).':0',FILTER_VALIDATE_IP,FILTER_FLAG_IPV6) ) { + $v6_prefix_ok = 1; + } + } + } else { + $v6_prefix_ok = 2; + } + // check subnet against defined server-ipv6 + $sql_v6 = $app->db->queryOneRecord("SELECT ip_address FROM server_ip WHERE ip_type = 'IPv6' AND virtualhost = 'y' LIMIT 0,1"); + $sql_v6_explode=explode(':',$sql_v6['ip_address']); + if ( count($sql_v6_explode) < count($explode_field_value) && isset($sql_v6['ip_address']) ) { + $v6_prefix_ok = 3; + } + if($v6_prefix_ok == 0) { + $errmsg = $validator['errmsg']; + } + if($v6_prefix_ok == 2) { + $errmsg = 'IPv6 Prefix must end with ::'; + } + if($v6_prefix_ok == 3) { + $errmsg = 'IPv6 Prefix too long (according to Server IP Addresses)'; + } + if($v6_prefix_ok <> 1){ + $this->errorMessage .= $errmsg."
\r\n"; + } + break; + case 'ISIPV4': + $vip=1; + if(preg_match("/^[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}(\.)[0-9]{1,3}$/", $field_value)){ $groups=explode(".",$field_value); foreach($groups as $group){ if($group<0 OR $group>255) diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 360c1ba5c800ce91ed9bffa24d7ff3fb9f2d8fef..1e5b06e25687ea53d8176674c05b288274cbb281 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -83,12 +83,20 @@ $form["tabs"]['server'] = array( 'errmsg' => 'netmask_error_wrong'), ), 'value' => '', - 'width' => '15', - 'maxlength' => '255' - ), - 'gateway' => array( - 'datatype' => 'VARCHAR', - 'formtype' => 'TEXT', + 'width' => '15', + 'maxlength' => '255' + ), + 'v6_prefix' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array(0 => array('type' => 'ISV6PREFIX', + 'errmsg' => 'v6_prefix_wrong'), + ), + 'default' => '' + ), + 'gateway' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', 'default' => '192.168.0.1', 'validators' => array(0 => array('type' => 'ISIPV4', 'errmsg' => 'gateway_error_wrong'), @@ -402,12 +410,22 @@ $form["tabs"]['web'] = array( 'formtype' => 'TEXT', 'default' => '', 'value' => '', - 'width' => '40', - 'maxlength' => '255' - ), - 'vhost_conf_dir' => array( - 'datatype' => 'VARCHAR', - 'formtype' => 'TEXT', + 'width' => '40', + 'maxlength' => '255' + ), + +'vhost_rewrite_v6' => array ( +'datatype' => 'VARCHAR', +'formtype' => 'CHECKBOX', +'default' => 'n', +'value' => array(0 => 'n',1 => 'y') +), + + + + 'vhost_conf_dir' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', 'default' => '', 'validators' => array(0 => array('type' => 'NOTEMPTY', 'errmsg' => 'vhost_conf_dir_error_empty'), diff --git a/interface/web/admin/lib/lang/de_system_config.lng b/interface/web/admin/lib/lang/de_system_config.lng index 0eff4a1712df4071b47ceb4bcf4e5f96d2d98303..e9c854bf27873bc9c461454c90d23f499598cb50 100644 --- a/interface/web/admin/lib/lang/de_system_config.lng +++ b/interface/web/admin/lib/lang/de_system_config.lng @@ -24,8 +24,8 @@ $wb['dashboard_atom_url_reseller_txt'] = 'Dashboard atom feed URL (für Reseller $wb['dashboard_atom_url_client_txt'] = 'Dashboard atom feed URL (für Kunden)'; $wb['webdavuser_prefix_txt'] = 'WebDAV Benutzer Präfix'; $wb['webdavuser_prefix_error_regex'] = 'Zeichen nicht zulässig im WebDAV Benutzer Präfix.'; -$wb['use_domain_module_txt'] = 'Das Domain Modul benutzen, um neue Domains hinzuzufügen'; -$wb['use_domain_module_hint'] = 'Falls Sie dieses Modul benutzen, können Ihre Kunden nur eine der Domains auswählen, die der Admin für sie angelegt hat. Die Kunden können das Domain-Feld nicht frei editieren. Sie müssen sich neu einloggen, wenn Sie diesen Wert ändern.'; +$wb['use_domain_module_txt'] = 'Domain Limits im Kundenmodul benutzen, um neue Domains hinzuzufügen'; +$wb['use_domain_module_hint'] = 'Falls Sie die Domain Limits benutzen, können Ihre Kunden nur eine der Domains auswählen, die der Admin für sie angelegt hat. Die Kunden können das Domain-Feld nicht frei editieren. Sie müssen sich neu einloggen, wenn Sie diesen Wert ändern.'; $wb['new_domain_txt'] = 'HTML Text zum Anlegen einer neuen Domain'; $wb['webftp_url_txt'] = 'WebFTP URL'; $wb['enable_custom_login_txt'] = 'Abweichenden Login Namen erlauben'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index e6e6336c463a65a8b552e79f2edc718a6fa0c236..dbaf39e16ecb63bd8eda2c9f89ae776dd2dd95c8 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -167,7 +167,10 @@ $wb["awstats_settings_txt"] = 'AWStats Settings'; $wb["firewall_txt"] = 'Firewall'; $wb["mailbox_quota_stats_txt"] = 'Mailbox quota statistics'; $wb["enable_ip_wildcard_txt"] = 'Enable IP wildcard (*)'; -$wb["web_folder_protection_txt"] = 'Make web folders immutable (extended attributes)'; -$wb["overtraffic_notify_admin_txt"] = 'Send overtraffic notification to admin'; -$wb["overtraffic_notify_client_txt"] = 'Send overtraffic notification to client'; -?> \ No newline at end of file +$wb["web_folder_protection_txt"] = 'Make web folders immutable (extended attributes)'; +$wb["overtraffic_notify_admin_txt"] = 'Send overtraffic notification to admin'; +$wb["overtraffic_notify_client_txt"] = 'Send overtraffic notification to client'; +$wb["v6_prefix_txt"] = 'IPv6 Prefix'; +$wb["vhost_rewrite_v6_txt"] = 'Rewrite IPv6 on Mirror'; +$wb["v6_prefix_wrong"] = 'Invalid v6 Netmask format.'; +?> diff --git a/interface/web/admin/lib/lang/en_system_config.lng b/interface/web/admin/lib/lang/en_system_config.lng index 15dbe86866f69e878c14fd991e5637c880623d57..6957bc5c3860dd9b890262de06943046feb75245 100644 --- a/interface/web/admin/lib/lang/en_system_config.lng +++ b/interface/web/admin/lib/lang/en_system_config.lng @@ -27,8 +27,8 @@ $wb["webmail_url_txt"] = 'Webmail URL'; $wb["mailmailinglist_link_txt"] = 'Link to mailing list in Mailing list list'; $wb["mailmailinglist_url_txt"] = 'Mailing list URL'; $wb["phpmyadmin_url_txt"] = 'PHPMyAdmin URL'; -$wb["use_domain_module_txt"] = 'Use the domain-module to add new domains'; -$wb["use_domain_module_hint"] = 'If you use this module, your customers can only select one of the domains the admin creates for them. They cannot freely edit the domain-field. You have to re-login after changing this value, to make the changes visible.'; +$wb["use_domain_module_txt"] = 'Use the domain limits in client module to add new domains'; +$wb["use_domain_module_hint"] = 'If you use the domain limits, your customers can only select one of the domains the admin creates for them. They cannot freely edit the domain-field. You have to re-login after changing this value, to make the changes visible.'; $wb["new_domain_txt"] = 'HTML to create a new domain'; $wb["webftp_url_txt"] = 'WebFTP URL'; $wb['admin_mail_txt'] = 'Administrator\'s e-mail'; diff --git a/interface/web/admin/templates/server_config_server_edit.htm b/interface/web/admin/templates/server_config_server_edit.htm index 54fba4943d573ae9d472b22903dba618fbd3ca02..40c4051bb6bce303ea87eadfa86e8bf0ad349c02 100644 --- a/interface/web/admin/templates/server_config_server_edit.htm +++ b/interface/web/admin/templates/server_config_server_edit.htm @@ -16,12 +16,16 @@
- - -
-
- - + + +
+
+ + +
+
+ +
@@ -61,7 +65,7 @@
-
-
- - \ No newline at end of file + + + + diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index c1c9e6e884fe1fcf6f3ca0d6f5a2e051703c1686..7211f8d68a778fee67e129ca3a79afc070615956 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -32,12 +32,18 @@
- -  {tmpl_var name='website_autoalias_note_txt'} [client_id], [client_username], [website_id], [website_domain] -
-
- - + +  {tmpl_var name='website_autoalias_note_txt'} [client_id], [client_username], [website_id], [website_domain] +
+
+ +
+ {tmpl_var name='vhost_rewrite_v6'} +
+
+
+ +
@@ -250,7 +256,7 @@ jQuery('.apache').hide(); } else { jQuery('.nginx').hide(); - jQuery('.apache').show(); - } - } - \ No newline at end of file + jQuery('.apache').show(); + } + } + diff --git a/interface/web/sites/web_vhost_subdomain_edit.php b/interface/web/sites/web_vhost_subdomain_edit.php index 9089befd23182ce155e32a03a99f0e3f804258aa..6094baa67b1a505a0407bd1126342b80546f4108 100644 --- a/interface/web/sites/web_vhost_subdomain_edit.php +++ b/interface/web/sites/web_vhost_subdomain_edit.php @@ -369,6 +369,8 @@ class page_action extends tform_actions { $this->dataRecord['web_folder'] = strtolower($this->dataRecord['web_folder']); + if(substr($this->dataRecord['web_folder'], 0, 1) === '/') $this->dataRecord['web_folder'] = substr($this->dataRecord['web_folder'], 1); + if(substr($this->dataRecord['web_folder'], -1) === '/') $this->dataRecord['web_folder'] = substr($this->dataRecord['web_folder'], 0, -1); $forbidden_folders = array('', 'cgi-bin', 'log', 'private', 'ssl', 'tmp', 'webdav'); $check_folder = strtolower($this->dataRecord['web_folder']); if(substr($check_folder, 0, 1) === '/') $check_folder = substr($check_folder, 1); // strip / at beginning to check against forbidden entries @@ -377,10 +379,12 @@ class page_action extends tform_actions { $app->tform->errorMessage .= $app->tform->lng("web_folder_invalid_txt")."
"; } // check for duplicate folder usage + /* $check = $app->db->queryOneRecord("SELECT COUNT(*) as `cnt` FROM `web_domain` WHERE `type` = 'vhostsubdomain' AND `parent_domain_id` = '" . $app->functions->intval($this->dataRecord['parent_domain_id']) . "' AND `web_folder` = '" . $app->db->quote($this->dataRecord['web_folder']) . "' AND `domain_id` != '" . $app->functions->intval($this->id) . "'"); if($check && $check['cnt'] > 0) { $app->tform->errorMessage .= $app->tform->lng("web_folder_unique_txt")."
"; } + */ } else { $this->dataRecord["domain"] = $this->dataRecord["domain"].'.'.$parent_domain["domain"]; } diff --git a/interface/web/themes/default/css/styles.css b/interface/web/themes/default/css/styles.css index 96815d0d53ce1346a840001814d2b9fc97f74e58..913c33cc0713e3c2f0d52388f2280a70722f8b4c 100644 --- a/interface/web/themes/default/css/styles.css +++ b/interface/web/themes/default/css/styles.css @@ -1787,4 +1787,31 @@ ul.ui-autocomplete { max-height: 250px; overflow-y: auto; min-width: 65px;} .ui-combobox-toggle { position: absolute !important; top: 0; bottom: 0; margin-left: -1px; padding: 1px !important; background: none repeat scroll 0 0 #FFFFFF !important; border: 1px solid #DFDFDF !important;} .ui-combobox-input { background: none repeat scroll 0 0 #FFFFFF !important; border: 1px solid #DFDFDF !important; padding: 1px; font-weight: normal !important; } .panel_install_package .ui-combobox { float: left; } -.clear-float { clear: both; } \ No newline at end of file +.clear-float { clear: both; } + +a.link-page, span.page-spacer { + display: inline-block; + text-align: center; + padding: 2px; + line-height: 16px; + text-decoration: none !important; + color: inherit !important; + min-width: 16px; +} +a.link-page { + border: 1px solid #FFFFFF; + margin: 0 5px; +} + +a.link-page:hover { + background-color: #DFDFDF; +} + +span.page-spacer { + margin: 0 -5px; +} + +a.link-page.current-page { + background-color: #DFDFDF; + font-weight: bold; +} \ No newline at end of file diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 8e6cb40fc28744b0187e57e1d7e76b9818f0f3df..d7c03d02e034a72974adece19a3d1cc6d3c8e848 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -266,7 +266,7 @@ RewriteCond %{REQUEST_URI} !^/webdav/ RewriteCond %{REQUEST_URI} !^ - RewriteRule ^/(.*)$ $1 + RewriteRule ^/(.*)$ $1 diff --git a/server/cron_daily.sh b/server/cron_daily.sh index 19189076f575ceb629032db0cb794eb929a6a643..9ffedae9ed2953b63b2786f3d7add82c6b4a12de 100644 --- a/server/cron_daily.sh +++ b/server/cron_daily.sh @@ -11,9 +11,6 @@ fi /usr/bin/php -q /usr/local/ispconfig/server/cron_daily.php -if [ -f /usr/local/ispconfig/interface/web/billing/cron/create_recurring_invoices_cron.php ]; then - /usr/bin/php -q /usr/local/ispconfig/interface/web/billing/cron/create_recurring_invoices_cron.php -fi -if [ -f /usr/local/ispconfig/interface/web/billing/cron/recurring_items_reminders.php ]; then - /usr/bin/php -q /usr/local/ispconfig/interface/web/billing/cron/recurring_items_reminders.php +if [ -f /usr/local/ispconfig/server/cron_daily_billing.sh ]; then + /usr/local/ispconfig/server/cron_daily_billing.sh fi diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index ca8a88c975a5feacbdb430883a2ac115da7755b8..92c3708a873aedeac9f4bdf2c0fb02d53b1a3d8d 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -888,26 +888,30 @@ class apache2_plugin { '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')); } } @@ -983,19 +987,22 @@ class apache2_plugin { '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)); @@ -1004,7 +1011,8 @@ class apache2_plugin { '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')); } } } @@ -1266,14 +1274,25 @@ class apache2_plugin { } else { $vhosts[] = array('ip_address' => $data['new']['ip_address'], 'ssl_enabled' => 1, 'port' => '443'); } - $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 { + $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); + } + } + 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); } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index fddfd54e49632755b58d853d3a468fbe92c9f9d4..60a1e557a90e332902686ee1eb053e4781add060 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -833,7 +833,21 @@ class nginx_plugin { $vhost_data['web_basedir'] = $web_config['website_basedir']; // IPv6 - if($data['new']['ipv6_address'] != '') $tpl->setVar('ipv6_enabled', 1); + if($data['new']['ipv6_address'] != ''){ + $tpl->setVar('ipv6_enabled', 1); + 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); + $vhost_data['ipv6_address'] = $data['new']['ipv6_address']; + } + } + } // PHP-FPM // Support for multiple PHP versions @@ -1619,8 +1633,63 @@ class nginx_plugin { 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 diff --git a/server/server.sh b/server/server.sh index c6f9611c1b107e24561731320c84d64eea3d47f1..75253e7890b5896f4e27a8471e2a0bdf2f5bc5fc 100755 --- a/server/server.sh +++ b/server/server.sh @@ -4,6 +4,8 @@ PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin . /etc/profile +umask 022 + if [ -f /usr/local/ispconfig/server/lib/php.ini ]; then PHPINIOWNER=`stat -c %U /usr/local/ispconfig/server/lib/php.ini` if [ $PHPINIOWNER == 'root' ] || [ $PHPINIOWNER == 'ispconfig' ]; then