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 @@