From 6d6e2b813a275cce2d945f82e599a4848cca87e5 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Tue, 8 Jan 2019 15:18:25 +0100 Subject: [PATCH 0001/1368] Update interface/web/sites/database_edit.php --- interface/web/sites/database_edit.php | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/interface/web/sites/database_edit.php b/interface/web/sites/database_edit.php index 71e5acaf27..22f3302c6c 100644 --- a/interface/web/sites/database_edit.php +++ b/interface/web/sites/database_edit.php @@ -152,6 +152,12 @@ class page_action extends tform_actions { $app->tpl->setVar("database_name_prefix", $app->tools_sites->getPrefix($this->dataRecord['database_name_prefix'], $dbname_prefix, $global_config['dbname_prefix']), true); } + if($global_config['disable_client_remote_dbserver'] == 'y' && $_SESSION["s"]["user"]["typ"] != 'admin') { + $app->tpl->setVar("disable_remote_db", 1); + } else { + $app->tpl->setVar("disable_remote_db", 0); + } + if($this->id > 0) { //* we are editing a existing record $edit_disabled = @($_SESSION["s"]["user"]["typ"] == 'admin')? 0 : 1; //* admin can change the database-name @@ -351,9 +357,14 @@ class page_action extends tform_actions { if($tmp['server_id'] && $tmp['server_id'] != $this->dataRecord['server_id']) { // we need remote access rights for this server, so get it's ip address $server_config = $app->getconf->get_server_config($tmp['server_id'], 'server'); + + // Add default remote_ips from Main Configuration. + $remote_ips = explode(",", $global_config['default_remote_dbserver']); + if (!in_array($server_config['ip_address'], $default_remote_db)) { $remote_ips[] = $server_config['ip_address']; } + if($server_config['ip_address']!='') { if($this->dataRecord['remote_access'] != 'y'){ - $this->dataRecord['remote_ips'] = $server_config['ip_address']; + $this->dataRecord['remote_ips'] = implode(',', $remote_ips); $this->dataRecord['remote_access'] = 'y'; } else { if($this->dataRecord['remote_ips'] != ''){ @@ -361,6 +372,7 @@ class page_action extends tform_actions { $this->dataRecord['remote_ips'] .= ',' . $server_config['ip_address']; } $tmp = preg_split('/\s*,\s*/', $this->dataRecord['remote_ips']); + $tmp = array_merge($tmp, $remote_ips); $tmp = array_unique($tmp); $this->dataRecord['remote_ips'] = implode(',', $tmp); unset($tmp); @@ -430,9 +442,14 @@ class page_action extends tform_actions { if($tmp['server_id'] && $tmp['server_id'] != $this->dataRecord['server_id']) { // we need remote access rights for this server, so get it's ip address $server_config = $app->getconf->get_server_config($tmp['server_id'], 'server'); + + // Add default remote_ips from Main Configuration. + $remote_ips = explode(",", $global_config['default_remote_dbserver']); + if (!in_array($server_config['ip_address'], $default_remote_db)) { $remote_ips[] = $server_config['ip_address']; } + if($server_config['ip_address']!='') { if($this->dataRecord['remote_access'] != 'y'){ - $this->dataRecord['remote_ips'] = $server_config['ip_address']; + $this->dataRecord['remote_ips'] = implode(',', $remote_ips); $this->dataRecord['remote_access'] = 'y'; } else { if($this->dataRecord['remote_ips'] != ''){ @@ -440,6 +457,7 @@ class page_action extends tform_actions { $this->dataRecord['remote_ips'] .= ',' . $server_config['ip_address']; } $tmp = preg_split('/\s*,\s*/', $this->dataRecord['remote_ips']); + $tmp = array_merge($tmp, $remote_ips); $tmp = array_unique($tmp); $this->dataRecord['remote_ips'] = implode(',', $tmp); unset($tmp); -- GitLab From 15506bef8018548c7da59a599db9d67416121c67 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Tue, 8 Jan 2019 15:19:23 +0100 Subject: [PATCH 0002/1368] Update interface/web/sites/templates/database_edit.htm --- interface/web/sites/templates/database_edit.htm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/sites/templates/database_edit.htm b/interface/web/sites/templates/database_edit.htm index 290ae30a96..0d5be00130 100644 --- a/interface/web/sites/templates/database_edit.htm +++ b/interface/web/sites/templates/database_edit.htm @@ -97,6 +97,7 @@ +
@@ -106,6 +107,7 @@
+
-- GitLab From fefa02d353b7aca12cebe7f245588a4d1c336991 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Tue, 8 Jan 2019 15:33:54 +0100 Subject: [PATCH 0003/1368] Update interface/web/admin/lib/lang/en_system_config.lng, interface/web/admin/lib/lang/it_system_config.lng, interface/web/admin/templates/system_config_sites_edit.htm, interface/web/admin/form/system_config.tform.php files --- .../web/admin/form/system_config.tform.php | 21 ++++++++++++++++++- .../web/admin/lib/lang/en_system_config.lng | 2 ++ .../web/admin/lib/lang/it_system_config.lng | 2 ++ .../templates/system_config_sites_edit.htm | 13 +++++++++++- 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index 449805f3c1..fb2f1f7264 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -200,6 +200,25 @@ $form["tabs"]['sites'] = array ( 'value' => '', 'name' => 'default_dbserver' ), + 'disable_client_remote_dbserver' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), + 'default_remote_dbserver' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_database', + 'function' => 'valid_ip_list', + 'errmsg' => 'database_remote_error_ips'), + ), + 'default' => '', + 'value' => '', + 'width' => '60', + 'searchable' => 2 + ), //################################# // ENDE Datatable fields //################################# @@ -731,4 +750,4 @@ $form["tabs"]['misc'] = array ( ); -?> +?> \ No newline at end of file diff --git a/interface/web/admin/lib/lang/en_system_config.lng b/interface/web/admin/lib/lang/en_system_config.lng index 38f178f9f5..1a7d18b9e7 100644 --- a/interface/web/admin/lib/lang/en_system_config.lng +++ b/interface/web/admin/lib/lang/en_system_config.lng @@ -84,4 +84,6 @@ $wb["reseller_can_use_options_txt"] = "Reseller can use the option-tab for websi $wb["custom_login_text_txt"] = "Custom Text on Login-Page"; $wb["custom_login_link_txt"] = "Custom Link on Login-Page"; $wb["login_link_error_regex"] = "Invalid Link for Custom Login"; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; ?> diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index 396503f02e..bc72844ed8 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -81,4 +81,6 @@ $wb['reseller_can_use_options_txt'] = 'Reseller can use the option-tab for websi $wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; $wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; $wb['login_link_error_regex'] = 'Invalid Link for Custom Login'; +$wb["default_remote_dbserver_txt"] = "DB remoti predefiniti"; +$wb["disable_client_remote_dbserver_txt"] = "Disabilita la configurazione dei DB Remoti per i clienti"; ?> diff --git a/interface/web/admin/templates/system_config_sites_edit.htm b/interface/web/admin/templates/system_config_sites_edit.htm index 1c4c5c6f9a..8ab35989ff 100644 --- a/interface/web/admin/templates/system_config_sites_edit.htm +++ b/interface/web/admin/templates/system_config_sites_edit.htm @@ -75,7 +75,18 @@ {tmpl_var name='default_dbserver'}
- +
+ +
+ {tmpl_var name='disable_client_remote_dbserver'} +
+
+
+ +
+
+ +
-- GitLab From 0c0dd4652bee894003806692b1a2c3529ed78154 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Tue, 8 Jan 2019 15:35:07 +0100 Subject: [PATCH 0004/1368] Show DNS Slave Zone menu only if enabled by limits. --- interface/web/dns/lib/module.conf.php | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/interface/web/dns/lib/module.conf.php b/interface/web/dns/lib/module.conf.php index 75b17a98e8..4e4c645470 100644 --- a/interface/web/dns/lib/module.conf.php +++ b/interface/web/dns/lib/module.conf.php @@ -1,5 +1,7 @@ auth->get_user_id(); + $module["name"] = "dns"; $module["title"] = "top_menu_dns"; $module["template"] = "module.tpl.htm"; @@ -56,19 +58,23 @@ $module["nav"][] = array( 'title' => 'DNS', unset($items); -$items[] = array( 'title' => "Secondary Zones", - 'target' => 'content', - 'link' => 'dns/dns_slave_list.php', - 'html_id' => 'dns_slave_list'); - -$module["nav"][] = array( 'title' => 'Secondary DNS', - 'open' => 1, - 'items' => $items); +if($app->auth->get_client_limit($userid, 'dns_slave_zone') != 0) +{ + $items[] = array( 'title' => "Secondary Zones", + 'target' => 'content', + 'link' => 'dns/dns_slave_list.php', + 'html_id' => 'dns_slave_list'); + + $module["nav"][] = array( 'title' => 'Secondary DNS', + 'open' => 1, + 'items' => $items); + + unset($items); +} -unset($items); -?> +?> \ No newline at end of file -- GitLab From 9e6a611833d3b807f363817225f26152164c7be6 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 27 Feb 2019 10:03:22 +0100 Subject: [PATCH 0005/1368] WIP add CI test to install ispconfig in a clean container --- .gitlab-ci.yml | 16 ++++++++++++++++ helper_scripts/test_install_docker.sh | 21 +++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100755 helper_scripts/test_install_docker.sh diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 736fbc3083..a81b3b5aa6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ # Defines stages which are to be executed stages: - syntax + - test # ### Stage syntax @@ -13,6 +14,7 @@ syntax:lint: only: - schedules - web + - merge_requests script: - composer require overtrue/phplint @@ -20,3 +22,17 @@ syntax:lint: - echo "For more information http://www.icosaedro.it/phplint/" - vendor/bin/phplint + +test:install: + stage: test + image: jerob/docker-ispconfig + only: + - schedules + - web + - merge_requests + script: + - $CI_PROJECT_DIR/helper_scripts/test_install_docker.sh + - apt-get update + - apt-get --yes install curl + - curl --insecure https://127.0.0.1:8080/login/ + - ps xaf diff --git a/helper_scripts/test_install_docker.sh b/helper_scripts/test_install_docker.sh new file mode 100755 index 0000000000..4de61c3895 --- /dev/null +++ b/helper_scripts/test_install_docker.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# This script is used from .gitlab-ci.yml to do an automated installation inside a docker container for testing. + +if [ -f /usr/local/ispconfig/interface/lib/config.inc.php ]; then + echo "Found an existing configfile, bailing out!" + exit 1 +fi + +mysql_install_db +service mysql start \ +&& echo "UPDATE mysql.user SET Password = PASSWORD('pass') WHERE User = 'root';" | mysql -u root \ +&& echo "UPDATE mysql.user SET plugin='mysql_native_password' where user='root';" | mysql -u root \ +&& echo "DELETE FROM mysql.user WHERE User='';" | mysql -u root \ +&& echo "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');" | mysql -u root \ +&& echo "DROP DATABASE IF EXISTS test;" | mysql -u root \ +&& echo "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';" | mysql -u root \ +&& echo "FLUSH PRIVILEGES;" | mysql -u root +sed -i "s/^hostname=server1.example.com$/hostname=$HOSTNAME/g" /root/ispconfig3_install/install/autoinstall.ini + +service mysql start && php -q $CI_PROJECT_DIR/install/install.php --autoinstall=/root/ispconfig3_install/install/autoinstall.ini -- GitLab From eac89bb002ac68ae832cd0642e4f5c882709dcaf Mon Sep 17 00:00:00 2001 From: Jason Townsend Date: Sat, 23 Nov 2019 17:15:28 +0000 Subject: [PATCH 0006/1368] Added proxy protocol feature: Added Global Setting to Server config tab to - Enable & Disable the feature - Set the Proxy HTTP & HTTPS Ports Added Per site level switch to enable and disable feature (Located in the Web Tab under the advanced section) Added Apache2 and Nginx vhost updates to enable proxy_protocol on the listen lines Added New database column to web_domain called "proxy_protocol" to enable site level config (Patch file Added upd_0089.sql) Updated the Base Table SQL file to include "proxy_protocol" field --- install/sql/incremental/upd_0089.sql | 6 +++++ install/sql/ispconfig3.sql | 1 + .../web/admin/form/server_config.tform.php | 22 +++++++++++++++++++ .../web/admin/lib/lang/ar_server_config.lng | 3 +++ .../web/admin/lib/lang/bg_server_config.lng | 3 +++ .../web/admin/lib/lang/br_server_config.lng | 3 +++ .../web/admin/lib/lang/ca_server_config.lng | 3 +++ .../web/admin/lib/lang/cz_server_config.lng | 3 +++ .../web/admin/lib/lang/de_server_config.lng | 3 +++ .../web/admin/lib/lang/dk_server_config.lng | 3 +++ .../web/admin/lib/lang/el_server_config.lng | 3 +++ .../web/admin/lib/lang/es_server_config.lng | 3 +++ .../web/admin/lib/lang/fi_server_config.lng | 3 +++ .../web/admin/lib/lang/fr_server_config.lng | 3 +++ .../web/admin/lib/lang/hr_server_config.lng | 3 +++ .../web/admin/lib/lang/hu_server_config.lng | 3 +++ .../web/admin/lib/lang/id_server_config.lng | 3 +++ .../web/admin/lib/lang/it_server_config.lng | 3 +++ .../web/admin/lib/lang/ja_server_config.lng | 3 +++ .../web/admin/lib/lang/nl_server_config.lng | 3 +++ .../web/admin/lib/lang/pl_server_config.lng | 3 +++ .../web/admin/lib/lang/pt_server_config.lng | 3 +++ .../web/admin/lib/lang/ro_server_config.lng | 3 +++ .../web/admin/lib/lang/ru_server_config.lng | 3 +++ .../web/admin/lib/lang/se_server_config.lng | 3 +++ .../web/admin/lib/lang/sk_server_config.lng | 3 +++ .../web/admin/lib/lang/tr_server_config.lng | 3 +++ .../templates/server_config_web_edit.htm | 14 ++++++++++++ .../web/sites/form/web_vhost_domain.tform.php | 6 +++++ .../sites/lib/lang/ar_web_vhost_domain.lng | 1 + .../sites/lib/lang/bg_web_vhost_domain.lng | 1 + .../sites/lib/lang/br_web_vhost_domain.lng | 1 + .../sites/lib/lang/ca_web_vhost_domain.lng | 1 + .../sites/lib/lang/cz_web_vhost_domain.lng | 1 + .../sites/lib/lang/de_web_vhost_domain.lng | 1 + .../sites/lib/lang/dk_web_vhost_domain.lng | 1 + .../sites/lib/lang/el_web_vhost_domain.lng | 1 + .../sites/lib/lang/en_web_vhost_domain.lng | 1 + .../sites/lib/lang/es_web_vhost_domain.lng | 1 + .../sites/lib/lang/fi_web_vhost_domain.lng | 1 + .../sites/lib/lang/fr_web_vhost_domain.lng | 1 + .../sites/lib/lang/hr_web_vhost_domain.lng | 1 + .../sites/lib/lang/hu_web_vhost_domain.lng | 1 + .../sites/lib/lang/id_web_vhost_domain.lng | 1 + .../sites/lib/lang/it_web_vhost_domain.lng | 1 + .../sites/lib/lang/ja_web_vhost_domain.lng | 1 + .../sites/lib/lang/nl_web_vhost_domain.lng | 1 + .../sites/lib/lang/pl_web_vhost_domain.lng | 1 + .../sites/lib/lang/pt_web_vhost_domain.lng | 1 + .../sites/lib/lang/ro_web_vhost_domain.lng | 1 + .../sites/lib/lang/ru_web_vhost_domain.lng | 1 + .../sites/lib/lang/se_web_vhost_domain.lng | 1 + .../sites/lib/lang/sk_web_vhost_domain.lng | 1 + .../templates/web_vhost_domain_advanced.htm | 8 ++++++- server/conf/nginx_vhost.conf.master | 10 +++++++++ server/conf/vhost.conf.master | 13 +++++++++++ .../plugins-available/apache2_plugin.inc.php | 20 +++++++++++++++++ server/plugins-available/nginx_plugin.inc.php | 9 ++++++++ 58 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 install/sql/incremental/upd_0089.sql diff --git a/install/sql/incremental/upd_0089.sql b/install/sql/incremental/upd_0089.sql new file mode 100644 index 0000000000..5c676788d6 --- /dev/null +++ b/install/sql/incremental/upd_0089.sql @@ -0,0 +1,6 @@ +-- add new proxy_protocol column +ALTER TABLE `web_domain` + ADD COLUMN `proxy_protocol` ENUM('n','y') NOT NULL DEFAULT 'y' AFTER `log_retention`; + +-- Update old entrys +UPDATE `web_domain` SET `proxy_protocol` = 'y'; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 18b3ef57eb..6998257046 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2071,6 +2071,7 @@ CREATE TABLE `web_domain` ( `https_port` int(11) unsigned NOT NULL DEFAULT '443', `folder_directive_snippets` text, `log_retention` int(11) NOT NULL DEFAULT '10', + `proxy_protocol` enum('n','y') NOT NULL default 'y', PRIMARY KEY (`domain_id`), UNIQUE KEY `serverdomain` ( `server_id` , `ip_address`, `domain` ) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 2663cdd0e0..ef3676f05d 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -820,6 +820,28 @@ $form["tabs"]['web'] = array( 'default' => 'n', 'value' => array(0 => 'n',1 => 'y') ), + 'vhost_proxy_protocol_enabled' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n',1 => 'y') + ), + 'vhost_proxy_protocol_http_port' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '880', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), + 'vhost_proxy_protocol_https_port' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '8443', + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), 'vhost_conf_dir' => array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index bccdcc42c0..4a48ea19ce 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index 39531461c3..1e39776aac 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index f57a2310f2..be7da0ceca 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -301,3 +301,6 @@ $wb['content_filter_txt'] = 'Filtro de conteúdo'; $wb['rspamd_url_txt'] = 'URL do rspamd'; $wb['rspamd_user_txt'] = 'Usuário do rspamd'; $wb['rspamd_password_txt'] = 'Senha do rspamd'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 14f0b91d3b..9bcd747c84 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index a97d78b8eb..218742e5cf 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index 960381e7c1..792d5de9bc 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content-Filter'; $wb['rspamd_url_txt'] = 'Rspamd-URL'; $wb['rspamd_user_txt'] = 'Rspamd-Benutzer'; $wb['rspamd_password_txt'] = 'Rspamd-Passwort'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index 73e7ef1bfd..4dfd608667 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index 84992261bb..5e7a7071d4 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index 01350367ae..e8164da4a0 100755 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index 6caf643abe..94af4c8e0e 100755 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index 25f7375688..3586fd5d60 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index faf08f4201..f233aec832 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index 6347afb7da..1df1da23ce 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index 9a28dff300..4d99bd6323 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index 3dc37a3c1d..21b8461529 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 72bef72c4b..1241b89e59 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index 2884f304ec..4ac525328b 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index 29cb94e96c..45876422e0 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index 3703c759ed..7f29d9b161 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index 3251476126..1a3a2df2dc 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index b2f0b407d6..1352fa9930 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index 1103baa4d2..d2363b624a 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index 125e0b1ea2..6c272fc17a 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -300,4 +300,7 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index 3b63e881f9..27058881dc 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -294,4 +294,7 @@ $wb['log_retention_txt'] = 'Günlük Tutma Süresi (Gün)'; $wb['log_retention_error_ispositive'] = 'Günlük tutma süresi 0 değerinden büyük bir sayı olmalıdır'; $wb['php_default_name_txt'] = 'Varsayılan PHP Sürümü Açıklaması'; $wb['php_default_name_error_empty'] = 'Varsayılan PHP sürümü açıklaması boş olamaz'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; ?> diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index eb285bbc07..4d11850ebc 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -54,6 +54,20 @@ {tmpl_var name='vhost_rewrite_v6'}
+
+ +
+ {tmpl_var name='vhost_proxy_protocol_enabled'} +
+
+
+ +
+
+
+ +
+
diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index 838445e361..8b5a36441a 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -766,6 +766,12 @@ if($_SESSION["s"]["user"]["typ"] == 'admin' 'width' => '30', 'maxlength' => '255' ), + 'proxy_protocol' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), 'php_fpm_use_socket' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index f208ab3f36..33e3609253 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index a84d915230..07732b9df1 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index 01a7414a98..38869d7201 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -158,4 +158,5 @@ $wb['enable_pagespeed_txt'] = 'Habilitar PageSpeed'; $wb['log_retention_txt'] = 'Tempo de retenção do log de arquivos'; $wb['log_retention_error_regex'] = 'Tempo de retenção em dias (valores permitidos: mínimo 0, máximo 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Cota de disco não pode ser configurada para 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index aae2f46339..ea6592e0a4 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index deaa3269c4..ae70021b23 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index d95b6d47e4..bc56b403d2 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Log-Dateien Aufbewahrungszeit'; $wb['log_retention_error_regex'] = 'Aufbewahrungszeit in Tagen (Erlaubte Werte: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota kann nicht 0 sein.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index aae2f46339..ea6592e0a4 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index 0ea2c2a796..0dd4ec4a3f 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index ae546e1c4d..ce67090685 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -158,4 +158,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index f98c02db15..31eacbda72 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index c7c4a14432..48bbe91304 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 931c00a533..ece6d134e3 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 7842d770b4..e0ad832ad0 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index a40a4b62a5..7c7a653007 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 617e7fe769..7e61328ed9 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 9fbca551a3..194704d185 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index 0efd971187..3d22555524 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index dd007d549f..e0b580d96f 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index 8a426b0a1a..f136e2c1c6 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 170f2feb04..08689a0cd9 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 046c2c71a6..9b799d1d80 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index e87af3b654..dcc6b04710 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 1a2572b950..22959a1bb0 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 17e60da6e6..a688adac64 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -153,4 +153,5 @@ $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; +$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; ?> diff --git a/interface/web/sites/templates/web_vhost_domain_advanced.htm b/interface/web/sites/templates/web_vhost_domain_advanced.htm index 0b5ddfbd8b..11f95d9cbd 100644 --- a/interface/web/sites/templates/web_vhost_domain_advanced.htm +++ b/interface/web/sites/templates/web_vhost_domain_advanced.htm @@ -49,7 +49,13 @@
-
+
+
+ +
+ {tmpl_var name='proxy_protocol'} +
+
diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index b1db61fe1c..e45226d943 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -1,5 +1,10 @@ server { listen :; + + + listen : proxy_protocol; + + listen []:; @@ -8,6 +13,11 @@ server { listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + + + listen : ssl proxy_protocol; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # ssl_prefer_server_ciphers on; diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 0982a3cf41..47d3cef5b1 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -12,6 +12,19 @@ + + + + + RemoteIPProxyProtocol On + + + + ProxyProtocol On + + + + DocumentRoot diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 59e97629cb..f0da9e62e0 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1675,6 +1675,16 @@ class apache2_plugin { 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; + + //if proxy protocol is enabled we need to add a new port to lsiten to + if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){ + if((int)$web_config['vhost_proxy_protocol_http_port'] > 0) { + $tmp_vhost_arr['port'] = (int)$web_config['vhost_proxy_protocol_http_port']; + $tmp_vhost_arr['proxy_protocol'] = $data['new']['proxy_protocol']; + $vhosts[] = $tmp_vhost_arr; + } + } + unset($tmp_vhost_arr); //* Add vhost for ipv4 IP with SSL @@ -1689,6 +1699,16 @@ class apache2_plugin { } 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; + + //if proxy protocol is enabled we need to add a new port to lsiten to + if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){ + if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { + $tmp_vhost_arr['port'] = (int)$web_config['vhost_proxy_protocol_https_port']; + $tmp_vhost_arr['proxy_protocol'] = $data['new']['proxy_protocol']; + $vhosts[] = $tmp_vhost_arr; + } + } + unset($tmp_vhost_arr, $ipv4_ssl_alias_seo_redirects); $app->log('Enable SSL for: '.$domain, LOGLEVEL_DEBUG); } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index a8a3c3bf16..79cb017161 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1519,6 +1519,15 @@ class nginx_plugin { } unset($tmp_output, $tmp_retval); } + + //proxy protocol settings + if($web_config['vhost_proxy_protocol_enabled'] == "y"){ + $vhost_data['proxy_protocol'] = $data['new']['proxy_protocol']; + $vhost_data['proxy_protocol_http'] = (int)$web_config['vhost_proxy_protocol_http_port']; + $vhost_data['proxy_protocol_https'] = (int)$web_config['vhost_proxy_protocol_https_port']; + }else{ + $vhost_data['proxy_protocol'] = "n"; + } // set logging variable $vhost_data['logging'] = $web_config['logging']; -- GitLab From 21559a634d07ba29c42b8d6b5c293161117fca96 Mon Sep 17 00:00:00 2001 From: Jason Townsend Date: Sat, 23 Nov 2019 18:05:43 +0000 Subject: [PATCH 0007/1368] Added Missed patch edit, and correct the vhost loop Change the name from proxy_protocol to use_proxy_protocol in vhost file due to site level overriding the check tested both on apache2 and nginx with haproxy load balancer on TCP Mode --- interface/web/admin/lib/lang/en_server_config.lng | 3 +++ server/conf/nginx_vhost.conf.master | 4 ++-- server/conf/vhost.conf.master | 3 +-- server/plugins-available/apache2_plugin.inc.php | 4 ++-- server/plugins-available/nginx_plugin.inc.php | 4 ++-- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 0ba3638a0a..9282cb4bd2 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -301,3 +301,6 @@ $wb['content_filter_txt'] = 'Content Filter'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index e45226d943..4487e4e450 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -1,6 +1,6 @@ server { listen :; - + listen : proxy_protocol; @@ -13,7 +13,7 @@ server { listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; - + listen : ssl proxy_protocol; diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 47d3cef5b1..ab6cebe4d0 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -12,8 +12,7 @@ - - + RemoteIPProxyProtocol On diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index f0da9e62e0..5e80be9740 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1680,7 +1680,7 @@ class apache2_plugin { if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){ if((int)$web_config['vhost_proxy_protocol_http_port'] > 0) { $tmp_vhost_arr['port'] = (int)$web_config['vhost_proxy_protocol_http_port']; - $tmp_vhost_arr['proxy_protocol'] = $data['new']['proxy_protocol']; + $tmp_vhost_arr['use_proxy_protocol'] = $data['new']['proxy_protocol']; $vhosts[] = $tmp_vhost_arr; } } @@ -1704,7 +1704,7 @@ class apache2_plugin { if($web_config['vhost_proxy_protocol_enabled'] == 'y' && $data['new']['proxy_protocol'] == 'y'){ if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { $tmp_vhost_arr['port'] = (int)$web_config['vhost_proxy_protocol_https_port']; - $tmp_vhost_arr['proxy_protocol'] = $data['new']['proxy_protocol']; + $tmp_vhost_arr['use_proxy_protocol'] = $data['new']['proxy_protocol']; $vhosts[] = $tmp_vhost_arr; } } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 79cb017161..ef9300e5dc 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1522,11 +1522,11 @@ class nginx_plugin { //proxy protocol settings if($web_config['vhost_proxy_protocol_enabled'] == "y"){ - $vhost_data['proxy_protocol'] = $data['new']['proxy_protocol']; + $vhost_data['use_proxy_protocol'] = $data['new']['proxy_protocol']; $vhost_data['proxy_protocol_http'] = (int)$web_config['vhost_proxy_protocol_http_port']; $vhost_data['proxy_protocol_https'] = (int)$web_config['vhost_proxy_protocol_https_port']; }else{ - $vhost_data['proxy_protocol'] = "n"; + $vhost_data['use_proxy_protocol'] = "n"; } // set logging variable -- GitLab From 81768b88aff964c18444e4f6cd0d38b5d9b12666 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 29 Nov 2019 11:52:12 +0100 Subject: [PATCH 0008/1368] use dnf as default package manager whenever possible --- .../cron.d/100-monitor_system_update.inc.php | 52 +++++++++++-------- 1 file changed, 31 insertions(+), 21 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_system_update.inc.php b/server/lib/classes/cron.d/100-monitor_system_update.inc.php index 3d4ebf408e..34f944fa67 100644 --- a/server/lib/classes/cron.d/100-monitor_system_update.inc.php +++ b/server/lib/classes/cron.d/100-monitor_system_update.inc.php @@ -160,28 +160,38 @@ class cronjob_monitor_system_update extends cronjob { */ $data['output'] = shell_exec('zypper lu'); } elseif(file_exists('/etc/redhat-release')) { - /* - * update and find the upgrade. - * if there is any output, then there is a needed update - */ - $aptData = shell_exec('yum -q list updates'); - if ($aptData == '') { - /* There is nothing to update! */ - $state = 'ok'; - } else { - /* - * There is something to update! this is in most cases not critical, so we can - * do a system-update once a month or so... - */ - $state = 'info'; - } - - /* - * Fetch the output - */ - $data['output'] = shell_exec('yum -q list updates'); + /* + * update and find the upgrade. + * if there is any output, then there is a needed update + */ + + /* try to figure out the default package manager first */ + if(file_exists('/usr/bin/dnf') && (is_link('/usr/bin/yum'))) { + $rhPkgMgr = 'dnf'; + } elseif(file_exists('/usr/bin/dnf') && (!file_exists('/usr/bin/yum')) || (!is_link('/usr/bin/yum'))) { + $rhPkgMgr = 'dnf'; + } else { + $rhPkgMgr = 'yum'; + } + + $aptData = shell_exec($rhPkgMgr. ' -q list updates'); + if ($aptData == '') { + /* There is nothing to update! */ + $state = 'ok'; + } else { + /* + * There is something to update! this is in most cases not critical, so we can + * do a system-update once a month or so... + */ + $state = 'info'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec($rhPkgMgr. ' -q list updates'); - } else { + } else { /* * It is not Debian/Ubuntu, so there is no data and no state * -- GitLab From 1abf95299b76dc55e238054731e1e1e193a04989 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 29 Nov 2019 11:56:20 +0100 Subject: [PATCH 0009/1368] added CentOS 8 detection to monitoring tools --- server/lib/classes/monitor_tools.inc.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index d8d325fe60..aba19df7a4 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -319,6 +319,14 @@ class monitor_tools { } else { $distid = 'centos72'; } + } elseif(stristr($content, 'CentOS Linux release 8')) { + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); + $distname = 'CentOS'; + $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; + $distbaseid = 'fedora'; + $var=explode(" ", $content); + $var=explode(".", $var[3]); + $var=$var[0].".".$var[1]; } else { $distname = 'Redhat'; $distver = 'Unknown'; -- GitLab From f6553cd855fcd2a52f5a522e5335277400485fd8 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 29 Nov 2019 12:05:43 +0100 Subject: [PATCH 0010/1368] added CentOS 8 detection to installer --- install/lib/install.lib.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 1e49e025ca..02ebba2850 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -341,6 +341,15 @@ function get_distname() { $distid = 'centos72'; } swriteln("Operating System: CentOS $var\n"); + } elseif(stristr($content, 'CentOS Linux release 8')) { + $distname = 'CentOS'; + $distver = 'Unknown'; + $distbaseid = 'fedora'; + $distid = 'centos80'; + $var=explode(" ", $content); + $var=explode(".", $var[3]); + $var=$var[0].".".$var[1]; + swriteln("Operating System: CentOS $var\n"); } else { $distname = 'Redhat'; $distver = 'Unknown'; -- GitLab From 1d10294cee99e75cadebb6eff02160632f482c56 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Fri, 29 Nov 2019 14:00:48 +0100 Subject: [PATCH 0011/1368] Test webserver configuration on restart was not shown for nginx --- interface/web/admin/lib/lang/ar_server_config.lng | 2 +- interface/web/admin/lib/lang/bg_server_config.lng | 2 +- interface/web/admin/lib/lang/ca_server_config.lng | 2 +- interface/web/admin/lib/lang/en_server_config.lng | 2 +- interface/web/admin/lib/lang/fi_server_config.lng | 2 +- interface/web/admin/lib/lang/hu_server_config.lng | 2 +- interface/web/admin/lib/lang/ja_server_config.lng | 2 +- interface/web/admin/lib/lang/pt_server_config.lng | 2 +- interface/web/admin/lib/lang/ro_server_config.lng | 2 +- interface/web/admin/lib/lang/se_server_config.lng | 2 +- interface/web/admin/lib/lang/sk_server_config.lng | 2 +- interface/web/admin/templates/server_config_web_edit.htm | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index f271e007d3..24a1a41933 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['CA_path_txt'] = 'CA Path'; $wb['CA_pass_txt'] = 'CA passphrase'; $wb['ufw_enable_txt'] = 'Enable'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index 46c77fe794..aa4385b8ae 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Директория за бекъп'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['ufw_enable_txt'] = 'Enable'; $wb['ufw_manage_builtins_txt'] = 'Manage Builtin Rules'; $wb['ufw_ipv6_txt'] = 'Enable IPv6'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 1dac17eda5..40f02fb637 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -96,7 +96,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['network_config_warning_txt'] = 'The network configuration option is only available for Debian and Ubuntu Servers. Do not enable this option if your network interface is not eth0.'; $wb['CA_path_txt'] = 'CA Path'; $wb['CA_pass_txt'] = 'CA passphrase'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 1d2bf74ec9..b8c9166d43 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -97,7 +97,7 @@ $wb["backup_tmp_txt"] = 'Backup tmp directory for zip'; $wb["named_conf_local_path_txt"] = 'BIND named.conf.local path'; $wb["php_ini_path_cgi_txt"] = 'CGI php.ini path'; $wb["php_ini_path_apache_txt"] = 'Apache php.ini path'; -$wb["check_apache_config_txt"] = 'Test apache configuration on restart'; +$wb["check_apache_config_txt"] = 'Test webserver configuration on restart'; $wb["network_config_warning_txt"] = 'The network configuration option is only available for Debian and Ubuntu Servers. Do not enable this option if your network interface is not eth0.'; $wb["CA_path_txt"] = 'CA Path'; $wb["CA_pass_txt"] = 'CA passphrase'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index b81f77ac08..85b994a72e 100755 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['CA_path_txt'] = 'CA Path'; $wb['CA_pass_txt'] = 'CA passphrase'; $wb['ufw_enable_txt'] = 'Enable'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index 0bd058a5bc..52533a2c78 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Mentés könyvtára'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['network_config_warning_txt'] = 'The network configuration option is only available for Debian and Ubuntu Servers. Do not enable this option if your network interface is not eth0.'; $wb['CA_path_txt'] = 'CA Path'; $wb['CA_pass_txt'] = 'CA passphrase'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 4d1d362502..6cd157154a 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['ufw_enable_txt'] = 'Enable'; $wb['ufw_manage_builtins_txt'] = 'Manage Builtin Rules'; $wb['ufw_ipv6_txt'] = 'Enable IPv6'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index 98bf41a283..fabd1d61cc 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['CA_path_txt'] = 'CA Path'; $wb['CA_pass_txt'] = 'CA passphrase'; $wb['ufw_enable_txt'] = 'Enable'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index 27926c44a8..b5a1a18759 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['ufw_enable_txt'] = 'Enable'; $wb['ufw_manage_builtins_txt'] = 'Manage Builtin Rules'; $wb['ufw_ipv6_txt'] = 'Enable IPv6'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index afaac77796..92b55336f0 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['ufw_enable_txt'] = 'Enable'; $wb['ufw_manage_builtins_txt'] = 'Manage Builtin Rules'; $wb['ufw_ipv6_txt'] = 'Enable IPv6'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index f97bc7f86f..801a4fece1 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -84,7 +84,7 @@ $wb['backup_dir_txt'] = 'Backup directory'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local path'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini path'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini path'; -$wb['check_apache_config_txt'] = 'Test apache configuration on restart'; +$wb['check_apache_config_txt'] = 'Test webserver configuration on restart'; $wb['ufw_enable_txt'] = 'Enable'; $wb['ufw_manage_builtins_txt'] = 'Manage Builtin Rules'; $wb['ufw_ipv6_txt'] = 'Enable IPv6'; diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index 97dc0557fc..05042bac85 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -78,7 +78,7 @@ {tmpl_var name='security_level'}
-
+
{tmpl_var name='check_apache_config'} -- GitLab From 1477f12bdbbf2df77fa6e9abf5773745954b226e Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Sat, 30 Nov 2019 13:50:25 +0100 Subject: [PATCH 0012/1368] added missing dist files --- install/dist/conf/centos80.conf.php | 224 ++++++++++++++++++++++++++++ install/dist/lib/centos80.lib.php | 40 +++++ 2 files changed, 264 insertions(+) create mode 100644 install/dist/conf/centos80.conf.php create mode 100644 install/dist/lib/centos80.lib.php diff --git a/install/dist/conf/centos80.conf.php b/install/dist/conf/centos80.conf.php new file mode 100644 index 0000000000..04257d4dfe --- /dev/null +++ b/install/dist/conf/centos80.conf.php @@ -0,0 +1,224 @@ + diff --git a/install/dist/lib/centos80.lib.php b/install/dist/lib/centos80.lib.php new file mode 100644 index 0000000000..3dcd7494d3 --- /dev/null +++ b/install/dist/lib/centos80.lib.php @@ -0,0 +1,40 @@ + -- GitLab From fe83d4b7eb40dd0ad317623b213e4d45d1d2a271 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 30 Nov 2019 22:09:26 +0100 Subject: [PATCH 0013/1368] Filter aliasdomains like the form does for API Functions mail_user_update and mail_user_add --- interface/lib/classes/remote.d/mail.inc.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php index 477743dfc3..771698e9dc 100644 --- a/interface/lib/classes/remote.d/mail.inc.php +++ b/interface/lib/classes/remote.d/mail.inc.php @@ -208,9 +208,9 @@ class remoting_mail extends remoting { //* Check if mail domain exists $email_parts = explode('@', $params['email']); - $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ?", $email_parts[1]); + $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ? AND domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain')", $email_parts[1]); if($tmp['domain'] != $email_parts[1]) { - throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist.'); + throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist as primary.'); return false; } @@ -234,11 +234,11 @@ class remoting_mail extends remoting { return false; } - //* Check if mail domain exists + //* Check if mail domain exists, and is not used as aliasdomain $email_parts = explode('@', $params['email']); - $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ?", $email_parts[1]); + $tmp = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ? AND domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain')", $email_parts[1]); if($tmp['domain'] != $email_parts[1]) { - throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist.'); + throw new SoapFault('mail_domain_does_not_exist', 'Mail domain - '.$email_parts[1].' - does not exist as primary.'); return false; } -- GitLab From 8c9f7aa33482877a605170085bc9c7ed8dce2f06 Mon Sep 17 00:00:00 2001 From: Webslice Date: Mon, 2 Dec 2019 10:32:16 +0100 Subject: [PATCH 0014/1368] Fix APS installer limits check --- interface/web/sites/aps_install_package.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/sites/aps_install_package.php b/interface/web/sites/aps_install_package.php index 1a38190a9f..04b815bb2d 100644 --- a/interface/web/sites/aps_install_package.php +++ b/interface/web/sites/aps_install_package.php @@ -49,8 +49,8 @@ $app->load_language_file('web/sites/'.$lngfile); // we will check only users, not admins if($_SESSION["s"]["user"]["typ"] == 'user') { - $app->tform->formDef['db_table_idx'] = 'client_id'; - $app->tform->formDef['db_table'] = 'client'; + $app->tform->formDef['db_table_idx'] = 'id'; + $app->tform->formDef['db_table'] = 'aps_instances'; if(!$app->tform->checkClientLimit('limit_aps')) { $app->error($app->lng("limit_aps_txt")); } -- GitLab From f8317f75d4e3a7569c64555f7b42da7eaaed432f Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 9 Dec 2019 16:15:22 +0100 Subject: [PATCH 0015/1368] Fixed csrf issue when deleting an invoice draft --- server/lib/classes/aps_installer.inc.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server/lib/classes/aps_installer.inc.php b/server/lib/classes/aps_installer.inc.php index 922f32e612..70b77a3a7e 100644 --- a/server/lib/classes/aps_installer.inc.php +++ b/server/lib/classes/aps_installer.inc.php @@ -550,10 +550,21 @@ class ApsInstaller extends ApsBase foreach($this->putenv as $var) { putenv($var); } + + $tmpi = "putenv as $var) { + $tmpi .= "putenv('".$var."');\n"; + } + $tmpi .= "chdir('".$this->local_installpath.'install_scripts/'."');\n"; + $tmpi .= 'exec("php '.$this->local_installpath.'install_scripts/'.$cfgscript.' install");'; + + $app->system->file_put_contents($this->local_installpath.'install_scripts/ispinstall.php', $tmpi); + exec('php '.$this->local_installpath.'install_scripts/ispinstall.php'); + die(); $shell_retcode = true; $shell_ret = array(); - $app->system->exec_safe('php ? install 2>&1', $this->local_installpath.'install_scripts/'.$cfgscript); + //$app->system->exec_safe('sudo -u ? php ? install 2>&1', $this->file_owner_user, $this->local_installpath.'install_scripts/'.$cfgscript); $shell_ret = $app->system->last_exec_out(); $shell_retcode = $app->system->last_exec_retcode(); $shell_ret = array_filter($shell_ret); -- GitLab From 2bdc1c8ac9246692f53d94691d36d6485d0aafa4 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 9 Dec 2019 16:22:30 +0100 Subject: [PATCH 0016/1368] Revert "Fixed csrf issue when deleting an invoice draft" This reverts commit f8317f75d4e3a7569c64555f7b42da7eaaed432f --- server/lib/classes/aps_installer.inc.php | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/server/lib/classes/aps_installer.inc.php b/server/lib/classes/aps_installer.inc.php index 70b77a3a7e..922f32e612 100644 --- a/server/lib/classes/aps_installer.inc.php +++ b/server/lib/classes/aps_installer.inc.php @@ -550,21 +550,10 @@ class ApsInstaller extends ApsBase foreach($this->putenv as $var) { putenv($var); } - - $tmpi = "putenv as $var) { - $tmpi .= "putenv('".$var."');\n"; - } - $tmpi .= "chdir('".$this->local_installpath.'install_scripts/'."');\n"; - $tmpi .= 'exec("php '.$this->local_installpath.'install_scripts/'.$cfgscript.' install");'; - - $app->system->file_put_contents($this->local_installpath.'install_scripts/ispinstall.php', $tmpi); - exec('php '.$this->local_installpath.'install_scripts/ispinstall.php'); - die(); $shell_retcode = true; $shell_ret = array(); - //$app->system->exec_safe('sudo -u ? php ? install 2>&1', $this->file_owner_user, $this->local_installpath.'install_scripts/'.$cfgscript); + $app->system->exec_safe('php ? install 2>&1', $this->local_installpath.'install_scripts/'.$cfgscript); $shell_ret = $app->system->last_exec_out(); $shell_retcode = $app->system->last_exec_retcode(); $shell_ret = array_filter($shell_ret); -- GitLab From c83ce3f6b4f9007125675184e562d072892cab96 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Mon, 9 Dec 2019 18:22:38 +0100 Subject: [PATCH 0017/1368] add {WEBROOT} to php-directive-snippets --- interface/web/admin/templates/directive_snippets_edit.htm | 5 +++-- interface/web/sites/web_vhost_domain_edit.php | 2 +- server/plugins-available/apache2_plugin.inc.php | 1 + server/plugins-available/nginx_plugin.inc.php | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/interface/web/admin/templates/directive_snippets_edit.htm b/interface/web/admin/templates/directive_snippets_edit.htm index 72eb82369c..657d0ad1ef 100644 --- a/interface/web/admin/templates/directive_snippets_edit.htm +++ b/interface/web/admin/templates/directive_snippets_edit.htm @@ -19,7 +19,8 @@
{tmpl_var name='snippet'}
  Nginx {tmpl_var name='variables_txt'}: {DOCROOT}, {FASTCGIPASS}, {PHPFALLBACKFASTCGIPASS}
-   Apache {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT} +   Apache {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT}
+   PHP {tmpl_var name='variables_txt'}: {WEBROOT}
@@ -81,4 +82,4 @@ } }); - \ No newline at end of file + diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 52b44acc79..459af39670 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -1310,7 +1310,7 @@ class page_action extends tform_actions { // value inside '' if(preg_match('@^\s*;*\s*[a-zA-Z0-9._]*\s*=\s*\'.*\'\s*;*\s*$@', $custom_php_ini_settings_line)) continue; // everything else - if(preg_match('@^\s*;*\s*[a-zA-Z0-9._]*\s*=\s*[-a-zA-Z0-9~&=_\@/,.#\s\|]*\s*;*\s*$@', $custom_php_ini_settings_line)) continue; + if(preg_match('@^\s*;*\s*[a-zA-Z0-9._]*\s*=\s*[-a-zA-Z0-9~&=_\@/,.#\{\}\s\|]*\s*;*\s*$@', $custom_php_ini_settings_line)) continue; $custom_php_ini_settings_are_valid = false; break; } diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 59e97629cb..db0778ce88 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -3149,6 +3149,7 @@ class apache2_plugin { $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings); $ini_settings = explode("\n", $custom_php_ini_settings); if(is_array($ini_settings) && !empty($ini_settings)){ + $ini_settings = str_replace('{DOCROOT}', $data['new']['document_root'], $ini_settings); foreach($ini_settings as $ini_setting){ $ini_setting = trim($ini_setting); if(substr($ini_setting, 0, 1) == ';') continue; diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index a8a3c3bf16..a26a96896f 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -2778,6 +2778,7 @@ class nginx_plugin { $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings); $ini_settings = explode("\n", $custom_php_ini_settings); if(is_array($ini_settings) && !empty($ini_settings)){ + $ini_settings = str_replace('{WEBROOT}', $data['new']['document_root'].'/web', $ini_settings); foreach($ini_settings as $ini_setting){ $ini_setting = trim($ini_setting); if(substr($ini_setting, 0, 1) == ';') continue; -- GitLab From 9584fb94d5842177c698eb8e91e650f24e0655a5 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Mon, 9 Dec 2019 18:24:49 +0100 Subject: [PATCH 0018/1368] fix last commit for apache --- server/plugins-available/apache2_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index db0778ce88..08730bee8e 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -3149,7 +3149,7 @@ class apache2_plugin { $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings); $ini_settings = explode("\n", $custom_php_ini_settings); if(is_array($ini_settings) && !empty($ini_settings)){ - $ini_settings = str_replace('{DOCROOT}', $data['new']['document_root'], $ini_settings); + $ini_settings = str_replace('{WEBROOT}', $data['new']['document_root'].'/web', $ini_settings); foreach($ini_settings as $ini_setting){ $ini_setting = trim($ini_setting); if(substr($ini_setting, 0, 1) == ';') continue; -- GitLab From 20225e7b238c13c99ed71510089d103c6da84142 Mon Sep 17 00:00:00 2001 From: Webslice Date: Thu, 12 Dec 2019 09:02:15 +0100 Subject: [PATCH 0019/1368] Prevent conflicting APS install paths --- interface/lib/classes/aps_guicontroller.inc.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/interface/lib/classes/aps_guicontroller.inc.php b/interface/lib/classes/aps_guicontroller.inc.php index 8a764a9c5c..8e4c17af79 100644 --- a/interface/lib/classes/aps_guicontroller.inc.php +++ b/interface/lib/classes/aps_guicontroller.inc.php @@ -637,11 +637,27 @@ class ApsGUIController extends ApsBase // The location might be empty but the DB return must not be false! if($location_for_domain) $used_path .= $location_for_domain['value']; + // If user is trying to install into exactly the same path, give an error if($new_path == $used_path) { $temp_errstr = $app->lng('error_used_location'); break; } + + // If the new path is _below_ an existing path, give an error because the + // installation will delete the files of the existing APS installation + if (mb_substr($used_path, 0, mb_strlen($new_path)) === $new_path) { + $temp_errstr = $app->lng('error_used_location'); + break; + } + + // If the new path is _within_ an existing path, give an error. Even if + // installation would proceed fine in theory, deleting the "lower" package + // in the future would also inadvertedly delete the "nested" package + if (mb_substr($new_path, 0, mb_strlen($used_path)) === $used_path) { + $temp_errstr = $app->lng('error_used_location'); + break; + } } } } -- GitLab From 044e403a3b24d94d0d0e3d859595c57dd7481da8 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Sat, 14 Dec 2019 13:41:20 +0100 Subject: [PATCH 0020/1368] update dovecot.conf (move mail_plugins - Global setting mail_plugins won't change the setting inside an earlier filter) --- install/tpl/debian_dovecot2.conf.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index cfe3bd0182..e1929b188d 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -9,6 +9,7 @@ ssl_cert = Date: Fri, 2 Aug 2019 22:33:27 +0200 Subject: [PATCH 0021/1368] Add additional option to frontend, #5325 --- interface/web/mail/form/mail_user_filter.tform.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/interface/web/mail/form/mail_user_filter.tform.php b/interface/web/mail/form/mail_user_filter.tform.php index be5fba3ed7..b1370ecaa1 100644 --- a/interface/web/mail/form/mail_user_filter.tform.php +++ b/interface/web/mail/form/mail_user_filter.tform.php @@ -88,13 +88,14 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - 'value' => array('Subject' => 'subject_txt', 'From'=>'from_txt', 'To'=>'to_txt', 'List-Id'=>'list_id_txt') + 'value' => array('Subject' => 'subject_txt', 'From'=>'from_txt', 'To'=>'to_txt', 'List-Id'=>'list_id_txt', 'Header' => 'header_txt', 'Size' => 'size_over_txt') ), 'op' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - 'value' => array('contains'=>'contains_txt', 'is' => 'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt') + //'value' => array('contains'=>'contains_txt','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') + 'value' => array('contains'=>'contains_txt', 'is' => 'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'localpart' => 'localpart_txt', 'domain' => 'domain_txt') ), 'searchterm' => array ( 'datatype' => 'VARCHAR', @@ -115,7 +116,7 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - 'value' => array('move' => 'move_to_txt', 'delete'=>'delete_txt') + 'value' => array('move' => 'move_to_txt', 'delete'=>'delete_txt', 'keep' => 'keep_txt', 'reject' => 'reject_txt') ), 'target' => array ( 'datatype' => 'VARCHAR', -- GitLab From 30fdcaa46a6037019216beee7cecba064025e2cc Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 14 Nov 2019 12:30:10 +0100 Subject: [PATCH 0022/1368] Update reference to renamed plugin --- interface/lib/classes/remote.d/sites.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/remote.d/sites.inc.php b/interface/lib/classes/remote.d/sites.inc.php index 59c2e371f3..d90b90bd89 100644 --- a/interface/lib/classes/remote.d/sites.inc.php +++ b/interface/lib/classes/remote.d/sites.inc.php @@ -423,7 +423,7 @@ class remoting_sites extends remoting { $params['client_group_id'] = $rec['groupid']; } - //* Set a few params to "not empty" values which get overwritten by the sites_web_domain_plugin + //* Set a few params to "not empty" values which get overwritten by the sites_web_vhost_domain_plugin if($params['document_root'] == '') $params['document_root'] = '-'; if($params['system_user'] == '') $params['system_user'] = '-'; if($params['system_group'] == '') $params['system_group'] = '-'; -- GitLab From d8826462719152f83a57602b41f7f3b3c47a3d06 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 30 Nov 2019 22:11:38 +0100 Subject: [PATCH 0023/1368] typo --- interface/lib/plugins/mail_user_filter_plugin.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/plugins/mail_user_filter_plugin.inc.php b/interface/lib/plugins/mail_user_filter_plugin.inc.php index 26c0b02b83..ccf58b853c 100644 --- a/interface/lib/plugins/mail_user_filter_plugin.inc.php +++ b/interface/lib/plugins/mail_user_filter_plugin.inc.php @@ -80,7 +80,7 @@ class mail_user_filter_plugin { } } - // We did not found our rule, so we add it now as first rule. + // We did not find our rule, so we add it now as first rule. if($found == false && $page_form->dataRecord["active"] == 'y') { $new_rule = $this->mail_user_filter_get_rule($page_form); $out = $new_rule . $out; @@ -92,7 +92,7 @@ class mail_user_filter_plugin { } /* - * Remove the rendered filter from custom_mailfilter when a mail_user_filter is deleted + * Remove the rendered filter from custom_mailfilter when a mail_user_filter is deleted. */ function mail_user_filter_del($event_name, $page_form) { global $app, $conf; -- GitLab From 13da3ecd1d2359a2e884c9507961a505e6b540a7 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 24 Dec 2019 09:43:05 +0100 Subject: [PATCH 0024/1368] Document _ispconfig_pw_crypted parameter --- remoting_client/API-docs/mail_user_add.html | 1 + remoting_client/API-docs/mail_user_update.html | 1 + 2 files changed, 2 insertions(+) diff --git a/remoting_client/API-docs/mail_user_add.html b/remoting_client/API-docs/mail_user_add.html index 88ab952e6a..a893e24e3f 100644 --- a/remoting_client/API-docs/mail_user_add.html +++ b/remoting_client/API-docs/mail_user_add.html @@ -25,6 +25,7 @@

email  (varchar(255))

login  (varchar(255))

password  (varchar(255))

+

_ispconfig_pw_crypted  (int(11)) Set to 1 to indicate that the password is already crypted.

name  (varchar(255))

uid  (int(11))

gid  (int(11))

diff --git a/remoting_client/API-docs/mail_user_update.html b/remoting_client/API-docs/mail_user_update.html index 46d23dacf9..1f46858473 100644 --- a/remoting_client/API-docs/mail_user_update.html +++ b/remoting_client/API-docs/mail_user_update.html @@ -24,6 +24,7 @@

server_id  (int(11))

email  (varchar(255))

password  (varchar(255))

+

_ispconfig_pw_crypted  (int(11)) Set to 1 to indicate that the password is already crypted.

name  (varchar(255))

uid  (int(11))

gid  (int(11))

-- GitLab From 91d3122279481debf00a0c9e95818e24dd9dee79 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 24 Dec 2019 09:44:00 +0100 Subject: [PATCH 0025/1368] fix syntax error --- remoting_client/API-docs/mail_user_update.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/remoting_client/API-docs/mail_user_update.html b/remoting_client/API-docs/mail_user_update.html index 1f46858473..8cb900fb40 100644 --- a/remoting_client/API-docs/mail_user_update.html +++ b/remoting_client/API-docs/mail_user_update.html @@ -12,7 +12,7 @@ - +

mail_user_update($session_id, $client_id, $primary_id, $params);


-- GitLab From 00260e643ae681ecd74f3169da54eab6c43f8acd Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 24 Dec 2019 09:50:54 +0100 Subject: [PATCH 0026/1368] Add Dutch email template --- server/conf/mail/welcome_email_nl.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 server/conf/mail/welcome_email_nl.txt diff --git a/server/conf/mail/welcome_email_nl.txt b/server/conf/mail/welcome_email_nl.txt new file mode 100644 index 0000000000..cd4baf4815 --- /dev/null +++ b/server/conf/mail/welcome_email_nl.txt @@ -0,0 +1,4 @@ +From: ISPConfig +Subject: Welkom in uw nieuwe account. + +Welkom in uw nieuwe email account. Uw webmaster. -- GitLab From d8d70b33cf3de5444ea5580e234bf1f511ad50c0 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Mon, 30 Dec 2019 12:18:33 +0100 Subject: [PATCH 0027/1368] Use translated string instead of untranslated string unlimited #5476 --- interface/lib/classes/quota_lib.inc.php | 12 ++++++------ interface/web/mail/user_quota_stats.php | 2 +- interface/web/sites/database_quota_stats.php | 2 +- interface/web/sites/user_quota_stats.php | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/interface/lib/classes/quota_lib.inc.php b/interface/lib/classes/quota_lib.inc.php index 3946b216dd..3bae97f046 100644 --- a/interface/lib/classes/quota_lib.inc.php +++ b/interface/lib/classes/quota_lib.inc.php @@ -71,11 +71,11 @@ class quota_lib { $sites[$i]['hard'] .= ' KB'; } - if($sites[$i]['soft'] == " KB") $sites[$i]['soft'] = $app->lng('unlimited'); - if($sites[$i]['hard'] == " KB") $sites[$i]['hard'] = $app->lng('unlimited'); + if($sites[$i]['soft'] == " KB") $sites[$i]['soft'] = $app->lng('unlimited_txt'); + if($sites[$i]['hard'] == " KB") $sites[$i]['hard'] = $app->lng('unlimited_txt'); - if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = $app->lng('unlimited'); - if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = $app->lng('unlimited'); + if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = $app->lng('unlimited_txt'); + if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = $app->lng('unlimited_txt'); /* if(!strstr($sites[$i]['used'],'M') && !strstr($sites[$i]['used'],'K')) $sites[$i]['used'].= ' B'; @@ -266,7 +266,7 @@ class quota_lib { if($used_ratio >= 1) $emails[$i]['display_colour'] = '#cc0000'; if($emails[$i]['quota'] == 0){ - $emails[$i]['quota'] = $app->lng('unlimited'); + $emails[$i]['quota'] = $app->lng('unlimited_txt'); } else { $emails[$i]['quota'] = round($emails[$i]['quota'] / 1048576, 1).' MB'; } @@ -327,7 +327,7 @@ class quota_lib { if($used_ratio >= 1) $databases[$i]['display_colour'] = '#cc0000'; if($databases[$i]['database_quota'] == 0){ - $databases[$i]['database_quota'] = $app->lng('unlimited'); + $databases[$i]['database_quota'] = $app->lng('unlimited_txt'); } else { $databases[$i]['database_quota'] = $databases[$i]['database_quota'] . ' MB'; } diff --git a/interface/web/mail/user_quota_stats.php b/interface/web/mail/user_quota_stats.php index 90a92558fa..9699acafda 100644 --- a/interface/web/mail/user_quota_stats.php +++ b/interface/web/mail/user_quota_stats.php @@ -52,7 +52,7 @@ class list_action extends listform_actions { if (!is_numeric($rec['used'])) $rec['used']=$rec['used'][1]; if($rec['quota'] == 0){ - $rec['quota'] = $app->lng('unlimited'); + $rec['quota'] = $app->lng('unlimited_txt'); $rec['percentage'] = ''; $rec['percentage_sort'] = 0; } else { diff --git a/interface/web/sites/database_quota_stats.php b/interface/web/sites/database_quota_stats.php index 5f550cf8d1..4e960bce27 100644 --- a/interface/web/sites/database_quota_stats.php +++ b/interface/web/sites/database_quota_stats.php @@ -72,7 +72,7 @@ class list_action extends listform_actions { $rec['quota'] = $monitor_data[$rec['server_id'].'.'.$database_name]['quota']; if($rec['quota'] == 0){ - $rec['quota'] = $app->lng('unlimited'); + $rec['quota'] = $app->lng('unlimited_txt'); $rec['percentage'] = ''; } else { if ($rec['used'] > 0 ) $rec['percentage'] = round(100 * intval($rec['used']) / ( intval($rec['quota'])*1024*1024) ).'%'; diff --git a/interface/web/sites/user_quota_stats.php b/interface/web/sites/user_quota_stats.php index 9c93008076..8c641eede9 100644 --- a/interface/web/sites/user_quota_stats.php +++ b/interface/web/sites/user_quota_stats.php @@ -63,8 +63,8 @@ class list_action extends listform_actions { $rec['used']=$app->functions->formatBytes($rec['used']*1024); $rec['soft']=$app->functions->formatBytes($rec['soft']*1024); $rec['hard']=$app->functions->formatBytes($rec['hard']*1024); - if($rec['soft'] == "NAN") $rec['soft'] = $app->lng('unlimited'); - if($rec['hard'] == "NAN") $rec['hard'] = $app->lng('unlimited'); + if($rec['soft'] == "NAN") $rec['soft'] = $app->lng('unlimited_txt'); + if($rec['hard'] == "NAN") $rec['hard'] = $app->lng('unlimited_txt'); /* if($rec['used'] > 1024) { $rec['used'] = round($rec['used'] / 1024, 2).' MB'; @@ -84,8 +84,8 @@ class list_action extends listform_actions { $rec['hard'] .= ' KB'; } - if($rec['soft'] == " KB") $rec['soft'] = $app->lng('unlimited'); - if($rec['hard'] == " KB") $rec['hard'] = $app->lng('unlimited'); + if($rec['soft'] == " KB") $rec['soft'] = $app->lng('unlimited_txt'); + if($rec['hard'] == " KB") $rec['hard'] = $app->lng('unlimited_txt'); */ /* @@ -94,8 +94,8 @@ class list_action extends listform_actions { if(!strstr($rec['hard'],'M') && !strstr($rec['hard'],'K')) $rec['hard'].= ' B'; */ /* - if($rec['soft'] == '0 B' || $rec['soft'] == '0 KB' || $rec['soft'] == '0') $rec['soft'] = $app->lng('unlimited'); - if($rec['hard'] == '0 B' || $rec['hard'] == '0 KB' || $rec['hard'] == '0') $rec['hard'] = $app->lng('unlimited'); + if($rec['soft'] == '0 B' || $rec['soft'] == '0 KB' || $rec['soft'] == '0') $rec['soft'] = $app->lng('unlimited_txt'); + if($rec['hard'] == '0 B' || $rec['hard'] == '0 KB' || $rec['hard'] == '0') $rec['hard'] = $app->lng('unlimited_txt'); */ //* The variable "id" contains always the index variable $rec['id'] = $rec[$this->idx_key]; -- GitLab From b7dc74dc5344167f8217732e7986d779cad0da4f Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 31 Dec 2019 15:46:30 +0100 Subject: [PATCH 0028/1368] Move unlimited_txt string to global scope #5476 --- interface/lib/lang/ar.lng | 1 + interface/lib/lang/bg.lng | 1 + interface/lib/lang/br.lng | 1 + interface/lib/lang/ca.lng | 1 + interface/lib/lang/cz.lng | 1 + interface/lib/lang/de.lng | 1 + interface/lib/lang/dk.lng | 1 + interface/lib/lang/el.lng | 1 + interface/lib/lang/en.lng | 3 ++- interface/lib/lang/es.lng | 1 + interface/lib/lang/fi.lng | 1 + interface/lib/lang/fr.lng | 1 + interface/lib/lang/hr.lng | 1 + interface/lib/lang/hu.lng | 1 + interface/lib/lang/id.lng | 1 + interface/lib/lang/it.lng | 1 + interface/lib/lang/ja.lng | 1 + interface/lib/lang/nl.lng | 1 + interface/lib/lang/pl.lng | 1 + interface/lib/lang/pt.lng | 1 + interface/lib/lang/ro.lng | 1 + interface/lib/lang/ru.lng | 1 + interface/lib/lang/se.lng | 1 + interface/lib/lang/sk.lng | 1 + interface/lib/lang/tr.lng | 1 + interface/web/dashboard/lib/lang/ar_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/bg_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/br_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/ca_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/cz_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/de_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/dk_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/el_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/en_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/es_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/fi_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/fr_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/hr_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/hu_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/id_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/it_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/ja_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/nl_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/pl_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/pt_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/ro_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/ru_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/se_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/sk_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/tr_dashlet_limits.lng | 1 - 50 files changed, 26 insertions(+), 26 deletions(-) diff --git a/interface/lib/lang/ar.lng b/interface/lib/lang/ar.lng index 25dd920831..f8fd2b5a50 100644 --- a/interface/lib/lang/ar.lng +++ b/interface/lib/lang/ar.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Unlimited'; ?> diff --git a/interface/lib/lang/bg.lng b/interface/lib/lang/bg.lng index ff1e39fe34..049807e66d 100644 --- a/interface/lib/lang/bg.lng +++ b/interface/lib/lang/bg.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Неограничен'; ?> diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng index 60a0dcf910..3bab13ab3a 100644 --- a/interface/lib/lang/br.lng +++ b/interface/lib/lang/br.lng @@ -158,4 +158,5 @@ $wb['security_check1_txt'] = 'Verifique as permissões de segurança:'; $wb['security_check2_txt'] = 'falhou.'; $wb['select_directive_snippet_txt'] = 'Diretiva de trechos de código'; $wb['select_master_directive_snippet_txt'] = 'Diretiva mestre de trechos de código'; +$wb['unlimited_txt'] = 'Ilimitado'; ?> diff --git a/interface/lib/lang/ca.lng b/interface/lib/lang/ca.lng index c39cd0db27..6d48482cfc 100644 --- a/interface/lib/lang/ca.lng +++ b/interface/lib/lang/ca.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Illimité'; ?> diff --git a/interface/lib/lang/cz.lng b/interface/lib/lang/cz.lng index eeb0819292..93eeb671e5 100644 --- a/interface/lib/lang/cz.lng +++ b/interface/lib/lang/cz.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Smazat XMPP doménu'; $wb['datalog_status_i_xmpp_user'] = 'Vytvořit XMPP uživatele'; $wb['datalog_status_u_xmpp_user'] = 'Aktualizovat XMPP uživatele'; $wb['datalog_status_d_xmpp_user'] = 'Smazat XMPP uživatele'; +$wb['unlimited_txt'] = 'neomezeno'; ?> diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng index 61551ceeab..54091c1417 100644 --- a/interface/lib/lang/de.lng +++ b/interface/lib/lang/de.lng @@ -158,4 +158,5 @@ $wb['security_check1_txt'] = 'Sicherheitsüberprüfung für:'; $wb['security_check2_txt'] = 'fehlgeschlagen.'; $wb['select_directive_snippet_txt'] = 'Direktiven Schnipsel'; $wb['select_master_directive_snippet_txt'] = 'Master Direktiven Schnipsel'; +$wb['unlimited_txt'] = 'unlimitiert'; ?> diff --git a/interface/lib/lang/dk.lng b/interface/lib/lang/dk.lng index 798d2ccd45..cbb9fc5efd 100644 --- a/interface/lib/lang/dk.lng +++ b/interface/lib/lang/dk.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Ubegrænset'; ?> diff --git a/interface/lib/lang/el.lng b/interface/lib/lang/el.lng index 382bf4a758..3e6c60c90f 100644 --- a/interface/lib/lang/el.lng +++ b/interface/lib/lang/el.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Απεριόριστα'; ?> diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index 66f4ee3811..b5b2ebcdae 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -159,4 +159,5 @@ $wb['security_check1_txt'] = 'Check for security permission:'; $wb['security_check2_txt'] = 'failed.'; $wb['select_directive_snippet_txt'] = 'Directive Snippets'; $wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets'; -?> \ No newline at end of file +$wb['unlimited_txt'] = "Unlimited"; +?> diff --git a/interface/lib/lang/es.lng b/interface/lib/lang/es.lng index 3b1bae0b46..b78499f800 100644 --- a/interface/lib/lang/es.lng +++ b/interface/lib/lang/es.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Ilimitado'; ?> diff --git a/interface/lib/lang/fi.lng b/interface/lib/lang/fi.lng index d4c23ca777..27749510bb 100755 --- a/interface/lib/lang/fi.lng +++ b/interface/lib/lang/fi.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Unlimited'; ?> diff --git a/interface/lib/lang/fr.lng b/interface/lib/lang/fr.lng index 3e9bfa8daa..c302b32faa 100644 --- a/interface/lib/lang/fr.lng +++ b/interface/lib/lang/fr.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Illimité'; ?> diff --git a/interface/lib/lang/hr.lng b/interface/lib/lang/hr.lng index 310371be47..3be5dc7e16 100644 --- a/interface/lib/lang/hr.lng +++ b/interface/lib/lang/hr.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'neograničeno'; ?> diff --git a/interface/lib/lang/hu.lng b/interface/lib/lang/hu.lng index dd4cce79b3..3fc91bd600 100644 --- a/interface/lib/lang/hu.lng +++ b/interface/lib/lang/hu.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Korlátlan'; ?> diff --git a/interface/lib/lang/id.lng b/interface/lib/lang/id.lng index bd90fd5a1b..13fbff1a08 100644 --- a/interface/lib/lang/id.lng +++ b/interface/lib/lang/id.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Tak terbatas'; ?> diff --git a/interface/lib/lang/it.lng b/interface/lib/lang/it.lng index 33d16c3d5f..4a85a58e09 100644 --- a/interface/lib/lang/it.lng +++ b/interface/lib/lang/it.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'illimitati'; ?> diff --git a/interface/lib/lang/ja.lng b/interface/lib/lang/ja.lng index 2a56e77399..bb1290173c 100644 --- a/interface/lib/lang/ja.lng +++ b/interface/lib/lang/ja.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Unlimited'; ?> diff --git a/interface/lib/lang/nl.lng b/interface/lib/lang/nl.lng index 888f9c0200..a733142d49 100644 --- a/interface/lib/lang/nl.lng +++ b/interface/lib/lang/nl.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Ongelimiteerd'; ?> diff --git a/interface/lib/lang/pl.lng b/interface/lib/lang/pl.lng index b5b62c816d..ffbac09ef4 100644 --- a/interface/lib/lang/pl.lng +++ b/interface/lib/lang/pl.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'nielimitowane'; ?> diff --git a/interface/lib/lang/pt.lng b/interface/lib/lang/pt.lng index 7845520a5b..195da8e619 100644 --- a/interface/lib/lang/pt.lng +++ b/interface/lib/lang/pt.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Unlimited'; ?> diff --git a/interface/lib/lang/ro.lng b/interface/lib/lang/ro.lng index 613f2377a1..1365a54172 100644 --- a/interface/lib/lang/ro.lng +++ b/interface/lib/lang/ro.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Unlimited'; ?> diff --git a/interface/lib/lang/ru.lng b/interface/lib/lang/ru.lng index e5e8ce6278..19cdcf8a04 100644 --- a/interface/lib/lang/ru.lng +++ b/interface/lib/lang/ru.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Удалить домен XMPP'; $wb['datalog_status_i_xmpp_user'] = 'Создать пользователя XMPP'; $wb['datalog_status_u_xmpp_user'] = 'Обновить пользователя XMPP'; $wb['datalog_status_d_xmpp_user'] = 'Удалить пользователя XMPP'; +$wb['unlimited_txt'] = 'Безлимитный'; ?> diff --git a/interface/lib/lang/se.lng b/interface/lib/lang/se.lng index b6767144df..2d3146f033 100644 --- a/interface/lib/lang/se.lng +++ b/interface/lib/lang/se.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Obegränsat'; ?> diff --git a/interface/lib/lang/sk.lng b/interface/lib/lang/sk.lng index 6b4ef7676f..ece15b3a22 100644 --- a/interface/lib/lang/sk.lng +++ b/interface/lib/lang/sk.lng @@ -158,4 +158,5 @@ $wb['datalog_status_d_xmpp_domain'] = 'Delete XMPP domain'; $wb['datalog_status_i_xmpp_user'] = 'Create XMPP user'; $wb['datalog_status_u_xmpp_user'] = 'Update XMPP user'; $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; +$wb['unlimited_txt'] = 'Unlimited'; ?> diff --git a/interface/lib/lang/tr.lng b/interface/lib/lang/tr.lng index cf4491ad5d..31e5f2fbef 100644 --- a/interface/lib/lang/tr.lng +++ b/interface/lib/lang/tr.lng @@ -159,4 +159,5 @@ $wb['security_check1_txt'] = 'Güvenlik iznini denetle:'; $wb['security_check2_txt'] = 'başarısız.'; $wb['select_directive_snippet_txt'] = 'Yönerge Kod Parçaları'; $wb['select_master_directive_snippet_txt'] = 'Ana Komut Parçaları'; +$wb['unlimited_txt'] = 'Sınırsız'; ?> diff --git a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng index 6ec82aad5b..b15261dfc4 100644 --- a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng @@ -1,7 +1,6 @@ Date: Fri, 3 Jan 2020 14:40:30 +0100 Subject: [PATCH 0029/1368] add ipv6-addresses for ispconfig slave-users on the master-server (#5493) --- install/lib/installer_base.lib.php | 180 +++++++++++++++++------------ 1 file changed, 104 insertions(+), 76 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 513858ca68..0cf2ee23e7 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -409,80 +409,92 @@ class installer_base { } - + + public function get_host_ips() { + $out = array(); + exec('hostname --all-ip-addresses', $ret, $val); + if($val == 0) { + if(is_array($ret) && !empty($ret)){ + $temp = (explode(' ', $ret[0])); + foreach($temp as $ip) { + $out[] = $ip; + } + } + } + + return $out; + } + public function detect_ips(){ global $conf; + + $output = $this->get_host_ips(); - exec("ip addr show | awk '/global/ { print $2 }' | cut -d '/' -f 1", $output, $retval); - - if($retval == 0){ - if(is_array($output) && !empty($output)){ - foreach($output as $line){ - $line = trim($line); - $ip_type = ''; - if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { - $ip_type = 'IPv4'; - } - if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { - $ip_type = 'IPv6'; - } - if($ip_type == '') continue; - if($this->db->dbHost != $this->dbmaster->dbHost){ - $this->dbmaster->query('INSERT INTO server_ip ( - sys_userid, sys_groupid, sys_perm_user, sys_perm_group, - sys_perm_other, server_id, client_id, ip_type, ip_address, - virtualhost, virtualhost_port - ) VALUES ( - 1, - 1, - "riud", - "riud", - "", - ?, - 0, - ?, - ?, - "y", - "80,443" - )', $conf['server_id'], $ip_type, $line); - $server_ip_id = $this->dbmaster->insertID(); - $this->db->query('INSERT INTO server_ip ( - server_php_id, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, - sys_perm_other, server_id, client_id, ip_type, ip_address, - virtualhost, virtualhost_port - ) VALUES ( - ?, - 1, - 1, - "riud", - "riud", - "", - ?, - 0, - ?, - ?, - "y", - "80,443" - )', $server_ip_id, $conf['server_id'], $ip_type, $line); - } else { - $this->db->query('INSERT INTO server_ip ( - sys_userid, sys_groupid, sys_perm_user, sys_perm_group, - sys_perm_other, server_id, client_id, ip_type, ip_address, - virtualhost, virtualhost_port - ) VALUES ( - 1, - 1, - "riud", - "riud", - "", - ?, - 0, - ?, - ?, - "y", - "80,443" - )', $conf['server_id'], $ip_type, $line); - } + if(is_array($output) && !empty($output)){ + foreach($output as $line){ + $ip_type = ''; + if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { + $ip_type = 'IPv4'; + } + if (filter_var($line, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { + $ip_type = 'IPv6'; + } + if($ip_type == '') continue; + if($this->db->dbHost != $this->dbmaster->dbHost){ + $this->dbmaster->query('INSERT INTO server_ip ( + sys_userid, sys_groupid, sys_perm_user, sys_perm_group, + sys_perm_other, server_id, client_id, ip_type, ip_address, + virtualhost, virtualhost_port + ) VALUES ( + 1, + 1, + "riud", + "riud", + "", + ?, + 0, + ?, + ?, + "y", + "80,443" + )', $conf['server_id'], $ip_type, $line); + $server_ip_id = $this->dbmaster->insertID(); + $this->db->query('INSERT INTO server_ip ( + server_php_id, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, + sys_perm_other, server_id, client_id, ip_type, ip_address, + virtualhost, virtualhost_port + ) VALUES ( + ?, + 1, + 1, + "riud", + "riud", + "", + ?, + 0, + ?, + ?, + "y", + "80,443" + )', $server_ip_id, $conf['server_id'], $ip_type, $line); + } else { + $this->db->query('INSERT INTO server_ip ( + sys_userid, sys_groupid, sys_perm_user, sys_perm_group, + sys_perm_other, server_id, client_id, ip_type, ip_address, + virtualhost, virtualhost_port + ) VALUES ( + 1, + 1, + "riud", + "riud", + "", + ?, + 0, + ?, + ?, + "y", + "80,443" + )', $conf['server_id'], $ip_type, $line); } } } @@ -509,15 +521,23 @@ class installer_base { //* insert the ispconfig user in the remote server $from_host = $conf['hostname']; - $from_ip = gethostbyname($conf['hostname']); - $hosts[$from_host]['user'] = $conf['mysql']['master_ispconfig_user']; $hosts[$from_host]['db'] = $conf['mysql']['master_database']; $hosts[$from_host]['pwd'] = $conf['mysql']['master_ispconfig_password']; - $hosts[$from_ip]['user'] = $conf['mysql']['master_ispconfig_user']; - $hosts[$from_ip]['db'] = $conf['mysql']['master_database']; - $hosts[$from_ip]['pwd'] = $conf['mysql']['master_ispconfig_password']; + $host_ips = $this->get_host_ips(); + if(is_arary($host_ips) && !empty($host_ips)) { + foreach($host_ips as $ip) { + $hosts[$ip]['user'] = $conf['mysql']['master_ispconfig_user']; + $hosts[$ip]['db'] = $conf['mysql']['master_database']; + $hosts[$ip]['pwd'] = $conf['mysql']['master_ispconfig_password']; + } + } else { + $from_ip = gethostbyname($conf['hostname']); + $hosts[$from_ip]['user'] = $conf['mysql']['master_ispconfig_user']; + $hosts[$from_ip]['db'] = $conf['mysql']['master_database']; + $hosts[$from_ip]['pwd'] = $conf['mysql']['master_ispconfig_password']; + } } else{ /* * it is NOT a master-slave - Setup so we have to find out all clients and their @@ -696,6 +716,14 @@ class installer_base { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } + $query = "GRANT SELECT, INSERT, UPDATE ON ?? TO ?@?"; + if ($verbose){ + echo $query ."\n"; + } + if(!$this->dbmaster->query($query, $value['db'] . '.managed_php', $value['user'], $host)) { + $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); + } + } } -- GitLab From 2d03b4525a9574736c0f9312e7024d3652ac2b8c Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Fri, 3 Jan 2020 14:43:54 +0100 Subject: [PATCH 0030/1368] remove code from last commit --- install/lib/installer_base.lib.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 0cf2ee23e7..94ffd5703f 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -716,14 +716,6 @@ class installer_base { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - $query = "GRANT SELECT, INSERT, UPDATE ON ?? TO ?@?"; - if ($verbose){ - echo $query ."\n"; - } - if(!$this->dbmaster->query($query, $value['db'] . '.managed_php', $value['user'], $host)) { - $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); - } - } } -- GitLab From a08a29104365e40418ef7b5261f71cdec56adce1 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Tue, 7 Jan 2020 08:11:00 +0100 Subject: [PATCH 0031/1368] BUG - Cleanup website tmp directories (#5434) --- server/lib/classes/cron.d/200-logfiles.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/200-logfiles.inc.php b/server/lib/classes/cron.d/200-logfiles.inc.php index e2d9e9bb9e..203d3c0bda 100644 --- a/server/lib/classes/cron.d/200-logfiles.inc.php +++ b/server/lib/classes/cron.d/200-logfiles.inc.php @@ -217,7 +217,7 @@ class cronjob_logfiles extends cronjob { foreach($records as $rec){ $tmp_path = realpath($rec['document_root'].'/tmp'); if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){ - exec("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path); + $app->system->exec_safe("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path); } } } -- GitLab From 4b281bf70d5668769eda440bceeb4fb01d376a4d Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 14 Jan 2020 10:56:48 +0100 Subject: [PATCH 0032/1368] Fix exec to exec_safe to make placeholder work again, #5434 #5510 --- server/lib/classes/cron.d/200-logfiles.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/200-logfiles.inc.php b/server/lib/classes/cron.d/200-logfiles.inc.php index e2d9e9bb9e..203d3c0bda 100644 --- a/server/lib/classes/cron.d/200-logfiles.inc.php +++ b/server/lib/classes/cron.d/200-logfiles.inc.php @@ -217,7 +217,7 @@ class cronjob_logfiles extends cronjob { foreach($records as $rec){ $tmp_path = realpath($rec['document_root'].'/tmp'); if($tmp_path != '' && strlen($tmp_path) > 10 && is_dir($tmp_path) && $app->system->is_user($rec['system_user'])){ - exec("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path); + $app->system->exec_safe("cd ?; find . -mtime +1 -name 'sess_*' | grep -v -w .no_delete | xargs rm > /dev/null 2> /dev/null", $tmp_path); } } } -- GitLab From 88fd29a6c91f226ca4a2ffca536f30e80588ea59 Mon Sep 17 00:00:00 2001 From: Silviu CHINGARU Date: Thu, 16 Jan 2020 21:32:07 +0200 Subject: [PATCH 0033/1368] Fixes ispconfig/ispconfig3#5513 - right exposing tag method to template. --- .../plugins-available/rspamd_plugin.inc.php | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index 212cb2c21c..4812deb683 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -33,7 +33,7 @@ class rspamd_plugin { var $plugin_name = 'rspamd_plugin'; var $class_name = 'rspamd_plugin'; var $users_config_dir = '/etc/rspamd/local.d/users/'; - + //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. function onInstall() { @@ -98,7 +98,7 @@ class rspamd_plugin { return true; } - + /* This function is called when the plugin is loaded */ @@ -114,17 +114,17 @@ class rspamd_plugin { $app->plugins->registerEvent('spamfilter_wblist_insert', $this->plugin_name, 'spamfilter_wblist_insert'); $app->plugins->registerEvent('spamfilter_wblist_update', $this->plugin_name, 'spamfilter_wblist_update'); $app->plugins->registerEvent('spamfilter_wblist_delete', $this->plugin_name, 'spamfilter_wblist_delete'); - + //* global mail access filters $app->plugins->registerEvent('mail_access_insert', $this->plugin_name, 'spamfilter_wblist_insert'); $app->plugins->registerEvent('mail_access_update', $this->plugin_name, 'spamfilter_wblist_update'); $app->plugins->registerEvent('mail_access_delete', $this->plugin_name, 'spamfilter_wblist_delete'); - + //* server ip $app->plugins->registerEvent('server_ip_insert', $this->plugin_name, 'server_ip'); $app->plugins->registerEvent('server_ip_update', $this->plugin_name, 'server_ip'); $app->plugins->registerEvent('server_ip_delete', $this->plugin_name, 'server_ip'); - + //* spamfilter_users $app->plugins->registerEvent('spamfilter_users_insert', $this->plugin_name, 'user_settings_update'); $app->plugins->registerEvent('spamfilter_users_update', $this->plugin_name, 'user_settings_update'); @@ -141,11 +141,11 @@ class rspamd_plugin { function user_settings_update($event_name, $data) { global $app, $conf; - + if(!is_dir('/etc/rspamd')) { return; } - + $use_data = 'new'; if(substr($event_name, -7) === '_delete') { $mode = 'delete'; @@ -159,7 +159,7 @@ class rspamd_plugin { // get the config $app->uses('getconf,system,functions'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); - + $type = false; $identifier = false; $entry_id = false; @@ -180,7 +180,7 @@ class rspamd_plugin { $app->log('Invalid event name for rspamd_plugin: ' . $event_name, LOGLEVEL_WARN); return; } - + $is_domain = false; $email_address = $data[$use_data][$identifier]; $settings_name = $email_address; @@ -199,13 +199,13 @@ class rspamd_plugin { $email_address = '@' . $email_address; $is_domain = true; } - + if($settings_name == '') { // missing settings file name $app->log('Empty rspamd identifier in rspamd_plugin from identifier: ' . $use_data . '/' . $identifier, LOGLEVEL_WARN); return; } - + $settings_file = $this->users_config_dir . str_replace('@', '_', $settings_name) . '.conf'; //$app->log('Settings file for rspamd is ' . $settings_file, LOGLEVEL_WARN); if($mode === 'delete') { @@ -219,11 +219,11 @@ class rspamd_plugin { } elseif($is_domain === true) { $settings_priority = 18; } - + // get policy for entry if($type === 'spamfilter_user') { $policy = $app->db->queryOneRecord("SELECT * FROM spamfilter_policy WHERE id = ?", intval($data['new']['policy_id'])); - + $check = $app->db->queryOneRecord('SELECT `greylisting` FROM `mail_user` WHERE `server_id` = ? AND `email` = ? UNION SELECT `greylisting` FROM `mail_forwarding` WHERE `server_id` = ? AND `source` = ? ORDER BY (`greylisting` = ?) DESC', $conf['server_id'], $email_address, $conf['server_id'], $email_address, 'y'); if($check) { $greylisting = $check['greylisting']; @@ -233,16 +233,16 @@ class rspamd_plugin { } else { $search_for_policy[] = $email_address; $search_for_policy[] = substr($email_address, strpos($email_address, '@')); - + $policy = $app->db->queryOneRecord("SELECT p.* FROM spamfilter_users as u INNER JOIN spamfilter_policy as p ON (p.id = u.policy_id) WHERE u.server_id = ? AND u.email IN ? ORDER BY u.priority DESC", $conf['server_id'], $search_for_policy); - + $greylisting = $data[$use_data]['greylisting']; } - + if(!is_dir($this->users_config_dir)){ $app->system->mkdirpath($this->users_config_dir); } - + if(!$this->isValidEmail($app->functions->idn_encode($email_address))) { if(is_file($settings_file)) { unlink($settings_file); @@ -285,7 +285,7 @@ class rspamd_plugin { } $tpl->setVar('rspamd_spam_tag_level', floatval($policy['rspamd_spam_tag_level'])); - $tpl->setVar('rspamd_spam_tag_method', floatval($policy['rspamd_spam_tag_method'])); + $tpl->setVar('rspamd_spam_tag_method', $policy['rspamd_spam_tag_method']); $tpl->setVar('rspamd_spam_kill_level', floatval($policy['rspamd_spam_kill_level'])); $tpl->setVar('rspamd_virus_kill_level', floatval($policy['rspamd_spam_kill_level']) + 1000); @@ -324,7 +324,7 @@ class rspamd_plugin { $app->uses('getconf,system,functions'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); - + if(is_dir('/etc/rspamd')) { $global_filter = false; //* Create the config file @@ -354,12 +354,12 @@ class rspamd_plugin { ); } } - + if($data['new']['active'] == 'y' && is_array($filter) && !empty($filter)){ if(!is_dir($this->users_config_dir)){ $app->system->mkdirpath($this->users_config_dir); } - + $app->load('tpl'); $filter_from = $filter['from']; @@ -407,13 +407,13 @@ class rspamd_plugin { } elseif(is_file($wblist_file)) { unlink($wblist_file); } - + if($mail_config['content_filter'] == 'rspamd' && is_file('/etc/init.d/rspamd')) { $app->services->restartServiceDelayed('rspamd', 'reload'); } } } - + function spamfilter_wblist_delete($event_name, $data) { global $app, $conf; @@ -439,17 +439,17 @@ class rspamd_plugin { function server_ip($event_name, $data) { global $app, $conf; - + // get the config $app->uses("getconf,system"); $app->load('tpl'); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); - + if(is_dir('/etc/rspamd')) { $tpl = new tpl(); $tpl->newTemplate('rspamd_users.conf.master'); - + $whitelist_ips = array(); $ips = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ?", $conf['server_id']); if(is_array($ips) && !empty($ips)){ @@ -459,13 +459,13 @@ class rspamd_plugin { } $tpl->setLoop('whitelist_ips', $whitelist_ips); $app->system->file_put_contents('/etc/rspamd/local.d/users.conf', $tpl->grab()); - + if($mail_config['content_filter'] == 'rspamd'){ $app->services->restartServiceDelayed('rspamd', 'reload'); } } } - + private function _is_valid_ip_address($ip) { if(function_exists('filter_var')) { if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4 | FILTER_FLAG_IPV6)) { -- GitLab From dfe37d7241403e12f8d62d6e26a9044cc8594f80 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 17 Jan 2020 15:04:49 +0100 Subject: [PATCH 0034/1368] Fixed #5515 API client_template_additional_get always return just one template --- interface/lib/classes/remote.d/client.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/remote.d/client.inc.php b/interface/lib/classes/remote.d/client.inc.php index e07e227e60..1457bf569a 100644 --- a/interface/lib/classes/remote.d/client.inc.php +++ b/interface/lib/classes/remote.d/client.inc.php @@ -257,7 +257,7 @@ class remoting_client extends remoting { if(@is_numeric($client_id)) { $sql = "SELECT * FROM `client_template_assigned` WHERE `client_id` = ?"; - return $app->db->queryOneRecord($sql, $client_id); + return $app->db->queryAllRecords($sql, $client_id); } else { throw new SoapFault('The ID must be an integer.'); return array(); -- GitLab From a5cdc4751b17e972f47d98a496a9d6176c399148 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 22 Jan 2020 10:56:47 +0100 Subject: [PATCH 0035/1368] - merged request !945 to stable --- interface/web/dashboard/lib/lang/it.lng | 1 + .../lib/lang/it_dashlet_customer.lng | 4 ++-- .../lib/lang/it_dashlet_databasequota.lng | 8 +++---- .../dashboard/lib/lang/it_dashlet_limits.lng | 24 +++++++++---------- .../lib/lang/it_dashlet_mailquota.lng | 10 ++++---- .../dashboard/lib/lang/it_dashlet_modules.lng | 2 +- .../dashboard/lib/lang/it_dashlet_quota.lng | 12 +++++----- interface/web/login/lib/lang/it.lng | 20 ++++++++-------- 8 files changed, 41 insertions(+), 40 deletions(-) diff --git a/interface/web/dashboard/lib/lang/it.lng b/interface/web/dashboard/lib/lang/it.lng index db8858aafd..6a22e7cf5e 100644 --- a/interface/web/dashboard/lib/lang/it.lng +++ b/interface/web/dashboard/lib/lang/it.lng @@ -1,4 +1,5 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_customer.lng b/interface/web/dashboard/lib/lang/it_dashlet_customer.lng index 4fe6cb0ef7..bb6c2c5a6d 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_customer.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_customer.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng b/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng index bd2402dbf6..61ab6d9b21 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_databasequota.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng index dd83e1ad58..895f619864 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng @@ -1,14 +1,14 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng index 1ab1e66658..daaaa67f49 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_modules.lng b/interface/web/dashboard/lib/lang/it_dashlet_modules.lng index 69d5c07997..a80b302092 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_modules.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_modules.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_quota.lng b/interface/web/dashboard/lib/lang/it_dashlet_quota.lng index de7b5a8936..63799d2ee3 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_quota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_quota.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/login/lib/lang/it.lng b/interface/web/login/lib/lang/it.lng index 017d60df78..6d23aa0ccb 100644 --- a/interface/web/login/lib/lang/it.lng +++ b/interface/web/login/lib/lang/it.lng @@ -2,32 +2,32 @@ $wb['error_user_password_empty'] = 'Nome utente o password vuoti.'; $wb['error_user_password_incorrect'] = 'Nome utente o password errati.'; $wb['error_user_blocked'] = 'Utente bloccato.'; -$wb['error_user_too_many_logins'] = 'Troppi tentativi errati di login. Riprovare tra 15 minuti'; +$wb['error_user_too_many_logins'] = 'Troppi tentativi errati di login. Riprovare tra 15 minuti.'; $wb['pass_reset_txt'] = 'Una nuova password sarà generata e spedita alla tua email se lemail inserita corrisponde a quella delle impostazioni dellutente.'; $wb['pw_reset'] = 'La password è stata reimpostata e spedita al tuo indirizzo mail.'; -$wb['pw_error'] = 'Nome utente o email non corrispondenti.'; -$wb['pw_error_noinput'] = 'Inserisci nome utente e indirizzo email.'; -$wb['pw_reset_mail_msg'] = 'La password nel tuo pannello di controllo ISPConfig 3 è stata reimpostata. La nuova password è: '; -$wb['pw_reset_mail_title'] = 'Password del pannello di controllo ISPConfig 3 reimpostata.'; +$wb['pw_error'] = 'Nome utente o e-mail non corrispondenti.'; +$wb['pw_error_noinput'] = 'Inserisci nome utente e indirizzo e-mail.'; +$wb['pw_reset_mail_msg'] = 'La password nel tuo pannello di controllo è stata reimpostata. La nuova password è: '; +$wb['pw_reset_mail_title'] = 'Password del pannello di controllo reimpostata.'; $wb['user_regex_error'] = 'Nome utente contenente caratteri non permessi oppure più lungo di 64 caratteri.'; $wb['pw_error_length'] = 'Lunghezza password maggiore di 64 caratteri.'; $wb['username_txt'] = 'Nome utente'; $wb['password_txt'] = 'Password'; $wb['login_button_txt'] = 'Accedi'; $wb['pw_lost_txt'] = 'Password smarrita'; -$wb['error_maintenance_mode'] = 'Il pannello di controllo ISPConfig è in manutenzione. Saremo online tra breve. Grazie per la collaborazione.'; +$wb['error_maintenance_mode'] = 'Il pannello di controllo è in manutenzione.'; $wb['login_txt'] = 'Accedi'; $wb['pw_reset_txt'] = 'Password reset'; $wb['pw_button_txt'] = 'Invia password'; -$wb['email_txt'] = 'Email'; -$wb['theme_not_compatible'] = 'Il tema selezionato non è compatibile con questa versione del pannello ISPConfig. Verificare esistenza di una nuova versione del tema.
Il tema di default è stato attivato automaticamente.'; +$wb['email_txt'] = 'E-mail'; +$wb['theme_not_compatible'] = 'Il tema selezionato non è compatibile con questa versione del pannello. Verificare esistenza di una nuova versione del tema.
Il tema di default è stato attivato automaticamente.'; $wb['back_txt'] = 'Indietro'; $wb['email_error'] = 'Email contiene caratteri non autorizzati o un formato non valido.'; $wb['stay_logged_in_txt'] = 'Ricordami'; $wb['lost_password_function_disabled_txt'] = 'The lost password function is not available for this user.'; $wb['pw_reset_act'] = 'You have been sent an activation link. Please visit the link to confirm your password request.'; -$wb['pw_reset_act_mail_title'] = 'Confirm ISPConfig 3 Control panel password reset'; -$wb['pw_reset_act_mail_msg'] = 'Please confirm that your want to reset your ISPConfig 3 control panel account password by visiting the following activation link: '; +$wb['pw_reset_act_mail_title'] = 'Conferma reset password'; +$wb['pw_reset_act_mail_msg'] = 'Per confermare il reset della password si prega di visitare questo link: '; $wb['lost_password_function_wait_txt'] = 'You cannot request a new password, yet. Please wait a few minutes.'; $wb['lost_password_function_expired_txt'] = 'This activation link has expired. Please request a new one.'; $wb['lost_password_function_denied_txt'] = 'This activation link is not valid.'; -- GitLab From 0e59b84685f12dd7d0440d53390427da1267121c Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 24 Jan 2020 09:59:39 +0100 Subject: [PATCH 0036/1368] Fixed Typo in installer --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 94ffd5703f..346b62b9ab 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -526,7 +526,7 @@ class installer_base { $hosts[$from_host]['pwd'] = $conf['mysql']['master_ispconfig_password']; $host_ips = $this->get_host_ips(); - if(is_arary($host_ips) && !empty($host_ips)) { + if(is_array($host_ips) && !empty($host_ips)) { foreach($host_ips as $ip) { $hosts[$ip]['user'] = $conf['mysql']['master_ispconfig_user']; $hosts[$ip]['db'] = $conf['mysql']['master_database']; -- GitLab From f3065bc8f710619303123c7af16b05f056c5cda5 Mon Sep 17 00:00:00 2001 From: Xaver Maierhofer Date: Fri, 24 Jan 2020 10:18:53 +0100 Subject: [PATCH 0037/1368] Show 0 & -1 as unlimited in database stats --- interface/web/sites/database_quota_stats.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/web/sites/database_quota_stats.php b/interface/web/sites/database_quota_stats.php index 4e960bce27..03431a6ded 100644 --- a/interface/web/sites/database_quota_stats.php +++ b/interface/web/sites/database_quota_stats.php @@ -37,7 +37,7 @@ if(is_array($tmp_rec)) { } else { $temp['username'] = 'admin'; } - + if(is_array($temp) && !empty($temp)) { $monitor_data[$server_id.'.'.$db_name]['database_name'] = $data['database_name']; $monitor_data[$server_id.'.'.$db_name]['client'] = isset($temp['username']) ? $temp['username'] : ''; @@ -61,7 +61,7 @@ class list_action extends listform_actions { $rec['bgcolor'] = $this->DataRowColor; $database_name = $rec['database_name']; - + if(!empty($monitor_data[$rec['server_id'].'.'.$database_name])){ $rec['database'] = $monitor_data[$rec['server_id'].'.'.$database_name]['database_name']; $rec['client'] = $monitor_data[$rec['server_id'].'.'.$database_name]['client']; @@ -71,7 +71,7 @@ class list_action extends listform_actions { $rec['used'] = $monitor_data[$rec['server_id'].'.'.$database_name]['used']; $rec['quota'] = $monitor_data[$rec['server_id'].'.'.$database_name]['quota']; - if($rec['quota'] == 0){ + if($rec['quota'] <= 0){ $rec['quota'] = $app->lng('unlimited_txt'); $rec['percentage'] = ''; } else { -- GitLab From a64c9c806330edfb0785a193fd2e0cea70d1bbdf Mon Sep 17 00:00:00 2001 From: Xaver Maierhofer Date: Fri, 24 Jan 2020 10:19:52 +0100 Subject: [PATCH 0038/1368] Sort list quota correct --- interface/lib/classes/listform_actions.inc.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/interface/lib/classes/listform_actions.inc.php b/interface/lib/classes/listform_actions.inc.php index 4a463fe015..097b41fc0d 100644 --- a/interface/lib/classes/listform_actions.inc.php +++ b/interface/lib/classes/listform_actions.inc.php @@ -39,6 +39,7 @@ class listform_actions { private $sortKeys; private function _sort($aOne, $aTwo) { + $suffixes=array('k' => 1, 'M' => 1024, 'G' => 1048576, 'T' => 1099511627776); if(!is_array($aOne) || !is_array($aTwo)) return 0; if(!is_array($this->sortKeys)) $this->sortKeys = array($this->sortKeys); @@ -49,6 +50,15 @@ class listform_actions { } $a = $aOne[$sKey]; $b = $aTwo[$sKey]; + + if(preg_match('/(\d+\.?\d*) ([kMGT])B/', $a, $match)) { + $a = $match[1] * $suffixes[$match[2]]; + } + + if(preg_match('/(\d+\.?\d*) ([kMGT])B/', $b, $match)) { + $b = $match[1] * $suffixes[$match[2]]; + } + if(is_string($a)) $a = strtolower($a); if(is_string($b)) $b = strtolower($b); if($a < $b) return $sDir == 'DESC' ? 1 : -1; @@ -129,7 +139,7 @@ class listform_actions { // Getting Datasets from DB $records = $app->db->queryAllRecords($this->getQueryString($php_sort)); - + $csrf_token = $app->auth->csrf_token_get($app->listform->listDef['name']); $_csrf_id = $csrf_token['csrf_id']; $_csrf_key = $csrf_token['csrf_key']; -- GitLab From d77fdaa724830384065f1c7dbabf9240b3459b1f Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Fri, 24 Jan 2020 12:29:13 +0100 Subject: [PATCH 0039/1368] Add conf-custom support for security_settings.ini (Fixes #5480) --- install/lib/installer_base.lib.php | 23 +++++-------------- .../tpl/security_settings.ini.master | 0 2 files changed, 6 insertions(+), 17 deletions(-) rename security/security_settings.ini => install/tpl/security_settings.ini.master (100%) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 346b62b9ab..e5ac1428d8 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2478,24 +2478,13 @@ class installer_base { //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - //* Apply changed security_settings.ini values to new security_settings.ini file - if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { - $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); - $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini')); - if(is_array($security_settings_new) && is_array($security_settings_old)) { - foreach($security_settings_new as $section => $sval) { - if(is_array($sval)) { - foreach($sval as $key => $val) { - if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) { - $security_settings_new[$section][$key] = $security_settings_old[$section][$key]; - } - } - } - } - file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new)); - } + + $configfile = 'security_settings.ini'; + if(is_file($install_dir.'/security/'.$configfile)) { + copy($install_dir.'/security/'.$configfile, $install_dir.'/security/'.$configfile.'~'); } + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + wf($install_dir.'/security/'.$configfile, $content); //* Create a symlink, so ISPConfig is accessible via web // Replaced by a separate vhost definition for port 8080 diff --git a/security/security_settings.ini b/install/tpl/security_settings.ini.master similarity index 100% rename from security/security_settings.ini rename to install/tpl/security_settings.ini.master -- GitLab From 8238d0400fd80f57426b875fcfede2731ffddb4d Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Mon, 27 Jan 2020 11:07:13 +0100 Subject: [PATCH 0040/1368] Workaround to set app_module context to mail, #5448 --- interface/web/mail/mail_user_edit.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 263b98ef31..d291367d11 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -70,6 +70,9 @@ class page_action extends tform_actions { function onShowEnd() { global $app, $conf; + // Workaround for #5448, accessed via link on quota dashlet. + $app->tpl->setVar('app_module', 'mail'); + $email = $this->dataRecord["email"]; $email_parts = explode("@", $email); $app->tpl->setVar("email_local_part", $email_parts[0]); -- GitLab From 080c722a11bded37d6d66d9872a2161d0ec4a25f Mon Sep 17 00:00:00 2001 From: Xaver Maierhofer Date: Tue, 28 Jan 2020 10:30:52 +0100 Subject: [PATCH 0041/1368] Do not index and follow --- interface/web/themes/default/templates/main.tpl.htm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/web/themes/default/templates/main.tpl.htm b/interface/web/themes/default/templates/main.tpl.htm index 15aa44e148..0cdd2f89b3 100644 --- a/interface/web/themes/default/templates/main.tpl.htm +++ b/interface/web/themes/default/templates/main.tpl.htm @@ -8,7 +8,7 @@ - + /assets/stylesheets/bootstrap.min.css' /> /assets/stylesheets/fonts.min.css' /> @@ -123,15 +123,15 @@ \ No newline at end of file + diff --git a/interface/web/sites/templates/web_folder_edit.htm b/interface/web/sites/templates/web_folder_edit.htm index dd24094434..e3fef0e477 100644 --- a/interface/web/sites/templates/web_folder_edit.htm +++ b/interface/web/sites/templates/web_folder_edit.htm @@ -1,10 +1,3 @@ - -

- - - Folder
diff --git a/interface/web/sites/templates/web_vhost_domain_advanced.htm b/interface/web/sites/templates/web_vhost_domain_advanced.htm index 11f95d9cbd..f1df422bad 100644 --- a/interface/web/sites/templates/web_vhost_domain_advanced.htm +++ b/interface/web/sites/templates/web_vhost_domain_advanced.htm @@ -1,8 +1,3 @@ - -

-

{tmpl_var name='configuration_error_txt'}

diff --git a/interface/web/sites/templates/web_vhost_domain_backup.htm b/interface/web/sites/templates/web_vhost_domain_backup.htm index c31a579fc2..8c8aa11bee 100644 --- a/interface/web/sites/templates/web_vhost_domain_backup.htm +++ b/interface/web/sites/templates/web_vhost_domain_backup.htm @@ -1,8 +1,3 @@ - -

-

{tmpl_var name='configuration_error_txt'}

@@ -12,7 +7,6 @@
- Backup
@@ -31,4 +24,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_blacklist_edit.htm b/interface/web/mail/templates/mail_blacklist_edit.htm index c68729cbce..24ad67e569 100644 --- a/interface/web/mail/templates/mail_blacklist_edit.htm +++ b/interface/web/mail/templates/mail_blacklist_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -42,4 +35,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_domain_catchall_edit.htm b/interface/web/mail/templates/mail_domain_catchall_edit.htm index 5991f2aecc..0ccae15a8f 100644 --- a/interface/web/mail/templates/mail_domain_catchall_edit.htm +++ b/interface/web/mail/templates/mail_domain_catchall_edit.htm @@ -1,8 +1,4 @@ - -

-
+<
@@ -33,4 +29,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_domain_edit.htm b/interface/web/mail/templates/mail_domain_edit.htm index 71a6655e80..1e4a49c2a5 100644 --- a/interface/web/mail/templates/mail_domain_edit.htm +++ b/interface/web/mail/templates/mail_domain_edit.htm @@ -1,11 +1,4 @@ - -

- - - - +
diff --git a/interface/web/mail/templates/mail_forward_edit.htm b/interface/web/mail/templates/mail_forward_edit.htm index 7c1fca0299..a5de2a00b7 100644 --- a/interface/web/mail/templates/mail_forward_edit.htm +++ b/interface/web/mail/templates/mail_forward_edit.htm @@ -1,8 +1,3 @@ - -

-
diff --git a/interface/web/mail/templates/mail_get_edit.htm b/interface/web/mail/templates/mail_get_edit.htm index f3d8a3b0f4..6b5b8c198e 100644 --- a/interface/web/mail/templates/mail_get_edit.htm +++ b/interface/web/mail/templates/mail_get_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -28,4 +21,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_transport_edit.htm b/interface/web/mail/templates/mail_transport_edit.htm index e0332de1b6..694e57634d 100644 --- a/interface/web/mail/templates/mail_transport_edit.htm +++ b/interface/web/mail/templates/mail_transport_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -30,4 +23,4 @@ -
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_user_backup.htm b/interface/web/mail/templates/mail_user_backup.htm index f9abba3bba..0de61a3297 100644 --- a/interface/web/mail/templates/mail_user_backup.htm +++ b/interface/web/mail/templates/mail_user_backup.htm @@ -1,8 +1,3 @@ - -

-

{tmpl_var name='configuration_error_txt'}

diff --git a/interface/web/mail/templates/mail_user_custom_rules_edit.htm b/interface/web/mail/templates/mail_user_custom_rules_edit.htm index d12378678c..263ea7916a 100644 --- a/interface/web/mail/templates/mail_user_custom_rules_edit.htm +++ b/interface/web/mail/templates/mail_user_custom_rules_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -16,4 +9,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_user_filter_edit.htm b/interface/web/mail/templates/mail_user_filter_edit.htm index cb2d79a249..6a7983c64e 100644 --- a/interface/web/mail/templates/mail_user_filter_edit.htm +++ b/interface/web/mail/templates/mail_user_filter_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -32,4 +25,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_user_mailbox_edit.htm b/interface/web/mail/templates/mail_user_mailbox_edit.htm index bcab744de3..a90799cf11 100644 --- a/interface/web/mail/templates/mail_user_mailbox_edit.htm +++ b/interface/web/mail/templates/mail_user_mailbox_edit.htm @@ -1,10 +1,3 @@ - -

- - -
  {tmpl_var name='name_optional_txt'} diff --git a/interface/web/mail/templates/mail_user_mailfilter_edit.htm b/interface/web/mail/templates/mail_user_mailfilter_edit.htm index 183a98b5e3..fc40398d5d 100644 --- a/interface/web/mail/templates/mail_user_mailfilter_edit.htm +++ b/interface/web/mail/templates/mail_user_mailfilter_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -20,4 +13,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mail/templates/mail_whitelist_edit.htm b/interface/web/mail/templates/mail_whitelist_edit.htm index 1f72e6935f..575a6ae2fb 100644 --- a/interface/web/mail/templates/mail_whitelist_edit.htm +++ b/interface/web/mail/templates/mail_whitelist_edit.htm @@ -1,10 +1,3 @@ - -

- - -

{tmpl_var name='name_hint_txt'}

@@ -45,4 +38,4 @@ searchFieldWatermark: '', resultBoxPosition: '' }); - \ No newline at end of file + diff --git a/interface/web/dns/templates/dns_aaaa_edit.htm b/interface/web/dns/templates/dns_aaaa_edit.htm index fbbc757cec..13ee0ccaab 100644 --- a/interface/web/dns/templates/dns_aaaa_edit.htm +++ b/interface/web/dns/templates/dns_aaaa_edit.htm @@ -1,10 +1,3 @@ - -

- - -

{tmpl_var name='name_hint_txt'}

@@ -45,4 +38,4 @@ searchFieldWatermark: '', resultBoxPosition: '' }); - \ No newline at end of file + diff --git a/interface/web/dns/templates/dns_alias_edit.htm b/interface/web/dns/templates/dns_alias_edit.htm index 5ab2a3ccaa..ad6c74d863 100644 --- a/interface/web/dns/templates/dns_alias_edit.htm +++ b/interface/web/dns/templates/dns_alias_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_caa_edit.htm b/interface/web/dns/templates/dns_caa_edit.htm index 3de64818b4..8d4372d9a9 100644 --- a/interface/web/dns/templates/dns_caa_edit.htm +++ b/interface/web/dns/templates/dns_caa_edit.htm @@ -1,6 +1,3 @@ - -

-
diff --git a/interface/web/dns/templates/dns_cname_edit.htm b/interface/web/dns/templates/dns_cname_edit.htm index 778279cbd8..3b37e5133d 100644 --- a/interface/web/dns/templates/dns_cname_edit.htm +++ b/interface/web/dns/templates/dns_cname_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_dkim_edit.htm b/interface/web/dns/templates/dns_dkim_edit.htm index 310dda1c9e..be3bea3dd5 100644 --- a/interface/web/dns/templates/dns_dkim_edit.htm +++ b/interface/web/dns/templates/dns_dkim_edit.htm @@ -1,7 +1,3 @@ - - -

-
diff --git a/interface/web/dns/templates/dns_dmarc_edit.htm b/interface/web/dns/templates/dns_dmarc_edit.htm index 4b7646a398..668b29f8df 100644 --- a/interface/web/dns/templates/dns_dmarc_edit.htm +++ b/interface/web/dns/templates/dns_dmarc_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/dns/templates/dns_ds_edit.htm b/interface/web/dns/templates/dns_ds_edit.htm index 56113f0ec0..c7012d9fd9 100644 --- a/interface/web/dns/templates/dns_ds_edit.htm +++ b/interface/web/dns/templates/dns_ds_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_hinfo_edit.htm b/interface/web/dns/templates/dns_hinfo_edit.htm index 0be975f529..39a02dabbc 100644 --- a/interface/web/dns/templates/dns_hinfo_edit.htm +++ b/interface/web/dns/templates/dns_hinfo_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_import.htm b/interface/web/dns/templates/dns_import.htm index 87d54316f3..dafb9016a0 100644 --- a/interface/web/dns/templates/dns_import.htm +++ b/interface/web/dns/templates/dns_import.htm @@ -62,4 +62,4 @@ jQuery('.positive').trigger('click'); } } - \ No newline at end of file + diff --git a/interface/web/dns/templates/dns_loc_edit.htm b/interface/web/dns/templates/dns_loc_edit.htm index 12cfb6357f..d8e261991c 100644 --- a/interface/web/dns/templates/dns_loc_edit.htm +++ b/interface/web/dns/templates/dns_loc_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_mx_edit.htm b/interface/web/dns/templates/dns_mx_edit.htm index 290c218faf..3a84cbacb4 100644 --- a/interface/web/dns/templates/dns_mx_edit.htm +++ b/interface/web/dns/templates/dns_mx_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -32,4 +25,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_ns_edit.htm b/interface/web/dns/templates/dns_ns_edit.htm index 3cafa17daf..6644af152c 100644 --- a/interface/web/dns/templates/dns_ns_edit.htm +++ b/interface/web/dns/templates/dns_ns_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_ptr_edit.htm b/interface/web/dns/templates/dns_ptr_edit.htm index de59069259..725bbb17fa 100644 --- a/interface/web/dns/templates/dns_ptr_edit.htm +++ b/interface/web/dns/templates/dns_ptr_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file + diff --git a/interface/web/dns/templates/dns_records_edit.htm b/interface/web/dns/templates/dns_records_edit.htm index a2a42c3d45..979cebe5fd 100644 --- a/interface/web/dns/templates/dns_records_edit.htm +++ b/interface/web/dns/templates/dns_records_edit.htm @@ -1,8 +1,3 @@ - -

-
{tmpl_var name='dns_records'} @@ -11,4 +6,4 @@
- \ No newline at end of file + diff --git a/interface/web/dns/templates/dns_rp_edit.htm b/interface/web/dns/templates/dns_rp_edit.htm index 3dd04adf1a..9a4b9f4e55 100644 --- a/interface/web/dns/templates/dns_rp_edit.htm +++ b/interface/web/dns/templates/dns_rp_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file + diff --git a/interface/web/dns/templates/dns_slave_edit.htm b/interface/web/dns/templates/dns_slave_edit.htm index 832fec1abc..1f4f7234d6 100644 --- a/interface/web/dns/templates/dns_slave_edit.htm +++ b/interface/web/dns/templates/dns_slave_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/dns/templates/dns_soa_edit.htm b/interface/web/dns/templates/dns_soa_edit.htm index 7a069cb3bf..ce8154c857 100644 --- a/interface/web/dns/templates/dns_soa_edit.htm +++ b/interface/web/dns/templates/dns_soa_edit.htm @@ -1,8 +1,3 @@ - -

-

{tmpl_var name='configuration_error_txt'}

@@ -10,7 +5,6 @@
- DNS Zone
diff --git a/interface/web/dns/templates/dns_spf_edit.htm b/interface/web/dns/templates/dns_spf_edit.htm index fc7400d620..2817d7645b 100644 --- a/interface/web/dns/templates/dns_spf_edit.htm +++ b/interface/web/dns/templates/dns_spf_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/dns/templates/dns_srv_edit.htm b/interface/web/dns/templates/dns_srv_edit.htm index fd9f00d7b4..f142f482d4 100644 --- a/interface/web/dns/templates/dns_srv_edit.htm +++ b/interface/web/dns/templates/dns_srv_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -38,4 +31,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_template_edit.htm b/interface/web/dns/templates/dns_template_edit.htm index 9de8c93447..db0ee9d925 100644 --- a/interface/web/dns/templates/dns_template_edit.htm +++ b/interface/web/dns/templates/dns_template_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/dns/templates/dns_tlsa_edit.htm b/interface/web/dns/templates/dns_tlsa_edit.htm index c2cde8be61..297077eecb 100644 --- a/interface/web/dns/templates/dns_tlsa_edit.htm +++ b/interface/web/dns/templates/dns_tlsa_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/dns/templates/dns_txt_edit.htm b/interface/web/dns/templates/dns_txt_edit.htm index f03f6d36c8..de69bc553e 100644 --- a/interface/web/dns/templates/dns_txt_edit.htm +++ b/interface/web/dns/templates/dns_txt_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file + diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm index 907dedca88..2f4f24b4e0 100644 --- a/interface/web/dns/templates/dns_wizard.htm +++ b/interface/web/dns/templates/dns_wizard.htm @@ -1,14 +1,12 @@ -

-
diff --git a/interface/web/tools/templates/interface_settings.htm b/interface/web/tools/templates/interface_settings.htm index ccd5000445..6767287206 100644 --- a/interface/web/tools/templates/interface_settings.htm +++ b/interface/web/tools/templates/interface_settings.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -26,4 +19,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/tools/templates/resync.htm b/interface/web/tools/templates/resync.htm index 3e66290fb0..ef3ac886c8 100644 --- a/interface/web/tools/templates/resync.htm +++ b/interface/web/tools/templates/resync.htm @@ -1,8 +1,3 @@ - -

-
diff --git a/interface/web/tools/templates/user_settings.htm b/interface/web/tools/templates/user_settings.htm index 26f9e0c861..4fa1c9de34 100644 --- a/interface/web/tools/templates/user_settings.htm +++ b/interface/web/tools/templates/user_settings.htm @@ -1,8 +1,3 @@ - -

-
@@ -43,4 +38,4 @@
-
\ No newline at end of file +
-- GitLab From 499745fdfa6bf31802a9de05647a538a26408815 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Wed, 27 May 2020 22:21:59 +0200 Subject: [PATCH 0133/1368] Removed double / empty titles and descriptions --- interface/web/help/templates/faq_edit.htm | 4 +--- interface/web/help/templates/faq_sections_edit.htm | 3 --- interface/web/help/templates/support_message_edit.htm | 9 +-------- interface/web/help/templates/support_message_view.htm | 9 +-------- 4 files changed, 3 insertions(+), 22 deletions(-) diff --git a/interface/web/help/templates/faq_edit.htm b/interface/web/help/templates/faq_edit.htm index 3bf9d8a903..d0f9760511 100644 --- a/interface/web/help/templates/faq_edit.htm +++ b/interface/web/help/templates/faq_edit.htm @@ -1,5 +1,3 @@ - - {tmpl_var name='faq_faq_txt'}
@@ -11,4 +9,3 @@
- diff --git a/interface/web/help/templates/support_message_edit.htm b/interface/web/help/templates/support_message_edit.htm index fb54578e16..a01cb31076 100644 --- a/interface/web/help/templates/support_message_edit.htm +++ b/interface/web/help/templates/support_message_edit.htm @@ -1,10 +1,3 @@ - -

- - - {tmpl_var name='message_txt'}
diff --git a/interface/web/admin/templates/firewall_edit.htm b/interface/web/admin/templates/firewall_edit.htm index cd643a8caf..07fe3d0ff5 100644 --- a/interface/web/admin/templates/firewall_edit.htm +++ b/interface/web/admin/templates/firewall_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -19,4 +18,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/admin/templates/remote_user_edit.htm b/interface/web/admin/templates/remote_user_edit.htm index 099af58eb5..723c3e6966 100644 --- a/interface/web/admin/templates/remote_user_edit.htm +++ b/interface/web/admin/templates/remote_user_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/admin/templates/server_edit_services.htm b/interface/web/admin/templates/server_edit_services.htm index 2775e029d3..b0aca56b17 100644 --- a/interface/web/admin/templates/server_edit_services.htm +++ b/interface/web/admin/templates/server_edit_services.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/admin/templates/server_ip_edit.htm b/interface/web/admin/templates/server_ip_edit.htm index 85f06432e8..f0e0eb78d7 100644 --- a/interface/web/admin/templates/server_ip_edit.htm +++ b/interface/web/admin/templates/server_ip_edit.htm @@ -1,10 +1,3 @@ - -

- - - {tmpl_var name='server_ip_edit_title'}
@@ -18,4 +11,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/admin/templates/server_php_fpm_edit.htm b/interface/web/admin/templates/server_php_fpm_edit.htm index 4186584f0f..372b3702fc 100644 --- a/interface/web/admin/templates/server_php_fpm_edit.htm +++ b/interface/web/admin/templates/server_php_fpm_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -21,4 +14,4 @@
-
\ No newline at end of file + diff --git a/interface/web/admin/templates/server_php_name_edit.htm b/interface/web/admin/templates/server_php_name_edit.htm index cfdaab63f9..ab1d889ef9 100644 --- a/interface/web/admin/templates/server_php_name_edit.htm +++ b/interface/web/admin/templates/server_php_name_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -30,4 +23,4 @@
-
\ No newline at end of file + diff --git a/interface/web/admin/templates/system_config_mail_edit.htm b/interface/web/admin/templates/system_config_mail_edit.htm index 526da2502a..af0a7a25ca 100644 --- a/interface/web/admin/templates/system_config_mail_edit.htm +++ b/interface/web/admin/templates/system_config_mail_edit.htm @@ -1,10 +1,3 @@ - -

- - -
diff --git a/interface/web/admin/templates/system_config_misc_edit.htm b/interface/web/admin/templates/system_config_misc_edit.htm index 00debd66dc..95014ab809 100644 --- a/interface/web/admin/templates/system_config_misc_edit.htm +++ b/interface/web/admin/templates/system_config_misc_edit.htm @@ -1,7 +1,3 @@ - -

+
+ + diff --git a/remoting_client/API-docs/dns_naptr_delete.html b/remoting_client/API-docs/dns_naptr_delete.html new file mode 100644 index 0000000000..376bd18aa2 --- /dev/null +++ b/remoting_client/API-docs/dns_naptr_delete.html @@ -0,0 +1,29 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
+

dns_naptr_delete($session_id, $primary_id);

+
+

Description:

+

Deletes target dns naptr resource record.


+

Input Variables:

+

$session_id, $primary_id

+

Parameters (in $params):

+

None

+

Output:

+

Returns the number of deleted records.

+ +
+ + diff --git a/remoting_client/API-docs/dns_naptr_get.html b/remoting_client/API-docs/dns_naptr_get.html new file mode 100644 index 0000000000..eb3d6b0eda --- /dev/null +++ b/remoting_client/API-docs/dns_naptr_get.html @@ -0,0 +1,29 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
+

dns_naptr_get($session_id, $primary_id);

+
+

Description:

+

Retrieves information about target dns naptr resource record.


+

Input Variables:

+

$session_id, $primary_id

+

Parameters (in $params):

+

None

+

Output:

+

Returns all fields and values of the chosen dns naptr resource record.

+ +
+ + diff --git a/remoting_client/API-docs/dns_naptr_update.html b/remoting_client/API-docs/dns_naptr_update.html new file mode 100644 index 0000000000..97f40f056f --- /dev/null +++ b/remoting_client/API-docs/dns_naptr_update.html @@ -0,0 +1,38 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
+

dns_naptr_update($session_id, $client_id, $primary_id, $params);

+
+Description: +

Updates a dns server location record if type is naptr.


+Input Variables: +

$session_id, $client_id, $primary_id, $params

+Parameters (in $params): +

server_id  (int(11))

+

zone  (int(11))

+

name  (varchar(64))

+

type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

+

data  (varchar(255))

+

aux  (int(11))

+

ttl  (int(11))

+

active  (enum('n','y'))

+

stamp  (timestamp)

+

serial  (int(10))

+Output: +

Returns the number of affected rows.

+ +
+ + diff --git a/remoting_client/API-docs/navigation.html b/remoting_client/API-docs/navigation.html index 02b5876b3d..89ef7bc8e4 100644 --- a/remoting_client/API-docs/navigation.html +++ b/remoting_client/API-docs/navigation.html @@ -75,6 +75,10 @@

dns_mx_delete

dns_mx_get

dns_mx_update

+

dns_naptr_add

+

dns_naptr_delete

+

dns_naptr_get

+

dns_naptr_update

dns_ns_add

dns_ns_delete

dns_ns_get

-- GitLab From c169e5846574b946f72d498447830ee3bde0c564 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 28 Apr 2020 16:01:57 -0600 Subject: [PATCH 0144/1368] add dns_naptr_* api examples --- remoting_client/examples/dns_naptr_add.php | 58 +++++++++++++++++++ remoting_client/examples/dns_naptr_delete.php | 45 ++++++++++++++ remoting_client/examples/dns_naptr_get.php | 45 ++++++++++++++ remoting_client/examples/dns_naptr_update.php | 53 +++++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 remoting_client/examples/dns_naptr_add.php create mode 100644 remoting_client/examples/dns_naptr_delete.php create mode 100644 remoting_client/examples/dns_naptr_get.php create mode 100644 remoting_client/examples/dns_naptr_update.php diff --git a/remoting_client/examples/dns_naptr_add.php b/remoting_client/examples/dns_naptr_add.php new file mode 100644 index 0000000000..5abd220d1b --- /dev/null +++ b/remoting_client/examples/dns_naptr_add.php @@ -0,0 +1,58 @@ + [ + // set some SSL/TLS specific options + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] +]); + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1, + 'stream_context' => $context)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
'; + } + + $timestamp = date("Y-m-d H:i:s"); + + //* Set the function parameters. + $client_id = 1; + $params = array( + 'server_id' => 1, + 'zone' => 10, + 'name' => 'server', + 'type' => 'naptr', + 'data' => '100 "s" "thttp+L2R" "" thttp.example.com.', + 'aux' => '100', + 'ttl' => '3600', + 'active' => 'y', + 'stamp' => $timestamp, + 'serial' => '1', + ); + + $id = $client->dns_naptr_add($session_id, $client_id, $params); + + echo "ID: ".$id."
"; + + if($client->logout($session_id)) { + echo 'Logged out.
'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_naptr_delete.php b/remoting_client/examples/dns_naptr_delete.php new file mode 100644 index 0000000000..ca252132f0 --- /dev/null +++ b/remoting_client/examples/dns_naptr_delete.php @@ -0,0 +1,45 @@ + [ + // set some SSL/TLS specific options + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] +]); + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1, + 'stream_context' => $context)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
'; + } + + //* Parameters + $id = 11; + + + $affected_rows = $client->dns_naptr_delete($session_id, $id); + + echo "Number of records that have been deleted: ".$affected_rows."
"; + + if($client->logout($session_id)) { + echo 'Logged out.
'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_naptr_get.php b/remoting_client/examples/dns_naptr_get.php new file mode 100644 index 0000000000..db9dffde9b --- /dev/null +++ b/remoting_client/examples/dns_naptr_get.php @@ -0,0 +1,45 @@ + [ + // set some SSL/TLS specific options + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] +]); + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1, + 'stream_context' => $context)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
'; + } + + //* Set the function parameters. + $id = 11; + + $dns_record = $client->dns_naptr_get($session_id, $id); + + print_r($dns_record); + + if($client->logout($session_id)) { + echo 'Logged out.
'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_naptr_update.php b/remoting_client/examples/dns_naptr_update.php new file mode 100644 index 0000000000..9b0784a69d --- /dev/null +++ b/remoting_client/examples/dns_naptr_update.php @@ -0,0 +1,53 @@ + [ + // set some SSL/TLS specific options + 'verify_peer' => false, + 'verify_peer_name' => false, + 'allow_self_signed' => true + ] +]); + + +$client = new SoapClient(null, array('location' => $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1, + 'stream_context' => $context)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
'; + } + + //* Parameters + $id = 11; + $client_id = 1; + + + //* Get the dns record + $dns_record = $client->dns_naptr_get($session_id, $id); + + //* Change active to inactive + $dns_record['active'] = 'n'; + + $affected_rows = $client->dns_naptr_update($session_id, $client_id, $id, $dns_record); + + echo "Number of records that have been changed in the database: ".$affected_rows."
"; + + if($client->logout($session_id)) { + echo 'Logged out.
'; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> -- GitLab From 8e0dbf86b4d2d2dc718b318d0b8ba9597d7f7cc2 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 27 May 2020 12:24:42 -0600 Subject: [PATCH 0145/1368] change to long array syntax --- remoting_client/examples/dns_naptr_add.php | 8 ++++---- remoting_client/examples/dns_naptr_delete.php | 8 ++++---- remoting_client/examples/dns_naptr_get.php | 8 ++++---- remoting_client/examples/dns_naptr_update.php | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/remoting_client/examples/dns_naptr_add.php b/remoting_client/examples/dns_naptr_add.php index 5abd220d1b..e6665a5c4b 100644 --- a/remoting_client/examples/dns_naptr_add.php +++ b/remoting_client/examples/dns_naptr_add.php @@ -2,14 +2,14 @@ require 'soap_config.php'; -$context = stream_context_create([ - 'ssl' => [ +$context = stream_context_create( array( + 'ssl' => array( // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true - ] -]); + ), +)); $client = new SoapClient(null, array('location' => $soap_location, diff --git a/remoting_client/examples/dns_naptr_delete.php b/remoting_client/examples/dns_naptr_delete.php index ca252132f0..1d794ccea7 100644 --- a/remoting_client/examples/dns_naptr_delete.php +++ b/remoting_client/examples/dns_naptr_delete.php @@ -2,14 +2,14 @@ require 'soap_config.php'; -$context = stream_context_create([ - 'ssl' => [ +$context = stream_context_create( array( + 'ssl' => array( // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true - ] -]); + ), +)); $client = new SoapClient(null, array('location' => $soap_location, diff --git a/remoting_client/examples/dns_naptr_get.php b/remoting_client/examples/dns_naptr_get.php index db9dffde9b..b9beec45f4 100644 --- a/remoting_client/examples/dns_naptr_get.php +++ b/remoting_client/examples/dns_naptr_get.php @@ -3,14 +3,14 @@ require 'soap_config.php'; -$context = stream_context_create([ - 'ssl' => [ +$context = stream_context_create( array( + 'ssl' => array( // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true - ] -]); + ), +)); $client = new SoapClient(null, array('location' => $soap_location, diff --git a/remoting_client/examples/dns_naptr_update.php b/remoting_client/examples/dns_naptr_update.php index 9b0784a69d..1f97464687 100644 --- a/remoting_client/examples/dns_naptr_update.php +++ b/remoting_client/examples/dns_naptr_update.php @@ -3,14 +3,14 @@ require 'soap_config.php'; -$context = stream_context_create([ - 'ssl' => [ +$context = stream_context_create( array( + 'ssl' => array( // set some SSL/TLS specific options 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true - ] -]); + ), +)); $client = new SoapClient(null, array('location' => $soap_location, -- GitLab From eb3c7baafd7848210ba82fa75eae2e9fa8d59b98 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 27 May 2020 12:30:08 -0600 Subject: [PATCH 0146/1368] add dns_tlsa_* remote api functions. fixes #4360 --- interface/lib/classes/remote.d/dns.inc.php | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 98589f55c4..1d9ec35f54 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -604,6 +604,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_tlsa_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'TLSA'); + } + + //* Add a record + public function dns_tlsa_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'TLSA'); + } + + //* Update a record + public function dns_tlsa_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'TLSA'); + } + + //* Delete a record + public function dns_tlsa_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'TLSA'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_txt_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'TXT'); -- GitLab From 4c0c99a37ac8a7d78db906b784db6dfce2c263cc Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 27 May 2020 12:36:23 -0600 Subject: [PATCH 0147/1368] add dns_caa_* remote api functions. fixes #5559 --- interface/lib/classes/remote.d/dns.inc.php | 22 ++++++++++++++++++++++ interface/web/dns/lib/remote.conf.php | 1 + 2 files changed, 23 insertions(+) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 1d9ec35f54..36180ace3e 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -428,6 +428,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_cname_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'CAA'); + } + + //* Add a record + public function dns_cname_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'CAA'); + } + + //* Update a record + public function dns_cname_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'CAA'); + } + + //* Delete a record + public function dns_cname_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'CAA'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_cname_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'CNAME'); diff --git a/interface/web/dns/lib/remote.conf.php b/interface/web/dns/lib/remote.conf.php index 376d65df7e..ea725de8a4 100644 --- a/interface/web/dns/lib/remote.conf.php +++ b/interface/web/dns/lib/remote.conf.php @@ -4,6 +4,7 @@ $function_list['dns_zone_get,dns_zone_get_id,dns_zone_add,dns_zone_update,dns_zo $function_list['dns_a_get,dns_a_add,dns_a_update,dns_a_delete'] = 'DNS a functions'; $function_list['dns_aaaa_get,dns_aaaa_add,dns_aaaa_update,dns_aaaa_delete'] = 'DNS aaaa functions'; $function_list['dns_alias_get,dns_alias_add,dns_alias_update,dns_alias_delete'] = 'DNS alias functions'; +$function_list['dns_caa_get,dns_caa_add,dns_caa_update,dns_caa_delete'] = 'DNS caa functions'; $function_list['dns_cname_get,dns_cname_add,dns_cname_update,dns_cname_delete'] = 'DNS cname functions'; $function_list['dns_ds_get,dns_ds_add,dns_ds_update,dns_ds_delete'] = 'DNS ds functions'; $function_list['dns_hinfo_get,dns_hinfo_add,dns_hinfo_update,dns_hinfo_delete'] = 'DNS hinfo functions'; -- GitLab From 050e0333b8b00d85240a2b721003d451f9536232 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 29 May 2020 10:33:50 -0600 Subject: [PATCH 0148/1368] check AAAA and CNAME for duplicate records. fixes #5623 --- interface/web/dns/dns_aaaa_edit.php | 8 ++++++++ interface/web/dns/dns_cname_edit.php | 2 +- interface/web/dns/lib/lang/ar_dns_a.lng | 2 +- interface/web/dns/lib/lang/ar_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/bg_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/br_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/ca_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/cz_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/de_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/dk_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/el_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/en_dns_a.lng | 4 ++-- interface/web/dns/lib/lang/en_dns_aaaa.lng | 3 ++- interface/web/dns/lib/lang/es_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/fi_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/fr_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/hr_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/hu_dns_a.lng | 2 +- interface/web/dns/lib/lang/hu_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/id_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/it_dns_a.lng | 2 +- interface/web/dns/lib/lang/it_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/ja_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/nl_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/pl_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/pt_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/ro_dns_a.lng | 2 +- interface/web/dns/lib/lang/ro_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/ru_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/se_dns_a.lng | 2 +- interface/web/dns/lib/lang/se_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/sk_dns_aaaa.lng | 1 + interface/web/dns/lib/lang/tr_dns_aaaa.lng | 1 + 33 files changed, 42 insertions(+), 9 deletions(-) diff --git a/interface/web/dns/dns_aaaa_edit.php b/interface/web/dns/dns_aaaa_edit.php index 006e71cf4c..780fbcc80e 100644 --- a/interface/web/dns/dns_aaaa_edit.php +++ b/interface/web/dns/dns_aaaa_edit.php @@ -45,6 +45,14 @@ require_once './dns_edit_base.php'; // Loading classes class page_action extends dns_page_action { + protected function checkDuplicate() { + global $app; + //* Check for duplicates where IP and hostname are the same + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'AAAA' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + if($tmp['number'] > 0) return true; + return false; + } + } $page = new page_action; diff --git a/interface/web/dns/dns_cname_edit.php b/interface/web/dns/dns_cname_edit.php index 403650c1c4..1f17169e60 100644 --- a/interface/web/dns/dns_cname_edit.php +++ b/interface/web/dns/dns_cname_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/lib/lang/ar_dns_a.lng b/interface/web/dns/lib/lang/ar_dns_a.lng index 7543672a94..68e40da5e7 100644 --- a/interface/web/dns/lib/lang/ar_dns_a.lng +++ b/interface/web/dns/lib/lang/ar_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_aaaa.lng b/interface/web/dns/lib/lang/ar_dns_aaaa.lng index 0b7e38ac65..3d634780f1 100644 --- a/interface/web/dns/lib/lang/ar_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ar_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_aaaa.lng b/interface/web/dns/lib/lang/bg_dns_aaaa.lng index 37ad45726f..d4efae73db 100644 --- a/interface/web/dns/lib/lang/bg_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/bg_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Вие нямате право да добавяте за $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_aaaa.lng b/interface/web/dns/lib/lang/br_dns_aaaa.lng index 1a3cfb2d27..2f81a52a0c 100644 --- a/interface/web/dns/lib/lang/br_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/br_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns ne $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'Endereço IPv6 está em branco.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'O endereço IPv6 possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_aaaa.lng b/interface/web/dns/lib/lang/ca_dns_aaaa.lng index e29a5cbf0d..c06b153dc2 100644 --- a/interface/web/dns/lib/lang/ca_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ca_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_aaaa.lng b/interface/web/dns/lib/lang/cz_dns_aaaa.lng index e28e9a8b73..9c59cea715 100644 --- a/interface/web/dns/lib/lang/cz_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/cz_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny.'; $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'IP adresa je prázdná'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_aaaa.lng b/interface/web/dns/lib/lang/de_dns_aaaa.lng index 4fe054d367..a225723f89 100644 --- a/interface/web/dns/lib/lang/de_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/de_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Sie haben nicht die Berechtigung, einen Eintrag zu dieser $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv6 Adresse ist leer'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IPv6 Adressen Format ist ungültig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_aaaa.lng b/interface/web/dns/lib/lang/dk_dns_aaaa.lng index 664d63b41c..27a7fae538 100644 --- a/interface/web/dns/lib/lang/dk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/dk_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_aaaa.lng b/interface/web/dns/lib/lang/el_dns_aaaa.lng index 5ca896c732..faced402b1 100644 --- a/interface/web/dns/lib/lang/el_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/el_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Δεν έχετε δικαίωμα να προσθέσε $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Διεύθυνση IP κενή'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_a.lng b/interface/web/dns/lib/lang/en_dns_a.lng index dbba7fb6e8..510d04f34d 100644 --- a/interface/web/dns/lib/lang/en_dns_a.lng +++ b/interface/web/dns/lib/lang/en_dns_a.lng @@ -12,6 +12,6 @@ $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'IP-Address empty'; $wb["ip_error_wrong"] = 'IP-Address format invalid'; -$wb["data_error_duplicate"] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -?> \ No newline at end of file +?> diff --git a/interface/web/dns/lib/lang/en_dns_aaaa.lng b/interface/web/dns/lib/lang/en_dns_aaaa.lng index 201a4d9584..1272fb8587 100644 --- a/interface/web/dns/lib/lang/en_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/en_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb["no_zone_perm"] = 'You do not have the permission to add a record to this DN $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb["ip_error_wrong"] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -?> \ No newline at end of file +?> diff --git a/interface/web/dns/lib/lang/es_dns_aaaa.lng b/interface/web/dns/lib/lang/es_dns_aaaa.lng index 8851ef84ff..957feabdb5 100644 --- a/interface/web/dns/lib/lang/es_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/es_dns_aaaa.lng @@ -1,6 +1,7 @@ diff --git a/interface/web/dns/lib/lang/fr_dns_aaaa.lng b/interface/web/dns/lib/lang/fr_dns_aaaa.lng index 1cc3722de5..280acdcea4 100644 --- a/interface/web/dns/lib/lang/fr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fr_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_aaaa.lng b/interface/web/dns/lib/lang/hr_dns_aaaa.lng index d8a3419309..76fc600703 100644 --- a/interface/web/dns/lib/lang/hr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hr_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nemate dozvolu za dodavanja zapisa ovoj domeni.'; $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IPv6 adresa je prazno'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'Neispravan format IPv6 adrese'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_a.lng b/interface/web/dns/lib/lang/hu_dns_a.lng index 3e52e94b9f..4820079b53 100644 --- a/interface/web/dns/lib/lang/hu_dns_a.lng +++ b/interface/web/dns/lib/lang/hu_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_aaaa.lng b/interface/web/dns/lib/lang/hu_dns_aaaa.lng index f78f42d186..5f261eeb5f 100644 --- a/interface/web/dns/lib/lang/hu_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hu_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_aaaa.lng b/interface/web/dns/lib/lang/id_dns_aaaa.lng index 68cab83271..3257ba193f 100644 --- a/interface/web/dns/lib/lang/id_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/id_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Anda tidak memiliki hak untuk menambah record ke zona DNS $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng index 122560b487..9aa9e1186f 100644 --- a/interface/web/dns/lib/lang/it_dns_a.lng +++ b/interface/web/dns/lib/lang/it_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname vuoto.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng index 2746bb887d..e82ada0166 100644 --- a/interface/web/dns/lib/lang/it_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DN $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Indirizzo Ip vuoto'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_aaaa.lng b/interface/web/dns/lib/lang/ja_dns_aaaa.lng index 2c859b7416..3f10406659 100644 --- a/interface/web/dns/lib/lang/ja_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ja_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'このDNSゾーンにレコードを追加する権限が $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_aaaa.lng b/interface/web/dns/lib/lang/nl_dns_aaaa.lng index 298193c1e8..139cc71ded 100644 --- a/interface/web/dns/lib/lang/nl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/nl_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'U heeft geen toestemming om een record toe te voegen aan $wb['name_error_empty'] = 'De hostnaam is niet ingvuld'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingevuld'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_aaaa.lng b/interface/web/dns/lib/lang/pl_dns_aaaa.lng index 867d73ab97..86d93fe71f 100644 --- a/interface/web/dns/lib/lang/pl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pl_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nie masz uprawnień, aby dodać nowy wpis w tej strefie D $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_aaaa.lng b/interface/web/dns/lib/lang/pt_dns_aaaa.lng index 04698ced19..9fc3798dc8 100644 --- a/interface/web/dns/lib/lang/pt_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pt_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Não tem permissão para adicionar registos a está zona $wb['name_error_empty'] = 'O Hostname está em branco.'; $wb['name_error_regex'] = 'O Hostname está com formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'Endereço-IP com formato inválido'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_a.lng b/interface/web/dns/lib/lang/ro_dns_a.lng index f2f6a46c43..b8c2522432 100644 --- a/interface/web/dns/lib/lang/ro_dns_a.lng +++ b/interface/web/dns/lib/lang/ro_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname necompletat'; $wb['name_error_regex'] = 'Hostname format gresit'; $wb['data_error_empty'] = 'IP-Adresa vid'; $wb['ip_error_wrong'] = 'IP-Adresa format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_aaaa.lng b/interface/web/dns/lib/lang/ro_dns_aaaa.lng index 0b7e38ac65..3d634780f1 100644 --- a/interface/web/dns/lib/lang/ro_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ro_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_aaaa.lng b/interface/web/dns/lib/lang/ru_dns_aaaa.lng index 4620b53eaa..e8a02443d3 100644 --- a/interface/web/dns/lib/lang/ru_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ru_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'У Вас нет прав добавлять эту за $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Неправильный формат имени хоста.'; $wb['data_error_empty'] = 'Пустой IP-адрес'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_a.lng b/interface/web/dns/lib/lang/se_dns_a.lng index 7543672a94..68e40da5e7 100644 --- a/interface/web/dns/lib/lang/se_dns_a.lng +++ b/interface/web/dns/lib/lang/se_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_aaaa.lng b/interface/web/dns/lib/lang/se_dns_aaaa.lng index 0b7e38ac65..3d634780f1 100644 --- a/interface/web/dns/lib/lang/se_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/se_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_aaaa.lng b/interface/web/dns/lib/lang/sk_dns_aaaa.lng index 78d5cc6c4c..246ac1dd23 100644 --- a/interface/web/dns/lib/lang/sk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/sk_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnenie Pridať záznam do tejto zóny DNS.'; $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP-Adresa prázdna'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP-Adresa má zlý formát'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_aaaa.lng b/interface/web/dns/lib/lang/tr_dns_aaaa.lng index 1726f80a8f..d75ff802bb 100644 --- a/interface/web/dns/lib/lang/tr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/tr_dns_aaaa.lng @@ -11,6 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adının biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; $wb['ip_error_wrong'] = 'IP adresinin biçimi geçersiz'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> -- GitLab From b36e2a011b5add564f39ebbcc41ccfefe98dd23d Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Mon, 1 Jun 2020 22:47:18 +0200 Subject: [PATCH 0149/1368] Removed double/empty titles and descriptions --- interface/web/mailuser/templates/index.htm | 3 +-- .../templates/mail_user_autoresponder_edit.htm | 12 +++--------- .../web/mailuser/templates/mail_user_cc_edit.htm | 9 +-------- .../web/mailuser/templates/mail_user_filter_edit.htm | 9 +-------- .../mailuser/templates/mail_user_password_edit.htm | 9 +-------- .../mailuser/templates/mail_user_spamfilter_edit.htm | 9 +-------- 6 files changed, 8 insertions(+), 43 deletions(-) diff --git a/interface/web/mailuser/templates/index.htm b/interface/web/mailuser/templates/index.htm index 8f87035562..5f065f9fa4 100644 --- a/interface/web/mailuser/templates/index.htm +++ b/interface/web/mailuser/templates/index.htm @@ -1,7 +1,6 @@ -

@@ -33,4 +32,4 @@
-
\ No newline at end of file + diff --git a/interface/web/mailuser/templates/mail_user_autoresponder_edit.htm b/interface/web/mailuser/templates/mail_user_autoresponder_edit.htm index 98b28cebf8..898f285e53 100644 --- a/interface/web/mailuser/templates/mail_user_autoresponder_edit.htm +++ b/interface/web/mailuser/templates/mail_user_autoresponder_edit.htm @@ -1,13 +1,7 @@ - -

- - -
-
+
+
@@ -30,4 +24,4 @@ -
\ No newline at end of file + diff --git a/interface/web/mailuser/templates/mail_user_cc_edit.htm b/interface/web/mailuser/templates/mail_user_cc_edit.htm index 7c59fadf11..914f74ae3f 100644 --- a/interface/web/mailuser/templates/mail_user_cc_edit.htm +++ b/interface/web/mailuser/templates/mail_user_cc_edit.htm @@ -1,10 +1,3 @@ - -

- - -
{tmpl_var name='email'}
@@ -20,4 +13,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mailuser/templates/mail_user_filter_edit.htm b/interface/web/mailuser/templates/mail_user_filter_edit.htm index b09874263b..441ffba484 100644 --- a/interface/web/mailuser/templates/mail_user_filter_edit.htm +++ b/interface/web/mailuser/templates/mail_user_filter_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -29,4 +22,4 @@
-
\ No newline at end of file + diff --git a/interface/web/mailuser/templates/mail_user_password_edit.htm b/interface/web/mailuser/templates/mail_user_password_edit.htm index b487a1e9b2..c7a28dc48e 100644 --- a/interface/web/mailuser/templates/mail_user_password_edit.htm +++ b/interface/web/mailuser/templates/mail_user_password_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -44,4 +37,4 @@
-
\ No newline at end of file +
diff --git a/interface/web/mailuser/templates/mail_user_spamfilter_edit.htm b/interface/web/mailuser/templates/mail_user_spamfilter_edit.htm index 3528daead1..6675846769 100644 --- a/interface/web/mailuser/templates/mail_user_spamfilter_edit.htm +++ b/interface/web/mailuser/templates/mail_user_spamfilter_edit.htm @@ -1,10 +1,3 @@ - -

- - -
@@ -24,4 +17,4 @@
-
\ No newline at end of file +
-- GitLab From 09cf5d6507c0aea27edefe0c1e2ea17c9f7b3719 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 2 Jun 2020 17:28:23 -0600 Subject: [PATCH 0150/1368] update sql patch instructions. fixes #5630 --- install/sql/README.txt | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/install/sql/README.txt b/install/sql/README.txt index fe15ce5403..d1294363c1 100644 --- a/install/sql/README.txt +++ b/install/sql/README.txt @@ -9,18 +9,24 @@ then follow these steps: 1) Add the field or table in the ispconfig3.sql file. This file contains the complete database dump which is used when ISPConfig gets installed. -2) Create a new file in the "incremental" subfolder wich contains the alter - table, or if it is a complete new table then the add table, statement(s) in - MySQL syntax which is/are required to modify the current ispconfig database - during update. The naming scheme of the sql patch update files is - upd_0001.sql, upd_0002.sql, upd_0003.sql etc. Ensure that the number that - you choose for the new file is a +1 increment of the number of the last - existing file and that the number is formatted with 4 digits. +2) Edit the file "incremental/upd_dev_collection.sql" which contains the SQL + statements (alter table, add table, update, etc.) in MySQL syntax which + are required to modify the current ispconfig database during update. + + The upd_dev_collection.sql file contains all db schema modifications + for changes made since the last ISPConfig release. If SQL statements + are already present in the file when you make your additions, add yours + to the end of the file, and do not remove any existing statements. + + When a new ISPConfig update is released, the contents of + upd_dev_collections.sql will move to an sql patch file, using the naming + scheme upd_0001.sql, upd_0002.sql, upd_0003.sql etc. - A patch file may contain one or more alter table statements. Every patch file - gets executed once in the database, so do not modify older (already released) + A patch file may contain one or more SQL modification statements. Every patch + file gets executed once in the database, so do not modify older (already released) patch files, they will not get executed again if the update was already run - once on a system. + once on a system, and will result in missing updates on any system where they + have not run yet. After a patch has been executed, the dbversion field in the server table gets increeased to the version number of the last installed patch. -- GitLab From 8e584ee86a155a02cb29a478ef3f298af744f8ec Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 3 Jun 2020 09:10:14 +0200 Subject: [PATCH 0151/1368] - updated README for incremental sql files --- install/sql/README.txt | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/install/sql/README.txt b/install/sql/README.txt index fe15ce5403..97a07a4863 100644 --- a/install/sql/README.txt +++ b/install/sql/README.txt @@ -9,18 +9,15 @@ then follow these steps: 1) Add the field or table in the ispconfig3.sql file. This file contains the complete database dump which is used when ISPConfig gets installed. -2) Create a new file in the "incremental" subfolder wich contains the alter - table, or if it is a complete new table then the add table, statement(s) in - MySQL syntax which is/are required to modify the current ispconfig database - during update. The naming scheme of the sql patch update files is - upd_0001.sql, upd_0002.sql, upd_0003.sql etc. Ensure that the number that - you choose for the new file is a +1 increment of the number of the last - existing file and that the number is formatted with 4 digits. +2) Add your ALTER TABLE, or if it is a complete new table then the add table, + statement(s) in MySQL syntax which is/are required to modify the current + ispconfig database during update to the file upd_dev_collection.sql in the + sql/incremental subfolder. - A patch file may contain one or more alter table statements. Every patch file - gets executed once in the database, so do not modify older (already released) - patch files, they will not get executed again if the update was already run - once on a system. + Please do not create new patch sql files as those will be generated on + new releases from the upd_dev_collection.sql file. Also please do not + modify older (already released) patch files, they will not get executed + again if the update was already run once on a system. After a patch has been executed, the dbversion field in the server table gets increeased to the version number of the last installed patch. -- GitLab From b34b1ad5bbc8d75db927116b517e6a23761e42bb Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 4 Jun 2020 13:53:35 +0200 Subject: [PATCH 0152/1368] Improved cron debug script --- server/cron_debug.php | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/server/cron_debug.php b/server/cron_debug.php index 74065f02c4..fbf59ebc26 100644 --- a/server/cron_debug.php +++ b/server/cron_debug.php @@ -39,20 +39,25 @@ ini_set('error_reporting', E_ALL & ~E_NOTICE); $conf['server_id'] = intval($conf['server_id']); // Load required base-classes -$app->uses('modules,plugins,ini_parser,file,services,getconf,system,cron,functions'); +$app->uses('ini_parser,file,services,getconf,system,cron,functions'); $app->load('libdatetime,cronjob'); // Path settings $path = SCRIPT_PATH . '/lib/classes/cron.d'; //** Get commandline options -$cmd_opt = getopt('', array('cronjob::')); +$cmd_opt = getopt('', array('cronjob::', 'force', 'firstrun')); if(isset($cmd_opt['cronjob']) && is_file($path.'/'.$cmd_opt['cronjob'])) { // Cronjob that shell be run $cronjob_file = $cmd_opt['cronjob']; } else { - die('Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php'); + echo "Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php [--force] [--firstrun]\n" ; + echo "Available cronjobs:\n"; + foreach(glob($path.'/*-*.inc.php') as $cronjob) { + echo basename($cronjob)."\n"; + } + die(); } // Load and run the cronjob @@ -61,8 +66,20 @@ if(preg_match('/^\d+\-(.*)$/', $name, $match)) $name = $match[1]; // strip numer include $path . '/' . $cronjob_file; $class_name = 'cronjob_' . $name; $cronjob = new $class_name(); -$cronjob->run(true); + +if(isset($cmd_opt['force'])) { + $app->db->query("UPDATE `sys_cron` SET `running` = 0 WHERE `name` = ?", $class_name); +} + +$cronjob->onPrepare(); +$cronjob->onBeforeRun(isset($cmd_opt['firstrun'])); +if(!$cronjob->isRunning()) { + $app->db->query("UPDATE `sys_cron` SET `running` = ? WHERE `name` = ?", ($cronjob->canBeRunInParallel() !== true ? "1" : "0"), $class_name); + $cronjob->onRunJob(); + $cronjob->onAfterRun(); + $cronjob->onCompleted(); +} die("finished.\n"); -?> +?> \ No newline at end of file -- GitLab From c798155c8fe85e102ef00e7b939ffa5bade22fd5 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 6 Jun 2020 21:23:27 +0200 Subject: [PATCH 0153/1368] Added translations from #5477 --- interface/web/mail/lib/lang/de_mail_user.lng | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index 2c230e34ff..b60a756b09 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -57,9 +57,9 @@ $wb['daily_backup_txt'] = 'taeglich'; $wb['weekly_backup_txt'] = 'woechentlich'; $wb['monthly_backup_txt'] = 'monatlich'; $wb['cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; -$wb['sender_cc_txt'] = 'Send outgoing BCC to'; -$wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['autoresponder_start_date_is_required'] = 'Startdatum muss angegeben werden.'; +$wb['sender_cc_txt'] = 'Kopie ausgehender Emails senden an (BCC)'; +$wb['sender_cc_error_isemail'] = '-Kopie ausgehender Emails senden an- Feld enthält keine gültige Emailadresse'; +$wb['sender_cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; $wb['password_click_to_set_txt'] = 'Click to set'; ?> -- GitLab From 39c195b86a60fb1892d2836a59afe5495b434051 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 6 Jun 2020 21:26:23 +0200 Subject: [PATCH 0154/1368] Added translations from #4962 --- interface/web/sites/lib/lang/de_web_childdomain_list.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/sites/lib/lang/de_web_childdomain_list.lng b/interface/web/sites/lib/lang/de_web_childdomain_list.lng index a9bdf2861a..3ba596cbcd 100644 --- a/interface/web/sites/lib/lang/de_web_childdomain_list.lng +++ b/interface/web/sites/lib/lang/de_web_childdomain_list.lng @@ -10,8 +10,8 @@ $wb['domain_error_regex'] = 'Domain Name ist ungültig.'; $wb['no_redirect_txt'] = 'Keine Weiterleitung'; $wb['no_flag_txt'] = 'Keine Optionen'; $wb['none_txt'] = 'Keine'; -$wb['add_new_subdomain_txt'] = 'Add new Subdomain'; -$wb['add_new_aliasdomain_txt'] = 'Add new Aliasdomain'; +$wb['add_new_subdomain_txt'] = 'Neue Subdomain hinzufügen'; +$wb['add_new_aliasdomain_txt'] = 'Neue Aliasdomain hinzufügen'; $wb['aliasdomain_list_head_txt'] = 'Aliasdomains'; $wb['subdomain_list_head_txt'] = 'Subdomains'; $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; -- GitLab From 413bc63b61f5d382d1a0c888b4002bc8e54d4236 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 6 Jun 2020 22:26:58 +0200 Subject: [PATCH 0155/1368] Add translation for Zone File Import (#4311) --- interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/br_dns_soa_list.lng | 1 + interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/de_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/el_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/en_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/es_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/id_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/it_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/se_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng | 1 + interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng | 1 + interface/web/dns/templates/dns_soa_admin_list.htm | 2 +- 26 files changed, 26 insertions(+), 1 deletion(-) diff --git a/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ar_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/bg_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_soa_list.lng b/interface/web/dns/lib/lang/br_dns_soa_list.lng index 969df1d2a9..d9fb674b87 100644 --- a/interface/web/dns/lib/lang/br_dns_soa_list.lng +++ b/interface/web/dns/lib/lang/br_dns_soa_list.lng @@ -7,4 +7,5 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'e-Mail'; $wb['add_new_record_wizard_txt'] = 'Adicionar nova zona dns através do assistente'; $wb['add_new_record_txt'] = 'Adicionar nova zona dns manualmente'; +$wb['zone_file_import_txt'] = 'Importar arquivo de zona'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng index ff6fe695ae..0f477a473a 100644 --- a/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ca_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Courriel'; $wb['add_new_record_wizard_txt'] = 'Assistant de création de zone'; $wb['add_new_record_txt'] = 'Création manuel de zone'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng index 0ec5de4f6d..a4f27d2472 100644 --- a/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/cz_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'Vytvořit DNS zónu pomocí průvodce'; $wb['add_new_record_txt'] = 'Vytvořit DNS zónu manuálně'; +$wb['import_zone_file_txt'] = 'Importovat DNS zonový soubor'; $wb['sys_groupid_txt'] = 'Klient'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng index 363369c65b..294cd3b128 100644 --- a/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/de_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-Mail'; $wb['add_new_record_txt'] = 'Neue DNS Zone (SOA) hinzufügen'; $wb['add_new_record_wizard_txt'] = 'Neue DNS Zone per Assistent hinzufügen'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Kunde'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng index 32728405bb..f25d33ee67 100644 --- a/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/dk_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'Tilføj ny DNS Zone med Guide'; $wb['add_new_record_txt'] = 'Tilføj ny DNS Zone manuelt'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Kunde'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/el_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng index 44cec900b9..f7f815079d 100644 --- a/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/en_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb["ns_txt"] = 'NS'; $wb["mbox_txt"] = 'Email'; $wb["add_new_record_wizard_txt"] = 'Add new DNS Zone with Wizard'; $wb["add_new_record_txt"] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb["sys_groupid_txt"] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng index aeb2618de3..087ebd80ed 100755 --- a/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/es_dns_soa_admin_list.lng @@ -2,6 +2,7 @@ $wb['active_txt'] = 'Habilitado'; $wb['add_new_record_txt'] = 'Añadir nueva Zona DNS manualmente'; $wb['add_new_record_wizard_txt'] = 'Añadir nueva Zona DNS usando el asistente'; +$wb['import_zone_file_txt'] = 'Importar archivo de zona'; $wb['list_head_txt'] = 'Zonas DNS'; $wb['mbox_txt'] = 'Email'; $wb['ns_txt'] = 'NS'; diff --git a/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/fi_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng index e4d52ffee5..0e5779a0a2 100644 --- a/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/fr_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng index 1dc2853bcf..f8753a3465 100644 --- a/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/hr_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Dodaj novu DNS zonu sa čarobnjakom'; $wb['add_new_record_txt'] = 'Dodaj novu DNS zonu ručno'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Klijent'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/hu_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/id_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng index 5f0c730599..a7cce01001 100644 --- a/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Aggiungi un nuovo DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Cliente'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ja_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng index 2ac184dd91..5231e47e22 100644 --- a/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/nl_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'E-mail'; $wb['add_new_record_wizard_txt'] = 'DNS Zone via wizard toevoegen'; $wb['add_new_record_txt'] = 'DNS Zone manueel toevoegen'; +$wb['import_zone_file_txt'] = 'Importeer zone bestand'; $wb['sys_groupid_txt'] = 'Klant'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/pl_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/pt_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ro_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng index 47940f9e8d..d3d7be7183 100644 --- a/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/ru_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Адрес эл. почты'; $wb['add_new_record_wizard_txt'] = 'Добавить новую DNS-зону с помощью мастера'; $wb['add_new_record_txt'] = 'Добавить новую DNS-зону вручную'; +$wb['import_zone_file_txt'] = 'Импорт файла зоны'; $wb['sys_groupid_txt'] = 'Клиент'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/se_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng index 183d1a8349..74ba785900 100644 --- a/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/sk_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['add_new_record_wizard_txt'] = 'Add new DNS Zone with Wizard'; $wb['add_new_record_txt'] = 'Add new DNS Zone manually'; +$wb['import_zone_file_txt'] = 'Import Zone File'; $wb['sys_groupid_txt'] = 'Client'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng index 490cdc7b4f..6f0bc7f985 100644 --- a/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/tr_dns_soa_admin_list.lng @@ -7,5 +7,6 @@ $wb['ns_txt'] = 'Ad Sunucusu'; $wb['mbox_txt'] = 'E-posta'; $wb['add_new_record_wizard_txt'] = 'Yardımcı ile DNS Bölgesi Ekle'; $wb['add_new_record_txt'] = 'El ile DNS Bölgesi Ekle'; +$wb['import_zone_file_txt'] = 'Bölge Dosyasını İçe Aktar'; $wb['sys_groupid_txt'] = 'Müşteri'; ?> diff --git a/interface/web/dns/templates/dns_soa_admin_list.htm b/interface/web/dns/templates/dns_soa_admin_list.htm index 79faa645fe..646b129578 100644 --- a/interface/web/dns/templates/dns_soa_admin_list.htm +++ b/interface/web/dns/templates/dns_soa_admin_list.htm @@ -24,7 +24,7 @@ - + -- GitLab From cab126e67f196e4c26794007d95637811ea711a2 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 6 Jun 2020 23:11:55 +0200 Subject: [PATCH 0156/1368] Added translation function for Server Config (#2410) --- interface/web/admin/form/server_config.tform.php | 4 ++-- interface/web/admin/lib/lang/ar_server_config.lng | 1 + interface/web/admin/lib/lang/bg_server_config.lng | 1 + interface/web/admin/lib/lang/br_server_config.lng | 1 + interface/web/admin/lib/lang/ca_server_config.lng | 1 + interface/web/admin/lib/lang/cz_server_config.lng | 1 + interface/web/admin/lib/lang/de_server_config.lng | 1 + interface/web/admin/lib/lang/dk_server_config.lng | 1 + interface/web/admin/lib/lang/el_server_config.lng | 1 + interface/web/admin/lib/lang/en_server_config.lng | 1 + interface/web/admin/lib/lang/es_server_config.lng | 1 + interface/web/admin/lib/lang/fi_server_config.lng | 1 + interface/web/admin/lib/lang/fr_server_config.lng | 1 + interface/web/admin/lib/lang/hr_server_config.lng | 1 + interface/web/admin/lib/lang/hu_server_config.lng | 1 + interface/web/admin/lib/lang/id_server_config.lng | 1 + interface/web/admin/lib/lang/it_server_config.lng | 1 + interface/web/admin/lib/lang/ja_server_config.lng | 1 + interface/web/admin/lib/lang/nl_server_config.lng | 1 + interface/web/admin/lib/lang/pl_server_config.lng | 1 + interface/web/admin/lib/lang/pt_server_config.lng | 1 + interface/web/admin/lib/lang/ro_server_config.lng | 1 + interface/web/admin/lib/lang/ru_server_config.lng | 1 + interface/web/admin/lib/lang/se_server_config.lng | 1 + interface/web/admin/lib/lang/sk_server_config.lng | 1 + interface/web/admin/lib/lang/tr_server_config.lng | 1 + 26 files changed, 27 insertions(+), 2 deletions(-) diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 945e422da2..bbd6899761 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -33,7 +33,7 @@ */ -$form["title"] = "Server Config"; +$form["title"] = "server_config"; $form["description"] = ""; $form["name"] = "server_config"; $form["action"] = "server_config_edit.php"; @@ -2022,4 +2022,4 @@ if(!isset($mail_config['rspamd_available']) || $mail_config['rspamd_available'] $form['tabs']['mail']['fields']['content_filter']['default'] = 'amavisd'; unset($form['tabs']['mail']['fields']['content_filter']['value']['rspamd']); unset($form['tabs']['mail']['fields']['rspamd_password']); -}*/ \ No newline at end of file +}*/ diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index 520fdb1028..bfefeec22c 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -1,4 +1,5 @@ Date: Sat, 6 Jun 2020 23:13:43 +0200 Subject: [PATCH 0157/1368] Changed Server Config translation --- interface/web/admin/lib/lang/nl_server_config.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index 0fc75f7c6e..8cb0a1e140 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -1,5 +1,5 @@ Date: Sun, 7 Jun 2020 00:03:05 +0200 Subject: [PATCH 0158/1368] Added translation function for User (#2410) --- interface/web/admin/form/remote_user.tform.php | 4 ++-- interface/web/admin/form/users.tform.php | 4 ++-- interface/web/admin/lib/lang/ar_remote_user.lng | 1 + interface/web/admin/lib/lang/ar_users.lng | 1 + interface/web/admin/lib/lang/bg_remote_user.lng | 1 + interface/web/admin/lib/lang/bg_users.lng | 1 + interface/web/admin/lib/lang/br_remote_user.lng | 1 + interface/web/admin/lib/lang/br_users.lng | 1 + interface/web/admin/lib/lang/ca_remote_user.lng | 1 + interface/web/admin/lib/lang/ca_users.lng | 1 + interface/web/admin/lib/lang/cz_remote_user.lng | 1 + interface/web/admin/lib/lang/cz_users.lng | 1 + interface/web/admin/lib/lang/de_remote_user.lng | 1 + interface/web/admin/lib/lang/de_users.lng | 1 + interface/web/admin/lib/lang/dk_remote_user.lng | 1 + interface/web/admin/lib/lang/dk_users.lng | 1 + interface/web/admin/lib/lang/el_remote_user.lng | 1 + interface/web/admin/lib/lang/el_users.lng | 1 + interface/web/admin/lib/lang/en_remote_user.lng | 1 + interface/web/admin/lib/lang/en_users.lng | 1 + interface/web/admin/lib/lang/es_remote_user.lng | 1 + interface/web/admin/lib/lang/es_users.lng | 1 + interface/web/admin/lib/lang/fi_remote_user.lng | 1 + interface/web/admin/lib/lang/fi_users.lng | 1 + interface/web/admin/lib/lang/fr_remote_user.lng | 1 + interface/web/admin/lib/lang/fr_users.lng | 1 + interface/web/admin/lib/lang/hr_remote_user.lng | 1 + interface/web/admin/lib/lang/hr_users.lng | 1 + interface/web/admin/lib/lang/hu_remote_user.lng | 1 + interface/web/admin/lib/lang/hu_users.lng | 1 + interface/web/admin/lib/lang/id_remote_user.lng | 1 + interface/web/admin/lib/lang/id_users.lng | 1 + interface/web/admin/lib/lang/it_remote_user.lng | 1 + interface/web/admin/lib/lang/it_users.lng | 1 + interface/web/admin/lib/lang/ja_remote_user.lng | 1 + interface/web/admin/lib/lang/ja_users.lng | 1 + interface/web/admin/lib/lang/nl_remote_user.lng | 1 + interface/web/admin/lib/lang/nl_users.lng | 1 + interface/web/admin/lib/lang/pl_remote_user.lng | 1 + interface/web/admin/lib/lang/pl_users.lng | 1 + interface/web/admin/lib/lang/pt_remote_user.lng | 1 + interface/web/admin/lib/lang/pt_users.lng | 1 + interface/web/admin/lib/lang/ro_remote_user.lng | 1 + interface/web/admin/lib/lang/ro_users.lng | 1 + interface/web/admin/lib/lang/ru_remote_user.lng | 1 + interface/web/admin/lib/lang/ru_users.lng | 1 + interface/web/admin/lib/lang/se_remote_user.lng | 1 + interface/web/admin/lib/lang/se_users.lng | 1 + interface/web/admin/lib/lang/sk_remote_user.lng | 1 + interface/web/admin/lib/lang/sk_users.lng | 1 + interface/web/admin/lib/lang/tr_remote_user.lng | 1 + interface/web/admin/lib/lang/tr_users.lng | 1 + 52 files changed, 54 insertions(+), 4 deletions(-) diff --git a/interface/web/admin/form/remote_user.tform.php b/interface/web/admin/form/remote_user.tform.php index 3b920ccb4a..9263266a27 100644 --- a/interface/web/admin/form/remote_user.tform.php +++ b/interface/web/admin/form/remote_user.tform.php @@ -45,7 +45,7 @@ if(is_array($modules)) { } } -$form["title"] = "Remote user"; +$form["title"] = "remote_user_txt"; $form["description"] = ""; $form["name"] = "remote_user"; $form["action"] = "remote_user_edit.php"; @@ -63,7 +63,7 @@ $form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, $form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete $form["tabs"]['remote_user'] = array ( - 'title' => "Remote User", + 'title' => "remote_user_txt", 'width' => 100, 'template' => "templates/remote_user_edit.htm", 'fields' => array ( diff --git a/interface/web/admin/form/users.tform.php b/interface/web/admin/form/users.tform.php index be77122b10..4f08de4098 100644 --- a/interface/web/admin/form/users.tform.php +++ b/interface/web/admin/form/users.tform.php @@ -60,7 +60,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -$form['title'] = 'Users'; +$form['title'] = 'users_txt'; $form['description'] = 'Form to edit systemusers.'; $form['name'] = 'users'; $form['action'] = 'users_edit.php'; @@ -129,7 +129,7 @@ if(is_array($tmp_records)) { } $form['tabs']['users'] = array ( - 'title' => 'Users', + 'title' => 'users_txt', 'width' => 80, 'template' => 'templates/users_user_edit.htm', 'fields' => array ( diff --git a/interface/web/admin/lib/lang/ar_remote_user.lng b/interface/web/admin/lib/lang/ar_remote_user.lng index d0504005e3..8c70904102 100644 --- a/interface/web/admin/lib/lang/ar_remote_user.lng +++ b/interface/web/admin/lib/lang/ar_remote_user.lng @@ -1,4 +1,5 @@ Date: Sun, 7 Jun 2020 22:26:50 +0200 Subject: [PATCH 0159/1368] - migrated changes from interface to server --- server/lib/classes/ispcmail.inc.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/server/lib/classes/ispcmail.inc.php b/server/lib/classes/ispcmail.inc.php index cc83c74137..fbf5f84dca 100644 --- a/server/lib/classes/ispcmail.inc.php +++ b/server/lib/classes/ispcmail.inc.php @@ -169,7 +169,7 @@ class ispcmail { $this->smtp_host = $value; break; case 'smtp_port': - $this->smtp_port = $value; + if(intval($value) > 0) $this->smtp_port = $value; break; case 'smtp_user': $this->smtp_user = $value; @@ -586,8 +586,8 @@ class ispcmail { */ private function _smtp_login() { $this->_smtp_conn = fsockopen(($this->smtp_crypt == 'ssl' ? 'tls://' : '') . $this->smtp_host, $this->smtp_port, $errno, $errstr, 30); - $response = fgets($this->_smtp_conn, 515); if(empty($this->_smtp_conn)) return false; + $response = fgets($this->_smtp_conn, 515); //Say Hello to SMTP if($this->smtp_helo == '') $this->detectHelo(); @@ -598,13 +598,20 @@ class ispcmail { if($this->smtp_crypt == 'tls') { fputs($this->_smtp_conn, 'STARTTLS' . $this->_crlf); fgets($this->_smtp_conn, 515); + $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT; if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) { $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT; $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT; } - stream_socket_enable_crypto($this->_smtp_conn, true, $crypto_method); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_host', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_peer', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'verify_peer_name', false); + stream_context_set_option($this->_smtp_conn, 'ssl', 'allow_self_signed', true); + if (stream_socket_enable_crypto($this->_smtp_conn, true, $crypto_method) != true) { + return false; + } } //AUTH LOGIN -- GitLab From d4b1707086848838da7151c7bf34031f27aaad0a Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sun, 7 Jun 2020 23:14:22 +0200 Subject: [PATCH 0160/1368] New translations --- interface/web/admin/lib/lang/nl.lng | 14 +++++++------- .../web/admin/lib/lang/nl_directive_snippets.lng | 12 ++++++------ .../admin/lib/lang/nl_directive_snippets_list.lng | 8 ++++---- interface/web/admin/lib/lang/nl_firewall.lng | 4 ++-- interface/web/admin/lib/lang/nl_firewall_list.lng | 2 +- interface/web/admin/lib/lang/nl_groups.lng | 2 +- interface/web/admin/lib/lang/nl_language_add.lng | 8 ++++---- .../web/admin/lib/lang/nl_language_import.lng | 2 +- 8 files changed, 26 insertions(+), 26 deletions(-) diff --git a/interface/web/admin/lib/lang/nl.lng b/interface/web/admin/lib/lang/nl.lng index 26d231ffcd..99a4b53da1 100644 --- a/interface/web/admin/lib/lang/nl.lng +++ b/interface/web/admin/lib/lang/nl.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/admin/lib/lang/nl_directive_snippets_list.lng b/interface/web/admin/lib/lang/nl_directive_snippets_list.lng index 8e189f9f79..5c12ac4808 100644 --- a/interface/web/admin/lib/lang/nl_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/nl_directive_snippets_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/nl_firewall.lng b/interface/web/admin/lib/lang/nl_firewall.lng index 443aca29e6..284af5c435 100644 --- a/interface/web/admin/lib/lang/nl_firewall.lng +++ b/interface/web/admin/lib/lang/nl_firewall.lng @@ -6,6 +6,6 @@ $wb['tcp_port_help_txt'] = 'Gescheiden door komma'; $wb['udp_port_help_txt'] = 'Gescheiden door komma'; $wb['active_txt'] = 'Actief'; $wb['firewall_error_unique'] = 'Er is al een firewall record voor deze server.'; -$wb['tcp_ports_error_regex'] = 'Karakter niet toegestaan in tcp port definitie. Toegestane karakters zijn nummers, : en ,.'; -$wb['udp_ports_error_regex'] = 'Karakter niet toegestaan in udp port definitie. Toegestane karakters zijn nummers, : en ,.'; +$wb['tcp_ports_error_regex'] = 'Karakter niet toegestaan in TCP port definitie. Toegestane karakters zijn nummers, : en ,.'; +$wb['udp_ports_error_regex'] = 'Karakter niet toegestaan in UDP port definitie. Toegestane karakters zijn nummers, : en ,.'; ?> diff --git a/interface/web/admin/lib/lang/nl_firewall_list.lng b/interface/web/admin/lib/lang/nl_firewall_list.lng index 394d093493..11746c6e5b 100644 --- a/interface/web/admin/lib/lang/nl_firewall_list.lng +++ b/interface/web/admin/lib/lang/nl_firewall_list.lng @@ -4,5 +4,5 @@ $wb['active_txt'] = 'Actief'; $wb['server_id_txt'] = 'Server'; $wb['tcp_port_txt'] = 'Open TCP poorten'; $wb['udp_port_txt'] = 'Open UDP poorten'; -$wb['add_new_record_txt'] = 'Toevoegen Firewall record'; +$wb['add_new_record_txt'] = 'Firewall regel toevoegen'; ?> diff --git a/interface/web/admin/lib/lang/nl_groups.lng b/interface/web/admin/lib/lang/nl_groups.lng index e3ec317a4e..cdc75880ce 100644 --- a/interface/web/admin/lib/lang/nl_groups.lng +++ b/interface/web/admin/lib/lang/nl_groups.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/admin/lib/lang/nl_language_add.lng b/interface/web/admin/lib/lang/nl_language_add.lng index c746351827..f1541093e6 100644 --- a/interface/web/admin/lib/lang/nl_language_add.lng +++ b/interface/web/admin/lib/lang/nl_language_add.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/nl_language_import.lng b/interface/web/admin/lib/lang/nl_language_import.lng index ae407efecb..bec27a9528 100644 --- a/interface/web/admin/lib/lang/nl_language_import.lng +++ b/interface/web/admin/lib/lang/nl_language_import.lng @@ -5,5 +5,5 @@ $wb['btn_save_txt'] = 'Importeer het geselecteerde taalbestand'; $wb['language_overwrite_txt'] = 'Overschrijf bestand, als dit bestaat.'; $wb['btn_cancel_txt'] = 'Terug'; $wb['ignore_version_txt'] = 'Sla ISPConfig versie controle over'; -$wb['list_desc_txt'] = 'WARNING: Do not import language files from untrustworthy sources.'; +$wb['list_desc_txt'] = 'Waarschuwing: Importeer geen taalbestanden van onvertrouwde bronnen.'; ?> -- GitLab From 58102c14632b827b8609056fea306f11ffdaf1e1 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Mon, 8 Jun 2020 01:09:23 +0200 Subject: [PATCH 0161/1368] Remove description --- interface/web/admin/form/users.tform.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/admin/form/users.tform.php b/interface/web/admin/form/users.tform.php index 4f08de4098..1aab0a4298 100644 --- a/interface/web/admin/form/users.tform.php +++ b/interface/web/admin/form/users.tform.php @@ -61,7 +61,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ $form['title'] = 'users_txt'; -$form['description'] = 'Form to edit systemusers.'; +//$form['description'] = 'Form to edit systemusers.'; $form['name'] = 'users'; $form['action'] = 'users_edit.php'; $form['db_table'] = 'sys_user'; -- GitLab From 857b4eaa316a22dce7d8ac4a93593c68649f7f90 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Mon, 8 Jun 2020 13:03:08 +0200 Subject: [PATCH 0162/1368] Rename Comodo to "Sectigo / Comodo CA" --- install/sql/incremental/upd_dev_collection.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index d07b33d4ba..1acc274a99 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -13,3 +13,6 @@ ALTER TABLE `web_domain` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT ALTER TABLE `web_backup` ADD `backup_format` VARCHAR( 64 ) NOT NULL DEFAULT '' AFTER `backup_mode`; ALTER TABLE `web_backup` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `filesize`; -- end of backup encryption + +-- rename Comodo to "Sectigo / Comodo CA" +UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'comodoca.com'; -- GitLab From c3f4ffccc70141e979187af510b59539e4fde439 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 8 Jun 2020 14:28:35 -0600 Subject: [PATCH 0163/1368] default php-fpm to use ondemand mode --- install/sql/incremental/upd_dev_collection.sql | 3 +++ install/sql/ispconfig3.sql | 2 +- interface/web/sites/form/web_vhost_domain.tform.php | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 1acc274a99..c53f31b307 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -16,3 +16,6 @@ ALTER TABLE `web_backup` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT -- rename Comodo to "Sectigo / Comodo CA" UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'comodoca.com'; + +-- default php-fpm to ondemand mode +ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index b64eab94c3..3908cf382b 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2046,7 +2046,7 @@ CREATE TABLE `web_domain` ( `nginx_directives` mediumtext, `php_fpm_use_socket` ENUM('n','y') NOT NULL DEFAULT 'y', `php_fpm_chroot` enum('n','y') NOT NULL DEFAULT 'n', - `pm` enum('static','dynamic','ondemand') NOT NULL DEFAULT 'dynamic', + `pm` enum('static','dynamic','ondemand') NOT NULL DEFAULT 'ondemand', `pm_max_children` int(11) NOT NULL DEFAULT '10', `pm_start_servers` int(11) NOT NULL DEFAULT '2', `pm_min_spare_servers` int(11) NOT NULL DEFAULT '1', diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index 24ee6d4e62..beb952bfe6 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -861,7 +861,7 @@ if($_SESSION["s"]["user"]["typ"] == 'admin' 'pm' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', - 'default' => 'dynamic', + 'default' => 'ondemand', 'value' => array('static' => 'static', 'dynamic' => 'dynamic', 'ondemand' => 'ondemand (PHP Version >= 5.3.9)') ), 'pm_max_children' => array ( -- GitLab From 663531068b0d44ac98884435b35a7d77909333c4 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 07:42:14 +0200 Subject: [PATCH 0164/1368] - add checker for mr --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ee654e1f2..cdcc6edb29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,6 +13,7 @@ syntax:lint: only: - schedules - web + - merge_requests script: - composer require overtrue/phplint -- GitLab From cbc92c24b3a6ae3be640aadb6351d5d17e3b4e6b Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 07:46:17 +0200 Subject: [PATCH 0165/1368] - fixed language syntax errors from !1010 --- interface/web/admin/lib/lang/ar_remote_user.lng | 2 +- interface/web/admin/lib/lang/bg_remote_user.lng | 2 +- interface/web/admin/lib/lang/br_remote_user.lng | 2 +- interface/web/admin/lib/lang/ca_remote_user.lng | 2 +- interface/web/admin/lib/lang/cz_remote_user.lng | 2 +- interface/web/admin/lib/lang/de_remote_user.lng | 2 +- interface/web/admin/lib/lang/dk_remote_user.lng | 2 +- interface/web/admin/lib/lang/el_remote_user.lng | 2 +- interface/web/admin/lib/lang/en_remote_user.lng | 2 +- interface/web/admin/lib/lang/es_remote_user.lng | 2 +- interface/web/admin/lib/lang/fi_remote_user.lng | 2 +- interface/web/admin/lib/lang/fr_remote_user.lng | 2 +- interface/web/admin/lib/lang/hr_remote_user.lng | 2 +- interface/web/admin/lib/lang/hu_remote_user.lng | 2 +- interface/web/admin/lib/lang/id_remote_user.lng | 2 +- interface/web/admin/lib/lang/it_remote_user.lng | 2 +- interface/web/admin/lib/lang/ja_remote_user.lng | 2 +- interface/web/admin/lib/lang/pl_remote_user.lng | 2 +- interface/web/admin/lib/lang/pt_remote_user.lng | 2 +- interface/web/admin/lib/lang/ro_remote_user.lng | 2 +- interface/web/admin/lib/lang/ru_remote_user.lng | 2 +- interface/web/admin/lib/lang/se_remote_user.lng | 2 +- interface/web/admin/lib/lang/sk_remote_user.lng | 2 +- interface/web/admin/lib/lang/tr_remote_user.lng | 2 +- 24 files changed, 24 insertions(+), 24 deletions(-) diff --git a/interface/web/admin/lib/lang/ar_remote_user.lng b/interface/web/admin/lib/lang/ar_remote_user.lng index 8c70904102..b1db64e8e6 100644 --- a/interface/web/admin/lib/lang/ar_remote_user.lng +++ b/interface/web/admin/lib/lang/ar_remote_user.lng @@ -1,5 +1,5 @@ Date: Tue, 9 Jun 2020 08:19:39 +0200 Subject: [PATCH 0166/1368] Update upd_dev_collection.sql --- install/sql/incremental/upd_dev_collection.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index c53f31b307..259035db1e 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -19,3 +19,4 @@ UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'co -- default php-fpm to ondemand mode ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; + -- GitLab From d19d4a7f5ca68c7b3b2217afca87c469c9470dad Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 08:38:41 +0200 Subject: [PATCH 0167/1368] Update .gitlab-ci.yml --- .gitlab-ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2ee654e1f2..cdcc6edb29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -13,6 +13,7 @@ syntax:lint: only: - schedules - web + - merge_requests script: - composer require overtrue/phplint -- GitLab From e3586dea7ead3dc7e205415d1df818bc12e2fbcc Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 09:56:06 +0200 Subject: [PATCH 0168/1368] - backport for MR !925 --- .../web/themes/default/assets/stylesheets/ispconfig.css | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index f5e8c46abf..fb1c8e8d18 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -794,4 +794,8 @@ span.notification_text { color: red; background: #fdd; text-decoration: none; -} \ No newline at end of file +} +#apache_directives, #nginx_directives, #proxy_directives { + font-family: Consolas, "Courier New", Courier, monospace; +} + -- GitLab From b84d1a66b841f686db9d3b1a1fbf108e40b9f8bb Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 09:58:56 +0200 Subject: [PATCH 0169/1368] - missing fix for !1010 --- interface/web/admin/lib/lang/nl_remote_user.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/admin/lib/lang/nl_remote_user.lng b/interface/web/admin/lib/lang/nl_remote_user.lng index 3d2baac1fd..884331daa0 100644 --- a/interface/web/admin/lib/lang/nl_remote_user.lng +++ b/interface/web/admin/lib/lang/nl_remote_user.lng @@ -1,5 +1,5 @@ Date: Tue, 9 Jun 2020 11:54:20 +0200 Subject: [PATCH 0170/1368] - change phplint settings --- .phplint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.phplint.yml b/.phplint.yml index 10fd2a25af..800c8d4e5e 100644 --- a/.phplint.yml +++ b/.phplint.yml @@ -1,5 +1,5 @@ path: ./ -jobs: 10 +jobs: 2 cache: .phplint-cache extensions: - php -- GitLab From 20e52c33c00019840fe5f4828ec2152ad11e2ac0 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 12:05:07 +0200 Subject: [PATCH 0171/1368] - changed settings for phplint --- .phplint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.phplint.yml b/.phplint.yml index 800c8d4e5e..438e3c238d 100644 --- a/.phplint.yml +++ b/.phplint.yml @@ -1,5 +1,5 @@ path: ./ -jobs: 2 +jobs: 5 cache: .phplint-cache extensions: - php -- GitLab From c40524c469969866fa6c01face2b4be975ed5fd0 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Tue, 9 Jun 2020 13:13:59 +0200 Subject: [PATCH 0172/1368] purge trash and junk (Implements #5634) --- .../sql/incremental/upd_dev_collection.sql | 3 + install/sql/ispconfig3.sql | 2 + interface/web/mail/form/mail_user.tform.php | 14 +++ interface/web/mail/lib/lang/ar_mail_user.lng | 4 + interface/web/mail/lib/lang/bg_mail_user.lng | 4 + interface/web/mail/lib/lang/br_mail_user.lng | 4 + interface/web/mail/lib/lang/ca_mail_user.lng | 4 + interface/web/mail/lib/lang/cz_mail_user.lng | 4 + interface/web/mail/lib/lang/de_mail_user.lng | 4 + interface/web/mail/lib/lang/dk_mail_user.lng | 4 + interface/web/mail/lib/lang/el_mail_user.lng | 4 + interface/web/mail/lib/lang/en_mail_user.lng | 4 + interface/web/mail/lib/lang/es_mail_user.lng | 4 + interface/web/mail/lib/lang/fi_mail_user.lng | 4 + interface/web/mail/lib/lang/fr_mail_user.lng | 4 + interface/web/mail/lib/lang/hr_mail_user.lng | 4 + interface/web/mail/lib/lang/hu_mail_user.lng | 4 + interface/web/mail/lib/lang/id_mail_user.lng | 4 + interface/web/mail/lib/lang/it_mail_user.lng | 4 + interface/web/mail/lib/lang/ja_mail_user.lng | 4 + interface/web/mail/lib/lang/nl_mail_user.lng | 4 + interface/web/mail/lib/lang/pl_mail_user.lng | 4 + interface/web/mail/lib/lang/pt_mail_user.lng | 4 + interface/web/mail/lib/lang/ro_mail_user.lng | 4 + interface/web/mail/lib/lang/ru_mail_user.lng | 4 + interface/web/mail/lib/lang/se_mail_user.lng | 4 + interface/web/mail/lib/lang/sk_mail_user.lng | 4 + interface/web/mail/lib/lang/tr_mail_user.lng | 4 + .../templates/mail_user_mailfilter_edit.htm | 49 +++++++--- .../cron.d/500-clean_mailboxes.inc.php | 95 +++++++++++++++++++ 30 files changed, 250 insertions(+), 13 deletions(-) create mode 100755 server/lib/classes/cron.d/500-clean_mailboxes.inc.php diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 259035db1e..efd0f4082b 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -20,3 +20,6 @@ UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'co -- default php-fpm to ondemand mode ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; +ALTER TABLE `mail_user` + ADD `purge_trash_days` INT NOT NULL DEFAULT '0' AFTER `move_junk`, + ADD `purge_junk_days` INT NOT NULL DEFAULT '0' AFTER `purge_trash_days`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 3908cf382b..4965358bc6 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1047,6 +1047,8 @@ CREATE TABLE `mail_user` ( `autoresponder_subject` varchar(255) NOT NULL default 'Out of office reply', `autoresponder_text` mediumtext NULL, `move_junk` enum('n','y') NOT NULL default 'n', + `purge_trash_days` INT NOT NULL DEFAULT '0', + `purge_junk_days` INT NOT NULL DEFAULT '0', `custom_mailfilter` mediumtext, `postfix` enum('n','y') NOT NULL default 'y', `greylisting` enum('n','y' ) NOT NULL DEFAULT 'n', diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 0efc7f3d6b..83142f8a85 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -406,6 +406,20 @@ if ($global_config['mail']['mailbox_show_mail_filter_tab'] === 'y') { 'default' => 'n', 'value' => array(0 => 'n', 1 => 'y') ), + 'purge_trash_days' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( + ), + 'default' => '0', + ), + 'purge_junk_days' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( + ), + 'default' => '0', + ), //################################# // END Datatable fields //################################# diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index c68becf335..a67a83c07a 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -62,4 +62,8 @@ $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 000377077b..3b9a27390e 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -62,4 +62,8 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index ed6e35ef61..2aca5c3736 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -62,4 +62,8 @@ $wb['monthly_backup_txt'] = 'Mensal'; $wb['email_error_isascii'] = 'Por favor, não use caracteres especiais para a senha. Isto poderá causar problemas no cliente de e-mail.'; $wb['cc_note_txt'] = '(separar múltiplos endereços de e-mails com vírgulas)'; $wb['sender_cc_note_txt'] = '(separar múltiplos endereços de e-mails com vírgulas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 096572b5e0..e380b55d2d 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -62,4 +62,8 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index c697e4cffc..1946d4150f 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -62,4 +62,8 @@ $wb['weekly_backup_txt'] = 'Týdenní'; $wb['monthly_backup_txt'] = 'Měsíční'; $wb['sender_cc_note_txt'] = '(Při posílání kopií na více e-mailových adres, oddělte čárkami.) '; $wb['password_click_to_set_txt'] = 'Pro nastavení klikni zde'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index b60a756b09..7c1f02cd4f 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -62,4 +62,8 @@ $wb['sender_cc_txt'] = 'Kopie ausgehender Emails senden an (BCC)'; $wb['sender_cc_error_isemail'] = '-Kopie ausgehender Emails senden an- Feld enthält keine gültige Emailadresse'; $wb['sender_cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index fb846da199..8c0957d353 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -62,4 +62,8 @@ $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index a097470ad7..f735d6e7b3 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -62,4 +62,8 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 4174081b53..82cab6d70c 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -62,4 +62,8 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index 93c2095e1c..418fd2dbfa 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -62,4 +62,8 @@ $wb['sender_cc_txt'] = 'Enviar copia saliente a'; $wb['server_id_txt'] = 'id_del_servidor'; $wb['weekly_backup_txt'] = 'Semanalmente'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 8f94f0158f..a764e95693 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -62,4 +62,8 @@ $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['password_click_to_set_txt'] = 'Click to set'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index bb54c2e0c0..732f3d8cb7 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -62,4 +62,8 @@ $wb['weekly_backup_txt'] = 'Hebdomadaire'; $wb['monthly_backup_txt'] = 'Mensuel'; $wb['sender_cc_note_txt'] = '(Séparer les adresses e-mail multiples par des virgules)'; $wb['password_click_to_set_txt'] = 'Cliquez pour définir'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 8dcfe7a6fa..7406e2d656 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -62,4 +62,8 @@ $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 43720fbd84..db8edf775e 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index ba17e373c7..670550062c 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index e6820a0329..dad3f69654 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -62,4 +62,8 @@ $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index 3cd498f270..803a278d5b 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 65d89a32af..39cd0bd0f0 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -61,4 +61,8 @@ $wb['autoresponder_start_date_is_required'] = 'Een startdatun is vereist voor he $wb['sender_cc_txt'] = 'Stuur uitgaande kopie aan'; $wb['sender_cc_error_isemail'] = 'Het \\"Stuur uitgaande kopie aan\\" veld bevat geen geldig e-mail adres'; $wb['sender_cc_note_txt'] = '(Meerdere e-mail adressen scheiden met een komma)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index d090fadb2a..8a35e7742e 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index aa0e9a0a05..56a1f16d30 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index 3f0f8ec479..ccdcc49fdf 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index 526c976ed5..fcfadd9db9 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Дата начала должн $wb['sender_cc_txt'] = 'Отправка исходящей копии на'; $wb['sender_cc_error_isemail'] = 'Поле -Отправка исходящей копии на- не содержит действительный адрес электронной почты'; $wb['sender_cc_note_txt'] = '(Разделите несколько адресов электронной почты запятыми)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index a427c50606..c081446557 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index 92c6dea578..eb70b8eba9 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -62,4 +62,8 @@ $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autor $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 99e9860396..c7dec33b99 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -62,4 +62,8 @@ $wb['monthly_backup_txt'] = 'Aylık'; $wb['email_error_isascii'] = 'E-posta istemcinizde sorun yaşamamak için lütfen parolanızda dile özel unikod karakterler kullanmayın.'; $wb['cc_note_txt'] = '(Birden çok e-posta adresini virgül ile ayırarak yazın)'; $wb['sender_cc_note_txt'] = '(Birden çok e-posta adresini virgül ile ayırarak yazın)'; +$wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; +$wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; +$wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; +$wb['tooltip_purge_junk_days_txt'] = '0 = disabled'; ?> diff --git a/interface/web/mail/templates/mail_user_mailfilter_edit.htm b/interface/web/mail/templates/mail_user_mailfilter_edit.htm index fc40398d5d..4c7058292e 100644 --- a/interface/web/mail/templates/mail_user_mailfilter_edit.htm +++ b/interface/web/mail/templates/mail_user_mailfilter_edit.htm @@ -1,16 +1,39 @@ -
- -
- {tmpl_var name='move_junk'} -
-
- +
+ +
{tmpl_var name='move_junk'}
+
- {tmpl_var name='filter_records'} +
+ +
+
+ + + + + +
+
+
- +
+ +
+
+ + + + + +
+
+
+ +{tmpl_var name='filter_records'} -
- - -
+ + +
+ + +
diff --git a/server/lib/classes/cron.d/500-clean_mailboxes.inc.php b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php new file mode 100755 index 0000000000..8617d0d76d --- /dev/null +++ b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php @@ -0,0 +1,95 @@ +db->queryAllRecords("SELECT email, maildir, purge_trash_days, purge_junk_days FROM mail_user WHERE maildir_format = 'maildir' AND disableimap = 'n' AND server_id = ? AND (purge_trash_days > 0 OR purge_junk_days > 0)", $server_id); + + if(is_array($records) && !empty($records)) { + foreach($records as $email) { + if($email['purge_trash_days'] > 0) { + foreach($trash_names as $trash) { + if(is_dir($email['maildir'].'/Maildir/.'.$trash)) { + $app->system->exec_safe($purge_cmd.intval($email['purge_trash_days']).'d', $email['email'], $trash); + } + } + } + if($email['purge_junk_days'] > 0) { + foreach($junk_names as $junk) { + if(is_dir($email['maildir'].'/Maildir/.'.$junk)) { + $app->system->exec_safe($purge_cmd.intval($email['purge_junk_days']).'d', $email['email'], $junk); + } + } + } + } + } + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } + +} + +?> -- GitLab From 22819ea8cec7d2f3d1613c7f469b5aee6f5e2cc4 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 13:23:57 +0200 Subject: [PATCH 0173/1368] - added custom ci lint script --- .git-scripts/syntax.sh | 56 ++++++++++++++++++++++++++++++++++++++++++ .gitlab-ci.yml | 34 ++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 .git-scripts/syntax.sh diff --git a/.git-scripts/syntax.sh b/.git-scripts/syntax.sh new file mode 100644 index 0000000000..efc48ae4b3 --- /dev/null +++ b/.git-scripts/syntax.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +IFS=$'\n' +EX=0 +ERRS="" ; +WARNS="" ; +ERRCNT=0 ; +WARNCNT=0 ; + +CMD="find . -type f \( -name \"*.php\" -o -name \"*.lng\" \) -print" ; + +if [[ "$1" == "commit" ]] ; then + CMD="git diff-tree --no-commit-id --name-only -r ${CI_COMMIT_SHA} | grep -E '\.(php|lng)$'" ; +fi + +for F in $(eval "$CMD") ; do + if [[ ! -e "${F}" && -f "${F}" ]] ; then + continue ; + fi + echo -n "${F} ... " ; + R=$(php -d error_reporting=E_ALL -d display_errors=On -l "$F" 2>/dev/null) ; + RET=$? ; + R=$(echo "${R}" | sed "/^$/d") + if [ $RET -gt 0 ] ; then + EX=1 ; + echo "[ERROR]" ; + ERRS="${ERRS}${F}:"$'\n'"${R}"$'\n\n' ; + ERRCNT=$((ERRCNT + 1)) ; + else + if [[ "$R" == "Deprecated: "* ]] ; then + echo "[WARN]" ; + WARNS="${WARNS}${F}:"$'\n'"${R}"$'\n\n' ; + WARNCNT=$((WARNCNT + 1)) ; + else + echo "[OK]" ; + fi + fi +done + +echo "" +echo "--------------------------"; +echo "" +echo "${ERRCNT} Errors" +if [ $ERRCNT -gt 0 ] ; then + echo "${ERRS}" + echo "" +fi + +echo "${WARNCNT} Warnings" +if [ $WARNCNT -gt 0 ] ; then + echo "" + echo "${WARNS}" + echo "" +fi + +exit $EX \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index cdcc6edb29..4e4a201bfc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,7 @@ # Defines stages which are to be executed stages: - syntax + - syntax_diff # ### Stage syntax @@ -16,8 +17,35 @@ syntax:lint: - merge_requests script: - - composer require overtrue/phplint - echo "Syntax checking PHP files" - - echo "For more information http://www.icosaedro.it/phplint/" - - vendor/bin/phplint + - bash ./.git-scripts/syntax.sh + + +syntax_diff:lint: + stage: syntax + image: edbizarro/gitlab-ci-pipeline-php:7.2 + allow_failure: false + only: + - web + - pushes + - branches + + script: + - echo "Syntax checking PHP files" + - bash ./.git-scripts/syntax.sh commit + +#syntax:lint: +# stage: syntax +# image: edbizarro/gitlab-ci-pipeline-php:7.2 +# allow_failure: false +# only: +# - schedules +# - web +# - merge_requests +# +# script: +# - composer require overtrue/phplint +# - echo "Syntax checking PHP files" +# - echo "For more information http://www.icosaedro.it/phplint/" +# - vendor/bin/phplint -- GitLab From c8db76b6f7bf85483e99733fe29de791d56727cd Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 13:41:38 +0200 Subject: [PATCH 0174/1368] - improved lint script --- .git-scripts/syntax.sh | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/.git-scripts/syntax.sh b/.git-scripts/syntax.sh index efc48ae4b3..e584e2ef10 100644 --- a/.git-scripts/syntax.sh +++ b/.git-scripts/syntax.sh @@ -7,39 +7,50 @@ WARNS="" ; ERRCNT=0 ; WARNCNT=0 ; +OUTCNT=0 ; +FILECNT=0 ; +DONECNT=0 ; + CMD="find . -type f \( -name \"*.php\" -o -name \"*.lng\" \) -print" ; if [[ "$1" == "commit" ]] ; then CMD="git diff-tree --no-commit-id --name-only -r ${CI_COMMIT_SHA} | grep -E '\.(php|lng)$'" ; fi +FILECNT=$(eval "${CMD} | wc -l") ; + for F in $(eval "$CMD") ; do if [[ ! -e "${F}" && -f "${F}" ]] ; then continue ; fi - echo -n "${F} ... " ; R=$(php -d error_reporting=E_ALL -d display_errors=On -l "$F" 2>/dev/null) ; RET=$? ; R=$(echo "${R}" | sed "/^$/d") if [ $RET -gt 0 ] ; then EX=1 ; - echo "[ERROR]" ; + echo -n "E" ; ERRS="${ERRS}${F}:"$'\n'"${R}"$'\n\n' ; ERRCNT=$((ERRCNT + 1)) ; else if [[ "$R" == "Deprecated: "* ]] ; then - echo "[WARN]" ; + echo -n "W" ; WARNS="${WARNS}${F}:"$'\n'"${R}"$'\n\n' ; WARNCNT=$((WARNCNT + 1)) ; else - echo "[OK]" ; + echo -n "." ; fi fi + OUTCNT=$((OUTCNT + 1)) ; + DONECNT=$((DONECNT + 1)) ; + if [ $OUTCNT -ge 40 ] ; then + OUTCNT=0 ; + echo "[${DONECNT}/${FILECNT}]" ; + fi done echo "" echo "--------------------------"; -echo "" +echo "${DONECNT} Files done" echo "${ERRCNT} Errors" if [ $ERRCNT -gt 0 ] ; then echo "${ERRS}" -- GitLab From 8eca37ffd7861fe0477adaf8e3e5aed313874b9e Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 9 Jun 2020 13:51:43 +0200 Subject: [PATCH 0175/1368] - fixed remote functions naming (CAA/CNAME) --- interface/lib/classes/remote.d/dns.inc.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 36180ace3e..612adf7186 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -429,22 +429,22 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- //* Get record details - public function dns_cname_get($session_id, $primary_id) { + public function dns_caa_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'CAA'); } //* Add a record - public function dns_cname_add($session_id, $client_id, $params, $update_serial=false) { + public function dns_caa_add($session_id, $client_id, $params, $update_serial=false) { return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'CAA'); } //* Update a record - public function dns_cname_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + public function dns_caa_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'CAA'); } //* Delete a record - public function dns_cname_delete($session_id, $primary_id, $update_serial=false) { + public function dns_caa_delete($session_id, $primary_id, $update_serial=false) { return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'CAA'); } -- GitLab From 5ffe9d88ddd7af2c4464230216f2df7a9db3c67e Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Tue, 9 Jun 2020 14:02:52 +0200 Subject: [PATCH 0176/1368] allow the same name for every directive snippets type (Implemets #5631) --- ...validate_server_directive_snippets.inc.php | 49 +++++++++++++++++++ .../admin/form/directive_snippets.tform.php | 7 ++- 2 files changed, 52 insertions(+), 4 deletions(-) create mode 100755 interface/lib/classes/validate_server_directive_snippets.inc.php diff --git a/interface/lib/classes/validate_server_directive_snippets.inc.php b/interface/lib/classes/validate_server_directive_snippets.inc.php new file mode 100755 index 0000000000..0272166c40 --- /dev/null +++ b/interface/lib/classes/validate_server_directive_snippets.inc.php @@ -0,0 +1,49 @@ +tform->wordbook[$errmsg])) { + return $app->tform->wordbook[$errmsg]."
\r\n"; + } else { + return $errmsg."
\r\n"; + } + } + + function validate_snippet($field_name, $field_value, $validator) { + global $app; + $check = $app->db->queryAllRecords('SELECT * FROM directive_snippets WHERE name = ? AND type = ?', $field_value, trim($_POST['type'])); + if(!empty($check)) return $this->get_error('directive_snippets_name_error_unique'); + } + +} diff --git a/interface/web/admin/form/directive_snippets.tform.php b/interface/web/admin/form/directive_snippets.tform.php index d451a50795..bd9466c310 100644 --- a/interface/web/admin/form/directive_snippets.tform.php +++ b/interface/web/admin/form/directive_snippets.tform.php @@ -66,10 +66,9 @@ $form["tabs"]['directive_snippets'] = array ( 'name' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', - 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', - 'errmsg'=> 'directive_snippets_name_empty'), - 1 => array ( 'type' => 'UNIQUE', - 'errmsg'=> 'directive_snippets_name_error_unique'), + 'validators' => array ( + 0 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'directive_snippets_name_empty'), + 1 => array ( 'type' => 'CUSTOM', 'class' => 'validate_server_directive_snippets', 'function' => 'validate_snippet'), ), 'filters' => array( 0 => array( 'event' => 'SAVE', -- GitLab From bc0d340108893913c095812eef3c82052e92237b Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 2 Jun 2020 17:06:46 -0600 Subject: [PATCH 0177/1368] mail_user.disabledoveadm should always = 'n' fixes #5629 --- install/sql/incremental/upd_dev_collection.sql | 3 +++ interface/web/mail/mail_user_edit.php | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index efd0f4082b..659708c685 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -23,3 +23,6 @@ ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; ALTER TABLE `mail_user` ADD `purge_trash_days` INT NOT NULL DEFAULT '0' AFTER `move_junk`, ADD `purge_junk_days` INT NOT NULL DEFAULT '0' AFTER `purge_trash_days`; + +-- doveadm should be enabled for all mailboxes +UPDATE `mail_user` set `disabledoveadm` = 'n'; diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index d291367d11..7255c6dbac 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -313,8 +313,8 @@ class page_action extends tform_actions { $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disabledoveadm = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disableimap, $this->id); + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); } } @@ -365,8 +365,8 @@ class page_action extends tform_actions { $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disabledoveadm = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disableimap, $this->id); + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); } //** If the email address has been changed, change it in all aliases too -- GitLab From 5fe318fe3f3ca4f721f4f36791de355af3360843 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 10 Jun 2020 10:28:19 +0200 Subject: [PATCH 0178/1368] Update validate_server_directive_snippets.inc.php --- .../lib/classes/validate_server_directive_snippets.inc.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/lib/classes/validate_server_directive_snippets.inc.php b/interface/lib/classes/validate_server_directive_snippets.inc.php index 0272166c40..751400766c 100755 --- a/interface/lib/classes/validate_server_directive_snippets.inc.php +++ b/interface/lib/classes/validate_server_directive_snippets.inc.php @@ -42,7 +42,10 @@ class validate_server_directive_snippets { function validate_snippet($field_name, $field_value, $validator) { global $app; - $check = $app->db->queryAllRecords('SELECT * FROM directive_snippets WHERE name = ? AND type = ?', $field_value, trim($_POST['type'])); + $type=(isset($app->remoting_lib->dataRecord['type']))?$app->remoting_lib->dataRecord['type']:$_POST['type']; + $types = array('apache','nginx','php','proxy'); + if(!in_array($type,$types)) return $this->get_error('directive_snippets_invalid_type'); + $check = $app->db->queryAllRecords('SELECT * FROM directive_snippets WHERE name = ? AND type = ?', $field_value, $type); if(!empty($check)) return $this->get_error('directive_snippets_name_error_unique'); } -- GitLab From d328afafcca38a67b4c1eb3068eded60cd4fef07 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Wed, 10 Jun 2020 11:52:53 +0200 Subject: [PATCH 0179/1368] add missing entry from upd_dev_collection.sql --- install/sql/ispconfig3.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 4965358bc6..b7722eac0c 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -561,7 +561,7 @@ INSERT INTO `dns_ssl_ca` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `s (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'certSIGN', 'certsign.ro', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'CFCA', 'cfca.com.cn', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'Chunghwa Telecom', 'cht.com.tw', 'Y', '', 0), -(NULL, 1, 1, 'riud', 'riud', '', 'Y', 'Comodo', 'comodoca.com', 'Y', '', 0), +(NULL, 1, 1, 'riud', 'riud', '', 'Y', 'Sectigo / Comodo CA', 'comodoca.com', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'D-TRUST', 'd-trust.net', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'DigiCert', 'digicert.com', 'Y', '', 0), (NULL, 1, 1, 'riud', 'riud', '', 'Y', 'DocuSign', 'docusign.fr', 'Y', '', 0), -- GitLab From f9c1d4b4e428e8343d6e27bb53e5df93c93e3e64 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 9 Oct 2019 15:47:08 -0600 Subject: [PATCH 0180/1368] enable imap special-use flags --- install/tpl/debian6_dovecot2.conf.master | 20 ++++++++++++++++++++ install/tpl/fedora_dovecot2.conf.master | 21 +++++++++++++++++++++ install/tpl/opensuse_dovecot2.conf.master | 21 +++++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 777280f044..58adf1d85c 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -10,6 +10,7 @@ ssl_dh = Date: Wed, 9 Oct 2019 16:07:29 -0600 Subject: [PATCH 0181/1368] enable quota checking in RCPT stage --- install/tpl/debian6_dovecot2.conf.master | 1 + install/tpl/debian_dovecot2.conf.master | 1 + install/tpl/fedora_dovecot2.conf.master | 1 + install/tpl/opensuse_dovecot2.conf.master | 1 + 4 files changed, 4 insertions(+) diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 58adf1d85c..76d168cd7d 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -50,6 +50,7 @@ service lmtp { # process_min_avail = 5 } } +lmtp_rcpt_check_quota = yes service imap-login { client_limit = 1000 process_limit = 512 diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index e1929b188d..24bf07393f 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -46,6 +46,7 @@ service lmtp { user = postfix } } +lmtp_rcpt_check_quota = yes service imap-login { client_limit = 1000 process_limit = 512 diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 1f6c6eb996..56d304a761 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -43,6 +43,7 @@ service lmtp { user = postfix } } +lmtp_rcpt_check_quota = yes service imap-login { client_limit = 1000 process_limit = 500 diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index 9e17d4603a..d9f29a41e1 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -43,6 +43,7 @@ service lmtp { user = postfix } } +lmtp_rcpt_check_quota = yes service imap-login { client_limit = 1000 process_limit = 500 -- GitLab From cda1d3b20cae212570f1ff79c95abcb8100c23cb Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 9 Oct 2019 16:37:36 -0600 Subject: [PATCH 0182/1368] implement dovecot quota-status policy daemon (#4649) --- install/sql/incremental/upd_dev_collection.sql | 3 +++ install/sql/ispconfig3.sql | 1 + install/tpl/debian6_dovecot2.conf.master | 15 +++++++++++++++ install/tpl/debian_dovecot2.conf.master | 15 +++++++++++++++ install/tpl/debian_postfix.conf.master | 3 ++- install/tpl/fedora_dovecot2.conf.master | 15 +++++++++++++++ install/tpl/fedora_postfix.conf.master | 3 ++- install/tpl/gentoo_postfix.conf.master | 3 ++- install/tpl/master_cf_amavis10025.master | 1 + install/tpl/master_cf_amavis10027.master | 1 + install/tpl/opensuse_dovecot2.conf.master | 15 +++++++++++++++ install/tpl/opensuse_postfix.conf.master | 3 ++- 12 files changed, 74 insertions(+), 4 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 659708c685..91db879d0c 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -26,3 +26,6 @@ ALTER TABLE `mail_user` -- doveadm should be enabled for all mailboxes UPDATE `mail_user` set `disabledoveadm` = 'n'; + +-- add disablequota-status for quota-status policy daemon +ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disabledoveadm`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 4965358bc6..cc266ff235 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1062,6 +1062,7 @@ CREATE TABLE `mail_user` ( `disablelda` enum('n','y') NOT NULL default 'n', `disablelmtp` enum('n','y') NOT NULL default 'n', `disabledoveadm` enum('n','y') NOT NULL default 'n', + `disablequota-status` enum('n','y') NOT NULL default 'n', `last_quota_notification` date NULL default NULL, `backup_interval` VARCHAR( 255 ) NOT NULL default 'none', `backup_copies` INT NOT NULL DEFAULT '1', diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 76d168cd7d..1f51f23ad3 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -85,6 +85,21 @@ protocol lmtp { #2.3+ } #2.3+ } +service quota-status { + executable = quota-status -p postfix + inet_listener { + # separate multiple addresses with space: + address = 127.0.0.1 + port = 10060 + } + client_limit = 1 +} +plugin { + quota_status_success = DUNNO + quota_status_nouser = DUNNO + quota_status_overquota = "552 5.2.2 Mailbox is full" +} + imap_capability=+SEPCIAL-USE XLIST namespace inbox { inbox = yes diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index 24bf07393f..b71ede7534 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -81,3 +81,18 @@ protocol lmtp { #2.3+ mode = 0660 #2.3+ } #2.3+ } + +service quota-status { + executable = quota-status -p postfix + inet_listener { + # separate multiple addresses with space: + address = 127.0.0.1 + port = 10060 + } + client_limit = 1 +} +plugin { + quota_status_success = DUNNO + quota_status_nouser = DUNNO + quota_status_overquota = "552 5.2.2 Mailbox is full" +} diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index b7dbea6300..4d03dfd005 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -15,7 +15,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting} +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 +smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 56d304a761..9115404d9f 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -80,6 +80,21 @@ mail_plugins = $mail_plugins quota #2.3+ } #2.3+ } +service quota-status { + executable = quota-status -p postfix + inet_listener { + # separate multiple addresses with space: + address = 127.0.0.1 + port = 10060 + } + client_limit = 1 +} +plugin { + quota_status_success = DUNNO + quota_status_nouser = DUNNO + quota_status_overquota = "552 5.2.2 Mailbox is full" +} + imap_capability=+SEPCIAL-USE XLIST namespace inbox { inbox = yes diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index f06af82288..8bda2b7dcc 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -11,7 +11,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting} +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 +smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index dc20e02c13..79a9dcd63d 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -10,7 +10,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting} +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 +smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/master_cf_amavis10025.master b/install/tpl/master_cf_amavis10025.master index 43f362d5c0..6dee892264 100644 --- a/install/tpl/master_cf_amavis10025.master +++ b/install/tpl/master_cf_amavis10025.master @@ -8,6 +8,7 @@ -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks diff --git a/install/tpl/master_cf_amavis10027.master b/install/tpl/master_cf_amavis10027.master index f9fdf1cf60..640902d52e 100644 --- a/install/tpl/master_cf_amavis10027.master +++ b/install/tpl/master_cf_amavis10027.master @@ -8,6 +8,7 @@ -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject + -o smtpd_end_of_data_restrictions= -o mynetworks=127.0.0.0/8 -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index d9f29a41e1..7fb51246f9 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -79,6 +79,21 @@ mail_plugins = $mail_plugins quota #2.3+ } #2.3+ } +service quota-status { + executable = quota-status -p postfix + inet_listener { + # separate multiple addresses with space: + address = 127.0.0.1 + port = 10060 + } + client_limit = 1 +} +plugin { + quota_status_success = DUNNO + quota_status_nouser = DUNNO + quota_status_overquota = "552 5.2.2 Mailbox is full" +} + imap_capability=+SEPCIAL-USE XLIST namespace inbox { inbox = yes diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index 4192f988b5..6661bffd98 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -13,7 +13,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting} +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 +smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert -- GitLab From f60d97f4313b78f7e605ef65a508d1dee4a2dc25 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 10 Oct 2019 11:20:30 -0600 Subject: [PATCH 0183/1368] enable managesieve daemon if installed (#3395) --- install/dist/lib/debian60.lib.php | 11 ++++++++++- install/lib/installer_base.lib.php | 11 ++++++++++- install/tpl/debian6_dovecot2.conf.master | 2 ++ install/tpl/debian_dovecot2.conf.master | 2 ++ install/tpl/fedora_dovecot2.conf.master | 2 ++ install/tpl/opensuse_dovecot2.conf.master | 2 ++ 6 files changed, 28 insertions(+), 2 deletions(-) diff --git a/install/dist/lib/debian60.lib.php b/install/dist/lib/debian60.lib.php index cc234f132e..cd3b46e544 100644 --- a/install/dist/lib/debian60.lib.php +++ b/install/dist/lib/debian60.lib.php @@ -138,7 +138,7 @@ class installer extends installer_base { } //remove #2.3+ comment $content = file_get_contents($config_dir.'/'.$configfile); - $content = str_replace('#2.3+','',$content); + $content = str_replace('#2.3+ ','',$content); file_put_contents($config_dir.'/'.$configfile,$content); unset($content); @@ -155,6 +155,15 @@ class installer extends installer_base { } } + //* dovecot-managesieved + if($configure_managesieve = is_file('/usr/lib/dovecot/managesieve')) { + //remove #mangesieve+ comment + $content = file_get_contents($config_dir.'/'.$configfile); + $content = str_replace('#mangesieve+ ','',$content); + file_put_contents($config_dir.'/'.$configfile,$content); + unset($content); + } + //* dovecot-lmtpd if($configure_lmtp) { replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index e5ac1428d8..73995498d3 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1347,7 +1347,7 @@ class installer_base { } //remove #2.3+ comment $content = file_get_contents($config_dir.'/'.$configfile); - $content = str_replace('#2.3+','',$content); + $content = str_replace('#2.3+ ','',$content); file_put_contents($config_dir.'/'.$configfile,$content); unset($content); @@ -1358,6 +1358,15 @@ class installer_base { } } + //* dovecot-managesieved + if($configure_managesieve = is_file('/usr/lib/dovecot/managesieve')) { + //remove #mangesieve+ comment + $content = file_get_contents($config_dir.'/'.$configfile); + $content = str_replace('#mangesieve+ ','',$content); + file_put_contents($config_dir.'/'.$configfile,$content); + unset($content); + } + //* dovecot-lmtpd if($configure_lmtp) { replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 1f51f23ad3..c21ab94ad9 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -119,3 +119,5 @@ namespace inbox { special_use = \Trash } } + +#managesieve+ protocols = $protocols sieve diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index b71ede7534..8a204e7776 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -96,3 +96,5 @@ plugin { quota_status_nouser = DUNNO quota_status_overquota = "552 5.2.2 Mailbox is full" } + +#managesieve+ protocols = $protocols sieve diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 9115404d9f..207983f86e 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -114,3 +114,5 @@ namespace inbox { special_use = \Trash } } + +#managesieve+ protocols = $protocols sieve diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index 7fb51246f9..42230ed300 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -113,3 +113,5 @@ namespace inbox { special_use = \Trash } } + +#managesieve+ protocols = $protocols sieve -- GitLab From 2120766a264199d00580dfcbde98008bfd8e2815 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 14 Oct 2019 17:53:23 -0600 Subject: [PATCH 0184/1368] use lmtp by default if detected --- install/dist/lib/debian60.lib.php | 27 ++++++++++++++--------- install/lib/installer_base.lib.php | 27 ++++++++++++++--------- install/tpl/debian6_dovecot2.conf.master | 1 - install/tpl/debian_dovecot2.conf.master | 1 - install/tpl/fedora_dovecot2.conf.master | 1 - install/tpl/opensuse_dovecot2.conf.master | 1 - 6 files changed, 32 insertions(+), 26 deletions(-) diff --git a/install/dist/lib/debian60.lib.php b/install/dist/lib/debian60.lib.php index cd3b46e544..faac52b227 100644 --- a/install/dist/lib/debian60.lib.php +++ b/install/dist/lib/debian60.lib.php @@ -33,11 +33,16 @@ class installer extends installer_base { public function configure_dovecot() { global $conf; - + $virtual_transport = 'dovecot'; $configure_lmtp = false; - + + // use lmtp if installed + if($configure_lmtp = is_file('/usr/lib/dovecot/lmtp')) { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + } + // check if virtual_transport must be changed if ($this->is_update) { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']); @@ -155,20 +160,20 @@ class installer extends installer_base { } } - //* dovecot-managesieved - if($configure_managesieve = is_file('/usr/lib/dovecot/managesieve')) { - //remove #mangesieve+ comment - $content = file_get_contents($config_dir.'/'.$configfile); - $content = str_replace('#mangesieve+ ','',$content); - file_put_contents($config_dir.'/'.$configfile,$content); - unset($content); - } + $dovecot_protocols = 'imap pop3'; //* dovecot-lmtpd if($configure_lmtp) { - replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); + $dovecot_protocols .= ' lmtp' + } + + //* dovecot-managesieved + if(is_file('/usr/lib/dovecot/managesieve')) { + $dovecot_protocols .= ' sieve' } + replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', "protocols = $dovecot_protocols", 1, 0); + //* dovecot-sql.conf $configfile = 'dovecot-sql.conf'; if(is_file($config_dir.'/'.$configfile)){ diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 73995498d3..ee9d1a6d8d 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1233,11 +1233,16 @@ class installer_base { public function configure_dovecot() { global $conf; - + $virtual_transport = 'dovecot'; $configure_lmtp = false; - + + // use lmtp if installed + if($configure_lmtp = is_file('/usr/lib/dovecot/lmtp')) { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + } + // check if virtual_transport must be changed if ($this->is_update) { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']); @@ -1358,20 +1363,20 @@ class installer_base { } } - //* dovecot-managesieved - if($configure_managesieve = is_file('/usr/lib/dovecot/managesieve')) { - //remove #mangesieve+ comment - $content = file_get_contents($config_dir.'/'.$configfile); - $content = str_replace('#mangesieve+ ','',$content); - file_put_contents($config_dir.'/'.$configfile,$content); - unset($content); - } + $dovecot_protocols = 'imap pop3'; //* dovecot-lmtpd if($configure_lmtp) { - replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); + $dovecot_protocols .= ' lmtp' + } + + //* dovecot-managesieved + if(is_file('/usr/lib/dovecot/managesieve')) { + $dovecot_protocols .= ' sieve' } + replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', "protocols = $dovecot_protocols", 1, 0); + //* dovecot-sql.conf $configfile = 'dovecot-sql.conf'; if(is_file($config_dir.'/'.$configfile)) { diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index c21ab94ad9..95acb721e0 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -120,4 +120,3 @@ namespace inbox { } } -#managesieve+ protocols = $protocols sieve diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index 8a204e7776..dbacf872f5 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -97,4 +97,3 @@ plugin { quota_status_overquota = "552 5.2.2 Mailbox is full" } -#managesieve+ protocols = $protocols sieve diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 207983f86e..08ac94a903 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -115,4 +115,3 @@ namespace inbox { } } -#managesieve+ protocols = $protocols sieve diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index 42230ed300..6e040b9745 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -114,4 +114,3 @@ namespace inbox { } } -#managesieve+ protocols = $protocols sieve -- GitLab From f78f7cc60c5ee6598c93ef8a6fcde8fb6036a288 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 14 Oct 2019 18:24:49 -0600 Subject: [PATCH 0185/1368] talk to amavis with lmtp if detected: closes #4792 --- install/lib/installer_base.lib.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index ee9d1a6d8d..e0bf16c6aa 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -927,17 +927,26 @@ class installer_base { //* mysql-virtual_uids.cf $this->process_postfix_config('mysql-virtual_uids.cf'); + // test if lmtp if available + $configure_lmtp = $this->get_postfix_service('lmtp','unix'); + //* postfix-dkim $filename='tag_as_originating.re'; $full_file_name=$config_dir.'/'.$filename; if(is_file($full_file_name)) copy($full_file_name, $full_file_name.'~'); $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/postfix-'.$filename.'.master', 'tpl/postfix-'.$filename.'.master'); + if($configure_lmtp) { + $content = preg_replace('/amavis:/', 'lmtp:', $content); + } wf($full_file_name, $content); $filename='tag_as_foreign.re'; $full_file_name=$config_dir.'/'.$filename; if(is_file($full_file_name)) copy($full_file_name, $full_file_name.'~'); $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/postfix-'.$filename.'.master', 'tpl/postfix-'.$filename.'.master'); + if($configure_lmtp) { + $content = preg_replace('/amavis:/', 'lmtp:', $content); + } wf($full_file_name, $content); //* Changing mode and group of the new created config files. @@ -1423,6 +1432,8 @@ class installer_base { // TODO: chmod and chown on the config file + // test if lmtp if available + $configure_lmtp = $this->get_postfix_service('lmtp','unix'); // Adding the amavisd commands to the postfix configuration // Add array for no error in foreach and maybe future options @@ -1430,7 +1441,8 @@ class installer_base { // Check for amavisd -> pure webserver with postfix for mailing without antispam if ($conf['amavis']['installed']) { - $postconf_commands[] = 'content_filter = amavis:[127.0.0.1]:10024'; + $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis'; + $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024"; $postconf_commands[] = 'receive_override_options = no_address_mappings'; } -- GitLab From 5353f1d9d58e3bb651323b0f7f3ccd07df2b8355 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 30 Oct 2019 10:21:26 -0600 Subject: [PATCH 0186/1368] use unix domain socket for quota-status (#4649) --- install/tpl/debian6_dovecot2.conf.master | 8 ++++---- install/tpl/debian_dovecot2.conf.master | 8 ++++---- install/tpl/debian_postfix.conf.master | 4 ++-- install/tpl/fedora_dovecot2.conf.master | 8 ++++---- install/tpl/fedora_postfix.conf.master | 4 ++-- install/tpl/gentoo_postfix.conf.master | 4 ++-- install/tpl/opensuse_dovecot2.conf.master | 8 ++++---- install/tpl/opensuse_postfix.conf.master | 4 ++-- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 95acb721e0..973ada2f99 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -87,10 +87,10 @@ protocol lmtp { service quota-status { executable = quota-status -p postfix - inet_listener { - # separate multiple addresses with space: - address = 127.0.0.1 - port = 10060 + unix_listener /var/spool/postfix/private/quota-status { + group = postfix + mode = 0660 + user = postfix } client_limit = 1 } diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index dbacf872f5..d4fc7ebd0f 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -84,10 +84,10 @@ protocol lmtp { service quota-status { executable = quota-status -p postfix - inet_listener { - # separate multiple addresses with space: - address = 127.0.0.1 - port = 10060 + unix_listener /var/spool/postfix/private/quota-status { + group = postfix + mode = 0660 + user = postfix } client_limit = 1 } diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 4d03dfd005..95603bac39 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -15,8 +15,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 -smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 08ac94a903..dbef641fdf 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -82,10 +82,10 @@ mail_plugins = $mail_plugins quota service quota-status { executable = quota-status -p postfix - inet_listener { - # separate multiple addresses with space: - address = 127.0.0.1 - port = 10060 + unix_listener /var/spool/postfix/private/quota-status { + group = postfix + mode = 0660 + user = postfix } client_limit = 1 } diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index 8bda2b7dcc..f651a02729 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -11,8 +11,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 -smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index 79a9dcd63d..2d562c74a9 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -10,8 +10,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 -smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index 6e040b9745..a1bdfa1f91 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -81,10 +81,10 @@ mail_plugins = $mail_plugins quota service quota-status { executable = quota-status -p postfix - inet_listener { - # separate multiple addresses with space: - address = 127.0.0.1 - port = 10060 + unix_listener /var/spool/postfix/private/quota-status { + group = postfix + mode = 0660 + user = postfix } client_limit = 1 } diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index 6661bffd98..7517043e63 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -13,8 +13,8 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service inet:127.0.0.1:10060 -smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:10060 +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert -- GitLab From e9b92aa62f3f8557d4351f649b702fe3c4cfef4d Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 31 Oct 2019 15:46:25 -0600 Subject: [PATCH 0187/1368] bugfixes and remove/add master.cf templates to effect changes --- install/dist/lib/debian60.lib.php | 4 +- install/lib/install.lib.php | 25 +++++++--- install/lib/installer_base.lib.php | 79 +++++++++++++++++++++++++++--- 3 files changed, 92 insertions(+), 16 deletions(-) diff --git a/install/dist/lib/debian60.lib.php b/install/dist/lib/debian60.lib.php index faac52b227..a8e90f189b 100644 --- a/install/dist/lib/debian60.lib.php +++ b/install/dist/lib/debian60.lib.php @@ -164,12 +164,12 @@ class installer extends installer_base { //* dovecot-lmtpd if($configure_lmtp) { - $dovecot_protocols .= ' lmtp' + $dovecot_protocols .= ' lmtp'; } //* dovecot-managesieved if(is_file('/usr/lib/dovecot/managesieve')) { - $dovecot_protocols .= ' sieve' + $dovecot_protocols .= ' sieve'; } replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', "protocols = $dovecot_protocols", 1, 0); diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 02ebba2850..ea4e563a6a 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -471,29 +471,38 @@ function rf($file){ } function wf($file, $content){ - mkdirs(dirname($file)); + if(!$ret_val = mkdirs(dirname($file))) return false; if(!$fp = fopen($file, 'wb')){ ilog('WARNING: could not open file '.$file); + // implicitly returned false because the following fwrite and fclose both fail, + // but to be explicit: + $ret_val = false; } - fwrite($fp, $content); - fclose($fp); + fwrite($fp, $content) or $ret_val = false; + fclose($fp) or $ret_val = false; + return $ret_val; } function af($file, $content){ - mkdirs(dirname($file)); + if(!$ret_val = mkdirs(dirname($file))) return false; if(!$fp = fopen($file, 'ab')){ ilog('WARNING: could not open file '.$file); + $ret_val = false; } - fwrite($fp, $content); - fclose($fp); + fwrite($fp, $content) or $ret_val = false; + fclose($fp) or $ret_val = false; + return $ret_val; } function aftsl($file, $content){ + $ret_val = true; if(!$fp = fopen($file, 'ab')){ ilog('WARNING: could not open file '.$file); + $ret_val = false; } - fwrite($fp, $content); - fclose($fp); + fwrite($fp, $content) or $ret_val = false; + fclose($fp) or $ret_val = false; + return $ret_val; } function unix_nl($input){ diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index e0bf16c6aa..5ca16cc674 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -864,7 +864,7 @@ class installer_base { exec ("postconf -M $service.$type 2> /dev/null", $out, $ret); } $postfix_service = @($out[0]=='')?false:true; - } else { //* fallback - Postfix < 2.9 + } else { //* fallback - Postfix < 2.9 $content = rf($conf['postfix']['config_dir'].'/master.cf'); $regex = "/^((?!#)".$service.".*".$type.".*)$/m"; $postfix_service = @(preg_match($regex, $content))?true:false; @@ -873,6 +873,68 @@ class installer_base { return $postfix_service; } + public function remove_postfix_service( $service, $type ) { + global $conf; + + // nothing to do if the service isn't even defined. + if (! $this->get_postfix_service( $service, $type ) ) { + return true; + } + + $postfix_version = `postconf -d mail_version 2>/dev/null`; + $postfix_version = preg_replace( '/mail_version\s*=\s*(.*)\s*/', '$1', $postfix_version ); + + if ( version_compare( $postfix_version, '2.11', '>=' ) ) { + + exec("postconf -X -M $service/$type 2> /dev/null", $out, $ret); + + # reduce 3 or more newlines to 2 + $content = rf($conf['postfix']['config_dir'].'/master.cf'); + $content = preg_replace( '/(\r?\n){3,}/', '$1$1', $content ); + wf( $conf['postfix']['config_dir'].'/master.cf', $content ); + + } else { //* fallback - Postfix < 2.11 + + if ( ! $cf = fopen( $conf['postfix']['config_dir'].'/master.cf', 'r' ) ) { + return false; + } + + $out = ""; + $reading_service = false; + + while ( !feof( $cf ) ) { + $line = fgets( $cf ); + + if ( $reading_service ) { + # regex matches a new service or "empty" (whitespace) line + if ( preg_match( '/^([^\s#]+.*|\s*)$/', $line ) && + ! preg_match( '/^'.$service.'\s+'.$type.'/', $line ) ) { + $out .= $line; + $reading_service = false; + } + + # $skipped_lines .= $line; + + # regex matches definition matching service to be removed + } else if ( preg_match( '/^'.$service.'\s+'.$type.'/', $line ) ) { + + $reading_service = true; + # $skipped_lines .= $line; + + } else { + $out .= $line; + } + } + fclose( $cf ); + + $out = preg_replace( '/(\r?\n){3,}/', '$1$1', $out ); # reduce 3 or more newlines to 2 + + return wf( $conf['postfix']['config_dir'].'/master.cf', $out ); + } + + return true; + } + public function configure_postfix($options = '') { global $conf,$autoinstall; $cf = $conf['postfix']; @@ -1376,12 +1438,12 @@ class installer_base { //* dovecot-lmtpd if($configure_lmtp) { - $dovecot_protocols .= ' lmtp' + $dovecot_protocols .= ' lmtp'; } //* dovecot-managesieved if(is_file('/usr/lib/dovecot/managesieve')) { - $dovecot_protocols .= ' sieve' + $dovecot_protocols .= ' sieve'; } replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', "protocols = $dovecot_protocols", 1, 0); @@ -1458,11 +1520,16 @@ class installer_base { $config_dir = $conf['postfix']['config_dir']; // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); +// $add_amavis = !$this->get_postfix_service('amavis','unix'); +// $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); +// $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); //*TODO: check templates against existing postfix-services to make sure we use the template + // Or just remove the old service definitions and add them again? + $add_amavis = $this->remove_postfix_service('amavis','unix'); + $add_amavis_10025 = $this->remove_postfix_service('127.0.0.1:10025','inet'); + $add_amavis_10027 = $this->remove_postfix_service('127.0.0.1:10027','inet'); + if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { //* backup master.cf if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); -- GitLab From fa8183967b38dd5e751db23157c5126fe1e8c178 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 11 Nov 2019 17:30:17 -0700 Subject: [PATCH 0188/1368] remove quota-status policy server from smtpd_end_of_data_restrictions: closes #4649 --- install/tpl/debian_postfix.conf.master | 1 - install/tpl/fedora_postfix.conf.master | 1 - install/tpl/gentoo_postfix.conf.master | 1 - install/tpl/opensuse_postfix.conf.master | 1 - 4 files changed, 4 deletions(-) diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 95603bac39..0df3ae38e8 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -16,7 +16,6 @@ smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status -smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index f651a02729..3e5646a036 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -12,7 +12,6 @@ smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status -smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index 2d562c74a9..da482fc561 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -11,7 +11,6 @@ smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status -smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index 7517043e63..47f582af0c 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -14,7 +14,6 @@ smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status -smtpd_end_of_data_restrictions = check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert -- GitLab From d9a2d35574f20d5403507f50f655ac98b749787e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 13 Nov 2019 17:20:33 -0700 Subject: [PATCH 0189/1368] read ISPConfig's sieve script via sieve_after: closes #3395 --- install/tpl/debian6_dovecot.conf.master | 6 +++ install/tpl/debian6_dovecot2.conf.master | 6 +++ install/tpl/debian_dovecot.conf.master | 7 +++- install/tpl/debian_dovecot2.conf.master | 6 +++ install/tpl/fedora_dovecot.conf.master | 9 ++++- install/tpl/fedora_dovecot2.conf.master | 7 ++++ install/tpl/opensuse_dovecot.conf.master | 9 ++++- install/tpl/opensuse_dovecot2.conf.master | 7 ++++ server/conf/sieve_filter.master | 5 ++- server/conf/sieve_filter_1.2.master | 3 ++ .../maildeliver_plugin.inc.php | 37 ++++++++++++------- 11 files changed, 83 insertions(+), 19 deletions(-) diff --git a/install/tpl/debian6_dovecot.conf.master b/install/tpl/debian6_dovecot.conf.master index 4286689cd4..a112712690 100644 --- a/install/tpl/debian6_dovecot.conf.master +++ b/install/tpl/debian6_dovecot.conf.master @@ -57,7 +57,13 @@ plugin { # the maildir quota does not need to be set. # You do not need: quota = maildir + # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 973ada2f99..c82ac59a38 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -24,7 +24,13 @@ userdb { } plugin { quota = dict:user::file:/var/vmail/%d/%n/.quotausage + + # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 sieve_max_redirects = 25 } service auth { diff --git a/install/tpl/debian_dovecot.conf.master b/install/tpl/debian_dovecot.conf.master index 8d6022502f..f91959a1f5 100644 --- a/install/tpl/debian_dovecot.conf.master +++ b/install/tpl/debian_dovecot.conf.master @@ -682,7 +682,7 @@ protocol managesieve { # the sieve storage directory. This must match the SIEVE setting used by # deliver (refer to http://wiki.dovecot.org/LDA/Sieve#location for more # info). Variable substitution with % is recognized. - sieve=~/.dovecot.sieve + sieve=~/.sieve # This specifies the path to the directory where the uploaded scripts must # be stored. In terms of '%' variable substitution it is identical to @@ -1144,4 +1144,9 @@ plugin { # they're moved to a 3rd namespace. The mails won't be counted in quota, # and they're not deleted automatically (use a cronjob or something). #lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/ + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index d4fc7ebd0f..25c586118c 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -23,7 +23,13 @@ userdb { } plugin { quota = dict:user::file:/var/vmail/%d/%n/.quotausage + + # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 sieve_max_redirects = 25 } service auth { diff --git a/install/tpl/fedora_dovecot.conf.master b/install/tpl/fedora_dovecot.conf.master index cfac856414..e687954986 100644 --- a/install/tpl/fedora_dovecot.conf.master +++ b/install/tpl/fedora_dovecot.conf.master @@ -1300,11 +1300,16 @@ plugin { # # Location of the active script. When ManageSieve is used this is actually # a symlink pointing to the active script in the sieve storage directory. - #sieve=~/.dovecot.sieve - # + sieve=~/.sieve + # The path to the directory where the personal Sieve scripts are stored. For # ManageSieve this is where the uploaded scripts are stored. sieve_dir=~/sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } # Config files can also be included. deliver doesn't support them currently. diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index dbef641fdf..9fd5ed92c2 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -21,7 +21,14 @@ userdb { } plugin { quota = dict:user::file:/var/vmail/%d/%n/.quotausage + + # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } service auth { unix_listener /var/spool/postfix/private/auth { diff --git a/install/tpl/opensuse_dovecot.conf.master b/install/tpl/opensuse_dovecot.conf.master index 9d345fa911..1eacf4c3a3 100644 --- a/install/tpl/opensuse_dovecot.conf.master +++ b/install/tpl/opensuse_dovecot.conf.master @@ -1274,11 +1274,16 @@ plugin { # # Location of the active script. When ManageSieve is used this is actually # a symlink pointing to the active script in the sieve storage directory. - sieve=~/.dovecot.sieve - # + sieve=~/.sieve + # The path to the directory where the personal Sieve scripts are stored. For # ManageSieve this is where the uploaded scripts are stored. sieve_dir=~/sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } # Config files can also be included. deliver doesn't support them currently. diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index a1bdfa1f91..94e658aecc 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -21,7 +21,14 @@ userdb { } plugin { quota = dict:user::file:/var/vmail/%d/%n/.quotausage + + # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve + + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_max_script_size = 2M + sieve_max_actions = 100 + sieve_max_redirects = 25 } service auth { unix_listener /var/spool/postfix/private/auth { diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index 13c08dd56b..f72cd11d1f 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -1,3 +1,6 @@ +# This sieve script is generated by ISPConfig, any changes made will be overwritten. +# You can create and activate a per-user sieve script (manually or via managesieve), +# which will execute before this. require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; @@ -36,4 +39,4 @@ vacation :days 1 # :addresses ["test@test.int", "till@test.int"] ""; - \ No newline at end of file +
diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master index 5244693102..edd4060b9f 100644 --- a/server/conf/sieve_filter_1.2.master +++ b/server/conf/sieve_filter_1.2.master @@ -1,3 +1,6 @@ +# This sieve script is generated by ISPConfig, any changes made will be overwritten. +# You can create and activate a per-user sieve script (manually or via managesieve), +# which will execute before this. require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 2c16601f50..9c9939655c 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -98,9 +98,16 @@ class maildeliver_plugin { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); $sieve_file = $data["new"]["maildir"].'/.sieve'; - $sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; - if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); + $sieve_file_svbin = $data["new"]["maildir"].'/.sieve.svbin'; + $old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; + $sieve_file_isp = $data["new"]["maildir"].'/.ispconfig.sieve'; + $sieve_file_isp_svbin = $data["new"]["maildir"].'/.ispconfig.svbin'; + if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); + // cleanup .sieve file if it is now a broken link + if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); + if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin) or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN); if(is_file($sieve_file_isp)) unlink($sieve_file_isp) or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_svbin)) unlink($sieve_file_isp_svbin) or $app->log("Unable to delete file: $sieve_file_isp_svbin", LOGLEVEL_WARN); $app->load('tpl'); //* Select sieve filter file for dovecot version @@ -221,16 +228,13 @@ class maildeliver_plugin { if ( is_file($sieve_file_isp) ) { $app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false); $app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false); + + $app->system->exec_safe("sievec ?", "$sieve_file_isp"); + if ( is_file($sieve_file_isp_svbin) ) { + $app->system->chown($sieve_file_isp_svbin,$mail_config['mailuser_name'],false); + $app->system->chgrp($sieve_file_isp_svbin,$mail_config['mailuser_group'],false); + } } - chdir($data["new"]["maildir"]); - //* create symlink to activate sieve script - symlink("sieve/ispconfig.sieve", ".sieve") or $app->log("Unable to create symlink to active sieve filter", LOGLEVEL_WARN); - if (is_link(".sieve")) { - $app->system->chown(".sieve",$mail_config['mailuser_name'],true); - $app->system->chgrp(".sieve",$mail_config['mailuser_group'],true); - } - $app->system->chown($sieve_file,$mail_config['mailuser_name'],true); - $app->system->chgrp($sieve_file,$mail_config['mailuser_group'],true); unset($tpl); @@ -241,9 +245,16 @@ class maildeliver_plugin { global $app, $conf; $sieve_file = $data["old"]["maildir"].'/.sieve'; - $sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve'; - if(is_file($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); + $sieve_file_svbin = $data["old"]["maildir"].'/.sieve.svbin'; + $old_sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve'; + $sieve_file_isp = $data["old"]["maildir"].'/.ispconfig.sieve'; + $sieve_file_isp_svbin = $data["old"]["maildir"].'/.ispconfig.svbin'; + if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); + // cleanup .sieve file if it is now a broken link + if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); + if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin) or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN); if(is_file($sieve_file_isp)) unlink($sieve_file_isp) or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_svbin)) unlink($sieve_file_isp_svbin) or $app->log("Unable to delete file: $sieve_file_isp_svbin", LOGLEVEL_WARN); } -- GitLab From 8735bd886b43ec75e621789f513a663d0ea38ec8 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 13 Nov 2019 17:24:51 -0700 Subject: [PATCH 0190/1368] update to current setting names --- install/tpl/debian_postfix.conf.master | 2 +- install/tpl/fedora_postfix.conf.master | 2 +- install/tpl/gentoo_postfix.conf.master | 2 +- install/tpl/opensuse_postfix.conf.master | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 0df3ae38e8..c50d826e01 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -26,7 +26,7 @@ relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps smtpd_helo_required = yes -smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo +smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf smtpd_client_message_rate_limit = 100 diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index 3e5646a036..1c8326de2a 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -22,7 +22,7 @@ relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps smtpd_helo_required = yes -smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo +smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf smtpd_client_message_rate_limit = 100 diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index da482fc561..51f30d914e 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -21,7 +21,7 @@ relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps smtpd_helo_required = yes -smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, check_helo_access regexp:{config_dir}/blacklist_helo +smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf smtpd_client_message_rate_limit = 100 diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index 47f582af0c..a1203013ef 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -24,7 +24,7 @@ relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps smtpd_helo_required = yes -smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_invalid_hostname, reject_non_fqdn_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo +smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re smtpd_client_restrictions = check_client_access mysql:{config_dir}/mysql-virtual_client.cf smtpd_client_message_rate_limit = 100 -- GitLab From 75cd4fecbf02ad68deb8554f330189082979c1f2 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 13 Nov 2019 17:33:25 -0700 Subject: [PATCH 0191/1368] rbl blocking should happen after whitelist lookups for whitelisting to override rbls --- install/tpl/debian_postfix.conf.master | 2 +- install/tpl/fedora_postfix.conf.master | 2 +- install/tpl/gentoo_postfix.conf.master | 2 +- install/tpl/opensuse_postfix.conf.master | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index c50d826e01..1c739a5c7e 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -15,7 +15,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index 1c8326de2a..d504c6ed56 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -11,7 +11,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index 51f30d914e..cad2b97c3c 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -10,7 +10,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index a1203013ef..c59d46fa97 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -13,7 +13,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination{rbl_list}, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert -- GitLab From 1bce29fdbf7fe4a72e7258e184058fb8427ddc53 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 13 Nov 2019 17:59:56 -0700 Subject: [PATCH 0192/1368] older dovecot requires namespace separator --- install/tpl/debian6_dovecot2.conf.master | 1 + install/tpl/fedora_dovecot2.conf.master | 1 + install/tpl/opensuse_dovecot2.conf.master | 1 + 3 files changed, 3 insertions(+) diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index c82ac59a38..6f32e6d5a2 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -109,6 +109,7 @@ plugin { imap_capability=+SEPCIAL-USE XLIST namespace inbox { inbox = yes + separator = . mailbox Drafts { special_use = \Drafts } diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 9fd5ed92c2..ee80f8c0d9 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -105,6 +105,7 @@ plugin { imap_capability=+SEPCIAL-USE XLIST namespace inbox { inbox = yes + separator = . mailbox Drafts { special_use = \Drafts } diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index 94e658aecc..070590181b 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -104,6 +104,7 @@ plugin { imap_capability=+SEPCIAL-USE XLIST namespace inbox { inbox = yes + separator = . mailbox Drafts { special_use = \Drafts } -- GitLab From 1e9c3880bb2908f82ba2b013245f132379ff9977 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 19 Nov 2019 17:27:49 -0700 Subject: [PATCH 0193/1368] postfix_server_plugin checks for dovecot lmtp and sieve (#3395 and #4792) --- .../postfix_server_plugin.inc.php | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index ad48e3dee8..80db1c102a 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -158,24 +158,35 @@ class postfix_server_plugin { } if($app->system->is_installed('dovecot')) { + $virtual_transport = 'dovecot'; + $configure_lmtp = false; + $dovecot_protocols = 'imap pop3'; + + //* dovecot-lmtpd + if( ($configure_lmtp = is_file('/usr/lib/dovecot/lmtp')) || + ($mail_config["mailbox_virtual_uidgid_maps"] == 'y') ) + { + $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; + $dovecot_protocols .= ' lmtp'; + } + + //* dovecot-managesieved + if(is_file('/usr/lib/dovecot/managesieve')) { + $dovecot_protocols .= ' sieve'; + } + $out = null; exec("postconf -n virtual_transport", $out); - if ($mail_config["mailbox_virtual_uidgid_maps"] == 'y') { - // If dovecot switch to lmtp - if($out[0] != "virtual_transport = lmtp:unix:private/dovecot-lmtp") { - exec("postconf -e 'virtual_transport = lmtp:unix:private/dovecot-lmtp'"); - exec('postfix reload'); - $app->system->replaceLine("/etc/dovecot/dovecot.conf", "protocols = imap pop3", "protocols = imap pop3 lmtp"); - exec($conf['init_scripts'] . '/' . 'dovecot restart'); - } - } else { - // If dovecot switch to dovecot - if($out[0] != "virtual_transport = dovecot") { - exec("postconf -e 'virtual_transport = dovecot'"); - exec('postfix reload'); - $app->system->replaceLine("/etc/dovecot/dovecot.conf", "protocols = imap pop3 lmtp", "protocols = imap pop3"); - exec($conf['init_scripts'] . '/' . 'dovecot restart'); - } + if($out[0] != "virtual_transport = $virtual_transport") { + exec("postconf -e 'virtual_transport = $virtual_transport'"); + exec('postfix reload'); + } + + $out = null; + exec("grep '^protocols\s' /etc/dovecot/dovecot.conf", $out); + if($out[0] != "protocols = $dovecot_protocols") { + $app->system->replaceLine("/etc/dovecot/dovecot.conf", 'REGEX:/^protocols\s=/', "protocols = $dovecot_protocols"); + exec($conf['init_scripts'] . '/' . 'dovecot restart'); } } @@ -222,7 +233,7 @@ class postfix_server_plugin { exec("postconf -X 'milter_default_action'"); exec("postconf -e 'receive_override_options = no_address_mappings'"); - exec("postconf -e 'content_filter = amavis:[127.0.0.1]:10024'"); + exec("postconf -e 'content_filter = " . ($configure_lmtp ? "lmtp" : "amavis" ) . ":[127.0.0.1]:10024'"); exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, permit_sasl_authenticated, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); } -- GitLab From 6adf9d2181b6fdb2ca2362124bcce88222048d4c Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 2 Jun 2020 14:46:50 -0600 Subject: [PATCH 0194/1368] update disablelmtp field --- interface/web/mail/mail_user_edit.php | 7 ++++--- interface/web/tools/import_vpopmail.php | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 7255c6dbac..c7f36a89e0 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -313,8 +313,9 @@ class page_action extends tform_actions { $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ? WHERE mailuser_id = ?"; $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); } } @@ -365,8 +366,8 @@ class page_action extends tform_actions { $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); } //** If the email address has been changed, change it in all aliases too diff --git a/interface/web/tools/import_vpopmail.php b/interface/web/tools/import_vpopmail.php index 3e732d3740..7ae4efb58b 100644 --- a/interface/web/tools/import_vpopmail.php +++ b/interface/web/tools/import_vpopmail.php @@ -242,6 +242,7 @@ function start_import() { "disablesmtp" => 'n', "disablesieve" => 'n', "disablelda" => 'n', + "disablelmtp" => 'n', "disabledoveadm" => 'n' ); $app->db->datalogInsert('mail_user', $sql, 'mailuser_id'); -- GitLab From 64a58f233198456564c8b1e067bb582d901f4034 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 11 Jun 2020 12:06:46 -0600 Subject: [PATCH 0195/1368] add mail_user.disableindexer-worker column. fixes #3108 --- install/sql/incremental/upd_dev_collection.sql | 3 +++ install/sql/ispconfig3.sql | 1 + 2 files changed, 4 insertions(+) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 91db879d0c..aebc01dcb8 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -29,3 +29,6 @@ UPDATE `mail_user` set `disabledoveadm` = 'n'; -- add disablequota-status for quota-status policy daemon ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disabledoveadm`; + +-- add disableindexer-worker for solr search +ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disablequota-status`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index cc266ff235..9d2fb74134 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1063,6 +1063,7 @@ CREATE TABLE `mail_user` ( `disablelmtp` enum('n','y') NOT NULL default 'n', `disabledoveadm` enum('n','y') NOT NULL default 'n', `disablequota-status` enum('n','y') NOT NULL default 'n', + `disableindexer-worker` enum('n','y') NOT NULL default 'n', `last_quota_notification` date NULL default NULL, `backup_interval` VARCHAR( 255 ) NOT NULL default 'none', `backup_copies` INT NOT NULL DEFAULT '1', -- GitLab From d38cca15c31ad61f20c96d2d423881b41853f41e Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Fri, 12 Jun 2020 20:06:35 +0200 Subject: [PATCH 0196/1368] Rename no_policy to inherit_policy (#4277) --- interface/web/mail/lib/lang/ar_mail_user.lng | 2 +- interface/web/mail/lib/lang/bg_mail_user.lng | 2 +- interface/web/mail/lib/lang/br_mail_user.lng | 2 +- interface/web/mail/lib/lang/ca_mail_user.lng | 2 +- interface/web/mail/lib/lang/cz_mail_user.lng | 2 +- interface/web/mail/lib/lang/de_mail_user.lng | 2 +- interface/web/mail/lib/lang/dk_mail_user.lng | 2 +- interface/web/mail/lib/lang/el_mail_user.lng | 2 +- interface/web/mail/lib/lang/en_mail_user.lng | 2 +- interface/web/mail/lib/lang/es_mail_user.lng | 2 +- interface/web/mail/lib/lang/fi_mail_user.lng | 2 +- interface/web/mail/lib/lang/fr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hu_mail_user.lng | 2 +- interface/web/mail/lib/lang/id_mail_user.lng | 2 +- interface/web/mail/lib/lang/it_mail_user.lng | 2 +- interface/web/mail/lib/lang/ja_mail_user.lng | 2 +- interface/web/mail/lib/lang/nl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pt_mail_user.lng | 2 +- interface/web/mail/lib/lang/ro_mail_user.lng | 2 +- interface/web/mail/lib/lang/ru_mail_user.lng | 2 +- interface/web/mail/lib/lang/se_mail_user.lng | 2 +- interface/web/mail/lib/lang/sk_mail_user.lng | 2 +- interface/web/mail/lib/lang/tr_mail_user.lng | 2 +- interface/web/mail/mail_user_edit.php | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index c68becf335..6aed9d1d1e 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Disable IMAP'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 000377077b..a5ac34c577 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Разреши получаване'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Разреши достъп'; $wb['policy_txt'] = 'Спам филтър'; -$wb['no_policy'] = '- забранен -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Достигнат е максималният брой на пощенските кутии за твоят профил.'; $wb['limit_mailquota_txt'] = 'Максималното отделено място за твоята кутия е достигнато. Максималното позволено място в МБ е '; $wb['disableimap_txt'] = 'Забрани IMAP'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index ed6e35ef61..c5200273cc 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -27,7 +27,7 @@ $wb['postfix_txt'] = 'Habilitar recebimento'; $wb['greylisting_txt'] = 'Habilitar greylist'; $wb['access_txt'] = 'Habilitar acesso'; $wb['policy_txt'] = 'Filtros anti-spam'; -$wb['no_policy'] = '-desabilitado-'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'O limite de contas de e-mail para esta conta foi alcançado.'; $wb['limit_mailquota_txt'] = 'O limite de tamanho para as contas de e-mails foi alcançado. O espaço disponível em MB é'; $wb['disablesmtp_txt'] = 'Desabilitar SMTP (envio)'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 096572b5e0..ffabcf2395 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -18,7 +18,7 @@ $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; $wb['access_txt'] = 'Activer l\'accès'; $wb['policy_txt'] = 'Filtre antispam'; -$wb['no_policy'] = '- inactif -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Le nombre maximal de boites courriel pour votre compte est atteint..'; $wb['limit_mailquota_txt'] = 'Lespace maximal pour les boites courriel est atteint. Lespace maximal disponible est de '; $wb['disableimap_txt'] = 'Désactiver IMAP'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index c697e4cffc..909a7b2b5b 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -22,7 +22,7 @@ $wb['maildir_txt'] = 'E-mailový adresář'; $wb['postfix_txt'] = 'Povolit příjem'; $wb['access_txt'] = 'Povolit přístup'; $wb['policy_txt'] = 'Spamový filtr'; -$wb['no_policy'] = '- nepovoleno -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Byl dosažen maximální počet mailboxů pro Váš účet.'; $wb['limit_mailquota_txt'] = 'Dosažen maximální prostor pro mailboxy. Max. dostupné místo v MB je'; $wb['disableimap_txt'] = 'Zakázat IMAP'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index b60a756b09..0eb5a3e9ad 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Aktiviere Empfang'; $wb['greylisting_txt'] = 'Aktiviere Greylisting'; $wb['access_txt'] = 'Aktiviere Zugriff'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- nicht aktiviert -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Die maximale Anzahl an E-Mailkonten für Ihr Konto wurde erreicht.'; $wb['limit_mailquota_txt'] = 'Der maximale Speicherplatz für Ihr E-Mail Konto wurde erreicht. Der maximal verfügbare Speicher in MB ist'; $wb['disablesmtp_txt'] = 'SMTP (Mailversand) deaktivieren'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index fb846da199..b8a641651b 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -24,7 +24,7 @@ $wb['maildir_txt'] = 'Mailmappe'; $wb['postfix_txt'] = 'Aktiver modtagelse'; $wb['access_txt'] = 'Aktiver adgang'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- ikke aktiveret -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Max. antal af mailbokse for din konto er nået.'; $wb['limit_mailquota_txt'] = 'Max. plads for postkasser er nået. Max. tilgængelig plads i MB er'; $wb['disablesmtp_txt'] = 'Deaktiver SMTP (afsending)'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index a097470ad7..381ef2f9ad 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Ενεργοποίηση Λήψης'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Ενεργοποίηση Πρόσβασης'; $wb['policy_txt'] = 'Φίλτρο Spam'; -$wb['no_policy'] = '- ανενεργή -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Έχετε φτάσει το μέγιστο πλήθος των θυρίδων για τον λογαριασμό σας.'; $wb['limit_mailquota_txt'] = 'Έχετε φτάσει στο μέγεστο χώρο της θυρίδα σας.Ο μέγιστος διαθέσιμος χώρος σε MB είναι'; $wb['disableimap_txt'] = 'Απενεργοποίηση IMAP'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 4174081b53..f70140bd4f 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -27,7 +27,7 @@ $wb["postfix_txt"] = 'Enable receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb["access_txt"] = 'Enable access'; $wb["policy_txt"] = 'Spamfilter'; -$wb["no_policy"] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb["limit_mailbox_txt"] = 'The max. number of mailboxes for your account is reached.'; $wb["limit_mailquota_txt"] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb["disablesmtp_txt"] = 'Disable SMTP (sending)'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index 93c2095e1c..cce382fde0 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -44,7 +44,7 @@ $wb['name_optional_txt'] = '(Opcional)'; $wb['name_txt'] = 'Nombre'; $wb['no_backup_txt'] = 'Sin copia de seguridad'; $wb['no_domain_perm'] = 'Usted no tiene permisos para gestionar este dominio.'; -$wb['no_policy'] = '- deshabilitado -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['now_txt'] = 'Ahora'; $wb['password_match_txt'] = 'Las contraseñas coinciden.'; $wb['password_mismatch_txt'] = 'Las contraseñas no coinciden.'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 8f94f0158f..2ede867053 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -18,7 +18,7 @@ $wb['postfix_txt'] = 'Salli vastaanotto'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Salli yhteys'; $wb['policy_txt'] = 'Roskapostisuodatin'; -$wb['no_policy'] = '- ei käytössä -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Tilisi sallittu postilaatikoiden määrä on ylitetty.'; $wb['limit_mailquota_txt'] = 'Tilisi sallittu postilaatikoiden koko on ylitetty. Vapaa tila megatavuina on'; $wb['disableimap_txt'] = 'Estä IMAP'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index bb54c2e0c0..87a1bb9570 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -18,7 +18,7 @@ $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; $wb['access_txt'] = 'Activer l’accès'; $wb['policy_txt'] = 'Filtre antispam'; -$wb['no_policy'] = '- inactif -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Le nombre maximal de boîtes aux lettres pour votre compte est atteint..'; $wb['limit_mailquota_txt'] = 'Lespace maximal pour les boîtes aux lettres est atteint. Lespace maximal disponible est de '; $wb['disableimap_txt'] = 'Désactiver IMAP'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 8dcfe7a6fa..4e48e3a7d7 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Disable IMAP'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 43720fbd84..8f7f826c80 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Bejövő engedélyezés'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Hozzáférés engelyezés'; $wb['policy_txt'] = 'Spam szűrő'; -$wb['no_policy'] = '- nem engelyézett -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Nincs több mailbox lehetőség.'; $wb['limit_mailquota_txt'] = 'Mailbox tárhely elfogyott.'; $wb['disableimap_txt'] = 'IMAP Tiltás'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index ba17e373c7..01bd8f59f4 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -24,7 +24,7 @@ $wb['postfix_txt'] = 'Dapat Menerima'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Dapat Mengakses'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- tidak diaktifkan -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Jumlah maks mailbox untuk akun Anda sudah tercapai.'; $wb['limit_mailquota_txt'] = 'Ruang maks untuk mailbox sudah tercapai. Ruang maks yang tersedia dalam MB adalah'; $wb['disableimap_txt'] = 'Nonaktifkan IMAP'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index e6820a0329..779040835a 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -19,7 +19,7 @@ $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Abilita ricezione'; $wb['access_txt'] = 'Abilita indirizzo'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- non abilitato -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Hai raggiungo il numero massimo di caselle per il tuo account.'; $wb['limit_mailquota_txt'] = 'Hai raggiunto lo spazio massimo per le tue caselle di posta. Lo spazio massimo in MB è di'; $wb['disableimap_txt'] = 'Disabilita IMAP'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index 3cd498f270..17e02481a8 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'メールを受信する'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'アクセスを許可する'; $wb['policy_txt'] = 'スパムフィルター'; -$wb['no_policy'] = '- 利用しない -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'メールボックスが最大数に達した為、これ以上追加できません。'; $wb['limit_mailquota_txt'] = 'メールボックスが一杯です。 上限(MB):'; $wb['disableimap_txt'] = 'IMAP を無効にする'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 65d89a32af..620725b3da 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Ontvangen inschakelen'; $wb['greylisting_txt'] = 'Greylisting inschakelen'; $wb['access_txt'] = 'Toegang inschakelen'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- niet ingeschakeld -'; +$wb['inherit_policy'] = '- Gebruik domein instelling -'; $wb['limit_mailbox_txt'] = 'Het max. aantal mailboxen voor uw account is bereikt.'; $wb['limit_mailquota_txt'] = 'De max. ruimte voor uw mailboxen is bereikt. De max. beschikbare ruimte in MB is'; $wb['disableimap_txt'] = 'Uitschakelen IMAP'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index d090fadb2a..586b823b54 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Zezwól na odbiór poczty'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Możliwy dostęp'; $wb['policy_txt'] = 'Filtr spamu'; -$wb['no_policy'] = '- brak polityki -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Maksymalna ilość skrzynek pocztowych dla Twojego konta została przekroczona.'; $wb['limit_mailquota_txt'] = 'Maksymalna pojemność skrzynki pocztowej została przekroczona. Maksymalne dostępne miejsce w MB to: '; $wb['disableimap_txt'] = 'Wyłącz IMAP'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index aa0e9a0a05..464a7d2de0 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Permitir Recepção'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Permitir Acesso'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- desactivado -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'O número máximo de caixas de correio para a conta foi atingido.'; $wb['limit_mailquota_txt'] = 'O espaço em disco disponível para criação de contas foi atingido.'; $wb['disableimap_txt'] = 'Desactivar IMAP'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index 3f0f8ec479..4143064581 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Numarul maxim de MAILBOX pe contul dumneavoastra a fost atins'; $wb['limit_mailquota_txt'] = 'Spatiul maxim pentru MAILBOX a fost atins.Acesta este '; $wb['disableimap_txt'] = 'Blocheaza IMAP'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index 526c976ed5..1bc76633c0 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Разрешить получение'; $wb['greylisting_txt'] = 'Включить серый список (Greylisting)'; $wb['access_txt'] = 'Включить доступ'; $wb['policy_txt'] = 'Спам-фильтр'; -$wb['no_policy'] = '- не включены -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Число почтовых ящиков превышено.'; $wb['limit_mailquota_txt'] = 'Место под почтовые ящики превышено. Максимально доступно MB'; $wb['password_strength_txt'] = 'Стойкость пароля'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index a427c50606..7ac9fc62b5 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Aktivera mottagning'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Aktivera åtkomst'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- ej aktiverat -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Avaktivera IMAP'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index 92c6dea578..c936936db2 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Povoliť príjem'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Povoliť Prístup'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- nepovolená -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Max. počet poštových schránok pre váš účet je dosiahnutý.'; $wb['limit_mailquota_txt'] = 'Maximálny priestor pre poštové schránky je dosiahnutý. Max. dostupné miesto v MB je'; $wb['disableimap_txt'] = 'Deaktivovať IMAP'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 99e9860396..4b7f493987 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -27,7 +27,7 @@ $wb['postfix_txt'] = 'Alım Etkin'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; $wb['access_txt'] = 'Erişim Etkin'; $wb['policy_txt'] = 'Önemsiz İleti Süzgeci'; -$wb['no_policy'] = '- devre dışı -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Hesabınıza ekleyebileceğiniz en fazla e-posta kutusu sayısına ulaştınız.'; $wb['limit_mailquota_txt'] = 'E-posta kutularınız için kullanabileceğiniz en fazla boyuta ulaştınız. Kullanılabilecek alan MB:'; $wb['disablesmtp_txt'] = 'SMTP Kullanılmasın (gönderim)'; diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index d291367d11..00c70b021f 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -99,7 +99,7 @@ class page_action extends tform_actions { if (isset($_POST['policy'])) $tmp_user['policy_id'] = intval($_POST['policy']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; + $policy_select = ""; if(is_array($policys)) { foreach( $policys as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; -- GitLab From 28781ccfee0b8f7c02547c4c87b668f3a1e7b4a8 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 13 Jun 2020 02:19:55 +0200 Subject: [PATCH 0197/1368] Add a direct domain add button (4304) --- interface/web/client/lib/lang/ar.lng | 1 + interface/web/client/lib/lang/bg.lng | 1 + interface/web/client/lib/lang/br.lng | 1 + interface/web/client/lib/lang/ca.lng | 1 + interface/web/client/lib/lang/cz.lng | 1 + interface/web/client/lib/lang/de.lng | 1 + interface/web/client/lib/lang/dk.lng | 1 + interface/web/client/lib/lang/el.lng | 1 + interface/web/client/lib/lang/en.lng | 3 ++- interface/web/client/lib/lang/es.lng | 3 ++- interface/web/client/lib/lang/fi.lng | 1 + interface/web/client/lib/lang/fr.lng | 1 + interface/web/client/lib/lang/hr.lng | 1 + interface/web/client/lib/lang/hu.lng | 1 + interface/web/client/lib/lang/id.lng | 1 + interface/web/client/lib/lang/it.lng | 1 + interface/web/client/lib/lang/ja.lng | 1 + interface/web/client/lib/lang/nl.lng | 1 + interface/web/client/lib/lang/nl_domain_list.lng | 2 +- interface/web/client/lib/lang/pl.lng | 1 + interface/web/client/lib/lang/pt.lng | 1 + interface/web/client/lib/lang/ro.lng | 1 + interface/web/client/lib/lang/ru.lng | 1 + interface/web/client/lib/lang/se.lng | 1 + interface/web/client/lib/lang/sk.lng | 1 + interface/web/client/lib/lang/tr.lng | 1 + interface/web/client/lib/module.conf.php | 4 ++++ 27 files changed, 32 insertions(+), 3 deletions(-) diff --git a/interface/web/client/lib/lang/ar.lng b/interface/web/client/lib/lang/ar.lng index 245991ff9d..f129f4273f 100644 --- a/interface/web/client/lib/lang/ar.lng +++ b/interface/web/client/lib/lang/ar.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/bg.lng b/interface/web/client/lib/lang/bg.lng index c18e2e8fbd..e23521e598 100644 --- a/interface/web/client/lib/lang/bg.lng +++ b/interface/web/client/lib/lang/bg.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/br.lng b/interface/web/client/lib/lang/br.lng index 538a3e2e85..b65fba3044 100644 --- a/interface/web/client/lib/lang/br.lng +++ b/interface/web/client/lib/lang/br.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Mensagens'; $wb['Send email'] = 'Enviar e-mail'; $wb['Edit Client Circle'] = 'Editar círculo de clientes'; $wb['Domains'] = 'Domínios'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domínio'; $wb['client_txt'] = 'Cliente'; $wb['error_domain_in dnsuse'] = 'Este domínio não pode ser removido pois é utilizado em uma zona dns.'; diff --git a/interface/web/client/lib/lang/ca.lng b/interface/web/client/lib/lang/ca.lng index 730bd2de99..c51dd2e839 100644 --- a/interface/web/client/lib/lang/ca.lng +++ b/interface/web/client/lib/lang/ca.lng @@ -14,6 +14,7 @@ $wb['delete_additional_template_txt'] = 'Supprimer un modèle'; $wb['Messaging'] = 'Messagerie'; $wb['Edit Client Circle'] = 'Editer les groupes clients'; $wb['Domains'] = 'Domaines'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domaine'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'Ce domaine ne peut pas être supprimé, il est utilisé par un compte courriel'; diff --git a/interface/web/client/lib/lang/cz.lng b/interface/web/client/lib/lang/cz.lng index 447810f940..c8c8f50074 100644 --- a/interface/web/client/lib/lang/cz.lng +++ b/interface/web/client/lib/lang/cz.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Odesílání zpráv'; $wb['Send email'] = 'Odeslat e-mail'; $wb['Edit Client Circle'] = 'Upravit skupinu klientů'; $wb['Domains'] = 'Domény'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Doména'; $wb['client_txt'] = 'Klient'; $wb['error_domain_in mailuse'] = 'Tato doména nelze odstranit, protože je v používána jako poštovní doména'; diff --git a/interface/web/client/lib/lang/de.lng b/interface/web/client/lib/lang/de.lng index 87b85eed71..b55397999a 100644 --- a/interface/web/client/lib/lang/de.lng +++ b/interface/web/client/lib/lang/de.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Benachrichtigungen'; $wb['Send email'] = 'E-Mail versenden'; $wb['Edit Client Circle'] = 'Kundenkreis bearbeiten'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Kunde'; $wb['error_domain_in mailuse'] = 'Diese Domain kann nicht gelöscht werden, weil sie als E-Mail Domain verwendet wird'; diff --git a/interface/web/client/lib/lang/dk.lng b/interface/web/client/lib/lang/dk.lng index 0d498a483c..920b3f8805 100644 --- a/interface/web/client/lib/lang/dk.lng +++ b/interface/web/client/lib/lang/dk.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Meddelelser'; $wb['Send email'] = 'Send E-mail'; $wb['Edit Client Circle'] = 'Rediger Kunde Cirkel'; $wb['Domains'] = 'Domæner'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domæne'; $wb['client_txt'] = 'Kunde'; $wb['error_domain_in mailuse'] = 'Dette domæne kan ikke slettes, da det er i brug som mail-domæne'; diff --git a/interface/web/client/lib/lang/el.lng b/interface/web/client/lib/lang/el.lng index 8c7463d61c..992bfdcd1c 100644 --- a/interface/web/client/lib/lang/el.lng +++ b/interface/web/client/lib/lang/el.lng @@ -15,6 +15,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/en.lng b/interface/web/client/lib/lang/en.lng index 743516c96c..a2004196e2 100644 --- a/interface/web/client/lib/lang/en.lng +++ b/interface/web/client/lib/lang/en.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in dnsuse'] = 'This domain cannot be deleted, because it is in use as dns zone'; @@ -27,4 +28,4 @@ $wb['error_client_can_not_add_domain'] = 'You cannot add a new domain'; $wb['domain_txt'] = 'Domain'; $wb['error_client_group_id_empty'] = 'You have to select a customer
'; $wb['Email-Templates'] = 'Email-Templates'; -?> \ No newline at end of file +?> diff --git a/interface/web/client/lib/lang/es.lng b/interface/web/client/lib/lang/es.lng index 9b8b2a3edb..233b58b7ca 100644 --- a/interface/web/client/lib/lang/es.lng +++ b/interface/web/client/lib/lang/es.lng @@ -25,5 +25,6 @@ $wb['Messaging'] = 'Mensajería'; $wb['Resellers'] = 'Revendedores'; $wb['Send email'] = 'Enviar correo'; $wb['Templates'] = 'Plantillas'; -$wb['Email-Templates'] = 'Email-Templates'; +$wb['Add Domain'] = 'Add Domain'; +$wb['domain_txt'] = '] = 'Email-Templates'; ?> diff --git a/interface/web/client/lib/lang/fi.lng b/interface/web/client/lib/lang/fi.lng index 52dba3949f..812ff1860f 100644 --- a/interface/web/client/lib/lang/fi.lng +++ b/interface/web/client/lib/lang/fi.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/fr.lng b/interface/web/client/lib/lang/fr.lng index 4538bfb0db..d4efa24b7a 100644 --- a/interface/web/client/lib/lang/fr.lng +++ b/interface/web/client/lib/lang/fr.lng @@ -14,6 +14,7 @@ $wb['delete_additional_template_txt'] = 'Supprimer un modèle'; $wb['Messaging'] = 'Messagerie'; $wb['Edit Client Circle'] = 'Modifier les groupes clients'; $wb['Domains'] = 'Domaines'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domaine'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'Ce domaine ne peut pas être supprimé, il est utilisé par un compte e-mail'; diff --git a/interface/web/client/lib/lang/hr.lng b/interface/web/client/lib/lang/hr.lng index 48c78e2bf1..a9e293840c 100644 --- a/interface/web/client/lib/lang/hr.lng +++ b/interface/web/client/lib/lang/hr.lng @@ -16,6 +16,7 @@ $wb['Messaging'] = 'Slanje poruka'; $wb['Send email'] = 'Pošalji email'; $wb['Edit Client Circle'] = 'Promijeni krug klijenata'; $wb['Domains'] = 'Domene'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domena'; $wb['client_txt'] = 'Klijent'; $wb['error_domain_in mailuse'] = 'Ova domena ne može biti obrisana jer se koristi kao mail domena'; diff --git a/interface/web/client/lib/lang/hu.lng b/interface/web/client/lib/lang/hu.lng index 6b988dcee2..5e67398550 100644 --- a/interface/web/client/lib/lang/hu.lng +++ b/interface/web/client/lib/lang/hu.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/id.lng b/interface/web/client/lib/lang/id.lng index a393cb7747..6fe64545f4 100644 --- a/interface/web/client/lib/lang/id.lng +++ b/interface/web/client/lib/lang/id.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/it.lng b/interface/web/client/lib/lang/it.lng index ff740790b0..257dca805d 100644 --- a/interface/web/client/lib/lang/it.lng +++ b/interface/web/client/lib/lang/it.lng @@ -15,6 +15,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Dominio'; $wb['client_txt'] = 'Cliente'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/ja.lng b/interface/web/client/lib/lang/ja.lng index c5ce289f70..b34cf49559 100644 --- a/interface/web/client/lib/lang/ja.lng +++ b/interface/web/client/lib/lang/ja.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/nl.lng b/interface/web/client/lib/lang/nl.lng index cf2307e6aa..dab8ba3c3c 100644 --- a/interface/web/client/lib/lang/nl.lng +++ b/interface/web/client/lib/lang/nl.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Berichten'; $wb['Send email'] = 'Verstuur e-mail'; $wb['Edit Client Circle'] = 'Klanten collectie bewerken'; $wb['Domains'] = 'Domeinen'; +$wb['Add Domain'] = 'Domein toevoegen'; $wb['domain_txt'] = 'Domein'; $wb['client_txt'] = 'Klant'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/nl_domain_list.lng b/interface/web/client/lib/lang/nl_domain_list.lng index 130345f388..802917f923 100644 --- a/interface/web/client/lib/lang/nl_domain_list.lng +++ b/interface/web/client/lib/lang/nl_domain_list.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/client/lib/lang/pl.lng b/interface/web/client/lib/lang/pl.lng index ca1563e8b8..8c4061a795 100644 --- a/interface/web/client/lib/lang/pl.lng +++ b/interface/web/client/lib/lang/pl.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Wiadomości dla klientów'; $wb['Send email'] = 'Wyślij email'; $wb['Edit Client Circle'] = 'Edytuj grupy klientów'; $wb['Domains'] = 'Domeny'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domena'; $wb['client_txt'] = 'Klient'; $wb['error_domain_in mailuse'] = 'Ta domena nie może zostać usunięta ponieważ jest używana jako domena dla poczty email.'; diff --git a/interface/web/client/lib/lang/pt.lng b/interface/web/client/lib/lang/pt.lng index 1be427e820..1f837aa963 100644 --- a/interface/web/client/lib/lang/pt.lng +++ b/interface/web/client/lib/lang/pt.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/ro.lng b/interface/web/client/lib/lang/ro.lng index 245991ff9d..f129f4273f 100644 --- a/interface/web/client/lib/lang/ro.lng +++ b/interface/web/client/lib/lang/ro.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/ru.lng b/interface/web/client/lib/lang/ru.lng index c8558a3982..2dabf4c6f3 100644 --- a/interface/web/client/lib/lang/ru.lng +++ b/interface/web/client/lib/lang/ru.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Обмен сообщениями'; $wb['Send email'] = 'Отправить почту'; $wb['Edit Client Circle'] = 'Изменить клиента Группы'; $wb['Domains'] = 'Домены'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Домен'; $wb['client_txt'] = 'Клиент'; $wb['error_domain_in mailuse'] = 'Этот домен не может быть удален, так как он используется в качестве почтового домена.'; diff --git a/interface/web/client/lib/lang/se.lng b/interface/web/client/lib/lang/se.lng index 3845b9c57a..adceb746d6 100644 --- a/interface/web/client/lib/lang/se.lng +++ b/interface/web/client/lib/lang/se.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Meddelanden'; $wb['Send email'] = 'Skicka epost'; $wb['Edit Client Circle'] = 'Redigera kundcirkel'; $wb['Domains'] = 'Domäner'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domän'; $wb['client_txt'] = 'Kund'; $wb['error_domain_in mailuse'] = 'Den här domänen kan inte tas bort då den används som epostdomän'; diff --git a/interface/web/client/lib/lang/sk.lng b/interface/web/client/lib/lang/sk.lng index f3bfd3e2f6..7058583a32 100644 --- a/interface/web/client/lib/lang/sk.lng +++ b/interface/web/client/lib/lang/sk.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'Messaging'; $wb['Send email'] = 'Send Email'; $wb['Edit Client Circle'] = 'Edit Client Circle'; $wb['Domains'] = 'Domains'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Domain'; $wb['client_txt'] = 'Client'; $wb['error_domain_in mailuse'] = 'This domain cannot be deleted, because it is in use as mail-domain'; diff --git a/interface/web/client/lib/lang/tr.lng b/interface/web/client/lib/lang/tr.lng index cc2e8aa022..6f5f55e702 100644 --- a/interface/web/client/lib/lang/tr.lng +++ b/interface/web/client/lib/lang/tr.lng @@ -17,6 +17,7 @@ $wb['Messaging'] = 'İletişim'; $wb['Send email'] = 'E-posta Gönderimi'; $wb['Edit Client Circle'] = 'Müşteri Grubu Düzenleme'; $wb['Domains'] = 'Etki Alanları'; +$wb['Add Domain'] = 'Add Domain'; $wb['domain_txt'] = 'Etki Alanı'; $wb['client_txt'] = 'Müşteri'; $wb['error_domain_in dnsuse'] = 'Bu etki alanı birincil DNS bölgesi olarak kullanıldığından silinemez'; diff --git a/interface/web/client/lib/module.conf.php b/interface/web/client/lib/module.conf.php index 2603550c9b..2203571381 100644 --- a/interface/web/client/lib/module.conf.php +++ b/interface/web/client/lib/module.conf.php @@ -87,6 +87,10 @@ if ($settings['use_domain_module'] == 'y') { 'target' => 'content', 'link' => 'client/domain_list.php'); + $items[] = array( 'title' => 'Add Domain', + 'target' => 'content', + 'link' => 'client/domain_edit.php'); + $module['nav'][] = array( 'title' => 'Domains', 'open' => 1, 'items' => $items); -- GitLab From fa6b3c67d0a7c276673afa97f3b2af9fc45e035b Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:30:28 +0200 Subject: [PATCH 0198/1368] Update de_system_config.lng --- interface/web/admin/lib/lang/de_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/de_system_config.lng b/interface/web/admin/lib/lang/de_system_config.lng index 76910e1db3..79048a8298 100644 --- a/interface/web/admin/lib/lang/de_system_config.lng +++ b/interface/web/admin/lib/lang/de_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Wildcard verwenden'; -- GitLab From ff43d3ff5e029410b486d49436962c58e0aa9f3e Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:30:46 +0200 Subject: [PATCH 0199/1368] Update se_system_config.lng --- interface/web/admin/lib/lang/se_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/se_system_config.lng b/interface/web/admin/lib/lang/se_system_config.lng index 74ae16734f..bb0e2cac5e 100644 --- a/interface/web/admin/lib/lang/se_system_config.lng +++ b/interface/web/admin/lib/lang/se_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 55a33fdbfd510b32e8f66be3e32bbfdb696aafa8 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:31:04 +0200 Subject: [PATCH 0200/1368] Update tr_system_config.lng --- interface/web/admin/lib/lang/tr_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/tr_system_config.lng b/interface/web/admin/lib/lang/tr_system_config.lng index 3ef8e26875..3b89919129 100644 --- a/interface/web/admin/lib/lang/tr_system_config.lng +++ b/interface/web/admin/lib/lang/tr_system_config.lng @@ -84,4 +84,6 @@ $wb['reseller_can_use_options_txt'] = 'Bayi web siteleri için seçenek sekmesin $wb['custom_login_text_txt'] = 'Oturum Açma Sayfası Metni'; $wb['custom_login_link_txt'] = 'Oturum Açma Sayfası Bağlantısı'; $wb['login_link_error_regex'] = 'Oturum Açma Bağlantısı Geçersiz'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; ?> -- GitLab From 56ad3421ef7acef5ba022daf44a5ccabe7054030 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:31:21 +0200 Subject: [PATCH 0201/1368] Update ar_system_config.lng --- interface/web/admin/lib/lang/ar_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/ar_system_config.lng b/interface/web/admin/lib/lang/ar_system_config.lng index 0a830014d8..664221e728 100644 --- a/interface/web/admin/lib/lang/ar_system_config.lng +++ b/interface/web/admin/lib/lang/ar_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From ffb8eeb696dcfa53ec1a56205ebe06cd56fbeab5 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:31:34 +0200 Subject: [PATCH 0202/1368] Update bg_system_config.lng --- interface/web/admin/lib/lang/bg_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/bg_system_config.lng b/interface/web/admin/lib/lang/bg_system_config.lng index 130cb596aa..83fcbaa839 100644 --- a/interface/web/admin/lib/lang/bg_system_config.lng +++ b/interface/web/admin/lib/lang/bg_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 4571bcb4e45cfe6216a452b238208462beeb8c6d Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:31:50 +0200 Subject: [PATCH 0203/1368] Update br_system_config.lng --- interface/web/admin/lib/lang/br_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng index 98bd4c9614..e405e7bb1b 100644 --- a/interface/web/admin/lib/lang/br_system_config.lng +++ b/interface/web/admin/lib/lang/br_system_config.lng @@ -81,6 +81,8 @@ $wb['reseller_can_use_options_txt'] = 'Revendas podem utilizar o menu sites'; $wb['custom_login_text_txt'] = 'Texto personalizado para a página de acesso'; $wb['custom_login_link_txt'] = 'Link personalizado para página de acesso'; $wb['login_link_error_regex'] = 'Link personalizado para acesso inválido'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Nome'; $wb['ca_issue_txt'] = 'Questão'; $wb['ca_wildcard_txt'] = 'Usar curingas'; -- GitLab From 27c15175f9bbb4dcdcd6e32d1c5830523ede62c6 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:32:12 +0200 Subject: [PATCH 0204/1368] Update ca_system_config.lng --- interface/web/admin/lib/lang/ca_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/ca_system_config.lng b/interface/web/admin/lib/lang/ca_system_config.lng index cc3c11c6c5..267e41b65b 100644 --- a/interface/web/admin/lib/lang/ca_system_config.lng +++ b/interface/web/admin/lib/lang/ca_system_config.lng @@ -81,6 +81,8 @@ $wb['reseller_can_use_options_txt'] = 'Reseller can use the option-tab for websi $wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; $wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; $wb['login_link_error_regex'] = 'Invalid Link for Custom Login'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 5c163fd95157a8285248ef359b7afd77c5e058b5 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:32:26 +0200 Subject: [PATCH 0205/1368] Update cz_system_config.lng --- interface/web/admin/lib/lang/cz_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/cz_system_config.lng b/interface/web/admin/lib/lang/cz_system_config.lng index 3660e1b689..40c78c1856 100644 --- a/interface/web/admin/lib/lang/cz_system_config.lng +++ b/interface/web/admin/lib/lang/cz_system_config.lng @@ -81,6 +81,8 @@ $wb['reseller_can_use_options_txt'] = 'Distributor (prodejce) může použít ka $wb['custom_login_text_txt'] = 'Vlastní text na přihlašovací stránce'; $wb['custom_login_link_txt'] = 'Vlastní odkaz (URL) na přihlašovací stránce (vlastní text)'; $wb['login_link_error_regex'] = 'Neplatný formát URL pro vlastní odkaz na přihlašovací stránce'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Název vydavatele'; $wb['ca_issue_txt'] = 'Doména vydavatele'; $wb['ca_wildcard_txt'] = 'Použít Wildcard (*)'; -- GitLab From 901caa6a2299258c9d43881c1af91c4dca2643ce Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:32:42 +0200 Subject: [PATCH 0206/1368] Update dk_system_config.lng --- interface/web/admin/lib/lang/dk_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/dk_system_config.lng b/interface/web/admin/lib/lang/dk_system_config.lng index 26b0fe7e78..ad3ecbf4db 100644 --- a/interface/web/admin/lib/lang/dk_system_config.lng +++ b/interface/web/admin/lib/lang/dk_system_config.lng @@ -81,6 +81,8 @@ $wb['reseller_can_use_options_txt'] = 'Reseller can use the option-tab for websi $wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; $wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; $wb['login_link_error_regex'] = 'Invalid Link for Custom Login'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From dd6e7deb2c51b6b0c704d82d4001fb1b497452d9 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:32:55 +0200 Subject: [PATCH 0207/1368] Update el_system_config.lng --- interface/web/admin/lib/lang/el_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/el_system_config.lng b/interface/web/admin/lib/lang/el_system_config.lng index 640d6f00a9..3276653f33 100644 --- a/interface/web/admin/lib/lang/el_system_config.lng +++ b/interface/web/admin/lib/lang/el_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From d9fd5475927d51047913abe0d68cfe897b398866 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:33:26 +0200 Subject: [PATCH 0208/1368] Update es_system_config.lng --- interface/web/admin/lib/lang/es_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/es_system_config.lng b/interface/web/admin/lib/lang/es_system_config.lng index 043c52cfdd..39fae409ce 100755 --- a/interface/web/admin/lib/lang/es_system_config.lng +++ b/interface/web/admin/lib/lang/es_system_config.lng @@ -81,6 +81,8 @@ $wb['webftp_url_txt'] = 'Enlace al cliente FTP por web'; $wb['webmail_url_error_regex'] = 'Dirección del correo web inválida'; $wb['webmail_url_note_txt'] = 'Marcador de posición:'; $wb['webmail_url_txt'] = 'URL de correo web'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From b55a43a2a464a0633f7b1866a488aa40be24e6b1 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:33:39 +0200 Subject: [PATCH 0209/1368] Update fi_system_config.lng --- interface/web/admin/lib/lang/fi_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/fi_system_config.lng b/interface/web/admin/lib/lang/fi_system_config.lng index c0972c49d8..be49b16ef4 100644 --- a/interface/web/admin/lib/lang/fi_system_config.lng +++ b/interface/web/admin/lib/lang/fi_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 41b9ce463aff3a04774b6c5dc5bc9e642ab8cf74 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:33:49 +0200 Subject: [PATCH 0210/1368] Update fr_system_config.lng --- interface/web/admin/lib/lang/fr_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/fr_system_config.lng b/interface/web/admin/lib/lang/fr_system_config.lng index 18f0dbbed4..8ef8aa64e6 100644 --- a/interface/web/admin/lib/lang/fr_system_config.lng +++ b/interface/web/admin/lib/lang/fr_system_config.lng @@ -81,6 +81,8 @@ $wb['reseller_can_use_options_txt'] = 'Reseller can use the option-tab for websi $wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; $wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; $wb['login_link_error_regex'] = 'Invalid Link for Custom Login'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 44ed03e7d3d9fcc0a70e8143836a3e5b8d685da4 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:33:58 +0200 Subject: [PATCH 0211/1368] Update hr_system_config.lng --- interface/web/admin/lib/lang/hr_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/hr_system_config.lng b/interface/web/admin/lib/lang/hr_system_config.lng index a7735647b1..e08fdfbb3c 100644 --- a/interface/web/admin/lib/lang/hr_system_config.lng +++ b/interface/web/admin/lib/lang/hr_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 36b256bf706a38abe86d791e01d19747c0ca91da Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:34:06 +0200 Subject: [PATCH 0212/1368] Update hu_system_config.lng --- interface/web/admin/lib/lang/hu_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/hu_system_config.lng b/interface/web/admin/lib/lang/hu_system_config.lng index cee497fe19..613ad88a22 100644 --- a/interface/web/admin/lib/lang/hu_system_config.lng +++ b/interface/web/admin/lib/lang/hu_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 65b8b7219f688a5dbd49edad9e15b51e21dbb1d1 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:34:15 +0200 Subject: [PATCH 0213/1368] Update id_system_config.lng --- interface/web/admin/lib/lang/id_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/id_system_config.lng b/interface/web/admin/lib/lang/id_system_config.lng index 344185b84d..f2dfeb6734 100644 --- a/interface/web/admin/lib/lang/id_system_config.lng +++ b/interface/web/admin/lib/lang/id_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 1d2f3be54065b93026d4442feb33b6f803a989a0 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:34:25 +0200 Subject: [PATCH 0214/1368] Update ja_system_config.lng --- interface/web/admin/lib/lang/ja_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/ja_system_config.lng b/interface/web/admin/lib/lang/ja_system_config.lng index aa5cc6a7a3..718e4302c5 100644 --- a/interface/web/admin/lib/lang/ja_system_config.lng +++ b/interface/web/admin/lib/lang/ja_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 55791026e43fce7acf80f0f98e339ec237714e80 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Sat, 13 Jun 2020 17:34:35 +0200 Subject: [PATCH 0215/1368] Update nl_system_config.lng --- interface/web/admin/lib/lang/nl_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/nl_system_config.lng b/interface/web/admin/lib/lang/nl_system_config.lng index 44a58b7646..fda9056d8d 100644 --- a/interface/web/admin/lib/lang/nl_system_config.lng +++ b/interface/web/admin/lib/lang/nl_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 8325db579710a886e9b3187d5275301cf5403e42 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 12:48:06 +0200 Subject: [PATCH 0216/1368] Implement SSHFP record (#1594) --- .../sql/incremental/upd_dev_collection.sql | 5 +- install/sql/ispconfig3.sql | 214 +++++++++--------- interface/web/dns/dns_sshfp_edit.php | 53 +++++ interface/web/dns/form/dns_sshfp.tform.php | 165 ++++++++++++++ interface/web/dns/lib/lang/ar_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/bg_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/br_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/ca_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/cz_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/de_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/dk_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/el_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/en_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/es_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/fi_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/fr_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/hr_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/hu_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/id_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/it_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/ja_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/nl_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/pl_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/pt_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/ro_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/ru_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/se_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/sk_dns_sshfp.lng | 16 ++ interface/web/dns/lib/lang/tr_dns_sshfp.lng | 16 ++ interface/web/dns/list/dns_a.list.php | 2 +- interface/web/dns/templates/dns_a_list.htm | 4 +- .../web/dns/templates/dns_sshfp_edit.htm | 25 ++ server/conf/bind_pri.domain.master | 5 +- 33 files changed, 760 insertions(+), 113 deletions(-) create mode 100644 interface/web/dns/dns_sshfp_edit.php create mode 100644 interface/web/dns/form/dns_sshfp.tform.php create mode 100644 interface/web/dns/lib/lang/ar_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/bg_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/br_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/ca_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/cz_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/de_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/dk_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/el_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/en_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/es_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/fi_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/fr_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/hr_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/hu_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/id_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/it_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/ja_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/nl_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/pl_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/pt_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/ro_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/ru_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/se_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/sk_dns_sshfp.lng create mode 100644 interface/web/dns/lib/lang/tr_dns_sshfp.lng create mode 100644 interface/web/dns/templates/dns_sshfp_edit.htm diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index aebc01dcb8..519dda220f 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -20,7 +20,7 @@ UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'co -- default php-fpm to ondemand mode ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; -ALTER TABLE `mail_user` +ALTER TABLE `mail_user` ADD `purge_trash_days` INT NOT NULL DEFAULT '0' AFTER `move_junk`, ADD `purge_junk_days` INT NOT NULL DEFAULT '0' AFTER `purge_trash_days`; @@ -32,3 +32,6 @@ ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET ut -- add disableindexer-worker for solr search ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disablequota-status`; + +-- add SSHFP record +ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME', 'CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index a5fcce8c89..ef76a370d4 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -26,24 +26,24 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ --- Includes --- +-- Includes +-- -- iso_country_list.sql --- +-- -- This will create and then populate a MySQL table with a list of the names and -- ISO 3166 codes for countries in existence as of the date below. --- +-- -- For updates to this file, see http://27.org/isocountrylist/ -- For more about ISO 3166, see http://www.iso.ch/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html --- +-- -- Created by getisocountrylist.pl on Sun Nov 2 14:59:20 2003. -- Wm. Rhodes --- +-- --- +-- -- ISPConfig 3 -- DB-Version: 3.0.0.9 --- +-- SET FOREIGN_KEY_CHECKS = 0; @@ -288,9 +288,9 @@ CREATE TABLE `client_circle` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `client_template` --- +-- CREATE TABLE `client_template` ( `template_id` int(11) unsigned NOT NULL auto_increment, @@ -373,9 +373,9 @@ CREATE TABLE `client_template` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `client_template_assigned` --- +-- CREATE TABLE `client_template_assigned` ( `assigned_template_id` bigint(20) NOT NULL auto_increment, @@ -426,9 +426,9 @@ CREATE TABLE `country` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `cron` --- +-- CREATE TABLE `cron` ( `id` int(11) unsigned NOT NULL auto_increment, `sys_userid` int(11) unsigned NOT NULL default '0', @@ -452,9 +452,9 @@ CREATE TABLE `cron` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `directive_snippets` --- +-- CREATE TABLE IF NOT EXISTS `directive_snippets` ( `directive_snippets_id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -475,9 +475,9 @@ CREATE TABLE IF NOT EXISTS `directive_snippets` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_rr` --- +-- CREATE TABLE `dns_rr` ( `id` int(11) unsigned NOT NULL auto_increment, `sys_userid` int(11) unsigned NOT NULL DEFAULT '0', @@ -488,7 +488,7 @@ CREATE TABLE `dns_rr` ( `server_id` int(11) NOT NULL default '1', `zone` int(11) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL DEFAULT '', - `type` enum('A','AAAA','ALIAS','CNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','TXT','TLSA','DNSKEY') default NULL, + `type` enum('A','AAAA','ALIAS','CNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') default NULL, `data` TEXT NOT NULL, `aux` int(11) unsigned NOT NULL default '0', `ttl` int(11) unsigned NOT NULL default '3600', @@ -524,9 +524,9 @@ CREATE TABLE `dns_slave` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_ssl_ca` --- +-- CREATE TABLE IF NOT EXISTS `dns_ssl_ca` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, @@ -598,9 +598,9 @@ INSERT INTO `dns_ssl_ca` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `s -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_soa` --- +-- CREATE TABLE `dns_soa` ( `id` int(10) unsigned NOT NULL auto_increment, @@ -634,9 +634,9 @@ CREATE TABLE `dns_soa` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `dns_template` --- +-- CREATE TABLE `dns_template` ( `template_id` int(11) unsigned NOT NULL auto_increment, @@ -670,9 +670,9 @@ CREATE TABLE `domain` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `firewall` --- +-- CREATE TABLE `firewall` ( `firewall_id` int(11) unsigned NOT NULL auto_increment, @@ -690,9 +690,9 @@ CREATE TABLE `firewall` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `ftp_user` --- +-- CREATE TABLE `ftp_user` ( `ftp_user_id` int(11) unsigned NOT NULL auto_increment, @@ -728,9 +728,9 @@ CREATE TABLE `ftp_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `ftp_traffic` --- +-- CREATE TABLE `ftp_traffic` ( `hostname` varchar(255) NOT NULL, @@ -801,9 +801,9 @@ CREATE TABLE `iptables` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_access` --- +-- CREATE TABLE `mail_access` ( `access_id` int(11) unsigned NOT NULL auto_increment, @@ -841,9 +841,9 @@ CREATE TABLE `mail_backup` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_content_filter` --- +-- CREATE TABLE `mail_content_filter` ( `content_filter_id` int(11) unsigned NOT NULL auto_increment, @@ -863,9 +863,9 @@ CREATE TABLE `mail_content_filter` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_domain` --- +-- CREATE TABLE `mail_domain` ( `domain_id` int(11) unsigned NOT NULL auto_increment, @@ -888,9 +888,9 @@ CREATE TABLE `mail_domain` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_forwarding` --- +-- CREATE TABLE `mail_forwarding` ( `forwarding_id` int(11) unsigned NOT NULL auto_increment, @@ -913,9 +913,9 @@ CREATE TABLE `mail_forwarding` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_get` --- +-- CREATE TABLE `mail_get` ( `mailget_id` int(11) unsigned NOT NULL auto_increment, @@ -979,9 +979,9 @@ CREATE TABLE IF NOT EXISTS `mail_relay_recipient` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_traffic` --- +-- CREATE TABLE `mail_traffic` ( `traffic_id` int(11) unsigned NOT NULL auto_increment, @@ -994,9 +994,9 @@ CREATE TABLE `mail_traffic` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_transport` --- +-- CREATE TABLE `mail_transport` ( `transport_id` int(11) unsigned NOT NULL auto_increment, @@ -1017,9 +1017,9 @@ CREATE TABLE `mail_transport` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_user` --- +-- CREATE TABLE `mail_user` ( `mailuser_id` int(11) unsigned NOT NULL auto_increment, @@ -1074,9 +1074,9 @@ CREATE TABLE `mail_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `mail_user_filter` --- +-- CREATE TABLE `mail_user_filter` ( `filter_id` int(11) unsigned NOT NULL auto_increment, @@ -1295,9 +1295,9 @@ CREATE TABLE IF NOT EXISTS `openvz_vm` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `remote_session` --- +-- CREATE TABLE `remote_session` ( `remote_session` varchar(64) NOT NULL DEFAULT '', @@ -1310,9 +1310,9 @@ CREATE TABLE `remote_session` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `remote_user` --- +-- CREATE TABLE `remote_user` ( `remote_userid` int(11) unsigned NOT NULL auto_increment, @@ -1331,9 +1331,9 @@ CREATE TABLE `remote_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `server` --- +-- CREATE TABLE `server` ( `server_id` int(11) unsigned NOT NULL auto_increment, @@ -1362,9 +1362,9 @@ CREATE TABLE `server` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `server_ip` --- +-- CREATE TABLE `server_ip` ( `server_ip_id` int(11) unsigned NOT NULL auto_increment, @@ -1384,9 +1384,9 @@ CREATE TABLE `server_ip` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `server_ip_map` --- +-- CREATE TABLE `server_ip_map` ( `server_ip_map_id` int(11) unsigned NOT NULL AUTO_INCREMENT, @@ -1458,9 +1458,9 @@ CREATE TABLE `shell_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `software_package` --- +-- CREATE TABLE `software_package` ( `package_id` int(11) unsigned NOT NULL auto_increment, @@ -1481,9 +1481,9 @@ CREATE TABLE `software_package` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `software_repo` --- +-- CREATE TABLE `software_repo` ( `software_repo_id` int(11) unsigned NOT NULL auto_increment, @@ -1502,9 +1502,9 @@ CREATE TABLE `software_repo` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `software_update` --- +-- CREATE TABLE `software_update` ( `software_update_id` int(11) unsigned NOT NULL auto_increment, @@ -1524,9 +1524,9 @@ CREATE TABLE `software_update` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `software_update_inst` --- +-- CREATE TABLE `software_update_inst` ( `software_update_inst_id` int(11) unsigned NOT NULL auto_increment, @@ -1540,9 +1540,9 @@ CREATE TABLE `software_update_inst` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `spamfilter_policy` --- +-- CREATE TABLE `spamfilter_policy` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1603,9 +1603,9 @@ CREATE TABLE `spamfilter_policy` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `spamfilter_users` --- +-- CREATE TABLE `spamfilter_users` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1626,9 +1626,9 @@ CREATE TABLE `spamfilter_users` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `spamfilter_wblist` --- +-- CREATE TABLE `spamfilter_wblist` ( `wblist_id` int(11) unsigned NOT NULL auto_increment, @@ -1648,9 +1648,9 @@ CREATE TABLE `spamfilter_wblist` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `support_message` --- +-- CREATE TABLE `support_message` ( `support_message_id` int(11) unsigned NOT NULL auto_increment, @@ -1720,9 +1720,9 @@ CREATE TABLE `sys_datalog` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_dbsync` --- +-- CREATE TABLE `sys_dbsync` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1744,9 +1744,9 @@ CREATE TABLE `sys_dbsync` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_filesync` --- +-- CREATE TABLE `sys_filesync` ( `id` int(11) unsigned NOT NULL auto_increment, @@ -1764,9 +1764,9 @@ CREATE TABLE `sys_filesync` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_group` --- +-- CREATE TABLE `sys_group` ( `groupid` int(11) unsigned NOT NULL auto_increment, @@ -1778,9 +1778,9 @@ CREATE TABLE `sys_group` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_ini` --- +-- CREATE TABLE `sys_ini` ( `sysini_id` int(11) unsigned NOT NULL auto_increment, @@ -1792,9 +1792,9 @@ CREATE TABLE `sys_ini` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_log` --- +-- CREATE TABLE `sys_log` ( `syslog_id` int(11) unsigned NOT NULL auto_increment, @@ -1861,9 +1861,9 @@ CREATE TABLE IF NOT EXISTS `sys_theme` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `sys_user` --- +-- CREATE TABLE `sys_user` ( `userid` int(11) unsigned NOT NULL auto_increment, @@ -1991,9 +1991,9 @@ CREATE TABLE IF NOT EXISTS `web_database_user` ( -- -------------------------------------------------------- --- +-- -- Table structure for table `web_domain` --- +-- CREATE TABLE `web_domain` ( `domain_id` int(11) unsigned NOT NULL auto_increment, @@ -2496,42 +2496,42 @@ INSERT INTO `country` (`iso`, `name`, `printable_name`, `iso3`, `numcode`, `eu`) -- -------------------------------------------------------- --- +-- -- Dumping data for table `dns_template` --- +-- INSERT INTO `dns_template` (`template_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `name`, `fields`, `template`, `visible`) VALUES (1, 1, 1, 'riud', 'riud', '', 'Default', 'DOMAIN,IP,NS1,NS2,EMAIL,DKIM,DNSSEC', '[ZONE]\norigin={DOMAIN}.\nns={NS1}.\nmbox={EMAIL}.\nrefresh=7200\nretry=540\nexpire=604800\nminimum=3600\nttl=3600\n\n[DNS_RECORDS]\nA|{DOMAIN}.|{IP}|0|3600\nA|www|{IP}|0|3600\nA|mail|{IP}|0|3600\nNS|{DOMAIN}.|{NS1}.|0|3600\nNS|{DOMAIN}.|{NS2}.|0|3600\nMX|{DOMAIN}.|mail.{DOMAIN}.|10|3600\nTXT|{DOMAIN}.|v=spf1 mx a ~all|0|3600', 'y'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `help_faq` --- +-- INSERT INTO `help_faq` VALUES (1,1,0,'I would like to know ...','Yes, of course.',1,1,'riud','riud','r'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `help_faq_sections` --- +-- INSERT INTO `help_faq_sections` VALUES (1,'General',0,NULL,NULL,NULL,NULL,NULL); -- -------------------------------------------------------- --- +-- -- Dumping data for table `software_repo` --- +-- INSERT INTO `software_repo` (`software_repo_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `repo_name`, `repo_url`, `repo_username`, `repo_password`, `active`) VALUES (1, 1, 1, 'riud', 'riud', '', 'ISPConfig Addons', 'http://repo.ispconfig.org/addons/', '', '', 'n'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `spamfilter_policy` --- +-- INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(1, 1, 0, 'riud', 'riud', 'r', 'Non-paying', 'N', 'N', 'N', 'N', 'Y', 'Y', 'Y', 'N', 'Y', '', '', '', '', '', '', 3, 7, 10, 0, 0, '', '', '', '', 'N', 'N', 'N', '', '', '', '', '', '', '', 0, '', 'n', 6.00, 8.00, 'rewrite_subject', 12.00); INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `policy_name`, `virus_lover`, `spam_lover`, `banned_files_lover`, `bad_header_lover`, `bypass_virus_checks`, `bypass_spam_checks`, `bypass_banned_checks`, `bypass_header_checks`, `spam_modifies_subj`, `virus_quarantine_to`, `spam_quarantine_to`, `banned_quarantine_to`, `bad_header_quarantine_to`, `clean_quarantine_to`, `other_quarantine_to`, `spam_tag_level`, `spam_tag2_level`, `spam_kill_level`, `spam_dsn_cutoff_level`, `spam_quarantine_cutoff_level`, `addr_extension_virus`, `addr_extension_spam`, `addr_extension_banned`, `addr_extension_bad_header`, `warnvirusrecip`, `warnbannedrecip`, `warnbadhrecip`, `newvirus_admin`, `virus_admin`, `banned_admin`, `bad_header_admin`, `spam_admin`, `spam_subject_tag`, `spam_subject_tag2`, `message_size_limit`, `banned_rulenames`, `rspamd_greylisting`, `rspamd_spam_greylisting_level`, `rspamd_spam_tag_level`, `rspamd_spam_tag_method`, `rspamd_spam_kill_level`) VALUES(2, 1, 0, 'riud', 'riud', 'r', 'Uncensored', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', NULL, NULL, NULL, NULL, NULL, NULL, 3, 999, 999, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'n', 999.00, 999.00, 'rewrite_subject', 999.00); @@ -2543,34 +2543,34 @@ INSERT INTO `spamfilter_policy` (`id`, `sys_userid`, `sys_groupid`, `sys_perm_us -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_group` --- +-- INSERT INTO `sys_group` (`groupid`, `name`, `description`, `client_id`) VALUES (1, 'admin', 'Administrators group', 0); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_ini` --- +-- INSERT INTO `sys_ini` (`sysini_id`, `config`, `default_logo`, `custom_logo`) VALUES (1, '', 'data:image/png;base64,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', ''); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_user` --- +-- INSERT INTO `sys_theme` (`var_id`, `tpl_name`, `username`, `logo_url`) VALUES (NULL, 'default', 'global', 'themes/default/images/header_logo.png'); INSERT INTO `sys_theme` (`var_id`, `tpl_name`, `username`, `logo_url`) VALUES (NULL, 'default-v2', 'global', 'themes/default-v2/images/header_logo.png'); -- -------------------------------------------------------- --- +-- -- Dumping data for table `sys_user` --- +-- INSERT INTO `sys_user` (`userid`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `username`, `passwort`, `modules`, `startmodule`, `app_theme`, `typ`, `active`, `language`, `groups`, `default_group`, `client_id`) VALUES (1, 1, 0, 'riud', 'riud', '', 'admin', '21232f297a57a5a743894a0e4a801fc3', 'dashboard,admin,client,mail,monitor,sites,dns,vm,tools,help', 'dashboard', 'default', 'admin', 1, 'en', '1,2', 1, 0); diff --git a/interface/web/dns/dns_sshfp_edit.php b/interface/web/dns/dns_sshfp_edit.php new file mode 100644 index 0000000000..adce9af9a1 --- /dev/null +++ b/interface/web/dns/dns_sshfp_edit.php @@ -0,0 +1,53 @@ +onLoad(); + +?> diff --git a/interface/web/dns/form/dns_sshfp.tform.php b/interface/web/dns/form/dns_sshfp.tform.php new file mode 100644 index 0000000000..6a71c6da78 --- /dev/null +++ b/interface/web/dns/form/dns_sshfp.tform.php @@ -0,0 +1,165 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS SSHFP", + 'width' => 100, + 'template' => "templates/dns_sshfp_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @$app->functions->intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( 0 => array( 'event' => 'SAVE', + 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', + 'type' => 'IDNTOUTF8'), + 2 => array( 'event' => 'SAVE', + 'type' => 'TOLOWER') + ), + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^(\*\.|[a-zA-Z0-9\.\-\_]){0,255}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'SSHFP', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'validators' => array ( + 0 => array ( + 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty' + ), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'RANGE', + 'range' => '60:', + 'errmsg'=> 'ttl_range_error'), + ), + 'default' => '3600', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N', 1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + //################################# + // END Datatable fields + //################################# + ) +); + +if($_SESSION["s"]["user"]["typ"] == 'admin') { + unset($form["tabs"]['dns']['fields']['data']['validators']); + $form["tabs"]['dns']['fields']['data']['validators'][0]['type'] = 'NOTEMPTY'; + $form["tabs"]['dns']['fields']['data']['validators'][0]['errmsg'] = 'data_error_empty'; + $form["tabs"]['dns']['fields']['data']['maxlength'] = 512; +} +?> diff --git a/interface/web/dns/lib/lang/ar_dns_sshfp.lng b/interface/web/dns/lib/lang/ar_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/ar_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/bg_dns_sshfp.lng b/interface/web/dns/lib/lang/bg_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/bg_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/br_dns_sshfp.lng b/interface/web/dns/lib/lang/br_dns_sshfp.lng new file mode 100644 index 0000000000..f84c2af034 --- /dev/null +++ b/interface/web/dns/lib/lang/br_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ca_dns_sshfp.lng b/interface/web/dns/lib/lang/ca_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/ca_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/cz_dns_sshfp.lng b/interface/web/dns/lib/lang/cz_dns_sshfp.lng new file mode 100644 index 0000000000..4ed9018152 --- /dev/null +++ b/interface/web/dns/lib/lang/cz_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/de_dns_sshfp.lng b/interface/web/dns/lib/lang/de_dns_sshfp.lng new file mode 100644 index 0000000000..eb2f83263a --- /dev/null +++ b/interface/web/dns/lib/lang/de_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/dk_dns_sshfp.lng b/interface/web/dns/lib/lang/dk_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/dk_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/el_dns_sshfp.lng b/interface/web/dns/lib/lang/el_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/el_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/en_dns_sshfp.lng b/interface/web/dns/lib/lang/en_dns_sshfp.lng new file mode 100644 index 0000000000..a2e3322bb6 --- /dev/null +++ b/interface/web/dns/lib/lang/en_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/es_dns_sshfp.lng b/interface/web/dns/lib/lang/es_dns_sshfp.lng new file mode 100644 index 0000000000..58292c007a --- /dev/null +++ b/interface/web/dns/lib/lang/es_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/fi_dns_sshfp.lng b/interface/web/dns/lib/lang/fi_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/fi_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/fr_dns_sshfp.lng b/interface/web/dns/lib/lang/fr_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/fr_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/hr_dns_sshfp.lng b/interface/web/dns/lib/lang/hr_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/hr_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/hu_dns_sshfp.lng b/interface/web/dns/lib/lang/hu_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/hu_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/id_dns_sshfp.lng b/interface/web/dns/lib/lang/id_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/id_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/it_dns_sshfp.lng b/interface/web/dns/lib/lang/it_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/it_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ja_dns_sshfp.lng b/interface/web/dns/lib/lang/ja_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/ja_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/nl_dns_sshfp.lng b/interface/web/dns/lib/lang/nl_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/nl_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/pl_dns_sshfp.lng b/interface/web/dns/lib/lang/pl_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/pl_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/pt_dns_sshfp.lng b/interface/web/dns/lib/lang/pt_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/pt_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ro_dns_sshfp.lng b/interface/web/dns/lib/lang/ro_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/ro_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/ru_dns_sshfp.lng b/interface/web/dns/lib/lang/ru_dns_sshfp.lng new file mode 100644 index 0000000000..bf1a8a892a --- /dev/null +++ b/interface/web/dns/lib/lang/ru_dns_sshfp.lng @@ -0,0 +1,16 @@ +TTL 60 секунд.'; +?> diff --git a/interface/web/dns/lib/lang/se_dns_sshfp.lng b/interface/web/dns/lib/lang/se_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/se_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/sk_dns_sshfp.lng b/interface/web/dns/lib/lang/sk_dns_sshfp.lng new file mode 100644 index 0000000000..dc9ad9a006 --- /dev/null +++ b/interface/web/dns/lib/lang/sk_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/lib/lang/tr_dns_sshfp.lng b/interface/web/dns/lib/lang/tr_dns_sshfp.lng new file mode 100644 index 0000000000..25350c9aa8 --- /dev/null +++ b/interface/web/dns/lib/lang/tr_dns_sshfp.lng @@ -0,0 +1,16 @@ + diff --git a/interface/web/dns/list/dns_a.list.php b/interface/web/dns/list/dns_a.list.php index b6363b7d24..007f76dfb3 100644 --- a/interface/web/dns/list/dns_a.list.php +++ b/interface/web/dns/list/dns_a.list.php @@ -132,7 +132,7 @@ $liste["item"][] = array( 'field' => "type", 'prefix' => "", 'suffix' => "", 'width' => "", - 'value' => array('A'=>'A', 'AAAA' => 'AAAA', 'ALIAS'=>'ALIAS', 'CAA'=>'CAA', 'CNAME'=>'CNAME', 'DS'=>'DS', 'HINFO'=>'HINFO', 'LOC'=>'LOC', 'MX'=>'MX', 'NAPTR'=>'NAPTR', 'NS'=>'NS', 'PTR'=>'PTR', 'RP'=>'RP', 'SRV'=>'SRV', 'TLSA'=>'TLSA', 'TXT'=>'TXT')); + 'value' => array('A'=>'A', 'AAAA' => 'AAAA', 'ALIAS'=>'ALIAS', 'CAA'=>'CAA', 'CNAME'=>'CNAME', 'DS'=>'DS', 'HINFO'=>'HINFO', 'LOC'=>'LOC', 'MX'=>'MX', 'NAPTR'=>'NAPTR', 'NS'=>'NS', 'PTR'=>'PTR', 'RP'=>'RP', 'SRV'=>'SRV', 'SSHFP'=>'SSHFP', 'TLSA'=>'TLSA', 'TXT'=>'TXT')); ?> diff --git a/interface/web/dns/templates/dns_a_list.htm b/interface/web/dns/templates/dns_a_list.htm index b6b21f18b6..46fb103b7d 100644 --- a/interface/web/dns/templates/dns_a_list.htm +++ b/interface/web/dns/templates/dns_a_list.htm @@ -34,10 +34,11 @@ + - + @@ -93,4 +94,3 @@ - diff --git a/interface/web/dns/templates/dns_sshfp_edit.htm b/interface/web/dns/templates/dns_sshfp_edit.htm new file mode 100644 index 0000000000..18a40a8010 --- /dev/null +++ b/interface/web/dns/templates/dns_sshfp_edit.htm @@ -0,0 +1,25 @@ +
+ +
+
+ +
+
+ +
+
+ +
+ {tmpl_var name='active'} +
+
+ + + + + + +
+ + +
diff --git a/server/conf/bind_pri.domain.master b/server/conf/bind_pri.domain.master index 379d80c8df..9635e445f7 100644 --- a/server/conf/bind_pri.domain.master +++ b/server/conf/bind_pri.domain.master @@ -50,6 +50,9 @@ $TTL {tmpl_var name='ttl'} {tmpl_var name='name'} {tmpl_var name='ttl'} SRV {tmpl_var name='aux'} {tmpl_var name='data'} + +{tmpl_var name='name'} {tmpl_var name='ttl'} SSHFP {tmpl_var name='data'} {tmpl_var name='data'} + {tmpl_var name='name'} {tmpl_var name='ttl'} TLSA {tmpl_var name='data'} @@ -60,5 +63,3 @@ $TTL {tmpl_var name='ttl'} {tmpl_var name='name'} {tmpl_var name='ttl'} TYPE257 {tmpl_var name='data'}
- - -- GitLab From 7cedfde85bdfa03bcf5bee522113e6c1c2d78cbb Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 13:18:52 +0200 Subject: [PATCH 0217/1368] Add remote functions for SSHFP --- interface/lib/classes/remote.d/dns.inc.php | 46 ++++++++++++++++------ interface/web/dns/lib/remote.conf.php | 1 + 2 files changed, 35 insertions(+), 12 deletions(-) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 612adf7186..817953a5c7 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -57,7 +57,7 @@ class remoting_dns extends remoting { $app->uses('tform'); $app->tform->loadFormDef($tform_def_file); $app->uses('tpl,validate_dns,remoting_lib'); - + $app->remoting_lib->loadUserProfile($client_id); //* replace template placeholders @@ -197,7 +197,7 @@ class remoting_dns extends remoting { $app->remoting_lib->loadFormDef('../dns/form/dns_soa.tform.php'); return $app->remoting_lib->getDataRecord($primary_id); } - + //* Get slave zone details public function dns_slave_get($session_id, $primary_id) { global $app; @@ -211,7 +211,7 @@ class remoting_dns extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } - + //* Add a slave zone public function dns_slave_add($session_id, $client_id, $params) { if(!$this->checkPerm($session_id, 'dns_zone_add')) { @@ -220,7 +220,7 @@ class remoting_dns extends remoting { } return $this->insertQuery('../dns/form/dns_slave.tform.php', $client_id, $params); } - + //* Update a slave zone public function dns_slave_update($session_id, $client_id, $primary_id, $params) { if(!$this->checkPerm($session_id, 'dns_zone_update')) { @@ -296,12 +296,12 @@ class remoting_dns extends remoting { private function dns_rr_get($session_id, $primary_id, $rr_type = 'A') { global $app; - + $rr_type = strtolower($rr_type); if(!preg_match('/^[a-z]+$/', $rr_type)) { throw new SoapFault('permission denied', 'Invalid rr type'); } - + if(!$this->checkPerm($session_id, 'dns_' . $rr_type . '_get')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); } @@ -309,14 +309,14 @@ class remoting_dns extends remoting { $app->remoting_lib->loadFormDef('../dns/form/dns_' . $rr_type . '.tform.php'); return $app->remoting_lib->getDataRecord($primary_id); } - + //* Add a record private function dns_rr_add($session_id, $client_id, $params, $update_serial=false, $rr_type = 'A') { $rr_type = strtolower($rr_type); if(!preg_match('/^[a-z]+$/', $rr_type)) { throw new SoapFault('permission denied', 'Invalid rr type'); } - + if(!$this->checkPerm($session_id, 'dns_' . $rr_type . '_add')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); } @@ -332,7 +332,7 @@ class remoting_dns extends remoting { if(!preg_match('/^[a-z]+$/', $rr_type)) { throw new SoapFault('permission denied', 'Invalid rr type'); } - + if(!$this->checkPerm($session_id, 'dns_' . $rr_type . '_update')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; @@ -343,7 +343,7 @@ class remoting_dns extends remoting { } return $affected_rows; } - + //* Delete a record private function dns_rr_delete($session_id, $primary_id, $update_serial=false, $rr_type = 'A') { $rr_type = strtolower($rr_type); @@ -359,9 +359,9 @@ class remoting_dns extends remoting { $affected_rows = $this->deleteQuery('../dns/form/dns_' . $rr_type . '.tform.php', $primary_id); return $affected_rows; } - + // ---------------------------------------------------------------------------------------------------------------- - + //* Get record details public function dns_aaaa_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'AAAA'); @@ -626,6 +626,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_sshfp_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'SSHFP'); + } + + //* Add a record + public function dns_sshfp_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'SSHFP'); + } + + //* Update a record + public function dns_sshfp_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'SSHFP'); + } + + //* Delete a record + public function dns_sshfp_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'SSHFP'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_tlsa_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'TLSA'); diff --git a/interface/web/dns/lib/remote.conf.php b/interface/web/dns/lib/remote.conf.php index ea725de8a4..c87296a8c9 100644 --- a/interface/web/dns/lib/remote.conf.php +++ b/interface/web/dns/lib/remote.conf.php @@ -15,6 +15,7 @@ $function_list['dns_ns_get,dns_ns_add,dns_ns_update,dns_ns_delete'] = 'DNS ns fu $function_list['dns_ptr_get,dns_ptr_add,dns_ptr_update,dns_ptr_delete'] = 'DNS ptr functions'; $function_list['dns_rp_get,dns_rp_add,dns_rp_update,dns_rp_delete'] = 'DNS rp functions'; $function_list['dns_srv_get,dns_srv_add,dns_srv_update,dns_srv_delete'] = 'DNS srv functions'; +$function_list['dns_sshfp_get,dns_sshfp_add,dns_sshfp_update,dns_sshfp_delete'] = 'DNS sshfp functions'; $function_list['dns_tlsa_get,dns_tlsa_add,dns_tlsa_update,dns_tlsa_delete'] = 'DNS tlsa functions'; $function_list['dns_txt_get,dns_txt_add,dns_txt_update,dns_txt_delete'] = 'DNS txt functions'; -- GitLab From 488bbdd5fbc1292be385df6ec2949e99972f2107 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 15:08:09 +0200 Subject: [PATCH 0218/1368] Add translation for new DNAME record --- interface/web/dns/lib/lang/ar_dns_a.lng | 2 +- interface/web/dns/lib/lang/ar_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ar_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ar_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/bg_dns_a.lng | 2 +- interface/web/dns/lib/lang/bg_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/bg_dns_cname.lng | 2 +- interface/web/dns/lib/lang/bg_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/br_dns_a.lng | 2 +- interface/web/dns/lib/lang/br_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/br_dns_cname.lng | 2 +- interface/web/dns/lib/lang/br_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/ca_dns_a.lng | 2 +- interface/web/dns/lib/lang/ca_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ca_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ca_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/cz_dns_a.lng | 2 +- interface/web/dns/lib/lang/cz_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/cz_dns_cname.lng | 2 +- interface/web/dns/lib/lang/cz_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/de_dns_a.lng | 2 +- interface/web/dns/lib/lang/de_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/de_dns_cname.lng | 2 +- interface/web/dns/lib/lang/de_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/dk_dns_a.lng | 2 +- interface/web/dns/lib/lang/dk_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/dk_dns_cname.lng | 2 +- interface/web/dns/lib/lang/dk_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/el_dns_a.lng | 2 +- interface/web/dns/lib/lang/el_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/el_dns_cname.lng | 2 +- interface/web/dns/lib/lang/el_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/en_dns_a.lng | 2 +- interface/web/dns/lib/lang/en_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/en_dns_cname.lng | 4 ++-- interface/web/dns/lib/lang/en_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/es_dns_a.lng | 2 +- interface/web/dns/lib/lang/es_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/es_dns_cname.lng | 2 +- interface/web/dns/lib/lang/es_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/fi_dns_a.lng | 2 +- interface/web/dns/lib/lang/fi_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/fi_dns_cname.lng | 2 +- interface/web/dns/lib/lang/fi_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/fr_dns_a.lng | 2 +- interface/web/dns/lib/lang/fr_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/fr_dns_cname.lng | 2 +- interface/web/dns/lib/lang/fr_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/hr_dns_a.lng | 2 +- interface/web/dns/lib/lang/hr_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/hr_dns_cname.lng | 2 +- interface/web/dns/lib/lang/hr_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/hu_dns_a.lng | 2 +- interface/web/dns/lib/lang/hu_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/hu_dns_cname.lng | 2 +- interface/web/dns/lib/lang/hu_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/id_dns_a.lng | 2 +- interface/web/dns/lib/lang/id_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/id_dns_cname.lng | 2 +- interface/web/dns/lib/lang/id_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/it_dns_a.lng | 2 +- interface/web/dns/lib/lang/it_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/it_dns_cname.lng | 2 +- interface/web/dns/lib/lang/it_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/ja_dns_a.lng | 2 +- interface/web/dns/lib/lang/ja_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ja_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ja_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/nl_dns_a.lng | 2 +- interface/web/dns/lib/lang/nl_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/nl_dns_cname.lng | 2 +- interface/web/dns/lib/lang/nl_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/pl_dns_a.lng | 2 +- interface/web/dns/lib/lang/pl_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/pl_dns_cname.lng | 2 +- interface/web/dns/lib/lang/pl_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/pt_dns_a.lng | 2 +- interface/web/dns/lib/lang/pt_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/pt_dns_cname.lng | 2 +- interface/web/dns/lib/lang/pt_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/ro_dns_a.lng | 2 +- interface/web/dns/lib/lang/ro_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ro_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ro_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/ru_dns_a.lng | 2 +- interface/web/dns/lib/lang/ru_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ru_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ru_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/se_dns_a.lng | 2 +- interface/web/dns/lib/lang/se_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/se_dns_cname.lng | 2 +- interface/web/dns/lib/lang/se_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/sk_dns_a.lng | 2 +- interface/web/dns/lib/lang/sk_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/sk_dns_cname.lng | 2 +- interface/web/dns/lib/lang/sk_dns_dname.lng | 17 +++++++++++++++++ interface/web/dns/lib/lang/tr_dns_a.lng | 2 +- interface/web/dns/lib/lang/tr_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/tr_dns_cname.lng | 2 +- interface/web/dns/lib/lang/tr_dns_dname.lng | 17 +++++++++++++++++ 100 files changed, 501 insertions(+), 76 deletions(-) create mode 100644 interface/web/dns/lib/lang/ar_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/bg_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/br_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/ca_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/cz_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/de_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/dk_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/el_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/en_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/es_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/fi_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/fr_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/hr_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/hu_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/id_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/it_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/ja_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/nl_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/pl_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/pt_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/ro_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/ru_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/se_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/sk_dns_dname.lng create mode 100644 interface/web/dns/lib/lang/tr_dns_dname.lng diff --git a/interface/web/dns/lib/lang/ar_dns_a.lng b/interface/web/dns/lib/lang/ar_dns_a.lng index 68e40da5e7..c191ff19d3 100644 --- a/interface/web/dns/lib/lang/ar_dns_a.lng +++ b/interface/web/dns/lib/lang/ar_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_aaaa.lng b/interface/web/dns/lib/lang/ar_dns_aaaa.lng index 3d634780f1..03f18f18da 100644 --- a/interface/web/dns/lib/lang/ar_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ar_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_cname.lng b/interface/web/dns/lib/lang/ar_dns_cname.lng index 5f8363aaa8..636c4e7a7a 100644 --- a/interface/web/dns/lib/lang/ar_dns_cname.lng +++ b/interface/web/dns/lib/lang/ar_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_dname.lng b/interface/web/dns/lib/lang/ar_dns_dname.lng new file mode 100644 index 0000000000..382397abf7 --- /dev/null +++ b/interface/web/dns/lib/lang/ar_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/bg_dns_a.lng b/interface/web/dns/lib/lang/bg_dns_a.lng index e397d9774e..f789a19f47 100644 --- a/interface/web/dns/lib/lang/bg_dns_a.lng +++ b/interface/web/dns/lib/lang/bg_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Полето за хост име е празно.'; $wb['name_error_regex'] = 'Избраното име на хост е в грешен формат.'; $wb['data_error_empty'] = 'Полето за IP-адреса е празно'; $wb['ip_error_wrong'] = 'Формата на IP-адреса е грешен'; -$wb['data_error_duplicate'] = 'Дублиран A-Запис'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_aaaa.lng b/interface/web/dns/lib/lang/bg_dns_aaaa.lng index d4efae73db..d2ca072bec 100644 --- a/interface/web/dns/lib/lang/bg_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/bg_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Вие нямате право да добавяте за $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_cname.lng b/interface/web/dns/lib/lang/bg_dns_cname.lng index d7de1f0c01..d9863d10e8 100644 --- a/interface/web/dns/lib/lang/bg_dns_cname.lng +++ b/interface/web/dns/lib/lang/bg_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_dname.lng b/interface/web/dns/lib/lang/bg_dns_dname.lng new file mode 100644 index 0000000000..4705cd73d8 --- /dev/null +++ b/interface/web/dns/lib/lang/bg_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/br_dns_a.lng b/interface/web/dns/lib/lang/br_dns_a.lng index f96cf551e6..7204ce11ab 100644 --- a/interface/web/dns/lib/lang/br_dns_a.lng +++ b/interface/web/dns/lib/lang/br_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'Endereço IP está em branco.'; $wb['ip_error_wrong'] = 'Endereço IP inválido.'; -$wb['data_error_duplicate'] = 'Registro A ou CNAME duplicado.'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_aaaa.lng b/interface/web/dns/lib/lang/br_dns_aaaa.lng index 2f81a52a0c..5678f2c67f 100644 --- a/interface/web/dns/lib/lang/br_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/br_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns ne $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'Endereço IPv6 está em branco.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'O endereço IPv6 possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_cname.lng b/interface/web/dns/lib/lang/br_dns_cname.lng index c4fb0df260..e36fb57909 100644 --- a/interface/web/dns/lib/lang/br_dns_cname.lng +++ b/interface/web/dns/lib/lang/br_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'O alvo do host está em branco.'; $wb['data_error_regex'] = 'O alvo do host possui formato inválido.'; -$wb['data_error_duplicate'] = 'Registro A ou CNAME duplicado.'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_dname.lng b/interface/web/dns/lib/lang/br_dns_dname.lng new file mode 100644 index 0000000000..4a8f98cb02 --- /dev/null +++ b/interface/web/dns/lib/lang/br_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ca_dns_a.lng b/interface/web/dns/lib/lang/ca_dns_a.lng index 6b3b31ae4c..e91bff2c73 100644 --- a/interface/web/dns/lib/lang/ca_dns_a.lng +++ b/interface/web/dns/lib/lang/ca_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Enregistrement A ou CNAME en double'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_aaaa.lng b/interface/web/dns/lib/lang/ca_dns_aaaa.lng index c06b153dc2..94a7deeddb 100644 --- a/interface/web/dns/lib/lang/ca_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ca_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_cname.lng b/interface/web/dns/lib/lang/ca_dns_cname.lng index 3d191f703b..94d523c4e2 100644 --- a/interface/web/dns/lib/lang/ca_dns_cname.lng +++ b/interface/web/dns/lib/lang/ca_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d\'hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d\'hôte cible invalide.'; -$wb['data_error_duplicate'] = 'Enregistrement A ou CNAME en double'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_dname.lng b/interface/web/dns/lib/lang/ca_dns_dname.lng new file mode 100644 index 0000000000..480f1ddd4d --- /dev/null +++ b/interface/web/dns/lib/lang/ca_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/cz_dns_a.lng b/interface/web/dns/lib/lang/cz_dns_a.lng index 871f9146d4..cfc3c60854 100644 --- a/interface/web/dns/lib/lang/cz_dns_a.lng +++ b/interface/web/dns/lib/lang/cz_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny.'; $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'IP adresa je prázdná'; -$wb['data_error_duplicate'] = 'Duplikace A záznamu'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_aaaa.lng b/interface/web/dns/lib/lang/cz_dns_aaaa.lng index 9c59cea715..67fc7c7906 100644 --- a/interface/web/dns/lib/lang/cz_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/cz_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny.'; $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'IP adresa je prázdná'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_cname.lng b/interface/web/dns/lib/lang/cz_dns_cname.lng index 8fed28a5a7..c41b619588 100644 --- a/interface/web/dns/lib/lang/cz_dns_cname.lng +++ b/interface/web/dns/lib/lang/cz_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'Cílový název hostitele je prázdný'; $wb['data_error_regex'] = 'Cílový název hostitele má chybný formát'; -$wb['data_error_duplicate'] = 'Duplikace A záznamu nebo CNAME-záznamu'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_dname.lng b/interface/web/dns/lib/lang/cz_dns_dname.lng new file mode 100644 index 0000000000..7003f707c4 --- /dev/null +++ b/interface/web/dns/lib/lang/cz_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/de_dns_a.lng b/interface/web/dns/lib/lang/de_dns_a.lng index 564a9318de..af10bb1d19 100644 --- a/interface/web/dns/lib/lang/de_dns_a.lng +++ b/interface/web/dns/lib/lang/de_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv4 Adresse ist leer'; $wb['ip_error_wrong'] = 'IPv4 Adressen Format ist ungültig'; -$wb['data_error_duplicate'] = 'Doppelter A oder CNAME Eintrag'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_aaaa.lng b/interface/web/dns/lib/lang/de_dns_aaaa.lng index a225723f89..c54663a94f 100644 --- a/interface/web/dns/lib/lang/de_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/de_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Sie haben nicht die Berechtigung, einen Eintrag zu dieser $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv6 Adresse ist leer'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IPv6 Adressen Format ist ungültig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_cname.lng b/interface/web/dns/lib/lang/de_dns_cname.lng index 6f9b0eecb4..0342276336 100644 --- a/interface/web/dns/lib/lang/de_dns_cname.lng +++ b/interface/web/dns/lib/lang/de_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'Ziel Hostname ist leer'; $wb['data_error_regex'] = 'Ziel Hostname Format ist ungültig'; -$wb['data_error_duplicate'] = 'Doppelter A oder CNAME Eintrag'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_dname.lng b/interface/web/dns/lib/lang/de_dns_dname.lng new file mode 100644 index 0000000000..f2154e37ad --- /dev/null +++ b/interface/web/dns/lib/lang/de_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/dk_dns_a.lng b/interface/web/dns/lib/lang/dk_dns_a.lng index b10dae13ac..7506edcef5 100644 --- a/interface/web/dns/lib/lang/dk_dns_a.lng +++ b/interface/web/dns/lib/lang/dk_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; -$wb['data_error_duplicate'] = 'Dupliker A-Record eller CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_aaaa.lng b/interface/web/dns/lib/lang/dk_dns_aaaa.lng index 27a7fae538..107b28be91 100644 --- a/interface/web/dns/lib/lang/dk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/dk_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_cname.lng b/interface/web/dns/lib/lang/dk_dns_cname.lng index 1957b5f82c..e213d6e3d9 100644 --- a/interface/web/dns/lib/lang/dk_dns_cname.lng +++ b/interface/web/dns/lib/lang/dk_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'Mål-værtsnavn er tom'; $wb['data_error_regex'] = 'Mål-værtsnavn format er ugyldigt'; -$wb['data_error_duplicate'] = 'Duplikere A-Record eller CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_dname.lng b/interface/web/dns/lib/lang/dk_dns_dname.lng new file mode 100644 index 0000000000..1815eab77a --- /dev/null +++ b/interface/web/dns/lib/lang/dk_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/el_dns_a.lng b/interface/web/dns/lib/lang/el_dns_a.lng index ca5f336d98..6202d2e88b 100644 --- a/interface/web/dns/lib/lang/el_dns_a.lng +++ b/interface/web/dns/lib/lang/el_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Η διεύθυνση IP είναι κενή'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; -$wb['data_error_duplicate'] = 'Διπλή εγγραφή A-Record ή CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_aaaa.lng b/interface/web/dns/lib/lang/el_dns_aaaa.lng index faced402b1..5341e9022d 100644 --- a/interface/web/dns/lib/lang/el_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/el_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Δεν έχετε δικαίωμα να προσθέσε $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Διεύθυνση IP κενή'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_cname.lng b/interface/web/dns/lib/lang/el_dns_cname.lng index 546d16fdae..1d19eb0c23 100644 --- a/interface/web/dns/lib/lang/el_dns_cname.lng +++ b/interface/web/dns/lib/lang/el_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Το hostname Προορισμός δεν έχει οριστεί'; $wb['data_error_regex'] = 'Hostname Προορισμός με μη έγκυρη μορφοποίηση'; -$wb['data_error_duplicate'] = 'Διπλοεγγραφή A-Record ή CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_dname.lng b/interface/web/dns/lib/lang/el_dns_dname.lng new file mode 100644 index 0000000000..ba6404887a --- /dev/null +++ b/interface/web/dns/lib/lang/el_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/en_dns_a.lng b/interface/web/dns/lib/lang/en_dns_a.lng index 510d04f34d..3f9f4aa047 100644 --- a/interface/web/dns/lib/lang/en_dns_a.lng +++ b/interface/web/dns/lib/lang/en_dns_a.lng @@ -12,6 +12,6 @@ $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'IP-Address empty'; $wb["ip_error_wrong"] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_aaaa.lng b/interface/web/dns/lib/lang/en_dns_aaaa.lng index 1272fb8587..d55ab7ffd3 100644 --- a/interface/web/dns/lib/lang/en_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/en_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb["no_zone_perm"] = 'You do not have the permission to add a record to this DN $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb["ip_error_wrong"] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_cname.lng b/interface/web/dns/lib/lang/en_dns_cname.lng index ea67106e7a..7ffb78e0d3 100644 --- a/interface/web/dns/lib/lang/en_dns_cname.lng +++ b/interface/web/dns/lib/lang/en_dns_cname.lng @@ -12,6 +12,6 @@ $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'Target hostname empty'; $wb["data_error_regex"] = 'Target hostname format invalid'; -$wb["data_error_duplicate"] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -?> \ No newline at end of file +?> diff --git a/interface/web/dns/lib/lang/en_dns_dname.lng b/interface/web/dns/lib/lang/en_dns_dname.lng new file mode 100644 index 0000000000..d9b41a012e --- /dev/null +++ b/interface/web/dns/lib/lang/en_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/es_dns_a.lng b/interface/web/dns/lib/lang/es_dns_a.lng index f3ea858f1d..0f19854e2d 100644 --- a/interface/web/dns/lib/lang/es_dns_a.lng +++ b/interface/web/dns/lib/lang/es_dns_a.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/dns/lib/lang/fi_dns_a.lng b/interface/web/dns/lib/lang/fi_dns_a.lng index a7cf6efbbb..be6b4cc42a 100644 --- a/interface/web/dns/lib/lang/fi_dns_a.lng +++ b/interface/web/dns/lib/lang/fi_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.'; $wb['data_error_empty'] = 'IP-osoite tyhjä'; $wb['ip_error_wrong'] = 'IP-osoite on vääränlainen'; -$wb['data_error_duplicate'] = 'A-tietue on jo olemassa'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_aaaa.lng b/interface/web/dns/lib/lang/fi_dns_aaaa.lng index f6f99f324b..3759287206 100644 --- a/interface/web/dns/lib/lang/fi_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fi_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Käyttäjätunnuksella ei ole oikeuksia lisätä tietueit $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on väärän muotoinen.'; $wb['data_error_empty'] = 'Tekstikenttä on tyhjä'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Tekstikenttä on vääränlainen'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_cname.lng b/interface/web/dns/lib/lang/fi_dns_cname.lng index 3241e1f780..202949b9f7 100644 --- a/interface/web/dns/lib/lang/fi_dns_cname.lng +++ b/interface/web/dns/lib/lang/fi_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.'; $wb['data_error_empty'] = 'Kohteen verkkotunnus on tyhjä'; $wb['data_error_regex'] = 'Kohteen verkkotunnus on vääränlainen'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_dname.lng b/interface/web/dns/lib/lang/fi_dns_dname.lng new file mode 100644 index 0000000000..d7483389d4 --- /dev/null +++ b/interface/web/dns/lib/lang/fi_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/fr_dns_a.lng b/interface/web/dns/lib/lang/fr_dns_a.lng index 381fd623a6..f022f0c873 100644 --- a/interface/web/dns/lib/lang/fr_dns_a.lng +++ b/interface/web/dns/lib/lang/fr_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Enregistrement A ou CNAME en double'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_aaaa.lng b/interface/web/dns/lib/lang/fr_dns_aaaa.lng index 280acdcea4..52e5ef1b33 100644 --- a/interface/web/dns/lib/lang/fr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fr_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_cname.lng b/interface/web/dns/lib/lang/fr_dns_cname.lng index 15b4144086..8a5840a2bc 100644 --- a/interface/web/dns/lib/lang/fr_dns_cname.lng +++ b/interface/web/dns/lib/lang/fr_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d’hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d’hôte cible invalide.'; -$wb['data_error_duplicate'] = 'Enregistrement A ou CNAME en double'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_dname.lng b/interface/web/dns/lib/lang/fr_dns_dname.lng new file mode 100644 index 0000000000..47779eeffe --- /dev/null +++ b/interface/web/dns/lib/lang/fr_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/hr_dns_a.lng b/interface/web/dns/lib/lang/hr_dns_a.lng index a6be0b89fc..b4c83d6431 100644 --- a/interface/web/dns/lib/lang/hr_dns_a.lng +++ b/interface/web/dns/lib/lang/hr_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IP adresa je prazno'; $wb['ip_error_wrong'] = 'Neispravan format A zapisa'; -$wb['data_error_duplicate'] = 'Već postoji ovaj A ili CNAME zapis'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_aaaa.lng b/interface/web/dns/lib/lang/hr_dns_aaaa.lng index 76fc600703..2e2ee87893 100644 --- a/interface/web/dns/lib/lang/hr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hr_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemate dozvolu za dodavanja zapisa ovoj domeni.'; $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IPv6 adresa je prazno'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Neispravan format IPv6 adrese'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_cname.lng b/interface/web/dns/lib/lang/hr_dns_cname.lng index cb1f5ece00..4e8fad12ba 100644 --- a/interface/web/dns/lib/lang/hr_dns_cname.lng +++ b/interface/web/dns/lib/lang/hr_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje odredišni host je prazno'; $wb['data_error_regex'] = 'Neispravan format odredišnog host zapisa'; -$wb['data_error_duplicate'] = 'Duplicirani A zapis ili CNAME zapis'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_dname.lng b/interface/web/dns/lib/lang/hr_dns_dname.lng new file mode 100644 index 0000000000..ce334e750e --- /dev/null +++ b/interface/web/dns/lib/lang/hr_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/hu_dns_a.lng b/interface/web/dns/lib/lang/hu_dns_a.lng index 4820079b53..9c27b79139 100644 --- a/interface/web/dns/lib/lang/hu_dns_a.lng +++ b/interface/web/dns/lib/lang/hu_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_aaaa.lng b/interface/web/dns/lib/lang/hu_dns_aaaa.lng index 5f261eeb5f..a532c80ca1 100644 --- a/interface/web/dns/lib/lang/hu_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hu_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_cname.lng b/interface/web/dns/lib/lang/hu_dns_cname.lng index 9f45f5279c..36969d9984 100644 --- a/interface/web/dns/lib/lang/hu_dns_cname.lng +++ b/interface/web/dns/lib/lang/hu_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_dname.lng b/interface/web/dns/lib/lang/hu_dns_dname.lng new file mode 100644 index 0000000000..38a6415774 --- /dev/null +++ b/interface/web/dns/lib/lang/hu_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/id_dns_a.lng b/interface/web/dns/lib/lang/id_dns_a.lng index e953380090..659091bca6 100644 --- a/interface/web/dns/lib/lang/id_dns_a.lng +++ b/interface/web/dns/lib/lang/id_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; -$wb['data_error_duplicate'] = 'Record-A Ganda'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_aaaa.lng b/interface/web/dns/lib/lang/id_dns_aaaa.lng index 3257ba193f..4b17ef0e85 100644 --- a/interface/web/dns/lib/lang/id_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/id_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Anda tidak memiliki hak untuk menambah record ke zona DNS $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_cname.lng b/interface/web/dns/lib/lang/id_dns_cname.lng index a12d665652..4151b241db 100644 --- a/interface/web/dns/lib/lang/id_dns_cname.lng +++ b/interface/web/dns/lib/lang/id_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Nama Host Target kosong'; $wb['data_error_regex'] = 'Format Nama Host Target tidak valid'; -$wb['data_error_duplicate'] = 'Record-A atau Record-CNAME Ganda'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_dname.lng b/interface/web/dns/lib/lang/id_dns_dname.lng new file mode 100644 index 0000000000..9413415394 --- /dev/null +++ b/interface/web/dns/lib/lang/id_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng index 9aa9e1186f..2e79466d7f 100644 --- a/interface/web/dns/lib/lang/it_dns_a.lng +++ b/interface/web/dns/lib/lang/it_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname vuoto.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng index e82ada0166..76c540459d 100644 --- a/interface/web/dns/lib/lang/it_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DN $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Indirizzo Ip vuoto'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_cname.lng b/interface/web/dns/lib/lang/it_dns_cname.lng index 0732cbd72a..76cd9cd0e7 100644 --- a/interface/web/dns/lib/lang/it_dns_cname.lng +++ b/interface/web/dns/lib/lang/it_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Target nome host vuoto'; $wb['data_error_regex'] = 'Target nome host formato errato'; -$wb['data_error_duplicate'] = 'A-Record o CNAME-Record duplicato'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_dname.lng b/interface/web/dns/lib/lang/it_dns_dname.lng new file mode 100644 index 0000000000..6d7d135a01 --- /dev/null +++ b/interface/web/dns/lib/lang/it_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ja_dns_a.lng b/interface/web/dns/lib/lang/ja_dns_a.lng index 890183a927..a59aec7376 100644 --- a/interface/web/dns/lib/lang/ja_dns_a.lng +++ b/interface/web/dns/lib/lang/ja_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; -$wb['data_error_duplicate'] = 'Aレコードが重複しています。'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_aaaa.lng b/interface/web/dns/lib/lang/ja_dns_aaaa.lng index 3f10406659..cfc23b426a 100644 --- a/interface/web/dns/lib/lang/ja_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ja_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'このDNSゾーンにレコードを追加する権限が $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_cname.lng b/interface/web/dns/lib/lang/ja_dns_cname.lng index 2e0fd3de7a..b29ead6599 100644 --- a/interface/web/dns/lib/lang/ja_dns_cname.lng +++ b/interface/web/dns/lib/lang/ja_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'ターゲットのホスト名を入力してください。'; $wb['data_error_regex'] = 'ターゲットのホスト名の形式が不正です。'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_dname.lng b/interface/web/dns/lib/lang/ja_dns_dname.lng new file mode 100644 index 0000000000..af805c9823 --- /dev/null +++ b/interface/web/dns/lib/lang/ja_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/nl_dns_a.lng b/interface/web/dns/lib/lang/nl_dns_a.lng index b70b5c9c50..45d0501ac9 100644 --- a/interface/web/dns/lib/lang/nl_dns_a.lng +++ b/interface/web/dns/lib/lang/nl_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'De hostnaam is niet ingvuld.'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingvuld'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; -$wb['data_error_duplicate'] = 'Duplicaat A-Record of CNAME-record'; +$wb['data_error_duplicate'] = 'Duplicaat A, CNAME, of DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_aaaa.lng b/interface/web/dns/lib/lang/nl_dns_aaaa.lng index 139cc71ded..e30766442d 100644 --- a/interface/web/dns/lib/lang/nl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/nl_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'U heeft geen toestemming om een record toe te voegen aan $wb['name_error_empty'] = 'De hostnaam is niet ingvuld'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingevuld'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_cname.lng b/interface/web/dns/lib/lang/nl_dns_cname.lng index 00057d3f15..84b904a60e 100644 --- a/interface/web/dns/lib/lang/nl_dns_cname.lng +++ b/interface/web/dns/lib/lang/nl_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'De hostnaam is niet ingvuld.'; $wb['name_error_regex'] = 'De hostname heeft een onjuist formaat.'; $wb['data_error_empty'] = 'Doel hostnaam is niet ingvuld'; $wb['data_error_regex'] = 'Doel hostnaam formaat ongeldig'; -$wb['data_error_duplicate'] = 'Duplicaat A-record of CNAME-record'; +$wb['data_error_duplicate'] = 'Duplicaat A, CNAME, of DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_dname.lng b/interface/web/dns/lib/lang/nl_dns_dname.lng new file mode 100644 index 0000000000..d5f63bcc13 --- /dev/null +++ b/interface/web/dns/lib/lang/nl_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/pl_dns_a.lng b/interface/web/dns/lib/lang/pl_dns_a.lng index 88adb2306e..59ef056e53 100644 --- a/interface/web/dns/lib/lang/pl_dns_a.lng +++ b/interface/web/dns/lib/lang/pl_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; -$wb['data_error_duplicate'] = 'Duplikat wpisu A.'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_aaaa.lng b/interface/web/dns/lib/lang/pl_dns_aaaa.lng index 86d93fe71f..debb636d7e 100644 --- a/interface/web/dns/lib/lang/pl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pl_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nie masz uprawnień, aby dodać nowy wpis w tej strefie D $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_cname.lng b/interface/web/dns/lib/lang/pl_dns_cname.lng index 8153741f91..bee2839ae0 100644 --- a/interface/web/dns/lib/lang/pl_dns_cname.lng +++ b/interface/web/dns/lib/lang/pl_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Docelowa nazwa serwera jest pusta.'; $wb['data_error_regex'] = 'Docelowa nazwa serwera ma niepoprawny format.'; -$wb['data_error_duplicate'] = 'Zdublowany rekord A lub CNAME.'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_dname.lng b/interface/web/dns/lib/lang/pl_dns_dname.lng new file mode 100644 index 0000000000..d4fb5ab8c8 --- /dev/null +++ b/interface/web/dns/lib/lang/pl_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/pt_dns_a.lng b/interface/web/dns/lib/lang/pt_dns_a.lng index 37e949b431..0051c476bc 100644 --- a/interface/web/dns/lib/lang/pt_dns_a.lng +++ b/interface/web/dns/lib/lang/pt_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname em branco.'; $wb['name_error_regex'] = 'Hostname tem um formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; $wb['ip_error_wrong'] = 'Endereço-IP formato inválido'; -$wb['data_error_duplicate'] = 'Registo-A duplicado'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_aaaa.lng b/interface/web/dns/lib/lang/pt_dns_aaaa.lng index 9fc3798dc8..29da278ec4 100644 --- a/interface/web/dns/lib/lang/pt_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pt_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Não tem permissão para adicionar registos a está zona $wb['name_error_empty'] = 'O Hostname está em branco.'; $wb['name_error_regex'] = 'O Hostname está com formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Endereço-IP com formato inválido'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_cname.lng b/interface/web/dns/lib/lang/pt_dns_cname.lng index 6d2c7fbba4..06782a96c4 100644 --- a/interface/web/dns/lib/lang/pt_dns_cname.lng +++ b/interface/web/dns/lib/lang/pt_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname está em branco.'; $wb['name_error_regex'] = 'O hostname está em um formato inválido.'; $wb['data_error_empty'] = 'Hostname de destino está em branco'; $wb['data_error_regex'] = 'O hostname de destino está em um formato inválido.'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_dname.lng b/interface/web/dns/lib/lang/pt_dns_dname.lng new file mode 100644 index 0000000000..124b9e3000 --- /dev/null +++ b/interface/web/dns/lib/lang/pt_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ro_dns_a.lng b/interface/web/dns/lib/lang/ro_dns_a.lng index b8c2522432..556dbea115 100644 --- a/interface/web/dns/lib/lang/ro_dns_a.lng +++ b/interface/web/dns/lib/lang/ro_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname necompletat'; $wb['name_error_regex'] = 'Hostname format gresit'; $wb['data_error_empty'] = 'IP-Adresa vid'; $wb['ip_error_wrong'] = 'IP-Adresa format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_aaaa.lng b/interface/web/dns/lib/lang/ro_dns_aaaa.lng index 3d634780f1..03f18f18da 100644 --- a/interface/web/dns/lib/lang/ro_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ro_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_cname.lng b/interface/web/dns/lib/lang/ro_dns_cname.lng index a37533fbdc..f023134100 100644 --- a/interface/web/dns/lib/lang/ro_dns_cname.lng +++ b/interface/web/dns/lib/lang/ro_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Rubrica hostname necompletata'; $wb['name_error_regex'] = 'Hostname cu format gresit'; $wb['data_error_empty'] = 'Hostname tinta necompletat'; $wb['data_error_regex'] = 'Hostname tinta cu format gresit'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_dname.lng b/interface/web/dns/lib/lang/ro_dns_dname.lng new file mode 100644 index 0000000000..c76d2587a1 --- /dev/null +++ b/interface/web/dns/lib/lang/ro_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/ru_dns_a.lng b/interface/web/dns/lib/lang/ru_dns_a.lng index 0af3014657..2a55aa4d64 100644 --- a/interface/web/dns/lib/lang/ru_dns_a.lng +++ b/interface/web/dns/lib/lang/ru_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'IP-адрес пустой'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; -$wb['data_error_duplicate'] = 'Дубликат записи'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_aaaa.lng b/interface/web/dns/lib/lang/ru_dns_aaaa.lng index e8a02443d3..a1b63edf53 100644 --- a/interface/web/dns/lib/lang/ru_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ru_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'У Вас нет прав добавлять эту за $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Неправильный формат имени хоста.'; $wb['data_error_empty'] = 'Пустой IP-адрес'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_cname.lng b/interface/web/dns/lib/lang/ru_dns_cname.lng index e7a0abcf3f..cb20700fe6 100644 --- a/interface/web/dns/lib/lang/ru_dns_cname.lng +++ b/interface/web/dns/lib/lang/ru_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'Целевое имя узла пустое'; $wb['data_error_regex'] = 'Целевое имя узла имеет неправильный формат'; -$wb['data_error_duplicate'] = 'Дубликат записи'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_dname.lng b/interface/web/dns/lib/lang/ru_dns_dname.lng new file mode 100644 index 0000000000..8fbddd6799 --- /dev/null +++ b/interface/web/dns/lib/lang/ru_dns_dname.lng @@ -0,0 +1,17 @@ +TTL 60 секунд.'; +?> diff --git a/interface/web/dns/lib/lang/se_dns_a.lng b/interface/web/dns/lib/lang/se_dns_a.lng index 68e40da5e7..c191ff19d3 100644 --- a/interface/web/dns/lib/lang/se_dns_a.lng +++ b/interface/web/dns/lib/lang/se_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_aaaa.lng b/interface/web/dns/lib/lang/se_dns_aaaa.lng index 3d634780f1..03f18f18da 100644 --- a/interface/web/dns/lib/lang/se_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/se_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_cname.lng b/interface/web/dns/lib/lang/se_dns_cname.lng index b7ceb5d9c9..6530e927f6 100644 --- a/interface/web/dns/lib/lang/se_dns_cname.lng +++ b/interface/web/dns/lib/lang/se_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_dname.lng b/interface/web/dns/lib/lang/se_dns_dname.lng new file mode 100644 index 0000000000..0d42cac595 --- /dev/null +++ b/interface/web/dns/lib/lang/se_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/sk_dns_a.lng b/interface/web/dns/lib/lang/sk_dns_a.lng index d1fff2cdea..3f048c2857 100644 --- a/interface/web/dns/lib/lang/sk_dns_a.lng +++ b/interface/web/dns/lib/lang/sk_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP Adresa je prázdna'; $wb['ip_error_wrong'] = 'IP Adresa má zlý formát.'; -$wb['data_error_duplicate'] = 'Duplikátny A-záznam'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_aaaa.lng b/interface/web/dns/lib/lang/sk_dns_aaaa.lng index 246ac1dd23..f719fe6bc2 100644 --- a/interface/web/dns/lib/lang/sk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/sk_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnenie Pridať záznam do tejto zóny DNS.'; $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP-Adresa prázdna'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP-Adresa má zlý formát'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_cname.lng b/interface/web/dns/lib/lang/sk_dns_cname.lng index 1f415fac3b..a6a8685c8f 100644 --- a/interface/web/dns/lib/lang/sk_dns_cname.lng +++ b/interface/web/dns/lib/lang/sk_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'Cieľový hostname je prázdny'; $wb['data_error_regex'] = 'Target hostname má zlý format'; -$wb['data_error_duplicate'] = 'Duplicate A-Record or CNAME-Record'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_dname.lng b/interface/web/dns/lib/lang/sk_dns_dname.lng new file mode 100644 index 0000000000..c155285234 --- /dev/null +++ b/interface/web/dns/lib/lang/sk_dns_dname.lng @@ -0,0 +1,17 @@ + diff --git a/interface/web/dns/lib/lang/tr_dns_a.lng b/interface/web/dns/lib/lang/tr_dns_a.lng index 905ff04744..34eba9c0b5 100644 --- a/interface/web/dns/lib/lang/tr_dns_a.lng +++ b/interface/web/dns/lib/lang/tr_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adı biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; -$wb['data_error_duplicate'] = 'Bu A DNS kaydı zaten var'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; $wb['ip_error_wrong'] = 'IP adresi biçimi geçersiz'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_aaaa.lng b/interface/web/dns/lib/lang/tr_dns_aaaa.lng index d75ff802bb..80a4c64d51 100644 --- a/interface/web/dns/lib/lang/tr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/tr_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adının biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; -$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; $wb['ip_error_wrong'] = 'IP adresinin biçimi geçersiz'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_cname.lng b/interface/web/dns/lib/lang/tr_dns_cname.lng index fa9a497e12..008e4962eb 100644 --- a/interface/web/dns/lib/lang/tr_dns_cname.lng +++ b/interface/web/dns/lib/lang/tr_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adı biçimi geçersiz.'; $wb['data_error_empty'] = 'Hedef sunucu adı boş olamaz'; $wb['data_error_regex'] = 'Hedef sunucu adı biçimi geçersiz'; -$wb['data_error_duplicate'] = 'Çift A ya da CNAME kaydı var.'; +$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_dname.lng b/interface/web/dns/lib/lang/tr_dns_dname.lng new file mode 100644 index 0000000000..cc8ce3005c --- /dev/null +++ b/interface/web/dns/lib/lang/tr_dns_dname.lng @@ -0,0 +1,17 @@ + -- GitLab From 59f88481a0686f1c4b0299edc795dc48baa0ecbb Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 15:08:43 +0200 Subject: [PATCH 0219/1368] Add DNAME record (#1848) --- .../sql/incremental/upd_dev_collection.sql | 4 +- install/sql/ispconfig3.sql | 2 +- interface/lib/classes/remote.d/dns.inc.php | 22 +++ interface/web/dns/dns_a_edit.php | 2 +- interface/web/dns/dns_aaaa_edit.php | 2 +- interface/web/dns/dns_cname_edit.php | 2 +- interface/web/dns/dns_dname_edit.php | 60 ++++++ interface/web/dns/form/dns_dname.tform.php | 178 ++++++++++++++++++ interface/web/dns/lib/remote.conf.php | 1 + interface/web/dns/list/dns_a.list.php | 2 +- interface/web/dns/templates/dns_a_list.htm | 1 + .../web/dns/templates/dns_dname_edit.htm | 25 +++ server/conf/bind_pri.domain.master | 3 + 13 files changed, 297 insertions(+), 7 deletions(-) create mode 100644 interface/web/dns/dns_dname_edit.php create mode 100644 interface/web/dns/form/dns_dname.tform.php create mode 100644 interface/web/dns/templates/dns_dname_edit.htm diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 519dda220f..8e924a62b0 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -33,5 +33,5 @@ ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET ut -- add disableindexer-worker for solr search ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disablequota-status`; --- add SSHFP record -ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME', 'CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; +-- add SSHFP and DNAME record +ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index ef76a370d4..c54f0ac345 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -488,7 +488,7 @@ CREATE TABLE `dns_rr` ( `server_id` int(11) NOT NULL default '1', `zone` int(11) unsigned NOT NULL DEFAULT '0', `name` varchar(255) NOT NULL DEFAULT '', - `type` enum('A','AAAA','ALIAS','CNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') default NULL, + `type` enum('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') default NULL, `data` TEXT NOT NULL, `aux` int(11) unsigned NOT NULL default '0', `ttl` int(11) unsigned NOT NULL default '3600', diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 817953a5c7..4bf6906147 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -472,6 +472,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_cname_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'DNAME'); + } + + //* Add a record + public function dns_dname_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'DNAME'); + } + + //* Update a record + public function dns_dname_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'DNAME'); + } + + //* Delete a record + public function dns_dname_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'DNAME'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_hinfo_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'HINFO'); diff --git a/interface/web/dns/dns_a_edit.php b/interface/web/dns/dns_a_edit.php index 595ebcc92c..19cb7d1c01 100644 --- a/interface/web/dns/dns_a_edit.php +++ b/interface/web/dns/dns_a_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/dns_aaaa_edit.php b/interface/web/dns/dns_aaaa_edit.php index 780fbcc80e..7d6972854f 100644 --- a/interface/web/dns/dns_aaaa_edit.php +++ b/interface/web/dns/dns_aaaa_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'AAAA' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'AAAA' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/dns_cname_edit.php b/interface/web/dns/dns_cname_edit.php index 1f17169e60..4013b72ea8 100644 --- a/interface/web/dns/dns_cname_edit.php +++ b/interface/web/dns/dns_cname_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/dns_dname_edit.php b/interface/web/dns/dns_dname_edit.php new file mode 100644 index 0000000000..c33c0cce71 --- /dev/null +++ b/interface/web/dns/dns_dname_edit.php @@ -0,0 +1,60 @@ +db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + if($tmp['number'] > 0) return true; + return false; + } +} + +$page = new page_action; +$page->onLoad(); + +?> diff --git a/interface/web/dns/form/dns_dname.tform.php b/interface/web/dns/form/dns_dname.tform.php new file mode 100644 index 0000000000..c78f2dcae0 --- /dev/null +++ b/interface/web/dns/form/dns_dname.tform.php @@ -0,0 +1,178 @@ + 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['dns'] = array ( + 'title' => "DNS DNAME", + 'width' => 100, + 'template' => "templates/dns_dname_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'zone' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => @$app->functions->intval($_REQUEST["zone"]), + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'name' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( 0 => array( 'event' => 'SAVE', + 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', + 'type' => 'IDNTOUTF8'), + 2 => array( 'event' => 'SAVE', + 'type' => 'TOLOWER') + ), + 'validators' => array ( 0 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\*\_]{0,255}$/', + 'errmsg'=> 'name_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'type' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => 'DNAME', + 'value' => '', + 'width' => '5', + 'maxlength' => '5' + ), + 'data' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( 0 => array( 'event' => 'SAVE', + 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', + 'type' => 'IDNTOUTF8'), + 2 => array( 'event' => 'SAVE', + 'type' => 'TOLOWER') + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'data_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-zA-Z0-9\.\-\_]{1,255}$/', + 'errmsg'=> 'data_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + /* + 'aux' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '0', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + */ + 'ttl' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'validators' => array ( 0 => array ( 'type' => 'RANGE', + 'range' => '60:', + 'errmsg'=> 'ttl_range_error'), + ), + 'default' => '3600', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'Y', + 'value' => array(0 => 'N', 1 => 'Y') + ), + 'stamp' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255' + ), + 'serial' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '', + 'value' => '', + 'width' => '10', + 'maxlength' => '10' + ), + //################################# + // END Datatable fields + //################################# + ) +); + + + +?> diff --git a/interface/web/dns/lib/remote.conf.php b/interface/web/dns/lib/remote.conf.php index c87296a8c9..fb52f8973e 100644 --- a/interface/web/dns/lib/remote.conf.php +++ b/interface/web/dns/lib/remote.conf.php @@ -6,6 +6,7 @@ $function_list['dns_aaaa_get,dns_aaaa_add,dns_aaaa_update,dns_aaaa_delete'] = 'D $function_list['dns_alias_get,dns_alias_add,dns_alias_update,dns_alias_delete'] = 'DNS alias functions'; $function_list['dns_caa_get,dns_caa_add,dns_caa_update,dns_caa_delete'] = 'DNS caa functions'; $function_list['dns_cname_get,dns_cname_add,dns_cname_update,dns_cname_delete'] = 'DNS cname functions'; +$function_list['dns_dname_get,dns_dname_add,dns_dname_update,dns_dname_delete'] = 'DNS dname functions'; $function_list['dns_ds_get,dns_ds_add,dns_ds_update,dns_ds_delete'] = 'DNS ds functions'; $function_list['dns_hinfo_get,dns_hinfo_add,dns_hinfo_update,dns_hinfo_delete'] = 'DNS hinfo functions'; $function_list['dns_loc_get,dns_loc_add,dns_loc_update,dns_loc_delete'] = 'DNS loc functions'; diff --git a/interface/web/dns/list/dns_a.list.php b/interface/web/dns/list/dns_a.list.php index 007f76dfb3..169ec4af06 100644 --- a/interface/web/dns/list/dns_a.list.php +++ b/interface/web/dns/list/dns_a.list.php @@ -132,7 +132,7 @@ $liste["item"][] = array( 'field' => "type", 'prefix' => "", 'suffix' => "", 'width' => "", - 'value' => array('A'=>'A', 'AAAA' => 'AAAA', 'ALIAS'=>'ALIAS', 'CAA'=>'CAA', 'CNAME'=>'CNAME', 'DS'=>'DS', 'HINFO'=>'HINFO', 'LOC'=>'LOC', 'MX'=>'MX', 'NAPTR'=>'NAPTR', 'NS'=>'NS', 'PTR'=>'PTR', 'RP'=>'RP', 'SRV'=>'SRV', 'SSHFP'=>'SSHFP', 'TLSA'=>'TLSA', 'TXT'=>'TXT')); + 'value' => array('A'=>'A', 'AAAA' => 'AAAA', 'ALIAS'=>'ALIAS', 'CAA'=>'CAA', 'CNAME'=>'CNAME', 'DNAME'=>'DNAME', 'DS'=>'DS', 'HINFO'=>'HINFO', 'LOC'=>'LOC', 'MX'=>'MX', 'NAPTR'=>'NAPTR', 'NS'=>'NS', 'PTR'=>'PTR', 'RP'=>'RP', 'SRV'=>'SRV', 'SSHFP'=>'SSHFP', 'TLSA'=>'TLSA', 'TXT'=>'TXT')); ?> diff --git a/interface/web/dns/templates/dns_a_list.htm b/interface/web/dns/templates/dns_a_list.htm index 46fb103b7d..da8a8aaf06 100644 --- a/interface/web/dns/templates/dns_a_list.htm +++ b/interface/web/dns/templates/dns_a_list.htm @@ -22,6 +22,7 @@ + diff --git a/interface/web/dns/templates/dns_dname_edit.htm b/interface/web/dns/templates/dns_dname_edit.htm new file mode 100644 index 0000000000..32a1a396dd --- /dev/null +++ b/interface/web/dns/templates/dns_dname_edit.htm @@ -0,0 +1,25 @@ +
+ +
+
+ +
+
+ +
+
+ +
+ {tmpl_var name='active'} +
+
+ + + + + + +
+ + +
diff --git a/server/conf/bind_pri.domain.master b/server/conf/bind_pri.domain.master index 9635e445f7..e5af0ca311 100644 --- a/server/conf/bind_pri.domain.master +++ b/server/conf/bind_pri.domain.master @@ -26,6 +26,9 @@ $TTL {tmpl_var name='ttl'} {tmpl_var name='name'} {tmpl_var name='ttl'} CNAME {tmpl_var name='data'} + +{tmpl_var name='name'} {tmpl_var name='ttl'} DNAME {tmpl_var name='data'} + {tmpl_var name='name'} {tmpl_var name='ttl'} DS {tmpl_var name='data'} -- GitLab From 6f7cff40f73ff9c59b78ca6a6ea3a0f98d674b3e Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 17:08:25 +0200 Subject: [PATCH 0220/1368] Add get template function (#3635) --- interface/lib/classes/remote.d/dns.inc.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 4bf6906147..9b5e6b74ad 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -736,6 +736,24 @@ class remoting_dns extends remoting { + //* Get All DNS Zones Templates by etruel + public function dns_templatezone_get_all($session_id) { + global $app, $conf; + if(!$this->checkPerm($session_id, 'dns_templatezone_add')) { + $this->server->fault('permission_denied', 'You do not have the permissions to access this function.'); + return false; + } + $sql ="SELECT * FROM dns_template"; + $result = $app->db->queryAllRecords($sql); + if(isset($result)) { + return $result; + } + else { + this->server->fault('template_id_error', 'There is no DNS templates.'); + return false; + } + } + /** * Get all dns records for a zone * @param int session id -- GitLab From 52034380b7374d0972c0323444c74ad25de3d9fe Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 20:12:14 +0200 Subject: [PATCH 0221/1368] Fix column amount (#5637) --- interface/web/dns/templates/dns_slave_list.htm | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/interface/web/dns/templates/dns_slave_list.htm b/interface/web/dns/templates/dns_slave_list.htm index 799f14ba28..e59470a191 100644 --- a/interface/web/dns/templates/dns_slave_list.htm +++ b/interface/web/dns/templates/dns_slave_list.htm @@ -21,12 +21,12 @@

{tmpl_var name="toolsarea_head_txt"}

- + - - - + + +

@@ -62,16 +62,14 @@ - + - +
{tmpl_var name='globalsearch_noresults_text_txt'}{tmpl_var name='globalsearch_noresults_text_txt'}
- - \ No newline at end of file -- GitLab From 269542cada42933dc374a6ee1baa175bf7d5abf2 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 21:46:21 +0200 Subject: [PATCH 0222/1368] Fix records page width (#5580) --- .../web/themes/default/assets/stylesheets/ispconfig.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index fb1c8e8d18..534d2390f8 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -1,5 +1,6 @@ body { - overflow-y: scroll; } + overflow-y: scroll; + overflow-x: hidden; } .left { float: left; } @@ -421,7 +422,7 @@ ul.gs-resultbox li.gs-cheader p.gs-cheader-limit { ul.df-resultbox li.df-cdata img, ul.gs-resultbox li.gs-cdata img { margin-right: 12px; } - + ul.df-resultbox li.df-cdata p span.df-cdata-title, ul.gs-resultbox li.gs-cdata p span.gs-cdata-title { font-weight: bold; } @@ -798,4 +799,3 @@ span.notification_text { #apache_directives, #nginx_directives, #proxy_directives { font-family: Consolas, "Courier New", Courier, monospace; } - -- GitLab From 2e51c20a32cece66061ac3eaa060593b485a332e Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 14 Jun 2020 22:21:23 +0200 Subject: [PATCH 0223/1368] Fix checkbox (#4592) --- interface/web/dns/templates/dns_dmarc_edit.htm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/interface/web/dns/templates/dns_dmarc_edit.htm b/interface/web/dns/templates/dns_dmarc_edit.htm index 668b29f8df..4e966d36ed 100644 --- a/interface/web/dns/templates/dns_dmarc_edit.htm +++ b/interface/web/dns/templates/dns_dmarc_edit.htm @@ -129,7 +129,7 @@ - +
@@ -140,7 +140,7 @@
- {tmpl_var name='active'} +
@@ -149,9 +149,8 @@
- +
- -- GitLab From a193d8ea8f047322606608499d8b06f90cc18516 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 00:05:23 +0200 Subject: [PATCH 0224/1368] Add read only serial (#2732) --- interface/web/dns/templates/dns_soa_edit.htm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/interface/web/dns/templates/dns_soa_edit.htm b/interface/web/dns/templates/dns_soa_edit.htm index ce8154c857..c34e8a3416 100644 --- a/interface/web/dns/templates/dns_soa_edit.htm +++ b/interface/web/dns/templates/dns_soa_edit.htm @@ -119,29 +119,33 @@
+
+ +
+
{tmpl_var name='active'}
- +
{tmpl_var name='dnssec_wanted'}
({tmpl_var name='dnssec_wanted_info'}) -
+
-
+ - +
-- GitLab From 32795453d002b4bf20f1d8a60f8702dc3525bd29 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 13:05:11 +0200 Subject: [PATCH 0225/1368] Add empty option for domain module (#4305) --- interface/web/dns/dns_slave_edit.php | 2 +- interface/web/dns/dns_soa_edit.php | 2 +- interface/web/dns/dns_wizard.php | 2 +- .../web/mail/mail_domain_catchall_edit.php | 2 +- interface/web/mail/mail_domain_edit.php | 2 +- interface/web/mail/mail_mailinglist_edit.php | 2 +- interface/web/mail/xmpp_domain_edit.php | 2 +- interface/web/sites/web_childdomain_edit.php | 2 +- interface/web/sites/web_vhost_domain_edit.php | 92 +++++++++---------- 9 files changed, 54 insertions(+), 54 deletions(-) diff --git a/interface/web/dns/dns_slave_edit.php b/interface/web/dns/dns_slave_edit.php index 117b101b87..020a044593 100644 --- a/interface/web/dns/dns_slave_edit.php +++ b/interface/web/dns/dns_slave_edit.php @@ -124,7 +124,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("dns_slave", $this->dataRecord["origin"]); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { diff --git a/interface/web/dns/dns_soa_edit.php b/interface/web/dns/dns_soa_edit.php index 9b36daee15..ec5ba67c79 100644 --- a/interface/web/dns/dns_soa_edit.php +++ b/interface/web/dns/dns_soa_edit.php @@ -192,7 +192,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("dns_soa", $this->dataRecord["origin"]); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php index 17d767550c..a02ee0a80f 100644 --- a/interface/web/dns/dns_wizard.php +++ b/interface/web/dns/dns_wizard.php @@ -197,7 +197,7 @@ if ($domains_settings['use_domain_module'] == 'y') { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("dns_soa", 'domain'); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { diff --git a/interface/web/mail/mail_domain_catchall_edit.php b/interface/web/mail/mail_domain_catchall_edit.php index 4ef18d45e7..1f37164224 100644 --- a/interface/web/mail/mail_domain_catchall_edit.php +++ b/interface/web/mail/mail_domain_catchall_edit.php @@ -77,7 +77,7 @@ class page_action extends tform_actions { // Getting Domains of the user $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r'); $domains = $app->db->queryAllRecords($sql); - $domain_select = ''; + $domain_select = ""; if(is_array($domains)) { foreach( $domains as $domain) { $domain['domain'] = $app->functions->idn_decode($domain['domain']); diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 28d4f40917..51d55ef2de 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -159,7 +159,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("mail_domain", $this->dataRecord["domain"]); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { diff --git a/interface/web/mail/mail_mailinglist_edit.php b/interface/web/mail/mail_mailinglist_edit.php index 57d9c77f2e..913611323d 100644 --- a/interface/web/mail/mail_mailinglist_edit.php +++ b/interface/web/mail/mail_mailinglist_edit.php @@ -112,7 +112,7 @@ class page_action extends tform_actions { // Getting Domains of the user $sql = "SELECT domain FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; $domains = $app->db->queryAllRecords($sql); - $domain_select = ''; + $domain_select = ""; if(is_array($domains)) { foreach( $domains as $domain) { $selected = ($domain["domain"] == $this->dataRecord["domain"])?'SELECTED':''; diff --git a/interface/web/mail/xmpp_domain_edit.php b/interface/web/mail/xmpp_domain_edit.php index a89d27c452..500757c159 100644 --- a/interface/web/mail/xmpp_domain_edit.php +++ b/interface/web/mail/xmpp_domain_edit.php @@ -182,7 +182,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains("xmpp_domain", $this->dataRecord["domain"]); - $domain_select = ''; + $domain_select = ""; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ foreach( $domains as $domain) { diff --git a/interface/web/sites/web_childdomain_edit.php b/interface/web/sites/web_childdomain_edit.php index 2da58a4661..019057b3be 100644 --- a/interface/web/sites/web_childdomain_edit.php +++ b/interface/web/sites/web_childdomain_edit.php @@ -106,7 +106,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains($this->_vhostdomain_type == 'subdomain' ? null : "web_domain"); - $domain_select = ''; + $domain_select = ""; $selected_domain = ''; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 81415f194a..82da18ae1e 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -79,7 +79,7 @@ class page_action extends tform_actions { $_SESSION['s']['var']['vhostdomain_type'] = $show_type; $this->_vhostdomain_type = $show_type; - + parent::onLoad(); } @@ -143,7 +143,7 @@ class page_action extends tform_actions { $read_limits = array('limit_cgi', 'limit_ssi', 'limit_perl', 'limit_ruby', 'limit_python', 'force_suexec', 'limit_hterror', 'limit_wildcard', 'limit_ssl', 'limit_ssl_letsencrypt', 'limit_directive_snippets'); if($this->_vhostdomain_type != 'domain') $parent_domain = $app->db->queryOneRecord("select * FROM web_domain WHERE domain_id = ?", @$this->dataRecord["parent_domain_id"]); - + $is_admin = false; //* Client: If the logged in user is not admin and has no sub clients (no reseller) @@ -164,7 +164,7 @@ class page_action extends tform_actions { $client['web_servers_ids'][] = $this->dataRecord['server_id']; $client['web_servers_ids'] = array_unique($client['web_servers_ids']); } - + $only_one_server = count($client['web_servers_ids']) === 1; $app->tpl->setVar('only_one_server', $only_one_server); @@ -195,7 +195,7 @@ class page_action extends tform_actions { } else { $server_id = (isset($web_servers[0])) ? intval($web_servers[0]['server_id']) : 0; } - + if($app->functions->intval($this->dataRecord["server_id"]) > 0) { // check if server is in client's servers or add it. $chk_sid = explode(',', $client['web_servers']); @@ -204,7 +204,7 @@ class page_action extends tform_actions { $client['web_servers'] .= $app->functions->intval($this->dataRecord["server_id"]); } } - + //* Fill the IPv4 select field with the IP addresses that are allowed for this client on the current server $sql = "SELECT ip_address FROM server_ip WHERE server_id = ? AND ip_type = 'IPv4' AND virtualhost = 'y' AND (client_id = 0 OR client_id=".$_SESSION['s']['user']['client_id'].")"; $ips = $app->db->queryAllRecords($sql, $server_id); @@ -312,7 +312,7 @@ class page_action extends tform_actions { $app->tpl->setVar("server_id", $options_web_servers); unset($options_web_servers); - + if($this->id > 0) { if(!isset($this->dataRecord["server_id"])){ $tmp = $app->db->queryOneRecord("SELECT server_id FROM web_domain WHERE domain_id = ?", $this->id); @@ -352,7 +352,7 @@ class page_action extends tform_actions { $client['web_servers'] .= $app->functions->intval($this->dataRecord["server_id"]); } } - + //* Fill the IPv4 select field with the IP addresses that are allowed for this client $sql = "SELECT ip_address FROM server_ip WHERE server_id = ? AND ip_type = 'IPv4' AND virtualhost = 'y' AND (client_id = 0 OR client_id=?)"; $ips = $app->db->queryAllRecords($sql, $server_id, $_SESSION['s']['user']['client_id']); @@ -438,7 +438,7 @@ class page_action extends tform_actions { } $php_directive_snippets_txt .= '

'; } - + $php_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'php' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($php_directive_snippets) && !empty($php_directive_snippets)){ $php_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -461,7 +461,7 @@ class page_action extends tform_actions { } $apache_directive_snippets_txt .= '

'; } - + $apache_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'apache' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($apache_directive_snippets) && !empty($apache_directive_snippets)){ $apache_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -485,7 +485,7 @@ class page_action extends tform_actions { } $nginx_directive_snippets_txt .= '

'; } - + $nginx_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'nginx' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($nginx_directive_snippets) && !empty($nginx_directive_snippets)){ $nginx_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -508,7 +508,7 @@ class page_action extends tform_actions { } $proxy_directive_snippets_txt .= '

'; } - + $proxy_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'proxy' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($proxy_directive_snippets) && !empty($proxy_directive_snippets)){ $proxy_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -523,7 +523,7 @@ class page_action extends tform_actions { //* Admin: If the logged in user is admin } else { - + $is_admin = true; if($this->_vhostdomain_type == 'domain') { @@ -657,7 +657,7 @@ class page_action extends tform_actions { } $php_directive_snippets_txt .= '

'; } - + $php_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'php' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($php_directive_snippets) && !empty($php_directive_snippets)){ $php_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -680,7 +680,7 @@ class page_action extends tform_actions { } $apache_directive_snippets_txt .= '

'; } - + $apache_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'apache' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($apache_directive_snippets) && !empty($apache_directive_snippets)){ $apache_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -704,7 +704,7 @@ class page_action extends tform_actions { } $nginx_directive_snippets_txt .= '

'; } - + $nginx_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'nginx' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($nginx_directive_snippets) && !empty($nginx_directive_snippets)){ $nginx_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -727,7 +727,7 @@ class page_action extends tform_actions { } $proxy_directive_snippets_txt .= '

'; } - + $proxy_directive_snippets = $app->db->queryAllRecords("SELECT * FROM directive_snippets WHERE type = 'proxy' AND active = 'y' AND master_directive_snippets_id = 0 ORDER BY name"); if(is_array($proxy_directive_snippets) && !empty($proxy_directive_snippets)){ $proxy_directive_snippets_txt .= $app->tform->wordbook["select_directive_snippet_txt"].'
'; @@ -789,7 +789,7 @@ class page_action extends tform_actions { * The domain-module is in use. */ $domains = $app->tools_sites->getDomainModuleDomains($this->_vhostdomain_type == 'subdomain' ? null : "web_domain"); - $domain_select = ''; + $domain_select = ""; $selected_domain = ''; if(is_array($domains) && sizeof($domains) > 0) { /* We have domains in the list, so create the drop-down-list */ @@ -815,16 +815,16 @@ class page_action extends tform_actions { $domain_select .= "\r\n"; } $app->tpl->setVar("domain_option", $domain_select); - + // remove the parent domain part of the domain name before we show it in the text field. if($this->dataRecord["type"] == 'vhostsubdomain') $this->dataRecord["domain"] = str_replace('.'.$selected_domain, '', $this->dataRecord["domain"]); - + } else { // remove the parent domain part of the domain name before we show it in the text field. if($this->dataRecord["type"] == 'vhostsubdomain') $this->dataRecord["domain"] = str_replace('.'.$parent_domain["domain"], '', $this->dataRecord["domain"]); } - + if($this->_vhostdomain_type != 'domain') $app->tpl->setVar("domain", $this->dataRecord["domain"], true); // check for configuration errors in sys_datalog @@ -837,13 +837,13 @@ class page_action extends tform_actions { } } } - + $app->tpl->setVar('vhostdomain_type', $this->_vhostdomain_type, true); $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'] === 'y')); $app->tpl->setVar("is_admin", $is_admin); - + if($this->id > 0) { $tmp_web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", intval($this->id)); $tmp_sys_group = $app->db->queryOneRecord("SELECT * FROM sys_group WHERE groupid = ?", intval($tmp_web['sys_groupid'])); @@ -856,11 +856,11 @@ class page_action extends tform_actions { if($sys_config['use_combobox'] == 'y') { $app->tpl->setVar('use_combobox', 'y'); } - + $directive_snippets_id_select = ''; $server_type = $app->getconf->get_server_config($server_id, 'web'); $server_type = $server_type['server_type']; - + $m_directive_snippets = $app->db->queryAllRecords("SELECT directive_snippets_id, name FROM directive_snippets WHERE customer_viewable = 'y' AND active = 'y' AND master_directive_snippets_id > 0 AND type = ? ORDER BY name ASC", $server_type); if(is_array($m_directive_snippets) && !empty($m_directive_snippets)){ $directive_snippets_id_select .= ''; @@ -883,7 +883,7 @@ class page_action extends tform_actions { $directive_snippets_id_select .= ''; } $app->tpl->setVar("directive_snippets_id", $directive_snippets_id_select); - + // folder_directive_snippets if(isset($_POST['folder_directive_snippets']) && !isset($this->dataRecord['folder_directive_snippets'])){ $this->dataRecord['folder_directive_snippets'] = ''; @@ -894,10 +894,10 @@ class page_action extends tform_actions { } $this->dataRecord['folder_directive_snippets'] = trim($this->dataRecord['folder_directive_snippets']); } - + $master_directive_snippets = $app->db->queryAllRecords("SELECT directive_snippets_id, name FROM directive_snippets WHERE customer_viewable = 'y' AND active = 'y' AND snippet LIKE '%{FOLDER}%' AND master_directive_snippets_id > 0 AND type = ? ORDER BY name ASC", $server_type); $c_directive_snippets = $app->db->queryAllRecords("SELECT directive_snippets_id, name FROM directive_snippets WHERE customer_viewable = 'y' AND active = 'y' AND snippet LIKE '%{FOLDER}%' AND master_directive_snippets_id = 0 AND type = ? ORDER BY name ASC", $server_type); - + $folder_directive_snippets = array(); $this->dataRecord['folder_directive_snippets'] = str_replace("\r\n", "\n", $this->dataRecord['folder_directive_snippets']); $this->dataRecord['folder_directive_snippets'] = str_replace("\r", "\n", $this->dataRecord['folder_directive_snippets']); @@ -920,7 +920,7 @@ class page_action extends tform_actions { } $folder_directive_snippets[$i]['folder_directive_snippets_id'] .= ''; } - + if(is_array($c_directive_snippets) && !empty($c_directive_snippets)){ $folder_directive_snippets[$i]['folder_directive_snippets_id'] .= ''; foreach($c_directive_snippets as $c_directive_snippet){ @@ -938,7 +938,7 @@ class page_action extends tform_actions { } $folder_directive_snippets[$i]['folder_directive_snippets_id'] .= ''; } - + if(is_array($c_directive_snippets) && !empty($c_directive_snippets)){ $folder_directive_snippets[$i]['folder_directive_snippets_id'] .= ''; foreach($c_directive_snippets as $c_directive_snippet){ @@ -1007,7 +1007,7 @@ class page_action extends tform_actions { $app->tform->errorMessage .= $app->tform->lng("subdomain_error_empty")."
"; } } - + /* check if the domain module is used - and check if the selected domain can be used! */ $app->uses('ini_parser,getconf'); $settings = $app->getconf->get_global_config('domains'); @@ -1073,13 +1073,13 @@ class page_action extends tform_actions { } else { $old_web_values = array(); } - + if($this->_vhostdomain_type == 'domain') { //* ensure that quota value is not 0 when vhost type = domain if(isset($_POST["hd_quota"]) && $_POST["hd_quota"] == 0) { $app->tform->errorMessage .= $app->tform->lng("limit_web_quota_not_0_txt")."
"; } - + //* Check the website quota of the client if(isset($_POST["hd_quota"]) && $client["limit_web_quota"] >= 0 && $_POST["hd_quota"] != $old_web_values["hd_quota"]) { $tmp = $app->db->queryOneRecord("SELECT sum(hd_quota) as webquota FROM web_domain WHERE domain_id != ? AND type = 'vhost' AND ".$app->tform->getAuthSQL('u'), $this->id); @@ -1174,7 +1174,7 @@ class page_action extends tform_actions { if($this->dataRecord['ssl'] == 'n') $this->dataRecord['ssl'] = $tmp['ssl']; if($this->dataRecord['ssl_letsencrypt'] == 'n') $this->dataRecord['ssl_letsencrypt'] = $tmp['ssl_letsencrypt']; if($this->dataRecord['directive_snippets_id'] == 0) $this->dataRecord['directive_snippets_id'] = $tmp['directive_snippets_id']; - + unset($tmp); // When the record is inserted } else { @@ -1296,7 +1296,7 @@ class page_action extends tform_actions { $app->tform->errorMessage .= $app->tform->lng("invalid_rewrite_rules_txt").'
'; } } - + // check custom php.ini settings if(isset($this->dataRecord['custom_php_ini']) && trim($this->dataRecord['custom_php_ini']) != '') { $custom_php_ini_settings = trim($this->dataRecord['custom_php_ini']); @@ -1330,7 +1330,7 @@ class page_action extends tform_actions { unset($app->tform->formDef["tabs"]['ssl']['fields']['enable_spdy']); } // if($this->dataRecord["directive_snippets_id"] < 1) $this->dataRecord["enable_pagespeed"] = 'n'; - + //print_r($_POST['folder_directive_snippets']); //print_r($_POST['folder_directive_snippets_id']); if(isset($_POST['folder_directive_snippets'])){ @@ -1354,7 +1354,7 @@ class page_action extends tform_actions { } $this->dataRecord['folder_directive_snippets'] = trim($this->dataRecord['folder_directive_snippets']); } - + // Check custom PHP version if(isset($this->dataRecord['fastcgi_php_version']) && $this->dataRecord['fastcgi_php_version'] != '') { // Check php-fpm mode @@ -1380,15 +1380,15 @@ class page_action extends tform_actions { $this->dataRecord['fastcgi_php_version'] = ''; } } - + $this->validateDefaultFastcgiPhpVersion(); - + parent::onSubmit(); } - + function onBeforeInsert() { global $app, $conf; - + // Letsencrypt can not be activated before the website has been created // So we deactivate it here and add a datalog update in onAfterInsert if(isset($this->dataRecord['ssl_letsencrypt']) && $this->dataRecord['ssl_letsencrypt'] == 'y' && isset($this->dataRecord['ssl']) && $this->dataRecord['ssl'] == 'y') { @@ -1401,7 +1401,7 @@ class page_action extends tform_actions { $this->_letsencrypt_on_insert = true; } } - + function onAfterInsert() { global $app, $conf; @@ -1421,7 +1421,7 @@ class page_action extends tform_actions { $app->uses("getconf"); $web_rec = $app->tform->getDataRecord($this->id); $web_config = $app->getconf->get_server_config($app->functions->intval($web_rec["server_id"]), 'web'); - + // get global log retention value as default for web log retention $server_config = $app->getconf->get_server_config($app->functions->intval($web_rec["server_id"]), 'server'); if($server_config['log_retention'] > 0) { @@ -1495,7 +1495,7 @@ class page_action extends tform_actions { $new_data_record['ssl'] = 'y'; $app->db->datalogUpdate('web_domain', $new_data_record, 'domain_id', $this->id); } - + } function onBeforeUpdate () { @@ -1547,13 +1547,13 @@ class page_action extends tform_actions { } } - + function onAfterUpdate() { global $app, $conf; if(isset($this->dataRecord['folder_directive_snippets'])) $app->db->query("UPDATE web_domain SET folder_directive_snippets = ? WHERE domain_id = ?", $this->dataRecord['folder_directive_snippets'], $this->id); } - + function validateDefaultFastcgiPhpVersion() { global $app; @@ -1575,7 +1575,7 @@ class page_action extends tform_actions { $app->tform->errorMessage .= sprintf('%s
', $app->tform->lng('fastcgi_php_version_invalid_txt')); return; } - + // If the default PHP version is now hidden but this vhost was using it, we don't want to implicitly // switch the user to some random Additional PHP version. So we show a warning instead. $old_fastcgi_php_version = null; -- GitLab From 9f1e3e1f980bfcf3e39d31d52e01a21ab66aaab8 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 13:47:38 +0200 Subject: [PATCH 0226/1368] Translated invalid --- interface/web/sites/lib/lang/nl_web_domain.lng | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/sites/lib/lang/nl_web_domain.lng b/interface/web/sites/lib/lang/nl_web_domain.lng index 8b4f6ff855..aa57c6e012 100644 --- a/interface/web/sites/lib/lang/nl_web_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_domain.lng @@ -89,8 +89,8 @@ $wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children must be a positive $wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers must be a positive integer value.'; $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be a positive integer value.'; $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; -$wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; -$wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; +$wb['hd_quota_error_regex'] = 'Harddisk quota is ongeldig.'; +$wb['traffic_quota_error_regex'] = 'Traffic quota is ongeldig.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; $wb['fastcgi_php_version_txt'] = 'PHP Versie'; -- GitLab From 41364d2f28f11df3098d2f569f7f7bda5e8fa69f Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 14:26:56 +0200 Subject: [PATCH 0227/1368] Fix major typo --- interface/web/client/lib/lang/es.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/client/lib/lang/es.lng b/interface/web/client/lib/lang/es.lng index 233b58b7ca..9dc7ad813f 100644 --- a/interface/web/client/lib/lang/es.lng +++ b/interface/web/client/lib/lang/es.lng @@ -26,5 +26,5 @@ $wb['Resellers'] = 'Revendedores'; $wb['Send email'] = 'Enviar correo'; $wb['Templates'] = 'Plantillas'; $wb['Add Domain'] = 'Add Domain'; -$wb['domain_txt'] = '] = 'Email-Templates'; +$wb['domain_txt'] = 'Email-Templates'; ?> -- GitLab From 10c55a8c904f932aea657a9a2dd5558548fdc13e Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Mon, 15 Jun 2020 14:38:26 +0200 Subject: [PATCH 0228/1368] Revert "Merge branch 'inherit-spampolicy' of git.ispconfig.org:thom/ispconfig3 into add-domain-button" This reverts commit a2cf4b73057674533f7e1fcf52e46a98b2cfb1bb --- interface/web/mail/lib/lang/ar_mail_user.lng | 2 +- interface/web/mail/lib/lang/bg_mail_user.lng | 2 +- interface/web/mail/lib/lang/br_mail_user.lng | 2 +- interface/web/mail/lib/lang/ca_mail_user.lng | 2 +- interface/web/mail/lib/lang/cz_mail_user.lng | 2 +- interface/web/mail/lib/lang/de_mail_user.lng | 2 +- interface/web/mail/lib/lang/dk_mail_user.lng | 2 +- interface/web/mail/lib/lang/el_mail_user.lng | 2 +- interface/web/mail/lib/lang/en_mail_user.lng | 2 +- interface/web/mail/lib/lang/es_mail_user.lng | 2 +- interface/web/mail/lib/lang/fi_mail_user.lng | 2 +- interface/web/mail/lib/lang/fr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hu_mail_user.lng | 2 +- interface/web/mail/lib/lang/id_mail_user.lng | 2 +- interface/web/mail/lib/lang/it_mail_user.lng | 2 +- interface/web/mail/lib/lang/ja_mail_user.lng | 2 +- interface/web/mail/lib/lang/nl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pt_mail_user.lng | 2 +- interface/web/mail/lib/lang/ro_mail_user.lng | 2 +- interface/web/mail/lib/lang/ru_mail_user.lng | 2 +- interface/web/mail/lib/lang/se_mail_user.lng | 2 +- interface/web/mail/lib/lang/sk_mail_user.lng | 2 +- interface/web/mail/lib/lang/tr_mail_user.lng | 2 +- interface/web/mail/mail_user_edit.php | 2 +- 26 files changed, 26 insertions(+), 26 deletions(-) diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index 9d4828b557..a67a83c07a 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- not enabled -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Disable IMAP'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 0901e0a0fd..3b9a27390e 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Разреши получаване'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Разреши достъп'; $wb['policy_txt'] = 'Спам филтър'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- забранен -'; $wb['limit_mailbox_txt'] = 'Достигнат е максималният брой на пощенските кутии за твоят профил.'; $wb['limit_mailquota_txt'] = 'Максималното отделено място за твоята кутия е достигнато. Максималното позволено място в МБ е '; $wb['disableimap_txt'] = 'Забрани IMAP'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 2abe1931f6..2aca5c3736 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -27,7 +27,7 @@ $wb['postfix_txt'] = 'Habilitar recebimento'; $wb['greylisting_txt'] = 'Habilitar greylist'; $wb['access_txt'] = 'Habilitar acesso'; $wb['policy_txt'] = 'Filtros anti-spam'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '-desabilitado-'; $wb['limit_mailbox_txt'] = 'O limite de contas de e-mail para esta conta foi alcançado.'; $wb['limit_mailquota_txt'] = 'O limite de tamanho para as contas de e-mails foi alcançado. O espaço disponível em MB é'; $wb['disablesmtp_txt'] = 'Desabilitar SMTP (envio)'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 08c9bc78ec..e380b55d2d 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -18,7 +18,7 @@ $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; $wb['access_txt'] = 'Activer l\'accès'; $wb['policy_txt'] = 'Filtre antispam'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- inactif -'; $wb['limit_mailbox_txt'] = 'Le nombre maximal de boites courriel pour votre compte est atteint..'; $wb['limit_mailquota_txt'] = 'Lespace maximal pour les boites courriel est atteint. Lespace maximal disponible est de '; $wb['disableimap_txt'] = 'Désactiver IMAP'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index fb09f0c0a0..1946d4150f 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -22,7 +22,7 @@ $wb['maildir_txt'] = 'E-mailový adresář'; $wb['postfix_txt'] = 'Povolit příjem'; $wb['access_txt'] = 'Povolit přístup'; $wb['policy_txt'] = 'Spamový filtr'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- nepovoleno -'; $wb['limit_mailbox_txt'] = 'Byl dosažen maximální počet mailboxů pro Váš účet.'; $wb['limit_mailquota_txt'] = 'Dosažen maximální prostor pro mailboxy. Max. dostupné místo v MB je'; $wb['disableimap_txt'] = 'Zakázat IMAP'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index e653fbe288..7c1f02cd4f 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Aktiviere Empfang'; $wb['greylisting_txt'] = 'Aktiviere Greylisting'; $wb['access_txt'] = 'Aktiviere Zugriff'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- nicht aktiviert -'; $wb['limit_mailbox_txt'] = 'Die maximale Anzahl an E-Mailkonten für Ihr Konto wurde erreicht.'; $wb['limit_mailquota_txt'] = 'Der maximale Speicherplatz für Ihr E-Mail Konto wurde erreicht. Der maximal verfügbare Speicher in MB ist'; $wb['disablesmtp_txt'] = 'SMTP (Mailversand) deaktivieren'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index 34bf076359..8c0957d353 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -24,7 +24,7 @@ $wb['maildir_txt'] = 'Mailmappe'; $wb['postfix_txt'] = 'Aktiver modtagelse'; $wb['access_txt'] = 'Aktiver adgang'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- ikke aktiveret -'; $wb['limit_mailbox_txt'] = 'Max. antal af mailbokse for din konto er nået.'; $wb['limit_mailquota_txt'] = 'Max. plads for postkasser er nået. Max. tilgængelig plads i MB er'; $wb['disablesmtp_txt'] = 'Deaktiver SMTP (afsending)'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index 76c266d591..f735d6e7b3 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Ενεργοποίηση Λήψης'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Ενεργοποίηση Πρόσβασης'; $wb['policy_txt'] = 'Φίλτρο Spam'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- ανενεργή -'; $wb['limit_mailbox_txt'] = 'Έχετε φτάσει το μέγιστο πλήθος των θυρίδων για τον λογαριασμό σας.'; $wb['limit_mailquota_txt'] = 'Έχετε φτάσει στο μέγεστο χώρο της θυρίδα σας.Ο μέγιστος διαθέσιμος χώρος σε MB είναι'; $wb['disableimap_txt'] = 'Απενεργοποίηση IMAP'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 69ac0a00a9..82cab6d70c 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -27,7 +27,7 @@ $wb["postfix_txt"] = 'Enable receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb["access_txt"] = 'Enable access'; $wb["policy_txt"] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb["no_policy"] = '- not enabled -'; $wb["limit_mailbox_txt"] = 'The max. number of mailboxes for your account is reached.'; $wb["limit_mailquota_txt"] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb["disablesmtp_txt"] = 'Disable SMTP (sending)'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index be329c304a..418fd2dbfa 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -44,7 +44,7 @@ $wb['name_optional_txt'] = '(Opcional)'; $wb['name_txt'] = 'Nombre'; $wb['no_backup_txt'] = 'Sin copia de seguridad'; $wb['no_domain_perm'] = 'Usted no tiene permisos para gestionar este dominio.'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- deshabilitado -'; $wb['now_txt'] = 'Ahora'; $wb['password_match_txt'] = 'Las contraseñas coinciden.'; $wb['password_mismatch_txt'] = 'Las contraseñas no coinciden.'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 45ea1d9b8b..a764e95693 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -18,7 +18,7 @@ $wb['postfix_txt'] = 'Salli vastaanotto'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Salli yhteys'; $wb['policy_txt'] = 'Roskapostisuodatin'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- ei käytössä -'; $wb['limit_mailbox_txt'] = 'Tilisi sallittu postilaatikoiden määrä on ylitetty.'; $wb['limit_mailquota_txt'] = 'Tilisi sallittu postilaatikoiden koko on ylitetty. Vapaa tila megatavuina on'; $wb['disableimap_txt'] = 'Estä IMAP'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index 8df58233a3..732f3d8cb7 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -18,7 +18,7 @@ $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; $wb['access_txt'] = 'Activer l’accès'; $wb['policy_txt'] = 'Filtre antispam'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- inactif -'; $wb['limit_mailbox_txt'] = 'Le nombre maximal de boîtes aux lettres pour votre compte est atteint..'; $wb['limit_mailquota_txt'] = 'Lespace maximal pour les boîtes aux lettres est atteint. Lespace maximal disponible est de '; $wb['disableimap_txt'] = 'Désactiver IMAP'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 170aaa6b61..7406e2d656 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- not enabled -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Disable IMAP'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 65962cd21c..db8edf775e 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Bejövő engedélyezés'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Hozzáférés engelyezés'; $wb['policy_txt'] = 'Spam szűrő'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- nem engelyézett -'; $wb['limit_mailbox_txt'] = 'Nincs több mailbox lehetőség.'; $wb['limit_mailquota_txt'] = 'Mailbox tárhely elfogyott.'; $wb['disableimap_txt'] = 'IMAP Tiltás'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index 3bedbd9b93..670550062c 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -24,7 +24,7 @@ $wb['postfix_txt'] = 'Dapat Menerima'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Dapat Mengakses'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- tidak diaktifkan -'; $wb['limit_mailbox_txt'] = 'Jumlah maks mailbox untuk akun Anda sudah tercapai.'; $wb['limit_mailquota_txt'] = 'Ruang maks untuk mailbox sudah tercapai. Ruang maks yang tersedia dalam MB adalah'; $wb['disableimap_txt'] = 'Nonaktifkan IMAP'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index a1a0f8cfd5..dad3f69654 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -19,7 +19,7 @@ $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Abilita ricezione'; $wb['access_txt'] = 'Abilita indirizzo'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- non abilitato -'; $wb['limit_mailbox_txt'] = 'Hai raggiungo il numero massimo di caselle per il tuo account.'; $wb['limit_mailquota_txt'] = 'Hai raggiunto lo spazio massimo per le tue caselle di posta. Lo spazio massimo in MB è di'; $wb['disableimap_txt'] = 'Disabilita IMAP'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index b58b9d13dd..803a278d5b 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'メールを受信する'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'アクセスを許可する'; $wb['policy_txt'] = 'スパムフィルター'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- 利用しない -'; $wb['limit_mailbox_txt'] = 'メールボックスが最大数に達した為、これ以上追加できません。'; $wb['limit_mailquota_txt'] = 'メールボックスが一杯です。 上限(MB):'; $wb['disableimap_txt'] = 'IMAP を無効にする'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 9a75a9fd7a..39cd0bd0f0 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Ontvangen inschakelen'; $wb['greylisting_txt'] = 'Greylisting inschakelen'; $wb['access_txt'] = 'Toegang inschakelen'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Gebruik domein instelling -'; +$wb['no_policy'] = '- niet ingeschakeld -'; $wb['limit_mailbox_txt'] = 'Het max. aantal mailboxen voor uw account is bereikt.'; $wb['limit_mailquota_txt'] = 'De max. ruimte voor uw mailboxen is bereikt. De max. beschikbare ruimte in MB is'; $wb['disableimap_txt'] = 'Uitschakelen IMAP'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 593f83531e..8a35e7742e 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Zezwól na odbiór poczty'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Możliwy dostęp'; $wb['policy_txt'] = 'Filtr spamu'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- brak polityki -'; $wb['limit_mailbox_txt'] = 'Maksymalna ilość skrzynek pocztowych dla Twojego konta została przekroczona.'; $wb['limit_mailquota_txt'] = 'Maksymalna pojemność skrzynki pocztowej została przekroczona. Maksymalne dostępne miejsce w MB to: '; $wb['disableimap_txt'] = 'Wyłącz IMAP'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index 0b7ffe3d37..56a1f16d30 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Permitir Recepção'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Permitir Acesso'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- desactivado -'; $wb['limit_mailbox_txt'] = 'O número máximo de caixas de correio para a conta foi atingido.'; $wb['limit_mailquota_txt'] = 'O espaço em disco disponível para criação de contas foi atingido.'; $wb['disableimap_txt'] = 'Desactivar IMAP'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index 97dfdafd88..ccdcc49fdf 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- not enabled -'; $wb['limit_mailbox_txt'] = 'Numarul maxim de MAILBOX pe contul dumneavoastra a fost atins'; $wb['limit_mailquota_txt'] = 'Spatiul maxim pentru MAILBOX a fost atins.Acesta este '; $wb['disableimap_txt'] = 'Blocheaza IMAP'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index 07bab6fd4f..fcfadd9db9 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Разрешить получение'; $wb['greylisting_txt'] = 'Включить серый список (Greylisting)'; $wb['access_txt'] = 'Включить доступ'; $wb['policy_txt'] = 'Спам-фильтр'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- не включены -'; $wb['limit_mailbox_txt'] = 'Число почтовых ящиков превышено.'; $wb['limit_mailquota_txt'] = 'Место под почтовые ящики превышено. Максимально доступно MB'; $wb['password_strength_txt'] = 'Стойкость пароля'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index da0282e118..c081446557 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Aktivera mottagning'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Aktivera åtkomst'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- ej aktiverat -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Avaktivera IMAP'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index d9a68404ae..eb70b8eba9 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Povoliť príjem'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Povoliť Prístup'; $wb['policy_txt'] = 'Spamfilter'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- nepovolená -'; $wb['limit_mailbox_txt'] = 'Max. počet poštových schránok pre váš účet je dosiahnutý.'; $wb['limit_mailquota_txt'] = 'Maximálny priestor pre poštové schránky je dosiahnutý. Max. dostupné miesto v MB je'; $wb['disableimap_txt'] = 'Deaktivovať IMAP'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 9e964e5e8a..c7dec33b99 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -27,7 +27,7 @@ $wb['postfix_txt'] = 'Alım Etkin'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; $wb['access_txt'] = 'Erişim Etkin'; $wb['policy_txt'] = 'Önemsiz İleti Süzgeci'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['no_policy'] = '- devre dışı -'; $wb['limit_mailbox_txt'] = 'Hesabınıza ekleyebileceğiniz en fazla e-posta kutusu sayısına ulaştınız.'; $wb['limit_mailquota_txt'] = 'E-posta kutularınız için kullanabileceğiniz en fazla boyuta ulaştınız. Kullanılabilecek alan MB:'; $wb['disablesmtp_txt'] = 'SMTP Kullanılmasın (gönderim)'; diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index ac4607e76a..c7f36a89e0 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -99,7 +99,7 @@ class page_action extends tform_actions { if (isset($_POST['policy'])) $tmp_user['policy_id'] = intval($_POST['policy']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; + $policy_select = ""; if(is_array($policys)) { foreach( $policys as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; -- GitLab From a504ec4a30f8ee08ed7c53d00b7191c8cdc4e17d Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 14:45:19 +0200 Subject: [PATCH 0229/1368] Fix fault for DNS Zone template --- interface/lib/classes/remote.d/dns.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 9b5e6b74ad..f4c75ba25b 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -736,7 +736,7 @@ class remoting_dns extends remoting { - //* Get All DNS Zones Templates by etruel + //* Get All DNS Zones Templates by etruel and thom public function dns_templatezone_get_all($session_id) { global $app, $conf; if(!$this->checkPerm($session_id, 'dns_templatezone_add')) { @@ -749,7 +749,7 @@ class remoting_dns extends remoting { return $result; } else { - this->server->fault('template_id_error', 'There is no DNS templates.'); + throw new SoapFault('template_id_error', 'There is no DNS templates.'); return false; } } -- GitLab From 3681d6a16680dca4bc1e5173b04735b1a2fb20bb Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 14:52:19 +0200 Subject: [PATCH 0230/1368] Fix major typo --- interface/web/admin/lib/lang/ar_remote_user.lng | 2 +- interface/web/admin/lib/lang/bg_remote_user.lng | 2 +- interface/web/admin/lib/lang/br_remote_user.lng | 2 +- interface/web/admin/lib/lang/ca_remote_user.lng | 2 +- interface/web/admin/lib/lang/cz_remote_user.lng | 2 +- interface/web/admin/lib/lang/de_remote_user.lng | 2 +- interface/web/admin/lib/lang/dk_remote_user.lng | 2 +- interface/web/admin/lib/lang/el_remote_user.lng | 2 +- interface/web/admin/lib/lang/en_remote_user.lng | 2 +- interface/web/admin/lib/lang/es_remote_user.lng | 2 +- interface/web/admin/lib/lang/fi_remote_user.lng | 2 +- interface/web/admin/lib/lang/fr_remote_user.lng | 2 +- interface/web/admin/lib/lang/hr_remote_user.lng | 2 +- interface/web/admin/lib/lang/hu_remote_user.lng | 2 +- interface/web/admin/lib/lang/id_remote_user.lng | 2 +- interface/web/admin/lib/lang/it_remote_user.lng | 2 +- interface/web/admin/lib/lang/ja_remote_user.lng | 2 +- interface/web/admin/lib/lang/nl_remote_user.lng | 2 +- interface/web/admin/lib/lang/pl_remote_user.lng | 2 +- interface/web/admin/lib/lang/pt_remote_user.lng | 2 +- interface/web/admin/lib/lang/ro_remote_user.lng | 2 +- interface/web/admin/lib/lang/ru_remote_user.lng | 2 +- interface/web/admin/lib/lang/se_remote_user.lng | 2 +- interface/web/admin/lib/lang/sk_remote_user.lng | 2 +- interface/web/admin/lib/lang/tr_remote_user.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/admin/lib/lang/ar_remote_user.lng b/interface/web/admin/lib/lang/ar_remote_user.lng index 8c70904102..b1db64e8e6 100644 --- a/interface/web/admin/lib/lang/ar_remote_user.lng +++ b/interface/web/admin/lib/lang/ar_remote_user.lng @@ -1,5 +1,5 @@ Date: Mon, 15 Jun 2020 14:55:58 +0200 Subject: [PATCH 0231/1368] Fix typo for DNAME --- interface/lib/classes/remote.d/dns.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index f4c75ba25b..3129c6a3a2 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -473,7 +473,7 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- //* Get record details - public function dns_cname_get($session_id, $primary_id) { + public function dns_dname_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'DNAME'); } -- GitLab From e64c6f93b77c3cf00426225cb3cbaf95c0882a86 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 17:57:12 +0200 Subject: [PATCH 0232/1368] Add Font Awesome (fixes #5443) --- .../font-awesome-4.7.0/HELP-US-OUT.txt | 7 + .../font-awesome-4.7.0/css/font-awesome.css | 2337 ++++++++++++++ .../css/font-awesome.min.css | 4 + .../font-awesome-4.7.0/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../fonts/fontawesome-webfont.svg | 2671 +++++++++++++++++ .../fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes .../font-awesome-4.7.0/less/animated.less | 34 + .../less/bordered-pulled.less | 25 + .../font-awesome-4.7.0/less/core.less | 12 + .../font-awesome-4.7.0/less/fixed-width.less | 6 + .../font-awesome-4.7.0/less/font-awesome.less | 18 + .../font-awesome-4.7.0/less/icons.less | 789 +++++ .../font-awesome-4.7.0/less/larger.less | 13 + .../font-awesome-4.7.0/less/list.less | 19 + .../font-awesome-4.7.0/less/mixins.less | 60 + .../font-awesome-4.7.0/less/path.less | 15 + .../less/rotated-flipped.less | 20 + .../less/screen-reader.less | 5 + .../font-awesome-4.7.0/less/stacked.less | 20 + .../font-awesome-4.7.0/less/variables.less | 800 +++++ .../font-awesome-4.7.0/scss/_animated.scss | 34 + .../scss/_bordered-pulled.scss | 25 + .../font-awesome-4.7.0/scss/_core.scss | 12 + .../font-awesome-4.7.0/scss/_fixed-width.scss | 6 + .../font-awesome-4.7.0/scss/_icons.scss | 789 +++++ .../font-awesome-4.7.0/scss/_larger.scss | 13 + .../font-awesome-4.7.0/scss/_list.scss | 19 + .../font-awesome-4.7.0/scss/_mixins.scss | 60 + .../font-awesome-4.7.0/scss/_path.scss | 15 + .../scss/_rotated-flipped.scss | 20 + .../scss/_screen-reader.scss | 5 + .../font-awesome-4.7.0/scss/_stacked.scss | 20 + .../font-awesome-4.7.0/scss/_variables.scss | 800 +++++ .../font-awesome-4.7.0/scss/font-awesome.scss | 18 + .../web/themes/default/templates/main.tpl.htm | 1 + 38 files changed, 8692 insertions(+) create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.min.css create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/FontAwesome.otf create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.eot create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.svg create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.woff create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss create mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt new file mode 100644 index 0000000000..83d083dd77 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt @@ -0,0 +1,7 @@ +I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, +Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, +comprehensive icon sets or copy and paste your own. + +Please. Check it out. + +-Dave Gandy diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css new file mode 100644 index 0000000000..ee906a8196 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css @@ -0,0 +1,2337 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font: normal normal normal 14px/1 FontAwesome; + font-size: inherit; + text-rendering: auto; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.33333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.28571429em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.14285714em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.14285714em; + width: 2.14285714em; + top: 0.14285714em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.85714286em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.fa-pull-left { + float: left; +} +.fa-pull-right { + float: right; +} +.fa.fa-pull-left { + margin-right: .3em; +} +.fa.fa-pull-right { + margin-left: .3em; +} +/* Deprecated as of 4.4.0 */ +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} +.fa-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +.fa-rotate-90 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; + -webkit-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; + -webkit-transform: scale(1, -1); + -ms-transform: scale(1, -1); + transform: scale(1, -1); +} +:root .fa-rotate-90, +:root .fa-rotate-180, +:root .fa-rotate-270, +:root .fa-flip-horizontal, +:root .fa-flip-vertical { + filter: none; +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-remove:before, +.fa-close:before, +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-photo:before, +.fa-image:before, +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before, +.fa-bar-chart:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook-f:before, +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-feed:before, +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-navicon:before, +.fa-reorder:before, +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-desc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-asc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-mail-reply-all:before, +.fa-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before, +.fa-gratipay:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} +.fa-space-shuttle:before { + content: "\f197"; +} +.fa-slack:before { + content: "\f198"; +} +.fa-envelope-square:before { + content: "\f199"; +} +.fa-wordpress:before { + content: "\f19a"; +} +.fa-openid:before { + content: "\f19b"; +} +.fa-institution:before, +.fa-bank:before, +.fa-university:before { + content: "\f19c"; +} +.fa-mortar-board:before, +.fa-graduation-cap:before { + content: "\f19d"; +} +.fa-yahoo:before { + content: "\f19e"; +} +.fa-google:before { + content: "\f1a0"; +} +.fa-reddit:before { + content: "\f1a1"; +} +.fa-reddit-square:before { + content: "\f1a2"; +} +.fa-stumbleupon-circle:before { + content: "\f1a3"; +} +.fa-stumbleupon:before { + content: "\f1a4"; +} +.fa-delicious:before { + content: "\f1a5"; +} +.fa-digg:before { + content: "\f1a6"; +} +.fa-pied-piper-pp:before { + content: "\f1a7"; +} +.fa-pied-piper-alt:before { + content: "\f1a8"; +} +.fa-drupal:before { + content: "\f1a9"; +} +.fa-joomla:before { + content: "\f1aa"; +} +.fa-language:before { + content: "\f1ab"; +} +.fa-fax:before { + content: "\f1ac"; +} +.fa-building:before { + content: "\f1ad"; +} +.fa-child:before { + content: "\f1ae"; +} +.fa-paw:before { + content: "\f1b0"; +} +.fa-spoon:before { + content: "\f1b1"; +} +.fa-cube:before { + content: "\f1b2"; +} +.fa-cubes:before { + content: "\f1b3"; +} +.fa-behance:before { + content: "\f1b4"; +} +.fa-behance-square:before { + content: "\f1b5"; +} +.fa-steam:before { + content: "\f1b6"; +} +.fa-steam-square:before { + content: "\f1b7"; +} +.fa-recycle:before { + content: "\f1b8"; +} +.fa-automobile:before, +.fa-car:before { + content: "\f1b9"; +} +.fa-cab:before, +.fa-taxi:before { + content: "\f1ba"; +} +.fa-tree:before { + content: "\f1bb"; +} +.fa-spotify:before { + content: "\f1bc"; +} +.fa-deviantart:before { + content: "\f1bd"; +} +.fa-soundcloud:before { + content: "\f1be"; +} +.fa-database:before { + content: "\f1c0"; +} +.fa-file-pdf-o:before { + content: "\f1c1"; +} +.fa-file-word-o:before { + content: "\f1c2"; +} +.fa-file-excel-o:before { + content: "\f1c3"; +} +.fa-file-powerpoint-o:before { + content: "\f1c4"; +} +.fa-file-photo-o:before, +.fa-file-picture-o:before, +.fa-file-image-o:before { + content: "\f1c5"; +} +.fa-file-zip-o:before, +.fa-file-archive-o:before { + content: "\f1c6"; +} +.fa-file-sound-o:before, +.fa-file-audio-o:before { + content: "\f1c7"; +} +.fa-file-movie-o:before, +.fa-file-video-o:before { + content: "\f1c8"; +} +.fa-file-code-o:before { + content: "\f1c9"; +} +.fa-vine:before { + content: "\f1ca"; +} +.fa-codepen:before { + content: "\f1cb"; +} +.fa-jsfiddle:before { + content: "\f1cc"; +} +.fa-life-bouy:before, +.fa-life-buoy:before, +.fa-life-saver:before, +.fa-support:before, +.fa-life-ring:before { + content: "\f1cd"; +} +.fa-circle-o-notch:before { + content: "\f1ce"; +} +.fa-ra:before, +.fa-resistance:before, +.fa-rebel:before { + content: "\f1d0"; +} +.fa-ge:before, +.fa-empire:before { + content: "\f1d1"; +} +.fa-git-square:before { + content: "\f1d2"; +} +.fa-git:before { + content: "\f1d3"; +} +.fa-y-combinator-square:before, +.fa-yc-square:before, +.fa-hacker-news:before { + content: "\f1d4"; +} +.fa-tencent-weibo:before { + content: "\f1d5"; +} +.fa-qq:before { + content: "\f1d6"; +} +.fa-wechat:before, +.fa-weixin:before { + content: "\f1d7"; +} +.fa-send:before, +.fa-paper-plane:before { + content: "\f1d8"; +} +.fa-send-o:before, +.fa-paper-plane-o:before { + content: "\f1d9"; +} +.fa-history:before { + content: "\f1da"; +} +.fa-circle-thin:before { + content: "\f1db"; +} +.fa-header:before { + content: "\f1dc"; +} +.fa-paragraph:before { + content: "\f1dd"; +} +.fa-sliders:before { + content: "\f1de"; +} +.fa-share-alt:before { + content: "\f1e0"; +} +.fa-share-alt-square:before { + content: "\f1e1"; +} +.fa-bomb:before { + content: "\f1e2"; +} +.fa-soccer-ball-o:before, +.fa-futbol-o:before { + content: "\f1e3"; +} +.fa-tty:before { + content: "\f1e4"; +} +.fa-binoculars:before { + content: "\f1e5"; +} +.fa-plug:before { + content: "\f1e6"; +} +.fa-slideshare:before { + content: "\f1e7"; +} +.fa-twitch:before { + content: "\f1e8"; +} +.fa-yelp:before { + content: "\f1e9"; +} +.fa-newspaper-o:before { + content: "\f1ea"; +} +.fa-wifi:before { + content: "\f1eb"; +} +.fa-calculator:before { + content: "\f1ec"; +} +.fa-paypal:before { + content: "\f1ed"; +} +.fa-google-wallet:before { + content: "\f1ee"; +} +.fa-cc-visa:before { + content: "\f1f0"; +} +.fa-cc-mastercard:before { + content: "\f1f1"; +} +.fa-cc-discover:before { + content: "\f1f2"; +} +.fa-cc-amex:before { + content: "\f1f3"; +} +.fa-cc-paypal:before { + content: "\f1f4"; +} +.fa-cc-stripe:before { + content: "\f1f5"; +} +.fa-bell-slash:before { + content: "\f1f6"; +} +.fa-bell-slash-o:before { + content: "\f1f7"; +} +.fa-trash:before { + content: "\f1f8"; +} +.fa-copyright:before { + content: "\f1f9"; +} +.fa-at:before { + content: "\f1fa"; +} +.fa-eyedropper:before { + content: "\f1fb"; +} +.fa-paint-brush:before { + content: "\f1fc"; +} +.fa-birthday-cake:before { + content: "\f1fd"; +} +.fa-area-chart:before { + content: "\f1fe"; +} +.fa-pie-chart:before { + content: "\f200"; +} +.fa-line-chart:before { + content: "\f201"; +} +.fa-lastfm:before { + content: "\f202"; +} +.fa-lastfm-square:before { + content: "\f203"; +} +.fa-toggle-off:before { + content: "\f204"; +} +.fa-toggle-on:before { + content: "\f205"; +} +.fa-bicycle:before { + content: "\f206"; +} +.fa-bus:before { + content: "\f207"; +} +.fa-ioxhost:before { + content: "\f208"; +} +.fa-angellist:before { + content: "\f209"; +} +.fa-cc:before { + content: "\f20a"; +} +.fa-shekel:before, +.fa-sheqel:before, +.fa-ils:before { + content: "\f20b"; +} +.fa-meanpath:before { + content: "\f20c"; +} +.fa-buysellads:before { + content: "\f20d"; +} +.fa-connectdevelop:before { + content: "\f20e"; +} +.fa-dashcube:before { + content: "\f210"; +} +.fa-forumbee:before { + content: "\f211"; +} +.fa-leanpub:before { + content: "\f212"; +} +.fa-sellsy:before { + content: "\f213"; +} +.fa-shirtsinbulk:before { + content: "\f214"; +} +.fa-simplybuilt:before { + content: "\f215"; +} +.fa-skyatlas:before { + content: "\f216"; +} +.fa-cart-plus:before { + content: "\f217"; +} +.fa-cart-arrow-down:before { + content: "\f218"; +} +.fa-diamond:before { + content: "\f219"; +} +.fa-ship:before { + content: "\f21a"; +} +.fa-user-secret:before { + content: "\f21b"; +} +.fa-motorcycle:before { + content: "\f21c"; +} +.fa-street-view:before { + content: "\f21d"; +} +.fa-heartbeat:before { + content: "\f21e"; +} +.fa-venus:before { + content: "\f221"; +} +.fa-mars:before { + content: "\f222"; +} +.fa-mercury:before { + content: "\f223"; +} +.fa-intersex:before, +.fa-transgender:before { + content: "\f224"; +} +.fa-transgender-alt:before { + content: "\f225"; +} +.fa-venus-double:before { + content: "\f226"; +} +.fa-mars-double:before { + content: "\f227"; +} +.fa-venus-mars:before { + content: "\f228"; +} +.fa-mars-stroke:before { + content: "\f229"; +} +.fa-mars-stroke-v:before { + content: "\f22a"; +} +.fa-mars-stroke-h:before { + content: "\f22b"; +} +.fa-neuter:before { + content: "\f22c"; +} +.fa-genderless:before { + content: "\f22d"; +} +.fa-facebook-official:before { + content: "\f230"; +} +.fa-pinterest-p:before { + content: "\f231"; +} +.fa-whatsapp:before { + content: "\f232"; +} +.fa-server:before { + content: "\f233"; +} +.fa-user-plus:before { + content: "\f234"; +} +.fa-user-times:before { + content: "\f235"; +} +.fa-hotel:before, +.fa-bed:before { + content: "\f236"; +} +.fa-viacoin:before { + content: "\f237"; +} +.fa-train:before { + content: "\f238"; +} +.fa-subway:before { + content: "\f239"; +} +.fa-medium:before { + content: "\f23a"; +} +.fa-yc:before, +.fa-y-combinator:before { + content: "\f23b"; +} +.fa-optin-monster:before { + content: "\f23c"; +} +.fa-opencart:before { + content: "\f23d"; +} +.fa-expeditedssl:before { + content: "\f23e"; +} +.fa-battery-4:before, +.fa-battery:before, +.fa-battery-full:before { + content: "\f240"; +} +.fa-battery-3:before, +.fa-battery-three-quarters:before { + content: "\f241"; +} +.fa-battery-2:before, +.fa-battery-half:before { + content: "\f242"; +} +.fa-battery-1:before, +.fa-battery-quarter:before { + content: "\f243"; +} +.fa-battery-0:before, +.fa-battery-empty:before { + content: "\f244"; +} +.fa-mouse-pointer:before { + content: "\f245"; +} +.fa-i-cursor:before { + content: "\f246"; +} +.fa-object-group:before { + content: "\f247"; +} +.fa-object-ungroup:before { + content: "\f248"; +} +.fa-sticky-note:before { + content: "\f249"; +} +.fa-sticky-note-o:before { + content: "\f24a"; +} +.fa-cc-jcb:before { + content: "\f24b"; +} +.fa-cc-diners-club:before { + content: "\f24c"; +} +.fa-clone:before { + content: "\f24d"; +} +.fa-balance-scale:before { + content: "\f24e"; +} +.fa-hourglass-o:before { + content: "\f250"; +} +.fa-hourglass-1:before, +.fa-hourglass-start:before { + content: "\f251"; +} +.fa-hourglass-2:before, +.fa-hourglass-half:before { + content: "\f252"; +} +.fa-hourglass-3:before, +.fa-hourglass-end:before { + content: "\f253"; +} +.fa-hourglass:before { + content: "\f254"; +} +.fa-hand-grab-o:before, +.fa-hand-rock-o:before { + content: "\f255"; +} +.fa-hand-stop-o:before, +.fa-hand-paper-o:before { + content: "\f256"; +} +.fa-hand-scissors-o:before { + content: "\f257"; +} +.fa-hand-lizard-o:before { + content: "\f258"; +} +.fa-hand-spock-o:before { + content: "\f259"; +} +.fa-hand-pointer-o:before { + content: "\f25a"; +} +.fa-hand-peace-o:before { + content: "\f25b"; +} +.fa-trademark:before { + content: "\f25c"; +} +.fa-registered:before { + content: "\f25d"; +} +.fa-creative-commons:before { + content: "\f25e"; +} +.fa-gg:before { + content: "\f260"; +} +.fa-gg-circle:before { + content: "\f261"; +} +.fa-tripadvisor:before { + content: "\f262"; +} +.fa-odnoklassniki:before { + content: "\f263"; +} +.fa-odnoklassniki-square:before { + content: "\f264"; +} +.fa-get-pocket:before { + content: "\f265"; +} +.fa-wikipedia-w:before { + content: "\f266"; +} +.fa-safari:before { + content: "\f267"; +} +.fa-chrome:before { + content: "\f268"; +} +.fa-firefox:before { + content: "\f269"; +} +.fa-opera:before { + content: "\f26a"; +} +.fa-internet-explorer:before { + content: "\f26b"; +} +.fa-tv:before, +.fa-television:before { + content: "\f26c"; +} +.fa-contao:before { + content: "\f26d"; +} +.fa-500px:before { + content: "\f26e"; +} +.fa-amazon:before { + content: "\f270"; +} +.fa-calendar-plus-o:before { + content: "\f271"; +} +.fa-calendar-minus-o:before { + content: "\f272"; +} +.fa-calendar-times-o:before { + content: "\f273"; +} +.fa-calendar-check-o:before { + content: "\f274"; +} +.fa-industry:before { + content: "\f275"; +} +.fa-map-pin:before { + content: "\f276"; +} +.fa-map-signs:before { + content: "\f277"; +} +.fa-map-o:before { + content: "\f278"; +} +.fa-map:before { + content: "\f279"; +} +.fa-commenting:before { + content: "\f27a"; +} +.fa-commenting-o:before { + content: "\f27b"; +} +.fa-houzz:before { + content: "\f27c"; +} +.fa-vimeo:before { + content: "\f27d"; +} +.fa-black-tie:before { + content: "\f27e"; +} +.fa-fonticons:before { + content: "\f280"; +} +.fa-reddit-alien:before { + content: "\f281"; +} +.fa-edge:before { + content: "\f282"; +} +.fa-credit-card-alt:before { + content: "\f283"; +} +.fa-codiepie:before { + content: "\f284"; +} +.fa-modx:before { + content: "\f285"; +} +.fa-fort-awesome:before { + content: "\f286"; +} +.fa-usb:before { + content: "\f287"; +} +.fa-product-hunt:before { + content: "\f288"; +} +.fa-mixcloud:before { + content: "\f289"; +} +.fa-scribd:before { + content: "\f28a"; +} +.fa-pause-circle:before { + content: "\f28b"; +} +.fa-pause-circle-o:before { + content: "\f28c"; +} +.fa-stop-circle:before { + content: "\f28d"; +} +.fa-stop-circle-o:before { + content: "\f28e"; +} +.fa-shopping-bag:before { + content: "\f290"; +} +.fa-shopping-basket:before { + content: "\f291"; +} +.fa-hashtag:before { + content: "\f292"; +} +.fa-bluetooth:before { + content: "\f293"; +} +.fa-bluetooth-b:before { + content: "\f294"; +} +.fa-percent:before { + content: "\f295"; +} +.fa-gitlab:before { + content: "\f296"; +} +.fa-wpbeginner:before { + content: "\f297"; +} +.fa-wpforms:before { + content: "\f298"; +} +.fa-envira:before { + content: "\f299"; +} +.fa-universal-access:before { + content: "\f29a"; +} +.fa-wheelchair-alt:before { + content: "\f29b"; +} +.fa-question-circle-o:before { + content: "\f29c"; +} +.fa-blind:before { + content: "\f29d"; +} +.fa-audio-description:before { + content: "\f29e"; +} +.fa-volume-control-phone:before { + content: "\f2a0"; +} +.fa-braille:before { + content: "\f2a1"; +} +.fa-assistive-listening-systems:before { + content: "\f2a2"; +} +.fa-asl-interpreting:before, +.fa-american-sign-language-interpreting:before { + content: "\f2a3"; +} +.fa-deafness:before, +.fa-hard-of-hearing:before, +.fa-deaf:before { + content: "\f2a4"; +} +.fa-glide:before { + content: "\f2a5"; +} +.fa-glide-g:before { + content: "\f2a6"; +} +.fa-signing:before, +.fa-sign-language:before { + content: "\f2a7"; +} +.fa-low-vision:before { + content: "\f2a8"; +} +.fa-viadeo:before { + content: "\f2a9"; +} +.fa-viadeo-square:before { + content: "\f2aa"; +} +.fa-snapchat:before { + content: "\f2ab"; +} +.fa-snapchat-ghost:before { + content: "\f2ac"; +} +.fa-snapchat-square:before { + content: "\f2ad"; +} +.fa-pied-piper:before { + content: "\f2ae"; +} +.fa-first-order:before { + content: "\f2b0"; +} +.fa-yoast:before { + content: "\f2b1"; +} +.fa-themeisle:before { + content: "\f2b2"; +} +.fa-google-plus-circle:before, +.fa-google-plus-official:before { + content: "\f2b3"; +} +.fa-fa:before, +.fa-font-awesome:before { + content: "\f2b4"; +} +.fa-handshake-o:before { + content: "\f2b5"; +} +.fa-envelope-open:before { + content: "\f2b6"; +} +.fa-envelope-open-o:before { + content: "\f2b7"; +} +.fa-linode:before { + content: "\f2b8"; +} +.fa-address-book:before { + content: "\f2b9"; +} +.fa-address-book-o:before { + content: "\f2ba"; +} +.fa-vcard:before, +.fa-address-card:before { + content: "\f2bb"; +} +.fa-vcard-o:before, +.fa-address-card-o:before { + content: "\f2bc"; +} +.fa-user-circle:before { + content: "\f2bd"; +} +.fa-user-circle-o:before { + content: "\f2be"; +} +.fa-user-o:before { + content: "\f2c0"; +} +.fa-id-badge:before { + content: "\f2c1"; +} +.fa-drivers-license:before, +.fa-id-card:before { + content: "\f2c2"; +} +.fa-drivers-license-o:before, +.fa-id-card-o:before { + content: "\f2c3"; +} +.fa-quora:before { + content: "\f2c4"; +} +.fa-free-code-camp:before { + content: "\f2c5"; +} +.fa-telegram:before { + content: "\f2c6"; +} +.fa-thermometer-4:before, +.fa-thermometer:before, +.fa-thermometer-full:before { + content: "\f2c7"; +} +.fa-thermometer-3:before, +.fa-thermometer-three-quarters:before { + content: "\f2c8"; +} +.fa-thermometer-2:before, +.fa-thermometer-half:before { + content: "\f2c9"; +} +.fa-thermometer-1:before, +.fa-thermometer-quarter:before { + content: "\f2ca"; +} +.fa-thermometer-0:before, +.fa-thermometer-empty:before { + content: "\f2cb"; +} +.fa-shower:before { + content: "\f2cc"; +} +.fa-bathtub:before, +.fa-s15:before, +.fa-bath:before { + content: "\f2cd"; +} +.fa-podcast:before { + content: "\f2ce"; +} +.fa-window-maximize:before { + content: "\f2d0"; +} +.fa-window-minimize:before { + content: "\f2d1"; +} +.fa-window-restore:before { + content: "\f2d2"; +} +.fa-times-rectangle:before, +.fa-window-close:before { + content: "\f2d3"; +} +.fa-times-rectangle-o:before, +.fa-window-close-o:before { + content: "\f2d4"; +} +.fa-bandcamp:before { + content: "\f2d5"; +} +.fa-grav:before { + content: "\f2d6"; +} +.fa-etsy:before { + content: "\f2d7"; +} +.fa-imdb:before { + content: "\f2d8"; +} +.fa-ravelry:before { + content: "\f2d9"; +} +.fa-eercast:before { + content: "\f2da"; +} +.fa-microchip:before { + content: "\f2db"; +} +.fa-snowflake-o:before { + content: "\f2dc"; +} +.fa-superpowers:before { + content: "\f2dd"; +} +.fa-wpexplorer:before { + content: "\f2de"; +} +.fa-meetup:before { + content: "\f2e0"; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.min.css b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.min.css new file mode 100644 index 0000000000..540440ce89 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/FontAwesome.otf b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 GIT binary patch literal 134808 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 literal 0 HcmV?d00001 diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.eot b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 GIT binary patch literal 165742 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 G*yFsbY~cLNXLP73aA74Mq6M9f^&YV`isWW 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

5q!RY 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 + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 GIT binary patch literal 165548 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 z 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 d0mRO}xo^G_%I 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 SdSQM28?+M|D(2r_;{O0|uQ74} literal 0 HcmV?d00001 diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 GIT binary patch literal 77160 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 literal 0 HcmV?d00001 diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less new file mode 100644 index 0000000000..66ad52a5ba --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less @@ -0,0 +1,34 @@ +// Animated Icons +// -------------------------- + +.@{fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.@{fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less new file mode 100644 index 0000000000..f1c8ad75f5 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.@{fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em @fa-border-color; + border-radius: .1em; +} + +.@{fa-css-prefix}-pull-left { float: left; } +.@{fa-css-prefix}-pull-right { float: right; } + +.@{fa-css-prefix} { + &.@{fa-css-prefix}-pull-left { margin-right: .3em; } + &.@{fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.@{fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less new file mode 100644 index 0000000000..c577ac84a6 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.@{fa-css-prefix} { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less new file mode 100644 index 0000000000..110289f2f4 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.@{fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less new file mode 100644 index 0000000000..c3677def31 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables.less"; +@import "mixins.less"; +@import "path.less"; +@import "core.less"; +@import "larger.less"; +@import "fixed-width.less"; +@import "list.less"; +@import "bordered-pulled.less"; +@import "animated.less"; +@import "rotated-flipped.less"; +@import "stacked.less"; +@import "icons.less"; +@import "screen-reader.less"; diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less new file mode 100644 index 0000000000..159d600425 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } +.@{fa-css-prefix}-music:before { content: @fa-var-music; } +.@{fa-css-prefix}-search:before { content: @fa-var-search; } +.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } +.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } +.@{fa-css-prefix}-star:before { content: @fa-var-star; } +.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } +.@{fa-css-prefix}-user:before { content: @fa-var-user; } +.@{fa-css-prefix}-film:before { content: @fa-var-film; } +.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } +.@{fa-css-prefix}-th:before { content: @fa-var-th; } +.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } +.@{fa-css-prefix}-check:before { content: @fa-var-check; } +.@{fa-css-prefix}-remove:before, +.@{fa-css-prefix}-close:before, +.@{fa-css-prefix}-times:before { content: @fa-var-times; } +.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } +.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } +.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } +.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } +.@{fa-css-prefix}-gear:before, +.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } +.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } +.@{fa-css-prefix}-home:before { content: @fa-var-home; } +.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } +.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } +.@{fa-css-prefix}-road:before { content: @fa-var-road; } +.@{fa-css-prefix}-download:before { content: @fa-var-download; } +.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } +.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } +.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } +.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } +.@{fa-css-prefix}-rotate-right:before, +.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } +.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } +.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } +.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } +.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } +.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } +.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } +.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } +.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } +.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } +.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } +.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } +.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } +.@{fa-css-prefix}-book:before { content: @fa-var-book; } +.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } +.@{fa-css-prefix}-print:before { content: @fa-var-print; } +.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } +.@{fa-css-prefix}-font:before { content: @fa-var-font; } +.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } +.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } +.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } +.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } +.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } +.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } +.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } +.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } +.@{fa-css-prefix}-list:before { content: @fa-var-list; } +.@{fa-css-prefix}-dedent:before, +.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } +.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } +.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } +.@{fa-css-prefix}-photo:before, +.@{fa-css-prefix}-image:before, +.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } +.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } +.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } +.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } +.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } +.@{fa-css-prefix}-edit:before, +.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } +.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } +.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } +.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } +.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } +.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } +.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } +.@{fa-css-prefix}-play:before { content: @fa-var-play; } +.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } +.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } +.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } +.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } +.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } +.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } +.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } +.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } +.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } +.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } +.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } +.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } +.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } +.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } +.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } +.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } +.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } +.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } +.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } +.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } +.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } +.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } +.@{fa-css-prefix}-mail-forward:before, +.@{fa-css-prefix}-share:before { content: @fa-var-share; } +.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } +.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } +.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } +.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } +.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } +.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } +.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } +.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } +.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } +.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } +.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } +.@{fa-css-prefix}-warning:before, +.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } +.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } +.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } +.@{fa-css-prefix}-random:before { content: @fa-var-random; } +.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } +.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } +.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } +.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } +.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } +.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } +.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } +.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } +.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } +.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } +.@{fa-css-prefix}-bar-chart-o:before, +.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } +.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } +.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } +.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } +.@{fa-css-prefix}-key:before { content: @fa-var-key; } +.@{fa-css-prefix}-gears:before, +.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } +.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } +.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } +.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } +.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } +.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } +.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } +.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } +.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } +.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } +.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } +.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } +.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } +.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } +.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } +.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } +.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } +.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } +.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } +.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } +.@{fa-css-prefix}-facebook-f:before, +.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } +.@{fa-css-prefix}-github:before { content: @fa-var-github; } +.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } +.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } +.@{fa-css-prefix}-feed:before, +.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } +.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } +.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } +.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } +.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } +.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } +.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } +.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } +.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } +.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } +.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } +.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } +.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } +.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } +.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } +.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } +.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } +.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } +.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } +.@{fa-css-prefix}-group:before, +.@{fa-css-prefix}-users:before { content: @fa-var-users; } +.@{fa-css-prefix}-chain:before, +.@{fa-css-prefix}-link:before { content: @fa-var-link; } +.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } +.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } +.@{fa-css-prefix}-cut:before, +.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } +.@{fa-css-prefix}-copy:before, +.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } +.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } +.@{fa-css-prefix}-save:before, +.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } +.@{fa-css-prefix}-square:before { content: @fa-var-square; } +.@{fa-css-prefix}-navicon:before, +.@{fa-css-prefix}-reorder:before, +.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } +.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } +.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } +.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } +.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } +.@{fa-css-prefix}-table:before { content: @fa-var-table; } +.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } +.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } +.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } +.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } +.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } +.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } +.@{fa-css-prefix}-money:before { content: @fa-var-money; } +.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } +.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } +.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } +.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } +.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } +.@{fa-css-prefix}-unsorted:before, +.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } +.@{fa-css-prefix}-sort-down:before, +.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } +.@{fa-css-prefix}-sort-up:before, +.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } +.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } +.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } +.@{fa-css-prefix}-rotate-left:before, +.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } +.@{fa-css-prefix}-legal:before, +.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } +.@{fa-css-prefix}-dashboard:before, +.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } +.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } +.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } +.@{fa-css-prefix}-flash:before, +.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } +.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } +.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } +.@{fa-css-prefix}-paste:before, +.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } +.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } +.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } +.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } +.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } +.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } +.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } +.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } +.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } +.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } +.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } +.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } +.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } +.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } +.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } +.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } +.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } +.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } +.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } +.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } +.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } +.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } +.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } +.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } +.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } +.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } +.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } +.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } +.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } +.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } +.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } +.@{fa-css-prefix}-mobile-phone:before, +.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } +.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } +.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } +.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } +.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } +.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } +.@{fa-css-prefix}-mail-reply:before, +.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } +.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } +.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } +.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } +.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } +.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } +.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } +.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } +.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } +.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } +.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } +.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } +.@{fa-css-prefix}-code:before { content: @fa-var-code; } +.@{fa-css-prefix}-mail-reply-all:before, +.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } +.@{fa-css-prefix}-star-half-empty:before, +.@{fa-css-prefix}-star-half-full:before, +.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } +.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } +.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } +.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } +.@{fa-css-prefix}-unlink:before, +.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } +.@{fa-css-prefix}-question:before { content: @fa-var-question; } +.@{fa-css-prefix}-info:before { content: @fa-var-info; } +.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } +.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } +.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } +.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } +.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } +.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } +.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } +.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } +.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } +.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } +.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } +.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } +.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } +.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } +.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } +.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } +.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } +.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } +.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } +.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } +.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } +.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } +.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } +.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } +.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } +.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } +.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } +.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } +.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } +.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } +.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } +.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } +.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } +.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } +.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } +.@{fa-css-prefix}-toggle-down:before, +.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } +.@{fa-css-prefix}-toggle-up:before, +.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } +.@{fa-css-prefix}-toggle-right:before, +.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } +.@{fa-css-prefix}-euro:before, +.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } +.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } +.@{fa-css-prefix}-dollar:before, +.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } +.@{fa-css-prefix}-rupee:before, +.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } +.@{fa-css-prefix}-cny:before, +.@{fa-css-prefix}-rmb:before, +.@{fa-css-prefix}-yen:before, +.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } +.@{fa-css-prefix}-ruble:before, +.@{fa-css-prefix}-rouble:before, +.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } +.@{fa-css-prefix}-won:before, +.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } +.@{fa-css-prefix}-bitcoin:before, +.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } +.@{fa-css-prefix}-file:before { content: @fa-var-file; } +.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } +.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } +.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } +.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } +.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } +.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } +.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } +.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } +.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } +.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } +.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } +.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } +.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } +.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } +.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } +.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } +.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } +.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } +.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } +.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } +.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } +.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } +.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } +.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } +.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } +.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } +.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } +.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } +.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } +.@{fa-css-prefix}-android:before { content: @fa-var-android; } +.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } +.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } +.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } +.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } +.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } +.@{fa-css-prefix}-female:before { content: @fa-var-female; } +.@{fa-css-prefix}-male:before { content: @fa-var-male; } +.@{fa-css-prefix}-gittip:before, +.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } +.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } +.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } +.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } +.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } +.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } +.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } +.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } +.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } +.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } +.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } +.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } +.@{fa-css-prefix}-toggle-left:before, +.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } +.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } +.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } +.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } +.@{fa-css-prefix}-turkish-lira:before, +.@{fa-css-prefix}-try:before { content: @fa-var-try; } +.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } +.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } +.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } +.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } +.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } +.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } +.@{fa-css-prefix}-institution:before, +.@{fa-css-prefix}-bank:before, +.@{fa-css-prefix}-university:before { content: @fa-var-university; } +.@{fa-css-prefix}-mortar-board:before, +.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } +.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } +.@{fa-css-prefix}-google:before { content: @fa-var-google; } +.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } +.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } +.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } +.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } +.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } +.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } +.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } +.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } +.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } +.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } +.@{fa-css-prefix}-language:before { content: @fa-var-language; } +.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } +.@{fa-css-prefix}-building:before { content: @fa-var-building; } +.@{fa-css-prefix}-child:before { content: @fa-var-child; } +.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } +.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } +.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } +.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } +.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } +.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } +.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } +.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } +.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } +.@{fa-css-prefix}-automobile:before, +.@{fa-css-prefix}-car:before { content: @fa-var-car; } +.@{fa-css-prefix}-cab:before, +.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } +.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } +.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } +.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } +.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } +.@{fa-css-prefix}-database:before { content: @fa-var-database; } +.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } +.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } +.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } +.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } +.@{fa-css-prefix}-file-photo-o:before, +.@{fa-css-prefix}-file-picture-o:before, +.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } +.@{fa-css-prefix}-file-zip-o:before, +.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } +.@{fa-css-prefix}-file-sound-o:before, +.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } +.@{fa-css-prefix}-file-movie-o:before, +.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } +.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } +.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } +.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } +.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } +.@{fa-css-prefix}-life-bouy:before, +.@{fa-css-prefix}-life-buoy:before, +.@{fa-css-prefix}-life-saver:before, +.@{fa-css-prefix}-support:before, +.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } +.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } +.@{fa-css-prefix}-ra:before, +.@{fa-css-prefix}-resistance:before, +.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } +.@{fa-css-prefix}-ge:before, +.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } +.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } +.@{fa-css-prefix}-git:before { content: @fa-var-git; } +.@{fa-css-prefix}-y-combinator-square:before, +.@{fa-css-prefix}-yc-square:before, +.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } +.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } +.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } +.@{fa-css-prefix}-wechat:before, +.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } +.@{fa-css-prefix}-send:before, +.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } +.@{fa-css-prefix}-send-o:before, +.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } +.@{fa-css-prefix}-history:before { content: @fa-var-history; } +.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } +.@{fa-css-prefix}-header:before { content: @fa-var-header; } +.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } +.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } +.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } +.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } +.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } +.@{fa-css-prefix}-soccer-ball-o:before, +.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } +.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } +.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } +.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } +.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } +.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } +.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } +.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } +.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } +.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } +.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } +.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } +.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } +.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } +.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } +.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } +.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } +.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } +.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } +.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } +.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } +.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } +.@{fa-css-prefix}-at:before { content: @fa-var-at; } +.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } +.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } +.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } +.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } +.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } +.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } +.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } +.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } +.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } +.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } +.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } +.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } +.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } +.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } +.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } +.@{fa-css-prefix}-shekel:before, +.@{fa-css-prefix}-sheqel:before, +.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } +.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } +.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } +.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } +.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } +.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } +.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } +.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } +.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } +.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } +.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } +.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } +.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } +.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } +.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } +.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } +.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } +.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } +.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } +.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } +.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } +.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } +.@{fa-css-prefix}-intersex:before, +.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } +.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } +.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } +.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } +.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } +.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } +.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } +.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } +.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } +.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } +.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } +.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } +.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } +.@{fa-css-prefix}-server:before { content: @fa-var-server; } +.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } +.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } +.@{fa-css-prefix}-hotel:before, +.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } +.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } +.@{fa-css-prefix}-train:before { content: @fa-var-train; } +.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } +.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } +.@{fa-css-prefix}-yc:before, +.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } +.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } +.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } +.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } +.@{fa-css-prefix}-battery-4:before, +.@{fa-css-prefix}-battery:before, +.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } +.@{fa-css-prefix}-battery-3:before, +.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } +.@{fa-css-prefix}-battery-2:before, +.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } +.@{fa-css-prefix}-battery-1:before, +.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } +.@{fa-css-prefix}-battery-0:before, +.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } +.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } +.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } +.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } +.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } +.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } +.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } +.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } +.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } +.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } +.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } +.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } +.@{fa-css-prefix}-hourglass-1:before, +.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } +.@{fa-css-prefix}-hourglass-2:before, +.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } +.@{fa-css-prefix}-hourglass-3:before, +.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } +.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } +.@{fa-css-prefix}-hand-grab-o:before, +.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } +.@{fa-css-prefix}-hand-stop-o:before, +.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } +.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } +.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } +.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } +.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } +.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } +.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } +.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } +.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } +.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } +.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } +.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } +.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } +.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } +.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } +.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } +.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } +.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } +.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } +.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } +.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } +.@{fa-css-prefix}-tv:before, +.@{fa-css-prefix}-television:before { content: @fa-var-television; } +.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } +.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } +.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } +.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } +.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } +.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } +.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } +.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } +.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } +.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } +.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } +.@{fa-css-prefix}-map:before { content: @fa-var-map; } +.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } +.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } +.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } +.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } +.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } +.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } +.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } +.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } +.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } +.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } +.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } +.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } +.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } +.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } +.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } +.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } +.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } +.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } +.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } +.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } +.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } +.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } +.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } +.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } +.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } +.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } +.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } +.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } +.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } +.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } +.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } +.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } +.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } +.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } +.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } +.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } +.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } +.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } +.@{fa-css-prefix}-asl-interpreting:before, +.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } +.@{fa-css-prefix}-deafness:before, +.@{fa-css-prefix}-hard-of-hearing:before, +.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } +.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } +.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } +.@{fa-css-prefix}-signing:before, +.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } +.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } +.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } +.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } +.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } +.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } +.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } +.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } +.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } +.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } +.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } +.@{fa-css-prefix}-google-plus-circle:before, +.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } +.@{fa-css-prefix}-fa:before, +.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } +.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } +.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } +.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } +.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } +.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } +.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } +.@{fa-css-prefix}-vcard:before, +.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } +.@{fa-css-prefix}-vcard-o:before, +.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } +.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } +.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } +.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } +.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } +.@{fa-css-prefix}-drivers-license:before, +.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } +.@{fa-css-prefix}-drivers-license-o:before, +.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } +.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } +.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } +.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } +.@{fa-css-prefix}-thermometer-4:before, +.@{fa-css-prefix}-thermometer:before, +.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } +.@{fa-css-prefix}-thermometer-3:before, +.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } +.@{fa-css-prefix}-thermometer-2:before, +.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } +.@{fa-css-prefix}-thermometer-1:before, +.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } +.@{fa-css-prefix}-thermometer-0:before, +.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } +.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } +.@{fa-css-prefix}-bathtub:before, +.@{fa-css-prefix}-s15:before, +.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } +.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } +.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } +.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } +.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } +.@{fa-css-prefix}-times-rectangle:before, +.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } +.@{fa-css-prefix}-times-rectangle-o:before, +.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } +.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } +.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } +.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } +.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } +.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } +.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } +.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } +.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } +.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } +.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } +.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less new file mode 100644 index 0000000000..c9d646770e --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.@{fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.@{fa-css-prefix}-2x { font-size: 2em; } +.@{fa-css-prefix}-3x { font-size: 3em; } +.@{fa-css-prefix}-4x { font-size: 4em; } +.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less new file mode 100644 index 0000000000..0b440382f6 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.@{fa-css-prefix}-ul { + padding-left: 0; + margin-left: @fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.@{fa-css-prefix}-li { + position: absolute; + left: -@fa-li-width; + width: @fa-li-width; + top: (2em / 14); + text-align: center; + &.@{fa-css-prefix}-lg { + left: (-@fa-li-width + (4em / 14)); + } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less new file mode 100644 index 0000000000..beef231d0e --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +.fa-icon() { + display: inline-block; + font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +.fa-icon-rotate(@degrees, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; + -webkit-transform: rotate(@degrees); + -ms-transform: rotate(@degrees); + transform: rotate(@degrees); +} + +.fa-icon-flip(@horiz, @vert, @rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; + -webkit-transform: scale(@horiz, @vert); + -ms-transform: scale(@horiz, @vert); + transform: scale(@horiz, @vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +.sr-only() { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +.sr-only-focusable() { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less new file mode 100644 index 0000000000..835be41f81 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); + src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), + url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), + url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), + url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), + url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); + // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less new file mode 100644 index 0000000000..f6ba81475b --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } +.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } +.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } + +.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } +.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .@{fa-css-prefix}-rotate-90, +:root .@{fa-css-prefix}-rotate-180, +:root .@{fa-css-prefix}-rotate-270, +:root .@{fa-css-prefix}-flip-horizontal, +:root .@{fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less new file mode 100644 index 0000000000..11c188196d --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { .sr-only(); } +.sr-only-focusable { .sr-only-focusable(); } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less new file mode 100644 index 0000000000..fc53fb0e7a --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.@{fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.@{fa-css-prefix}-stack-1x { line-height: inherit; } +.@{fa-css-prefix}-stack-2x { font-size: 2em; } +.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less new file mode 100644 index 0000000000..7ddbbc0115 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +@fa-font-path: "../fonts"; +@fa-font-size-base: 14px; +@fa-line-height-base: 1; +//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly +@fa-css-prefix: fa; +@fa-version: "4.7.0"; +@fa-border-color: #eee; +@fa-inverse: #fff; +@fa-li-width: (30em / 14); + +@fa-var-500px: "\f26e"; +@fa-var-address-book: "\f2b9"; +@fa-var-address-book-o: "\f2ba"; +@fa-var-address-card: "\f2bb"; +@fa-var-address-card-o: "\f2bc"; +@fa-var-adjust: "\f042"; +@fa-var-adn: "\f170"; +@fa-var-align-center: "\f037"; +@fa-var-align-justify: "\f039"; +@fa-var-align-left: "\f036"; +@fa-var-align-right: "\f038"; +@fa-var-amazon: "\f270"; +@fa-var-ambulance: "\f0f9"; +@fa-var-american-sign-language-interpreting: "\f2a3"; +@fa-var-anchor: "\f13d"; +@fa-var-android: "\f17b"; +@fa-var-angellist: "\f209"; +@fa-var-angle-double-down: "\f103"; +@fa-var-angle-double-left: "\f100"; +@fa-var-angle-double-right: "\f101"; +@fa-var-angle-double-up: "\f102"; +@fa-var-angle-down: "\f107"; +@fa-var-angle-left: "\f104"; +@fa-var-angle-right: "\f105"; +@fa-var-angle-up: "\f106"; +@fa-var-apple: "\f179"; +@fa-var-archive: "\f187"; +@fa-var-area-chart: "\f1fe"; +@fa-var-arrow-circle-down: "\f0ab"; +@fa-var-arrow-circle-left: "\f0a8"; +@fa-var-arrow-circle-o-down: "\f01a"; +@fa-var-arrow-circle-o-left: "\f190"; +@fa-var-arrow-circle-o-right: "\f18e"; +@fa-var-arrow-circle-o-up: "\f01b"; +@fa-var-arrow-circle-right: "\f0a9"; +@fa-var-arrow-circle-up: "\f0aa"; +@fa-var-arrow-down: "\f063"; +@fa-var-arrow-left: "\f060"; +@fa-var-arrow-right: "\f061"; +@fa-var-arrow-up: "\f062"; +@fa-var-arrows: "\f047"; +@fa-var-arrows-alt: "\f0b2"; +@fa-var-arrows-h: "\f07e"; +@fa-var-arrows-v: "\f07d"; +@fa-var-asl-interpreting: "\f2a3"; +@fa-var-assistive-listening-systems: "\f2a2"; +@fa-var-asterisk: "\f069"; +@fa-var-at: "\f1fa"; +@fa-var-audio-description: "\f29e"; +@fa-var-automobile: "\f1b9"; +@fa-var-backward: "\f04a"; +@fa-var-balance-scale: "\f24e"; +@fa-var-ban: "\f05e"; +@fa-var-bandcamp: "\f2d5"; +@fa-var-bank: "\f19c"; +@fa-var-bar-chart: "\f080"; +@fa-var-bar-chart-o: "\f080"; +@fa-var-barcode: "\f02a"; +@fa-var-bars: "\f0c9"; +@fa-var-bath: "\f2cd"; +@fa-var-bathtub: "\f2cd"; +@fa-var-battery: "\f240"; +@fa-var-battery-0: "\f244"; +@fa-var-battery-1: "\f243"; +@fa-var-battery-2: "\f242"; +@fa-var-battery-3: "\f241"; +@fa-var-battery-4: "\f240"; +@fa-var-battery-empty: "\f244"; +@fa-var-battery-full: "\f240"; +@fa-var-battery-half: "\f242"; +@fa-var-battery-quarter: "\f243"; +@fa-var-battery-three-quarters: "\f241"; +@fa-var-bed: "\f236"; +@fa-var-beer: "\f0fc"; +@fa-var-behance: "\f1b4"; +@fa-var-behance-square: "\f1b5"; +@fa-var-bell: "\f0f3"; +@fa-var-bell-o: "\f0a2"; +@fa-var-bell-slash: "\f1f6"; +@fa-var-bell-slash-o: "\f1f7"; +@fa-var-bicycle: "\f206"; +@fa-var-binoculars: "\f1e5"; +@fa-var-birthday-cake: "\f1fd"; +@fa-var-bitbucket: "\f171"; +@fa-var-bitbucket-square: "\f172"; +@fa-var-bitcoin: "\f15a"; +@fa-var-black-tie: "\f27e"; +@fa-var-blind: "\f29d"; +@fa-var-bluetooth: "\f293"; +@fa-var-bluetooth-b: "\f294"; +@fa-var-bold: "\f032"; +@fa-var-bolt: "\f0e7"; +@fa-var-bomb: "\f1e2"; +@fa-var-book: "\f02d"; +@fa-var-bookmark: "\f02e"; +@fa-var-bookmark-o: "\f097"; +@fa-var-braille: "\f2a1"; +@fa-var-briefcase: "\f0b1"; +@fa-var-btc: "\f15a"; +@fa-var-bug: "\f188"; +@fa-var-building: "\f1ad"; +@fa-var-building-o: "\f0f7"; +@fa-var-bullhorn: "\f0a1"; +@fa-var-bullseye: "\f140"; +@fa-var-bus: "\f207"; +@fa-var-buysellads: "\f20d"; +@fa-var-cab: "\f1ba"; +@fa-var-calculator: "\f1ec"; +@fa-var-calendar: "\f073"; +@fa-var-calendar-check-o: "\f274"; +@fa-var-calendar-minus-o: "\f272"; +@fa-var-calendar-o: "\f133"; +@fa-var-calendar-plus-o: "\f271"; +@fa-var-calendar-times-o: "\f273"; +@fa-var-camera: "\f030"; +@fa-var-camera-retro: "\f083"; +@fa-var-car: "\f1b9"; +@fa-var-caret-down: "\f0d7"; +@fa-var-caret-left: "\f0d9"; +@fa-var-caret-right: "\f0da"; +@fa-var-caret-square-o-down: "\f150"; +@fa-var-caret-square-o-left: "\f191"; +@fa-var-caret-square-o-right: "\f152"; +@fa-var-caret-square-o-up: "\f151"; +@fa-var-caret-up: "\f0d8"; +@fa-var-cart-arrow-down: "\f218"; +@fa-var-cart-plus: "\f217"; +@fa-var-cc: "\f20a"; +@fa-var-cc-amex: "\f1f3"; +@fa-var-cc-diners-club: "\f24c"; +@fa-var-cc-discover: "\f1f2"; +@fa-var-cc-jcb: "\f24b"; +@fa-var-cc-mastercard: "\f1f1"; +@fa-var-cc-paypal: "\f1f4"; +@fa-var-cc-stripe: "\f1f5"; +@fa-var-cc-visa: "\f1f0"; +@fa-var-certificate: "\f0a3"; +@fa-var-chain: "\f0c1"; +@fa-var-chain-broken: "\f127"; +@fa-var-check: "\f00c"; +@fa-var-check-circle: "\f058"; +@fa-var-check-circle-o: "\f05d"; +@fa-var-check-square: "\f14a"; +@fa-var-check-square-o: "\f046"; +@fa-var-chevron-circle-down: "\f13a"; +@fa-var-chevron-circle-left: "\f137"; +@fa-var-chevron-circle-right: "\f138"; +@fa-var-chevron-circle-up: "\f139"; +@fa-var-chevron-down: "\f078"; +@fa-var-chevron-left: "\f053"; +@fa-var-chevron-right: "\f054"; +@fa-var-chevron-up: "\f077"; +@fa-var-child: "\f1ae"; +@fa-var-chrome: "\f268"; +@fa-var-circle: "\f111"; +@fa-var-circle-o: "\f10c"; +@fa-var-circle-o-notch: "\f1ce"; +@fa-var-circle-thin: "\f1db"; +@fa-var-clipboard: "\f0ea"; +@fa-var-clock-o: "\f017"; +@fa-var-clone: "\f24d"; +@fa-var-close: "\f00d"; +@fa-var-cloud: "\f0c2"; +@fa-var-cloud-download: "\f0ed"; +@fa-var-cloud-upload: "\f0ee"; +@fa-var-cny: "\f157"; +@fa-var-code: "\f121"; +@fa-var-code-fork: "\f126"; +@fa-var-codepen: "\f1cb"; +@fa-var-codiepie: "\f284"; +@fa-var-coffee: "\f0f4"; +@fa-var-cog: "\f013"; +@fa-var-cogs: "\f085"; +@fa-var-columns: "\f0db"; +@fa-var-comment: "\f075"; +@fa-var-comment-o: "\f0e5"; +@fa-var-commenting: "\f27a"; +@fa-var-commenting-o: "\f27b"; +@fa-var-comments: "\f086"; +@fa-var-comments-o: "\f0e6"; +@fa-var-compass: "\f14e"; +@fa-var-compress: "\f066"; +@fa-var-connectdevelop: "\f20e"; +@fa-var-contao: "\f26d"; +@fa-var-copy: "\f0c5"; +@fa-var-copyright: "\f1f9"; +@fa-var-creative-commons: "\f25e"; +@fa-var-credit-card: "\f09d"; +@fa-var-credit-card-alt: "\f283"; +@fa-var-crop: "\f125"; +@fa-var-crosshairs: "\f05b"; +@fa-var-css3: "\f13c"; +@fa-var-cube: "\f1b2"; +@fa-var-cubes: "\f1b3"; +@fa-var-cut: "\f0c4"; +@fa-var-cutlery: "\f0f5"; +@fa-var-dashboard: "\f0e4"; +@fa-var-dashcube: "\f210"; +@fa-var-database: "\f1c0"; +@fa-var-deaf: "\f2a4"; +@fa-var-deafness: "\f2a4"; +@fa-var-dedent: "\f03b"; +@fa-var-delicious: "\f1a5"; +@fa-var-desktop: "\f108"; +@fa-var-deviantart: "\f1bd"; +@fa-var-diamond: "\f219"; +@fa-var-digg: "\f1a6"; +@fa-var-dollar: "\f155"; +@fa-var-dot-circle-o: "\f192"; +@fa-var-download: "\f019"; +@fa-var-dribbble: "\f17d"; +@fa-var-drivers-license: "\f2c2"; +@fa-var-drivers-license-o: "\f2c3"; +@fa-var-dropbox: "\f16b"; +@fa-var-drupal: "\f1a9"; +@fa-var-edge: "\f282"; +@fa-var-edit: "\f044"; +@fa-var-eercast: "\f2da"; +@fa-var-eject: "\f052"; +@fa-var-ellipsis-h: "\f141"; +@fa-var-ellipsis-v: "\f142"; +@fa-var-empire: "\f1d1"; +@fa-var-envelope: "\f0e0"; +@fa-var-envelope-o: "\f003"; +@fa-var-envelope-open: "\f2b6"; +@fa-var-envelope-open-o: "\f2b7"; +@fa-var-envelope-square: "\f199"; +@fa-var-envira: "\f299"; +@fa-var-eraser: "\f12d"; +@fa-var-etsy: "\f2d7"; +@fa-var-eur: "\f153"; +@fa-var-euro: "\f153"; +@fa-var-exchange: "\f0ec"; +@fa-var-exclamation: "\f12a"; +@fa-var-exclamation-circle: "\f06a"; +@fa-var-exclamation-triangle: "\f071"; +@fa-var-expand: "\f065"; +@fa-var-expeditedssl: "\f23e"; +@fa-var-external-link: "\f08e"; +@fa-var-external-link-square: "\f14c"; +@fa-var-eye: "\f06e"; +@fa-var-eye-slash: "\f070"; +@fa-var-eyedropper: "\f1fb"; +@fa-var-fa: "\f2b4"; +@fa-var-facebook: "\f09a"; +@fa-var-facebook-f: "\f09a"; +@fa-var-facebook-official: "\f230"; +@fa-var-facebook-square: "\f082"; +@fa-var-fast-backward: "\f049"; +@fa-var-fast-forward: "\f050"; +@fa-var-fax: "\f1ac"; +@fa-var-feed: "\f09e"; +@fa-var-female: "\f182"; +@fa-var-fighter-jet: "\f0fb"; +@fa-var-file: "\f15b"; +@fa-var-file-archive-o: "\f1c6"; +@fa-var-file-audio-o: "\f1c7"; +@fa-var-file-code-o: "\f1c9"; +@fa-var-file-excel-o: "\f1c3"; +@fa-var-file-image-o: "\f1c5"; +@fa-var-file-movie-o: "\f1c8"; +@fa-var-file-o: "\f016"; +@fa-var-file-pdf-o: "\f1c1"; +@fa-var-file-photo-o: "\f1c5"; +@fa-var-file-picture-o: "\f1c5"; +@fa-var-file-powerpoint-o: "\f1c4"; +@fa-var-file-sound-o: "\f1c7"; +@fa-var-file-text: "\f15c"; +@fa-var-file-text-o: "\f0f6"; +@fa-var-file-video-o: "\f1c8"; +@fa-var-file-word-o: "\f1c2"; +@fa-var-file-zip-o: "\f1c6"; +@fa-var-files-o: "\f0c5"; +@fa-var-film: "\f008"; +@fa-var-filter: "\f0b0"; +@fa-var-fire: "\f06d"; +@fa-var-fire-extinguisher: "\f134"; +@fa-var-firefox: "\f269"; +@fa-var-first-order: "\f2b0"; +@fa-var-flag: "\f024"; +@fa-var-flag-checkered: "\f11e"; +@fa-var-flag-o: "\f11d"; +@fa-var-flash: "\f0e7"; +@fa-var-flask: "\f0c3"; +@fa-var-flickr: "\f16e"; +@fa-var-floppy-o: "\f0c7"; +@fa-var-folder: "\f07b"; +@fa-var-folder-o: "\f114"; +@fa-var-folder-open: "\f07c"; +@fa-var-folder-open-o: "\f115"; +@fa-var-font: "\f031"; +@fa-var-font-awesome: "\f2b4"; +@fa-var-fonticons: "\f280"; +@fa-var-fort-awesome: "\f286"; +@fa-var-forumbee: "\f211"; +@fa-var-forward: "\f04e"; +@fa-var-foursquare: "\f180"; +@fa-var-free-code-camp: "\f2c5"; +@fa-var-frown-o: "\f119"; +@fa-var-futbol-o: "\f1e3"; +@fa-var-gamepad: "\f11b"; +@fa-var-gavel: "\f0e3"; +@fa-var-gbp: "\f154"; +@fa-var-ge: "\f1d1"; +@fa-var-gear: "\f013"; +@fa-var-gears: "\f085"; +@fa-var-genderless: "\f22d"; +@fa-var-get-pocket: "\f265"; +@fa-var-gg: "\f260"; +@fa-var-gg-circle: "\f261"; +@fa-var-gift: "\f06b"; +@fa-var-git: "\f1d3"; +@fa-var-git-square: "\f1d2"; +@fa-var-github: "\f09b"; +@fa-var-github-alt: "\f113"; +@fa-var-github-square: "\f092"; +@fa-var-gitlab: "\f296"; +@fa-var-gittip: "\f184"; +@fa-var-glass: "\f000"; +@fa-var-glide: "\f2a5"; +@fa-var-glide-g: "\f2a6"; +@fa-var-globe: "\f0ac"; +@fa-var-google: "\f1a0"; +@fa-var-google-plus: "\f0d5"; +@fa-var-google-plus-circle: "\f2b3"; +@fa-var-google-plus-official: "\f2b3"; +@fa-var-google-plus-square: "\f0d4"; +@fa-var-google-wallet: "\f1ee"; +@fa-var-graduation-cap: "\f19d"; +@fa-var-gratipay: "\f184"; +@fa-var-grav: "\f2d6"; +@fa-var-group: "\f0c0"; +@fa-var-h-square: "\f0fd"; +@fa-var-hacker-news: "\f1d4"; +@fa-var-hand-grab-o: "\f255"; +@fa-var-hand-lizard-o: "\f258"; +@fa-var-hand-o-down: "\f0a7"; +@fa-var-hand-o-left: "\f0a5"; +@fa-var-hand-o-right: "\f0a4"; +@fa-var-hand-o-up: "\f0a6"; +@fa-var-hand-paper-o: "\f256"; +@fa-var-hand-peace-o: "\f25b"; +@fa-var-hand-pointer-o: "\f25a"; +@fa-var-hand-rock-o: "\f255"; +@fa-var-hand-scissors-o: "\f257"; +@fa-var-hand-spock-o: "\f259"; +@fa-var-hand-stop-o: "\f256"; +@fa-var-handshake-o: "\f2b5"; +@fa-var-hard-of-hearing: "\f2a4"; +@fa-var-hashtag: "\f292"; +@fa-var-hdd-o: "\f0a0"; +@fa-var-header: "\f1dc"; +@fa-var-headphones: "\f025"; +@fa-var-heart: "\f004"; +@fa-var-heart-o: "\f08a"; +@fa-var-heartbeat: "\f21e"; +@fa-var-history: "\f1da"; +@fa-var-home: "\f015"; +@fa-var-hospital-o: "\f0f8"; +@fa-var-hotel: "\f236"; +@fa-var-hourglass: "\f254"; +@fa-var-hourglass-1: "\f251"; +@fa-var-hourglass-2: "\f252"; +@fa-var-hourglass-3: "\f253"; +@fa-var-hourglass-end: "\f253"; +@fa-var-hourglass-half: "\f252"; +@fa-var-hourglass-o: "\f250"; +@fa-var-hourglass-start: "\f251"; +@fa-var-houzz: "\f27c"; +@fa-var-html5: "\f13b"; +@fa-var-i-cursor: "\f246"; +@fa-var-id-badge: "\f2c1"; +@fa-var-id-card: "\f2c2"; +@fa-var-id-card-o: "\f2c3"; +@fa-var-ils: "\f20b"; +@fa-var-image: "\f03e"; +@fa-var-imdb: "\f2d8"; +@fa-var-inbox: "\f01c"; +@fa-var-indent: "\f03c"; +@fa-var-industry: "\f275"; +@fa-var-info: "\f129"; +@fa-var-info-circle: "\f05a"; +@fa-var-inr: "\f156"; +@fa-var-instagram: "\f16d"; +@fa-var-institution: "\f19c"; +@fa-var-internet-explorer: "\f26b"; +@fa-var-intersex: "\f224"; +@fa-var-ioxhost: "\f208"; +@fa-var-italic: "\f033"; +@fa-var-joomla: "\f1aa"; +@fa-var-jpy: "\f157"; +@fa-var-jsfiddle: "\f1cc"; +@fa-var-key: "\f084"; +@fa-var-keyboard-o: "\f11c"; +@fa-var-krw: "\f159"; +@fa-var-language: "\f1ab"; +@fa-var-laptop: "\f109"; +@fa-var-lastfm: "\f202"; +@fa-var-lastfm-square: "\f203"; +@fa-var-leaf: "\f06c"; +@fa-var-leanpub: "\f212"; +@fa-var-legal: "\f0e3"; +@fa-var-lemon-o: "\f094"; +@fa-var-level-down: "\f149"; +@fa-var-level-up: "\f148"; +@fa-var-life-bouy: "\f1cd"; +@fa-var-life-buoy: "\f1cd"; +@fa-var-life-ring: "\f1cd"; +@fa-var-life-saver: "\f1cd"; +@fa-var-lightbulb-o: "\f0eb"; +@fa-var-line-chart: "\f201"; +@fa-var-link: "\f0c1"; +@fa-var-linkedin: "\f0e1"; +@fa-var-linkedin-square: "\f08c"; +@fa-var-linode: "\f2b8"; +@fa-var-linux: "\f17c"; +@fa-var-list: "\f03a"; +@fa-var-list-alt: "\f022"; +@fa-var-list-ol: "\f0cb"; +@fa-var-list-ul: "\f0ca"; +@fa-var-location-arrow: "\f124"; +@fa-var-lock: "\f023"; +@fa-var-long-arrow-down: "\f175"; +@fa-var-long-arrow-left: "\f177"; +@fa-var-long-arrow-right: "\f178"; +@fa-var-long-arrow-up: "\f176"; +@fa-var-low-vision: "\f2a8"; +@fa-var-magic: "\f0d0"; +@fa-var-magnet: "\f076"; +@fa-var-mail-forward: "\f064"; +@fa-var-mail-reply: "\f112"; +@fa-var-mail-reply-all: "\f122"; +@fa-var-male: "\f183"; +@fa-var-map: "\f279"; +@fa-var-map-marker: "\f041"; +@fa-var-map-o: "\f278"; +@fa-var-map-pin: "\f276"; +@fa-var-map-signs: "\f277"; +@fa-var-mars: "\f222"; +@fa-var-mars-double: "\f227"; +@fa-var-mars-stroke: "\f229"; +@fa-var-mars-stroke-h: "\f22b"; +@fa-var-mars-stroke-v: "\f22a"; +@fa-var-maxcdn: "\f136"; +@fa-var-meanpath: "\f20c"; +@fa-var-medium: "\f23a"; +@fa-var-medkit: "\f0fa"; +@fa-var-meetup: "\f2e0"; +@fa-var-meh-o: "\f11a"; +@fa-var-mercury: "\f223"; +@fa-var-microchip: "\f2db"; +@fa-var-microphone: "\f130"; +@fa-var-microphone-slash: "\f131"; +@fa-var-minus: "\f068"; +@fa-var-minus-circle: "\f056"; +@fa-var-minus-square: "\f146"; +@fa-var-minus-square-o: "\f147"; +@fa-var-mixcloud: "\f289"; +@fa-var-mobile: "\f10b"; +@fa-var-mobile-phone: "\f10b"; +@fa-var-modx: "\f285"; +@fa-var-money: "\f0d6"; +@fa-var-moon-o: "\f186"; +@fa-var-mortar-board: "\f19d"; +@fa-var-motorcycle: "\f21c"; +@fa-var-mouse-pointer: "\f245"; +@fa-var-music: "\f001"; +@fa-var-navicon: "\f0c9"; +@fa-var-neuter: "\f22c"; +@fa-var-newspaper-o: "\f1ea"; +@fa-var-object-group: "\f247"; +@fa-var-object-ungroup: "\f248"; +@fa-var-odnoklassniki: "\f263"; +@fa-var-odnoklassniki-square: "\f264"; +@fa-var-opencart: "\f23d"; +@fa-var-openid: "\f19b"; +@fa-var-opera: "\f26a"; +@fa-var-optin-monster: "\f23c"; +@fa-var-outdent: "\f03b"; +@fa-var-pagelines: "\f18c"; +@fa-var-paint-brush: "\f1fc"; +@fa-var-paper-plane: "\f1d8"; +@fa-var-paper-plane-o: "\f1d9"; +@fa-var-paperclip: "\f0c6"; +@fa-var-paragraph: "\f1dd"; +@fa-var-paste: "\f0ea"; +@fa-var-pause: "\f04c"; +@fa-var-pause-circle: "\f28b"; +@fa-var-pause-circle-o: "\f28c"; +@fa-var-paw: "\f1b0"; +@fa-var-paypal: "\f1ed"; +@fa-var-pencil: "\f040"; +@fa-var-pencil-square: "\f14b"; +@fa-var-pencil-square-o: "\f044"; +@fa-var-percent: "\f295"; +@fa-var-phone: "\f095"; +@fa-var-phone-square: "\f098"; +@fa-var-photo: "\f03e"; +@fa-var-picture-o: "\f03e"; +@fa-var-pie-chart: "\f200"; +@fa-var-pied-piper: "\f2ae"; +@fa-var-pied-piper-alt: "\f1a8"; +@fa-var-pied-piper-pp: "\f1a7"; +@fa-var-pinterest: "\f0d2"; +@fa-var-pinterest-p: "\f231"; +@fa-var-pinterest-square: "\f0d3"; +@fa-var-plane: "\f072"; +@fa-var-play: "\f04b"; +@fa-var-play-circle: "\f144"; +@fa-var-play-circle-o: "\f01d"; +@fa-var-plug: "\f1e6"; +@fa-var-plus: "\f067"; +@fa-var-plus-circle: "\f055"; +@fa-var-plus-square: "\f0fe"; +@fa-var-plus-square-o: "\f196"; +@fa-var-podcast: "\f2ce"; +@fa-var-power-off: "\f011"; +@fa-var-print: "\f02f"; +@fa-var-product-hunt: "\f288"; +@fa-var-puzzle-piece: "\f12e"; +@fa-var-qq: "\f1d6"; +@fa-var-qrcode: "\f029"; +@fa-var-question: "\f128"; +@fa-var-question-circle: "\f059"; +@fa-var-question-circle-o: "\f29c"; +@fa-var-quora: "\f2c4"; +@fa-var-quote-left: "\f10d"; +@fa-var-quote-right: "\f10e"; +@fa-var-ra: "\f1d0"; +@fa-var-random: "\f074"; +@fa-var-ravelry: "\f2d9"; +@fa-var-rebel: "\f1d0"; +@fa-var-recycle: "\f1b8"; +@fa-var-reddit: "\f1a1"; +@fa-var-reddit-alien: "\f281"; +@fa-var-reddit-square: "\f1a2"; +@fa-var-refresh: "\f021"; +@fa-var-registered: "\f25d"; +@fa-var-remove: "\f00d"; +@fa-var-renren: "\f18b"; +@fa-var-reorder: "\f0c9"; +@fa-var-repeat: "\f01e"; +@fa-var-reply: "\f112"; +@fa-var-reply-all: "\f122"; +@fa-var-resistance: "\f1d0"; +@fa-var-retweet: "\f079"; +@fa-var-rmb: "\f157"; +@fa-var-road: "\f018"; +@fa-var-rocket: "\f135"; +@fa-var-rotate-left: "\f0e2"; +@fa-var-rotate-right: "\f01e"; +@fa-var-rouble: "\f158"; +@fa-var-rss: "\f09e"; +@fa-var-rss-square: "\f143"; +@fa-var-rub: "\f158"; +@fa-var-ruble: "\f158"; +@fa-var-rupee: "\f156"; +@fa-var-s15: "\f2cd"; +@fa-var-safari: "\f267"; +@fa-var-save: "\f0c7"; +@fa-var-scissors: "\f0c4"; +@fa-var-scribd: "\f28a"; +@fa-var-search: "\f002"; +@fa-var-search-minus: "\f010"; +@fa-var-search-plus: "\f00e"; +@fa-var-sellsy: "\f213"; +@fa-var-send: "\f1d8"; +@fa-var-send-o: "\f1d9"; +@fa-var-server: "\f233"; +@fa-var-share: "\f064"; +@fa-var-share-alt: "\f1e0"; +@fa-var-share-alt-square: "\f1e1"; +@fa-var-share-square: "\f14d"; +@fa-var-share-square-o: "\f045"; +@fa-var-shekel: "\f20b"; +@fa-var-sheqel: "\f20b"; +@fa-var-shield: "\f132"; +@fa-var-ship: "\f21a"; +@fa-var-shirtsinbulk: "\f214"; +@fa-var-shopping-bag: "\f290"; +@fa-var-shopping-basket: "\f291"; +@fa-var-shopping-cart: "\f07a"; +@fa-var-shower: "\f2cc"; +@fa-var-sign-in: "\f090"; +@fa-var-sign-language: "\f2a7"; +@fa-var-sign-out: "\f08b"; +@fa-var-signal: "\f012"; +@fa-var-signing: "\f2a7"; +@fa-var-simplybuilt: "\f215"; +@fa-var-sitemap: "\f0e8"; +@fa-var-skyatlas: "\f216"; +@fa-var-skype: "\f17e"; +@fa-var-slack: "\f198"; +@fa-var-sliders: "\f1de"; +@fa-var-slideshare: "\f1e7"; +@fa-var-smile-o: "\f118"; +@fa-var-snapchat: "\f2ab"; +@fa-var-snapchat-ghost: "\f2ac"; +@fa-var-snapchat-square: "\f2ad"; +@fa-var-snowflake-o: "\f2dc"; +@fa-var-soccer-ball-o: "\f1e3"; +@fa-var-sort: "\f0dc"; +@fa-var-sort-alpha-asc: "\f15d"; +@fa-var-sort-alpha-desc: "\f15e"; +@fa-var-sort-amount-asc: "\f160"; +@fa-var-sort-amount-desc: "\f161"; +@fa-var-sort-asc: "\f0de"; +@fa-var-sort-desc: "\f0dd"; +@fa-var-sort-down: "\f0dd"; +@fa-var-sort-numeric-asc: "\f162"; +@fa-var-sort-numeric-desc: "\f163"; +@fa-var-sort-up: "\f0de"; +@fa-var-soundcloud: "\f1be"; +@fa-var-space-shuttle: "\f197"; +@fa-var-spinner: "\f110"; +@fa-var-spoon: "\f1b1"; +@fa-var-spotify: "\f1bc"; +@fa-var-square: "\f0c8"; +@fa-var-square-o: "\f096"; +@fa-var-stack-exchange: "\f18d"; +@fa-var-stack-overflow: "\f16c"; +@fa-var-star: "\f005"; +@fa-var-star-half: "\f089"; +@fa-var-star-half-empty: "\f123"; +@fa-var-star-half-full: "\f123"; +@fa-var-star-half-o: "\f123"; +@fa-var-star-o: "\f006"; +@fa-var-steam: "\f1b6"; +@fa-var-steam-square: "\f1b7"; +@fa-var-step-backward: "\f048"; +@fa-var-step-forward: "\f051"; +@fa-var-stethoscope: "\f0f1"; +@fa-var-sticky-note: "\f249"; +@fa-var-sticky-note-o: "\f24a"; +@fa-var-stop: "\f04d"; +@fa-var-stop-circle: "\f28d"; +@fa-var-stop-circle-o: "\f28e"; +@fa-var-street-view: "\f21d"; +@fa-var-strikethrough: "\f0cc"; +@fa-var-stumbleupon: "\f1a4"; +@fa-var-stumbleupon-circle: "\f1a3"; +@fa-var-subscript: "\f12c"; +@fa-var-subway: "\f239"; +@fa-var-suitcase: "\f0f2"; +@fa-var-sun-o: "\f185"; +@fa-var-superpowers: "\f2dd"; +@fa-var-superscript: "\f12b"; +@fa-var-support: "\f1cd"; +@fa-var-table: "\f0ce"; +@fa-var-tablet: "\f10a"; +@fa-var-tachometer: "\f0e4"; +@fa-var-tag: "\f02b"; +@fa-var-tags: "\f02c"; +@fa-var-tasks: "\f0ae"; +@fa-var-taxi: "\f1ba"; +@fa-var-telegram: "\f2c6"; +@fa-var-television: "\f26c"; +@fa-var-tencent-weibo: "\f1d5"; +@fa-var-terminal: "\f120"; +@fa-var-text-height: "\f034"; +@fa-var-text-width: "\f035"; +@fa-var-th: "\f00a"; +@fa-var-th-large: "\f009"; +@fa-var-th-list: "\f00b"; +@fa-var-themeisle: "\f2b2"; +@fa-var-thermometer: "\f2c7"; +@fa-var-thermometer-0: "\f2cb"; +@fa-var-thermometer-1: "\f2ca"; +@fa-var-thermometer-2: "\f2c9"; +@fa-var-thermometer-3: "\f2c8"; +@fa-var-thermometer-4: "\f2c7"; +@fa-var-thermometer-empty: "\f2cb"; +@fa-var-thermometer-full: "\f2c7"; +@fa-var-thermometer-half: "\f2c9"; +@fa-var-thermometer-quarter: "\f2ca"; +@fa-var-thermometer-three-quarters: "\f2c8"; +@fa-var-thumb-tack: "\f08d"; +@fa-var-thumbs-down: "\f165"; +@fa-var-thumbs-o-down: "\f088"; +@fa-var-thumbs-o-up: "\f087"; +@fa-var-thumbs-up: "\f164"; +@fa-var-ticket: "\f145"; +@fa-var-times: "\f00d"; +@fa-var-times-circle: "\f057"; +@fa-var-times-circle-o: "\f05c"; +@fa-var-times-rectangle: "\f2d3"; +@fa-var-times-rectangle-o: "\f2d4"; +@fa-var-tint: "\f043"; +@fa-var-toggle-down: "\f150"; +@fa-var-toggle-left: "\f191"; +@fa-var-toggle-off: "\f204"; +@fa-var-toggle-on: "\f205"; +@fa-var-toggle-right: "\f152"; +@fa-var-toggle-up: "\f151"; +@fa-var-trademark: "\f25c"; +@fa-var-train: "\f238"; +@fa-var-transgender: "\f224"; +@fa-var-transgender-alt: "\f225"; +@fa-var-trash: "\f1f8"; +@fa-var-trash-o: "\f014"; +@fa-var-tree: "\f1bb"; +@fa-var-trello: "\f181"; +@fa-var-tripadvisor: "\f262"; +@fa-var-trophy: "\f091"; +@fa-var-truck: "\f0d1"; +@fa-var-try: "\f195"; +@fa-var-tty: "\f1e4"; +@fa-var-tumblr: "\f173"; +@fa-var-tumblr-square: "\f174"; +@fa-var-turkish-lira: "\f195"; +@fa-var-tv: "\f26c"; +@fa-var-twitch: "\f1e8"; +@fa-var-twitter: "\f099"; +@fa-var-twitter-square: "\f081"; +@fa-var-umbrella: "\f0e9"; +@fa-var-underline: "\f0cd"; +@fa-var-undo: "\f0e2"; +@fa-var-universal-access: "\f29a"; +@fa-var-university: "\f19c"; +@fa-var-unlink: "\f127"; +@fa-var-unlock: "\f09c"; +@fa-var-unlock-alt: "\f13e"; +@fa-var-unsorted: "\f0dc"; +@fa-var-upload: "\f093"; +@fa-var-usb: "\f287"; +@fa-var-usd: "\f155"; +@fa-var-user: "\f007"; +@fa-var-user-circle: "\f2bd"; +@fa-var-user-circle-o: "\f2be"; +@fa-var-user-md: "\f0f0"; +@fa-var-user-o: "\f2c0"; +@fa-var-user-plus: "\f234"; +@fa-var-user-secret: "\f21b"; +@fa-var-user-times: "\f235"; +@fa-var-users: "\f0c0"; +@fa-var-vcard: "\f2bb"; +@fa-var-vcard-o: "\f2bc"; +@fa-var-venus: "\f221"; +@fa-var-venus-double: "\f226"; +@fa-var-venus-mars: "\f228"; +@fa-var-viacoin: "\f237"; +@fa-var-viadeo: "\f2a9"; +@fa-var-viadeo-square: "\f2aa"; +@fa-var-video-camera: "\f03d"; +@fa-var-vimeo: "\f27d"; +@fa-var-vimeo-square: "\f194"; +@fa-var-vine: "\f1ca"; +@fa-var-vk: "\f189"; +@fa-var-volume-control-phone: "\f2a0"; +@fa-var-volume-down: "\f027"; +@fa-var-volume-off: "\f026"; +@fa-var-volume-up: "\f028"; +@fa-var-warning: "\f071"; +@fa-var-wechat: "\f1d7"; +@fa-var-weibo: "\f18a"; +@fa-var-weixin: "\f1d7"; +@fa-var-whatsapp: "\f232"; +@fa-var-wheelchair: "\f193"; +@fa-var-wheelchair-alt: "\f29b"; +@fa-var-wifi: "\f1eb"; +@fa-var-wikipedia-w: "\f266"; +@fa-var-window-close: "\f2d3"; +@fa-var-window-close-o: "\f2d4"; +@fa-var-window-maximize: "\f2d0"; +@fa-var-window-minimize: "\f2d1"; +@fa-var-window-restore: "\f2d2"; +@fa-var-windows: "\f17a"; +@fa-var-won: "\f159"; +@fa-var-wordpress: "\f19a"; +@fa-var-wpbeginner: "\f297"; +@fa-var-wpexplorer: "\f2de"; +@fa-var-wpforms: "\f298"; +@fa-var-wrench: "\f0ad"; +@fa-var-xing: "\f168"; +@fa-var-xing-square: "\f169"; +@fa-var-y-combinator: "\f23b"; +@fa-var-y-combinator-square: "\f1d4"; +@fa-var-yahoo: "\f19e"; +@fa-var-yc: "\f23b"; +@fa-var-yc-square: "\f1d4"; +@fa-var-yelp: "\f1e9"; +@fa-var-yen: "\f157"; +@fa-var-yoast: "\f2b1"; +@fa-var-youtube: "\f167"; +@fa-var-youtube-play: "\f16a"; +@fa-var-youtube-square: "\f166"; + diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss new file mode 100644 index 0000000000..8a020dbfff --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss @@ -0,0 +1,34 @@ +// Spinning Icons +// -------------------------- + +.#{$fa-css-prefix}-spin { + -webkit-animation: fa-spin 2s infinite linear; + animation: fa-spin 2s infinite linear; +} + +.#{$fa-css-prefix}-pulse { + -webkit-animation: fa-spin 1s infinite steps(8); + animation: fa-spin 1s infinite steps(8); +} + +@-webkit-keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + +@keyframes fa-spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss new file mode 100644 index 0000000000..d4b85a02f2 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss @@ -0,0 +1,25 @@ +// Bordered & Pulled +// ------------------------- + +.#{$fa-css-prefix}-border { + padding: .2em .25em .15em; + border: solid .08em $fa-border-color; + border-radius: .1em; +} + +.#{$fa-css-prefix}-pull-left { float: left; } +.#{$fa-css-prefix}-pull-right { float: right; } + +.#{$fa-css-prefix} { + &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } + &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } +} + +/* Deprecated as of 4.4.0 */ +.pull-right { float: right; } +.pull-left { float: left; } + +.#{$fa-css-prefix} { + &.pull-left { margin-right: .3em; } + &.pull-right { margin-left: .3em; } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss new file mode 100644 index 0000000000..7425ef85fc --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss @@ -0,0 +1,12 @@ +// Base Class Definition +// ------------------------- + +.#{$fa-css-prefix} { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss new file mode 100644 index 0000000000..b221c98133 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss @@ -0,0 +1,6 @@ +// Fixed Width Icons +// ------------------------- +.#{$fa-css-prefix}-fw { + width: (18em / 14); + text-align: center; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss new file mode 100644 index 0000000000..e63e702c4d --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss @@ -0,0 +1,789 @@ +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ + +.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } +.#{$fa-css-prefix}-music:before { content: $fa-var-music; } +.#{$fa-css-prefix}-search:before { content: $fa-var-search; } +.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } +.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } +.#{$fa-css-prefix}-star:before { content: $fa-var-star; } +.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } +.#{$fa-css-prefix}-user:before { content: $fa-var-user; } +.#{$fa-css-prefix}-film:before { content: $fa-var-film; } +.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } +.#{$fa-css-prefix}-th:before { content: $fa-var-th; } +.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } +.#{$fa-css-prefix}-check:before { content: $fa-var-check; } +.#{$fa-css-prefix}-remove:before, +.#{$fa-css-prefix}-close:before, +.#{$fa-css-prefix}-times:before { content: $fa-var-times; } +.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } +.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } +.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } +.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } +.#{$fa-css-prefix}-gear:before, +.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } +.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } +.#{$fa-css-prefix}-home:before { content: $fa-var-home; } +.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } +.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } +.#{$fa-css-prefix}-road:before { content: $fa-var-road; } +.#{$fa-css-prefix}-download:before { content: $fa-var-download; } +.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } +.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } +.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } +.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } +.#{$fa-css-prefix}-rotate-right:before, +.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } +.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } +.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } +.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } +.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } +.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } +.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } +.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } +.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } +.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } +.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } +.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } +.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } +.#{$fa-css-prefix}-book:before { content: $fa-var-book; } +.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } +.#{$fa-css-prefix}-print:before { content: $fa-var-print; } +.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } +.#{$fa-css-prefix}-font:before { content: $fa-var-font; } +.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } +.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } +.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } +.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } +.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } +.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } +.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } +.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } +.#{$fa-css-prefix}-list:before { content: $fa-var-list; } +.#{$fa-css-prefix}-dedent:before, +.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } +.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } +.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } +.#{$fa-css-prefix}-photo:before, +.#{$fa-css-prefix}-image:before, +.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } +.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } +.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } +.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } +.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } +.#{$fa-css-prefix}-edit:before, +.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } +.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } +.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } +.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } +.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } +.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } +.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } +.#{$fa-css-prefix}-play:before { content: $fa-var-play; } +.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } +.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } +.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } +.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } +.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } +.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } +.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } +.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } +.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } +.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } +.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } +.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } +.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } +.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } +.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } +.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } +.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } +.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } +.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } +.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } +.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } +.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } +.#{$fa-css-prefix}-mail-forward:before, +.#{$fa-css-prefix}-share:before { content: $fa-var-share; } +.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } +.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } +.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } +.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } +.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } +.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } +.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } +.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } +.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } +.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } +.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } +.#{$fa-css-prefix}-warning:before, +.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } +.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } +.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } +.#{$fa-css-prefix}-random:before { content: $fa-var-random; } +.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } +.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } +.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } +.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } +.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } +.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } +.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } +.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } +.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } +.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } +.#{$fa-css-prefix}-bar-chart-o:before, +.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } +.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } +.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } +.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } +.#{$fa-css-prefix}-key:before { content: $fa-var-key; } +.#{$fa-css-prefix}-gears:before, +.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } +.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } +.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } +.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } +.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } +.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } +.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } +.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } +.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } +.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } +.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } +.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } +.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } +.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } +.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } +.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } +.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } +.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } +.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } +.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } +.#{$fa-css-prefix}-facebook-f:before, +.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } +.#{$fa-css-prefix}-github:before { content: $fa-var-github; } +.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } +.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } +.#{$fa-css-prefix}-feed:before, +.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } +.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } +.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } +.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } +.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } +.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } +.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } +.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } +.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } +.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } +.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } +.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } +.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } +.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } +.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } +.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } +.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } +.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } +.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } +.#{$fa-css-prefix}-group:before, +.#{$fa-css-prefix}-users:before { content: $fa-var-users; } +.#{$fa-css-prefix}-chain:before, +.#{$fa-css-prefix}-link:before { content: $fa-var-link; } +.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } +.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } +.#{$fa-css-prefix}-cut:before, +.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } +.#{$fa-css-prefix}-copy:before, +.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } +.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } +.#{$fa-css-prefix}-save:before, +.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } +.#{$fa-css-prefix}-square:before { content: $fa-var-square; } +.#{$fa-css-prefix}-navicon:before, +.#{$fa-css-prefix}-reorder:before, +.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } +.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } +.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } +.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } +.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } +.#{$fa-css-prefix}-table:before { content: $fa-var-table; } +.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } +.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } +.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } +.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } +.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } +.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } +.#{$fa-css-prefix}-money:before { content: $fa-var-money; } +.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } +.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } +.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } +.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } +.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } +.#{$fa-css-prefix}-unsorted:before, +.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } +.#{$fa-css-prefix}-sort-down:before, +.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } +.#{$fa-css-prefix}-sort-up:before, +.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } +.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } +.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } +.#{$fa-css-prefix}-rotate-left:before, +.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } +.#{$fa-css-prefix}-legal:before, +.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } +.#{$fa-css-prefix}-dashboard:before, +.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } +.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } +.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } +.#{$fa-css-prefix}-flash:before, +.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } +.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } +.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } +.#{$fa-css-prefix}-paste:before, +.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } +.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } +.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } +.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } +.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } +.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } +.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } +.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } +.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } +.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } +.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } +.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } +.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } +.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } +.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } +.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } +.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } +.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } +.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } +.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } +.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } +.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } +.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } +.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } +.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } +.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } +.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } +.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } +.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } +.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } +.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } +.#{$fa-css-prefix}-mobile-phone:before, +.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } +.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } +.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } +.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } +.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } +.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } +.#{$fa-css-prefix}-mail-reply:before, +.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } +.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } +.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } +.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } +.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } +.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } +.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } +.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } +.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } +.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } +.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } +.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } +.#{$fa-css-prefix}-code:before { content: $fa-var-code; } +.#{$fa-css-prefix}-mail-reply-all:before, +.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } +.#{$fa-css-prefix}-star-half-empty:before, +.#{$fa-css-prefix}-star-half-full:before, +.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } +.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } +.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } +.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } +.#{$fa-css-prefix}-unlink:before, +.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } +.#{$fa-css-prefix}-question:before { content: $fa-var-question; } +.#{$fa-css-prefix}-info:before { content: $fa-var-info; } +.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } +.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } +.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } +.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } +.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } +.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } +.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } +.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } +.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } +.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } +.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } +.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } +.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } +.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } +.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } +.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } +.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } +.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } +.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } +.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } +.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } +.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } +.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } +.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } +.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } +.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } +.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } +.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } +.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } +.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } +.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } +.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } +.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } +.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } +.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } +.#{$fa-css-prefix}-toggle-down:before, +.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } +.#{$fa-css-prefix}-toggle-up:before, +.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } +.#{$fa-css-prefix}-toggle-right:before, +.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } +.#{$fa-css-prefix}-euro:before, +.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } +.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } +.#{$fa-css-prefix}-dollar:before, +.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } +.#{$fa-css-prefix}-rupee:before, +.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } +.#{$fa-css-prefix}-cny:before, +.#{$fa-css-prefix}-rmb:before, +.#{$fa-css-prefix}-yen:before, +.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } +.#{$fa-css-prefix}-ruble:before, +.#{$fa-css-prefix}-rouble:before, +.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } +.#{$fa-css-prefix}-won:before, +.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } +.#{$fa-css-prefix}-bitcoin:before, +.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } +.#{$fa-css-prefix}-file:before { content: $fa-var-file; } +.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } +.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } +.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } +.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } +.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } +.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } +.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } +.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } +.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } +.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } +.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } +.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } +.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } +.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } +.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } +.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } +.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } +.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } +.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } +.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } +.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } +.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } +.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } +.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } +.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } +.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } +.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } +.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } +.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } +.#{$fa-css-prefix}-android:before { content: $fa-var-android; } +.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } +.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } +.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } +.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } +.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } +.#{$fa-css-prefix}-female:before { content: $fa-var-female; } +.#{$fa-css-prefix}-male:before { content: $fa-var-male; } +.#{$fa-css-prefix}-gittip:before, +.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } +.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } +.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } +.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } +.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } +.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } +.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } +.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } +.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } +.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } +.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } +.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } +.#{$fa-css-prefix}-toggle-left:before, +.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } +.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } +.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } +.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } +.#{$fa-css-prefix}-turkish-lira:before, +.#{$fa-css-prefix}-try:before { content: $fa-var-try; } +.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } +.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } +.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } +.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } +.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } +.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } +.#{$fa-css-prefix}-institution:before, +.#{$fa-css-prefix}-bank:before, +.#{$fa-css-prefix}-university:before { content: $fa-var-university; } +.#{$fa-css-prefix}-mortar-board:before, +.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } +.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } +.#{$fa-css-prefix}-google:before { content: $fa-var-google; } +.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } +.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } +.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } +.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } +.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } +.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } +.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } +.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } +.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } +.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } +.#{$fa-css-prefix}-language:before { content: $fa-var-language; } +.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } +.#{$fa-css-prefix}-building:before { content: $fa-var-building; } +.#{$fa-css-prefix}-child:before { content: $fa-var-child; } +.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } +.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } +.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } +.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } +.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } +.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } +.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } +.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } +.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } +.#{$fa-css-prefix}-automobile:before, +.#{$fa-css-prefix}-car:before { content: $fa-var-car; } +.#{$fa-css-prefix}-cab:before, +.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } +.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } +.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } +.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } +.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } +.#{$fa-css-prefix}-database:before { content: $fa-var-database; } +.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } +.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } +.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } +.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } +.#{$fa-css-prefix}-file-photo-o:before, +.#{$fa-css-prefix}-file-picture-o:before, +.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } +.#{$fa-css-prefix}-file-zip-o:before, +.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } +.#{$fa-css-prefix}-file-sound-o:before, +.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } +.#{$fa-css-prefix}-file-movie-o:before, +.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } +.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } +.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } +.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } +.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } +.#{$fa-css-prefix}-life-bouy:before, +.#{$fa-css-prefix}-life-buoy:before, +.#{$fa-css-prefix}-life-saver:before, +.#{$fa-css-prefix}-support:before, +.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } +.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } +.#{$fa-css-prefix}-ra:before, +.#{$fa-css-prefix}-resistance:before, +.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } +.#{$fa-css-prefix}-ge:before, +.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } +.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } +.#{$fa-css-prefix}-git:before { content: $fa-var-git; } +.#{$fa-css-prefix}-y-combinator-square:before, +.#{$fa-css-prefix}-yc-square:before, +.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } +.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } +.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } +.#{$fa-css-prefix}-wechat:before, +.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } +.#{$fa-css-prefix}-send:before, +.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } +.#{$fa-css-prefix}-send-o:before, +.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } +.#{$fa-css-prefix}-history:before { content: $fa-var-history; } +.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } +.#{$fa-css-prefix}-header:before { content: $fa-var-header; } +.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } +.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } +.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } +.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } +.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } +.#{$fa-css-prefix}-soccer-ball-o:before, +.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } +.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } +.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } +.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } +.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } +.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } +.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } +.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } +.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } +.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } +.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } +.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } +.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } +.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } +.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } +.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } +.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } +.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } +.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } +.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } +.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } +.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } +.#{$fa-css-prefix}-at:before { content: $fa-var-at; } +.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } +.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } +.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } +.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } +.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } +.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } +.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } +.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } +.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } +.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } +.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } +.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } +.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } +.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } +.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } +.#{$fa-css-prefix}-shekel:before, +.#{$fa-css-prefix}-sheqel:before, +.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } +.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } +.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } +.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } +.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } +.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } +.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } +.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } +.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } +.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } +.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } +.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } +.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } +.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } +.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } +.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } +.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } +.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } +.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } +.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } +.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } +.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } +.#{$fa-css-prefix}-intersex:before, +.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } +.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } +.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } +.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } +.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } +.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } +.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } +.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } +.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } +.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } +.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } +.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } +.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } +.#{$fa-css-prefix}-server:before { content: $fa-var-server; } +.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } +.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } +.#{$fa-css-prefix}-hotel:before, +.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } +.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } +.#{$fa-css-prefix}-train:before { content: $fa-var-train; } +.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } +.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } +.#{$fa-css-prefix}-yc:before, +.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } +.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } +.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } +.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } +.#{$fa-css-prefix}-battery-4:before, +.#{$fa-css-prefix}-battery:before, +.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } +.#{$fa-css-prefix}-battery-3:before, +.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } +.#{$fa-css-prefix}-battery-2:before, +.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } +.#{$fa-css-prefix}-battery-1:before, +.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } +.#{$fa-css-prefix}-battery-0:before, +.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } +.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } +.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } +.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } +.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } +.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } +.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } +.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } +.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } +.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } +.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } +.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } +.#{$fa-css-prefix}-hourglass-1:before, +.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } +.#{$fa-css-prefix}-hourglass-2:before, +.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } +.#{$fa-css-prefix}-hourglass-3:before, +.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } +.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } +.#{$fa-css-prefix}-hand-grab-o:before, +.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } +.#{$fa-css-prefix}-hand-stop-o:before, +.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } +.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } +.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } +.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } +.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } +.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } +.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } +.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } +.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } +.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } +.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } +.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } +.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } +.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } +.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } +.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } +.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } +.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } +.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } +.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } +.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } +.#{$fa-css-prefix}-tv:before, +.#{$fa-css-prefix}-television:before { content: $fa-var-television; } +.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } +.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } +.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } +.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } +.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } +.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } +.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } +.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } +.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } +.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } +.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } +.#{$fa-css-prefix}-map:before { content: $fa-var-map; } +.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } +.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } +.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } +.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } +.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } +.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } +.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } +.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } +.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } +.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } +.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } +.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } +.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } +.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } +.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } +.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } +.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } +.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } +.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } +.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } +.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } +.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } +.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } +.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } +.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } +.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } +.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } +.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } +.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } +.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } +.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } +.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } +.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } +.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } +.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } +.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } +.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } +.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } +.#{$fa-css-prefix}-asl-interpreting:before, +.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } +.#{$fa-css-prefix}-deafness:before, +.#{$fa-css-prefix}-hard-of-hearing:before, +.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } +.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } +.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } +.#{$fa-css-prefix}-signing:before, +.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } +.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } +.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } +.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } +.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } +.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } +.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } +.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } +.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } +.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } +.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } +.#{$fa-css-prefix}-google-plus-circle:before, +.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } +.#{$fa-css-prefix}-fa:before, +.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } +.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } +.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } +.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } +.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } +.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } +.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } +.#{$fa-css-prefix}-vcard:before, +.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } +.#{$fa-css-prefix}-vcard-o:before, +.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } +.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } +.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } +.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } +.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } +.#{$fa-css-prefix}-drivers-license:before, +.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } +.#{$fa-css-prefix}-drivers-license-o:before, +.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } +.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } +.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } +.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } +.#{$fa-css-prefix}-thermometer-4:before, +.#{$fa-css-prefix}-thermometer:before, +.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } +.#{$fa-css-prefix}-thermometer-3:before, +.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } +.#{$fa-css-prefix}-thermometer-2:before, +.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } +.#{$fa-css-prefix}-thermometer-1:before, +.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } +.#{$fa-css-prefix}-thermometer-0:before, +.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } +.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } +.#{$fa-css-prefix}-bathtub:before, +.#{$fa-css-prefix}-s15:before, +.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } +.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } +.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } +.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } +.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } +.#{$fa-css-prefix}-times-rectangle:before, +.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } +.#{$fa-css-prefix}-times-rectangle-o:before, +.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } +.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } +.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } +.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } +.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } +.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } +.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } +.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } +.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } +.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } +.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } +.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss new file mode 100644 index 0000000000..41e9a8184a --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss @@ -0,0 +1,13 @@ +// Icon Sizes +// ------------------------- + +/* makes the font 33% larger relative to the icon container */ +.#{$fa-css-prefix}-lg { + font-size: (4em / 3); + line-height: (3em / 4); + vertical-align: -15%; +} +.#{$fa-css-prefix}-2x { font-size: 2em; } +.#{$fa-css-prefix}-3x { font-size: 3em; } +.#{$fa-css-prefix}-4x { font-size: 4em; } +.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss new file mode 100644 index 0000000000..7d1e4d54d6 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss @@ -0,0 +1,19 @@ +// List Icons +// ------------------------- + +.#{$fa-css-prefix}-ul { + padding-left: 0; + margin-left: $fa-li-width; + list-style-type: none; + > li { position: relative; } +} +.#{$fa-css-prefix}-li { + position: absolute; + left: -$fa-li-width; + width: $fa-li-width; + top: (2em / 14); + text-align: center; + &.#{$fa-css-prefix}-lg { + left: -$fa-li-width + (4em / 14); + } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss new file mode 100644 index 0000000000..c3bbd5745d --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss @@ -0,0 +1,60 @@ +// Mixins +// -------------------------- + +@mixin fa-icon() { + display: inline-block; + font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration + font-size: inherit; // can't have font-size inherit on line above, so need to override + text-rendering: auto; // optimizelegibility throws things off #1094 + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} + +@mixin fa-icon-rotate($degrees, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; + -webkit-transform: rotate($degrees); + -ms-transform: rotate($degrees); + transform: rotate($degrees); +} + +@mixin fa-icon-flip($horiz, $vert, $rotation) { + -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; + -webkit-transform: scale($horiz, $vert); + -ms-transform: scale($horiz, $vert); + transform: scale($horiz, $vert); +} + + +// Only display content to screen readers. A la Bootstrap 4. +// +// See: http://a11yproject.com/posts/how-to-hide-content/ + +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0,0,0,0); + border: 0; +} + +// Use in conjunction with .sr-only to only display content when it's focused. +// +// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 +// +// Credit: HTML5 Boilerplate + +@mixin sr-only-focusable { + &:active, + &:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; + } +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss new file mode 100644 index 0000000000..bb457c23a8 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss @@ -0,0 +1,15 @@ +/* FONT PATH + * -------------------------- */ + +@font-face { + font-family: 'FontAwesome'; + src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); + src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), + url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), + url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), + url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), + url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); +// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts + font-weight: normal; + font-style: normal; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss new file mode 100644 index 0000000000..a3558fd09c --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss @@ -0,0 +1,20 @@ +// Rotated & Flipped Icons +// ------------------------- + +.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } +.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } +.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } + +.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } +.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } + +// Hook for IE8-9 +// ------------------------- + +:root .#{$fa-css-prefix}-rotate-90, +:root .#{$fa-css-prefix}-rotate-180, +:root .#{$fa-css-prefix}-rotate-270, +:root .#{$fa-css-prefix}-flip-horizontal, +:root .#{$fa-css-prefix}-flip-vertical { + filter: none; +} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss new file mode 100644 index 0000000000..637426f0da --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss @@ -0,0 +1,5 @@ +// Screen Readers +// ------------------------- + +.sr-only { @include sr-only(); } +.sr-only-focusable { @include sr-only-focusable(); } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss new file mode 100644 index 0000000000..aef7403660 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss @@ -0,0 +1,20 @@ +// Stacked Icons +// ------------------------- + +.#{$fa-css-prefix}-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.#{$fa-css-prefix}-stack-1x { line-height: inherit; } +.#{$fa-css-prefix}-stack-2x { font-size: 2em; } +.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss new file mode 100644 index 0000000000..498fc4a087 --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss @@ -0,0 +1,800 @@ +// Variables +// -------------------------- + +$fa-font-path: "../fonts" !default; +$fa-font-size-base: 14px !default; +$fa-line-height-base: 1 !default; +//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly +$fa-css-prefix: fa !default; +$fa-version: "4.7.0" !default; +$fa-border-color: #eee !default; +$fa-inverse: #fff !default; +$fa-li-width: (30em / 14) !default; + +$fa-var-500px: "\f26e"; +$fa-var-address-book: "\f2b9"; +$fa-var-address-book-o: "\f2ba"; +$fa-var-address-card: "\f2bb"; +$fa-var-address-card-o: "\f2bc"; +$fa-var-adjust: "\f042"; +$fa-var-adn: "\f170"; +$fa-var-align-center: "\f037"; +$fa-var-align-justify: "\f039"; +$fa-var-align-left: "\f036"; +$fa-var-align-right: "\f038"; +$fa-var-amazon: "\f270"; +$fa-var-ambulance: "\f0f9"; +$fa-var-american-sign-language-interpreting: "\f2a3"; +$fa-var-anchor: "\f13d"; +$fa-var-android: "\f17b"; +$fa-var-angellist: "\f209"; +$fa-var-angle-double-down: "\f103"; +$fa-var-angle-double-left: "\f100"; +$fa-var-angle-double-right: "\f101"; +$fa-var-angle-double-up: "\f102"; +$fa-var-angle-down: "\f107"; +$fa-var-angle-left: "\f104"; +$fa-var-angle-right: "\f105"; +$fa-var-angle-up: "\f106"; +$fa-var-apple: "\f179"; +$fa-var-archive: "\f187"; +$fa-var-area-chart: "\f1fe"; +$fa-var-arrow-circle-down: "\f0ab"; +$fa-var-arrow-circle-left: "\f0a8"; +$fa-var-arrow-circle-o-down: "\f01a"; +$fa-var-arrow-circle-o-left: "\f190"; +$fa-var-arrow-circle-o-right: "\f18e"; +$fa-var-arrow-circle-o-up: "\f01b"; +$fa-var-arrow-circle-right: "\f0a9"; +$fa-var-arrow-circle-up: "\f0aa"; +$fa-var-arrow-down: "\f063"; +$fa-var-arrow-left: "\f060"; +$fa-var-arrow-right: "\f061"; +$fa-var-arrow-up: "\f062"; +$fa-var-arrows: "\f047"; +$fa-var-arrows-alt: "\f0b2"; +$fa-var-arrows-h: "\f07e"; +$fa-var-arrows-v: "\f07d"; +$fa-var-asl-interpreting: "\f2a3"; +$fa-var-assistive-listening-systems: "\f2a2"; +$fa-var-asterisk: "\f069"; +$fa-var-at: "\f1fa"; +$fa-var-audio-description: "\f29e"; +$fa-var-automobile: "\f1b9"; +$fa-var-backward: "\f04a"; +$fa-var-balance-scale: "\f24e"; +$fa-var-ban: "\f05e"; +$fa-var-bandcamp: "\f2d5"; +$fa-var-bank: "\f19c"; +$fa-var-bar-chart: "\f080"; +$fa-var-bar-chart-o: "\f080"; +$fa-var-barcode: "\f02a"; +$fa-var-bars: "\f0c9"; +$fa-var-bath: "\f2cd"; +$fa-var-bathtub: "\f2cd"; +$fa-var-battery: "\f240"; +$fa-var-battery-0: "\f244"; +$fa-var-battery-1: "\f243"; +$fa-var-battery-2: "\f242"; +$fa-var-battery-3: "\f241"; +$fa-var-battery-4: "\f240"; +$fa-var-battery-empty: "\f244"; +$fa-var-battery-full: "\f240"; +$fa-var-battery-half: "\f242"; +$fa-var-battery-quarter: "\f243"; +$fa-var-battery-three-quarters: "\f241"; +$fa-var-bed: "\f236"; +$fa-var-beer: "\f0fc"; +$fa-var-behance: "\f1b4"; +$fa-var-behance-square: "\f1b5"; +$fa-var-bell: "\f0f3"; +$fa-var-bell-o: "\f0a2"; +$fa-var-bell-slash: "\f1f6"; +$fa-var-bell-slash-o: "\f1f7"; +$fa-var-bicycle: "\f206"; +$fa-var-binoculars: "\f1e5"; +$fa-var-birthday-cake: "\f1fd"; +$fa-var-bitbucket: "\f171"; +$fa-var-bitbucket-square: "\f172"; +$fa-var-bitcoin: "\f15a"; +$fa-var-black-tie: "\f27e"; +$fa-var-blind: "\f29d"; +$fa-var-bluetooth: "\f293"; +$fa-var-bluetooth-b: "\f294"; +$fa-var-bold: "\f032"; +$fa-var-bolt: "\f0e7"; +$fa-var-bomb: "\f1e2"; +$fa-var-book: "\f02d"; +$fa-var-bookmark: "\f02e"; +$fa-var-bookmark-o: "\f097"; +$fa-var-braille: "\f2a1"; +$fa-var-briefcase: "\f0b1"; +$fa-var-btc: "\f15a"; +$fa-var-bug: "\f188"; +$fa-var-building: "\f1ad"; +$fa-var-building-o: "\f0f7"; +$fa-var-bullhorn: "\f0a1"; +$fa-var-bullseye: "\f140"; +$fa-var-bus: "\f207"; +$fa-var-buysellads: "\f20d"; +$fa-var-cab: "\f1ba"; +$fa-var-calculator: "\f1ec"; +$fa-var-calendar: "\f073"; +$fa-var-calendar-check-o: "\f274"; +$fa-var-calendar-minus-o: "\f272"; +$fa-var-calendar-o: "\f133"; +$fa-var-calendar-plus-o: "\f271"; +$fa-var-calendar-times-o: "\f273"; +$fa-var-camera: "\f030"; +$fa-var-camera-retro: "\f083"; +$fa-var-car: "\f1b9"; +$fa-var-caret-down: "\f0d7"; +$fa-var-caret-left: "\f0d9"; +$fa-var-caret-right: "\f0da"; +$fa-var-caret-square-o-down: "\f150"; +$fa-var-caret-square-o-left: "\f191"; +$fa-var-caret-square-o-right: "\f152"; +$fa-var-caret-square-o-up: "\f151"; +$fa-var-caret-up: "\f0d8"; +$fa-var-cart-arrow-down: "\f218"; +$fa-var-cart-plus: "\f217"; +$fa-var-cc: "\f20a"; +$fa-var-cc-amex: "\f1f3"; +$fa-var-cc-diners-club: "\f24c"; +$fa-var-cc-discover: "\f1f2"; +$fa-var-cc-jcb: "\f24b"; +$fa-var-cc-mastercard: "\f1f1"; +$fa-var-cc-paypal: "\f1f4"; +$fa-var-cc-stripe: "\f1f5"; +$fa-var-cc-visa: "\f1f0"; +$fa-var-certificate: "\f0a3"; +$fa-var-chain: "\f0c1"; +$fa-var-chain-broken: "\f127"; +$fa-var-check: "\f00c"; +$fa-var-check-circle: "\f058"; +$fa-var-check-circle-o: "\f05d"; +$fa-var-check-square: "\f14a"; +$fa-var-check-square-o: "\f046"; +$fa-var-chevron-circle-down: "\f13a"; +$fa-var-chevron-circle-left: "\f137"; +$fa-var-chevron-circle-right: "\f138"; +$fa-var-chevron-circle-up: "\f139"; +$fa-var-chevron-down: "\f078"; +$fa-var-chevron-left: "\f053"; +$fa-var-chevron-right: "\f054"; +$fa-var-chevron-up: "\f077"; +$fa-var-child: "\f1ae"; +$fa-var-chrome: "\f268"; +$fa-var-circle: "\f111"; +$fa-var-circle-o: "\f10c"; +$fa-var-circle-o-notch: "\f1ce"; +$fa-var-circle-thin: "\f1db"; +$fa-var-clipboard: "\f0ea"; +$fa-var-clock-o: "\f017"; +$fa-var-clone: "\f24d"; +$fa-var-close: "\f00d"; +$fa-var-cloud: "\f0c2"; +$fa-var-cloud-download: "\f0ed"; +$fa-var-cloud-upload: "\f0ee"; +$fa-var-cny: "\f157"; +$fa-var-code: "\f121"; +$fa-var-code-fork: "\f126"; +$fa-var-codepen: "\f1cb"; +$fa-var-codiepie: "\f284"; +$fa-var-coffee: "\f0f4"; +$fa-var-cog: "\f013"; +$fa-var-cogs: "\f085"; +$fa-var-columns: "\f0db"; +$fa-var-comment: "\f075"; +$fa-var-comment-o: "\f0e5"; +$fa-var-commenting: "\f27a"; +$fa-var-commenting-o: "\f27b"; +$fa-var-comments: "\f086"; +$fa-var-comments-o: "\f0e6"; +$fa-var-compass: "\f14e"; +$fa-var-compress: "\f066"; +$fa-var-connectdevelop: "\f20e"; +$fa-var-contao: "\f26d"; +$fa-var-copy: "\f0c5"; +$fa-var-copyright: "\f1f9"; +$fa-var-creative-commons: "\f25e"; +$fa-var-credit-card: "\f09d"; +$fa-var-credit-card-alt: "\f283"; +$fa-var-crop: "\f125"; +$fa-var-crosshairs: "\f05b"; +$fa-var-css3: "\f13c"; +$fa-var-cube: "\f1b2"; +$fa-var-cubes: "\f1b3"; +$fa-var-cut: "\f0c4"; +$fa-var-cutlery: "\f0f5"; +$fa-var-dashboard: "\f0e4"; +$fa-var-dashcube: "\f210"; +$fa-var-database: "\f1c0"; +$fa-var-deaf: "\f2a4"; +$fa-var-deafness: "\f2a4"; +$fa-var-dedent: "\f03b"; +$fa-var-delicious: "\f1a5"; +$fa-var-desktop: "\f108"; +$fa-var-deviantart: "\f1bd"; +$fa-var-diamond: "\f219"; +$fa-var-digg: "\f1a6"; +$fa-var-dollar: "\f155"; +$fa-var-dot-circle-o: "\f192"; +$fa-var-download: "\f019"; +$fa-var-dribbble: "\f17d"; +$fa-var-drivers-license: "\f2c2"; +$fa-var-drivers-license-o: "\f2c3"; +$fa-var-dropbox: "\f16b"; +$fa-var-drupal: "\f1a9"; +$fa-var-edge: "\f282"; +$fa-var-edit: "\f044"; +$fa-var-eercast: "\f2da"; +$fa-var-eject: "\f052"; +$fa-var-ellipsis-h: "\f141"; +$fa-var-ellipsis-v: "\f142"; +$fa-var-empire: "\f1d1"; +$fa-var-envelope: "\f0e0"; +$fa-var-envelope-o: "\f003"; +$fa-var-envelope-open: "\f2b6"; +$fa-var-envelope-open-o: "\f2b7"; +$fa-var-envelope-square: "\f199"; +$fa-var-envira: "\f299"; +$fa-var-eraser: "\f12d"; +$fa-var-etsy: "\f2d7"; +$fa-var-eur: "\f153"; +$fa-var-euro: "\f153"; +$fa-var-exchange: "\f0ec"; +$fa-var-exclamation: "\f12a"; +$fa-var-exclamation-circle: "\f06a"; +$fa-var-exclamation-triangle: "\f071"; +$fa-var-expand: "\f065"; +$fa-var-expeditedssl: "\f23e"; +$fa-var-external-link: "\f08e"; +$fa-var-external-link-square: "\f14c"; +$fa-var-eye: "\f06e"; +$fa-var-eye-slash: "\f070"; +$fa-var-eyedropper: "\f1fb"; +$fa-var-fa: "\f2b4"; +$fa-var-facebook: "\f09a"; +$fa-var-facebook-f: "\f09a"; +$fa-var-facebook-official: "\f230"; +$fa-var-facebook-square: "\f082"; +$fa-var-fast-backward: "\f049"; +$fa-var-fast-forward: "\f050"; +$fa-var-fax: "\f1ac"; +$fa-var-feed: "\f09e"; +$fa-var-female: "\f182"; +$fa-var-fighter-jet: "\f0fb"; +$fa-var-file: "\f15b"; +$fa-var-file-archive-o: "\f1c6"; +$fa-var-file-audio-o: "\f1c7"; +$fa-var-file-code-o: "\f1c9"; +$fa-var-file-excel-o: "\f1c3"; +$fa-var-file-image-o: "\f1c5"; +$fa-var-file-movie-o: "\f1c8"; +$fa-var-file-o: "\f016"; +$fa-var-file-pdf-o: "\f1c1"; +$fa-var-file-photo-o: "\f1c5"; +$fa-var-file-picture-o: "\f1c5"; +$fa-var-file-powerpoint-o: "\f1c4"; +$fa-var-file-sound-o: "\f1c7"; +$fa-var-file-text: "\f15c"; +$fa-var-file-text-o: "\f0f6"; +$fa-var-file-video-o: "\f1c8"; +$fa-var-file-word-o: "\f1c2"; +$fa-var-file-zip-o: "\f1c6"; +$fa-var-files-o: "\f0c5"; +$fa-var-film: "\f008"; +$fa-var-filter: "\f0b0"; +$fa-var-fire: "\f06d"; +$fa-var-fire-extinguisher: "\f134"; +$fa-var-firefox: "\f269"; +$fa-var-first-order: "\f2b0"; +$fa-var-flag: "\f024"; +$fa-var-flag-checkered: "\f11e"; +$fa-var-flag-o: "\f11d"; +$fa-var-flash: "\f0e7"; +$fa-var-flask: "\f0c3"; +$fa-var-flickr: "\f16e"; +$fa-var-floppy-o: "\f0c7"; +$fa-var-folder: "\f07b"; +$fa-var-folder-o: "\f114"; +$fa-var-folder-open: "\f07c"; +$fa-var-folder-open-o: "\f115"; +$fa-var-font: "\f031"; +$fa-var-font-awesome: "\f2b4"; +$fa-var-fonticons: "\f280"; +$fa-var-fort-awesome: "\f286"; +$fa-var-forumbee: "\f211"; +$fa-var-forward: "\f04e"; +$fa-var-foursquare: "\f180"; +$fa-var-free-code-camp: "\f2c5"; +$fa-var-frown-o: "\f119"; +$fa-var-futbol-o: "\f1e3"; +$fa-var-gamepad: "\f11b"; +$fa-var-gavel: "\f0e3"; +$fa-var-gbp: "\f154"; +$fa-var-ge: "\f1d1"; +$fa-var-gear: "\f013"; +$fa-var-gears: "\f085"; +$fa-var-genderless: "\f22d"; +$fa-var-get-pocket: "\f265"; +$fa-var-gg: "\f260"; +$fa-var-gg-circle: "\f261"; +$fa-var-gift: "\f06b"; +$fa-var-git: "\f1d3"; +$fa-var-git-square: "\f1d2"; +$fa-var-github: "\f09b"; +$fa-var-github-alt: "\f113"; +$fa-var-github-square: "\f092"; +$fa-var-gitlab: "\f296"; +$fa-var-gittip: "\f184"; +$fa-var-glass: "\f000"; +$fa-var-glide: "\f2a5"; +$fa-var-glide-g: "\f2a6"; +$fa-var-globe: "\f0ac"; +$fa-var-google: "\f1a0"; +$fa-var-google-plus: "\f0d5"; +$fa-var-google-plus-circle: "\f2b3"; +$fa-var-google-plus-official: "\f2b3"; +$fa-var-google-plus-square: "\f0d4"; +$fa-var-google-wallet: "\f1ee"; +$fa-var-graduation-cap: "\f19d"; +$fa-var-gratipay: "\f184"; +$fa-var-grav: "\f2d6"; +$fa-var-group: "\f0c0"; +$fa-var-h-square: "\f0fd"; +$fa-var-hacker-news: "\f1d4"; +$fa-var-hand-grab-o: "\f255"; +$fa-var-hand-lizard-o: "\f258"; +$fa-var-hand-o-down: "\f0a7"; +$fa-var-hand-o-left: "\f0a5"; +$fa-var-hand-o-right: "\f0a4"; +$fa-var-hand-o-up: "\f0a6"; +$fa-var-hand-paper-o: "\f256"; +$fa-var-hand-peace-o: "\f25b"; +$fa-var-hand-pointer-o: "\f25a"; +$fa-var-hand-rock-o: "\f255"; +$fa-var-hand-scissors-o: "\f257"; +$fa-var-hand-spock-o: "\f259"; +$fa-var-hand-stop-o: "\f256"; +$fa-var-handshake-o: "\f2b5"; +$fa-var-hard-of-hearing: "\f2a4"; +$fa-var-hashtag: "\f292"; +$fa-var-hdd-o: "\f0a0"; +$fa-var-header: "\f1dc"; +$fa-var-headphones: "\f025"; +$fa-var-heart: "\f004"; +$fa-var-heart-o: "\f08a"; +$fa-var-heartbeat: "\f21e"; +$fa-var-history: "\f1da"; +$fa-var-home: "\f015"; +$fa-var-hospital-o: "\f0f8"; +$fa-var-hotel: "\f236"; +$fa-var-hourglass: "\f254"; +$fa-var-hourglass-1: "\f251"; +$fa-var-hourglass-2: "\f252"; +$fa-var-hourglass-3: "\f253"; +$fa-var-hourglass-end: "\f253"; +$fa-var-hourglass-half: "\f252"; +$fa-var-hourglass-o: "\f250"; +$fa-var-hourglass-start: "\f251"; +$fa-var-houzz: "\f27c"; +$fa-var-html5: "\f13b"; +$fa-var-i-cursor: "\f246"; +$fa-var-id-badge: "\f2c1"; +$fa-var-id-card: "\f2c2"; +$fa-var-id-card-o: "\f2c3"; +$fa-var-ils: "\f20b"; +$fa-var-image: "\f03e"; +$fa-var-imdb: "\f2d8"; +$fa-var-inbox: "\f01c"; +$fa-var-indent: "\f03c"; +$fa-var-industry: "\f275"; +$fa-var-info: "\f129"; +$fa-var-info-circle: "\f05a"; +$fa-var-inr: "\f156"; +$fa-var-instagram: "\f16d"; +$fa-var-institution: "\f19c"; +$fa-var-internet-explorer: "\f26b"; +$fa-var-intersex: "\f224"; +$fa-var-ioxhost: "\f208"; +$fa-var-italic: "\f033"; +$fa-var-joomla: "\f1aa"; +$fa-var-jpy: "\f157"; +$fa-var-jsfiddle: "\f1cc"; +$fa-var-key: "\f084"; +$fa-var-keyboard-o: "\f11c"; +$fa-var-krw: "\f159"; +$fa-var-language: "\f1ab"; +$fa-var-laptop: "\f109"; +$fa-var-lastfm: "\f202"; +$fa-var-lastfm-square: "\f203"; +$fa-var-leaf: "\f06c"; +$fa-var-leanpub: "\f212"; +$fa-var-legal: "\f0e3"; +$fa-var-lemon-o: "\f094"; +$fa-var-level-down: "\f149"; +$fa-var-level-up: "\f148"; +$fa-var-life-bouy: "\f1cd"; +$fa-var-life-buoy: "\f1cd"; +$fa-var-life-ring: "\f1cd"; +$fa-var-life-saver: "\f1cd"; +$fa-var-lightbulb-o: "\f0eb"; +$fa-var-line-chart: "\f201"; +$fa-var-link: "\f0c1"; +$fa-var-linkedin: "\f0e1"; +$fa-var-linkedin-square: "\f08c"; +$fa-var-linode: "\f2b8"; +$fa-var-linux: "\f17c"; +$fa-var-list: "\f03a"; +$fa-var-list-alt: "\f022"; +$fa-var-list-ol: "\f0cb"; +$fa-var-list-ul: "\f0ca"; +$fa-var-location-arrow: "\f124"; +$fa-var-lock: "\f023"; +$fa-var-long-arrow-down: "\f175"; +$fa-var-long-arrow-left: "\f177"; +$fa-var-long-arrow-right: "\f178"; +$fa-var-long-arrow-up: "\f176"; +$fa-var-low-vision: "\f2a8"; +$fa-var-magic: "\f0d0"; +$fa-var-magnet: "\f076"; +$fa-var-mail-forward: "\f064"; +$fa-var-mail-reply: "\f112"; +$fa-var-mail-reply-all: "\f122"; +$fa-var-male: "\f183"; +$fa-var-map: "\f279"; +$fa-var-map-marker: "\f041"; +$fa-var-map-o: "\f278"; +$fa-var-map-pin: "\f276"; +$fa-var-map-signs: "\f277"; +$fa-var-mars: "\f222"; +$fa-var-mars-double: "\f227"; +$fa-var-mars-stroke: "\f229"; +$fa-var-mars-stroke-h: "\f22b"; +$fa-var-mars-stroke-v: "\f22a"; +$fa-var-maxcdn: "\f136"; +$fa-var-meanpath: "\f20c"; +$fa-var-medium: "\f23a"; +$fa-var-medkit: "\f0fa"; +$fa-var-meetup: "\f2e0"; +$fa-var-meh-o: "\f11a"; +$fa-var-mercury: "\f223"; +$fa-var-microchip: "\f2db"; +$fa-var-microphone: "\f130"; +$fa-var-microphone-slash: "\f131"; +$fa-var-minus: "\f068"; +$fa-var-minus-circle: "\f056"; +$fa-var-minus-square: "\f146"; +$fa-var-minus-square-o: "\f147"; +$fa-var-mixcloud: "\f289"; +$fa-var-mobile: "\f10b"; +$fa-var-mobile-phone: "\f10b"; +$fa-var-modx: "\f285"; +$fa-var-money: "\f0d6"; +$fa-var-moon-o: "\f186"; +$fa-var-mortar-board: "\f19d"; +$fa-var-motorcycle: "\f21c"; +$fa-var-mouse-pointer: "\f245"; +$fa-var-music: "\f001"; +$fa-var-navicon: "\f0c9"; +$fa-var-neuter: "\f22c"; +$fa-var-newspaper-o: "\f1ea"; +$fa-var-object-group: "\f247"; +$fa-var-object-ungroup: "\f248"; +$fa-var-odnoklassniki: "\f263"; +$fa-var-odnoklassniki-square: "\f264"; +$fa-var-opencart: "\f23d"; +$fa-var-openid: "\f19b"; +$fa-var-opera: "\f26a"; +$fa-var-optin-monster: "\f23c"; +$fa-var-outdent: "\f03b"; +$fa-var-pagelines: "\f18c"; +$fa-var-paint-brush: "\f1fc"; +$fa-var-paper-plane: "\f1d8"; +$fa-var-paper-plane-o: "\f1d9"; +$fa-var-paperclip: "\f0c6"; +$fa-var-paragraph: "\f1dd"; +$fa-var-paste: "\f0ea"; +$fa-var-pause: "\f04c"; +$fa-var-pause-circle: "\f28b"; +$fa-var-pause-circle-o: "\f28c"; +$fa-var-paw: "\f1b0"; +$fa-var-paypal: "\f1ed"; +$fa-var-pencil: "\f040"; +$fa-var-pencil-square: "\f14b"; +$fa-var-pencil-square-o: "\f044"; +$fa-var-percent: "\f295"; +$fa-var-phone: "\f095"; +$fa-var-phone-square: "\f098"; +$fa-var-photo: "\f03e"; +$fa-var-picture-o: "\f03e"; +$fa-var-pie-chart: "\f200"; +$fa-var-pied-piper: "\f2ae"; +$fa-var-pied-piper-alt: "\f1a8"; +$fa-var-pied-piper-pp: "\f1a7"; +$fa-var-pinterest: "\f0d2"; +$fa-var-pinterest-p: "\f231"; +$fa-var-pinterest-square: "\f0d3"; +$fa-var-plane: "\f072"; +$fa-var-play: "\f04b"; +$fa-var-play-circle: "\f144"; +$fa-var-play-circle-o: "\f01d"; +$fa-var-plug: "\f1e6"; +$fa-var-plus: "\f067"; +$fa-var-plus-circle: "\f055"; +$fa-var-plus-square: "\f0fe"; +$fa-var-plus-square-o: "\f196"; +$fa-var-podcast: "\f2ce"; +$fa-var-power-off: "\f011"; +$fa-var-print: "\f02f"; +$fa-var-product-hunt: "\f288"; +$fa-var-puzzle-piece: "\f12e"; +$fa-var-qq: "\f1d6"; +$fa-var-qrcode: "\f029"; +$fa-var-question: "\f128"; +$fa-var-question-circle: "\f059"; +$fa-var-question-circle-o: "\f29c"; +$fa-var-quora: "\f2c4"; +$fa-var-quote-left: "\f10d"; +$fa-var-quote-right: "\f10e"; +$fa-var-ra: "\f1d0"; +$fa-var-random: "\f074"; +$fa-var-ravelry: "\f2d9"; +$fa-var-rebel: "\f1d0"; +$fa-var-recycle: "\f1b8"; +$fa-var-reddit: "\f1a1"; +$fa-var-reddit-alien: "\f281"; +$fa-var-reddit-square: "\f1a2"; +$fa-var-refresh: "\f021"; +$fa-var-registered: "\f25d"; +$fa-var-remove: "\f00d"; +$fa-var-renren: "\f18b"; +$fa-var-reorder: "\f0c9"; +$fa-var-repeat: "\f01e"; +$fa-var-reply: "\f112"; +$fa-var-reply-all: "\f122"; +$fa-var-resistance: "\f1d0"; +$fa-var-retweet: "\f079"; +$fa-var-rmb: "\f157"; +$fa-var-road: "\f018"; +$fa-var-rocket: "\f135"; +$fa-var-rotate-left: "\f0e2"; +$fa-var-rotate-right: "\f01e"; +$fa-var-rouble: "\f158"; +$fa-var-rss: "\f09e"; +$fa-var-rss-square: "\f143"; +$fa-var-rub: "\f158"; +$fa-var-ruble: "\f158"; +$fa-var-rupee: "\f156"; +$fa-var-s15: "\f2cd"; +$fa-var-safari: "\f267"; +$fa-var-save: "\f0c7"; +$fa-var-scissors: "\f0c4"; +$fa-var-scribd: "\f28a"; +$fa-var-search: "\f002"; +$fa-var-search-minus: "\f010"; +$fa-var-search-plus: "\f00e"; +$fa-var-sellsy: "\f213"; +$fa-var-send: "\f1d8"; +$fa-var-send-o: "\f1d9"; +$fa-var-server: "\f233"; +$fa-var-share: "\f064"; +$fa-var-share-alt: "\f1e0"; +$fa-var-share-alt-square: "\f1e1"; +$fa-var-share-square: "\f14d"; +$fa-var-share-square-o: "\f045"; +$fa-var-shekel: "\f20b"; +$fa-var-sheqel: "\f20b"; +$fa-var-shield: "\f132"; +$fa-var-ship: "\f21a"; +$fa-var-shirtsinbulk: "\f214"; +$fa-var-shopping-bag: "\f290"; +$fa-var-shopping-basket: "\f291"; +$fa-var-shopping-cart: "\f07a"; +$fa-var-shower: "\f2cc"; +$fa-var-sign-in: "\f090"; +$fa-var-sign-language: "\f2a7"; +$fa-var-sign-out: "\f08b"; +$fa-var-signal: "\f012"; +$fa-var-signing: "\f2a7"; +$fa-var-simplybuilt: "\f215"; +$fa-var-sitemap: "\f0e8"; +$fa-var-skyatlas: "\f216"; +$fa-var-skype: "\f17e"; +$fa-var-slack: "\f198"; +$fa-var-sliders: "\f1de"; +$fa-var-slideshare: "\f1e7"; +$fa-var-smile-o: "\f118"; +$fa-var-snapchat: "\f2ab"; +$fa-var-snapchat-ghost: "\f2ac"; +$fa-var-snapchat-square: "\f2ad"; +$fa-var-snowflake-o: "\f2dc"; +$fa-var-soccer-ball-o: "\f1e3"; +$fa-var-sort: "\f0dc"; +$fa-var-sort-alpha-asc: "\f15d"; +$fa-var-sort-alpha-desc: "\f15e"; +$fa-var-sort-amount-asc: "\f160"; +$fa-var-sort-amount-desc: "\f161"; +$fa-var-sort-asc: "\f0de"; +$fa-var-sort-desc: "\f0dd"; +$fa-var-sort-down: "\f0dd"; +$fa-var-sort-numeric-asc: "\f162"; +$fa-var-sort-numeric-desc: "\f163"; +$fa-var-sort-up: "\f0de"; +$fa-var-soundcloud: "\f1be"; +$fa-var-space-shuttle: "\f197"; +$fa-var-spinner: "\f110"; +$fa-var-spoon: "\f1b1"; +$fa-var-spotify: "\f1bc"; +$fa-var-square: "\f0c8"; +$fa-var-square-o: "\f096"; +$fa-var-stack-exchange: "\f18d"; +$fa-var-stack-overflow: "\f16c"; +$fa-var-star: "\f005"; +$fa-var-star-half: "\f089"; +$fa-var-star-half-empty: "\f123"; +$fa-var-star-half-full: "\f123"; +$fa-var-star-half-o: "\f123"; +$fa-var-star-o: "\f006"; +$fa-var-steam: "\f1b6"; +$fa-var-steam-square: "\f1b7"; +$fa-var-step-backward: "\f048"; +$fa-var-step-forward: "\f051"; +$fa-var-stethoscope: "\f0f1"; +$fa-var-sticky-note: "\f249"; +$fa-var-sticky-note-o: "\f24a"; +$fa-var-stop: "\f04d"; +$fa-var-stop-circle: "\f28d"; +$fa-var-stop-circle-o: "\f28e"; +$fa-var-street-view: "\f21d"; +$fa-var-strikethrough: "\f0cc"; +$fa-var-stumbleupon: "\f1a4"; +$fa-var-stumbleupon-circle: "\f1a3"; +$fa-var-subscript: "\f12c"; +$fa-var-subway: "\f239"; +$fa-var-suitcase: "\f0f2"; +$fa-var-sun-o: "\f185"; +$fa-var-superpowers: "\f2dd"; +$fa-var-superscript: "\f12b"; +$fa-var-support: "\f1cd"; +$fa-var-table: "\f0ce"; +$fa-var-tablet: "\f10a"; +$fa-var-tachometer: "\f0e4"; +$fa-var-tag: "\f02b"; +$fa-var-tags: "\f02c"; +$fa-var-tasks: "\f0ae"; +$fa-var-taxi: "\f1ba"; +$fa-var-telegram: "\f2c6"; +$fa-var-television: "\f26c"; +$fa-var-tencent-weibo: "\f1d5"; +$fa-var-terminal: "\f120"; +$fa-var-text-height: "\f034"; +$fa-var-text-width: "\f035"; +$fa-var-th: "\f00a"; +$fa-var-th-large: "\f009"; +$fa-var-th-list: "\f00b"; +$fa-var-themeisle: "\f2b2"; +$fa-var-thermometer: "\f2c7"; +$fa-var-thermometer-0: "\f2cb"; +$fa-var-thermometer-1: "\f2ca"; +$fa-var-thermometer-2: "\f2c9"; +$fa-var-thermometer-3: "\f2c8"; +$fa-var-thermometer-4: "\f2c7"; +$fa-var-thermometer-empty: "\f2cb"; +$fa-var-thermometer-full: "\f2c7"; +$fa-var-thermometer-half: "\f2c9"; +$fa-var-thermometer-quarter: "\f2ca"; +$fa-var-thermometer-three-quarters: "\f2c8"; +$fa-var-thumb-tack: "\f08d"; +$fa-var-thumbs-down: "\f165"; +$fa-var-thumbs-o-down: "\f088"; +$fa-var-thumbs-o-up: "\f087"; +$fa-var-thumbs-up: "\f164"; +$fa-var-ticket: "\f145"; +$fa-var-times: "\f00d"; +$fa-var-times-circle: "\f057"; +$fa-var-times-circle-o: "\f05c"; +$fa-var-times-rectangle: "\f2d3"; +$fa-var-times-rectangle-o: "\f2d4"; +$fa-var-tint: "\f043"; +$fa-var-toggle-down: "\f150"; +$fa-var-toggle-left: "\f191"; +$fa-var-toggle-off: "\f204"; +$fa-var-toggle-on: "\f205"; +$fa-var-toggle-right: "\f152"; +$fa-var-toggle-up: "\f151"; +$fa-var-trademark: "\f25c"; +$fa-var-train: "\f238"; +$fa-var-transgender: "\f224"; +$fa-var-transgender-alt: "\f225"; +$fa-var-trash: "\f1f8"; +$fa-var-trash-o: "\f014"; +$fa-var-tree: "\f1bb"; +$fa-var-trello: "\f181"; +$fa-var-tripadvisor: "\f262"; +$fa-var-trophy: "\f091"; +$fa-var-truck: "\f0d1"; +$fa-var-try: "\f195"; +$fa-var-tty: "\f1e4"; +$fa-var-tumblr: "\f173"; +$fa-var-tumblr-square: "\f174"; +$fa-var-turkish-lira: "\f195"; +$fa-var-tv: "\f26c"; +$fa-var-twitch: "\f1e8"; +$fa-var-twitter: "\f099"; +$fa-var-twitter-square: "\f081"; +$fa-var-umbrella: "\f0e9"; +$fa-var-underline: "\f0cd"; +$fa-var-undo: "\f0e2"; +$fa-var-universal-access: "\f29a"; +$fa-var-university: "\f19c"; +$fa-var-unlink: "\f127"; +$fa-var-unlock: "\f09c"; +$fa-var-unlock-alt: "\f13e"; +$fa-var-unsorted: "\f0dc"; +$fa-var-upload: "\f093"; +$fa-var-usb: "\f287"; +$fa-var-usd: "\f155"; +$fa-var-user: "\f007"; +$fa-var-user-circle: "\f2bd"; +$fa-var-user-circle-o: "\f2be"; +$fa-var-user-md: "\f0f0"; +$fa-var-user-o: "\f2c0"; +$fa-var-user-plus: "\f234"; +$fa-var-user-secret: "\f21b"; +$fa-var-user-times: "\f235"; +$fa-var-users: "\f0c0"; +$fa-var-vcard: "\f2bb"; +$fa-var-vcard-o: "\f2bc"; +$fa-var-venus: "\f221"; +$fa-var-venus-double: "\f226"; +$fa-var-venus-mars: "\f228"; +$fa-var-viacoin: "\f237"; +$fa-var-viadeo: "\f2a9"; +$fa-var-viadeo-square: "\f2aa"; +$fa-var-video-camera: "\f03d"; +$fa-var-vimeo: "\f27d"; +$fa-var-vimeo-square: "\f194"; +$fa-var-vine: "\f1ca"; +$fa-var-vk: "\f189"; +$fa-var-volume-control-phone: "\f2a0"; +$fa-var-volume-down: "\f027"; +$fa-var-volume-off: "\f026"; +$fa-var-volume-up: "\f028"; +$fa-var-warning: "\f071"; +$fa-var-wechat: "\f1d7"; +$fa-var-weibo: "\f18a"; +$fa-var-weixin: "\f1d7"; +$fa-var-whatsapp: "\f232"; +$fa-var-wheelchair: "\f193"; +$fa-var-wheelchair-alt: "\f29b"; +$fa-var-wifi: "\f1eb"; +$fa-var-wikipedia-w: "\f266"; +$fa-var-window-close: "\f2d3"; +$fa-var-window-close-o: "\f2d4"; +$fa-var-window-maximize: "\f2d0"; +$fa-var-window-minimize: "\f2d1"; +$fa-var-window-restore: "\f2d2"; +$fa-var-windows: "\f17a"; +$fa-var-won: "\f159"; +$fa-var-wordpress: "\f19a"; +$fa-var-wpbeginner: "\f297"; +$fa-var-wpexplorer: "\f2de"; +$fa-var-wpforms: "\f298"; +$fa-var-wrench: "\f0ad"; +$fa-var-xing: "\f168"; +$fa-var-xing-square: "\f169"; +$fa-var-y-combinator: "\f23b"; +$fa-var-y-combinator-square: "\f1d4"; +$fa-var-yahoo: "\f19e"; +$fa-var-yc: "\f23b"; +$fa-var-yc-square: "\f1d4"; +$fa-var-yelp: "\f1e9"; +$fa-var-yen: "\f157"; +$fa-var-yoast: "\f2b1"; +$fa-var-youtube: "\f167"; +$fa-var-youtube-play: "\f16a"; +$fa-var-youtube-square: "\f166"; + diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss new file mode 100644 index 0000000000..f1c83aaa5d --- /dev/null +++ b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss @@ -0,0 +1,18 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + +@import "variables"; +@import "mixins"; +@import "path"; +@import "core"; +@import "larger"; +@import "fixed-width"; +@import "list"; +@import "bordered-pulled"; +@import "animated"; +@import "rotated-flipped"; +@import "stacked"; +@import "icons"; +@import "screen-reader"; diff --git a/interface/web/themes/default/templates/main.tpl.htm b/interface/web/themes/default/templates/main.tpl.htm index b49e6cd61d..4cc88760bb 100644 --- a/interface/web/themes/default/templates/main.tpl.htm +++ b/interface/web/themes/default/templates/main.tpl.htm @@ -29,6 +29,7 @@ /assets/stylesheets/themes/default/theme.min.css' /> /assets/stylesheets/select2.css' /> /assets/stylesheets/select2-bootstrap.css' /> + /assets/stylesheets/font-awesome-4.7.0/css/font-awesome.min.css' /> /assets/stylesheets/login.css' /> -- GitLab From 3f058ea1311d2906b31c0616205ede623e2522fb Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 18:49:05 +0200 Subject: [PATCH 0233/1368] Remove unnecessary files --- .../font-awesome-4.7.0/HELP-US-OUT.txt | 7 - .../font-awesome-4.7.0/css/font-awesome.css | 2337 ----------------- .../font-awesome-4.7.0/less/animated.less | 34 - .../less/bordered-pulled.less | 25 - .../font-awesome-4.7.0/less/core.less | 12 - .../font-awesome-4.7.0/less/fixed-width.less | 6 - .../font-awesome-4.7.0/less/font-awesome.less | 18 - .../font-awesome-4.7.0/less/icons.less | 789 ------ .../font-awesome-4.7.0/less/larger.less | 13 - .../font-awesome-4.7.0/less/list.less | 19 - .../font-awesome-4.7.0/less/mixins.less | 60 - .../font-awesome-4.7.0/less/path.less | 15 - .../less/rotated-flipped.less | 20 - .../less/screen-reader.less | 5 - .../font-awesome-4.7.0/less/stacked.less | 20 - .../font-awesome-4.7.0/less/variables.less | 800 ------ .../font-awesome-4.7.0/scss/_animated.scss | 34 - .../scss/_bordered-pulled.scss | 25 - .../font-awesome-4.7.0/scss/_core.scss | 12 - .../font-awesome-4.7.0/scss/_fixed-width.scss | 6 - .../font-awesome-4.7.0/scss/_icons.scss | 789 ------ .../font-awesome-4.7.0/scss/_larger.scss | 13 - .../font-awesome-4.7.0/scss/_list.scss | 19 - .../font-awesome-4.7.0/scss/_mixins.scss | 60 - .../font-awesome-4.7.0/scss/_path.scss | 15 - .../scss/_rotated-flipped.scss | 20 - .../scss/_screen-reader.scss | 5 - .../font-awesome-4.7.0/scss/_stacked.scss | 20 - .../font-awesome-4.7.0/scss/_variables.scss | 800 ------ .../font-awesome-4.7.0/scss/font-awesome.scss | 18 - 30 files changed, 6016 deletions(-) delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss delete mode 100644 interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt deleted file mode 100644 index 83d083dd77..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/HELP-US-OUT.txt +++ /dev/null @@ -1,7 +0,0 @@ -I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, -Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, -comprehensive icon sets or copy and paste your own. - -Please. Check it out. - --Dave Gandy diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css deleted file mode 100644 index ee906a8196..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/css/font-awesome.css +++ /dev/null @@ -1,2337 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ -/* FONT PATH - * -------------------------- */ -@font-face { - font-family: 'FontAwesome'; - src: url('../fonts/fontawesome-webfont.eot?v=4.7.0'); - src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg'); - font-weight: normal; - font-style: normal; -} -.fa { - display: inline-block; - font: normal normal normal 14px/1 FontAwesome; - font-size: inherit; - text-rendering: auto; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -/* makes the font 33% larger relative to the icon container */ -.fa-lg { - font-size: 1.33333333em; - line-height: 0.75em; - vertical-align: -15%; -} -.fa-2x { - font-size: 2em; -} -.fa-3x { - font-size: 3em; -} -.fa-4x { - font-size: 4em; -} -.fa-5x { - font-size: 5em; -} -.fa-fw { - width: 1.28571429em; - text-align: center; -} -.fa-ul { - padding-left: 0; - margin-left: 2.14285714em; - list-style-type: none; -} -.fa-ul > li { - position: relative; -} -.fa-li { - position: absolute; - left: -2.14285714em; - width: 2.14285714em; - top: 0.14285714em; - text-align: center; -} -.fa-li.fa-lg { - left: -1.85714286em; -} -.fa-border { - padding: .2em .25em .15em; - border: solid 0.08em #eeeeee; - border-radius: .1em; -} -.fa-pull-left { - float: left; -} -.fa-pull-right { - float: right; -} -.fa.fa-pull-left { - margin-right: .3em; -} -.fa.fa-pull-right { - margin-left: .3em; -} -/* Deprecated as of 4.4.0 */ -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.fa.pull-left { - margin-right: .3em; -} -.fa.pull-right { - margin-left: .3em; -} -.fa-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} -.fa-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} -.fa-rotate-90 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); -} -.fa-rotate-180 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; - -webkit-transform: rotate(180deg); - -ms-transform: rotate(180deg); - transform: rotate(180deg); -} -.fa-rotate-270 { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; - -webkit-transform: rotate(270deg); - -ms-transform: rotate(270deg); - transform: rotate(270deg); -} -.fa-flip-horizontal { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; - -webkit-transform: scale(-1, 1); - -ms-transform: scale(-1, 1); - transform: scale(-1, 1); -} -.fa-flip-vertical { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; - -webkit-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} -:root .fa-rotate-90, -:root .fa-rotate-180, -:root .fa-rotate-270, -:root .fa-flip-horizontal, -:root .fa-flip-vertical { - filter: none; -} -.fa-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.fa-stack-1x, -.fa-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.fa-stack-1x { - line-height: inherit; -} -.fa-stack-2x { - font-size: 2em; -} -.fa-inverse { - color: #ffffff; -} -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ -.fa-glass:before { - content: "\f000"; -} -.fa-music:before { - content: "\f001"; -} -.fa-search:before { - content: "\f002"; -} -.fa-envelope-o:before { - content: "\f003"; -} -.fa-heart:before { - content: "\f004"; -} -.fa-star:before { - content: "\f005"; -} -.fa-star-o:before { - content: "\f006"; -} -.fa-user:before { - content: "\f007"; -} -.fa-film:before { - content: "\f008"; -} -.fa-th-large:before { - content: "\f009"; -} -.fa-th:before { - content: "\f00a"; -} -.fa-th-list:before { - content: "\f00b"; -} -.fa-check:before { - content: "\f00c"; -} -.fa-remove:before, -.fa-close:before, -.fa-times:before { - content: "\f00d"; -} -.fa-search-plus:before { - content: "\f00e"; -} -.fa-search-minus:before { - content: "\f010"; -} -.fa-power-off:before { - content: "\f011"; -} -.fa-signal:before { - content: "\f012"; -} -.fa-gear:before, -.fa-cog:before { - content: "\f013"; -} -.fa-trash-o:before { - content: "\f014"; -} -.fa-home:before { - content: "\f015"; -} -.fa-file-o:before { - content: "\f016"; -} -.fa-clock-o:before { - content: "\f017"; -} -.fa-road:before { - content: "\f018"; -} -.fa-download:before { - content: "\f019"; -} -.fa-arrow-circle-o-down:before { - content: "\f01a"; -} -.fa-arrow-circle-o-up:before { - content: "\f01b"; -} -.fa-inbox:before { - content: "\f01c"; -} -.fa-play-circle-o:before { - content: "\f01d"; -} -.fa-rotate-right:before, -.fa-repeat:before { - content: "\f01e"; -} -.fa-refresh:before { - content: "\f021"; -} -.fa-list-alt:before { - content: "\f022"; -} -.fa-lock:before { - content: "\f023"; -} -.fa-flag:before { - content: "\f024"; -} -.fa-headphones:before { - content: "\f025"; -} -.fa-volume-off:before { - content: "\f026"; -} -.fa-volume-down:before { - content: "\f027"; -} -.fa-volume-up:before { - content: "\f028"; -} -.fa-qrcode:before { - content: "\f029"; -} -.fa-barcode:before { - content: "\f02a"; -} -.fa-tag:before { - content: "\f02b"; -} -.fa-tags:before { - content: "\f02c"; -} -.fa-book:before { - content: "\f02d"; -} -.fa-bookmark:before { - content: "\f02e"; -} -.fa-print:before { - content: "\f02f"; -} -.fa-camera:before { - content: "\f030"; -} -.fa-font:before { - content: "\f031"; -} -.fa-bold:before { - content: "\f032"; -} -.fa-italic:before { - content: "\f033"; -} -.fa-text-height:before { - content: "\f034"; -} -.fa-text-width:before { - content: "\f035"; -} -.fa-align-left:before { - content: "\f036"; -} -.fa-align-center:before { - content: "\f037"; -} -.fa-align-right:before { - content: "\f038"; -} -.fa-align-justify:before { - content: "\f039"; -} -.fa-list:before { - content: "\f03a"; -} -.fa-dedent:before, -.fa-outdent:before { - content: "\f03b"; -} -.fa-indent:before { - content: "\f03c"; -} -.fa-video-camera:before { - content: "\f03d"; -} -.fa-photo:before, -.fa-image:before, -.fa-picture-o:before { - content: "\f03e"; -} -.fa-pencil:before { - content: "\f040"; -} -.fa-map-marker:before { - content: "\f041"; -} -.fa-adjust:before { - content: "\f042"; -} -.fa-tint:before { - content: "\f043"; -} -.fa-edit:before, -.fa-pencil-square-o:before { - content: "\f044"; -} -.fa-share-square-o:before { - content: "\f045"; -} -.fa-check-square-o:before { - content: "\f046"; -} -.fa-arrows:before { - content: "\f047"; -} -.fa-step-backward:before { - content: "\f048"; -} -.fa-fast-backward:before { - content: "\f049"; -} -.fa-backward:before { - content: "\f04a"; -} -.fa-play:before { - content: "\f04b"; -} -.fa-pause:before { - content: "\f04c"; -} -.fa-stop:before { - content: "\f04d"; -} -.fa-forward:before { - content: "\f04e"; -} -.fa-fast-forward:before { - content: "\f050"; -} -.fa-step-forward:before { - content: "\f051"; -} -.fa-eject:before { - content: "\f052"; -} -.fa-chevron-left:before { - content: "\f053"; -} -.fa-chevron-right:before { - content: "\f054"; -} -.fa-plus-circle:before { - content: "\f055"; -} -.fa-minus-circle:before { - content: "\f056"; -} -.fa-times-circle:before { - content: "\f057"; -} -.fa-check-circle:before { - content: "\f058"; -} -.fa-question-circle:before { - content: "\f059"; -} -.fa-info-circle:before { - content: "\f05a"; -} -.fa-crosshairs:before { - content: "\f05b"; -} -.fa-times-circle-o:before { - content: "\f05c"; -} -.fa-check-circle-o:before { - content: "\f05d"; -} -.fa-ban:before { - content: "\f05e"; -} -.fa-arrow-left:before { - content: "\f060"; -} -.fa-arrow-right:before { - content: "\f061"; -} -.fa-arrow-up:before { - content: "\f062"; -} -.fa-arrow-down:before { - content: "\f063"; -} -.fa-mail-forward:before, -.fa-share:before { - content: "\f064"; -} -.fa-expand:before { - content: "\f065"; -} -.fa-compress:before { - content: "\f066"; -} -.fa-plus:before { - content: "\f067"; -} -.fa-minus:before { - content: "\f068"; -} -.fa-asterisk:before { - content: "\f069"; -} -.fa-exclamation-circle:before { - content: "\f06a"; -} -.fa-gift:before { - content: "\f06b"; -} -.fa-leaf:before { - content: "\f06c"; -} -.fa-fire:before { - content: "\f06d"; -} -.fa-eye:before { - content: "\f06e"; -} -.fa-eye-slash:before { - content: "\f070"; -} -.fa-warning:before, -.fa-exclamation-triangle:before { - content: "\f071"; -} -.fa-plane:before { - content: "\f072"; -} -.fa-calendar:before { - content: "\f073"; -} -.fa-random:before { - content: "\f074"; -} -.fa-comment:before { - content: "\f075"; -} -.fa-magnet:before { - content: "\f076"; -} -.fa-chevron-up:before { - content: "\f077"; -} -.fa-chevron-down:before { - content: "\f078"; -} -.fa-retweet:before { - content: "\f079"; -} -.fa-shopping-cart:before { - content: "\f07a"; -} -.fa-folder:before { - content: "\f07b"; -} -.fa-folder-open:before { - content: "\f07c"; -} -.fa-arrows-v:before { - content: "\f07d"; -} -.fa-arrows-h:before { - content: "\f07e"; -} -.fa-bar-chart-o:before, -.fa-bar-chart:before { - content: "\f080"; -} -.fa-twitter-square:before { - content: "\f081"; -} -.fa-facebook-square:before { - content: "\f082"; -} -.fa-camera-retro:before { - content: "\f083"; -} -.fa-key:before { - content: "\f084"; -} -.fa-gears:before, -.fa-cogs:before { - content: "\f085"; -} -.fa-comments:before { - content: "\f086"; -} -.fa-thumbs-o-up:before { - content: "\f087"; -} -.fa-thumbs-o-down:before { - content: "\f088"; -} -.fa-star-half:before { - content: "\f089"; -} -.fa-heart-o:before { - content: "\f08a"; -} -.fa-sign-out:before { - content: "\f08b"; -} -.fa-linkedin-square:before { - content: "\f08c"; -} -.fa-thumb-tack:before { - content: "\f08d"; -} -.fa-external-link:before { - content: "\f08e"; -} -.fa-sign-in:before { - content: "\f090"; -} -.fa-trophy:before { - content: "\f091"; -} -.fa-github-square:before { - content: "\f092"; -} -.fa-upload:before { - content: "\f093"; -} -.fa-lemon-o:before { - content: "\f094"; -} -.fa-phone:before { - content: "\f095"; -} -.fa-square-o:before { - content: "\f096"; -} -.fa-bookmark-o:before { - content: "\f097"; -} -.fa-phone-square:before { - content: "\f098"; -} -.fa-twitter:before { - content: "\f099"; -} -.fa-facebook-f:before, -.fa-facebook:before { - content: "\f09a"; -} -.fa-github:before { - content: "\f09b"; -} -.fa-unlock:before { - content: "\f09c"; -} -.fa-credit-card:before { - content: "\f09d"; -} -.fa-feed:before, -.fa-rss:before { - content: "\f09e"; -} -.fa-hdd-o:before { - content: "\f0a0"; -} -.fa-bullhorn:before { - content: "\f0a1"; -} -.fa-bell:before { - content: "\f0f3"; -} -.fa-certificate:before { - content: "\f0a3"; -} -.fa-hand-o-right:before { - content: "\f0a4"; -} -.fa-hand-o-left:before { - content: "\f0a5"; -} -.fa-hand-o-up:before { - content: "\f0a6"; -} -.fa-hand-o-down:before { - content: "\f0a7"; -} -.fa-arrow-circle-left:before { - content: "\f0a8"; -} -.fa-arrow-circle-right:before { - content: "\f0a9"; -} -.fa-arrow-circle-up:before { - content: "\f0aa"; -} -.fa-arrow-circle-down:before { - content: "\f0ab"; -} -.fa-globe:before { - content: "\f0ac"; -} -.fa-wrench:before { - content: "\f0ad"; -} -.fa-tasks:before { - content: "\f0ae"; -} -.fa-filter:before { - content: "\f0b0"; -} -.fa-briefcase:before { - content: "\f0b1"; -} -.fa-arrows-alt:before { - content: "\f0b2"; -} -.fa-group:before, -.fa-users:before { - content: "\f0c0"; -} -.fa-chain:before, -.fa-link:before { - content: "\f0c1"; -} -.fa-cloud:before { - content: "\f0c2"; -} -.fa-flask:before { - content: "\f0c3"; -} -.fa-cut:before, -.fa-scissors:before { - content: "\f0c4"; -} -.fa-copy:before, -.fa-files-o:before { - content: "\f0c5"; -} -.fa-paperclip:before { - content: "\f0c6"; -} -.fa-save:before, -.fa-floppy-o:before { - content: "\f0c7"; -} -.fa-square:before { - content: "\f0c8"; -} -.fa-navicon:before, -.fa-reorder:before, -.fa-bars:before { - content: "\f0c9"; -} -.fa-list-ul:before { - content: "\f0ca"; -} -.fa-list-ol:before { - content: "\f0cb"; -} -.fa-strikethrough:before { - content: "\f0cc"; -} -.fa-underline:before { - content: "\f0cd"; -} -.fa-table:before { - content: "\f0ce"; -} -.fa-magic:before { - content: "\f0d0"; -} -.fa-truck:before { - content: "\f0d1"; -} -.fa-pinterest:before { - content: "\f0d2"; -} -.fa-pinterest-square:before { - content: "\f0d3"; -} -.fa-google-plus-square:before { - content: "\f0d4"; -} -.fa-google-plus:before { - content: "\f0d5"; -} -.fa-money:before { - content: "\f0d6"; -} -.fa-caret-down:before { - content: "\f0d7"; -} -.fa-caret-up:before { - content: "\f0d8"; -} -.fa-caret-left:before { - content: "\f0d9"; -} -.fa-caret-right:before { - content: "\f0da"; -} -.fa-columns:before { - content: "\f0db"; -} -.fa-unsorted:before, -.fa-sort:before { - content: "\f0dc"; -} -.fa-sort-down:before, -.fa-sort-desc:before { - content: "\f0dd"; -} -.fa-sort-up:before, -.fa-sort-asc:before { - content: "\f0de"; -} -.fa-envelope:before { - content: "\f0e0"; -} -.fa-linkedin:before { - content: "\f0e1"; -} -.fa-rotate-left:before, -.fa-undo:before { - content: "\f0e2"; -} -.fa-legal:before, -.fa-gavel:before { - content: "\f0e3"; -} -.fa-dashboard:before, -.fa-tachometer:before { - content: "\f0e4"; -} -.fa-comment-o:before { - content: "\f0e5"; -} -.fa-comments-o:before { - content: "\f0e6"; -} -.fa-flash:before, -.fa-bolt:before { - content: "\f0e7"; -} -.fa-sitemap:before { - content: "\f0e8"; -} -.fa-umbrella:before { - content: "\f0e9"; -} -.fa-paste:before, -.fa-clipboard:before { - content: "\f0ea"; -} -.fa-lightbulb-o:before { - content: "\f0eb"; -} -.fa-exchange:before { - content: "\f0ec"; -} -.fa-cloud-download:before { - content: "\f0ed"; -} -.fa-cloud-upload:before { - content: "\f0ee"; -} -.fa-user-md:before { - content: "\f0f0"; -} -.fa-stethoscope:before { - content: "\f0f1"; -} -.fa-suitcase:before { - content: "\f0f2"; -} -.fa-bell-o:before { - content: "\f0a2"; -} -.fa-coffee:before { - content: "\f0f4"; -} -.fa-cutlery:before { - content: "\f0f5"; -} -.fa-file-text-o:before { - content: "\f0f6"; -} -.fa-building-o:before { - content: "\f0f7"; -} -.fa-hospital-o:before { - content: "\f0f8"; -} -.fa-ambulance:before { - content: "\f0f9"; -} -.fa-medkit:before { - content: "\f0fa"; -} -.fa-fighter-jet:before { - content: "\f0fb"; -} -.fa-beer:before { - content: "\f0fc"; -} -.fa-h-square:before { - content: "\f0fd"; -} -.fa-plus-square:before { - content: "\f0fe"; -} -.fa-angle-double-left:before { - content: "\f100"; -} -.fa-angle-double-right:before { - content: "\f101"; -} -.fa-angle-double-up:before { - content: "\f102"; -} -.fa-angle-double-down:before { - content: "\f103"; -} -.fa-angle-left:before { - content: "\f104"; -} -.fa-angle-right:before { - content: "\f105"; -} -.fa-angle-up:before { - content: "\f106"; -} -.fa-angle-down:before { - content: "\f107"; -} -.fa-desktop:before { - content: "\f108"; -} -.fa-laptop:before { - content: "\f109"; -} -.fa-tablet:before { - content: "\f10a"; -} -.fa-mobile-phone:before, -.fa-mobile:before { - content: "\f10b"; -} -.fa-circle-o:before { - content: "\f10c"; -} -.fa-quote-left:before { - content: "\f10d"; -} -.fa-quote-right:before { - content: "\f10e"; -} -.fa-spinner:before { - content: "\f110"; -} -.fa-circle:before { - content: "\f111"; -} -.fa-mail-reply:before, -.fa-reply:before { - content: "\f112"; -} -.fa-github-alt:before { - content: "\f113"; -} -.fa-folder-o:before { - content: "\f114"; -} -.fa-folder-open-o:before { - content: "\f115"; -} -.fa-smile-o:before { - content: "\f118"; -} -.fa-frown-o:before { - content: "\f119"; -} -.fa-meh-o:before { - content: "\f11a"; -} -.fa-gamepad:before { - content: "\f11b"; -} -.fa-keyboard-o:before { - content: "\f11c"; -} -.fa-flag-o:before { - content: "\f11d"; -} -.fa-flag-checkered:before { - content: "\f11e"; -} -.fa-terminal:before { - content: "\f120"; -} -.fa-code:before { - content: "\f121"; -} -.fa-mail-reply-all:before, -.fa-reply-all:before { - content: "\f122"; -} -.fa-star-half-empty:before, -.fa-star-half-full:before, -.fa-star-half-o:before { - content: "\f123"; -} -.fa-location-arrow:before { - content: "\f124"; -} -.fa-crop:before { - content: "\f125"; -} -.fa-code-fork:before { - content: "\f126"; -} -.fa-unlink:before, -.fa-chain-broken:before { - content: "\f127"; -} -.fa-question:before { - content: "\f128"; -} -.fa-info:before { - content: "\f129"; -} -.fa-exclamation:before { - content: "\f12a"; -} -.fa-superscript:before { - content: "\f12b"; -} -.fa-subscript:before { - content: "\f12c"; -} -.fa-eraser:before { - content: "\f12d"; -} -.fa-puzzle-piece:before { - content: "\f12e"; -} -.fa-microphone:before { - content: "\f130"; -} -.fa-microphone-slash:before { - content: "\f131"; -} -.fa-shield:before { - content: "\f132"; -} -.fa-calendar-o:before { - content: "\f133"; -} -.fa-fire-extinguisher:before { - content: "\f134"; -} -.fa-rocket:before { - content: "\f135"; -} -.fa-maxcdn:before { - content: "\f136"; -} -.fa-chevron-circle-left:before { - content: "\f137"; -} -.fa-chevron-circle-right:before { - content: "\f138"; -} -.fa-chevron-circle-up:before { - content: "\f139"; -} -.fa-chevron-circle-down:before { - content: "\f13a"; -} -.fa-html5:before { - content: "\f13b"; -} -.fa-css3:before { - content: "\f13c"; -} -.fa-anchor:before { - content: "\f13d"; -} -.fa-unlock-alt:before { - content: "\f13e"; -} -.fa-bullseye:before { - content: "\f140"; -} -.fa-ellipsis-h:before { - content: "\f141"; -} -.fa-ellipsis-v:before { - content: "\f142"; -} -.fa-rss-square:before { - content: "\f143"; -} -.fa-play-circle:before { - content: "\f144"; -} -.fa-ticket:before { - content: "\f145"; -} -.fa-minus-square:before { - content: "\f146"; -} -.fa-minus-square-o:before { - content: "\f147"; -} -.fa-level-up:before { - content: "\f148"; -} -.fa-level-down:before { - content: "\f149"; -} -.fa-check-square:before { - content: "\f14a"; -} -.fa-pencil-square:before { - content: "\f14b"; -} -.fa-external-link-square:before { - content: "\f14c"; -} -.fa-share-square:before { - content: "\f14d"; -} -.fa-compass:before { - content: "\f14e"; -} -.fa-toggle-down:before, -.fa-caret-square-o-down:before { - content: "\f150"; -} -.fa-toggle-up:before, -.fa-caret-square-o-up:before { - content: "\f151"; -} -.fa-toggle-right:before, -.fa-caret-square-o-right:before { - content: "\f152"; -} -.fa-euro:before, -.fa-eur:before { - content: "\f153"; -} -.fa-gbp:before { - content: "\f154"; -} -.fa-dollar:before, -.fa-usd:before { - content: "\f155"; -} -.fa-rupee:before, -.fa-inr:before { - content: "\f156"; -} -.fa-cny:before, -.fa-rmb:before, -.fa-yen:before, -.fa-jpy:before { - content: "\f157"; -} -.fa-ruble:before, -.fa-rouble:before, -.fa-rub:before { - content: "\f158"; -} -.fa-won:before, -.fa-krw:before { - content: "\f159"; -} -.fa-bitcoin:before, -.fa-btc:before { - content: "\f15a"; -} -.fa-file:before { - content: "\f15b"; -} -.fa-file-text:before { - content: "\f15c"; -} -.fa-sort-alpha-asc:before { - content: "\f15d"; -} -.fa-sort-alpha-desc:before { - content: "\f15e"; -} -.fa-sort-amount-asc:before { - content: "\f160"; -} -.fa-sort-amount-desc:before { - content: "\f161"; -} -.fa-sort-numeric-asc:before { - content: "\f162"; -} -.fa-sort-numeric-desc:before { - content: "\f163"; -} -.fa-thumbs-up:before { - content: "\f164"; -} -.fa-thumbs-down:before { - content: "\f165"; -} -.fa-youtube-square:before { - content: "\f166"; -} -.fa-youtube:before { - content: "\f167"; -} -.fa-xing:before { - content: "\f168"; -} -.fa-xing-square:before { - content: "\f169"; -} -.fa-youtube-play:before { - content: "\f16a"; -} -.fa-dropbox:before { - content: "\f16b"; -} -.fa-stack-overflow:before { - content: "\f16c"; -} -.fa-instagram:before { - content: "\f16d"; -} -.fa-flickr:before { - content: "\f16e"; -} -.fa-adn:before { - content: "\f170"; -} -.fa-bitbucket:before { - content: "\f171"; -} -.fa-bitbucket-square:before { - content: "\f172"; -} -.fa-tumblr:before { - content: "\f173"; -} -.fa-tumblr-square:before { - content: "\f174"; -} -.fa-long-arrow-down:before { - content: "\f175"; -} -.fa-long-arrow-up:before { - content: "\f176"; -} -.fa-long-arrow-left:before { - content: "\f177"; -} -.fa-long-arrow-right:before { - content: "\f178"; -} -.fa-apple:before { - content: "\f179"; -} -.fa-windows:before { - content: "\f17a"; -} -.fa-android:before { - content: "\f17b"; -} -.fa-linux:before { - content: "\f17c"; -} -.fa-dribbble:before { - content: "\f17d"; -} -.fa-skype:before { - content: "\f17e"; -} -.fa-foursquare:before { - content: "\f180"; -} -.fa-trello:before { - content: "\f181"; -} -.fa-female:before { - content: "\f182"; -} -.fa-male:before { - content: "\f183"; -} -.fa-gittip:before, -.fa-gratipay:before { - content: "\f184"; -} -.fa-sun-o:before { - content: "\f185"; -} -.fa-moon-o:before { - content: "\f186"; -} -.fa-archive:before { - content: "\f187"; -} -.fa-bug:before { - content: "\f188"; -} -.fa-vk:before { - content: "\f189"; -} -.fa-weibo:before { - content: "\f18a"; -} -.fa-renren:before { - content: "\f18b"; -} -.fa-pagelines:before { - content: "\f18c"; -} -.fa-stack-exchange:before { - content: "\f18d"; -} -.fa-arrow-circle-o-right:before { - content: "\f18e"; -} -.fa-arrow-circle-o-left:before { - content: "\f190"; -} -.fa-toggle-left:before, -.fa-caret-square-o-left:before { - content: "\f191"; -} -.fa-dot-circle-o:before { - content: "\f192"; -} -.fa-wheelchair:before { - content: "\f193"; -} -.fa-vimeo-square:before { - content: "\f194"; -} -.fa-turkish-lira:before, -.fa-try:before { - content: "\f195"; -} -.fa-plus-square-o:before { - content: "\f196"; -} -.fa-space-shuttle:before { - content: "\f197"; -} -.fa-slack:before { - content: "\f198"; -} -.fa-envelope-square:before { - content: "\f199"; -} -.fa-wordpress:before { - content: "\f19a"; -} -.fa-openid:before { - content: "\f19b"; -} -.fa-institution:before, -.fa-bank:before, -.fa-university:before { - content: "\f19c"; -} -.fa-mortar-board:before, -.fa-graduation-cap:before { - content: "\f19d"; -} -.fa-yahoo:before { - content: "\f19e"; -} -.fa-google:before { - content: "\f1a0"; -} -.fa-reddit:before { - content: "\f1a1"; -} -.fa-reddit-square:before { - content: "\f1a2"; -} -.fa-stumbleupon-circle:before { - content: "\f1a3"; -} -.fa-stumbleupon:before { - content: "\f1a4"; -} -.fa-delicious:before { - content: "\f1a5"; -} -.fa-digg:before { - content: "\f1a6"; -} -.fa-pied-piper-pp:before { - content: "\f1a7"; -} -.fa-pied-piper-alt:before { - content: "\f1a8"; -} -.fa-drupal:before { - content: "\f1a9"; -} -.fa-joomla:before { - content: "\f1aa"; -} -.fa-language:before { - content: "\f1ab"; -} -.fa-fax:before { - content: "\f1ac"; -} -.fa-building:before { - content: "\f1ad"; -} -.fa-child:before { - content: "\f1ae"; -} -.fa-paw:before { - content: "\f1b0"; -} -.fa-spoon:before { - content: "\f1b1"; -} -.fa-cube:before { - content: "\f1b2"; -} -.fa-cubes:before { - content: "\f1b3"; -} -.fa-behance:before { - content: "\f1b4"; -} -.fa-behance-square:before { - content: "\f1b5"; -} -.fa-steam:before { - content: "\f1b6"; -} -.fa-steam-square:before { - content: "\f1b7"; -} -.fa-recycle:before { - content: "\f1b8"; -} -.fa-automobile:before, -.fa-car:before { - content: "\f1b9"; -} -.fa-cab:before, -.fa-taxi:before { - content: "\f1ba"; -} -.fa-tree:before { - content: "\f1bb"; -} -.fa-spotify:before { - content: "\f1bc"; -} -.fa-deviantart:before { - content: "\f1bd"; -} -.fa-soundcloud:before { - content: "\f1be"; -} -.fa-database:before { - content: "\f1c0"; -} -.fa-file-pdf-o:before { - content: "\f1c1"; -} -.fa-file-word-o:before { - content: "\f1c2"; -} -.fa-file-excel-o:before { - content: "\f1c3"; -} -.fa-file-powerpoint-o:before { - content: "\f1c4"; -} -.fa-file-photo-o:before, -.fa-file-picture-o:before, -.fa-file-image-o:before { - content: "\f1c5"; -} -.fa-file-zip-o:before, -.fa-file-archive-o:before { - content: "\f1c6"; -} -.fa-file-sound-o:before, -.fa-file-audio-o:before { - content: "\f1c7"; -} -.fa-file-movie-o:before, -.fa-file-video-o:before { - content: "\f1c8"; -} -.fa-file-code-o:before { - content: "\f1c9"; -} -.fa-vine:before { - content: "\f1ca"; -} -.fa-codepen:before { - content: "\f1cb"; -} -.fa-jsfiddle:before { - content: "\f1cc"; -} -.fa-life-bouy:before, -.fa-life-buoy:before, -.fa-life-saver:before, -.fa-support:before, -.fa-life-ring:before { - content: "\f1cd"; -} -.fa-circle-o-notch:before { - content: "\f1ce"; -} -.fa-ra:before, -.fa-resistance:before, -.fa-rebel:before { - content: "\f1d0"; -} -.fa-ge:before, -.fa-empire:before { - content: "\f1d1"; -} -.fa-git-square:before { - content: "\f1d2"; -} -.fa-git:before { - content: "\f1d3"; -} -.fa-y-combinator-square:before, -.fa-yc-square:before, -.fa-hacker-news:before { - content: "\f1d4"; -} -.fa-tencent-weibo:before { - content: "\f1d5"; -} -.fa-qq:before { - content: "\f1d6"; -} -.fa-wechat:before, -.fa-weixin:before { - content: "\f1d7"; -} -.fa-send:before, -.fa-paper-plane:before { - content: "\f1d8"; -} -.fa-send-o:before, -.fa-paper-plane-o:before { - content: "\f1d9"; -} -.fa-history:before { - content: "\f1da"; -} -.fa-circle-thin:before { - content: "\f1db"; -} -.fa-header:before { - content: "\f1dc"; -} -.fa-paragraph:before { - content: "\f1dd"; -} -.fa-sliders:before { - content: "\f1de"; -} -.fa-share-alt:before { - content: "\f1e0"; -} -.fa-share-alt-square:before { - content: "\f1e1"; -} -.fa-bomb:before { - content: "\f1e2"; -} -.fa-soccer-ball-o:before, -.fa-futbol-o:before { - content: "\f1e3"; -} -.fa-tty:before { - content: "\f1e4"; -} -.fa-binoculars:before { - content: "\f1e5"; -} -.fa-plug:before { - content: "\f1e6"; -} -.fa-slideshare:before { - content: "\f1e7"; -} -.fa-twitch:before { - content: "\f1e8"; -} -.fa-yelp:before { - content: "\f1e9"; -} -.fa-newspaper-o:before { - content: "\f1ea"; -} -.fa-wifi:before { - content: "\f1eb"; -} -.fa-calculator:before { - content: "\f1ec"; -} -.fa-paypal:before { - content: "\f1ed"; -} -.fa-google-wallet:before { - content: "\f1ee"; -} -.fa-cc-visa:before { - content: "\f1f0"; -} -.fa-cc-mastercard:before { - content: "\f1f1"; -} -.fa-cc-discover:before { - content: "\f1f2"; -} -.fa-cc-amex:before { - content: "\f1f3"; -} -.fa-cc-paypal:before { - content: "\f1f4"; -} -.fa-cc-stripe:before { - content: "\f1f5"; -} -.fa-bell-slash:before { - content: "\f1f6"; -} -.fa-bell-slash-o:before { - content: "\f1f7"; -} -.fa-trash:before { - content: "\f1f8"; -} -.fa-copyright:before { - content: "\f1f9"; -} -.fa-at:before { - content: "\f1fa"; -} -.fa-eyedropper:before { - content: "\f1fb"; -} -.fa-paint-brush:before { - content: "\f1fc"; -} -.fa-birthday-cake:before { - content: "\f1fd"; -} -.fa-area-chart:before { - content: "\f1fe"; -} -.fa-pie-chart:before { - content: "\f200"; -} -.fa-line-chart:before { - content: "\f201"; -} -.fa-lastfm:before { - content: "\f202"; -} -.fa-lastfm-square:before { - content: "\f203"; -} -.fa-toggle-off:before { - content: "\f204"; -} -.fa-toggle-on:before { - content: "\f205"; -} -.fa-bicycle:before { - content: "\f206"; -} -.fa-bus:before { - content: "\f207"; -} -.fa-ioxhost:before { - content: "\f208"; -} -.fa-angellist:before { - content: "\f209"; -} -.fa-cc:before { - content: "\f20a"; -} -.fa-shekel:before, -.fa-sheqel:before, -.fa-ils:before { - content: "\f20b"; -} -.fa-meanpath:before { - content: "\f20c"; -} -.fa-buysellads:before { - content: "\f20d"; -} -.fa-connectdevelop:before { - content: "\f20e"; -} -.fa-dashcube:before { - content: "\f210"; -} -.fa-forumbee:before { - content: "\f211"; -} -.fa-leanpub:before { - content: "\f212"; -} -.fa-sellsy:before { - content: "\f213"; -} -.fa-shirtsinbulk:before { - content: "\f214"; -} -.fa-simplybuilt:before { - content: "\f215"; -} -.fa-skyatlas:before { - content: "\f216"; -} -.fa-cart-plus:before { - content: "\f217"; -} -.fa-cart-arrow-down:before { - content: "\f218"; -} -.fa-diamond:before { - content: "\f219"; -} -.fa-ship:before { - content: "\f21a"; -} -.fa-user-secret:before { - content: "\f21b"; -} -.fa-motorcycle:before { - content: "\f21c"; -} -.fa-street-view:before { - content: "\f21d"; -} -.fa-heartbeat:before { - content: "\f21e"; -} -.fa-venus:before { - content: "\f221"; -} -.fa-mars:before { - content: "\f222"; -} -.fa-mercury:before { - content: "\f223"; -} -.fa-intersex:before, -.fa-transgender:before { - content: "\f224"; -} -.fa-transgender-alt:before { - content: "\f225"; -} -.fa-venus-double:before { - content: "\f226"; -} -.fa-mars-double:before { - content: "\f227"; -} -.fa-venus-mars:before { - content: "\f228"; -} -.fa-mars-stroke:before { - content: "\f229"; -} -.fa-mars-stroke-v:before { - content: "\f22a"; -} -.fa-mars-stroke-h:before { - content: "\f22b"; -} -.fa-neuter:before { - content: "\f22c"; -} -.fa-genderless:before { - content: "\f22d"; -} -.fa-facebook-official:before { - content: "\f230"; -} -.fa-pinterest-p:before { - content: "\f231"; -} -.fa-whatsapp:before { - content: "\f232"; -} -.fa-server:before { - content: "\f233"; -} -.fa-user-plus:before { - content: "\f234"; -} -.fa-user-times:before { - content: "\f235"; -} -.fa-hotel:before, -.fa-bed:before { - content: "\f236"; -} -.fa-viacoin:before { - content: "\f237"; -} -.fa-train:before { - content: "\f238"; -} -.fa-subway:before { - content: "\f239"; -} -.fa-medium:before { - content: "\f23a"; -} -.fa-yc:before, -.fa-y-combinator:before { - content: "\f23b"; -} -.fa-optin-monster:before { - content: "\f23c"; -} -.fa-opencart:before { - content: "\f23d"; -} -.fa-expeditedssl:before { - content: "\f23e"; -} -.fa-battery-4:before, -.fa-battery:before, -.fa-battery-full:before { - content: "\f240"; -} -.fa-battery-3:before, -.fa-battery-three-quarters:before { - content: "\f241"; -} -.fa-battery-2:before, -.fa-battery-half:before { - content: "\f242"; -} -.fa-battery-1:before, -.fa-battery-quarter:before { - content: "\f243"; -} -.fa-battery-0:before, -.fa-battery-empty:before { - content: "\f244"; -} -.fa-mouse-pointer:before { - content: "\f245"; -} -.fa-i-cursor:before { - content: "\f246"; -} -.fa-object-group:before { - content: "\f247"; -} -.fa-object-ungroup:before { - content: "\f248"; -} -.fa-sticky-note:before { - content: "\f249"; -} -.fa-sticky-note-o:before { - content: "\f24a"; -} -.fa-cc-jcb:before { - content: "\f24b"; -} -.fa-cc-diners-club:before { - content: "\f24c"; -} -.fa-clone:before { - content: "\f24d"; -} -.fa-balance-scale:before { - content: "\f24e"; -} -.fa-hourglass-o:before { - content: "\f250"; -} -.fa-hourglass-1:before, -.fa-hourglass-start:before { - content: "\f251"; -} -.fa-hourglass-2:before, -.fa-hourglass-half:before { - content: "\f252"; -} -.fa-hourglass-3:before, -.fa-hourglass-end:before { - content: "\f253"; -} -.fa-hourglass:before { - content: "\f254"; -} -.fa-hand-grab-o:before, -.fa-hand-rock-o:before { - content: "\f255"; -} -.fa-hand-stop-o:before, -.fa-hand-paper-o:before { - content: "\f256"; -} -.fa-hand-scissors-o:before { - content: "\f257"; -} -.fa-hand-lizard-o:before { - content: "\f258"; -} -.fa-hand-spock-o:before { - content: "\f259"; -} -.fa-hand-pointer-o:before { - content: "\f25a"; -} -.fa-hand-peace-o:before { - content: "\f25b"; -} -.fa-trademark:before { - content: "\f25c"; -} -.fa-registered:before { - content: "\f25d"; -} -.fa-creative-commons:before { - content: "\f25e"; -} -.fa-gg:before { - content: "\f260"; -} -.fa-gg-circle:before { - content: "\f261"; -} -.fa-tripadvisor:before { - content: "\f262"; -} -.fa-odnoklassniki:before { - content: "\f263"; -} -.fa-odnoklassniki-square:before { - content: "\f264"; -} -.fa-get-pocket:before { - content: "\f265"; -} -.fa-wikipedia-w:before { - content: "\f266"; -} -.fa-safari:before { - content: "\f267"; -} -.fa-chrome:before { - content: "\f268"; -} -.fa-firefox:before { - content: "\f269"; -} -.fa-opera:before { - content: "\f26a"; -} -.fa-internet-explorer:before { - content: "\f26b"; -} -.fa-tv:before, -.fa-television:before { - content: "\f26c"; -} -.fa-contao:before { - content: "\f26d"; -} -.fa-500px:before { - content: "\f26e"; -} -.fa-amazon:before { - content: "\f270"; -} -.fa-calendar-plus-o:before { - content: "\f271"; -} -.fa-calendar-minus-o:before { - content: "\f272"; -} -.fa-calendar-times-o:before { - content: "\f273"; -} -.fa-calendar-check-o:before { - content: "\f274"; -} -.fa-industry:before { - content: "\f275"; -} -.fa-map-pin:before { - content: "\f276"; -} -.fa-map-signs:before { - content: "\f277"; -} -.fa-map-o:before { - content: "\f278"; -} -.fa-map:before { - content: "\f279"; -} -.fa-commenting:before { - content: "\f27a"; -} -.fa-commenting-o:before { - content: "\f27b"; -} -.fa-houzz:before { - content: "\f27c"; -} -.fa-vimeo:before { - content: "\f27d"; -} -.fa-black-tie:before { - content: "\f27e"; -} -.fa-fonticons:before { - content: "\f280"; -} -.fa-reddit-alien:before { - content: "\f281"; -} -.fa-edge:before { - content: "\f282"; -} -.fa-credit-card-alt:before { - content: "\f283"; -} -.fa-codiepie:before { - content: "\f284"; -} -.fa-modx:before { - content: "\f285"; -} -.fa-fort-awesome:before { - content: "\f286"; -} -.fa-usb:before { - content: "\f287"; -} -.fa-product-hunt:before { - content: "\f288"; -} -.fa-mixcloud:before { - content: "\f289"; -} -.fa-scribd:before { - content: "\f28a"; -} -.fa-pause-circle:before { - content: "\f28b"; -} -.fa-pause-circle-o:before { - content: "\f28c"; -} -.fa-stop-circle:before { - content: "\f28d"; -} -.fa-stop-circle-o:before { - content: "\f28e"; -} -.fa-shopping-bag:before { - content: "\f290"; -} -.fa-shopping-basket:before { - content: "\f291"; -} -.fa-hashtag:before { - content: "\f292"; -} -.fa-bluetooth:before { - content: "\f293"; -} -.fa-bluetooth-b:before { - content: "\f294"; -} -.fa-percent:before { - content: "\f295"; -} -.fa-gitlab:before { - content: "\f296"; -} -.fa-wpbeginner:before { - content: "\f297"; -} -.fa-wpforms:before { - content: "\f298"; -} -.fa-envira:before { - content: "\f299"; -} -.fa-universal-access:before { - content: "\f29a"; -} -.fa-wheelchair-alt:before { - content: "\f29b"; -} -.fa-question-circle-o:before { - content: "\f29c"; -} -.fa-blind:before { - content: "\f29d"; -} -.fa-audio-description:before { - content: "\f29e"; -} -.fa-volume-control-phone:before { - content: "\f2a0"; -} -.fa-braille:before { - content: "\f2a1"; -} -.fa-assistive-listening-systems:before { - content: "\f2a2"; -} -.fa-asl-interpreting:before, -.fa-american-sign-language-interpreting:before { - content: "\f2a3"; -} -.fa-deafness:before, -.fa-hard-of-hearing:before, -.fa-deaf:before { - content: "\f2a4"; -} -.fa-glide:before { - content: "\f2a5"; -} -.fa-glide-g:before { - content: "\f2a6"; -} -.fa-signing:before, -.fa-sign-language:before { - content: "\f2a7"; -} -.fa-low-vision:before { - content: "\f2a8"; -} -.fa-viadeo:before { - content: "\f2a9"; -} -.fa-viadeo-square:before { - content: "\f2aa"; -} -.fa-snapchat:before { - content: "\f2ab"; -} -.fa-snapchat-ghost:before { - content: "\f2ac"; -} -.fa-snapchat-square:before { - content: "\f2ad"; -} -.fa-pied-piper:before { - content: "\f2ae"; -} -.fa-first-order:before { - content: "\f2b0"; -} -.fa-yoast:before { - content: "\f2b1"; -} -.fa-themeisle:before { - content: "\f2b2"; -} -.fa-google-plus-circle:before, -.fa-google-plus-official:before { - content: "\f2b3"; -} -.fa-fa:before, -.fa-font-awesome:before { - content: "\f2b4"; -} -.fa-handshake-o:before { - content: "\f2b5"; -} -.fa-envelope-open:before { - content: "\f2b6"; -} -.fa-envelope-open-o:before { - content: "\f2b7"; -} -.fa-linode:before { - content: "\f2b8"; -} -.fa-address-book:before { - content: "\f2b9"; -} -.fa-address-book-o:before { - content: "\f2ba"; -} -.fa-vcard:before, -.fa-address-card:before { - content: "\f2bb"; -} -.fa-vcard-o:before, -.fa-address-card-o:before { - content: "\f2bc"; -} -.fa-user-circle:before { - content: "\f2bd"; -} -.fa-user-circle-o:before { - content: "\f2be"; -} -.fa-user-o:before { - content: "\f2c0"; -} -.fa-id-badge:before { - content: "\f2c1"; -} -.fa-drivers-license:before, -.fa-id-card:before { - content: "\f2c2"; -} -.fa-drivers-license-o:before, -.fa-id-card-o:before { - content: "\f2c3"; -} -.fa-quora:before { - content: "\f2c4"; -} -.fa-free-code-camp:before { - content: "\f2c5"; -} -.fa-telegram:before { - content: "\f2c6"; -} -.fa-thermometer-4:before, -.fa-thermometer:before, -.fa-thermometer-full:before { - content: "\f2c7"; -} -.fa-thermometer-3:before, -.fa-thermometer-three-quarters:before { - content: "\f2c8"; -} -.fa-thermometer-2:before, -.fa-thermometer-half:before { - content: "\f2c9"; -} -.fa-thermometer-1:before, -.fa-thermometer-quarter:before { - content: "\f2ca"; -} -.fa-thermometer-0:before, -.fa-thermometer-empty:before { - content: "\f2cb"; -} -.fa-shower:before { - content: "\f2cc"; -} -.fa-bathtub:before, -.fa-s15:before, -.fa-bath:before { - content: "\f2cd"; -} -.fa-podcast:before { - content: "\f2ce"; -} -.fa-window-maximize:before { - content: "\f2d0"; -} -.fa-window-minimize:before { - content: "\f2d1"; -} -.fa-window-restore:before { - content: "\f2d2"; -} -.fa-times-rectangle:before, -.fa-window-close:before { - content: "\f2d3"; -} -.fa-times-rectangle-o:before, -.fa-window-close-o:before { - content: "\f2d4"; -} -.fa-bandcamp:before { - content: "\f2d5"; -} -.fa-grav:before { - content: "\f2d6"; -} -.fa-etsy:before { - content: "\f2d7"; -} -.fa-imdb:before { - content: "\f2d8"; -} -.fa-ravelry:before { - content: "\f2d9"; -} -.fa-eercast:before { - content: "\f2da"; -} -.fa-microchip:before { - content: "\f2db"; -} -.fa-snowflake-o:before { - content: "\f2dc"; -} -.fa-superpowers:before { - content: "\f2dd"; -} -.fa-wpexplorer:before { - content: "\f2de"; -} -.fa-meetup:before { - content: "\f2e0"; -} -.sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0, 0, 0, 0); - border: 0; -} -.sr-only-focusable:active, -.sr-only-focusable:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less deleted file mode 100644 index 66ad52a5ba..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/animated.less +++ /dev/null @@ -1,34 +0,0 @@ -// Animated Icons -// -------------------------- - -.@{fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.@{fa-css-prefix}-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less deleted file mode 100644 index f1c8ad75f5..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/bordered-pulled.less +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.@{fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em @fa-border-color; - border-radius: .1em; -} - -.@{fa-css-prefix}-pull-left { float: left; } -.@{fa-css-prefix}-pull-right { float: right; } - -.@{fa-css-prefix} { - &.@{fa-css-prefix}-pull-left { margin-right: .3em; } - &.@{fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.@{fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less deleted file mode 100644 index c577ac84a6..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/core.less +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.@{fa-css-prefix} { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less deleted file mode 100644 index 110289f2f4..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/fixed-width.less +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.@{fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less deleted file mode 100644 index c3677def31..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/font-awesome.less +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables.less"; -@import "mixins.less"; -@import "path.less"; -@import "core.less"; -@import "larger.less"; -@import "fixed-width.less"; -@import "list.less"; -@import "bordered-pulled.less"; -@import "animated.less"; -@import "rotated-flipped.less"; -@import "stacked.less"; -@import "icons.less"; -@import "screen-reader.less"; diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less deleted file mode 100644 index 159d600425..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/icons.less +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.@{fa-css-prefix}-glass:before { content: @fa-var-glass; } -.@{fa-css-prefix}-music:before { content: @fa-var-music; } -.@{fa-css-prefix}-search:before { content: @fa-var-search; } -.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; } -.@{fa-css-prefix}-heart:before { content: @fa-var-heart; } -.@{fa-css-prefix}-star:before { content: @fa-var-star; } -.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; } -.@{fa-css-prefix}-user:before { content: @fa-var-user; } -.@{fa-css-prefix}-film:before { content: @fa-var-film; } -.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; } -.@{fa-css-prefix}-th:before { content: @fa-var-th; } -.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; } -.@{fa-css-prefix}-check:before { content: @fa-var-check; } -.@{fa-css-prefix}-remove:before, -.@{fa-css-prefix}-close:before, -.@{fa-css-prefix}-times:before { content: @fa-var-times; } -.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; } -.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; } -.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; } -.@{fa-css-prefix}-signal:before { content: @fa-var-signal; } -.@{fa-css-prefix}-gear:before, -.@{fa-css-prefix}-cog:before { content: @fa-var-cog; } -.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; } -.@{fa-css-prefix}-home:before { content: @fa-var-home; } -.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; } -.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; } -.@{fa-css-prefix}-road:before { content: @fa-var-road; } -.@{fa-css-prefix}-download:before { content: @fa-var-download; } -.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; } -.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; } -.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; } -.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; } -.@{fa-css-prefix}-rotate-right:before, -.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; } -.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; } -.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; } -.@{fa-css-prefix}-lock:before { content: @fa-var-lock; } -.@{fa-css-prefix}-flag:before { content: @fa-var-flag; } -.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; } -.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; } -.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; } -.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; } -.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; } -.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; } -.@{fa-css-prefix}-tag:before { content: @fa-var-tag; } -.@{fa-css-prefix}-tags:before { content: @fa-var-tags; } -.@{fa-css-prefix}-book:before { content: @fa-var-book; } -.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; } -.@{fa-css-prefix}-print:before { content: @fa-var-print; } -.@{fa-css-prefix}-camera:before { content: @fa-var-camera; } -.@{fa-css-prefix}-font:before { content: @fa-var-font; } -.@{fa-css-prefix}-bold:before { content: @fa-var-bold; } -.@{fa-css-prefix}-italic:before { content: @fa-var-italic; } -.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; } -.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; } -.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; } -.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; } -.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; } -.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; } -.@{fa-css-prefix}-list:before { content: @fa-var-list; } -.@{fa-css-prefix}-dedent:before, -.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; } -.@{fa-css-prefix}-indent:before { content: @fa-var-indent; } -.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; } -.@{fa-css-prefix}-photo:before, -.@{fa-css-prefix}-image:before, -.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; } -.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; } -.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; } -.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; } -.@{fa-css-prefix}-tint:before { content: @fa-var-tint; } -.@{fa-css-prefix}-edit:before, -.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; } -.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; } -.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; } -.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; } -.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; } -.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; } -.@{fa-css-prefix}-backward:before { content: @fa-var-backward; } -.@{fa-css-prefix}-play:before { content: @fa-var-play; } -.@{fa-css-prefix}-pause:before { content: @fa-var-pause; } -.@{fa-css-prefix}-stop:before { content: @fa-var-stop; } -.@{fa-css-prefix}-forward:before { content: @fa-var-forward; } -.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; } -.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; } -.@{fa-css-prefix}-eject:before { content: @fa-var-eject; } -.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; } -.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; } -.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; } -.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; } -.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; } -.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; } -.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; } -.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; } -.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; } -.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; } -.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; } -.@{fa-css-prefix}-ban:before { content: @fa-var-ban; } -.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; } -.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; } -.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; } -.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; } -.@{fa-css-prefix}-mail-forward:before, -.@{fa-css-prefix}-share:before { content: @fa-var-share; } -.@{fa-css-prefix}-expand:before { content: @fa-var-expand; } -.@{fa-css-prefix}-compress:before { content: @fa-var-compress; } -.@{fa-css-prefix}-plus:before { content: @fa-var-plus; } -.@{fa-css-prefix}-minus:before { content: @fa-var-minus; } -.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; } -.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; } -.@{fa-css-prefix}-gift:before { content: @fa-var-gift; } -.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; } -.@{fa-css-prefix}-fire:before { content: @fa-var-fire; } -.@{fa-css-prefix}-eye:before { content: @fa-var-eye; } -.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; } -.@{fa-css-prefix}-warning:before, -.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; } -.@{fa-css-prefix}-plane:before { content: @fa-var-plane; } -.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; } -.@{fa-css-prefix}-random:before { content: @fa-var-random; } -.@{fa-css-prefix}-comment:before { content: @fa-var-comment; } -.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; } -.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; } -.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; } -.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; } -.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; } -.@{fa-css-prefix}-folder:before { content: @fa-var-folder; } -.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; } -.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; } -.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; } -.@{fa-css-prefix}-bar-chart-o:before, -.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; } -.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; } -.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; } -.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; } -.@{fa-css-prefix}-key:before { content: @fa-var-key; } -.@{fa-css-prefix}-gears:before, -.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; } -.@{fa-css-prefix}-comments:before { content: @fa-var-comments; } -.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; } -.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; } -.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; } -.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; } -.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; } -.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; } -.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; } -.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; } -.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; } -.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; } -.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; } -.@{fa-css-prefix}-upload:before { content: @fa-var-upload; } -.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; } -.@{fa-css-prefix}-phone:before { content: @fa-var-phone; } -.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; } -.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; } -.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; } -.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; } -.@{fa-css-prefix}-facebook-f:before, -.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; } -.@{fa-css-prefix}-github:before { content: @fa-var-github; } -.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; } -.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; } -.@{fa-css-prefix}-feed:before, -.@{fa-css-prefix}-rss:before { content: @fa-var-rss; } -.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; } -.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; } -.@{fa-css-prefix}-bell:before { content: @fa-var-bell; } -.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; } -.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; } -.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; } -.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; } -.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; } -.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; } -.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; } -.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; } -.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; } -.@{fa-css-prefix}-globe:before { content: @fa-var-globe; } -.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; } -.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; } -.@{fa-css-prefix}-filter:before { content: @fa-var-filter; } -.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; } -.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; } -.@{fa-css-prefix}-group:before, -.@{fa-css-prefix}-users:before { content: @fa-var-users; } -.@{fa-css-prefix}-chain:before, -.@{fa-css-prefix}-link:before { content: @fa-var-link; } -.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; } -.@{fa-css-prefix}-flask:before { content: @fa-var-flask; } -.@{fa-css-prefix}-cut:before, -.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; } -.@{fa-css-prefix}-copy:before, -.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; } -.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; } -.@{fa-css-prefix}-save:before, -.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; } -.@{fa-css-prefix}-square:before { content: @fa-var-square; } -.@{fa-css-prefix}-navicon:before, -.@{fa-css-prefix}-reorder:before, -.@{fa-css-prefix}-bars:before { content: @fa-var-bars; } -.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; } -.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; } -.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; } -.@{fa-css-prefix}-underline:before { content: @fa-var-underline; } -.@{fa-css-prefix}-table:before { content: @fa-var-table; } -.@{fa-css-prefix}-magic:before { content: @fa-var-magic; } -.@{fa-css-prefix}-truck:before { content: @fa-var-truck; } -.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; } -.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; } -.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; } -.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; } -.@{fa-css-prefix}-money:before { content: @fa-var-money; } -.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; } -.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; } -.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; } -.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; } -.@{fa-css-prefix}-columns:before { content: @fa-var-columns; } -.@{fa-css-prefix}-unsorted:before, -.@{fa-css-prefix}-sort:before { content: @fa-var-sort; } -.@{fa-css-prefix}-sort-down:before, -.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; } -.@{fa-css-prefix}-sort-up:before, -.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; } -.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; } -.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; } -.@{fa-css-prefix}-rotate-left:before, -.@{fa-css-prefix}-undo:before { content: @fa-var-undo; } -.@{fa-css-prefix}-legal:before, -.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; } -.@{fa-css-prefix}-dashboard:before, -.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; } -.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; } -.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; } -.@{fa-css-prefix}-flash:before, -.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; } -.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; } -.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; } -.@{fa-css-prefix}-paste:before, -.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; } -.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; } -.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; } -.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; } -.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; } -.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; } -.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; } -.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; } -.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; } -.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; } -.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; } -.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; } -.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; } -.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; } -.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; } -.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; } -.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; } -.@{fa-css-prefix}-beer:before { content: @fa-var-beer; } -.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; } -.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; } -.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; } -.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; } -.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; } -.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; } -.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; } -.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; } -.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; } -.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; } -.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; } -.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; } -.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; } -.@{fa-css-prefix}-mobile-phone:before, -.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; } -.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; } -.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; } -.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; } -.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; } -.@{fa-css-prefix}-circle:before { content: @fa-var-circle; } -.@{fa-css-prefix}-mail-reply:before, -.@{fa-css-prefix}-reply:before { content: @fa-var-reply; } -.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; } -.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; } -.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; } -.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; } -.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; } -.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; } -.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; } -.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; } -.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; } -.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; } -.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; } -.@{fa-css-prefix}-code:before { content: @fa-var-code; } -.@{fa-css-prefix}-mail-reply-all:before, -.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; } -.@{fa-css-prefix}-star-half-empty:before, -.@{fa-css-prefix}-star-half-full:before, -.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; } -.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; } -.@{fa-css-prefix}-crop:before { content: @fa-var-crop; } -.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; } -.@{fa-css-prefix}-unlink:before, -.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; } -.@{fa-css-prefix}-question:before { content: @fa-var-question; } -.@{fa-css-prefix}-info:before { content: @fa-var-info; } -.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; } -.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; } -.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; } -.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; } -.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; } -.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; } -.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; } -.@{fa-css-prefix}-shield:before { content: @fa-var-shield; } -.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; } -.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; } -.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; } -.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; } -.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; } -.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; } -.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; } -.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; } -.@{fa-css-prefix}-html5:before { content: @fa-var-html5; } -.@{fa-css-prefix}-css3:before { content: @fa-var-css3; } -.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; } -.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; } -.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; } -.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; } -.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; } -.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; } -.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; } -.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; } -.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; } -.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; } -.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; } -.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; } -.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; } -.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; } -.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; } -.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; } -.@{fa-css-prefix}-compass:before { content: @fa-var-compass; } -.@{fa-css-prefix}-toggle-down:before, -.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; } -.@{fa-css-prefix}-toggle-up:before, -.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; } -.@{fa-css-prefix}-toggle-right:before, -.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; } -.@{fa-css-prefix}-euro:before, -.@{fa-css-prefix}-eur:before { content: @fa-var-eur; } -.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; } -.@{fa-css-prefix}-dollar:before, -.@{fa-css-prefix}-usd:before { content: @fa-var-usd; } -.@{fa-css-prefix}-rupee:before, -.@{fa-css-prefix}-inr:before { content: @fa-var-inr; } -.@{fa-css-prefix}-cny:before, -.@{fa-css-prefix}-rmb:before, -.@{fa-css-prefix}-yen:before, -.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; } -.@{fa-css-prefix}-ruble:before, -.@{fa-css-prefix}-rouble:before, -.@{fa-css-prefix}-rub:before { content: @fa-var-rub; } -.@{fa-css-prefix}-won:before, -.@{fa-css-prefix}-krw:before { content: @fa-var-krw; } -.@{fa-css-prefix}-bitcoin:before, -.@{fa-css-prefix}-btc:before { content: @fa-var-btc; } -.@{fa-css-prefix}-file:before { content: @fa-var-file; } -.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; } -.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; } -.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; } -.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; } -.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; } -.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; } -.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; } -.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; } -.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; } -.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; } -.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; } -.@{fa-css-prefix}-xing:before { content: @fa-var-xing; } -.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; } -.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; } -.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; } -.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; } -.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; } -.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; } -.@{fa-css-prefix}-adn:before { content: @fa-var-adn; } -.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; } -.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; } -.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; } -.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; } -.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; } -.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; } -.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; } -.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; } -.@{fa-css-prefix}-apple:before { content: @fa-var-apple; } -.@{fa-css-prefix}-windows:before { content: @fa-var-windows; } -.@{fa-css-prefix}-android:before { content: @fa-var-android; } -.@{fa-css-prefix}-linux:before { content: @fa-var-linux; } -.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; } -.@{fa-css-prefix}-skype:before { content: @fa-var-skype; } -.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; } -.@{fa-css-prefix}-trello:before { content: @fa-var-trello; } -.@{fa-css-prefix}-female:before { content: @fa-var-female; } -.@{fa-css-prefix}-male:before { content: @fa-var-male; } -.@{fa-css-prefix}-gittip:before, -.@{fa-css-prefix}-gratipay:before { content: @fa-var-gratipay; } -.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; } -.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; } -.@{fa-css-prefix}-archive:before { content: @fa-var-archive; } -.@{fa-css-prefix}-bug:before { content: @fa-var-bug; } -.@{fa-css-prefix}-vk:before { content: @fa-var-vk; } -.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; } -.@{fa-css-prefix}-renren:before { content: @fa-var-renren; } -.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; } -.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; } -.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; } -.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; } -.@{fa-css-prefix}-toggle-left:before, -.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; } -.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; } -.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; } -.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; } -.@{fa-css-prefix}-turkish-lira:before, -.@{fa-css-prefix}-try:before { content: @fa-var-try; } -.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; } -.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; } -.@{fa-css-prefix}-slack:before { content: @fa-var-slack; } -.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; } -.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; } -.@{fa-css-prefix}-openid:before { content: @fa-var-openid; } -.@{fa-css-prefix}-institution:before, -.@{fa-css-prefix}-bank:before, -.@{fa-css-prefix}-university:before { content: @fa-var-university; } -.@{fa-css-prefix}-mortar-board:before, -.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; } -.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; } -.@{fa-css-prefix}-google:before { content: @fa-var-google; } -.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; } -.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; } -.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; } -.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; } -.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; } -.@{fa-css-prefix}-digg:before { content: @fa-var-digg; } -.@{fa-css-prefix}-pied-piper-pp:before { content: @fa-var-pied-piper-pp; } -.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; } -.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; } -.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; } -.@{fa-css-prefix}-language:before { content: @fa-var-language; } -.@{fa-css-prefix}-fax:before { content: @fa-var-fax; } -.@{fa-css-prefix}-building:before { content: @fa-var-building; } -.@{fa-css-prefix}-child:before { content: @fa-var-child; } -.@{fa-css-prefix}-paw:before { content: @fa-var-paw; } -.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; } -.@{fa-css-prefix}-cube:before { content: @fa-var-cube; } -.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; } -.@{fa-css-prefix}-behance:before { content: @fa-var-behance; } -.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; } -.@{fa-css-prefix}-steam:before { content: @fa-var-steam; } -.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; } -.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; } -.@{fa-css-prefix}-automobile:before, -.@{fa-css-prefix}-car:before { content: @fa-var-car; } -.@{fa-css-prefix}-cab:before, -.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; } -.@{fa-css-prefix}-tree:before { content: @fa-var-tree; } -.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; } -.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; } -.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; } -.@{fa-css-prefix}-database:before { content: @fa-var-database; } -.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; } -.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; } -.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; } -.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; } -.@{fa-css-prefix}-file-photo-o:before, -.@{fa-css-prefix}-file-picture-o:before, -.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; } -.@{fa-css-prefix}-file-zip-o:before, -.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; } -.@{fa-css-prefix}-file-sound-o:before, -.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; } -.@{fa-css-prefix}-file-movie-o:before, -.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; } -.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; } -.@{fa-css-prefix}-vine:before { content: @fa-var-vine; } -.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; } -.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; } -.@{fa-css-prefix}-life-bouy:before, -.@{fa-css-prefix}-life-buoy:before, -.@{fa-css-prefix}-life-saver:before, -.@{fa-css-prefix}-support:before, -.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; } -.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; } -.@{fa-css-prefix}-ra:before, -.@{fa-css-prefix}-resistance:before, -.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; } -.@{fa-css-prefix}-ge:before, -.@{fa-css-prefix}-empire:before { content: @fa-var-empire; } -.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; } -.@{fa-css-prefix}-git:before { content: @fa-var-git; } -.@{fa-css-prefix}-y-combinator-square:before, -.@{fa-css-prefix}-yc-square:before, -.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; } -.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; } -.@{fa-css-prefix}-qq:before { content: @fa-var-qq; } -.@{fa-css-prefix}-wechat:before, -.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; } -.@{fa-css-prefix}-send:before, -.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; } -.@{fa-css-prefix}-send-o:before, -.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; } -.@{fa-css-prefix}-history:before { content: @fa-var-history; } -.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; } -.@{fa-css-prefix}-header:before { content: @fa-var-header; } -.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; } -.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; } -.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; } -.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; } -.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; } -.@{fa-css-prefix}-soccer-ball-o:before, -.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; } -.@{fa-css-prefix}-tty:before { content: @fa-var-tty; } -.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; } -.@{fa-css-prefix}-plug:before { content: @fa-var-plug; } -.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; } -.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; } -.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; } -.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; } -.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; } -.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; } -.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; } -.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; } -.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; } -.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; } -.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; } -.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; } -.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; } -.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; } -.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; } -.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; } -.@{fa-css-prefix}-trash:before { content: @fa-var-trash; } -.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; } -.@{fa-css-prefix}-at:before { content: @fa-var-at; } -.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; } -.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; } -.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; } -.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; } -.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; } -.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; } -.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; } -.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; } -.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; } -.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; } -.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; } -.@{fa-css-prefix}-bus:before { content: @fa-var-bus; } -.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; } -.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; } -.@{fa-css-prefix}-cc:before { content: @fa-var-cc; } -.@{fa-css-prefix}-shekel:before, -.@{fa-css-prefix}-sheqel:before, -.@{fa-css-prefix}-ils:before { content: @fa-var-ils; } -.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; } -.@{fa-css-prefix}-buysellads:before { content: @fa-var-buysellads; } -.@{fa-css-prefix}-connectdevelop:before { content: @fa-var-connectdevelop; } -.@{fa-css-prefix}-dashcube:before { content: @fa-var-dashcube; } -.@{fa-css-prefix}-forumbee:before { content: @fa-var-forumbee; } -.@{fa-css-prefix}-leanpub:before { content: @fa-var-leanpub; } -.@{fa-css-prefix}-sellsy:before { content: @fa-var-sellsy; } -.@{fa-css-prefix}-shirtsinbulk:before { content: @fa-var-shirtsinbulk; } -.@{fa-css-prefix}-simplybuilt:before { content: @fa-var-simplybuilt; } -.@{fa-css-prefix}-skyatlas:before { content: @fa-var-skyatlas; } -.@{fa-css-prefix}-cart-plus:before { content: @fa-var-cart-plus; } -.@{fa-css-prefix}-cart-arrow-down:before { content: @fa-var-cart-arrow-down; } -.@{fa-css-prefix}-diamond:before { content: @fa-var-diamond; } -.@{fa-css-prefix}-ship:before { content: @fa-var-ship; } -.@{fa-css-prefix}-user-secret:before { content: @fa-var-user-secret; } -.@{fa-css-prefix}-motorcycle:before { content: @fa-var-motorcycle; } -.@{fa-css-prefix}-street-view:before { content: @fa-var-street-view; } -.@{fa-css-prefix}-heartbeat:before { content: @fa-var-heartbeat; } -.@{fa-css-prefix}-venus:before { content: @fa-var-venus; } -.@{fa-css-prefix}-mars:before { content: @fa-var-mars; } -.@{fa-css-prefix}-mercury:before { content: @fa-var-mercury; } -.@{fa-css-prefix}-intersex:before, -.@{fa-css-prefix}-transgender:before { content: @fa-var-transgender; } -.@{fa-css-prefix}-transgender-alt:before { content: @fa-var-transgender-alt; } -.@{fa-css-prefix}-venus-double:before { content: @fa-var-venus-double; } -.@{fa-css-prefix}-mars-double:before { content: @fa-var-mars-double; } -.@{fa-css-prefix}-venus-mars:before { content: @fa-var-venus-mars; } -.@{fa-css-prefix}-mars-stroke:before { content: @fa-var-mars-stroke; } -.@{fa-css-prefix}-mars-stroke-v:before { content: @fa-var-mars-stroke-v; } -.@{fa-css-prefix}-mars-stroke-h:before { content: @fa-var-mars-stroke-h; } -.@{fa-css-prefix}-neuter:before { content: @fa-var-neuter; } -.@{fa-css-prefix}-genderless:before { content: @fa-var-genderless; } -.@{fa-css-prefix}-facebook-official:before { content: @fa-var-facebook-official; } -.@{fa-css-prefix}-pinterest-p:before { content: @fa-var-pinterest-p; } -.@{fa-css-prefix}-whatsapp:before { content: @fa-var-whatsapp; } -.@{fa-css-prefix}-server:before { content: @fa-var-server; } -.@{fa-css-prefix}-user-plus:before { content: @fa-var-user-plus; } -.@{fa-css-prefix}-user-times:before { content: @fa-var-user-times; } -.@{fa-css-prefix}-hotel:before, -.@{fa-css-prefix}-bed:before { content: @fa-var-bed; } -.@{fa-css-prefix}-viacoin:before { content: @fa-var-viacoin; } -.@{fa-css-prefix}-train:before { content: @fa-var-train; } -.@{fa-css-prefix}-subway:before { content: @fa-var-subway; } -.@{fa-css-prefix}-medium:before { content: @fa-var-medium; } -.@{fa-css-prefix}-yc:before, -.@{fa-css-prefix}-y-combinator:before { content: @fa-var-y-combinator; } -.@{fa-css-prefix}-optin-monster:before { content: @fa-var-optin-monster; } -.@{fa-css-prefix}-opencart:before { content: @fa-var-opencart; } -.@{fa-css-prefix}-expeditedssl:before { content: @fa-var-expeditedssl; } -.@{fa-css-prefix}-battery-4:before, -.@{fa-css-prefix}-battery:before, -.@{fa-css-prefix}-battery-full:before { content: @fa-var-battery-full; } -.@{fa-css-prefix}-battery-3:before, -.@{fa-css-prefix}-battery-three-quarters:before { content: @fa-var-battery-three-quarters; } -.@{fa-css-prefix}-battery-2:before, -.@{fa-css-prefix}-battery-half:before { content: @fa-var-battery-half; } -.@{fa-css-prefix}-battery-1:before, -.@{fa-css-prefix}-battery-quarter:before { content: @fa-var-battery-quarter; } -.@{fa-css-prefix}-battery-0:before, -.@{fa-css-prefix}-battery-empty:before { content: @fa-var-battery-empty; } -.@{fa-css-prefix}-mouse-pointer:before { content: @fa-var-mouse-pointer; } -.@{fa-css-prefix}-i-cursor:before { content: @fa-var-i-cursor; } -.@{fa-css-prefix}-object-group:before { content: @fa-var-object-group; } -.@{fa-css-prefix}-object-ungroup:before { content: @fa-var-object-ungroup; } -.@{fa-css-prefix}-sticky-note:before { content: @fa-var-sticky-note; } -.@{fa-css-prefix}-sticky-note-o:before { content: @fa-var-sticky-note-o; } -.@{fa-css-prefix}-cc-jcb:before { content: @fa-var-cc-jcb; } -.@{fa-css-prefix}-cc-diners-club:before { content: @fa-var-cc-diners-club; } -.@{fa-css-prefix}-clone:before { content: @fa-var-clone; } -.@{fa-css-prefix}-balance-scale:before { content: @fa-var-balance-scale; } -.@{fa-css-prefix}-hourglass-o:before { content: @fa-var-hourglass-o; } -.@{fa-css-prefix}-hourglass-1:before, -.@{fa-css-prefix}-hourglass-start:before { content: @fa-var-hourglass-start; } -.@{fa-css-prefix}-hourglass-2:before, -.@{fa-css-prefix}-hourglass-half:before { content: @fa-var-hourglass-half; } -.@{fa-css-prefix}-hourglass-3:before, -.@{fa-css-prefix}-hourglass-end:before { content: @fa-var-hourglass-end; } -.@{fa-css-prefix}-hourglass:before { content: @fa-var-hourglass; } -.@{fa-css-prefix}-hand-grab-o:before, -.@{fa-css-prefix}-hand-rock-o:before { content: @fa-var-hand-rock-o; } -.@{fa-css-prefix}-hand-stop-o:before, -.@{fa-css-prefix}-hand-paper-o:before { content: @fa-var-hand-paper-o; } -.@{fa-css-prefix}-hand-scissors-o:before { content: @fa-var-hand-scissors-o; } -.@{fa-css-prefix}-hand-lizard-o:before { content: @fa-var-hand-lizard-o; } -.@{fa-css-prefix}-hand-spock-o:before { content: @fa-var-hand-spock-o; } -.@{fa-css-prefix}-hand-pointer-o:before { content: @fa-var-hand-pointer-o; } -.@{fa-css-prefix}-hand-peace-o:before { content: @fa-var-hand-peace-o; } -.@{fa-css-prefix}-trademark:before { content: @fa-var-trademark; } -.@{fa-css-prefix}-registered:before { content: @fa-var-registered; } -.@{fa-css-prefix}-creative-commons:before { content: @fa-var-creative-commons; } -.@{fa-css-prefix}-gg:before { content: @fa-var-gg; } -.@{fa-css-prefix}-gg-circle:before { content: @fa-var-gg-circle; } -.@{fa-css-prefix}-tripadvisor:before { content: @fa-var-tripadvisor; } -.@{fa-css-prefix}-odnoklassniki:before { content: @fa-var-odnoklassniki; } -.@{fa-css-prefix}-odnoklassniki-square:before { content: @fa-var-odnoklassniki-square; } -.@{fa-css-prefix}-get-pocket:before { content: @fa-var-get-pocket; } -.@{fa-css-prefix}-wikipedia-w:before { content: @fa-var-wikipedia-w; } -.@{fa-css-prefix}-safari:before { content: @fa-var-safari; } -.@{fa-css-prefix}-chrome:before { content: @fa-var-chrome; } -.@{fa-css-prefix}-firefox:before { content: @fa-var-firefox; } -.@{fa-css-prefix}-opera:before { content: @fa-var-opera; } -.@{fa-css-prefix}-internet-explorer:before { content: @fa-var-internet-explorer; } -.@{fa-css-prefix}-tv:before, -.@{fa-css-prefix}-television:before { content: @fa-var-television; } -.@{fa-css-prefix}-contao:before { content: @fa-var-contao; } -.@{fa-css-prefix}-500px:before { content: @fa-var-500px; } -.@{fa-css-prefix}-amazon:before { content: @fa-var-amazon; } -.@{fa-css-prefix}-calendar-plus-o:before { content: @fa-var-calendar-plus-o; } -.@{fa-css-prefix}-calendar-minus-o:before { content: @fa-var-calendar-minus-o; } -.@{fa-css-prefix}-calendar-times-o:before { content: @fa-var-calendar-times-o; } -.@{fa-css-prefix}-calendar-check-o:before { content: @fa-var-calendar-check-o; } -.@{fa-css-prefix}-industry:before { content: @fa-var-industry; } -.@{fa-css-prefix}-map-pin:before { content: @fa-var-map-pin; } -.@{fa-css-prefix}-map-signs:before { content: @fa-var-map-signs; } -.@{fa-css-prefix}-map-o:before { content: @fa-var-map-o; } -.@{fa-css-prefix}-map:before { content: @fa-var-map; } -.@{fa-css-prefix}-commenting:before { content: @fa-var-commenting; } -.@{fa-css-prefix}-commenting-o:before { content: @fa-var-commenting-o; } -.@{fa-css-prefix}-houzz:before { content: @fa-var-houzz; } -.@{fa-css-prefix}-vimeo:before { content: @fa-var-vimeo; } -.@{fa-css-prefix}-black-tie:before { content: @fa-var-black-tie; } -.@{fa-css-prefix}-fonticons:before { content: @fa-var-fonticons; } -.@{fa-css-prefix}-reddit-alien:before { content: @fa-var-reddit-alien; } -.@{fa-css-prefix}-edge:before { content: @fa-var-edge; } -.@{fa-css-prefix}-credit-card-alt:before { content: @fa-var-credit-card-alt; } -.@{fa-css-prefix}-codiepie:before { content: @fa-var-codiepie; } -.@{fa-css-prefix}-modx:before { content: @fa-var-modx; } -.@{fa-css-prefix}-fort-awesome:before { content: @fa-var-fort-awesome; } -.@{fa-css-prefix}-usb:before { content: @fa-var-usb; } -.@{fa-css-prefix}-product-hunt:before { content: @fa-var-product-hunt; } -.@{fa-css-prefix}-mixcloud:before { content: @fa-var-mixcloud; } -.@{fa-css-prefix}-scribd:before { content: @fa-var-scribd; } -.@{fa-css-prefix}-pause-circle:before { content: @fa-var-pause-circle; } -.@{fa-css-prefix}-pause-circle-o:before { content: @fa-var-pause-circle-o; } -.@{fa-css-prefix}-stop-circle:before { content: @fa-var-stop-circle; } -.@{fa-css-prefix}-stop-circle-o:before { content: @fa-var-stop-circle-o; } -.@{fa-css-prefix}-shopping-bag:before { content: @fa-var-shopping-bag; } -.@{fa-css-prefix}-shopping-basket:before { content: @fa-var-shopping-basket; } -.@{fa-css-prefix}-hashtag:before { content: @fa-var-hashtag; } -.@{fa-css-prefix}-bluetooth:before { content: @fa-var-bluetooth; } -.@{fa-css-prefix}-bluetooth-b:before { content: @fa-var-bluetooth-b; } -.@{fa-css-prefix}-percent:before { content: @fa-var-percent; } -.@{fa-css-prefix}-gitlab:before { content: @fa-var-gitlab; } -.@{fa-css-prefix}-wpbeginner:before { content: @fa-var-wpbeginner; } -.@{fa-css-prefix}-wpforms:before { content: @fa-var-wpforms; } -.@{fa-css-prefix}-envira:before { content: @fa-var-envira; } -.@{fa-css-prefix}-universal-access:before { content: @fa-var-universal-access; } -.@{fa-css-prefix}-wheelchair-alt:before { content: @fa-var-wheelchair-alt; } -.@{fa-css-prefix}-question-circle-o:before { content: @fa-var-question-circle-o; } -.@{fa-css-prefix}-blind:before { content: @fa-var-blind; } -.@{fa-css-prefix}-audio-description:before { content: @fa-var-audio-description; } -.@{fa-css-prefix}-volume-control-phone:before { content: @fa-var-volume-control-phone; } -.@{fa-css-prefix}-braille:before { content: @fa-var-braille; } -.@{fa-css-prefix}-assistive-listening-systems:before { content: @fa-var-assistive-listening-systems; } -.@{fa-css-prefix}-asl-interpreting:before, -.@{fa-css-prefix}-american-sign-language-interpreting:before { content: @fa-var-american-sign-language-interpreting; } -.@{fa-css-prefix}-deafness:before, -.@{fa-css-prefix}-hard-of-hearing:before, -.@{fa-css-prefix}-deaf:before { content: @fa-var-deaf; } -.@{fa-css-prefix}-glide:before { content: @fa-var-glide; } -.@{fa-css-prefix}-glide-g:before { content: @fa-var-glide-g; } -.@{fa-css-prefix}-signing:before, -.@{fa-css-prefix}-sign-language:before { content: @fa-var-sign-language; } -.@{fa-css-prefix}-low-vision:before { content: @fa-var-low-vision; } -.@{fa-css-prefix}-viadeo:before { content: @fa-var-viadeo; } -.@{fa-css-prefix}-viadeo-square:before { content: @fa-var-viadeo-square; } -.@{fa-css-prefix}-snapchat:before { content: @fa-var-snapchat; } -.@{fa-css-prefix}-snapchat-ghost:before { content: @fa-var-snapchat-ghost; } -.@{fa-css-prefix}-snapchat-square:before { content: @fa-var-snapchat-square; } -.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; } -.@{fa-css-prefix}-first-order:before { content: @fa-var-first-order; } -.@{fa-css-prefix}-yoast:before { content: @fa-var-yoast; } -.@{fa-css-prefix}-themeisle:before { content: @fa-var-themeisle; } -.@{fa-css-prefix}-google-plus-circle:before, -.@{fa-css-prefix}-google-plus-official:before { content: @fa-var-google-plus-official; } -.@{fa-css-prefix}-fa:before, -.@{fa-css-prefix}-font-awesome:before { content: @fa-var-font-awesome; } -.@{fa-css-prefix}-handshake-o:before { content: @fa-var-handshake-o; } -.@{fa-css-prefix}-envelope-open:before { content: @fa-var-envelope-open; } -.@{fa-css-prefix}-envelope-open-o:before { content: @fa-var-envelope-open-o; } -.@{fa-css-prefix}-linode:before { content: @fa-var-linode; } -.@{fa-css-prefix}-address-book:before { content: @fa-var-address-book; } -.@{fa-css-prefix}-address-book-o:before { content: @fa-var-address-book-o; } -.@{fa-css-prefix}-vcard:before, -.@{fa-css-prefix}-address-card:before { content: @fa-var-address-card; } -.@{fa-css-prefix}-vcard-o:before, -.@{fa-css-prefix}-address-card-o:before { content: @fa-var-address-card-o; } -.@{fa-css-prefix}-user-circle:before { content: @fa-var-user-circle; } -.@{fa-css-prefix}-user-circle-o:before { content: @fa-var-user-circle-o; } -.@{fa-css-prefix}-user-o:before { content: @fa-var-user-o; } -.@{fa-css-prefix}-id-badge:before { content: @fa-var-id-badge; } -.@{fa-css-prefix}-drivers-license:before, -.@{fa-css-prefix}-id-card:before { content: @fa-var-id-card; } -.@{fa-css-prefix}-drivers-license-o:before, -.@{fa-css-prefix}-id-card-o:before { content: @fa-var-id-card-o; } -.@{fa-css-prefix}-quora:before { content: @fa-var-quora; } -.@{fa-css-prefix}-free-code-camp:before { content: @fa-var-free-code-camp; } -.@{fa-css-prefix}-telegram:before { content: @fa-var-telegram; } -.@{fa-css-prefix}-thermometer-4:before, -.@{fa-css-prefix}-thermometer:before, -.@{fa-css-prefix}-thermometer-full:before { content: @fa-var-thermometer-full; } -.@{fa-css-prefix}-thermometer-3:before, -.@{fa-css-prefix}-thermometer-three-quarters:before { content: @fa-var-thermometer-three-quarters; } -.@{fa-css-prefix}-thermometer-2:before, -.@{fa-css-prefix}-thermometer-half:before { content: @fa-var-thermometer-half; } -.@{fa-css-prefix}-thermometer-1:before, -.@{fa-css-prefix}-thermometer-quarter:before { content: @fa-var-thermometer-quarter; } -.@{fa-css-prefix}-thermometer-0:before, -.@{fa-css-prefix}-thermometer-empty:before { content: @fa-var-thermometer-empty; } -.@{fa-css-prefix}-shower:before { content: @fa-var-shower; } -.@{fa-css-prefix}-bathtub:before, -.@{fa-css-prefix}-s15:before, -.@{fa-css-prefix}-bath:before { content: @fa-var-bath; } -.@{fa-css-prefix}-podcast:before { content: @fa-var-podcast; } -.@{fa-css-prefix}-window-maximize:before { content: @fa-var-window-maximize; } -.@{fa-css-prefix}-window-minimize:before { content: @fa-var-window-minimize; } -.@{fa-css-prefix}-window-restore:before { content: @fa-var-window-restore; } -.@{fa-css-prefix}-times-rectangle:before, -.@{fa-css-prefix}-window-close:before { content: @fa-var-window-close; } -.@{fa-css-prefix}-times-rectangle-o:before, -.@{fa-css-prefix}-window-close-o:before { content: @fa-var-window-close-o; } -.@{fa-css-prefix}-bandcamp:before { content: @fa-var-bandcamp; } -.@{fa-css-prefix}-grav:before { content: @fa-var-grav; } -.@{fa-css-prefix}-etsy:before { content: @fa-var-etsy; } -.@{fa-css-prefix}-imdb:before { content: @fa-var-imdb; } -.@{fa-css-prefix}-ravelry:before { content: @fa-var-ravelry; } -.@{fa-css-prefix}-eercast:before { content: @fa-var-eercast; } -.@{fa-css-prefix}-microchip:before { content: @fa-var-microchip; } -.@{fa-css-prefix}-snowflake-o:before { content: @fa-var-snowflake-o; } -.@{fa-css-prefix}-superpowers:before { content: @fa-var-superpowers; } -.@{fa-css-prefix}-wpexplorer:before { content: @fa-var-wpexplorer; } -.@{fa-css-prefix}-meetup:before { content: @fa-var-meetup; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less deleted file mode 100644 index c9d646770e..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/larger.less +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.@{fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.@{fa-css-prefix}-2x { font-size: 2em; } -.@{fa-css-prefix}-3x { font-size: 3em; } -.@{fa-css-prefix}-4x { font-size: 4em; } -.@{fa-css-prefix}-5x { font-size: 5em; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less deleted file mode 100644 index 0b440382f6..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/list.less +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.@{fa-css-prefix}-ul { - padding-left: 0; - margin-left: @fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.@{fa-css-prefix}-li { - position: absolute; - left: -@fa-li-width; - width: @fa-li-width; - top: (2em / 14); - text-align: center; - &.@{fa-css-prefix}-lg { - left: (-@fa-li-width + (4em / 14)); - } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less deleted file mode 100644 index beef231d0e..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/mixins.less +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -.fa-icon() { - display: inline-block; - font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -.fa-icon-rotate(@degrees, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; - -webkit-transform: rotate(@degrees); - -ms-transform: rotate(@degrees); - transform: rotate(@degrees); -} - -.fa-icon-flip(@horiz, @vert, @rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; - -webkit-transform: scale(@horiz, @vert); - -ms-transform: scale(@horiz, @vert); - transform: scale(@horiz, @vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -.sr-only() { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -.sr-only-focusable() { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less deleted file mode 100644 index 835be41f81..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/path.less +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); - src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), - url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), - url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), - url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), - url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); - // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less deleted file mode 100644 index f6ba81475b..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/rotated-flipped.less +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } -.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } -.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } - -.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } -.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .@{fa-css-prefix}-rotate-90, -:root .@{fa-css-prefix}-rotate-180, -:root .@{fa-css-prefix}-rotate-270, -:root .@{fa-css-prefix}-flip-horizontal, -:root .@{fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less deleted file mode 100644 index 11c188196d..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/screen-reader.less +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { .sr-only(); } -.sr-only-focusable { .sr-only-focusable(); } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less deleted file mode 100644 index fc53fb0e7a..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/stacked.less +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.@{fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.@{fa-css-prefix}-stack-1x { line-height: inherit; } -.@{fa-css-prefix}-stack-2x { font-size: 2em; } -.@{fa-css-prefix}-inverse { color: @fa-inverse; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less deleted file mode 100644 index 7ddbbc0115..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/less/variables.less +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -@fa-font-path: "../fonts"; -@fa-font-size-base: 14px; -@fa-line-height-base: 1; -//@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts"; // for referencing Bootstrap CDN font files directly -@fa-css-prefix: fa; -@fa-version: "4.7.0"; -@fa-border-color: #eee; -@fa-inverse: #fff; -@fa-li-width: (30em / 14); - -@fa-var-500px: "\f26e"; -@fa-var-address-book: "\f2b9"; -@fa-var-address-book-o: "\f2ba"; -@fa-var-address-card: "\f2bb"; -@fa-var-address-card-o: "\f2bc"; -@fa-var-adjust: "\f042"; -@fa-var-adn: "\f170"; -@fa-var-align-center: "\f037"; -@fa-var-align-justify: "\f039"; -@fa-var-align-left: "\f036"; -@fa-var-align-right: "\f038"; -@fa-var-amazon: "\f270"; -@fa-var-ambulance: "\f0f9"; -@fa-var-american-sign-language-interpreting: "\f2a3"; -@fa-var-anchor: "\f13d"; -@fa-var-android: "\f17b"; -@fa-var-angellist: "\f209"; -@fa-var-angle-double-down: "\f103"; -@fa-var-angle-double-left: "\f100"; -@fa-var-angle-double-right: "\f101"; -@fa-var-angle-double-up: "\f102"; -@fa-var-angle-down: "\f107"; -@fa-var-angle-left: "\f104"; -@fa-var-angle-right: "\f105"; -@fa-var-angle-up: "\f106"; -@fa-var-apple: "\f179"; -@fa-var-archive: "\f187"; -@fa-var-area-chart: "\f1fe"; -@fa-var-arrow-circle-down: "\f0ab"; -@fa-var-arrow-circle-left: "\f0a8"; -@fa-var-arrow-circle-o-down: "\f01a"; -@fa-var-arrow-circle-o-left: "\f190"; -@fa-var-arrow-circle-o-right: "\f18e"; -@fa-var-arrow-circle-o-up: "\f01b"; -@fa-var-arrow-circle-right: "\f0a9"; -@fa-var-arrow-circle-up: "\f0aa"; -@fa-var-arrow-down: "\f063"; -@fa-var-arrow-left: "\f060"; -@fa-var-arrow-right: "\f061"; -@fa-var-arrow-up: "\f062"; -@fa-var-arrows: "\f047"; -@fa-var-arrows-alt: "\f0b2"; -@fa-var-arrows-h: "\f07e"; -@fa-var-arrows-v: "\f07d"; -@fa-var-asl-interpreting: "\f2a3"; -@fa-var-assistive-listening-systems: "\f2a2"; -@fa-var-asterisk: "\f069"; -@fa-var-at: "\f1fa"; -@fa-var-audio-description: "\f29e"; -@fa-var-automobile: "\f1b9"; -@fa-var-backward: "\f04a"; -@fa-var-balance-scale: "\f24e"; -@fa-var-ban: "\f05e"; -@fa-var-bandcamp: "\f2d5"; -@fa-var-bank: "\f19c"; -@fa-var-bar-chart: "\f080"; -@fa-var-bar-chart-o: "\f080"; -@fa-var-barcode: "\f02a"; -@fa-var-bars: "\f0c9"; -@fa-var-bath: "\f2cd"; -@fa-var-bathtub: "\f2cd"; -@fa-var-battery: "\f240"; -@fa-var-battery-0: "\f244"; -@fa-var-battery-1: "\f243"; -@fa-var-battery-2: "\f242"; -@fa-var-battery-3: "\f241"; -@fa-var-battery-4: "\f240"; -@fa-var-battery-empty: "\f244"; -@fa-var-battery-full: "\f240"; -@fa-var-battery-half: "\f242"; -@fa-var-battery-quarter: "\f243"; -@fa-var-battery-three-quarters: "\f241"; -@fa-var-bed: "\f236"; -@fa-var-beer: "\f0fc"; -@fa-var-behance: "\f1b4"; -@fa-var-behance-square: "\f1b5"; -@fa-var-bell: "\f0f3"; -@fa-var-bell-o: "\f0a2"; -@fa-var-bell-slash: "\f1f6"; -@fa-var-bell-slash-o: "\f1f7"; -@fa-var-bicycle: "\f206"; -@fa-var-binoculars: "\f1e5"; -@fa-var-birthday-cake: "\f1fd"; -@fa-var-bitbucket: "\f171"; -@fa-var-bitbucket-square: "\f172"; -@fa-var-bitcoin: "\f15a"; -@fa-var-black-tie: "\f27e"; -@fa-var-blind: "\f29d"; -@fa-var-bluetooth: "\f293"; -@fa-var-bluetooth-b: "\f294"; -@fa-var-bold: "\f032"; -@fa-var-bolt: "\f0e7"; -@fa-var-bomb: "\f1e2"; -@fa-var-book: "\f02d"; -@fa-var-bookmark: "\f02e"; -@fa-var-bookmark-o: "\f097"; -@fa-var-braille: "\f2a1"; -@fa-var-briefcase: "\f0b1"; -@fa-var-btc: "\f15a"; -@fa-var-bug: "\f188"; -@fa-var-building: "\f1ad"; -@fa-var-building-o: "\f0f7"; -@fa-var-bullhorn: "\f0a1"; -@fa-var-bullseye: "\f140"; -@fa-var-bus: "\f207"; -@fa-var-buysellads: "\f20d"; -@fa-var-cab: "\f1ba"; -@fa-var-calculator: "\f1ec"; -@fa-var-calendar: "\f073"; -@fa-var-calendar-check-o: "\f274"; -@fa-var-calendar-minus-o: "\f272"; -@fa-var-calendar-o: "\f133"; -@fa-var-calendar-plus-o: "\f271"; -@fa-var-calendar-times-o: "\f273"; -@fa-var-camera: "\f030"; -@fa-var-camera-retro: "\f083"; -@fa-var-car: "\f1b9"; -@fa-var-caret-down: "\f0d7"; -@fa-var-caret-left: "\f0d9"; -@fa-var-caret-right: "\f0da"; -@fa-var-caret-square-o-down: "\f150"; -@fa-var-caret-square-o-left: "\f191"; -@fa-var-caret-square-o-right: "\f152"; -@fa-var-caret-square-o-up: "\f151"; -@fa-var-caret-up: "\f0d8"; -@fa-var-cart-arrow-down: "\f218"; -@fa-var-cart-plus: "\f217"; -@fa-var-cc: "\f20a"; -@fa-var-cc-amex: "\f1f3"; -@fa-var-cc-diners-club: "\f24c"; -@fa-var-cc-discover: "\f1f2"; -@fa-var-cc-jcb: "\f24b"; -@fa-var-cc-mastercard: "\f1f1"; -@fa-var-cc-paypal: "\f1f4"; -@fa-var-cc-stripe: "\f1f5"; -@fa-var-cc-visa: "\f1f0"; -@fa-var-certificate: "\f0a3"; -@fa-var-chain: "\f0c1"; -@fa-var-chain-broken: "\f127"; -@fa-var-check: "\f00c"; -@fa-var-check-circle: "\f058"; -@fa-var-check-circle-o: "\f05d"; -@fa-var-check-square: "\f14a"; -@fa-var-check-square-o: "\f046"; -@fa-var-chevron-circle-down: "\f13a"; -@fa-var-chevron-circle-left: "\f137"; -@fa-var-chevron-circle-right: "\f138"; -@fa-var-chevron-circle-up: "\f139"; -@fa-var-chevron-down: "\f078"; -@fa-var-chevron-left: "\f053"; -@fa-var-chevron-right: "\f054"; -@fa-var-chevron-up: "\f077"; -@fa-var-child: "\f1ae"; -@fa-var-chrome: "\f268"; -@fa-var-circle: "\f111"; -@fa-var-circle-o: "\f10c"; -@fa-var-circle-o-notch: "\f1ce"; -@fa-var-circle-thin: "\f1db"; -@fa-var-clipboard: "\f0ea"; -@fa-var-clock-o: "\f017"; -@fa-var-clone: "\f24d"; -@fa-var-close: "\f00d"; -@fa-var-cloud: "\f0c2"; -@fa-var-cloud-download: "\f0ed"; -@fa-var-cloud-upload: "\f0ee"; -@fa-var-cny: "\f157"; -@fa-var-code: "\f121"; -@fa-var-code-fork: "\f126"; -@fa-var-codepen: "\f1cb"; -@fa-var-codiepie: "\f284"; -@fa-var-coffee: "\f0f4"; -@fa-var-cog: "\f013"; -@fa-var-cogs: "\f085"; -@fa-var-columns: "\f0db"; -@fa-var-comment: "\f075"; -@fa-var-comment-o: "\f0e5"; -@fa-var-commenting: "\f27a"; -@fa-var-commenting-o: "\f27b"; -@fa-var-comments: "\f086"; -@fa-var-comments-o: "\f0e6"; -@fa-var-compass: "\f14e"; -@fa-var-compress: "\f066"; -@fa-var-connectdevelop: "\f20e"; -@fa-var-contao: "\f26d"; -@fa-var-copy: "\f0c5"; -@fa-var-copyright: "\f1f9"; -@fa-var-creative-commons: "\f25e"; -@fa-var-credit-card: "\f09d"; -@fa-var-credit-card-alt: "\f283"; -@fa-var-crop: "\f125"; -@fa-var-crosshairs: "\f05b"; -@fa-var-css3: "\f13c"; -@fa-var-cube: "\f1b2"; -@fa-var-cubes: "\f1b3"; -@fa-var-cut: "\f0c4"; -@fa-var-cutlery: "\f0f5"; -@fa-var-dashboard: "\f0e4"; -@fa-var-dashcube: "\f210"; -@fa-var-database: "\f1c0"; -@fa-var-deaf: "\f2a4"; -@fa-var-deafness: "\f2a4"; -@fa-var-dedent: "\f03b"; -@fa-var-delicious: "\f1a5"; -@fa-var-desktop: "\f108"; -@fa-var-deviantart: "\f1bd"; -@fa-var-diamond: "\f219"; -@fa-var-digg: "\f1a6"; -@fa-var-dollar: "\f155"; -@fa-var-dot-circle-o: "\f192"; -@fa-var-download: "\f019"; -@fa-var-dribbble: "\f17d"; -@fa-var-drivers-license: "\f2c2"; -@fa-var-drivers-license-o: "\f2c3"; -@fa-var-dropbox: "\f16b"; -@fa-var-drupal: "\f1a9"; -@fa-var-edge: "\f282"; -@fa-var-edit: "\f044"; -@fa-var-eercast: "\f2da"; -@fa-var-eject: "\f052"; -@fa-var-ellipsis-h: "\f141"; -@fa-var-ellipsis-v: "\f142"; -@fa-var-empire: "\f1d1"; -@fa-var-envelope: "\f0e0"; -@fa-var-envelope-o: "\f003"; -@fa-var-envelope-open: "\f2b6"; -@fa-var-envelope-open-o: "\f2b7"; -@fa-var-envelope-square: "\f199"; -@fa-var-envira: "\f299"; -@fa-var-eraser: "\f12d"; -@fa-var-etsy: "\f2d7"; -@fa-var-eur: "\f153"; -@fa-var-euro: "\f153"; -@fa-var-exchange: "\f0ec"; -@fa-var-exclamation: "\f12a"; -@fa-var-exclamation-circle: "\f06a"; -@fa-var-exclamation-triangle: "\f071"; -@fa-var-expand: "\f065"; -@fa-var-expeditedssl: "\f23e"; -@fa-var-external-link: "\f08e"; -@fa-var-external-link-square: "\f14c"; -@fa-var-eye: "\f06e"; -@fa-var-eye-slash: "\f070"; -@fa-var-eyedropper: "\f1fb"; -@fa-var-fa: "\f2b4"; -@fa-var-facebook: "\f09a"; -@fa-var-facebook-f: "\f09a"; -@fa-var-facebook-official: "\f230"; -@fa-var-facebook-square: "\f082"; -@fa-var-fast-backward: "\f049"; -@fa-var-fast-forward: "\f050"; -@fa-var-fax: "\f1ac"; -@fa-var-feed: "\f09e"; -@fa-var-female: "\f182"; -@fa-var-fighter-jet: "\f0fb"; -@fa-var-file: "\f15b"; -@fa-var-file-archive-o: "\f1c6"; -@fa-var-file-audio-o: "\f1c7"; -@fa-var-file-code-o: "\f1c9"; -@fa-var-file-excel-o: "\f1c3"; -@fa-var-file-image-o: "\f1c5"; -@fa-var-file-movie-o: "\f1c8"; -@fa-var-file-o: "\f016"; -@fa-var-file-pdf-o: "\f1c1"; -@fa-var-file-photo-o: "\f1c5"; -@fa-var-file-picture-o: "\f1c5"; -@fa-var-file-powerpoint-o: "\f1c4"; -@fa-var-file-sound-o: "\f1c7"; -@fa-var-file-text: "\f15c"; -@fa-var-file-text-o: "\f0f6"; -@fa-var-file-video-o: "\f1c8"; -@fa-var-file-word-o: "\f1c2"; -@fa-var-file-zip-o: "\f1c6"; -@fa-var-files-o: "\f0c5"; -@fa-var-film: "\f008"; -@fa-var-filter: "\f0b0"; -@fa-var-fire: "\f06d"; -@fa-var-fire-extinguisher: "\f134"; -@fa-var-firefox: "\f269"; -@fa-var-first-order: "\f2b0"; -@fa-var-flag: "\f024"; -@fa-var-flag-checkered: "\f11e"; -@fa-var-flag-o: "\f11d"; -@fa-var-flash: "\f0e7"; -@fa-var-flask: "\f0c3"; -@fa-var-flickr: "\f16e"; -@fa-var-floppy-o: "\f0c7"; -@fa-var-folder: "\f07b"; -@fa-var-folder-o: "\f114"; -@fa-var-folder-open: "\f07c"; -@fa-var-folder-open-o: "\f115"; -@fa-var-font: "\f031"; -@fa-var-font-awesome: "\f2b4"; -@fa-var-fonticons: "\f280"; -@fa-var-fort-awesome: "\f286"; -@fa-var-forumbee: "\f211"; -@fa-var-forward: "\f04e"; -@fa-var-foursquare: "\f180"; -@fa-var-free-code-camp: "\f2c5"; -@fa-var-frown-o: "\f119"; -@fa-var-futbol-o: "\f1e3"; -@fa-var-gamepad: "\f11b"; -@fa-var-gavel: "\f0e3"; -@fa-var-gbp: "\f154"; -@fa-var-ge: "\f1d1"; -@fa-var-gear: "\f013"; -@fa-var-gears: "\f085"; -@fa-var-genderless: "\f22d"; -@fa-var-get-pocket: "\f265"; -@fa-var-gg: "\f260"; -@fa-var-gg-circle: "\f261"; -@fa-var-gift: "\f06b"; -@fa-var-git: "\f1d3"; -@fa-var-git-square: "\f1d2"; -@fa-var-github: "\f09b"; -@fa-var-github-alt: "\f113"; -@fa-var-github-square: "\f092"; -@fa-var-gitlab: "\f296"; -@fa-var-gittip: "\f184"; -@fa-var-glass: "\f000"; -@fa-var-glide: "\f2a5"; -@fa-var-glide-g: "\f2a6"; -@fa-var-globe: "\f0ac"; -@fa-var-google: "\f1a0"; -@fa-var-google-plus: "\f0d5"; -@fa-var-google-plus-circle: "\f2b3"; -@fa-var-google-plus-official: "\f2b3"; -@fa-var-google-plus-square: "\f0d4"; -@fa-var-google-wallet: "\f1ee"; -@fa-var-graduation-cap: "\f19d"; -@fa-var-gratipay: "\f184"; -@fa-var-grav: "\f2d6"; -@fa-var-group: "\f0c0"; -@fa-var-h-square: "\f0fd"; -@fa-var-hacker-news: "\f1d4"; -@fa-var-hand-grab-o: "\f255"; -@fa-var-hand-lizard-o: "\f258"; -@fa-var-hand-o-down: "\f0a7"; -@fa-var-hand-o-left: "\f0a5"; -@fa-var-hand-o-right: "\f0a4"; -@fa-var-hand-o-up: "\f0a6"; -@fa-var-hand-paper-o: "\f256"; -@fa-var-hand-peace-o: "\f25b"; -@fa-var-hand-pointer-o: "\f25a"; -@fa-var-hand-rock-o: "\f255"; -@fa-var-hand-scissors-o: "\f257"; -@fa-var-hand-spock-o: "\f259"; -@fa-var-hand-stop-o: "\f256"; -@fa-var-handshake-o: "\f2b5"; -@fa-var-hard-of-hearing: "\f2a4"; -@fa-var-hashtag: "\f292"; -@fa-var-hdd-o: "\f0a0"; -@fa-var-header: "\f1dc"; -@fa-var-headphones: "\f025"; -@fa-var-heart: "\f004"; -@fa-var-heart-o: "\f08a"; -@fa-var-heartbeat: "\f21e"; -@fa-var-history: "\f1da"; -@fa-var-home: "\f015"; -@fa-var-hospital-o: "\f0f8"; -@fa-var-hotel: "\f236"; -@fa-var-hourglass: "\f254"; -@fa-var-hourglass-1: "\f251"; -@fa-var-hourglass-2: "\f252"; -@fa-var-hourglass-3: "\f253"; -@fa-var-hourglass-end: "\f253"; -@fa-var-hourglass-half: "\f252"; -@fa-var-hourglass-o: "\f250"; -@fa-var-hourglass-start: "\f251"; -@fa-var-houzz: "\f27c"; -@fa-var-html5: "\f13b"; -@fa-var-i-cursor: "\f246"; -@fa-var-id-badge: "\f2c1"; -@fa-var-id-card: "\f2c2"; -@fa-var-id-card-o: "\f2c3"; -@fa-var-ils: "\f20b"; -@fa-var-image: "\f03e"; -@fa-var-imdb: "\f2d8"; -@fa-var-inbox: "\f01c"; -@fa-var-indent: "\f03c"; -@fa-var-industry: "\f275"; -@fa-var-info: "\f129"; -@fa-var-info-circle: "\f05a"; -@fa-var-inr: "\f156"; -@fa-var-instagram: "\f16d"; -@fa-var-institution: "\f19c"; -@fa-var-internet-explorer: "\f26b"; -@fa-var-intersex: "\f224"; -@fa-var-ioxhost: "\f208"; -@fa-var-italic: "\f033"; -@fa-var-joomla: "\f1aa"; -@fa-var-jpy: "\f157"; -@fa-var-jsfiddle: "\f1cc"; -@fa-var-key: "\f084"; -@fa-var-keyboard-o: "\f11c"; -@fa-var-krw: "\f159"; -@fa-var-language: "\f1ab"; -@fa-var-laptop: "\f109"; -@fa-var-lastfm: "\f202"; -@fa-var-lastfm-square: "\f203"; -@fa-var-leaf: "\f06c"; -@fa-var-leanpub: "\f212"; -@fa-var-legal: "\f0e3"; -@fa-var-lemon-o: "\f094"; -@fa-var-level-down: "\f149"; -@fa-var-level-up: "\f148"; -@fa-var-life-bouy: "\f1cd"; -@fa-var-life-buoy: "\f1cd"; -@fa-var-life-ring: "\f1cd"; -@fa-var-life-saver: "\f1cd"; -@fa-var-lightbulb-o: "\f0eb"; -@fa-var-line-chart: "\f201"; -@fa-var-link: "\f0c1"; -@fa-var-linkedin: "\f0e1"; -@fa-var-linkedin-square: "\f08c"; -@fa-var-linode: "\f2b8"; -@fa-var-linux: "\f17c"; -@fa-var-list: "\f03a"; -@fa-var-list-alt: "\f022"; -@fa-var-list-ol: "\f0cb"; -@fa-var-list-ul: "\f0ca"; -@fa-var-location-arrow: "\f124"; -@fa-var-lock: "\f023"; -@fa-var-long-arrow-down: "\f175"; -@fa-var-long-arrow-left: "\f177"; -@fa-var-long-arrow-right: "\f178"; -@fa-var-long-arrow-up: "\f176"; -@fa-var-low-vision: "\f2a8"; -@fa-var-magic: "\f0d0"; -@fa-var-magnet: "\f076"; -@fa-var-mail-forward: "\f064"; -@fa-var-mail-reply: "\f112"; -@fa-var-mail-reply-all: "\f122"; -@fa-var-male: "\f183"; -@fa-var-map: "\f279"; -@fa-var-map-marker: "\f041"; -@fa-var-map-o: "\f278"; -@fa-var-map-pin: "\f276"; -@fa-var-map-signs: "\f277"; -@fa-var-mars: "\f222"; -@fa-var-mars-double: "\f227"; -@fa-var-mars-stroke: "\f229"; -@fa-var-mars-stroke-h: "\f22b"; -@fa-var-mars-stroke-v: "\f22a"; -@fa-var-maxcdn: "\f136"; -@fa-var-meanpath: "\f20c"; -@fa-var-medium: "\f23a"; -@fa-var-medkit: "\f0fa"; -@fa-var-meetup: "\f2e0"; -@fa-var-meh-o: "\f11a"; -@fa-var-mercury: "\f223"; -@fa-var-microchip: "\f2db"; -@fa-var-microphone: "\f130"; -@fa-var-microphone-slash: "\f131"; -@fa-var-minus: "\f068"; -@fa-var-minus-circle: "\f056"; -@fa-var-minus-square: "\f146"; -@fa-var-minus-square-o: "\f147"; -@fa-var-mixcloud: "\f289"; -@fa-var-mobile: "\f10b"; -@fa-var-mobile-phone: "\f10b"; -@fa-var-modx: "\f285"; -@fa-var-money: "\f0d6"; -@fa-var-moon-o: "\f186"; -@fa-var-mortar-board: "\f19d"; -@fa-var-motorcycle: "\f21c"; -@fa-var-mouse-pointer: "\f245"; -@fa-var-music: "\f001"; -@fa-var-navicon: "\f0c9"; -@fa-var-neuter: "\f22c"; -@fa-var-newspaper-o: "\f1ea"; -@fa-var-object-group: "\f247"; -@fa-var-object-ungroup: "\f248"; -@fa-var-odnoklassniki: "\f263"; -@fa-var-odnoklassniki-square: "\f264"; -@fa-var-opencart: "\f23d"; -@fa-var-openid: "\f19b"; -@fa-var-opera: "\f26a"; -@fa-var-optin-monster: "\f23c"; -@fa-var-outdent: "\f03b"; -@fa-var-pagelines: "\f18c"; -@fa-var-paint-brush: "\f1fc"; -@fa-var-paper-plane: "\f1d8"; -@fa-var-paper-plane-o: "\f1d9"; -@fa-var-paperclip: "\f0c6"; -@fa-var-paragraph: "\f1dd"; -@fa-var-paste: "\f0ea"; -@fa-var-pause: "\f04c"; -@fa-var-pause-circle: "\f28b"; -@fa-var-pause-circle-o: "\f28c"; -@fa-var-paw: "\f1b0"; -@fa-var-paypal: "\f1ed"; -@fa-var-pencil: "\f040"; -@fa-var-pencil-square: "\f14b"; -@fa-var-pencil-square-o: "\f044"; -@fa-var-percent: "\f295"; -@fa-var-phone: "\f095"; -@fa-var-phone-square: "\f098"; -@fa-var-photo: "\f03e"; -@fa-var-picture-o: "\f03e"; -@fa-var-pie-chart: "\f200"; -@fa-var-pied-piper: "\f2ae"; -@fa-var-pied-piper-alt: "\f1a8"; -@fa-var-pied-piper-pp: "\f1a7"; -@fa-var-pinterest: "\f0d2"; -@fa-var-pinterest-p: "\f231"; -@fa-var-pinterest-square: "\f0d3"; -@fa-var-plane: "\f072"; -@fa-var-play: "\f04b"; -@fa-var-play-circle: "\f144"; -@fa-var-play-circle-o: "\f01d"; -@fa-var-plug: "\f1e6"; -@fa-var-plus: "\f067"; -@fa-var-plus-circle: "\f055"; -@fa-var-plus-square: "\f0fe"; -@fa-var-plus-square-o: "\f196"; -@fa-var-podcast: "\f2ce"; -@fa-var-power-off: "\f011"; -@fa-var-print: "\f02f"; -@fa-var-product-hunt: "\f288"; -@fa-var-puzzle-piece: "\f12e"; -@fa-var-qq: "\f1d6"; -@fa-var-qrcode: "\f029"; -@fa-var-question: "\f128"; -@fa-var-question-circle: "\f059"; -@fa-var-question-circle-o: "\f29c"; -@fa-var-quora: "\f2c4"; -@fa-var-quote-left: "\f10d"; -@fa-var-quote-right: "\f10e"; -@fa-var-ra: "\f1d0"; -@fa-var-random: "\f074"; -@fa-var-ravelry: "\f2d9"; -@fa-var-rebel: "\f1d0"; -@fa-var-recycle: "\f1b8"; -@fa-var-reddit: "\f1a1"; -@fa-var-reddit-alien: "\f281"; -@fa-var-reddit-square: "\f1a2"; -@fa-var-refresh: "\f021"; -@fa-var-registered: "\f25d"; -@fa-var-remove: "\f00d"; -@fa-var-renren: "\f18b"; -@fa-var-reorder: "\f0c9"; -@fa-var-repeat: "\f01e"; -@fa-var-reply: "\f112"; -@fa-var-reply-all: "\f122"; -@fa-var-resistance: "\f1d0"; -@fa-var-retweet: "\f079"; -@fa-var-rmb: "\f157"; -@fa-var-road: "\f018"; -@fa-var-rocket: "\f135"; -@fa-var-rotate-left: "\f0e2"; -@fa-var-rotate-right: "\f01e"; -@fa-var-rouble: "\f158"; -@fa-var-rss: "\f09e"; -@fa-var-rss-square: "\f143"; -@fa-var-rub: "\f158"; -@fa-var-ruble: "\f158"; -@fa-var-rupee: "\f156"; -@fa-var-s15: "\f2cd"; -@fa-var-safari: "\f267"; -@fa-var-save: "\f0c7"; -@fa-var-scissors: "\f0c4"; -@fa-var-scribd: "\f28a"; -@fa-var-search: "\f002"; -@fa-var-search-minus: "\f010"; -@fa-var-search-plus: "\f00e"; -@fa-var-sellsy: "\f213"; -@fa-var-send: "\f1d8"; -@fa-var-send-o: "\f1d9"; -@fa-var-server: "\f233"; -@fa-var-share: "\f064"; -@fa-var-share-alt: "\f1e0"; -@fa-var-share-alt-square: "\f1e1"; -@fa-var-share-square: "\f14d"; -@fa-var-share-square-o: "\f045"; -@fa-var-shekel: "\f20b"; -@fa-var-sheqel: "\f20b"; -@fa-var-shield: "\f132"; -@fa-var-ship: "\f21a"; -@fa-var-shirtsinbulk: "\f214"; -@fa-var-shopping-bag: "\f290"; -@fa-var-shopping-basket: "\f291"; -@fa-var-shopping-cart: "\f07a"; -@fa-var-shower: "\f2cc"; -@fa-var-sign-in: "\f090"; -@fa-var-sign-language: "\f2a7"; -@fa-var-sign-out: "\f08b"; -@fa-var-signal: "\f012"; -@fa-var-signing: "\f2a7"; -@fa-var-simplybuilt: "\f215"; -@fa-var-sitemap: "\f0e8"; -@fa-var-skyatlas: "\f216"; -@fa-var-skype: "\f17e"; -@fa-var-slack: "\f198"; -@fa-var-sliders: "\f1de"; -@fa-var-slideshare: "\f1e7"; -@fa-var-smile-o: "\f118"; -@fa-var-snapchat: "\f2ab"; -@fa-var-snapchat-ghost: "\f2ac"; -@fa-var-snapchat-square: "\f2ad"; -@fa-var-snowflake-o: "\f2dc"; -@fa-var-soccer-ball-o: "\f1e3"; -@fa-var-sort: "\f0dc"; -@fa-var-sort-alpha-asc: "\f15d"; -@fa-var-sort-alpha-desc: "\f15e"; -@fa-var-sort-amount-asc: "\f160"; -@fa-var-sort-amount-desc: "\f161"; -@fa-var-sort-asc: "\f0de"; -@fa-var-sort-desc: "\f0dd"; -@fa-var-sort-down: "\f0dd"; -@fa-var-sort-numeric-asc: "\f162"; -@fa-var-sort-numeric-desc: "\f163"; -@fa-var-sort-up: "\f0de"; -@fa-var-soundcloud: "\f1be"; -@fa-var-space-shuttle: "\f197"; -@fa-var-spinner: "\f110"; -@fa-var-spoon: "\f1b1"; -@fa-var-spotify: "\f1bc"; -@fa-var-square: "\f0c8"; -@fa-var-square-o: "\f096"; -@fa-var-stack-exchange: "\f18d"; -@fa-var-stack-overflow: "\f16c"; -@fa-var-star: "\f005"; -@fa-var-star-half: "\f089"; -@fa-var-star-half-empty: "\f123"; -@fa-var-star-half-full: "\f123"; -@fa-var-star-half-o: "\f123"; -@fa-var-star-o: "\f006"; -@fa-var-steam: "\f1b6"; -@fa-var-steam-square: "\f1b7"; -@fa-var-step-backward: "\f048"; -@fa-var-step-forward: "\f051"; -@fa-var-stethoscope: "\f0f1"; -@fa-var-sticky-note: "\f249"; -@fa-var-sticky-note-o: "\f24a"; -@fa-var-stop: "\f04d"; -@fa-var-stop-circle: "\f28d"; -@fa-var-stop-circle-o: "\f28e"; -@fa-var-street-view: "\f21d"; -@fa-var-strikethrough: "\f0cc"; -@fa-var-stumbleupon: "\f1a4"; -@fa-var-stumbleupon-circle: "\f1a3"; -@fa-var-subscript: "\f12c"; -@fa-var-subway: "\f239"; -@fa-var-suitcase: "\f0f2"; -@fa-var-sun-o: "\f185"; -@fa-var-superpowers: "\f2dd"; -@fa-var-superscript: "\f12b"; -@fa-var-support: "\f1cd"; -@fa-var-table: "\f0ce"; -@fa-var-tablet: "\f10a"; -@fa-var-tachometer: "\f0e4"; -@fa-var-tag: "\f02b"; -@fa-var-tags: "\f02c"; -@fa-var-tasks: "\f0ae"; -@fa-var-taxi: "\f1ba"; -@fa-var-telegram: "\f2c6"; -@fa-var-television: "\f26c"; -@fa-var-tencent-weibo: "\f1d5"; -@fa-var-terminal: "\f120"; -@fa-var-text-height: "\f034"; -@fa-var-text-width: "\f035"; -@fa-var-th: "\f00a"; -@fa-var-th-large: "\f009"; -@fa-var-th-list: "\f00b"; -@fa-var-themeisle: "\f2b2"; -@fa-var-thermometer: "\f2c7"; -@fa-var-thermometer-0: "\f2cb"; -@fa-var-thermometer-1: "\f2ca"; -@fa-var-thermometer-2: "\f2c9"; -@fa-var-thermometer-3: "\f2c8"; -@fa-var-thermometer-4: "\f2c7"; -@fa-var-thermometer-empty: "\f2cb"; -@fa-var-thermometer-full: "\f2c7"; -@fa-var-thermometer-half: "\f2c9"; -@fa-var-thermometer-quarter: "\f2ca"; -@fa-var-thermometer-three-quarters: "\f2c8"; -@fa-var-thumb-tack: "\f08d"; -@fa-var-thumbs-down: "\f165"; -@fa-var-thumbs-o-down: "\f088"; -@fa-var-thumbs-o-up: "\f087"; -@fa-var-thumbs-up: "\f164"; -@fa-var-ticket: "\f145"; -@fa-var-times: "\f00d"; -@fa-var-times-circle: "\f057"; -@fa-var-times-circle-o: "\f05c"; -@fa-var-times-rectangle: "\f2d3"; -@fa-var-times-rectangle-o: "\f2d4"; -@fa-var-tint: "\f043"; -@fa-var-toggle-down: "\f150"; -@fa-var-toggle-left: "\f191"; -@fa-var-toggle-off: "\f204"; -@fa-var-toggle-on: "\f205"; -@fa-var-toggle-right: "\f152"; -@fa-var-toggle-up: "\f151"; -@fa-var-trademark: "\f25c"; -@fa-var-train: "\f238"; -@fa-var-transgender: "\f224"; -@fa-var-transgender-alt: "\f225"; -@fa-var-trash: "\f1f8"; -@fa-var-trash-o: "\f014"; -@fa-var-tree: "\f1bb"; -@fa-var-trello: "\f181"; -@fa-var-tripadvisor: "\f262"; -@fa-var-trophy: "\f091"; -@fa-var-truck: "\f0d1"; -@fa-var-try: "\f195"; -@fa-var-tty: "\f1e4"; -@fa-var-tumblr: "\f173"; -@fa-var-tumblr-square: "\f174"; -@fa-var-turkish-lira: "\f195"; -@fa-var-tv: "\f26c"; -@fa-var-twitch: "\f1e8"; -@fa-var-twitter: "\f099"; -@fa-var-twitter-square: "\f081"; -@fa-var-umbrella: "\f0e9"; -@fa-var-underline: "\f0cd"; -@fa-var-undo: "\f0e2"; -@fa-var-universal-access: "\f29a"; -@fa-var-university: "\f19c"; -@fa-var-unlink: "\f127"; -@fa-var-unlock: "\f09c"; -@fa-var-unlock-alt: "\f13e"; -@fa-var-unsorted: "\f0dc"; -@fa-var-upload: "\f093"; -@fa-var-usb: "\f287"; -@fa-var-usd: "\f155"; -@fa-var-user: "\f007"; -@fa-var-user-circle: "\f2bd"; -@fa-var-user-circle-o: "\f2be"; -@fa-var-user-md: "\f0f0"; -@fa-var-user-o: "\f2c0"; -@fa-var-user-plus: "\f234"; -@fa-var-user-secret: "\f21b"; -@fa-var-user-times: "\f235"; -@fa-var-users: "\f0c0"; -@fa-var-vcard: "\f2bb"; -@fa-var-vcard-o: "\f2bc"; -@fa-var-venus: "\f221"; -@fa-var-venus-double: "\f226"; -@fa-var-venus-mars: "\f228"; -@fa-var-viacoin: "\f237"; -@fa-var-viadeo: "\f2a9"; -@fa-var-viadeo-square: "\f2aa"; -@fa-var-video-camera: "\f03d"; -@fa-var-vimeo: "\f27d"; -@fa-var-vimeo-square: "\f194"; -@fa-var-vine: "\f1ca"; -@fa-var-vk: "\f189"; -@fa-var-volume-control-phone: "\f2a0"; -@fa-var-volume-down: "\f027"; -@fa-var-volume-off: "\f026"; -@fa-var-volume-up: "\f028"; -@fa-var-warning: "\f071"; -@fa-var-wechat: "\f1d7"; -@fa-var-weibo: "\f18a"; -@fa-var-weixin: "\f1d7"; -@fa-var-whatsapp: "\f232"; -@fa-var-wheelchair: "\f193"; -@fa-var-wheelchair-alt: "\f29b"; -@fa-var-wifi: "\f1eb"; -@fa-var-wikipedia-w: "\f266"; -@fa-var-window-close: "\f2d3"; -@fa-var-window-close-o: "\f2d4"; -@fa-var-window-maximize: "\f2d0"; -@fa-var-window-minimize: "\f2d1"; -@fa-var-window-restore: "\f2d2"; -@fa-var-windows: "\f17a"; -@fa-var-won: "\f159"; -@fa-var-wordpress: "\f19a"; -@fa-var-wpbeginner: "\f297"; -@fa-var-wpexplorer: "\f2de"; -@fa-var-wpforms: "\f298"; -@fa-var-wrench: "\f0ad"; -@fa-var-xing: "\f168"; -@fa-var-xing-square: "\f169"; -@fa-var-y-combinator: "\f23b"; -@fa-var-y-combinator-square: "\f1d4"; -@fa-var-yahoo: "\f19e"; -@fa-var-yc: "\f23b"; -@fa-var-yc-square: "\f1d4"; -@fa-var-yelp: "\f1e9"; -@fa-var-yen: "\f157"; -@fa-var-yoast: "\f2b1"; -@fa-var-youtube: "\f167"; -@fa-var-youtube-play: "\f16a"; -@fa-var-youtube-square: "\f166"; - diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss deleted file mode 100644 index 8a020dbfff..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_animated.scss +++ /dev/null @@ -1,34 +0,0 @@ -// Spinning Icons -// -------------------------- - -.#{$fa-css-prefix}-spin { - -webkit-animation: fa-spin 2s infinite linear; - animation: fa-spin 2s infinite linear; -} - -.#{$fa-css-prefix}-pulse { - -webkit-animation: fa-spin 1s infinite steps(8); - animation: fa-spin 1s infinite steps(8); -} - -@-webkit-keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} - -@keyframes fa-spin { - 0% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(359deg); - transform: rotate(359deg); - } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss deleted file mode 100644 index d4b85a02f2..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_bordered-pulled.scss +++ /dev/null @@ -1,25 +0,0 @@ -// Bordered & Pulled -// ------------------------- - -.#{$fa-css-prefix}-border { - padding: .2em .25em .15em; - border: solid .08em $fa-border-color; - border-radius: .1em; -} - -.#{$fa-css-prefix}-pull-left { float: left; } -.#{$fa-css-prefix}-pull-right { float: right; } - -.#{$fa-css-prefix} { - &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } - &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } -} - -/* Deprecated as of 4.4.0 */ -.pull-right { float: right; } -.pull-left { float: left; } - -.#{$fa-css-prefix} { - &.pull-left { margin-right: .3em; } - &.pull-right { margin-left: .3em; } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss deleted file mode 100644 index 7425ef85fc..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_core.scss +++ /dev/null @@ -1,12 +0,0 @@ -// Base Class Definition -// ------------------------- - -.#{$fa-css-prefix} { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss deleted file mode 100644 index b221c98133..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_fixed-width.scss +++ /dev/null @@ -1,6 +0,0 @@ -// Fixed Width Icons -// ------------------------- -.#{$fa-css-prefix}-fw { - width: (18em / 14); - text-align: center; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss deleted file mode 100644 index e63e702c4d..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_icons.scss +++ /dev/null @@ -1,789 +0,0 @@ -/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen - readers do not read off random characters that represent icons */ - -.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; } -.#{$fa-css-prefix}-music:before { content: $fa-var-music; } -.#{$fa-css-prefix}-search:before { content: $fa-var-search; } -.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; } -.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; } -.#{$fa-css-prefix}-star:before { content: $fa-var-star; } -.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; } -.#{$fa-css-prefix}-user:before { content: $fa-var-user; } -.#{$fa-css-prefix}-film:before { content: $fa-var-film; } -.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; } -.#{$fa-css-prefix}-th:before { content: $fa-var-th; } -.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; } -.#{$fa-css-prefix}-check:before { content: $fa-var-check; } -.#{$fa-css-prefix}-remove:before, -.#{$fa-css-prefix}-close:before, -.#{$fa-css-prefix}-times:before { content: $fa-var-times; } -.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; } -.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; } -.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; } -.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; } -.#{$fa-css-prefix}-gear:before, -.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; } -.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; } -.#{$fa-css-prefix}-home:before { content: $fa-var-home; } -.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; } -.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; } -.#{$fa-css-prefix}-road:before { content: $fa-var-road; } -.#{$fa-css-prefix}-download:before { content: $fa-var-download; } -.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; } -.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; } -.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; } -.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; } -.#{$fa-css-prefix}-rotate-right:before, -.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; } -.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; } -.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; } -.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; } -.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; } -.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; } -.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; } -.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; } -.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; } -.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; } -.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; } -.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; } -.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; } -.#{$fa-css-prefix}-book:before { content: $fa-var-book; } -.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; } -.#{$fa-css-prefix}-print:before { content: $fa-var-print; } -.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; } -.#{$fa-css-prefix}-font:before { content: $fa-var-font; } -.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; } -.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; } -.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; } -.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; } -.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; } -.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; } -.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; } -.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; } -.#{$fa-css-prefix}-list:before { content: $fa-var-list; } -.#{$fa-css-prefix}-dedent:before, -.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; } -.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; } -.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; } -.#{$fa-css-prefix}-photo:before, -.#{$fa-css-prefix}-image:before, -.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; } -.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; } -.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; } -.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; } -.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; } -.#{$fa-css-prefix}-edit:before, -.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; } -.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; } -.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; } -.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; } -.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; } -.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; } -.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; } -.#{$fa-css-prefix}-play:before { content: $fa-var-play; } -.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; } -.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; } -.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; } -.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; } -.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; } -.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; } -.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; } -.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; } -.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; } -.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; } -.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; } -.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; } -.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; } -.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; } -.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; } -.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; } -.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; } -.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; } -.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; } -.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; } -.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; } -.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; } -.#{$fa-css-prefix}-mail-forward:before, -.#{$fa-css-prefix}-share:before { content: $fa-var-share; } -.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; } -.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; } -.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; } -.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; } -.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; } -.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; } -.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; } -.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; } -.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; } -.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; } -.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; } -.#{$fa-css-prefix}-warning:before, -.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; } -.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; } -.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; } -.#{$fa-css-prefix}-random:before { content: $fa-var-random; } -.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; } -.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; } -.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; } -.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; } -.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; } -.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; } -.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; } -.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; } -.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; } -.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; } -.#{$fa-css-prefix}-bar-chart-o:before, -.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; } -.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; } -.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; } -.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; } -.#{$fa-css-prefix}-key:before { content: $fa-var-key; } -.#{$fa-css-prefix}-gears:before, -.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; } -.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; } -.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; } -.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; } -.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; } -.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; } -.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; } -.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; } -.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; } -.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; } -.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; } -.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; } -.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; } -.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; } -.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; } -.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; } -.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; } -.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; } -.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; } -.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; } -.#{$fa-css-prefix}-facebook-f:before, -.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; } -.#{$fa-css-prefix}-github:before { content: $fa-var-github; } -.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; } -.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; } -.#{$fa-css-prefix}-feed:before, -.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; } -.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; } -.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; } -.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; } -.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; } -.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; } -.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; } -.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; } -.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; } -.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; } -.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; } -.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; } -.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; } -.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; } -.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; } -.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; } -.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; } -.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; } -.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; } -.#{$fa-css-prefix}-group:before, -.#{$fa-css-prefix}-users:before { content: $fa-var-users; } -.#{$fa-css-prefix}-chain:before, -.#{$fa-css-prefix}-link:before { content: $fa-var-link; } -.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; } -.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; } -.#{$fa-css-prefix}-cut:before, -.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; } -.#{$fa-css-prefix}-copy:before, -.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; } -.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; } -.#{$fa-css-prefix}-save:before, -.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; } -.#{$fa-css-prefix}-square:before { content: $fa-var-square; } -.#{$fa-css-prefix}-navicon:before, -.#{$fa-css-prefix}-reorder:before, -.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; } -.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; } -.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; } -.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; } -.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; } -.#{$fa-css-prefix}-table:before { content: $fa-var-table; } -.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; } -.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; } -.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; } -.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; } -.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; } -.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; } -.#{$fa-css-prefix}-money:before { content: $fa-var-money; } -.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; } -.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; } -.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; } -.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; } -.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; } -.#{$fa-css-prefix}-unsorted:before, -.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; } -.#{$fa-css-prefix}-sort-down:before, -.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; } -.#{$fa-css-prefix}-sort-up:before, -.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; } -.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; } -.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; } -.#{$fa-css-prefix}-rotate-left:before, -.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; } -.#{$fa-css-prefix}-legal:before, -.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; } -.#{$fa-css-prefix}-dashboard:before, -.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; } -.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; } -.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; } -.#{$fa-css-prefix}-flash:before, -.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; } -.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; } -.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; } -.#{$fa-css-prefix}-paste:before, -.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; } -.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; } -.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; } -.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; } -.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; } -.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; } -.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; } -.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; } -.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; } -.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; } -.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; } -.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; } -.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; } -.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; } -.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; } -.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; } -.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; } -.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; } -.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; } -.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; } -.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; } -.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; } -.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; } -.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; } -.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; } -.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; } -.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; } -.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; } -.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; } -.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; } -.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; } -.#{$fa-css-prefix}-mobile-phone:before, -.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; } -.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; } -.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; } -.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; } -.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; } -.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; } -.#{$fa-css-prefix}-mail-reply:before, -.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; } -.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; } -.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; } -.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; } -.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; } -.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; } -.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; } -.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; } -.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; } -.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; } -.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; } -.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; } -.#{$fa-css-prefix}-code:before { content: $fa-var-code; } -.#{$fa-css-prefix}-mail-reply-all:before, -.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; } -.#{$fa-css-prefix}-star-half-empty:before, -.#{$fa-css-prefix}-star-half-full:before, -.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; } -.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; } -.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; } -.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; } -.#{$fa-css-prefix}-unlink:before, -.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; } -.#{$fa-css-prefix}-question:before { content: $fa-var-question; } -.#{$fa-css-prefix}-info:before { content: $fa-var-info; } -.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; } -.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; } -.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; } -.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; } -.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; } -.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; } -.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; } -.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; } -.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; } -.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; } -.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; } -.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; } -.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; } -.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; } -.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; } -.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; } -.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; } -.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; } -.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; } -.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; } -.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; } -.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; } -.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; } -.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; } -.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; } -.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; } -.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; } -.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; } -.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; } -.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; } -.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; } -.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; } -.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; } -.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; } -.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; } -.#{$fa-css-prefix}-toggle-down:before, -.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; } -.#{$fa-css-prefix}-toggle-up:before, -.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; } -.#{$fa-css-prefix}-toggle-right:before, -.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; } -.#{$fa-css-prefix}-euro:before, -.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; } -.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; } -.#{$fa-css-prefix}-dollar:before, -.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; } -.#{$fa-css-prefix}-rupee:before, -.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; } -.#{$fa-css-prefix}-cny:before, -.#{$fa-css-prefix}-rmb:before, -.#{$fa-css-prefix}-yen:before, -.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; } -.#{$fa-css-prefix}-ruble:before, -.#{$fa-css-prefix}-rouble:before, -.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; } -.#{$fa-css-prefix}-won:before, -.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; } -.#{$fa-css-prefix}-bitcoin:before, -.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; } -.#{$fa-css-prefix}-file:before { content: $fa-var-file; } -.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; } -.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; } -.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; } -.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; } -.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; } -.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; } -.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; } -.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; } -.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; } -.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; } -.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; } -.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; } -.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; } -.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; } -.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; } -.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; } -.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; } -.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; } -.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; } -.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; } -.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; } -.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; } -.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; } -.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; } -.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; } -.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; } -.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; } -.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; } -.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; } -.#{$fa-css-prefix}-android:before { content: $fa-var-android; } -.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; } -.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; } -.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; } -.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; } -.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; } -.#{$fa-css-prefix}-female:before { content: $fa-var-female; } -.#{$fa-css-prefix}-male:before { content: $fa-var-male; } -.#{$fa-css-prefix}-gittip:before, -.#{$fa-css-prefix}-gratipay:before { content: $fa-var-gratipay; } -.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; } -.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; } -.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; } -.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; } -.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; } -.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; } -.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; } -.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; } -.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; } -.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; } -.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; } -.#{$fa-css-prefix}-toggle-left:before, -.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; } -.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; } -.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; } -.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; } -.#{$fa-css-prefix}-turkish-lira:before, -.#{$fa-css-prefix}-try:before { content: $fa-var-try; } -.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; } -.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; } -.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; } -.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; } -.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; } -.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; } -.#{$fa-css-prefix}-institution:before, -.#{$fa-css-prefix}-bank:before, -.#{$fa-css-prefix}-university:before { content: $fa-var-university; } -.#{$fa-css-prefix}-mortar-board:before, -.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; } -.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; } -.#{$fa-css-prefix}-google:before { content: $fa-var-google; } -.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; } -.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; } -.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; } -.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; } -.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; } -.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; } -.#{$fa-css-prefix}-pied-piper-pp:before { content: $fa-var-pied-piper-pp; } -.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; } -.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; } -.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; } -.#{$fa-css-prefix}-language:before { content: $fa-var-language; } -.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; } -.#{$fa-css-prefix}-building:before { content: $fa-var-building; } -.#{$fa-css-prefix}-child:before { content: $fa-var-child; } -.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; } -.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; } -.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; } -.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; } -.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; } -.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; } -.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; } -.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; } -.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; } -.#{$fa-css-prefix}-automobile:before, -.#{$fa-css-prefix}-car:before { content: $fa-var-car; } -.#{$fa-css-prefix}-cab:before, -.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; } -.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; } -.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; } -.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; } -.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; } -.#{$fa-css-prefix}-database:before { content: $fa-var-database; } -.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; } -.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; } -.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; } -.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; } -.#{$fa-css-prefix}-file-photo-o:before, -.#{$fa-css-prefix}-file-picture-o:before, -.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; } -.#{$fa-css-prefix}-file-zip-o:before, -.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; } -.#{$fa-css-prefix}-file-sound-o:before, -.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; } -.#{$fa-css-prefix}-file-movie-o:before, -.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; } -.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; } -.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; } -.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; } -.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; } -.#{$fa-css-prefix}-life-bouy:before, -.#{$fa-css-prefix}-life-buoy:before, -.#{$fa-css-prefix}-life-saver:before, -.#{$fa-css-prefix}-support:before, -.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; } -.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; } -.#{$fa-css-prefix}-ra:before, -.#{$fa-css-prefix}-resistance:before, -.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; } -.#{$fa-css-prefix}-ge:before, -.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; } -.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; } -.#{$fa-css-prefix}-git:before { content: $fa-var-git; } -.#{$fa-css-prefix}-y-combinator-square:before, -.#{$fa-css-prefix}-yc-square:before, -.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; } -.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; } -.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; } -.#{$fa-css-prefix}-wechat:before, -.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; } -.#{$fa-css-prefix}-send:before, -.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; } -.#{$fa-css-prefix}-send-o:before, -.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; } -.#{$fa-css-prefix}-history:before { content: $fa-var-history; } -.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; } -.#{$fa-css-prefix}-header:before { content: $fa-var-header; } -.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; } -.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; } -.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; } -.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; } -.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; } -.#{$fa-css-prefix}-soccer-ball-o:before, -.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; } -.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; } -.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; } -.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; } -.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; } -.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; } -.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; } -.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; } -.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; } -.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; } -.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; } -.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; } -.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; } -.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; } -.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; } -.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; } -.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; } -.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; } -.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; } -.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; } -.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; } -.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; } -.#{$fa-css-prefix}-at:before { content: $fa-var-at; } -.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; } -.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; } -.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; } -.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; } -.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; } -.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; } -.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; } -.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; } -.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; } -.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; } -.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; } -.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; } -.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; } -.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; } -.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; } -.#{$fa-css-prefix}-shekel:before, -.#{$fa-css-prefix}-sheqel:before, -.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; } -.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; } -.#{$fa-css-prefix}-buysellads:before { content: $fa-var-buysellads; } -.#{$fa-css-prefix}-connectdevelop:before { content: $fa-var-connectdevelop; } -.#{$fa-css-prefix}-dashcube:before { content: $fa-var-dashcube; } -.#{$fa-css-prefix}-forumbee:before { content: $fa-var-forumbee; } -.#{$fa-css-prefix}-leanpub:before { content: $fa-var-leanpub; } -.#{$fa-css-prefix}-sellsy:before { content: $fa-var-sellsy; } -.#{$fa-css-prefix}-shirtsinbulk:before { content: $fa-var-shirtsinbulk; } -.#{$fa-css-prefix}-simplybuilt:before { content: $fa-var-simplybuilt; } -.#{$fa-css-prefix}-skyatlas:before { content: $fa-var-skyatlas; } -.#{$fa-css-prefix}-cart-plus:before { content: $fa-var-cart-plus; } -.#{$fa-css-prefix}-cart-arrow-down:before { content: $fa-var-cart-arrow-down; } -.#{$fa-css-prefix}-diamond:before { content: $fa-var-diamond; } -.#{$fa-css-prefix}-ship:before { content: $fa-var-ship; } -.#{$fa-css-prefix}-user-secret:before { content: $fa-var-user-secret; } -.#{$fa-css-prefix}-motorcycle:before { content: $fa-var-motorcycle; } -.#{$fa-css-prefix}-street-view:before { content: $fa-var-street-view; } -.#{$fa-css-prefix}-heartbeat:before { content: $fa-var-heartbeat; } -.#{$fa-css-prefix}-venus:before { content: $fa-var-venus; } -.#{$fa-css-prefix}-mars:before { content: $fa-var-mars; } -.#{$fa-css-prefix}-mercury:before { content: $fa-var-mercury; } -.#{$fa-css-prefix}-intersex:before, -.#{$fa-css-prefix}-transgender:before { content: $fa-var-transgender; } -.#{$fa-css-prefix}-transgender-alt:before { content: $fa-var-transgender-alt; } -.#{$fa-css-prefix}-venus-double:before { content: $fa-var-venus-double; } -.#{$fa-css-prefix}-mars-double:before { content: $fa-var-mars-double; } -.#{$fa-css-prefix}-venus-mars:before { content: $fa-var-venus-mars; } -.#{$fa-css-prefix}-mars-stroke:before { content: $fa-var-mars-stroke; } -.#{$fa-css-prefix}-mars-stroke-v:before { content: $fa-var-mars-stroke-v; } -.#{$fa-css-prefix}-mars-stroke-h:before { content: $fa-var-mars-stroke-h; } -.#{$fa-css-prefix}-neuter:before { content: $fa-var-neuter; } -.#{$fa-css-prefix}-genderless:before { content: $fa-var-genderless; } -.#{$fa-css-prefix}-facebook-official:before { content: $fa-var-facebook-official; } -.#{$fa-css-prefix}-pinterest-p:before { content: $fa-var-pinterest-p; } -.#{$fa-css-prefix}-whatsapp:before { content: $fa-var-whatsapp; } -.#{$fa-css-prefix}-server:before { content: $fa-var-server; } -.#{$fa-css-prefix}-user-plus:before { content: $fa-var-user-plus; } -.#{$fa-css-prefix}-user-times:before { content: $fa-var-user-times; } -.#{$fa-css-prefix}-hotel:before, -.#{$fa-css-prefix}-bed:before { content: $fa-var-bed; } -.#{$fa-css-prefix}-viacoin:before { content: $fa-var-viacoin; } -.#{$fa-css-prefix}-train:before { content: $fa-var-train; } -.#{$fa-css-prefix}-subway:before { content: $fa-var-subway; } -.#{$fa-css-prefix}-medium:before { content: $fa-var-medium; } -.#{$fa-css-prefix}-yc:before, -.#{$fa-css-prefix}-y-combinator:before { content: $fa-var-y-combinator; } -.#{$fa-css-prefix}-optin-monster:before { content: $fa-var-optin-monster; } -.#{$fa-css-prefix}-opencart:before { content: $fa-var-opencart; } -.#{$fa-css-prefix}-expeditedssl:before { content: $fa-var-expeditedssl; } -.#{$fa-css-prefix}-battery-4:before, -.#{$fa-css-prefix}-battery:before, -.#{$fa-css-prefix}-battery-full:before { content: $fa-var-battery-full; } -.#{$fa-css-prefix}-battery-3:before, -.#{$fa-css-prefix}-battery-three-quarters:before { content: $fa-var-battery-three-quarters; } -.#{$fa-css-prefix}-battery-2:before, -.#{$fa-css-prefix}-battery-half:before { content: $fa-var-battery-half; } -.#{$fa-css-prefix}-battery-1:before, -.#{$fa-css-prefix}-battery-quarter:before { content: $fa-var-battery-quarter; } -.#{$fa-css-prefix}-battery-0:before, -.#{$fa-css-prefix}-battery-empty:before { content: $fa-var-battery-empty; } -.#{$fa-css-prefix}-mouse-pointer:before { content: $fa-var-mouse-pointer; } -.#{$fa-css-prefix}-i-cursor:before { content: $fa-var-i-cursor; } -.#{$fa-css-prefix}-object-group:before { content: $fa-var-object-group; } -.#{$fa-css-prefix}-object-ungroup:before { content: $fa-var-object-ungroup; } -.#{$fa-css-prefix}-sticky-note:before { content: $fa-var-sticky-note; } -.#{$fa-css-prefix}-sticky-note-o:before { content: $fa-var-sticky-note-o; } -.#{$fa-css-prefix}-cc-jcb:before { content: $fa-var-cc-jcb; } -.#{$fa-css-prefix}-cc-diners-club:before { content: $fa-var-cc-diners-club; } -.#{$fa-css-prefix}-clone:before { content: $fa-var-clone; } -.#{$fa-css-prefix}-balance-scale:before { content: $fa-var-balance-scale; } -.#{$fa-css-prefix}-hourglass-o:before { content: $fa-var-hourglass-o; } -.#{$fa-css-prefix}-hourglass-1:before, -.#{$fa-css-prefix}-hourglass-start:before { content: $fa-var-hourglass-start; } -.#{$fa-css-prefix}-hourglass-2:before, -.#{$fa-css-prefix}-hourglass-half:before { content: $fa-var-hourglass-half; } -.#{$fa-css-prefix}-hourglass-3:before, -.#{$fa-css-prefix}-hourglass-end:before { content: $fa-var-hourglass-end; } -.#{$fa-css-prefix}-hourglass:before { content: $fa-var-hourglass; } -.#{$fa-css-prefix}-hand-grab-o:before, -.#{$fa-css-prefix}-hand-rock-o:before { content: $fa-var-hand-rock-o; } -.#{$fa-css-prefix}-hand-stop-o:before, -.#{$fa-css-prefix}-hand-paper-o:before { content: $fa-var-hand-paper-o; } -.#{$fa-css-prefix}-hand-scissors-o:before { content: $fa-var-hand-scissors-o; } -.#{$fa-css-prefix}-hand-lizard-o:before { content: $fa-var-hand-lizard-o; } -.#{$fa-css-prefix}-hand-spock-o:before { content: $fa-var-hand-spock-o; } -.#{$fa-css-prefix}-hand-pointer-o:before { content: $fa-var-hand-pointer-o; } -.#{$fa-css-prefix}-hand-peace-o:before { content: $fa-var-hand-peace-o; } -.#{$fa-css-prefix}-trademark:before { content: $fa-var-trademark; } -.#{$fa-css-prefix}-registered:before { content: $fa-var-registered; } -.#{$fa-css-prefix}-creative-commons:before { content: $fa-var-creative-commons; } -.#{$fa-css-prefix}-gg:before { content: $fa-var-gg; } -.#{$fa-css-prefix}-gg-circle:before { content: $fa-var-gg-circle; } -.#{$fa-css-prefix}-tripadvisor:before { content: $fa-var-tripadvisor; } -.#{$fa-css-prefix}-odnoklassniki:before { content: $fa-var-odnoklassniki; } -.#{$fa-css-prefix}-odnoklassniki-square:before { content: $fa-var-odnoklassniki-square; } -.#{$fa-css-prefix}-get-pocket:before { content: $fa-var-get-pocket; } -.#{$fa-css-prefix}-wikipedia-w:before { content: $fa-var-wikipedia-w; } -.#{$fa-css-prefix}-safari:before { content: $fa-var-safari; } -.#{$fa-css-prefix}-chrome:before { content: $fa-var-chrome; } -.#{$fa-css-prefix}-firefox:before { content: $fa-var-firefox; } -.#{$fa-css-prefix}-opera:before { content: $fa-var-opera; } -.#{$fa-css-prefix}-internet-explorer:before { content: $fa-var-internet-explorer; } -.#{$fa-css-prefix}-tv:before, -.#{$fa-css-prefix}-television:before { content: $fa-var-television; } -.#{$fa-css-prefix}-contao:before { content: $fa-var-contao; } -.#{$fa-css-prefix}-500px:before { content: $fa-var-500px; } -.#{$fa-css-prefix}-amazon:before { content: $fa-var-amazon; } -.#{$fa-css-prefix}-calendar-plus-o:before { content: $fa-var-calendar-plus-o; } -.#{$fa-css-prefix}-calendar-minus-o:before { content: $fa-var-calendar-minus-o; } -.#{$fa-css-prefix}-calendar-times-o:before { content: $fa-var-calendar-times-o; } -.#{$fa-css-prefix}-calendar-check-o:before { content: $fa-var-calendar-check-o; } -.#{$fa-css-prefix}-industry:before { content: $fa-var-industry; } -.#{$fa-css-prefix}-map-pin:before { content: $fa-var-map-pin; } -.#{$fa-css-prefix}-map-signs:before { content: $fa-var-map-signs; } -.#{$fa-css-prefix}-map-o:before { content: $fa-var-map-o; } -.#{$fa-css-prefix}-map:before { content: $fa-var-map; } -.#{$fa-css-prefix}-commenting:before { content: $fa-var-commenting; } -.#{$fa-css-prefix}-commenting-o:before { content: $fa-var-commenting-o; } -.#{$fa-css-prefix}-houzz:before { content: $fa-var-houzz; } -.#{$fa-css-prefix}-vimeo:before { content: $fa-var-vimeo; } -.#{$fa-css-prefix}-black-tie:before { content: $fa-var-black-tie; } -.#{$fa-css-prefix}-fonticons:before { content: $fa-var-fonticons; } -.#{$fa-css-prefix}-reddit-alien:before { content: $fa-var-reddit-alien; } -.#{$fa-css-prefix}-edge:before { content: $fa-var-edge; } -.#{$fa-css-prefix}-credit-card-alt:before { content: $fa-var-credit-card-alt; } -.#{$fa-css-prefix}-codiepie:before { content: $fa-var-codiepie; } -.#{$fa-css-prefix}-modx:before { content: $fa-var-modx; } -.#{$fa-css-prefix}-fort-awesome:before { content: $fa-var-fort-awesome; } -.#{$fa-css-prefix}-usb:before { content: $fa-var-usb; } -.#{$fa-css-prefix}-product-hunt:before { content: $fa-var-product-hunt; } -.#{$fa-css-prefix}-mixcloud:before { content: $fa-var-mixcloud; } -.#{$fa-css-prefix}-scribd:before { content: $fa-var-scribd; } -.#{$fa-css-prefix}-pause-circle:before { content: $fa-var-pause-circle; } -.#{$fa-css-prefix}-pause-circle-o:before { content: $fa-var-pause-circle-o; } -.#{$fa-css-prefix}-stop-circle:before { content: $fa-var-stop-circle; } -.#{$fa-css-prefix}-stop-circle-o:before { content: $fa-var-stop-circle-o; } -.#{$fa-css-prefix}-shopping-bag:before { content: $fa-var-shopping-bag; } -.#{$fa-css-prefix}-shopping-basket:before { content: $fa-var-shopping-basket; } -.#{$fa-css-prefix}-hashtag:before { content: $fa-var-hashtag; } -.#{$fa-css-prefix}-bluetooth:before { content: $fa-var-bluetooth; } -.#{$fa-css-prefix}-bluetooth-b:before { content: $fa-var-bluetooth-b; } -.#{$fa-css-prefix}-percent:before { content: $fa-var-percent; } -.#{$fa-css-prefix}-gitlab:before { content: $fa-var-gitlab; } -.#{$fa-css-prefix}-wpbeginner:before { content: $fa-var-wpbeginner; } -.#{$fa-css-prefix}-wpforms:before { content: $fa-var-wpforms; } -.#{$fa-css-prefix}-envira:before { content: $fa-var-envira; } -.#{$fa-css-prefix}-universal-access:before { content: $fa-var-universal-access; } -.#{$fa-css-prefix}-wheelchair-alt:before { content: $fa-var-wheelchair-alt; } -.#{$fa-css-prefix}-question-circle-o:before { content: $fa-var-question-circle-o; } -.#{$fa-css-prefix}-blind:before { content: $fa-var-blind; } -.#{$fa-css-prefix}-audio-description:before { content: $fa-var-audio-description; } -.#{$fa-css-prefix}-volume-control-phone:before { content: $fa-var-volume-control-phone; } -.#{$fa-css-prefix}-braille:before { content: $fa-var-braille; } -.#{$fa-css-prefix}-assistive-listening-systems:before { content: $fa-var-assistive-listening-systems; } -.#{$fa-css-prefix}-asl-interpreting:before, -.#{$fa-css-prefix}-american-sign-language-interpreting:before { content: $fa-var-american-sign-language-interpreting; } -.#{$fa-css-prefix}-deafness:before, -.#{$fa-css-prefix}-hard-of-hearing:before, -.#{$fa-css-prefix}-deaf:before { content: $fa-var-deaf; } -.#{$fa-css-prefix}-glide:before { content: $fa-var-glide; } -.#{$fa-css-prefix}-glide-g:before { content: $fa-var-glide-g; } -.#{$fa-css-prefix}-signing:before, -.#{$fa-css-prefix}-sign-language:before { content: $fa-var-sign-language; } -.#{$fa-css-prefix}-low-vision:before { content: $fa-var-low-vision; } -.#{$fa-css-prefix}-viadeo:before { content: $fa-var-viadeo; } -.#{$fa-css-prefix}-viadeo-square:before { content: $fa-var-viadeo-square; } -.#{$fa-css-prefix}-snapchat:before { content: $fa-var-snapchat; } -.#{$fa-css-prefix}-snapchat-ghost:before { content: $fa-var-snapchat-ghost; } -.#{$fa-css-prefix}-snapchat-square:before { content: $fa-var-snapchat-square; } -.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; } -.#{$fa-css-prefix}-first-order:before { content: $fa-var-first-order; } -.#{$fa-css-prefix}-yoast:before { content: $fa-var-yoast; } -.#{$fa-css-prefix}-themeisle:before { content: $fa-var-themeisle; } -.#{$fa-css-prefix}-google-plus-circle:before, -.#{$fa-css-prefix}-google-plus-official:before { content: $fa-var-google-plus-official; } -.#{$fa-css-prefix}-fa:before, -.#{$fa-css-prefix}-font-awesome:before { content: $fa-var-font-awesome; } -.#{$fa-css-prefix}-handshake-o:before { content: $fa-var-handshake-o; } -.#{$fa-css-prefix}-envelope-open:before { content: $fa-var-envelope-open; } -.#{$fa-css-prefix}-envelope-open-o:before { content: $fa-var-envelope-open-o; } -.#{$fa-css-prefix}-linode:before { content: $fa-var-linode; } -.#{$fa-css-prefix}-address-book:before { content: $fa-var-address-book; } -.#{$fa-css-prefix}-address-book-o:before { content: $fa-var-address-book-o; } -.#{$fa-css-prefix}-vcard:before, -.#{$fa-css-prefix}-address-card:before { content: $fa-var-address-card; } -.#{$fa-css-prefix}-vcard-o:before, -.#{$fa-css-prefix}-address-card-o:before { content: $fa-var-address-card-o; } -.#{$fa-css-prefix}-user-circle:before { content: $fa-var-user-circle; } -.#{$fa-css-prefix}-user-circle-o:before { content: $fa-var-user-circle-o; } -.#{$fa-css-prefix}-user-o:before { content: $fa-var-user-o; } -.#{$fa-css-prefix}-id-badge:before { content: $fa-var-id-badge; } -.#{$fa-css-prefix}-drivers-license:before, -.#{$fa-css-prefix}-id-card:before { content: $fa-var-id-card; } -.#{$fa-css-prefix}-drivers-license-o:before, -.#{$fa-css-prefix}-id-card-o:before { content: $fa-var-id-card-o; } -.#{$fa-css-prefix}-quora:before { content: $fa-var-quora; } -.#{$fa-css-prefix}-free-code-camp:before { content: $fa-var-free-code-camp; } -.#{$fa-css-prefix}-telegram:before { content: $fa-var-telegram; } -.#{$fa-css-prefix}-thermometer-4:before, -.#{$fa-css-prefix}-thermometer:before, -.#{$fa-css-prefix}-thermometer-full:before { content: $fa-var-thermometer-full; } -.#{$fa-css-prefix}-thermometer-3:before, -.#{$fa-css-prefix}-thermometer-three-quarters:before { content: $fa-var-thermometer-three-quarters; } -.#{$fa-css-prefix}-thermometer-2:before, -.#{$fa-css-prefix}-thermometer-half:before { content: $fa-var-thermometer-half; } -.#{$fa-css-prefix}-thermometer-1:before, -.#{$fa-css-prefix}-thermometer-quarter:before { content: $fa-var-thermometer-quarter; } -.#{$fa-css-prefix}-thermometer-0:before, -.#{$fa-css-prefix}-thermometer-empty:before { content: $fa-var-thermometer-empty; } -.#{$fa-css-prefix}-shower:before { content: $fa-var-shower; } -.#{$fa-css-prefix}-bathtub:before, -.#{$fa-css-prefix}-s15:before, -.#{$fa-css-prefix}-bath:before { content: $fa-var-bath; } -.#{$fa-css-prefix}-podcast:before { content: $fa-var-podcast; } -.#{$fa-css-prefix}-window-maximize:before { content: $fa-var-window-maximize; } -.#{$fa-css-prefix}-window-minimize:before { content: $fa-var-window-minimize; } -.#{$fa-css-prefix}-window-restore:before { content: $fa-var-window-restore; } -.#{$fa-css-prefix}-times-rectangle:before, -.#{$fa-css-prefix}-window-close:before { content: $fa-var-window-close; } -.#{$fa-css-prefix}-times-rectangle-o:before, -.#{$fa-css-prefix}-window-close-o:before { content: $fa-var-window-close-o; } -.#{$fa-css-prefix}-bandcamp:before { content: $fa-var-bandcamp; } -.#{$fa-css-prefix}-grav:before { content: $fa-var-grav; } -.#{$fa-css-prefix}-etsy:before { content: $fa-var-etsy; } -.#{$fa-css-prefix}-imdb:before { content: $fa-var-imdb; } -.#{$fa-css-prefix}-ravelry:before { content: $fa-var-ravelry; } -.#{$fa-css-prefix}-eercast:before { content: $fa-var-eercast; } -.#{$fa-css-prefix}-microchip:before { content: $fa-var-microchip; } -.#{$fa-css-prefix}-snowflake-o:before { content: $fa-var-snowflake-o; } -.#{$fa-css-prefix}-superpowers:before { content: $fa-var-superpowers; } -.#{$fa-css-prefix}-wpexplorer:before { content: $fa-var-wpexplorer; } -.#{$fa-css-prefix}-meetup:before { content: $fa-var-meetup; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss deleted file mode 100644 index 41e9a8184a..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_larger.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Icon Sizes -// ------------------------- - -/* makes the font 33% larger relative to the icon container */ -.#{$fa-css-prefix}-lg { - font-size: (4em / 3); - line-height: (3em / 4); - vertical-align: -15%; -} -.#{$fa-css-prefix}-2x { font-size: 2em; } -.#{$fa-css-prefix}-3x { font-size: 3em; } -.#{$fa-css-prefix}-4x { font-size: 4em; } -.#{$fa-css-prefix}-5x { font-size: 5em; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss deleted file mode 100644 index 7d1e4d54d6..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_list.scss +++ /dev/null @@ -1,19 +0,0 @@ -// List Icons -// ------------------------- - -.#{$fa-css-prefix}-ul { - padding-left: 0; - margin-left: $fa-li-width; - list-style-type: none; - > li { position: relative; } -} -.#{$fa-css-prefix}-li { - position: absolute; - left: -$fa-li-width; - width: $fa-li-width; - top: (2em / 14); - text-align: center; - &.#{$fa-css-prefix}-lg { - left: -$fa-li-width + (4em / 14); - } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss deleted file mode 100644 index c3bbd5745d..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_mixins.scss +++ /dev/null @@ -1,60 +0,0 @@ -// Mixins -// -------------------------- - -@mixin fa-icon() { - display: inline-block; - font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration - font-size: inherit; // can't have font-size inherit on line above, so need to override - text-rendering: auto; // optimizelegibility throws things off #1094 - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -} - -@mixin fa-icon-rotate($degrees, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; - -webkit-transform: rotate($degrees); - -ms-transform: rotate($degrees); - transform: rotate($degrees); -} - -@mixin fa-icon-flip($horiz, $vert, $rotation) { - -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; - -webkit-transform: scale($horiz, $vert); - -ms-transform: scale($horiz, $vert); - transform: scale($horiz, $vert); -} - - -// Only display content to screen readers. A la Bootstrap 4. -// -// See: http://a11yproject.com/posts/how-to-hide-content/ - -@mixin sr-only { - position: absolute; - width: 1px; - height: 1px; - padding: 0; - margin: -1px; - overflow: hidden; - clip: rect(0,0,0,0); - border: 0; -} - -// Use in conjunction with .sr-only to only display content when it's focused. -// -// Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 -// -// Credit: HTML5 Boilerplate - -@mixin sr-only-focusable { - &:active, - &:focus { - position: static; - width: auto; - height: auto; - margin: 0; - overflow: visible; - clip: auto; - } -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss deleted file mode 100644 index bb457c23a8..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_path.scss +++ /dev/null @@ -1,15 +0,0 @@ -/* FONT PATH - * -------------------------- */ - -@font-face { - font-family: 'FontAwesome'; - src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); - src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), - url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), - url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), - url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), - url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); -// src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts - font-weight: normal; - font-style: normal; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss deleted file mode 100644 index a3558fd09c..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_rotated-flipped.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Rotated & Flipped Icons -// ------------------------- - -.#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } -.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } -.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } - -.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } -.#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } - -// Hook for IE8-9 -// ------------------------- - -:root .#{$fa-css-prefix}-rotate-90, -:root .#{$fa-css-prefix}-rotate-180, -:root .#{$fa-css-prefix}-rotate-270, -:root .#{$fa-css-prefix}-flip-horizontal, -:root .#{$fa-css-prefix}-flip-vertical { - filter: none; -} diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss deleted file mode 100644 index 637426f0da..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_screen-reader.scss +++ /dev/null @@ -1,5 +0,0 @@ -// Screen Readers -// ------------------------- - -.sr-only { @include sr-only(); } -.sr-only-focusable { @include sr-only-focusable(); } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss deleted file mode 100644 index aef7403660..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_stacked.scss +++ /dev/null @@ -1,20 +0,0 @@ -// Stacked Icons -// ------------------------- - -.#{$fa-css-prefix}-stack { - position: relative; - display: inline-block; - width: 2em; - height: 2em; - line-height: 2em; - vertical-align: middle; -} -.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { - position: absolute; - left: 0; - width: 100%; - text-align: center; -} -.#{$fa-css-prefix}-stack-1x { line-height: inherit; } -.#{$fa-css-prefix}-stack-2x { font-size: 2em; } -.#{$fa-css-prefix}-inverse { color: $fa-inverse; } diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss deleted file mode 100644 index 498fc4a087..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/_variables.scss +++ /dev/null @@ -1,800 +0,0 @@ -// Variables -// -------------------------- - -$fa-font-path: "../fonts" !default; -$fa-font-size-base: 14px !default; -$fa-line-height-base: 1 !default; -//$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.7.0/fonts" !default; // for referencing Bootstrap CDN font files directly -$fa-css-prefix: fa !default; -$fa-version: "4.7.0" !default; -$fa-border-color: #eee !default; -$fa-inverse: #fff !default; -$fa-li-width: (30em / 14) !default; - -$fa-var-500px: "\f26e"; -$fa-var-address-book: "\f2b9"; -$fa-var-address-book-o: "\f2ba"; -$fa-var-address-card: "\f2bb"; -$fa-var-address-card-o: "\f2bc"; -$fa-var-adjust: "\f042"; -$fa-var-adn: "\f170"; -$fa-var-align-center: "\f037"; -$fa-var-align-justify: "\f039"; -$fa-var-align-left: "\f036"; -$fa-var-align-right: "\f038"; -$fa-var-amazon: "\f270"; -$fa-var-ambulance: "\f0f9"; -$fa-var-american-sign-language-interpreting: "\f2a3"; -$fa-var-anchor: "\f13d"; -$fa-var-android: "\f17b"; -$fa-var-angellist: "\f209"; -$fa-var-angle-double-down: "\f103"; -$fa-var-angle-double-left: "\f100"; -$fa-var-angle-double-right: "\f101"; -$fa-var-angle-double-up: "\f102"; -$fa-var-angle-down: "\f107"; -$fa-var-angle-left: "\f104"; -$fa-var-angle-right: "\f105"; -$fa-var-angle-up: "\f106"; -$fa-var-apple: "\f179"; -$fa-var-archive: "\f187"; -$fa-var-area-chart: "\f1fe"; -$fa-var-arrow-circle-down: "\f0ab"; -$fa-var-arrow-circle-left: "\f0a8"; -$fa-var-arrow-circle-o-down: "\f01a"; -$fa-var-arrow-circle-o-left: "\f190"; -$fa-var-arrow-circle-o-right: "\f18e"; -$fa-var-arrow-circle-o-up: "\f01b"; -$fa-var-arrow-circle-right: "\f0a9"; -$fa-var-arrow-circle-up: "\f0aa"; -$fa-var-arrow-down: "\f063"; -$fa-var-arrow-left: "\f060"; -$fa-var-arrow-right: "\f061"; -$fa-var-arrow-up: "\f062"; -$fa-var-arrows: "\f047"; -$fa-var-arrows-alt: "\f0b2"; -$fa-var-arrows-h: "\f07e"; -$fa-var-arrows-v: "\f07d"; -$fa-var-asl-interpreting: "\f2a3"; -$fa-var-assistive-listening-systems: "\f2a2"; -$fa-var-asterisk: "\f069"; -$fa-var-at: "\f1fa"; -$fa-var-audio-description: "\f29e"; -$fa-var-automobile: "\f1b9"; -$fa-var-backward: "\f04a"; -$fa-var-balance-scale: "\f24e"; -$fa-var-ban: "\f05e"; -$fa-var-bandcamp: "\f2d5"; -$fa-var-bank: "\f19c"; -$fa-var-bar-chart: "\f080"; -$fa-var-bar-chart-o: "\f080"; -$fa-var-barcode: "\f02a"; -$fa-var-bars: "\f0c9"; -$fa-var-bath: "\f2cd"; -$fa-var-bathtub: "\f2cd"; -$fa-var-battery: "\f240"; -$fa-var-battery-0: "\f244"; -$fa-var-battery-1: "\f243"; -$fa-var-battery-2: "\f242"; -$fa-var-battery-3: "\f241"; -$fa-var-battery-4: "\f240"; -$fa-var-battery-empty: "\f244"; -$fa-var-battery-full: "\f240"; -$fa-var-battery-half: "\f242"; -$fa-var-battery-quarter: "\f243"; -$fa-var-battery-three-quarters: "\f241"; -$fa-var-bed: "\f236"; -$fa-var-beer: "\f0fc"; -$fa-var-behance: "\f1b4"; -$fa-var-behance-square: "\f1b5"; -$fa-var-bell: "\f0f3"; -$fa-var-bell-o: "\f0a2"; -$fa-var-bell-slash: "\f1f6"; -$fa-var-bell-slash-o: "\f1f7"; -$fa-var-bicycle: "\f206"; -$fa-var-binoculars: "\f1e5"; -$fa-var-birthday-cake: "\f1fd"; -$fa-var-bitbucket: "\f171"; -$fa-var-bitbucket-square: "\f172"; -$fa-var-bitcoin: "\f15a"; -$fa-var-black-tie: "\f27e"; -$fa-var-blind: "\f29d"; -$fa-var-bluetooth: "\f293"; -$fa-var-bluetooth-b: "\f294"; -$fa-var-bold: "\f032"; -$fa-var-bolt: "\f0e7"; -$fa-var-bomb: "\f1e2"; -$fa-var-book: "\f02d"; -$fa-var-bookmark: "\f02e"; -$fa-var-bookmark-o: "\f097"; -$fa-var-braille: "\f2a1"; -$fa-var-briefcase: "\f0b1"; -$fa-var-btc: "\f15a"; -$fa-var-bug: "\f188"; -$fa-var-building: "\f1ad"; -$fa-var-building-o: "\f0f7"; -$fa-var-bullhorn: "\f0a1"; -$fa-var-bullseye: "\f140"; -$fa-var-bus: "\f207"; -$fa-var-buysellads: "\f20d"; -$fa-var-cab: "\f1ba"; -$fa-var-calculator: "\f1ec"; -$fa-var-calendar: "\f073"; -$fa-var-calendar-check-o: "\f274"; -$fa-var-calendar-minus-o: "\f272"; -$fa-var-calendar-o: "\f133"; -$fa-var-calendar-plus-o: "\f271"; -$fa-var-calendar-times-o: "\f273"; -$fa-var-camera: "\f030"; -$fa-var-camera-retro: "\f083"; -$fa-var-car: "\f1b9"; -$fa-var-caret-down: "\f0d7"; -$fa-var-caret-left: "\f0d9"; -$fa-var-caret-right: "\f0da"; -$fa-var-caret-square-o-down: "\f150"; -$fa-var-caret-square-o-left: "\f191"; -$fa-var-caret-square-o-right: "\f152"; -$fa-var-caret-square-o-up: "\f151"; -$fa-var-caret-up: "\f0d8"; -$fa-var-cart-arrow-down: "\f218"; -$fa-var-cart-plus: "\f217"; -$fa-var-cc: "\f20a"; -$fa-var-cc-amex: "\f1f3"; -$fa-var-cc-diners-club: "\f24c"; -$fa-var-cc-discover: "\f1f2"; -$fa-var-cc-jcb: "\f24b"; -$fa-var-cc-mastercard: "\f1f1"; -$fa-var-cc-paypal: "\f1f4"; -$fa-var-cc-stripe: "\f1f5"; -$fa-var-cc-visa: "\f1f0"; -$fa-var-certificate: "\f0a3"; -$fa-var-chain: "\f0c1"; -$fa-var-chain-broken: "\f127"; -$fa-var-check: "\f00c"; -$fa-var-check-circle: "\f058"; -$fa-var-check-circle-o: "\f05d"; -$fa-var-check-square: "\f14a"; -$fa-var-check-square-o: "\f046"; -$fa-var-chevron-circle-down: "\f13a"; -$fa-var-chevron-circle-left: "\f137"; -$fa-var-chevron-circle-right: "\f138"; -$fa-var-chevron-circle-up: "\f139"; -$fa-var-chevron-down: "\f078"; -$fa-var-chevron-left: "\f053"; -$fa-var-chevron-right: "\f054"; -$fa-var-chevron-up: "\f077"; -$fa-var-child: "\f1ae"; -$fa-var-chrome: "\f268"; -$fa-var-circle: "\f111"; -$fa-var-circle-o: "\f10c"; -$fa-var-circle-o-notch: "\f1ce"; -$fa-var-circle-thin: "\f1db"; -$fa-var-clipboard: "\f0ea"; -$fa-var-clock-o: "\f017"; -$fa-var-clone: "\f24d"; -$fa-var-close: "\f00d"; -$fa-var-cloud: "\f0c2"; -$fa-var-cloud-download: "\f0ed"; -$fa-var-cloud-upload: "\f0ee"; -$fa-var-cny: "\f157"; -$fa-var-code: "\f121"; -$fa-var-code-fork: "\f126"; -$fa-var-codepen: "\f1cb"; -$fa-var-codiepie: "\f284"; -$fa-var-coffee: "\f0f4"; -$fa-var-cog: "\f013"; -$fa-var-cogs: "\f085"; -$fa-var-columns: "\f0db"; -$fa-var-comment: "\f075"; -$fa-var-comment-o: "\f0e5"; -$fa-var-commenting: "\f27a"; -$fa-var-commenting-o: "\f27b"; -$fa-var-comments: "\f086"; -$fa-var-comments-o: "\f0e6"; -$fa-var-compass: "\f14e"; -$fa-var-compress: "\f066"; -$fa-var-connectdevelop: "\f20e"; -$fa-var-contao: "\f26d"; -$fa-var-copy: "\f0c5"; -$fa-var-copyright: "\f1f9"; -$fa-var-creative-commons: "\f25e"; -$fa-var-credit-card: "\f09d"; -$fa-var-credit-card-alt: "\f283"; -$fa-var-crop: "\f125"; -$fa-var-crosshairs: "\f05b"; -$fa-var-css3: "\f13c"; -$fa-var-cube: "\f1b2"; -$fa-var-cubes: "\f1b3"; -$fa-var-cut: "\f0c4"; -$fa-var-cutlery: "\f0f5"; -$fa-var-dashboard: "\f0e4"; -$fa-var-dashcube: "\f210"; -$fa-var-database: "\f1c0"; -$fa-var-deaf: "\f2a4"; -$fa-var-deafness: "\f2a4"; -$fa-var-dedent: "\f03b"; -$fa-var-delicious: "\f1a5"; -$fa-var-desktop: "\f108"; -$fa-var-deviantart: "\f1bd"; -$fa-var-diamond: "\f219"; -$fa-var-digg: "\f1a6"; -$fa-var-dollar: "\f155"; -$fa-var-dot-circle-o: "\f192"; -$fa-var-download: "\f019"; -$fa-var-dribbble: "\f17d"; -$fa-var-drivers-license: "\f2c2"; -$fa-var-drivers-license-o: "\f2c3"; -$fa-var-dropbox: "\f16b"; -$fa-var-drupal: "\f1a9"; -$fa-var-edge: "\f282"; -$fa-var-edit: "\f044"; -$fa-var-eercast: "\f2da"; -$fa-var-eject: "\f052"; -$fa-var-ellipsis-h: "\f141"; -$fa-var-ellipsis-v: "\f142"; -$fa-var-empire: "\f1d1"; -$fa-var-envelope: "\f0e0"; -$fa-var-envelope-o: "\f003"; -$fa-var-envelope-open: "\f2b6"; -$fa-var-envelope-open-o: "\f2b7"; -$fa-var-envelope-square: "\f199"; -$fa-var-envira: "\f299"; -$fa-var-eraser: "\f12d"; -$fa-var-etsy: "\f2d7"; -$fa-var-eur: "\f153"; -$fa-var-euro: "\f153"; -$fa-var-exchange: "\f0ec"; -$fa-var-exclamation: "\f12a"; -$fa-var-exclamation-circle: "\f06a"; -$fa-var-exclamation-triangle: "\f071"; -$fa-var-expand: "\f065"; -$fa-var-expeditedssl: "\f23e"; -$fa-var-external-link: "\f08e"; -$fa-var-external-link-square: "\f14c"; -$fa-var-eye: "\f06e"; -$fa-var-eye-slash: "\f070"; -$fa-var-eyedropper: "\f1fb"; -$fa-var-fa: "\f2b4"; -$fa-var-facebook: "\f09a"; -$fa-var-facebook-f: "\f09a"; -$fa-var-facebook-official: "\f230"; -$fa-var-facebook-square: "\f082"; -$fa-var-fast-backward: "\f049"; -$fa-var-fast-forward: "\f050"; -$fa-var-fax: "\f1ac"; -$fa-var-feed: "\f09e"; -$fa-var-female: "\f182"; -$fa-var-fighter-jet: "\f0fb"; -$fa-var-file: "\f15b"; -$fa-var-file-archive-o: "\f1c6"; -$fa-var-file-audio-o: "\f1c7"; -$fa-var-file-code-o: "\f1c9"; -$fa-var-file-excel-o: "\f1c3"; -$fa-var-file-image-o: "\f1c5"; -$fa-var-file-movie-o: "\f1c8"; -$fa-var-file-o: "\f016"; -$fa-var-file-pdf-o: "\f1c1"; -$fa-var-file-photo-o: "\f1c5"; -$fa-var-file-picture-o: "\f1c5"; -$fa-var-file-powerpoint-o: "\f1c4"; -$fa-var-file-sound-o: "\f1c7"; -$fa-var-file-text: "\f15c"; -$fa-var-file-text-o: "\f0f6"; -$fa-var-file-video-o: "\f1c8"; -$fa-var-file-word-o: "\f1c2"; -$fa-var-file-zip-o: "\f1c6"; -$fa-var-files-o: "\f0c5"; -$fa-var-film: "\f008"; -$fa-var-filter: "\f0b0"; -$fa-var-fire: "\f06d"; -$fa-var-fire-extinguisher: "\f134"; -$fa-var-firefox: "\f269"; -$fa-var-first-order: "\f2b0"; -$fa-var-flag: "\f024"; -$fa-var-flag-checkered: "\f11e"; -$fa-var-flag-o: "\f11d"; -$fa-var-flash: "\f0e7"; -$fa-var-flask: "\f0c3"; -$fa-var-flickr: "\f16e"; -$fa-var-floppy-o: "\f0c7"; -$fa-var-folder: "\f07b"; -$fa-var-folder-o: "\f114"; -$fa-var-folder-open: "\f07c"; -$fa-var-folder-open-o: "\f115"; -$fa-var-font: "\f031"; -$fa-var-font-awesome: "\f2b4"; -$fa-var-fonticons: "\f280"; -$fa-var-fort-awesome: "\f286"; -$fa-var-forumbee: "\f211"; -$fa-var-forward: "\f04e"; -$fa-var-foursquare: "\f180"; -$fa-var-free-code-camp: "\f2c5"; -$fa-var-frown-o: "\f119"; -$fa-var-futbol-o: "\f1e3"; -$fa-var-gamepad: "\f11b"; -$fa-var-gavel: "\f0e3"; -$fa-var-gbp: "\f154"; -$fa-var-ge: "\f1d1"; -$fa-var-gear: "\f013"; -$fa-var-gears: "\f085"; -$fa-var-genderless: "\f22d"; -$fa-var-get-pocket: "\f265"; -$fa-var-gg: "\f260"; -$fa-var-gg-circle: "\f261"; -$fa-var-gift: "\f06b"; -$fa-var-git: "\f1d3"; -$fa-var-git-square: "\f1d2"; -$fa-var-github: "\f09b"; -$fa-var-github-alt: "\f113"; -$fa-var-github-square: "\f092"; -$fa-var-gitlab: "\f296"; -$fa-var-gittip: "\f184"; -$fa-var-glass: "\f000"; -$fa-var-glide: "\f2a5"; -$fa-var-glide-g: "\f2a6"; -$fa-var-globe: "\f0ac"; -$fa-var-google: "\f1a0"; -$fa-var-google-plus: "\f0d5"; -$fa-var-google-plus-circle: "\f2b3"; -$fa-var-google-plus-official: "\f2b3"; -$fa-var-google-plus-square: "\f0d4"; -$fa-var-google-wallet: "\f1ee"; -$fa-var-graduation-cap: "\f19d"; -$fa-var-gratipay: "\f184"; -$fa-var-grav: "\f2d6"; -$fa-var-group: "\f0c0"; -$fa-var-h-square: "\f0fd"; -$fa-var-hacker-news: "\f1d4"; -$fa-var-hand-grab-o: "\f255"; -$fa-var-hand-lizard-o: "\f258"; -$fa-var-hand-o-down: "\f0a7"; -$fa-var-hand-o-left: "\f0a5"; -$fa-var-hand-o-right: "\f0a4"; -$fa-var-hand-o-up: "\f0a6"; -$fa-var-hand-paper-o: "\f256"; -$fa-var-hand-peace-o: "\f25b"; -$fa-var-hand-pointer-o: "\f25a"; -$fa-var-hand-rock-o: "\f255"; -$fa-var-hand-scissors-o: "\f257"; -$fa-var-hand-spock-o: "\f259"; -$fa-var-hand-stop-o: "\f256"; -$fa-var-handshake-o: "\f2b5"; -$fa-var-hard-of-hearing: "\f2a4"; -$fa-var-hashtag: "\f292"; -$fa-var-hdd-o: "\f0a0"; -$fa-var-header: "\f1dc"; -$fa-var-headphones: "\f025"; -$fa-var-heart: "\f004"; -$fa-var-heart-o: "\f08a"; -$fa-var-heartbeat: "\f21e"; -$fa-var-history: "\f1da"; -$fa-var-home: "\f015"; -$fa-var-hospital-o: "\f0f8"; -$fa-var-hotel: "\f236"; -$fa-var-hourglass: "\f254"; -$fa-var-hourglass-1: "\f251"; -$fa-var-hourglass-2: "\f252"; -$fa-var-hourglass-3: "\f253"; -$fa-var-hourglass-end: "\f253"; -$fa-var-hourglass-half: "\f252"; -$fa-var-hourglass-o: "\f250"; -$fa-var-hourglass-start: "\f251"; -$fa-var-houzz: "\f27c"; -$fa-var-html5: "\f13b"; -$fa-var-i-cursor: "\f246"; -$fa-var-id-badge: "\f2c1"; -$fa-var-id-card: "\f2c2"; -$fa-var-id-card-o: "\f2c3"; -$fa-var-ils: "\f20b"; -$fa-var-image: "\f03e"; -$fa-var-imdb: "\f2d8"; -$fa-var-inbox: "\f01c"; -$fa-var-indent: "\f03c"; -$fa-var-industry: "\f275"; -$fa-var-info: "\f129"; -$fa-var-info-circle: "\f05a"; -$fa-var-inr: "\f156"; -$fa-var-instagram: "\f16d"; -$fa-var-institution: "\f19c"; -$fa-var-internet-explorer: "\f26b"; -$fa-var-intersex: "\f224"; -$fa-var-ioxhost: "\f208"; -$fa-var-italic: "\f033"; -$fa-var-joomla: "\f1aa"; -$fa-var-jpy: "\f157"; -$fa-var-jsfiddle: "\f1cc"; -$fa-var-key: "\f084"; -$fa-var-keyboard-o: "\f11c"; -$fa-var-krw: "\f159"; -$fa-var-language: "\f1ab"; -$fa-var-laptop: "\f109"; -$fa-var-lastfm: "\f202"; -$fa-var-lastfm-square: "\f203"; -$fa-var-leaf: "\f06c"; -$fa-var-leanpub: "\f212"; -$fa-var-legal: "\f0e3"; -$fa-var-lemon-o: "\f094"; -$fa-var-level-down: "\f149"; -$fa-var-level-up: "\f148"; -$fa-var-life-bouy: "\f1cd"; -$fa-var-life-buoy: "\f1cd"; -$fa-var-life-ring: "\f1cd"; -$fa-var-life-saver: "\f1cd"; -$fa-var-lightbulb-o: "\f0eb"; -$fa-var-line-chart: "\f201"; -$fa-var-link: "\f0c1"; -$fa-var-linkedin: "\f0e1"; -$fa-var-linkedin-square: "\f08c"; -$fa-var-linode: "\f2b8"; -$fa-var-linux: "\f17c"; -$fa-var-list: "\f03a"; -$fa-var-list-alt: "\f022"; -$fa-var-list-ol: "\f0cb"; -$fa-var-list-ul: "\f0ca"; -$fa-var-location-arrow: "\f124"; -$fa-var-lock: "\f023"; -$fa-var-long-arrow-down: "\f175"; -$fa-var-long-arrow-left: "\f177"; -$fa-var-long-arrow-right: "\f178"; -$fa-var-long-arrow-up: "\f176"; -$fa-var-low-vision: "\f2a8"; -$fa-var-magic: "\f0d0"; -$fa-var-magnet: "\f076"; -$fa-var-mail-forward: "\f064"; -$fa-var-mail-reply: "\f112"; -$fa-var-mail-reply-all: "\f122"; -$fa-var-male: "\f183"; -$fa-var-map: "\f279"; -$fa-var-map-marker: "\f041"; -$fa-var-map-o: "\f278"; -$fa-var-map-pin: "\f276"; -$fa-var-map-signs: "\f277"; -$fa-var-mars: "\f222"; -$fa-var-mars-double: "\f227"; -$fa-var-mars-stroke: "\f229"; -$fa-var-mars-stroke-h: "\f22b"; -$fa-var-mars-stroke-v: "\f22a"; -$fa-var-maxcdn: "\f136"; -$fa-var-meanpath: "\f20c"; -$fa-var-medium: "\f23a"; -$fa-var-medkit: "\f0fa"; -$fa-var-meetup: "\f2e0"; -$fa-var-meh-o: "\f11a"; -$fa-var-mercury: "\f223"; -$fa-var-microchip: "\f2db"; -$fa-var-microphone: "\f130"; -$fa-var-microphone-slash: "\f131"; -$fa-var-minus: "\f068"; -$fa-var-minus-circle: "\f056"; -$fa-var-minus-square: "\f146"; -$fa-var-minus-square-o: "\f147"; -$fa-var-mixcloud: "\f289"; -$fa-var-mobile: "\f10b"; -$fa-var-mobile-phone: "\f10b"; -$fa-var-modx: "\f285"; -$fa-var-money: "\f0d6"; -$fa-var-moon-o: "\f186"; -$fa-var-mortar-board: "\f19d"; -$fa-var-motorcycle: "\f21c"; -$fa-var-mouse-pointer: "\f245"; -$fa-var-music: "\f001"; -$fa-var-navicon: "\f0c9"; -$fa-var-neuter: "\f22c"; -$fa-var-newspaper-o: "\f1ea"; -$fa-var-object-group: "\f247"; -$fa-var-object-ungroup: "\f248"; -$fa-var-odnoklassniki: "\f263"; -$fa-var-odnoklassniki-square: "\f264"; -$fa-var-opencart: "\f23d"; -$fa-var-openid: "\f19b"; -$fa-var-opera: "\f26a"; -$fa-var-optin-monster: "\f23c"; -$fa-var-outdent: "\f03b"; -$fa-var-pagelines: "\f18c"; -$fa-var-paint-brush: "\f1fc"; -$fa-var-paper-plane: "\f1d8"; -$fa-var-paper-plane-o: "\f1d9"; -$fa-var-paperclip: "\f0c6"; -$fa-var-paragraph: "\f1dd"; -$fa-var-paste: "\f0ea"; -$fa-var-pause: "\f04c"; -$fa-var-pause-circle: "\f28b"; -$fa-var-pause-circle-o: "\f28c"; -$fa-var-paw: "\f1b0"; -$fa-var-paypal: "\f1ed"; -$fa-var-pencil: "\f040"; -$fa-var-pencil-square: "\f14b"; -$fa-var-pencil-square-o: "\f044"; -$fa-var-percent: "\f295"; -$fa-var-phone: "\f095"; -$fa-var-phone-square: "\f098"; -$fa-var-photo: "\f03e"; -$fa-var-picture-o: "\f03e"; -$fa-var-pie-chart: "\f200"; -$fa-var-pied-piper: "\f2ae"; -$fa-var-pied-piper-alt: "\f1a8"; -$fa-var-pied-piper-pp: "\f1a7"; -$fa-var-pinterest: "\f0d2"; -$fa-var-pinterest-p: "\f231"; -$fa-var-pinterest-square: "\f0d3"; -$fa-var-plane: "\f072"; -$fa-var-play: "\f04b"; -$fa-var-play-circle: "\f144"; -$fa-var-play-circle-o: "\f01d"; -$fa-var-plug: "\f1e6"; -$fa-var-plus: "\f067"; -$fa-var-plus-circle: "\f055"; -$fa-var-plus-square: "\f0fe"; -$fa-var-plus-square-o: "\f196"; -$fa-var-podcast: "\f2ce"; -$fa-var-power-off: "\f011"; -$fa-var-print: "\f02f"; -$fa-var-product-hunt: "\f288"; -$fa-var-puzzle-piece: "\f12e"; -$fa-var-qq: "\f1d6"; -$fa-var-qrcode: "\f029"; -$fa-var-question: "\f128"; -$fa-var-question-circle: "\f059"; -$fa-var-question-circle-o: "\f29c"; -$fa-var-quora: "\f2c4"; -$fa-var-quote-left: "\f10d"; -$fa-var-quote-right: "\f10e"; -$fa-var-ra: "\f1d0"; -$fa-var-random: "\f074"; -$fa-var-ravelry: "\f2d9"; -$fa-var-rebel: "\f1d0"; -$fa-var-recycle: "\f1b8"; -$fa-var-reddit: "\f1a1"; -$fa-var-reddit-alien: "\f281"; -$fa-var-reddit-square: "\f1a2"; -$fa-var-refresh: "\f021"; -$fa-var-registered: "\f25d"; -$fa-var-remove: "\f00d"; -$fa-var-renren: "\f18b"; -$fa-var-reorder: "\f0c9"; -$fa-var-repeat: "\f01e"; -$fa-var-reply: "\f112"; -$fa-var-reply-all: "\f122"; -$fa-var-resistance: "\f1d0"; -$fa-var-retweet: "\f079"; -$fa-var-rmb: "\f157"; -$fa-var-road: "\f018"; -$fa-var-rocket: "\f135"; -$fa-var-rotate-left: "\f0e2"; -$fa-var-rotate-right: "\f01e"; -$fa-var-rouble: "\f158"; -$fa-var-rss: "\f09e"; -$fa-var-rss-square: "\f143"; -$fa-var-rub: "\f158"; -$fa-var-ruble: "\f158"; -$fa-var-rupee: "\f156"; -$fa-var-s15: "\f2cd"; -$fa-var-safari: "\f267"; -$fa-var-save: "\f0c7"; -$fa-var-scissors: "\f0c4"; -$fa-var-scribd: "\f28a"; -$fa-var-search: "\f002"; -$fa-var-search-minus: "\f010"; -$fa-var-search-plus: "\f00e"; -$fa-var-sellsy: "\f213"; -$fa-var-send: "\f1d8"; -$fa-var-send-o: "\f1d9"; -$fa-var-server: "\f233"; -$fa-var-share: "\f064"; -$fa-var-share-alt: "\f1e0"; -$fa-var-share-alt-square: "\f1e1"; -$fa-var-share-square: "\f14d"; -$fa-var-share-square-o: "\f045"; -$fa-var-shekel: "\f20b"; -$fa-var-sheqel: "\f20b"; -$fa-var-shield: "\f132"; -$fa-var-ship: "\f21a"; -$fa-var-shirtsinbulk: "\f214"; -$fa-var-shopping-bag: "\f290"; -$fa-var-shopping-basket: "\f291"; -$fa-var-shopping-cart: "\f07a"; -$fa-var-shower: "\f2cc"; -$fa-var-sign-in: "\f090"; -$fa-var-sign-language: "\f2a7"; -$fa-var-sign-out: "\f08b"; -$fa-var-signal: "\f012"; -$fa-var-signing: "\f2a7"; -$fa-var-simplybuilt: "\f215"; -$fa-var-sitemap: "\f0e8"; -$fa-var-skyatlas: "\f216"; -$fa-var-skype: "\f17e"; -$fa-var-slack: "\f198"; -$fa-var-sliders: "\f1de"; -$fa-var-slideshare: "\f1e7"; -$fa-var-smile-o: "\f118"; -$fa-var-snapchat: "\f2ab"; -$fa-var-snapchat-ghost: "\f2ac"; -$fa-var-snapchat-square: "\f2ad"; -$fa-var-snowflake-o: "\f2dc"; -$fa-var-soccer-ball-o: "\f1e3"; -$fa-var-sort: "\f0dc"; -$fa-var-sort-alpha-asc: "\f15d"; -$fa-var-sort-alpha-desc: "\f15e"; -$fa-var-sort-amount-asc: "\f160"; -$fa-var-sort-amount-desc: "\f161"; -$fa-var-sort-asc: "\f0de"; -$fa-var-sort-desc: "\f0dd"; -$fa-var-sort-down: "\f0dd"; -$fa-var-sort-numeric-asc: "\f162"; -$fa-var-sort-numeric-desc: "\f163"; -$fa-var-sort-up: "\f0de"; -$fa-var-soundcloud: "\f1be"; -$fa-var-space-shuttle: "\f197"; -$fa-var-spinner: "\f110"; -$fa-var-spoon: "\f1b1"; -$fa-var-spotify: "\f1bc"; -$fa-var-square: "\f0c8"; -$fa-var-square-o: "\f096"; -$fa-var-stack-exchange: "\f18d"; -$fa-var-stack-overflow: "\f16c"; -$fa-var-star: "\f005"; -$fa-var-star-half: "\f089"; -$fa-var-star-half-empty: "\f123"; -$fa-var-star-half-full: "\f123"; -$fa-var-star-half-o: "\f123"; -$fa-var-star-o: "\f006"; -$fa-var-steam: "\f1b6"; -$fa-var-steam-square: "\f1b7"; -$fa-var-step-backward: "\f048"; -$fa-var-step-forward: "\f051"; -$fa-var-stethoscope: "\f0f1"; -$fa-var-sticky-note: "\f249"; -$fa-var-sticky-note-o: "\f24a"; -$fa-var-stop: "\f04d"; -$fa-var-stop-circle: "\f28d"; -$fa-var-stop-circle-o: "\f28e"; -$fa-var-street-view: "\f21d"; -$fa-var-strikethrough: "\f0cc"; -$fa-var-stumbleupon: "\f1a4"; -$fa-var-stumbleupon-circle: "\f1a3"; -$fa-var-subscript: "\f12c"; -$fa-var-subway: "\f239"; -$fa-var-suitcase: "\f0f2"; -$fa-var-sun-o: "\f185"; -$fa-var-superpowers: "\f2dd"; -$fa-var-superscript: "\f12b"; -$fa-var-support: "\f1cd"; -$fa-var-table: "\f0ce"; -$fa-var-tablet: "\f10a"; -$fa-var-tachometer: "\f0e4"; -$fa-var-tag: "\f02b"; -$fa-var-tags: "\f02c"; -$fa-var-tasks: "\f0ae"; -$fa-var-taxi: "\f1ba"; -$fa-var-telegram: "\f2c6"; -$fa-var-television: "\f26c"; -$fa-var-tencent-weibo: "\f1d5"; -$fa-var-terminal: "\f120"; -$fa-var-text-height: "\f034"; -$fa-var-text-width: "\f035"; -$fa-var-th: "\f00a"; -$fa-var-th-large: "\f009"; -$fa-var-th-list: "\f00b"; -$fa-var-themeisle: "\f2b2"; -$fa-var-thermometer: "\f2c7"; -$fa-var-thermometer-0: "\f2cb"; -$fa-var-thermometer-1: "\f2ca"; -$fa-var-thermometer-2: "\f2c9"; -$fa-var-thermometer-3: "\f2c8"; -$fa-var-thermometer-4: "\f2c7"; -$fa-var-thermometer-empty: "\f2cb"; -$fa-var-thermometer-full: "\f2c7"; -$fa-var-thermometer-half: "\f2c9"; -$fa-var-thermometer-quarter: "\f2ca"; -$fa-var-thermometer-three-quarters: "\f2c8"; -$fa-var-thumb-tack: "\f08d"; -$fa-var-thumbs-down: "\f165"; -$fa-var-thumbs-o-down: "\f088"; -$fa-var-thumbs-o-up: "\f087"; -$fa-var-thumbs-up: "\f164"; -$fa-var-ticket: "\f145"; -$fa-var-times: "\f00d"; -$fa-var-times-circle: "\f057"; -$fa-var-times-circle-o: "\f05c"; -$fa-var-times-rectangle: "\f2d3"; -$fa-var-times-rectangle-o: "\f2d4"; -$fa-var-tint: "\f043"; -$fa-var-toggle-down: "\f150"; -$fa-var-toggle-left: "\f191"; -$fa-var-toggle-off: "\f204"; -$fa-var-toggle-on: "\f205"; -$fa-var-toggle-right: "\f152"; -$fa-var-toggle-up: "\f151"; -$fa-var-trademark: "\f25c"; -$fa-var-train: "\f238"; -$fa-var-transgender: "\f224"; -$fa-var-transgender-alt: "\f225"; -$fa-var-trash: "\f1f8"; -$fa-var-trash-o: "\f014"; -$fa-var-tree: "\f1bb"; -$fa-var-trello: "\f181"; -$fa-var-tripadvisor: "\f262"; -$fa-var-trophy: "\f091"; -$fa-var-truck: "\f0d1"; -$fa-var-try: "\f195"; -$fa-var-tty: "\f1e4"; -$fa-var-tumblr: "\f173"; -$fa-var-tumblr-square: "\f174"; -$fa-var-turkish-lira: "\f195"; -$fa-var-tv: "\f26c"; -$fa-var-twitch: "\f1e8"; -$fa-var-twitter: "\f099"; -$fa-var-twitter-square: "\f081"; -$fa-var-umbrella: "\f0e9"; -$fa-var-underline: "\f0cd"; -$fa-var-undo: "\f0e2"; -$fa-var-universal-access: "\f29a"; -$fa-var-university: "\f19c"; -$fa-var-unlink: "\f127"; -$fa-var-unlock: "\f09c"; -$fa-var-unlock-alt: "\f13e"; -$fa-var-unsorted: "\f0dc"; -$fa-var-upload: "\f093"; -$fa-var-usb: "\f287"; -$fa-var-usd: "\f155"; -$fa-var-user: "\f007"; -$fa-var-user-circle: "\f2bd"; -$fa-var-user-circle-o: "\f2be"; -$fa-var-user-md: "\f0f0"; -$fa-var-user-o: "\f2c0"; -$fa-var-user-plus: "\f234"; -$fa-var-user-secret: "\f21b"; -$fa-var-user-times: "\f235"; -$fa-var-users: "\f0c0"; -$fa-var-vcard: "\f2bb"; -$fa-var-vcard-o: "\f2bc"; -$fa-var-venus: "\f221"; -$fa-var-venus-double: "\f226"; -$fa-var-venus-mars: "\f228"; -$fa-var-viacoin: "\f237"; -$fa-var-viadeo: "\f2a9"; -$fa-var-viadeo-square: "\f2aa"; -$fa-var-video-camera: "\f03d"; -$fa-var-vimeo: "\f27d"; -$fa-var-vimeo-square: "\f194"; -$fa-var-vine: "\f1ca"; -$fa-var-vk: "\f189"; -$fa-var-volume-control-phone: "\f2a0"; -$fa-var-volume-down: "\f027"; -$fa-var-volume-off: "\f026"; -$fa-var-volume-up: "\f028"; -$fa-var-warning: "\f071"; -$fa-var-wechat: "\f1d7"; -$fa-var-weibo: "\f18a"; -$fa-var-weixin: "\f1d7"; -$fa-var-whatsapp: "\f232"; -$fa-var-wheelchair: "\f193"; -$fa-var-wheelchair-alt: "\f29b"; -$fa-var-wifi: "\f1eb"; -$fa-var-wikipedia-w: "\f266"; -$fa-var-window-close: "\f2d3"; -$fa-var-window-close-o: "\f2d4"; -$fa-var-window-maximize: "\f2d0"; -$fa-var-window-minimize: "\f2d1"; -$fa-var-window-restore: "\f2d2"; -$fa-var-windows: "\f17a"; -$fa-var-won: "\f159"; -$fa-var-wordpress: "\f19a"; -$fa-var-wpbeginner: "\f297"; -$fa-var-wpexplorer: "\f2de"; -$fa-var-wpforms: "\f298"; -$fa-var-wrench: "\f0ad"; -$fa-var-xing: "\f168"; -$fa-var-xing-square: "\f169"; -$fa-var-y-combinator: "\f23b"; -$fa-var-y-combinator-square: "\f1d4"; -$fa-var-yahoo: "\f19e"; -$fa-var-yc: "\f23b"; -$fa-var-yc-square: "\f1d4"; -$fa-var-yelp: "\f1e9"; -$fa-var-yen: "\f157"; -$fa-var-yoast: "\f2b1"; -$fa-var-youtube: "\f167"; -$fa-var-youtube-play: "\f16a"; -$fa-var-youtube-square: "\f166"; - diff --git a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss b/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss deleted file mode 100644 index f1c83aaa5d..0000000000 --- a/interface/web/themes/default/assets/stylesheets/font-awesome-4.7.0/scss/font-awesome.scss +++ /dev/null @@ -1,18 +0,0 @@ -/*! - * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */ - -@import "variables"; -@import "mixins"; -@import "path"; -@import "core"; -@import "larger"; -@import "fixed-width"; -@import "list"; -@import "bordered-pulled"; -@import "animated"; -@import "rotated-flipped"; -@import "stacked"; -@import "icons"; -@import "screen-reader"; -- GitLab From c28310c9d349b165e2e9238b6c453798ed0b7016 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 19:30:44 +0200 Subject: [PATCH 0234/1368] Rename not enabled to inherited (#4277) --- interface/web/mail/lib/lang/ar_mail_user.lng | 2 +- interface/web/mail/lib/lang/bg_mail_user.lng | 4 ++-- interface/web/mail/lib/lang/br_mail_user.lng | 2 +- interface/web/mail/lib/lang/ca_mail_user.lng | 2 +- interface/web/mail/lib/lang/cz_mail_user.lng | 2 +- interface/web/mail/lib/lang/de_mail_user.lng | 2 +- interface/web/mail/lib/lang/dk_mail_user.lng | 2 +- interface/web/mail/lib/lang/el_mail_user.lng | 2 +- interface/web/mail/lib/lang/en_mail_user.lng | 2 +- interface/web/mail/lib/lang/es_mail_user.lng | 2 +- interface/web/mail/lib/lang/fi_mail_user.lng | 2 +- interface/web/mail/lib/lang/fr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hu_mail_user.lng | 2 +- interface/web/mail/lib/lang/id_mail_user.lng | 2 +- interface/web/mail/lib/lang/it_mail_user.lng | 2 +- interface/web/mail/lib/lang/ja_mail_user.lng | 2 +- interface/web/mail/lib/lang/nl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pt_mail_user.lng | 2 +- interface/web/mail/lib/lang/ro_mail_user.lng | 2 +- interface/web/mail/lib/lang/ru_mail_user.lng | 2 +- interface/web/mail/lib/lang/se_mail_user.lng | 2 +- interface/web/mail/lib/lang/sk_mail_user.lng | 2 +- interface/web/mail/lib/lang/tr_mail_user.lng | 2 +- interface/web/mail/mail_user_edit.php | 10 +++++----- 26 files changed, 31 insertions(+), 31 deletions(-) diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index a67a83c07a..9d4828b557 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Disable IMAP'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 3b9a27390e..1b9595da42 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -7,7 +7,7 @@ $wb['active_txt'] = 'Активен'; $wb['email_error_isemail'] = 'Формата на емайла е грешен.'; $wb['email_error_unique'] = 'Повтаряш се емайл адрес.'; $wb['autoresponder_text_txt'] = 'Текс'; -$wb['autoresponder_txt'] = 'Автоматичен отговор'; +$wb['autoresponder_txt'] = 'Автоматичен отгово'; $wb['no_domain_perm'] = 'Нямаш права за този домейн.'; $wb['error_no_pwd'] = 'Полето с паролата е празно.'; $wb['quota_error_isint'] = 'Големина на пощенската кутия трябва да е число'; @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Разреши получаване'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Разреши достъп'; $wb['policy_txt'] = 'Спам филтър'; -$wb['no_policy'] = '- забранен -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Достигнат е максималният брой на пощенските кутии за твоят профил.'; $wb['limit_mailquota_txt'] = 'Максималното отделено място за твоята кутия е достигнато. Максималното позволено място в МБ е '; $wb['disableimap_txt'] = 'Забрани IMAP'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 2aca5c3736..2abe1931f6 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -27,7 +27,7 @@ $wb['postfix_txt'] = 'Habilitar recebimento'; $wb['greylisting_txt'] = 'Habilitar greylist'; $wb['access_txt'] = 'Habilitar acesso'; $wb['policy_txt'] = 'Filtros anti-spam'; -$wb['no_policy'] = '-desabilitado-'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'O limite de contas de e-mail para esta conta foi alcançado.'; $wb['limit_mailquota_txt'] = 'O limite de tamanho para as contas de e-mails foi alcançado. O espaço disponível em MB é'; $wb['disablesmtp_txt'] = 'Desabilitar SMTP (envio)'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index e380b55d2d..08c9bc78ec 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -18,7 +18,7 @@ $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; $wb['access_txt'] = 'Activer l\'accès'; $wb['policy_txt'] = 'Filtre antispam'; -$wb['no_policy'] = '- inactif -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Le nombre maximal de boites courriel pour votre compte est atteint..'; $wb['limit_mailquota_txt'] = 'Lespace maximal pour les boites courriel est atteint. Lespace maximal disponible est de '; $wb['disableimap_txt'] = 'Désactiver IMAP'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index 1946d4150f..fb09f0c0a0 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -22,7 +22,7 @@ $wb['maildir_txt'] = 'E-mailový adresář'; $wb['postfix_txt'] = 'Povolit příjem'; $wb['access_txt'] = 'Povolit přístup'; $wb['policy_txt'] = 'Spamový filtr'; -$wb['no_policy'] = '- nepovoleno -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Byl dosažen maximální počet mailboxů pro Váš účet.'; $wb['limit_mailquota_txt'] = 'Dosažen maximální prostor pro mailboxy. Max. dostupné místo v MB je'; $wb['disableimap_txt'] = 'Zakázat IMAP'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index 7c1f02cd4f..e653fbe288 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Aktiviere Empfang'; $wb['greylisting_txt'] = 'Aktiviere Greylisting'; $wb['access_txt'] = 'Aktiviere Zugriff'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- nicht aktiviert -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Die maximale Anzahl an E-Mailkonten für Ihr Konto wurde erreicht.'; $wb['limit_mailquota_txt'] = 'Der maximale Speicherplatz für Ihr E-Mail Konto wurde erreicht. Der maximal verfügbare Speicher in MB ist'; $wb['disablesmtp_txt'] = 'SMTP (Mailversand) deaktivieren'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index 8c0957d353..34bf076359 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -24,7 +24,7 @@ $wb['maildir_txt'] = 'Mailmappe'; $wb['postfix_txt'] = 'Aktiver modtagelse'; $wb['access_txt'] = 'Aktiver adgang'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- ikke aktiveret -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Max. antal af mailbokse for din konto er nået.'; $wb['limit_mailquota_txt'] = 'Max. plads for postkasser er nået. Max. tilgængelig plads i MB er'; $wb['disablesmtp_txt'] = 'Deaktiver SMTP (afsending)'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index f735d6e7b3..76c266d591 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Ενεργοποίηση Λήψης'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Ενεργοποίηση Πρόσβασης'; $wb['policy_txt'] = 'Φίλτρο Spam'; -$wb['no_policy'] = '- ανενεργή -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Έχετε φτάσει το μέγιστο πλήθος των θυρίδων για τον λογαριασμό σας.'; $wb['limit_mailquota_txt'] = 'Έχετε φτάσει στο μέγεστο χώρο της θυρίδα σας.Ο μέγιστος διαθέσιμος χώρος σε MB είναι'; $wb['disableimap_txt'] = 'Απενεργοποίηση IMAP'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 82cab6d70c..69ac0a00a9 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -27,7 +27,7 @@ $wb["postfix_txt"] = 'Enable receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb["access_txt"] = 'Enable access'; $wb["policy_txt"] = 'Spamfilter'; -$wb["no_policy"] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb["limit_mailbox_txt"] = 'The max. number of mailboxes for your account is reached.'; $wb["limit_mailquota_txt"] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb["disablesmtp_txt"] = 'Disable SMTP (sending)'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index 418fd2dbfa..be329c304a 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -44,7 +44,7 @@ $wb['name_optional_txt'] = '(Opcional)'; $wb['name_txt'] = 'Nombre'; $wb['no_backup_txt'] = 'Sin copia de seguridad'; $wb['no_domain_perm'] = 'Usted no tiene permisos para gestionar este dominio.'; -$wb['no_policy'] = '- deshabilitado -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['now_txt'] = 'Ahora'; $wb['password_match_txt'] = 'Las contraseñas coinciden.'; $wb['password_mismatch_txt'] = 'Las contraseñas no coinciden.'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index a764e95693..45ea1d9b8b 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -18,7 +18,7 @@ $wb['postfix_txt'] = 'Salli vastaanotto'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Salli yhteys'; $wb['policy_txt'] = 'Roskapostisuodatin'; -$wb['no_policy'] = '- ei käytössä -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Tilisi sallittu postilaatikoiden määrä on ylitetty.'; $wb['limit_mailquota_txt'] = 'Tilisi sallittu postilaatikoiden koko on ylitetty. Vapaa tila megatavuina on'; $wb['disableimap_txt'] = 'Estä IMAP'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index 732f3d8cb7..8df58233a3 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -18,7 +18,7 @@ $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; $wb['access_txt'] = 'Activer l’accès'; $wb['policy_txt'] = 'Filtre antispam'; -$wb['no_policy'] = '- inactif -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Le nombre maximal de boîtes aux lettres pour votre compte est atteint..'; $wb['limit_mailquota_txt'] = 'Lespace maximal pour les boîtes aux lettres est atteint. Lespace maximal disponible est de '; $wb['disableimap_txt'] = 'Désactiver IMAP'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 7406e2d656..170aaa6b61 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Disable IMAP'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index db8edf775e..65962cd21c 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Bejövő engedélyezés'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Hozzáférés engelyezés'; $wb['policy_txt'] = 'Spam szűrő'; -$wb['no_policy'] = '- nem engelyézett -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Nincs több mailbox lehetőség.'; $wb['limit_mailquota_txt'] = 'Mailbox tárhely elfogyott.'; $wb['disableimap_txt'] = 'IMAP Tiltás'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index 670550062c..3bedbd9b93 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -24,7 +24,7 @@ $wb['postfix_txt'] = 'Dapat Menerima'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Dapat Mengakses'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- tidak diaktifkan -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Jumlah maks mailbox untuk akun Anda sudah tercapai.'; $wb['limit_mailquota_txt'] = 'Ruang maks untuk mailbox sudah tercapai. Ruang maks yang tersedia dalam MB adalah'; $wb['disableimap_txt'] = 'Nonaktifkan IMAP'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index dad3f69654..a1a0f8cfd5 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -19,7 +19,7 @@ $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Abilita ricezione'; $wb['access_txt'] = 'Abilita indirizzo'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- non abilitato -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Hai raggiungo il numero massimo di caselle per il tuo account.'; $wb['limit_mailquota_txt'] = 'Hai raggiunto lo spazio massimo per le tue caselle di posta. Lo spazio massimo in MB è di'; $wb['disableimap_txt'] = 'Disabilita IMAP'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index 803a278d5b..b58b9d13dd 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'メールを受信する'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'アクセスを許可する'; $wb['policy_txt'] = 'スパムフィルター'; -$wb['no_policy'] = '- 利用しない -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'メールボックスが最大数に達した為、これ以上追加できません。'; $wb['limit_mailquota_txt'] = 'メールボックスが一杯です。 上限(MB):'; $wb['disableimap_txt'] = 'IMAP を無効にする'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 39cd0bd0f0..9a644a129b 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -23,7 +23,7 @@ $wb['postfix_txt'] = 'Ontvangen inschakelen'; $wb['greylisting_txt'] = 'Greylisting inschakelen'; $wb['access_txt'] = 'Toegang inschakelen'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- niet ingeschakeld -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Het max. aantal mailboxen voor uw account is bereikt.'; $wb['limit_mailquota_txt'] = 'De max. ruimte voor uw mailboxen is bereikt. De max. beschikbare ruimte in MB is'; $wb['disableimap_txt'] = 'Uitschakelen IMAP'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 8a35e7742e..593f83531e 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Zezwól na odbiór poczty'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Możliwy dostęp'; $wb['policy_txt'] = 'Filtr spamu'; -$wb['no_policy'] = '- brak polityki -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Maksymalna ilość skrzynek pocztowych dla Twojego konta została przekroczona.'; $wb['limit_mailquota_txt'] = 'Maksymalna pojemność skrzynki pocztowej została przekroczona. Maksymalne dostępne miejsce w MB to: '; $wb['disableimap_txt'] = 'Wyłącz IMAP'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index 56a1f16d30..0b7ffe3d37 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Permitir Recepção'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Permitir Acesso'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- desactivado -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'O número máximo de caixas de correio para a conta foi atingido.'; $wb['limit_mailquota_txt'] = 'O espaço em disco disponível para criação de contas foi atingido.'; $wb['disableimap_txt'] = 'Desactivar IMAP'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index ccdcc49fdf..97dfdafd88 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Enable Receiving'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Numarul maxim de MAILBOX pe contul dumneavoastra a fost atins'; $wb['limit_mailquota_txt'] = 'Spatiul maxim pentru MAILBOX a fost atins.Acesta este '; $wb['disableimap_txt'] = 'Blocheaza IMAP'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index fcfadd9db9..07bab6fd4f 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -19,7 +19,7 @@ $wb['postfix_txt'] = 'Разрешить получение'; $wb['greylisting_txt'] = 'Включить серый список (Greylisting)'; $wb['access_txt'] = 'Включить доступ'; $wb['policy_txt'] = 'Спам-фильтр'; -$wb['no_policy'] = '- не включены -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Число почтовых ящиков превышено.'; $wb['limit_mailquota_txt'] = 'Место под почтовые ящики превышено. Максимально доступно MB'; $wb['password_strength_txt'] = 'Стойкость пароля'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index c081446557..da0282e118 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Aktivera mottagning'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Aktivera åtkomst'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- ej aktiverat -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'The max. number of mailboxes for your account is reached.'; $wb['limit_mailquota_txt'] = 'The max space for mailboxes is reached. The max. available space in MB is'; $wb['disableimap_txt'] = 'Avaktivera IMAP'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index eb70b8eba9..d9a68404ae 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -20,7 +20,7 @@ $wb['postfix_txt'] = 'Povoliť príjem'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Povoliť Prístup'; $wb['policy_txt'] = 'Spamfilter'; -$wb['no_policy'] = '- nepovolená -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Max. počet poštových schránok pre váš účet je dosiahnutý.'; $wb['limit_mailquota_txt'] = 'Maximálny priestor pre poštové schránky je dosiahnutý. Max. dostupné miesto v MB je'; $wb['disableimap_txt'] = 'Deaktivovať IMAP'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index c7dec33b99..9e964e5e8a 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -27,7 +27,7 @@ $wb['postfix_txt'] = 'Alım Etkin'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; $wb['access_txt'] = 'Erişim Etkin'; $wb['policy_txt'] = 'Önemsiz İleti Süzgeci'; -$wb['no_policy'] = '- devre dışı -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Hesabınıza ekleyebileceğiniz en fazla e-posta kutusu sayısına ulaştınız.'; $wb['limit_mailquota_txt'] = 'E-posta kutularınız için kullanabileceğiniz en fazla boyuta ulaştınız. Kullanılabilecek alan MB:'; $wb['disablesmtp_txt'] = 'SMTP Kullanılmasın (gönderim)'; diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index c7f36a89e0..83a02e0ed2 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -80,7 +80,7 @@ class page_action extends tform_actions { // Getting Domains of the user // $sql = "SELECT domain, server_id FROM mail_domain WHERE ".$app->tform->getAuthSQL('r').' ORDER BY domain'; - $sql = "SELECT domain, server_id FROM mail_domain WHERE (".$app->tform->getAuthSQL('r').") AND domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain') ORDER BY domain"; + $sql = "SELECT domain, server_id FROM mail_domain WHERE (".$app->tform->getAuthSQL('r').") AND domain NOT IN (SELECT SUBSTR(source,2) FROM mail_forwarding WHERE type = 'aliasdomain') ORDER BY domain"; $domains = $app->db->queryAllRecords($sql); $domain_select = ''; if(is_array($domains)) { @@ -99,7 +99,7 @@ class page_action extends tform_actions { if (isset($_POST['policy'])) $tmp_user['policy_id'] = intval($_POST['policy']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; + $policy_select = ""; if(is_array($policys)) { foreach( $policys as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; @@ -220,7 +220,7 @@ class page_action extends tform_actions { $tmp = $app->db->queryOneRecord("SELECT maildir_format FROM mail_user WHERE mailuser_id = ".$app->functions->intval($this->id)); $this->dataRecord['maildir_format'] = $tmp['maildir_format']; } - + //* compose the email field if(isset($_POST["email_local_part"]) && isset($_POST["email_domain"])) { $this->dataRecord["email"] = strtolower($_POST["email_local_part"]."@".$app->functions->idn_encode($_POST["email_domain"])); @@ -239,7 +239,7 @@ class page_action extends tform_actions { $maildir = str_replace("[localpart]", strtolower($_POST["email_local_part"]), $maildir); $this->dataRecord["maildir"] = $maildir; $this->dataRecord["homedir"] = $mail_config["homedir_path"]; - + // Will be overwritten by mail_plugin if ($mail_config["mailbox_virtual_uidgid_maps"] == 'y') { $this->dataRecord['uid'] = -1; @@ -248,7 +248,7 @@ class page_action extends tform_actions { $this->dataRecord['uid'] = intval($mail_config["mailuser_uid"]); $this->dataRecord['gid'] = intval($mail_config["mailuser_gid"]); } - + //* Check if there is no alias or forward with this address $tmp = $app->db->queryOneRecord("SELECT count(forwarding_id) as number FROM mail_forwarding WHERE active = 'y' AND source = ?", $this->dataRecord["email"]); if($tmp['number'] > 0) $app->tform->errorMessage .= $app->tform->lng("duplicate_alias_or_forward_txt")."
"; -- GitLab From 65fc415b9a4715bc411548e782235b8c788a2c18 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 20:37:24 +0200 Subject: [PATCH 0235/1368] Remove double or empty titles --- .../web/dns/templates/dns_naptr_edit.htm | 6 --- .../sites/templates/web_vhost_domain_edit.htm | 39 ++++++++----------- 2 files changed, 17 insertions(+), 28 deletions(-) diff --git a/interface/web/dns/templates/dns_naptr_edit.htm b/interface/web/dns/templates/dns_naptr_edit.htm index 8fd928c3de..15a944d629 100644 --- a/interface/web/dns/templates/dns_naptr_edit.htm +++ b/interface/web/dns/templates/dns_naptr_edit.htm @@ -1,9 +1,3 @@ -

-

- -
diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index 6092778af8..e39b889d4c 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -1,8 +1,3 @@ - -

-

{tmpl_var name='configuration_error_txt'}

@@ -94,7 +89,7 @@
{tmpl_var name='document_root'}
-
+
@@ -291,13 +286,13 @@ } adjustForm(true); reloadFastcgiPHPVersions(true); - + jQuery('#client_group_id').change(function(){ clientGroupId = $(this).val(); reloadWebIP(); reloadFastcgiPHPVersions(); }); - + if(jQuery('#php').val() == 'fast-cgi' || jQuery('#php').val() == 'php-fpm' || (jQuery('#php').val() == 'hhvm' && serverType == 'nginx')){ jQuery('.fastcgi_php_version:hidden').show(); if(jQuery('#php').val() == 'hhvm'){ @@ -311,10 +306,10 @@ jQuery('.fastcgi_php_version:visible').hide(); } //ISPConfig.resetFormChanged(); - + jQuery('#php').change(function(){ reloadFastcgiPHPVersions(); - if(jQuery(this).val() == 'fast-cgi' || jQuery(this).val() == 'php-fpm' || (jQuery(this).val() == 'hhvm' && serverType == 'nginx')){ + if(jQuery(this).val() == 'fast-cgi' || jQuery(this).val() == 'php-fpm' || (jQuery(this).val() == 'hhvm' && serverType == 'nginx')){ jQuery('.fastcgi_php_version:hidden').show(); if(jQuery(this).val() == 'hhvm'){ jQuery('#fastcgi_php_version_txt').hide(); @@ -333,7 +328,7 @@ // new Vhostsubdomains/Vhostaliasdomains if(serverId == '') jQuery('#parent_domain_id').trigger('change'); -/* +/* if(jQuery('#directive_snippets_id').val() > 0){ jQuery('.pagespeed').show(); } else { @@ -347,7 +342,7 @@ } }); */ - + function reloadServerId(noFormChange) { var parentWebId = jQuery('#parent_domain_id').val(); jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {web_id : parentWebId, type : "getserverid"}, function(data) { @@ -356,7 +351,7 @@ if(noFormChange) reloadFastcgiPHPVersions(noFormChange); }); } - + function adjustForm(noFormChange){ jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {server_id : serverId, type : "getservertype"}, function(data) { if(data.servertype == "nginx"){ @@ -399,7 +394,7 @@ } }); } - + function reloadDirectiveSnippets() { jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {server_id : serverId, type : "getdirectivesnippet"}, function(data) { var options = ''; @@ -414,7 +409,7 @@ options += ''; } options += ''; - + options += ""; for (var i = 0, len = data['snippets'].length; i < len; i++) { var isSelected = ''; @@ -430,7 +425,7 @@ $('#directive_snippets_id').html(options).change(); }); } - + function reloadWebIP() { ISPConfig.loadOptionInto('ip_address','sites/ajax_get_ip.php?ip_type=IPv4&server_id='+serverId+'&client_group_id='+clientGroupId, rerenderSelect2); ISPConfig.loadOptionInto('ipv6_address','sites/ajax_get_ip.php?ip_type=IPv6&server_id='+serverId+'&client_group_id='+clientGroupId, rerenderSelect2); @@ -438,11 +433,11 @@ //$('#ip_address').add('#ipv6_address').select2(); } - + function rerenderSelect2(elem) { $('#'+elem).select2(); } - + function reloadFastcgiPHPVersions(noFormChange) { jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {server_id : serverId, php_type : jQuery('#php').val(), type : "getphpfastcgi", client_group_id : clientGroupId}, function(data) { //var options = ''; @@ -474,7 +469,7 @@ if(noFormChange) ISPConfig.resetFormChanged(); }); } - + jQuery('div.panel_web_domain').find('fieldset').find('input,select,button').not('#directive_snippets_id').bind('click mousedown', function(e) { e.preventDefault(); }).focus(function() { $(this).blur(); }); jQuery('#dom-edit-submit').click(function() { @@ -485,7 +480,7 @@ ISPConfig.submitForm('pageForm','sites/web_vhost_domain_edit.php'); }); - + if($('#domain').val() == ''){ $('#web_folder_domain').text('[DOMAIN]'); } else { @@ -498,9 +493,9 @@ $('#web_folder_domain').text($('#domain').val()); } }); - + $('#more_folder_directive_snippets').click(function(){ $('.folder_directive_snippets:hidden:first').removeClass('hidden'); }); - + -- GitLab From 4b508f66ccbbe28535bc2b975016cb83529a270a Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 21:10:02 +0200 Subject: [PATCH 0236/1368] Remove double or empty titles --- interface/web/client/templates/client_edit_address.htm | 8 ++++---- interface/web/client/templates/client_edit_limits.htm | 6 +++--- .../web/mail/templates/mail_domain_catchall_edit.htm | 4 ++-- interface/web/mail/templates/mail_user_backup.htm | 4 +--- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/interface/web/client/templates/client_edit_address.htm b/interface/web/client/templates/client_edit_address.htm index 23318b218b..835b264400 100644 --- a/interface/web/client/templates/client_edit_address.htm +++ b/interface/web/client/templates/client_edit_address.htm @@ -1,7 +1,7 @@ - {tmpl_var name='Address'} -
+
-
+
+
diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm index 0508ab5090..db0b370804 100644 --- a/interface/web/client/templates/client_edit_limits.htm +++ b/interface/web/client/templates/client_edit_limits.htm @@ -1,7 +1,7 @@
- +
-
{tmpl_var name="Limits"} +
- +
diff --git a/interface/web/mail/templates/mail_domain_catchall_edit.htm b/interface/web/mail/templates/mail_domain_catchall_edit.htm index 0ccae15a8f..8da10f1f09 100644 --- a/interface/web/mail/templates/mail_domain_catchall_edit.htm +++ b/interface/web/mail/templates/mail_domain_catchall_edit.htm @@ -1,4 +1,4 @@ -<
+
@@ -22,7 +22,7 @@ {tmpl_var name='active'}
- + diff --git a/interface/web/mail/templates/mail_user_backup.htm b/interface/web/mail/templates/mail_user_backup.htm index 0de61a3297..bbf1abaf87 100644 --- a/interface/web/mail/templates/mail_user_backup.htm +++ b/interface/web/mail/templates/mail_user_backup.htm @@ -7,8 +7,6 @@
- - Backup
- + {tmpl_var name='backup_records'} -- GitLab From dbc5be35d3f8bfbae7a0e12bc38e82147f1cabc5 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 21:34:10 +0200 Subject: [PATCH 0237/1368] Edit checks to be RFC compliant --- interface/web/dns/dns_a_edit.php | 2 +- interface/web/dns/dns_aaaa_edit.php | 2 +- interface/web/dns/dns_dname_edit.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/web/dns/dns_a_edit.php b/interface/web/dns/dns_a_edit.php index 19cb7d1c01..595ebcc92c 100644 --- a/interface/web/dns/dns_a_edit.php +++ b/interface/web/dns/dns_a_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/dns_aaaa_edit.php b/interface/web/dns/dns_aaaa_edit.php index 7d6972854f..780fbcc80e 100644 --- a/interface/web/dns/dns_aaaa_edit.php +++ b/interface/web/dns/dns_aaaa_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'AAAA' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'AAAA' AND name = ? AND zone = ? and data = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->dataRecord["data"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } diff --git a/interface/web/dns/dns_dname_edit.php b/interface/web/dns/dns_dname_edit.php index c33c0cce71..b4cd8ffaea 100644 --- a/interface/web/dns/dns_dname_edit.php +++ b/interface/web/dns/dns_dname_edit.php @@ -48,7 +48,7 @@ class page_action extends dns_page_action { protected function checkDuplicate() { global $app; //* Check for duplicates where IP and hostname are the same - $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'A' AND name = ? AND zone = ? and id != ?) OR (type = 'AAAA' AND name = ? AND zone = ? and id != ?) OR (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); + $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM dns_rr WHERE (type = 'CNAME' AND name = ? AND zone = ? and id != ?) OR (type = 'DNAME' AND name = ? AND zone = ? and id != ?)", $this->dataRecord["name"], $this->dataRecord["zone"], $this->id, $this->dataRecord["name"], $this->dataRecord["zone"], $this->id); if($tmp['number'] > 0) return true; return false; } -- GitLab From 9245e4d5b859f9af208319fc843564fec28a5533 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 15 Jun 2020 21:34:57 +0200 Subject: [PATCH 0238/1368] Correct duplicate translation --- interface/web/dns/lib/lang/ar_dns_a.lng | 2 +- interface/web/dns/lib/lang/ar_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ar_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ar_dns_dname.lng | 2 +- interface/web/dns/lib/lang/bg_dns_a.lng | 2 +- interface/web/dns/lib/lang/bg_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/bg_dns_cname.lng | 2 +- interface/web/dns/lib/lang/bg_dns_dname.lng | 2 +- interface/web/dns/lib/lang/br_dns_a.lng | 2 +- interface/web/dns/lib/lang/br_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/br_dns_cname.lng | 2 +- interface/web/dns/lib/lang/br_dns_dname.lng | 2 +- interface/web/dns/lib/lang/ca_dns_a.lng | 2 +- interface/web/dns/lib/lang/ca_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ca_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ca_dns_dname.lng | 2 +- interface/web/dns/lib/lang/cz_dns_a.lng | 2 +- interface/web/dns/lib/lang/cz_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/cz_dns_cname.lng | 2 +- interface/web/dns/lib/lang/cz_dns_dname.lng | 2 +- interface/web/dns/lib/lang/de_dns_a.lng | 2 +- interface/web/dns/lib/lang/de_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/de_dns_cname.lng | 2 +- interface/web/dns/lib/lang/de_dns_dname.lng | 2 +- interface/web/dns/lib/lang/dk_dns_a.lng | 2 +- interface/web/dns/lib/lang/dk_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/dk_dns_cname.lng | 2 +- interface/web/dns/lib/lang/dk_dns_dname.lng | 2 +- interface/web/dns/lib/lang/el_dns_a.lng | 2 +- interface/web/dns/lib/lang/el_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/el_dns_cname.lng | 2 +- interface/web/dns/lib/lang/el_dns_dname.lng | 2 +- interface/web/dns/lib/lang/en_dns_a.lng | 2 +- interface/web/dns/lib/lang/en_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/en_dns_cname.lng | 2 +- interface/web/dns/lib/lang/en_dns_dname.lng | 2 +- interface/web/dns/lib/lang/es_dns_a.lng | 2 +- interface/web/dns/lib/lang/es_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/es_dns_cname.lng | 2 +- interface/web/dns/lib/lang/es_dns_dname.lng | 2 +- interface/web/dns/lib/lang/fi_dns_a.lng | 2 +- interface/web/dns/lib/lang/fi_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/fi_dns_cname.lng | 2 +- interface/web/dns/lib/lang/fi_dns_dname.lng | 2 +- interface/web/dns/lib/lang/fr_dns_a.lng | 2 +- interface/web/dns/lib/lang/fr_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/fr_dns_cname.lng | 2 +- interface/web/dns/lib/lang/fr_dns_dname.lng | 2 +- interface/web/dns/lib/lang/hr_dns_a.lng | 2 +- interface/web/dns/lib/lang/hr_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/hr_dns_cname.lng | 2 +- interface/web/dns/lib/lang/hr_dns_dname.lng | 2 +- interface/web/dns/lib/lang/hu_dns_a.lng | 2 +- interface/web/dns/lib/lang/hu_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/hu_dns_cname.lng | 2 +- interface/web/dns/lib/lang/hu_dns_dname.lng | 2 +- interface/web/dns/lib/lang/id_dns_a.lng | 2 +- interface/web/dns/lib/lang/id_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/id_dns_cname.lng | 2 +- interface/web/dns/lib/lang/id_dns_dname.lng | 2 +- interface/web/dns/lib/lang/it_dns_a.lng | 2 +- interface/web/dns/lib/lang/it_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/it_dns_cname.lng | 2 +- interface/web/dns/lib/lang/it_dns_dname.lng | 2 +- interface/web/dns/lib/lang/ja_dns_a.lng | 2 +- interface/web/dns/lib/lang/ja_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ja_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ja_dns_dname.lng | 2 +- interface/web/dns/lib/lang/nl_dns_a.lng | 2 +- interface/web/dns/lib/lang/nl_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/nl_dns_cname.lng | 2 +- interface/web/dns/lib/lang/nl_dns_dname.lng | 2 +- interface/web/dns/lib/lang/pl_dns_a.lng | 2 +- interface/web/dns/lib/lang/pl_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/pl_dns_cname.lng | 2 +- interface/web/dns/lib/lang/pl_dns_dname.lng | 2 +- interface/web/dns/lib/lang/pt_dns_a.lng | 2 +- interface/web/dns/lib/lang/pt_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/pt_dns_cname.lng | 2 +- interface/web/dns/lib/lang/pt_dns_dname.lng | 2 +- interface/web/dns/lib/lang/ro_dns_a.lng | 2 +- interface/web/dns/lib/lang/ro_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ro_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ro_dns_dname.lng | 2 +- interface/web/dns/lib/lang/ru_dns_a.lng | 2 +- interface/web/dns/lib/lang/ru_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/ru_dns_cname.lng | 2 +- interface/web/dns/lib/lang/ru_dns_dname.lng | 2 +- interface/web/dns/lib/lang/se_dns_a.lng | 2 +- interface/web/dns/lib/lang/se_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/se_dns_cname.lng | 2 +- interface/web/dns/lib/lang/se_dns_dname.lng | 2 +- interface/web/dns/lib/lang/sk_dns_a.lng | 2 +- interface/web/dns/lib/lang/sk_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/sk_dns_cname.lng | 2 +- interface/web/dns/lib/lang/sk_dns_dname.lng | 2 +- interface/web/dns/lib/lang/tr_dns_a.lng | 2 +- interface/web/dns/lib/lang/tr_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/tr_dns_cname.lng | 2 +- interface/web/dns/lib/lang/tr_dns_dname.lng | 2 +- 100 files changed, 100 insertions(+), 100 deletions(-) diff --git a/interface/web/dns/lib/lang/ar_dns_a.lng b/interface/web/dns/lib/lang/ar_dns_a.lng index c191ff19d3..577bb47d5b 100644 --- a/interface/web/dns/lib/lang/ar_dns_a.lng +++ b/interface/web/dns/lib/lang/ar_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_aaaa.lng b/interface/web/dns/lib/lang/ar_dns_aaaa.lng index 03f18f18da..da7eeb8a0f 100644 --- a/interface/web/dns/lib/lang/ar_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ar_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_cname.lng b/interface/web/dns/lib/lang/ar_dns_cname.lng index 636c4e7a7a..382397abf7 100644 --- a/interface/web/dns/lib/lang/ar_dns_cname.lng +++ b/interface/web/dns/lib/lang/ar_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ar_dns_dname.lng b/interface/web/dns/lib/lang/ar_dns_dname.lng index 382397abf7..483e1d14b5 100644 --- a/interface/web/dns/lib/lang/ar_dns_dname.lng +++ b/interface/web/dns/lib/lang/ar_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_a.lng b/interface/web/dns/lib/lang/bg_dns_a.lng index f789a19f47..6b4950722b 100644 --- a/interface/web/dns/lib/lang/bg_dns_a.lng +++ b/interface/web/dns/lib/lang/bg_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Полето за хост име е празно.'; $wb['name_error_regex'] = 'Избраното име на хост е в грешен формат.'; $wb['data_error_empty'] = 'Полето за IP-адреса е празно'; $wb['ip_error_wrong'] = 'Формата на IP-адреса е грешен'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_aaaa.lng b/interface/web/dns/lib/lang/bg_dns_aaaa.lng index d2ca072bec..27062fce22 100644 --- a/interface/web/dns/lib/lang/bg_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/bg_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Вие нямате право да добавяте за $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_cname.lng b/interface/web/dns/lib/lang/bg_dns_cname.lng index d9863d10e8..4705cd73d8 100644 --- a/interface/web/dns/lib/lang/bg_dns_cname.lng +++ b/interface/web/dns/lib/lang/bg_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_dname.lng b/interface/web/dns/lib/lang/bg_dns_dname.lng index 4705cd73d8..5fc67ceaeb 100644 --- a/interface/web/dns/lib/lang/bg_dns_dname.lng +++ b/interface/web/dns/lib/lang/bg_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Полето с имейла е празно.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_a.lng b/interface/web/dns/lib/lang/br_dns_a.lng index 7204ce11ab..deb66ec97a 100644 --- a/interface/web/dns/lib/lang/br_dns_a.lng +++ b/interface/web/dns/lib/lang/br_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'Endereço IP está em branco.'; $wb['ip_error_wrong'] = 'Endereço IP inválido.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_aaaa.lng b/interface/web/dns/lib/lang/br_dns_aaaa.lng index 5678f2c67f..b4274c7b51 100644 --- a/interface/web/dns/lib/lang/br_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/br_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Você não tem permissão para adicionar registros dns ne $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'Endereço IPv6 está em branco.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'O endereço IPv6 possui formato inválido.'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_cname.lng b/interface/web/dns/lib/lang/br_dns_cname.lng index e36fb57909..4a8f98cb02 100644 --- a/interface/web/dns/lib/lang/br_dns_cname.lng +++ b/interface/web/dns/lib/lang/br_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'O alvo do host está em branco.'; $wb['data_error_regex'] = 'O alvo do host possui formato inválido.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_dname.lng b/interface/web/dns/lib/lang/br_dns_dname.lng index 4a8f98cb02..c2ba45f86e 100644 --- a/interface/web/dns/lib/lang/br_dns_dname.lng +++ b/interface/web/dns/lib/lang/br_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'O nome do host está em branco.'; $wb['name_error_regex'] = 'O nome do host possui formato inválido (somente nomes canônicos são suportados).'; $wb['data_error_empty'] = 'O alvo do host está em branco.'; $wb['data_error_regex'] = 'O alvo do host possui formato inválido.'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'O TTL mínimo são 60 segundos.'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_a.lng b/interface/web/dns/lib/lang/ca_dns_a.lng index e91bff2c73..f486bb6d49 100644 --- a/interface/web/dns/lib/lang/ca_dns_a.lng +++ b/interface/web/dns/lib/lang/ca_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_aaaa.lng b/interface/web/dns/lib/lang/ca_dns_aaaa.lng index 94a7deeddb..0aed36e119 100644 --- a/interface/web/dns/lib/lang/ca_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ca_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n\'avez pas la permission d\'ajouter un enregistreme $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'L\'adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_cname.lng b/interface/web/dns/lib/lang/ca_dns_cname.lng index 94d523c4e2..480f1ddd4d 100644 --- a/interface/web/dns/lib/lang/ca_dns_cname.lng +++ b/interface/web/dns/lib/lang/ca_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d\'hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d\'hôte cible invalide.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ca_dns_dname.lng b/interface/web/dns/lib/lang/ca_dns_dname.lng index 480f1ddd4d..d9d8296fdb 100644 --- a/interface/web/dns/lib/lang/ca_dns_dname.lng +++ b/interface/web/dns/lib/lang/ca_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Le nom d\'hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d\'hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d\'hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d\'hôte cible invalide.'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_a.lng b/interface/web/dns/lib/lang/cz_dns_a.lng index cfc3c60854..1aa476275c 100644 --- a/interface/web/dns/lib/lang/cz_dns_a.lng +++ b/interface/web/dns/lib/lang/cz_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny.'; $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'IP adresa je prázdná'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_aaaa.lng b/interface/web/dns/lib/lang/cz_dns_aaaa.lng index 67fc7c7906..371d3f591b 100644 --- a/interface/web/dns/lib/lang/cz_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/cz_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnění přidat záznam do této zóny.'; $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'IP adresa je prázdná'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; $wb['ip_error_wrong'] = 'IP - formát adresy neplatný'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_cname.lng b/interface/web/dns/lib/lang/cz_dns_cname.lng index c41b619588..7003f707c4 100644 --- a/interface/web/dns/lib/lang/cz_dns_cname.lng +++ b/interface/web/dns/lib/lang/cz_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'Cílový název hostitele je prázdný'; $wb['data_error_regex'] = 'Cílový název hostitele má chybný formát'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_dname.lng b/interface/web/dns/lib/lang/cz_dns_dname.lng index 7003f707c4..1419acf02f 100644 --- a/interface/web/dns/lib/lang/cz_dns_dname.lng +++ b/interface/web/dns/lib/lang/cz_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Název hostitele je prázdný.'; $wb['name_error_regex'] = 'Název hostitele má chybný formát.'; $wb['data_error_empty'] = 'Cílový název hostitele je prázdný'; $wb['data_error_regex'] = 'Cílový název hostitele má chybný formát'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL doba je 60 sekund.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_a.lng b/interface/web/dns/lib/lang/de_dns_a.lng index af10bb1d19..c60afbbc1f 100644 --- a/interface/web/dns/lib/lang/de_dns_a.lng +++ b/interface/web/dns/lib/lang/de_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv4 Adresse ist leer'; $wb['ip_error_wrong'] = 'IPv4 Adressen Format ist ungültig'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_aaaa.lng b/interface/web/dns/lib/lang/de_dns_aaaa.lng index c54663a94f..0251a9dc26 100644 --- a/interface/web/dns/lib/lang/de_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/de_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Sie haben nicht die Berechtigung, einen Eintrag zu dieser $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'IPv6 Adresse ist leer'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IPv6 Adressen Format ist ungültig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_cname.lng b/interface/web/dns/lib/lang/de_dns_cname.lng index 0342276336..6aed8fb825 100644 --- a/interface/web/dns/lib/lang/de_dns_cname.lng +++ b/interface/web/dns/lib/lang/de_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'Ziel Hostname ist leer'; $wb['data_error_regex'] = 'Ziel Hostname Format ist ungültig'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/de_dns_dname.lng b/interface/web/dns/lib/lang/de_dns_dname.lng index f2154e37ad..492613e75b 100644 --- a/interface/web/dns/lib/lang/de_dns_dname.lng +++ b/interface/web/dns/lib/lang/de_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Der Hostname ist leer.'; $wb['name_error_regex'] = 'Der Hostname hat das falsche Format.'; $wb['data_error_empty'] = 'Ziel Hostname ist leer'; $wb['data_error_regex'] = 'Ziel Hostname Format ist ungültig'; -$wb['data_error_duplicate'] = 'Doppelter A, CNAME oder DNAME Eintrag'; +$wb['data_error_duplicate'] = 'Doppelter CNAME oder DNAME Eintrag'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_a.lng b/interface/web/dns/lib/lang/dk_dns_a.lng index 7506edcef5..6ce7aa5072 100644 --- a/interface/web/dns/lib/lang/dk_dns_a.lng +++ b/interface/web/dns/lib/lang/dk_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_aaaa.lng b/interface/web/dns/lib/lang/dk_dns_aaaa.lng index 107b28be91..c8d4dac13a 100644 --- a/interface/web/dns/lib/lang/dk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/dk_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Du har ikke tilladelse til at tilføje en post til denne $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'IP-Adressen er tom'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_cname.lng b/interface/web/dns/lib/lang/dk_dns_cname.lng index e213d6e3d9..1815eab77a 100644 --- a/interface/web/dns/lib/lang/dk_dns_cname.lng +++ b/interface/web/dns/lib/lang/dk_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'Mål-værtsnavn er tom'; $wb['data_error_regex'] = 'Mål-værtsnavn format er ugyldigt'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_dname.lng b/interface/web/dns/lib/lang/dk_dns_dname.lng index 1815eab77a..0e651af8d3 100644 --- a/interface/web/dns/lib/lang/dk_dns_dname.lng +++ b/interface/web/dns/lib/lang/dk_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Værtsnavnet er tomt.'; $wb['name_error_regex'] = 'Værtsnavnet har et forkert format.'; $wb['data_error_empty'] = 'Mål-værtsnavn er tom'; $wb['data_error_regex'] = 'Mål-værtsnavn format er ugyldigt'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL tid er 60 sekunder.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_a.lng b/interface/web/dns/lib/lang/el_dns_a.lng index 6202d2e88b..96667ba7a2 100644 --- a/interface/web/dns/lib/lang/el_dns_a.lng +++ b/interface/web/dns/lib/lang/el_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Η διεύθυνση IP είναι κενή'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_aaaa.lng b/interface/web/dns/lib/lang/el_dns_aaaa.lng index 5341e9022d..5c66fee51d 100644 --- a/interface/web/dns/lib/lang/el_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/el_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Δεν έχετε δικαίωμα να προσθέσε $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Διεύθυνση IP κενή'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Διεύθυνση IP με μη έγκυρη μορφοποίηση'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_cname.lng b/interface/web/dns/lib/lang/el_dns_cname.lng index 1d19eb0c23..ba6404887a 100644 --- a/interface/web/dns/lib/lang/el_dns_cname.lng +++ b/interface/web/dns/lib/lang/el_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Το hostname Προορισμός δεν έχει οριστεί'; $wb['data_error_regex'] = 'Hostname Προορισμός με μη έγκυρη μορφοποίηση'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_dname.lng b/interface/web/dns/lib/lang/el_dns_dname.lng index ba6404887a..6623e1f8af 100644 --- a/interface/web/dns/lib/lang/el_dns_dname.lng +++ b/interface/web/dns/lib/lang/el_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Το hostname δεν έχει οριστεί.'; $wb['name_error_regex'] = 'Το hostname δεν έχει σωστή μορφοποίηση.'; $wb['data_error_empty'] = 'Το hostname Προορισμός δεν έχει οριστεί'; $wb['data_error_regex'] = 'Hostname Προορισμός με μη έγκυρη μορφοποίηση'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_a.lng b/interface/web/dns/lib/lang/en_dns_a.lng index 3f9f4aa047..99ca6418b8 100644 --- a/interface/web/dns/lib/lang/en_dns_a.lng +++ b/interface/web/dns/lib/lang/en_dns_a.lng @@ -12,6 +12,6 @@ $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'IP-Address empty'; $wb["ip_error_wrong"] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_aaaa.lng b/interface/web/dns/lib/lang/en_dns_aaaa.lng index d55ab7ffd3..3b642474c3 100644 --- a/interface/web/dns/lib/lang/en_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/en_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb["no_zone_perm"] = 'You do not have the permission to add a record to this DN $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb["ip_error_wrong"] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_cname.lng b/interface/web/dns/lib/lang/en_dns_cname.lng index 7ffb78e0d3..d9b41a012e 100644 --- a/interface/web/dns/lib/lang/en_dns_cname.lng +++ b/interface/web/dns/lib/lang/en_dns_cname.lng @@ -12,6 +12,6 @@ $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'Target hostname empty'; $wb["data_error_regex"] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/en_dns_dname.lng b/interface/web/dns/lib/lang/en_dns_dname.lng index d9b41a012e..95e81423e0 100644 --- a/interface/web/dns/lib/lang/en_dns_dname.lng +++ b/interface/web/dns/lib/lang/en_dns_dname.lng @@ -12,6 +12,6 @@ $wb["name_error_empty"] = 'The hostname is empty.'; $wb["name_error_regex"] = 'The hostname has the wrong format.'; $wb["data_error_empty"] = 'Target hostname empty'; $wb["data_error_regex"] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/es_dns_a.lng b/interface/web/dns/lib/lang/es_dns_a.lng index 0f19854e2d..6d3c01ebb4 100644 --- a/interface/web/dns/lib/lang/es_dns_a.lng +++ b/interface/web/dns/lib/lang/es_dns_a.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/dns/lib/lang/fi_dns_aaaa.lng b/interface/web/dns/lib/lang/fi_dns_aaaa.lng index 3759287206..8c0c607141 100644 --- a/interface/web/dns/lib/lang/fi_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fi_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Käyttäjätunnuksella ei ole oikeuksia lisätä tietueit $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on väärän muotoinen.'; $wb['data_error_empty'] = 'Tekstikenttä on tyhjä'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Tekstikenttä on vääränlainen'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_cname.lng b/interface/web/dns/lib/lang/fi_dns_cname.lng index 202949b9f7..d7483389d4 100644 --- a/interface/web/dns/lib/lang/fi_dns_cname.lng +++ b/interface/web/dns/lib/lang/fi_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.'; $wb['data_error_empty'] = 'Kohteen verkkotunnus on tyhjä'; $wb['data_error_regex'] = 'Kohteen verkkotunnus on vääränlainen'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_dname.lng b/interface/web/dns/lib/lang/fi_dns_dname.lng index d7483389d4..58d5481afc 100644 --- a/interface/web/dns/lib/lang/fi_dns_dname.lng +++ b/interface/web/dns/lib/lang/fi_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Verkkotunnus on tyhjä.'; $wb['name_error_regex'] = 'Verkkotunnus on vääränlainen.'; $wb['data_error_empty'] = 'Kohteen verkkotunnus on tyhjä'; $wb['data_error_regex'] = 'Kohteen verkkotunnus on vääränlainen'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_a.lng b/interface/web/dns/lib/lang/fr_dns_a.lng index f022f0c873..9e9625ba1c 100644 --- a/interface/web/dns/lib/lang/fr_dns_a.lng +++ b/interface/web/dns/lib/lang/fr_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_aaaa.lng b/interface/web/dns/lib/lang/fr_dns_aaaa.lng index 52e5ef1b33..9f925c3291 100644 --- a/interface/web/dns/lib/lang/fr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/fr_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Vous n’avez pas la permission d’ajouter un enregistre $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'L’adresse IP est vide.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_cname.lng b/interface/web/dns/lib/lang/fr_dns_cname.lng index 8a5840a2bc..47779eeffe 100644 --- a/interface/web/dns/lib/lang/fr_dns_cname.lng +++ b/interface/web/dns/lib/lang/fr_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d’hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d’hôte cible invalide.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_dname.lng b/interface/web/dns/lib/lang/fr_dns_dname.lng index 47779eeffe..ad41861785 100644 --- a/interface/web/dns/lib/lang/fr_dns_dname.lng +++ b/interface/web/dns/lib/lang/fr_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Le nom d’hôte est vide.'; $wb['name_error_regex'] = 'Le format du nom d’hôte est invalide.'; $wb['data_error_empty'] = 'Le nom d’hôte cible est vide.'; $wb['data_error_regex'] = 'Le format du nom d’hôte cible invalide.'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_a.lng b/interface/web/dns/lib/lang/hr_dns_a.lng index b4c83d6431..bcc49eb52b 100644 --- a/interface/web/dns/lib/lang/hr_dns_a.lng +++ b/interface/web/dns/lib/lang/hr_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IP adresa je prazno'; $wb['ip_error_wrong'] = 'Neispravan format A zapisa'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_aaaa.lng b/interface/web/dns/lib/lang/hr_dns_aaaa.lng index 2e2ee87893..2be6042aa9 100644 --- a/interface/web/dns/lib/lang/hr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hr_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemate dozvolu za dodavanja zapisa ovoj domeni.'; $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje IPv6 adresa je prazno'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Neispravan format IPv6 adrese'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_cname.lng b/interface/web/dns/lib/lang/hr_dns_cname.lng index 4e8fad12ba..ce334e750e 100644 --- a/interface/web/dns/lib/lang/hr_dns_cname.lng +++ b/interface/web/dns/lib/lang/hr_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje odredišni host je prazno'; $wb['data_error_regex'] = 'Neispravan format odredišnog host zapisa'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_dname.lng b/interface/web/dns/lib/lang/hr_dns_dname.lng index ce334e750e..e854c3efe1 100644 --- a/interface/web/dns/lib/lang/hr_dns_dname.lng +++ b/interface/web/dns/lib/lang/hr_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Naziv hosta nije upisan.'; $wb['name_error_regex'] = 'Naziv hosta je u pogrešnom formatu.'; $wb['data_error_empty'] = 'Polje odredišni host je prazno'; $wb['data_error_regex'] = 'Neispravan format odredišnog host zapisa'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Minimalno TTL vrijeme je 60 sekundi.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_a.lng b/interface/web/dns/lib/lang/hu_dns_a.lng index 9c27b79139..f17ccaa11d 100644 --- a/interface/web/dns/lib/lang/hu_dns_a.lng +++ b/interface/web/dns/lib/lang/hu_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_aaaa.lng b/interface/web/dns/lib/lang/hu_dns_aaaa.lng index a532c80ca1..02643fed88 100644 --- a/interface/web/dns/lib/lang/hu_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/hu_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_cname.lng b/interface/web/dns/lib/lang/hu_dns_cname.lng index 36969d9984..38a6415774 100644 --- a/interface/web/dns/lib/lang/hu_dns_cname.lng +++ b/interface/web/dns/lib/lang/hu_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_dname.lng b/interface/web/dns/lib/lang/hu_dns_dname.lng index 38a6415774..d8d5ba8189 100644 --- a/interface/web/dns/lib/lang/hu_dns_dname.lng +++ b/interface/web/dns/lib/lang/hu_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_a.lng b/interface/web/dns/lib/lang/id_dns_a.lng index 659091bca6..20d5e9f355 100644 --- a/interface/web/dns/lib/lang/id_dns_a.lng +++ b/interface/web/dns/lib/lang/id_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_aaaa.lng b/interface/web/dns/lib/lang/id_dns_aaaa.lng index 4b17ef0e85..f9b3395995 100644 --- a/interface/web/dns/lib/lang/id_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/id_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Anda tidak memiliki hak untuk menambah record ke zona DNS $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Alamat IP kosong'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Format Alamat IP tidak valid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_cname.lng b/interface/web/dns/lib/lang/id_dns_cname.lng index 4151b241db..9413415394 100644 --- a/interface/web/dns/lib/lang/id_dns_cname.lng +++ b/interface/web/dns/lib/lang/id_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Nama Host Target kosong'; $wb['data_error_regex'] = 'Format Nama Host Target tidak valid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_dname.lng b/interface/web/dns/lib/lang/id_dns_dname.lng index 9413415394..a941b31084 100644 --- a/interface/web/dns/lib/lang/id_dns_dname.lng +++ b/interface/web/dns/lib/lang/id_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nama Host kosong.'; $wb['name_error_regex'] = 'Format Nama Host salah.'; $wb['data_error_empty'] = 'Nama Host Target kosong'; $wb['data_error_regex'] = 'Format Nama Host Target tidak valid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng index 2e79466d7f..eec6ad5b07 100644 --- a/interface/web/dns/lib/lang/it_dns_a.lng +++ b/interface/web/dns/lib/lang/it_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname vuoto.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng index 76c540459d..fb1a2a58a6 100644 --- a/interface/web/dns/lib/lang/it_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DN $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Indirizzo Ip vuoto'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_cname.lng b/interface/web/dns/lib/lang/it_dns_cname.lng index 76cd9cd0e7..6d7d135a01 100644 --- a/interface/web/dns/lib/lang/it_dns_cname.lng +++ b/interface/web/dns/lib/lang/it_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Target nome host vuoto'; $wb['data_error_regex'] = 'Target nome host formato errato'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_dname.lng b/interface/web/dns/lib/lang/it_dns_dname.lng index 6d7d135a01..e9d1a057cc 100644 --- a/interface/web/dns/lib/lang/it_dns_dname.lng +++ b/interface/web/dns/lib/lang/it_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Target nome host vuoto'; $wb['data_error_regex'] = 'Target nome host formato errato'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_a.lng b/interface/web/dns/lib/lang/ja_dns_a.lng index a59aec7376..a64a87fc3f 100644 --- a/interface/web/dns/lib/lang/ja_dns_a.lng +++ b/interface/web/dns/lib/lang/ja_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_aaaa.lng b/interface/web/dns/lib/lang/ja_dns_aaaa.lng index cfc23b426a..233cfd71ed 100644 --- a/interface/web/dns/lib/lang/ja_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ja_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'このDNSゾーンにレコードを追加する権限が $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'IPアドレスを入力してください。'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IPアドレスの形式が不正です。'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_cname.lng b/interface/web/dns/lib/lang/ja_dns_cname.lng index b29ead6599..af805c9823 100644 --- a/interface/web/dns/lib/lang/ja_dns_cname.lng +++ b/interface/web/dns/lib/lang/ja_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'ターゲットのホスト名を入力してください。'; $wb['data_error_regex'] = 'ターゲットのホスト名の形式が不正です。'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_dname.lng b/interface/web/dns/lib/lang/ja_dns_dname.lng index af805c9823..141f9290e1 100644 --- a/interface/web/dns/lib/lang/ja_dns_dname.lng +++ b/interface/web/dns/lib/lang/ja_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'ホスト名を入力してください。'; $wb['name_error_regex'] = 'ホスト名の形式が不正です。'; $wb['data_error_empty'] = 'ターゲットのホスト名を入力してください。'; $wb['data_error_regex'] = 'ターゲットのホスト名の形式が不正です。'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_a.lng b/interface/web/dns/lib/lang/nl_dns_a.lng index 45d0501ac9..38e30234c7 100644 --- a/interface/web/dns/lib/lang/nl_dns_a.lng +++ b/interface/web/dns/lib/lang/nl_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'De hostnaam is niet ingvuld.'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingvuld'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; -$wb['data_error_duplicate'] = 'Duplicaat A, CNAME, of DNAME record'; +$wb['data_error_duplicate'] = 'Duplicaat A of CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_aaaa.lng b/interface/web/dns/lib/lang/nl_dns_aaaa.lng index e30766442d..218799bb4a 100644 --- a/interface/web/dns/lib/lang/nl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/nl_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'U heeft geen toestemming om een record toe te voegen aan $wb['name_error_empty'] = 'De hostnaam is niet ingvuld'; $wb['name_error_regex'] = 'De hostnaam heeft een onjuist formaat.'; $wb['data_error_empty'] = 'IP-adres is niet ingevuld'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-adres formaat ongeldig'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_cname.lng b/interface/web/dns/lib/lang/nl_dns_cname.lng index 84b904a60e..778a05a5fa 100644 --- a/interface/web/dns/lib/lang/nl_dns_cname.lng +++ b/interface/web/dns/lib/lang/nl_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'De hostnaam is niet ingvuld.'; $wb['name_error_regex'] = 'De hostname heeft een onjuist formaat.'; $wb['data_error_empty'] = 'Doel hostnaam is niet ingvuld'; $wb['data_error_regex'] = 'Doel hostnaam formaat ongeldig'; -$wb['data_error_duplicate'] = 'Duplicaat A, CNAME, of DNAME record'; +$wb['data_error_duplicate'] = 'Duplicaat A, AAAA, CNAME, of DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/nl_dns_dname.lng b/interface/web/dns/lib/lang/nl_dns_dname.lng index d5f63bcc13..6072ddb377 100644 --- a/interface/web/dns/lib/lang/nl_dns_dname.lng +++ b/interface/web/dns/lib/lang/nl_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'De hostnaam is niet ingvuld.'; $wb['name_error_regex'] = 'De hostname heeft een onjuist formaat.'; $wb['data_error_empty'] = 'Doel hostnaam is niet ingvuld'; $wb['data_error_regex'] = 'Doel hostnaam formaat ongeldig'; -$wb['data_error_duplicate'] = 'Duplicaat A-record, CNAME-record of DNAME-record'; +$wb['data_error_duplicate'] = 'Duplicaat CNAME-record of DNAME-record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_a.lng b/interface/web/dns/lib/lang/pl_dns_a.lng index 59ef056e53..a200ae5cce 100644 --- a/interface/web/dns/lib/lang/pl_dns_a.lng +++ b/interface/web/dns/lib/lang/pl_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_aaaa.lng b/interface/web/dns/lib/lang/pl_dns_aaaa.lng index debb636d7e..7de382fcbd 100644 --- a/interface/web/dns/lib/lang/pl_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pl_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nie masz uprawnień, aby dodać nowy wpis w tej strefie D $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Adres IP jest pusty.'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Adres IP ma niepoprawny format.'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_cname.lng b/interface/web/dns/lib/lang/pl_dns_cname.lng index bee2839ae0..d4fb5ab8c8 100644 --- a/interface/web/dns/lib/lang/pl_dns_cname.lng +++ b/interface/web/dns/lib/lang/pl_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Docelowa nazwa serwera jest pusta.'; $wb['data_error_regex'] = 'Docelowa nazwa serwera ma niepoprawny format.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_dname.lng b/interface/web/dns/lib/lang/pl_dns_dname.lng index d4fb5ab8c8..a7e3ac50e4 100644 --- a/interface/web/dns/lib/lang/pl_dns_dname.lng +++ b/interface/web/dns/lib/lang/pl_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Nazwa serwera jest pusta.'; $wb['name_error_regex'] = 'Nazwa serwera ma niepoprawny format.'; $wb['data_error_empty'] = 'Docelowa nazwa serwera jest pusta.'; $wb['data_error_regex'] = 'Docelowa nazwa serwera ma niepoprawny format.'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_a.lng b/interface/web/dns/lib/lang/pt_dns_a.lng index 0051c476bc..336c4f477e 100644 --- a/interface/web/dns/lib/lang/pt_dns_a.lng +++ b/interface/web/dns/lib/lang/pt_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname em branco.'; $wb['name_error_regex'] = 'Hostname tem um formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; $wb['ip_error_wrong'] = 'Endereço-IP formato inválido'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_aaaa.lng b/interface/web/dns/lib/lang/pt_dns_aaaa.lng index 29da278ec4..045a818731 100644 --- a/interface/web/dns/lib/lang/pt_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/pt_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Não tem permissão para adicionar registos a está zona $wb['name_error_empty'] = 'O Hostname está em branco.'; $wb['name_error_regex'] = 'O Hostname está com formato inválido.'; $wb['data_error_empty'] = 'Endereço-IP em branco'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Endereço-IP com formato inválido'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_cname.lng b/interface/web/dns/lib/lang/pt_dns_cname.lng index 06782a96c4..124b9e3000 100644 --- a/interface/web/dns/lib/lang/pt_dns_cname.lng +++ b/interface/web/dns/lib/lang/pt_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname está em branco.'; $wb['name_error_regex'] = 'O hostname está em um formato inválido.'; $wb['data_error_empty'] = 'Hostname de destino está em branco'; $wb['data_error_regex'] = 'O hostname de destino está em um formato inválido.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_dname.lng b/interface/web/dns/lib/lang/pt_dns_dname.lng index 124b9e3000..aa8b13cc4e 100644 --- a/interface/web/dns/lib/lang/pt_dns_dname.lng +++ b/interface/web/dns/lib/lang/pt_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname está em branco.'; $wb['name_error_regex'] = 'O hostname está em um formato inválido.'; $wb['data_error_empty'] = 'Hostname de destino está em branco'; $wb['data_error_regex'] = 'O hostname de destino está em um formato inválido.'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_a.lng b/interface/web/dns/lib/lang/ro_dns_a.lng index 556dbea115..26f8a42f05 100644 --- a/interface/web/dns/lib/lang/ro_dns_a.lng +++ b/interface/web/dns/lib/lang/ro_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname necompletat'; $wb['name_error_regex'] = 'Hostname format gresit'; $wb['data_error_empty'] = 'IP-Adresa vid'; $wb['ip_error_wrong'] = 'IP-Adresa format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_aaaa.lng b/interface/web/dns/lib/lang/ro_dns_aaaa.lng index 03f18f18da..da7eeb8a0f 100644 --- a/interface/web/dns/lib/lang/ro_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ro_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_cname.lng b/interface/web/dns/lib/lang/ro_dns_cname.lng index f023134100..c76d2587a1 100644 --- a/interface/web/dns/lib/lang/ro_dns_cname.lng +++ b/interface/web/dns/lib/lang/ro_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Rubrica hostname necompletata'; $wb['name_error_regex'] = 'Hostname cu format gresit'; $wb['data_error_empty'] = 'Hostname tinta necompletat'; $wb['data_error_regex'] = 'Hostname tinta cu format gresit'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_dname.lng b/interface/web/dns/lib/lang/ro_dns_dname.lng index c76d2587a1..01c51d8605 100644 --- a/interface/web/dns/lib/lang/ro_dns_dname.lng +++ b/interface/web/dns/lib/lang/ro_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Rubrica hostname necompletata'; $wb['name_error_regex'] = 'Hostname cu format gresit'; $wb['data_error_empty'] = 'Hostname tinta necompletat'; $wb['data_error_regex'] = 'Hostname tinta cu format gresit'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_a.lng b/interface/web/dns/lib/lang/ru_dns_a.lng index 2a55aa4d64..5dd1329a1b 100644 --- a/interface/web/dns/lib/lang/ru_dns_a.lng +++ b/interface/web/dns/lib/lang/ru_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'IP-адрес пустой'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_aaaa.lng b/interface/web/dns/lib/lang/ru_dns_aaaa.lng index a1b63edf53..efec59952a 100644 --- a/interface/web/dns/lib/lang/ru_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/ru_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'У Вас нет прав добавлять эту за $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Неправильный формат имени хоста.'; $wb['data_error_empty'] = 'Пустой IP-адрес'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'Неправильный формат IP-адреса'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_cname.lng b/interface/web/dns/lib/lang/ru_dns_cname.lng index cb20700fe6..8fbddd6799 100644 --- a/interface/web/dns/lib/lang/ru_dns_cname.lng +++ b/interface/web/dns/lib/lang/ru_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'Целевое имя узла пустое'; $wb['data_error_regex'] = 'Целевое имя узла имеет неправильный формат'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_dname.lng b/interface/web/dns/lib/lang/ru_dns_dname.lng index 8fbddd6799..7e8da83b5b 100644 --- a/interface/web/dns/lib/lang/ru_dns_dname.lng +++ b/interface/web/dns/lib/lang/ru_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Имя пустое.'; $wb['name_error_regex'] = 'Имя узла имеет неправильный формат.'; $wb['data_error_empty'] = 'Целевое имя узла пустое'; $wb['data_error_regex'] = 'Целевое имя узла имеет неправильный формат'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Мин. время TTL 60 секунд.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_a.lng b/interface/web/dns/lib/lang/se_dns_a.lng index c191ff19d3..577bb47d5b 100644 --- a/interface/web/dns/lib/lang/se_dns_a.lng +++ b/interface/web/dns/lib/lang/se_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_aaaa.lng b/interface/web/dns/lib/lang/se_dns_aaaa.lng index 03f18f18da..da7eeb8a0f 100644 --- a/interface/web/dns/lib/lang/se_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/se_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'You do not have the permission to add a record to this DN $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'IP-Address empty'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-Address format invalid'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_cname.lng b/interface/web/dns/lib/lang/se_dns_cname.lng index 6530e927f6..0d42cac595 100644 --- a/interface/web/dns/lib/lang/se_dns_cname.lng +++ b/interface/web/dns/lib/lang/se_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_dname.lng b/interface/web/dns/lib/lang/se_dns_dname.lng index 0d42cac595..62088e09b6 100644 --- a/interface/web/dns/lib/lang/se_dns_dname.lng +++ b/interface/web/dns/lib/lang/se_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'The hostname is empty.'; $wb['name_error_regex'] = 'The hostname has the wrong format.'; $wb['data_error_empty'] = 'Target hostname empty'; $wb['data_error_regex'] = 'Target hostname format invalid'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_a.lng b/interface/web/dns/lib/lang/sk_dns_a.lng index 3f048c2857..9937576f58 100644 --- a/interface/web/dns/lib/lang/sk_dns_a.lng +++ b/interface/web/dns/lib/lang/sk_dns_a.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP Adresa je prázdna'; $wb['ip_error_wrong'] = 'IP Adresa má zlý formát.'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_aaaa.lng b/interface/web/dns/lib/lang/sk_dns_aaaa.lng index f719fe6bc2..2631d32515 100644 --- a/interface/web/dns/lib/lang/sk_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/sk_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Nemáte oprávnenie Pridať záznam do tejto zóny DNS.'; $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'IP-Adresa prázdna'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP-Adresa má zlý formát'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_cname.lng b/interface/web/dns/lib/lang/sk_dns_cname.lng index a6a8685c8f..c155285234 100644 --- a/interface/web/dns/lib/lang/sk_dns_cname.lng +++ b/interface/web/dns/lib/lang/sk_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'Cieľový hostname je prázdny'; $wb['data_error_regex'] = 'Target hostname má zlý format'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_dname.lng b/interface/web/dns/lib/lang/sk_dns_dname.lng index c155285234..88c3f069bd 100644 --- a/interface/web/dns/lib/lang/sk_dns_dname.lng +++ b/interface/web/dns/lib/lang/sk_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Hostname je prázdny.'; $wb['name_error_regex'] = 'Hostname má zlý formát.'; $wb['data_error_empty'] = 'Cieľový hostname je prázdny'; $wb['data_error_regex'] = 'Target hostname má zlý format'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_a.lng b/interface/web/dns/lib/lang/tr_dns_a.lng index 34eba9c0b5..bab67a4646 100644 --- a/interface/web/dns/lib/lang/tr_dns_a.lng +++ b/interface/web/dns/lib/lang/tr_dns_a.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adı biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate A or CNAME record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; $wb['ip_error_wrong'] = 'IP adresi biçimi geçersiz'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_aaaa.lng b/interface/web/dns/lib/lang/tr_dns_aaaa.lng index 80a4c64d51..8b31622d57 100644 --- a/interface/web/dns/lib/lang/tr_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/tr_dns_aaaa.lng @@ -11,7 +11,7 @@ $wb['no_zone_perm'] = 'Bu DNS bölgesine kayıt ekleme izniniz yok.'; $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adının biçimi geçersiz.'; $wb['data_error_empty'] = 'IP Adresi boş olamaz'; -$wb['data_error_duplicate'] = 'Duplicate AAAA, CNAME or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate AAAA or CNAME record'; $wb['ip_error_wrong'] = 'IP adresinin biçimi geçersiz'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_cname.lng b/interface/web/dns/lib/lang/tr_dns_cname.lng index 008e4962eb..cc8ce3005c 100644 --- a/interface/web/dns/lib/lang/tr_dns_cname.lng +++ b/interface/web/dns/lib/lang/tr_dns_cname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adı biçimi geçersiz.'; $wb['data_error_empty'] = 'Hedef sunucu adı boş olamaz'; $wb['data_error_regex'] = 'Hedef sunucu adı biçimi geçersiz'; -$wb['data_error_duplicate'] = 'Duplicate A, CNAME or DNAME Record'; +$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_dname.lng b/interface/web/dns/lib/lang/tr_dns_dname.lng index cc8ce3005c..8cd2b0a0aa 100644 --- a/interface/web/dns/lib/lang/tr_dns_dname.lng +++ b/interface/web/dns/lib/lang/tr_dns_dname.lng @@ -12,6 +12,6 @@ $wb['name_error_empty'] = 'Sunucu adı boş olamaz.'; $wb['name_error_regex'] = 'Sunucu adı biçimi geçersiz.'; $wb['data_error_empty'] = 'Hedef sunucu adı boş olamaz'; $wb['data_error_regex'] = 'Hedef sunucu adı biçimi geçersiz'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'Duplicate CNAME or DNAME record'; $wb['ttl_range_error'] = 'En düşük TTL süresi 60 saniyedir.'; ?> -- GitLab From 6105091c6a2fc22e3c40830dd67762f8beec4dac Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 16 Jun 2020 11:36:12 +0200 Subject: [PATCH 0239/1368] Clicking from search result alias/child domain failed to open, fixes #5607 --- interface/web/capp.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/capp.php b/interface/web/capp.php index 39392691f8..5d49fe80d7 100644 --- a/interface/web/capp.php +++ b/interface/web/capp.php @@ -43,7 +43,7 @@ if($_SESSION["s"]["user"]['active'] != 1) { } if(!preg_match("/^[a-z]{2,20}$/i", $mod)) die('module name contains unallowed chars.'); -if($redirect != '' && !preg_match("/^[a-z0-9]+\/[a-z0-9_\.\-]+\?id=[0-9]{1,9}$/i", $redirect)) die('redirect contains unallowed chars.'); +if($redirect != '' && !preg_match("/^[a-z0-9]+\/[a-z0-9_\.\-]+\?id=[0-9]{1,9}(\&type=[a-z0-9_\.\-]+)?$/i", $redirect)) die('redirect contains unallowed chars.'); //* Check if user may use the module. $user_modules = explode(",", $_SESSION["s"]["user"]["modules"]); -- GitLab From 1a94ce8f4fead3941d5c8bfc045b4344da972214 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 16 Jun 2020 15:52:58 +0200 Subject: [PATCH 0240/1368] Add auth_verbose = yes (#5642) --- install/tpl/debian6_dovecot2.conf.master | 6 +++--- install/tpl/debian_dovecot2.conf.master | 4 ++-- install/tpl/fedora_dovecot2.conf.master | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 6f32e6d5a2..a1810ab509 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -9,6 +9,7 @@ ssl_key = Date: Tue, 16 Jun 2020 16:58:48 +0200 Subject: [PATCH 0241/1368] Allow 63 char TLD (RFC 1034) --- interface/lib/classes/validate_cron.inc.php | 2 +- interface/lib/classes/validate_domain.inc.php | 50 +++++++++---------- .../web/admin/form/server_config.tform.php | 2 +- interface/web/client/form/domain.tform.php | 2 +- interface/web/dns/dns_wizard.php | 12 ++--- interface/web/dns/form/dns_slave.tform.php | 2 +- interface/web/dns/form/dns_soa.tform.php | 2 +- interface/web/mail/ajax_get_json.php | 4 +- .../mail/form/mail_domain_catchall.tform.php | 2 +- interface/web/mail/form/mail_user.tform.php | 8 +-- interface/web/mail/form/xmpp_domain.tform.php | 2 +- 11 files changed, 44 insertions(+), 44 deletions(-) diff --git a/interface/lib/classes/validate_cron.inc.php b/interface/lib/classes/validate_cron.inc.php index 9a2af80366..888fdd5cb7 100644 --- a/interface/lib/classes/validate_cron.inc.php +++ b/interface/lib/classes/validate_cron.inc.php @@ -52,7 +52,7 @@ class validate_cron { if($parsed["scheme"] != "http" && $parsed["scheme"] != "https") return $this->get_error($validator['errmsg']); - if(preg_match("'^([a-z0-9][a-z0-9_\-]{0,62}\.)+([A-Za-z0-9\-]{2,30})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']); + if(preg_match("'^([a-z0-9][a-z0-9_\-]{0,62}\.)+([A-Za-z0-9\-]{2,63})$'i", $parsed["host"]) == false) return $this->get_error($validator['errmsg']); } if(strpos($field_value, "\n") !== false || strpos($field_value, "\r") !== false || strpos($field_value, chr(0)) !== false) { return $this->get_error($validator['errmsg']); diff --git a/interface/lib/classes/validate_domain.inc.php b/interface/lib/classes/validate_domain.inc.php index 57187805cf..d8c87e09f1 100644 --- a/interface/lib/classes/validate_domain.inc.php +++ b/interface/lib/classes/validate_domain.inc.php @@ -51,7 +51,7 @@ class validate_domain { $result = $this->_check_unique($field_value); if(!$result) return $this->get_error('domain_error_unique'); - + $pattern = '/\.acme\.invalid$/'; if(preg_match($pattern, $field_value)) return $this->get_error('domain_error_acme_invalid'); } @@ -68,7 +68,7 @@ class validate_domain { $result = $this->_check_unique($field_value); if(!$result) return $this->get_error('domain_error_unique'); - + $pattern = '/\.acme\.invalid$/'; if(preg_match($pattern, $field_value)) return $this->get_error('domain_error_acme_invalid'); } @@ -83,7 +83,7 @@ class validate_domain { $result = $this->_check_unique($field_value); if(!$result) return $this->get_error('domain_error_unique'); - + $pattern = '/\.acme\.invalid$/'; if(preg_match($pattern, $field_value)) return $this->get_error('domain_error_acme_invalid'); } @@ -98,7 +98,7 @@ class validate_domain { } else { $check_domain = $_POST['domain']; } - + $app->uses('ini_parser,getconf'); $settings = $app->getconf->get_global_config('domains'); if ($settings['use_domain_module'] == 'y') { @@ -111,26 +111,26 @@ class validate_domain { $result = $this->_check_unique($field_value . '.' . $check_domain, true); if(!$result) return $this->get_error('domain_error_autosub'); } - + /* Check apache directives */ function web_apache_directives($field_name, $field_value, $validator) { global $app; - + if(trim($field_value) != '') { $security_config = $app->getconf->get_security_config('ids'); - + if($security_config['apache_directives_scan_enabled'] == 'yes') { - + // Get blacklist $blacklist_path = '/usr/local/ispconfig/security/apache_directives.blacklist'; if(is_file('/usr/local/ispconfig/security/apache_directives.blacklist.custom')) $blacklist_path = '/usr/local/ispconfig/security/apache_directives.blacklist.custom'; if(!is_file($blacklist_path)) $blacklist_path = realpath(ISPC_ROOT_PATH.'/../security/apache_directives.blacklist'); - + $directives = explode("\n",$field_value); $regex = explode("\n",file_get_contents($blacklist_path)); $blocked = false; $blocked_line = ''; - + if(is_array($directives) && is_array($regex)) { foreach($directives as $directive) { $directive = trim($directive); @@ -144,31 +144,31 @@ class validate_domain { } } } - + if($blocked === true) { return $this->get_error('apache_directive_blocked_error').' '.$blocked_line; } } - + /* Check nginx directives */ function web_nginx_directives($field_name, $field_value, $validator) { global $app; - + if(trim($field_value) != '') { $security_config = $app->getconf->get_security_config('ids'); - + if($security_config['nginx_directives_scan_enabled'] == 'yes') { - + // Get blacklist $blacklist_path = '/usr/local/ispconfig/security/nginx_directives.blacklist'; if(is_file('/usr/local/ispconfig/security/nginx_directives.blacklist.custom')) $blacklist_path = '/usr/local/ispconfig/security/nginx_directives.blacklist.custom'; if(!is_file($blacklist_path)) $blacklist_path = realpath(ISPC_ROOT_PATH.'/../security/nginx_directives.blacklist'); - + $directives = explode("\n",$field_value); $regex = explode("\n",file_get_contents($blacklist_path)); $blocked = false; $blocked_line = ''; - + if(is_array($directives) && is_array($regex)) { foreach($directives as $directive) { $directive = trim($directive); @@ -182,16 +182,16 @@ class validate_domain { } } } - + if($blocked === true) { return $this->get_error('nginx_directive_blocked_error').' '.$blocked_line; } } - + /* internal validator function to match regexp */ function _regex_validate($domain_name, $allow_wildcard = false) { - $pattern = '/^' . ($allow_wildcard == true ? '(\*\.)?' : '') . '[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,30}$/'; + $pattern = '/^' . ($allow_wildcard == true ? '(\*\.)?' : '') . '[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/'; return preg_match($pattern, $domain_name); } @@ -229,8 +229,8 @@ class validate_domain { $domain_params[] = $aliassubdomain['domain']; } } - - + + $qrystr = "SELECT d.domain_id, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ip_address, d.ip_address) as `ip_address`, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ipv6_address, d.ipv6_address) as `ipv6_address` FROM `web_domain` as d LEFT JOIN `web_domain` as p ON (p.domain_id = d.parent_domain_id) WHERE (d.domain = ?" . $additional_sql1 . ") AND d.server_id = ? AND d.domain_id != ?" . ($primary_id ? " AND d.parent_domain_id != ?" : ""); $params = array_merge(array($domain_name), $domain_params, array($domain['server_id'], $primary_id, $primary_id)); $checks = $app->db->queryAllRecords($qrystr, true, $params); @@ -242,7 +242,7 @@ class validate_domain { if($domain['ipv6_address'] != '' && $check['ipv6_address'] == $domain['ipv6_address']) return false; } } - + if($only_domain == false) { $qrystr = "SELECT d.domain_id, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ip_address, d.ip_address) as `ip_address`, IF(d.parent_domain_id != 0 AND p.domain_id IS NOT NULL, p.ipv6_address, d.ipv6_address) as `ipv6_address` FROM `web_domain` as d LEFT JOIN `web_domain` as p ON (p.domain_id = d.parent_domain_id) WHERE (CONCAT(d.subdomain, '.', d.domain) = ?" . $additional_sql2 . ") AND d.server_id = ? AND d.domain_id != ?" . ($primary_id ? " AND d.parent_domain_id != ?" : ""); $params = array_merge(array($domain_name), $domain_params, array($domain['server_id'], $primary_id, $primary_id)); @@ -256,7 +256,7 @@ class validate_domain { } } } - + return true; } @@ -274,6 +274,6 @@ class validate_domain { } return true; // admin may always add wildcard domain } - + } diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index f64ce30926..0d570f2e94 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -131,7 +131,7 @@ $form["tabs"]['server'] = array( 'validators' => array( 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'hostname_error_empty'), 1 => array ('type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'hostname_error_regex'), ), 'value' => '', diff --git a/interface/web/client/form/domain.tform.php b/interface/web/client/form/domain.tform.php index 2d3e1dbdd1..a3dc1aaac0 100644 --- a/interface/web/client/form/domain.tform.php +++ b/interface/web/client/form/domain.tform.php @@ -100,7 +100,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php index a02ee0a80f..91b2307dc5 100644 --- a/interface/web/dns/dns_wizard.php +++ b/interface/web/dns/dns_wizard.php @@ -220,10 +220,10 @@ if ($domains_settings['use_domain_module'] == 'y') { } if($_POST['create'] == 1) { - + //* CSRF Check $app->auth->csrf_token_check(); - + $error = ''; if ($post_server_id) @@ -277,17 +277,17 @@ if($_POST['create'] == 1) { if(isset($_POST['domain']) && $_POST['domain'] == '') $error .= $app->lng('error_domain_empty').'
'; - elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,30}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'
'; + elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'
'; if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'
'; if(isset($_POST['ipv6']) && $_POST['ipv6'] == '') $error .= $app->lng('error_ipv6_empty').'
'; if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'
'; - elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,30}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
'; + elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
'; if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'
'; - elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,30}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
'; + elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
'; if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'
'; elseif(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) $error .= $app->lng('error_email_regex').'
'; @@ -324,7 +324,7 @@ if($_POST['create'] == 1) { if($_POST['ns2'] != '') $tpl_content = str_replace('{NS2}', $_POST['ns2'], $tpl_content); if($_POST['email'] != '') $tpl_content = str_replace('{EMAIL}', $_POST['email'], $tpl_content); $enable_dnssec = (($_POST['dnssec'] == 'Y') ? 'Y' : 'N'); - if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/', $_POST['domain'])) { + if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $_POST['domain'])) { $sql = $app->db->queryOneRecord("SELECT dkim_public, dkim_selector FROM mail_domain WHERE domain = ? AND dkim = 'y' AND ".$app->tform->getAuthSQL('r'), $_POST['domain']); $public_key = $sql['dkim_public']; if ($public_key!='') { diff --git a/interface/web/dns/form/dns_slave.tform.php b/interface/web/dns/form/dns_slave.tform.php index 0b4457b700..55e085861a 100644 --- a/interface/web/dns/form/dns_slave.tform.php +++ b/interface/web/dns/form/dns_slave.tform.php @@ -96,7 +96,7 @@ $form["tabs"]['dns_slave'] = array ( 'errmsg'=> 'origin_error_unique'), */ 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', diff --git a/interface/web/dns/form/dns_soa.tform.php b/interface/web/dns/form/dns_soa.tform.php index e56211782a..cf0d143916 100644 --- a/interface/web/dns/form/dns_soa.tform.php +++ b/interface/web/dns/form/dns_soa.tform.php @@ -95,7 +95,7 @@ $form["tabs"]['dns_soa'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'origin_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,30}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/ajax_get_json.php b/interface/web/mail/ajax_get_json.php index 412958a315..dfc9dc220c 100644 --- a/interface/web/mail/ajax_get_json.php +++ b/interface/web/mail/ajax_get_json.php @@ -52,7 +52,7 @@ if($type == 'create_dkim' && $domain_id != ''){ $mail_config = $app->getconf->get_server_config($server_id, 'mail'); $dkim_strength = $app->functions->intval($mail_config['dkim_strength']); if ($dkim_strength=='') $dkim_strength = 2048; - + $rnd_val = $dkim_strength * 10; $app->system->exec_safe('openssl rand -out ../../temp/random-data.bin '.$rnd_val.' 2> /dev/null'); $app->system->exec_safe('openssl genrsa -rand ../../temp/random-data.bin '.$dkim_strength.' 2> /dev/null'); @@ -113,7 +113,7 @@ header('Content-type: application/json'); echo $json; function validate_domain($domain) { - $regex = '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/'; + $regex = '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/'; if ( preg_match($regex, $domain) === 1 ) return true; else return false; } diff --git a/interface/web/mail/form/mail_domain_catchall.tform.php b/interface/web/mail/form/mail_domain_catchall.tform.php index 34d26088cd..72261e05e0 100644 --- a/interface/web/mail/form/mail_domain_catchall.tform.php +++ b/interface/web/mail/form/mail_domain_catchall.tform.php @@ -86,7 +86,7 @@ $form["tabs"]['catchall'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z\-]{2,30}$/', + 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 83142f8a85..3d1a8fde7f 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -181,7 +181,7 @@ $form["tabs"]['mailuser'] = array( 'type' => 'TOLOWER') ), 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,}$/i', + 'regex' => '/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,63}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,63}){0,}$/i', 'errmsg'=> 'cc_error_isemail'), ), 'default' => '', @@ -200,7 +200,7 @@ $form["tabs"]['mailuser'] = array( 'type' => 'TOLOWER') ), 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex'=>'/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,10}){0,}$/i', + 'regex'=>'/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,63}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,63}){0,}$/i', 'errmsg'=> 'sender_cc_error_isemail'), ), 'default' => '', @@ -360,7 +360,7 @@ if ($global_config['mail']['mailbox_show_autoresponder_tab'] === 'y') { 'autoresponder_start_date' => array ( 'datatype' => 'DATETIME', 'formtype' => 'DATETIME', - 'validators'=> array ( + 'validators'=> array ( 0 => array ( 'type' => 'ISDATETIME', 'allowempty' => 'y', 'errmsg'=> 'autoresponder_start_date_is_no_date'), @@ -373,7 +373,7 @@ if ($global_config['mail']['mailbox_show_autoresponder_tab'] === 'y') { 'autoresponder_end_date' => array ( 'datatype' => 'DATETIME', 'formtype' => 'DATETIME', - 'validators'=> array ( + 'validators'=> array ( 0 => array ( 'type' => 'ISDATETIME', 'allowempty' => 'y', 'errmsg'=> 'autoresponder_end_date_is_no_date'), diff --git a/interface/web/mail/form/xmpp_domain.tform.php b/interface/web/mail/form/xmpp_domain.tform.php index bbe694f9fd..c703b0bea3 100644 --- a/interface/web/mail/form/xmpp_domain.tform.php +++ b/interface/web/mail/form/xmpp_domain.tform.php @@ -103,7 +103,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/', + 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', -- GitLab From 9cc2475105027089751830af8a006de80535c4d5 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 16 Jun 2020 17:05:50 +0200 Subject: [PATCH 0242/1368] Fix minor typo --- interface/web/mail/lib/lang/ar_mail_domain_catchall.lng | 2 +- interface/web/mail/lib/lang/en_mail_domain_catchall.lng | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/mail/lib/lang/ar_mail_domain_catchall.lng b/interface/web/mail/lib/lang/ar_mail_domain_catchall.lng index d1b54151d2..55cc10358e 100644 --- a/interface/web/mail/lib/lang/ar_mail_domain_catchall.lng +++ b/interface/web/mail/lib/lang/ar_mail_domain_catchall.lng @@ -4,7 +4,7 @@ $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['domain_error_unique'] = 'There is already a Catchall record for this domain.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['domain_error_regex'] = 'Invalid domain name od domain contains invalid characters.'; +$wb['domain_error_regex'] = 'Invalid domain name or domain contains invalid characters.'; $wb['limit_mailcatchall_txt'] = 'The max. number of email catchall accounts for your account is reached.'; $wb['source_txt'] = 'Source'; $wb['destination_error_isemail'] = 'Destination is no valid email address.'; diff --git a/interface/web/mail/lib/lang/en_mail_domain_catchall.lng b/interface/web/mail/lib/lang/en_mail_domain_catchall.lng index a49722802e..a8c294846e 100644 --- a/interface/web/mail/lib/lang/en_mail_domain_catchall.lng +++ b/interface/web/mail/lib/lang/en_mail_domain_catchall.lng @@ -4,7 +4,7 @@ $wb["destination_txt"] = 'Destination Email'; $wb["active_txt"] = 'Active'; $wb["domain_error_unique"] = "There is already a Catchall record for this domain."; $wb["no_domain_perm"] = "You have no permission for this domain."; -$wb["domain_error_regex"] = 'Invalid domain name od domain contains invalid characters.'; +$wb["domain_error_regex"] = 'Invalid domain name or domain contains invalid characters.'; $wb["limit_mailcatchall_txt"] = 'The max. number of email catchall accounts for your account is reached.'; $wb['domain_txt'] = 'Domain'; $wb["source_txt"] = 'Source'; -- GitLab From 8018a2741d6d4e3f04ca6cf4e00a42e5e286da35 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 16 Jun 2020 19:12:31 +0200 Subject: [PATCH 0243/1368] Update capp.php --- interface/web/capp.php | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/web/capp.php b/interface/web/capp.php index 5d49fe80d7..9fb615b0c1 100644 --- a/interface/web/capp.php +++ b/interface/web/capp.php @@ -33,6 +33,7 @@ require_once '../lib/app.inc.php'; //* Import module variable $mod = $_REQUEST["mod"]; + //* If we click on a search result, load that one instead of the module's start page $redirect = (isset($_REQUEST["redirect"]) ? $_REQUEST["redirect"] : ''); -- GitLab From 48af421d6a0f0aa70fe073e42781ace667aa722d Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 16 Jun 2020 21:13:41 +0200 Subject: [PATCH 0244/1368] Update capp.php --- interface/web/capp.php | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/web/capp.php b/interface/web/capp.php index 9fb615b0c1..5d49fe80d7 100644 --- a/interface/web/capp.php +++ b/interface/web/capp.php @@ -33,7 +33,6 @@ require_once '../lib/app.inc.php'; //* Import module variable $mod = $_REQUEST["mod"]; - //* If we click on a search result, load that one instead of the module's start page $redirect = (isset($_REQUEST["redirect"]) ? $_REQUEST["redirect"] : ''); -- GitLab From 9b91bf41bc75c98c654f8ea4280f586e3ce496f3 Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 17 Jun 2020 11:50:59 +0200 Subject: [PATCH 0245/1368] Fix wrong translation (#5647) --- interface/web/mail/lib/lang/de_spamfilter_blacklist.lng | 2 +- interface/web/mail/lib/lang/de_spamfilter_users.lng | 2 +- interface/web/mail/lib/lang/de_spamfilter_whitelist.lng | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng index 6c08e33c79..63205a5ec1 100644 --- a/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng +++ b/interface/web/mail/lib/lang/de_spamfilter_blacklist.lng @@ -6,7 +6,7 @@ $wb['email_txt'] = 'E-Mail Adresse'; $wb['priority_txt'] = 'Priorität'; $wb['active_txt'] = 'Aktiv'; $wb['limit_spamfilter_wblist_txt'] = 'Die maximale Anzahl an White- oder Blacklist Einträgen für ihr Konto wurde erreicht.'; -$wb['10 - highest'] = '10 - höchste'; +$wb['10 - highest'] = '10 - höchste'; $wb['5 - medium'] = '5 - normal'; $wb['1 - lowest'] = '1 - niedrigste'; ?> diff --git a/interface/web/mail/lib/lang/de_spamfilter_users.lng b/interface/web/mail/lib/lang/de_spamfilter_users.lng index 8528677c29..9322c80466 100644 --- a/interface/web/mail/lib/lang/de_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/de_spamfilter_users.lng @@ -7,7 +7,7 @@ $wb['fullname_txt'] = 'Name'; $wb['local_txt'] = 'Lokal'; $wb['email_error_notempty'] = 'Die E-Mail-Adresse darf nicht leer sein.'; $wb['fullname_error_notempty'] = 'Der Name darf nicht leer sein.'; -$wb['10 - highest'] = '10 - höchste'; +$wb['10 - highest'] = '10 - höchste'; $wb['5 - medium'] = '5 - normal'; $wb['1 - lowest'] = '1 - niedrigste'; ?> diff --git a/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng index 7a953fa6cb..fc6be5baed 100644 --- a/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng +++ b/interface/web/mail/lib/lang/de_spamfilter_whitelist.lng @@ -2,11 +2,11 @@ $wb['server_id_txt'] = 'Server'; $wb['wb_txt'] = 'wb'; $wb['rid_txt'] = 'Benutzer'; -$wb['email_txt'] = 'E-Mail'; +$wb['email_txt'] = 'E-Mail Adresse'; $wb['priority_txt'] = 'Priorität'; $wb['active_txt'] = 'Aktiv'; $wb['limit_spamfilter_wblist_txt'] = 'Die maximale Anzahl an White- oder Blacklist Einträgen für Ihr Konto wurde erreicht.'; -$wb['10 - highest'] = '10 - höchste'; +$wb['10 - highest'] = '10 - höchste'; $wb['5 - medium'] = '5 - normal'; $wb['1 - lowest'] = '1 - niedrigste'; ?> -- GitLab From 0ecbb3527e8552b5d4f2a12a013eeb0c582e0828 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 19 Jun 2020 11:20:21 +0200 Subject: [PATCH 0246/1368] Remove translation for SPDY/HTTP2 (#5646) --- interface/web/admin/lib/lang/ar_server_config.lng | 1 - interface/web/admin/lib/lang/bg_server_config.lng | 1 - interface/web/admin/lib/lang/br_server_config.lng | 1 - interface/web/admin/lib/lang/ca_server_config.lng | 1 - interface/web/admin/lib/lang/cz_server_config.lng | 1 - interface/web/admin/lib/lang/de_server_config.lng | 1 - interface/web/admin/lib/lang/dk_server_config.lng | 1 - interface/web/admin/lib/lang/el_server_config.lng | 1 - interface/web/admin/lib/lang/en_server_config.lng | 1 - interface/web/admin/lib/lang/es_server_config.lng | 1 - interface/web/admin/lib/lang/fi_server_config.lng | 1 - interface/web/admin/lib/lang/fr_server_config.lng | 1 - interface/web/admin/lib/lang/hr_server_config.lng | 1 - interface/web/admin/lib/lang/hu_server_config.lng | 1 - interface/web/admin/lib/lang/id_server_config.lng | 1 - interface/web/admin/lib/lang/it_server_config.lng | 1 - interface/web/admin/lib/lang/ja_server_config.lng | 1 - interface/web/admin/lib/lang/nl_server_config.lng | 1 - interface/web/admin/lib/lang/pl_server_config.lng | 1 - interface/web/admin/lib/lang/pt_server_config.lng | 1 - interface/web/admin/lib/lang/ro_server_config.lng | 1 - interface/web/admin/lib/lang/ru_server_config.lng | 1 - interface/web/admin/lib/lang/se_server_config.lng | 1 - interface/web/admin/lib/lang/sk_server_config.lng | 1 - interface/web/admin/lib/lang/tr_server_config.lng | 1 - interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/br_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/de_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/el_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/en_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/es_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/id_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/it_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/se_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 1 - 50 files changed, 50 deletions(-) diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index 0bcb361b14..e928d6e5ef 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index 1025e777d5..6f3ec99b4d 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index 977f55fbba..d6d266b3e0 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -275,7 +275,6 @@ $wb['network_filesystem_txt'] = 'Sistema de arquivos de rede'; $wb['php_ini_check_minutes_txt'] = 'Verificar alterações no php.ini a cada X minutos'; $wb['php_ini_check_minutes_error_empty'] = 'Por favor, insira um valor para verificação de alterações no php.ini.'; $wb['php_ini_check_minutes_info_txt'] = '0 = sem verificações'; -$wb['enable_spdy_txt'] = 'Tornar SPDY/HTTP2 disponível'; $wb['web_settings_txt'] = 'Servidor web'; $wb['xmpp_server_txt'] = 'Servidor xmpp'; $wb['xmpp_use_ipv6_txt'] = 'Usar IPv6'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 9103370404..7bca04abdc 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -270,7 +270,6 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index 64fbafa532..b165a5261a 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -267,7 +267,6 @@ $wb['disabled_txt'] = 'Vypnuto'; $wb['php_ini_check_minutes_txt'] = 'Provádět kontrolu změny obsahu souboru php.ini každých X minut'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Použít IPv6'; diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index 3c5e305522..046fff1a1f 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -273,7 +273,6 @@ $wb['php_ini_check_minutes_info_txt'] = '0 = keine Prüfung'; $wb['php_handler_txt'] = 'Standard-PHP-Handler'; $wb['php_fpm_default_chroot_txt'] = 'Default chrooted PHP-FPM'; $wb['php_fpm_incron_reload_txt'] = 'Install incron trigger file to reload PHP-FPM'; -$wb['enable_spdy_txt'] = 'Stellt SPDY/HTTP2 zur Verfügung'; $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['disabled_txt'] = 'Disabled'; diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index b3f2e2af2e..890b226a55 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -271,7 +271,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index 6c70a3b1fc..0af00d8426 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 63e9ced76c..5531a88158 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -275,7 +275,6 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index 8ae8b42454..9a16ecb5a8 100644 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -66,7 +66,6 @@ $wb['do_not_try_rescue_mongodb_txt'] = 'Deshabilitar monitorización de MongoDB' $wb['do_not_try_rescue_mysql_txt'] = 'Deshabilitar monitorización de MySQL'; $wb['enable_ip_wildcard_txt'] = 'Activar comodín IP (*)'; $wb['enable_sni_txt'] = 'Habilitar SNI'; -$wb['enable_spdy_txt'] = 'Hacer que SPDY/HTTP2 esté disponible'; $wb['fastcgi_alias_error_empty'] = 'El alias de FastCGI está vacío.'; $wb['fastcgi_alias_error_regex'] = 'El alias de fastcgi es inválido.'; $wb['fastcgi_alias_txt'] = 'Alias de FastCGI'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index 1a3f6b269b..e36832ebec 100644 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index cc57eb8f80..3a364fbaf3 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -270,7 +270,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index da67df4512..e6d484f34e 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index afb7ca1e67..588b61fcbe 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index b22dc5a4ab..8e5c2a8ad5 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index 90a2638668..df92b25d58 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -270,7 +270,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index e03f768c17..b65a305d86 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index 520e54c3b1..4c01f999b7 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index 1beac9944d..5d156faaf2 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index b09c498aa0..480433a96a 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index 7a7d3a052c..3602156437 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index 301b3ef496..8e8f661eb6 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'Стойкость DKIM'; $wb['php_ini_check_minutes_txt'] = 'Проверять изменения в PHP.ini файле каждые Х минут'; $wb['php_ini_check_minutes_error_empty'] = 'Пожалуйста, укажите значение, как часто php.ini должен быть проверен на изменения.'; $wb['php_ini_check_minutes_info_txt'] = '0 = не проверять'; -$wb['enable_spdy_txt'] = 'Сделать SPDY/HTTP2 доступным'; $wb['web_settings_txt'] = 'Web-сервер'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Использовать IPv6'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index e91b7e25cf..5d30941b7c 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index 6c6e5b2acf..db96f8f259 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index 6aede2732a..f6a127818a 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -274,7 +274,6 @@ $wb['network_filesystem_txt'] = 'Ağ Dosya Sistemi'; $wb['php_ini_check_minutes_txt'] = 'Her X dakikada php.ini dosyasındaki değişiklikler denetlensin'; $wb['php_ini_check_minutes_error_empty'] = 'php.ini dosyasındaki değişikliklerin kaç dakikada bir denetleneceğini yazın.'; $wb['php_ini_check_minutes_info_txt'] = '0 = denetim yapılmaz'; -$wb['enable_spdy_txt'] = 'SPDY/HTTP2 Kullanılsın'; $wb['web_settings_txt'] = 'Web Sunucu'; $wb['xmpp_server_txt'] = 'XMPP Sunucu'; $wb['xmpp_use_ipv6_txt'] = 'IPv6 Kullanılsın'; diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index f9c396616b..136829a7b2 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index 1ab6c244cc..8c48f035fe 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index a074b160a3..a3a14e335b 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -143,7 +143,6 @@ $wb['backup_excludes_error_regex'] = 'Os diretórios excluídos possuem caracter $wb['subdomain_error_empty'] = 'O subdomínio está em branco ou possui caracteres inválidos.'; $wb['btn_save_txt'] = 'Salvar'; $wb['btn_cancel_txt'] = 'Cancelar'; -$wb['enable_spdy_txt'] = 'Habilitar SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Carregar detalhes do cliente'; $wb['load_my_data_txt'] = 'Carregar detalhes do contato'; $wb['reset_client_data_txt'] = 'Limpar dados'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index d0a5a58bd3..cf25d81260 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index 250f98c890..ea814b0cb9 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -138,7 +138,6 @@ $wb['server_chosen_not_ok'] = 'Vybraný server není pro tento účet povolen.'; $wb['subdomain_error_empty'] = 'Pole subdomény je prázdné nebo obsahuje neplatné znaky.'; $wb['btn_save_txt'] = 'Uložit'; $wb['btn_cancel_txt'] = 'Zrušit'; -$wb['enable_spdy_txt'] = 'Povolit SPDY / HTTP2'; $wb['load_client_data_txt'] = 'Nahrát údaje z podrobností registrovaného klienta'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Obnovit údaje (resetovat)'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index e4424799a6..449bcb588a 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -138,7 +138,6 @@ $wb['host_txt'] = 'Host'; $wb['domain_error_wildcard'] = 'Wildcard-Subdomains sind nicht erlaubt.'; $wb['btn_save_txt'] = 'Speichern'; $wb['btn_cancel_txt'] = 'Abbrechen'; -$wb['enable_spdy_txt'] = 'Aktiviere SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Kundendaten übernehmen'; $wb['load_my_data_txt'] = 'Meine Kontaktdaten laden'; $wb['reset_client_data_txt'] = 'Daten verwerfen'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index d0a5a58bd3..cf25d81260 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index d4cb988a17..f39ce19a9b 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 66bfd1ca19..497fcd1993 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -143,7 +143,6 @@ $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid c $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = "Save"; $wb['btn_cancel_txt'] = "Cancel"; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 504bea2aa6..3f60826008 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -138,7 +138,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index 460fbadff7..82fd44a56a 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 306a48aedc..5d817c611b 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid c $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index d883532397..4d70565928 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index 4d54b0a4c7..d8bb15537b 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 3aa65982cd..39df360c89 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index cc890d855e..807039ca6c 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index bfb5e8b137..288b9fab11 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index d67cde421a..27371eee35 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Opslaan'; $wb['btn_cancel_txt'] = 'Annuleren'; -$wb['enable_spdy_txt'] = 'SPDY/HTTP2 inschakelen'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index c24c319fe5..f1e945df6f 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index dc6895c3e1..9eb927f000 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 8e27105a6a..0127c4ee80 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index c9a2a0a4ba..827f149dd8 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'Выбранный сервер запрещён $wb['subdomain_error_empty'] = 'Поле поддомена пуст или содержит недопустимые символы.'; $wb['btn_save_txt'] = 'Сохранить'; $wb['btn_cancel_txt'] = 'Отменить'; -$wb['enable_spdy_txt'] = 'Включить SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Загрузить информацию о клиенте'; $wb['load_my_data_txt'] = 'Загрузить мои контактные данные'; $wb['reset_client_data_txt'] = 'Сброс данных'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index ec509b333a..1bac2468c1 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 0509b1a3bb..c3b680b2b4 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 071df396e4..2e004d87ef 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -142,7 +142,6 @@ $wb['backup_excludes_error_regex'] = 'Katılmayacak klasörlerde geçersiz karak $wb['subdomain_error_empty'] = 'Alt etki alanı boş ya da geçersiz karakterler içeriyor.'; $wb['btn_save_txt'] = 'Kaydet'; $wb['btn_cancel_txt'] = 'İptal'; -$wb['enable_spdy_txt'] = 'SPDY kullanılsın'; $wb['load_client_data_txt'] = 'Müşteri Bilgilerini Yükle'; $wb['load_my_data_txt'] = 'Profil Bilgilerimi Yükle'; $wb['reset_client_data_txt'] = 'Verileri Sıfırla'; -- GitLab From 593d9826d84fd8ffb673ed12537172c10a5973cf Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 19 Jun 2020 11:51:16 +0200 Subject: [PATCH 0247/1368] Remove SPDY/HTTP2 optional function(#5646) --- .../sql/incremental/upd_dev_collection.sql | 3 +++ install/sql/ispconfig3.sql | 1 - install/tpl/apache_apps.vhost.master | 12 ++++----- install/tpl/server.ini.master | 1 - .../web/admin/form/server_config.tform.php | 9 ------- .../templates/server_config_web_edit.htm | 22 +++++----------- .../web/sites/form/web_vhost_domain.tform.php | 9 ------- .../sites/templates/web_vhost_domain_ssl.htm | 16 +++--------- interface/web/sites/web_vhost_domain_edit.php | 7 ----- server/conf/apache_apps.vhost.master | 14 +++------- server/conf/nginx_vhost.conf.master | 26 +++++++++---------- 11 files changed, 35 insertions(+), 85 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 8e924a62b0..e446b60c9f 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -35,3 +35,6 @@ ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET -- add SSHFP and DNAME record ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; + +-- remove SPDY option +ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index c54f0ac345..e0c3848aa5 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2070,7 +2070,6 @@ CREATE TABLE `web_domain` ( `traffic_quota_lock` enum('n','y') NOT NULL default 'n', `fastcgi_php_version` varchar(255) DEFAULT NULL, `proxy_directives` mediumtext, - `enable_spdy` ENUM('y','n') NULL DEFAULT 'n', `last_quota_notification` date NULL default NULL, `rewrite_rules` mediumtext, `added_date` date NULL DEFAULT NULL, diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 9cccf8d38e..a21f5394b0 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -10,15 +10,15 @@ ServerAdmin webmaster@localhost {tmpl_var name='apps_vhost_servername'} - + SetHandler None - + RequestHeader unset Proxy early - + {tmpl_if name="enable_spdy" op="==" value="y"} SpdyEnabled on @@ -39,7 +39,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -54,7 +54,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps @@ -87,5 +87,3 @@ - - diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 5edc09807c..c500fb0cc2 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -94,7 +94,6 @@ php_ini_path_apache=/etc/php5/apache2/php.ini php_ini_path_cgi=/etc/php5/cgi/php.ini check_apache_config=y enable_sni=y -enable_spdy=n skip_le_check=n enable_ip_wildcard=y overtraffic_notify_admin=y diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 0d570f2e94..de2caf1750 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -1317,15 +1317,6 @@ $form["tabs"]['web'] = array( 'width' => '40', 'maxlength' => '255' ), - 'enable_spdy' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'y', - 'value' => array ( - 0 => 'n', - 1 => 'y' - ) - ), 'apps_vhost_enabled' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index f5f38affe7..64173549c9 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -163,7 +163,7 @@
- {tmpl_var name='overquota_db_notify_client'} + {tmpl_var name='overquota_db_notify_client'}
@@ -197,14 +197,6 @@ {tmpl_var name='enable_sni'}
-
- -
- -
-
@@ -257,7 +249,7 @@
- +
@@ -361,7 +353,7 @@
- +
@@ -389,15 +381,15 @@
- + - + - +
@@ -410,7 +402,7 @@ serverType = $(this).val(); adjustForm(); }); - + function adjustForm(){ if(serverType == "nginx"){ jQuery('.nginx').show(); diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index beb952bfe6..7da71281cf 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -591,15 +591,6 @@ if($ssl_available) { 'default' => '', 'value' => array('' => 'none_txt', 'save' => 'save_certificate_txt', 'create' => 'create_certificate_txt', 'del' => 'delete_certificate_txt') ), - 'enable_spdy' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'n', - 'value' => array ( - 0 => 'n', - 1 => 'y' - ) - ), //################################# // END Datatable fields //################################# diff --git a/interface/web/sites/templates/web_vhost_domain_ssl.htm b/interface/web/sites/templates/web_vhost_domain_ssl.htm index 8b3d986a02..d4ec6749e2 100644 --- a/interface/web/sites/templates/web_vhost_domain_ssl.htm +++ b/interface/web/sites/templates/web_vhost_domain_ssl.htm @@ -62,15 +62,7 @@ {tmpl_var name='ssl_action'}
- {tmpl_if name="is_spdy_enabled"} -
- -
- {tmpl_var name="enable_spdy"} -
-
- {/tmpl_if} - + @@ -91,11 +83,11 @@ $('#load_data').click(function(){ loadClientData(); }); - - + + function loadClientData() { var web_id = $("input[name=id]").val(); - + jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {'web_id': web_id, 'type': "getclientssldata"}, function(data) { $('#ssl_organisation').val(data['company_name']); $('#ssl_locality').val(data['city']); diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 82da18ae1e..0d770476d1 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -840,7 +840,6 @@ class page_action extends tform_actions { $app->tpl->setVar('vhostdomain_type', $this->_vhostdomain_type, true); - $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'] === 'y')); $app->tpl->setVar("is_admin", $is_admin); @@ -950,10 +949,8 @@ class page_action extends tform_actions { } $app->tpl->setLoop('folder_directive_snippets', $folder_directive_snippets); if(is_array($web_config[$server_id])) { - $app->tpl->setVar('is_spdy_enabled', ($web_config[$server_id]['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config[$server_id]['nginx_enable_pagespeed'])); } else { - $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'])); } @@ -1325,10 +1322,6 @@ class page_action extends tform_actions { $app->tform->errorMessage .= $app->tform->lng("invalid_custom_php_ini_settings_txt").'
'; } } - - if($web_config['enable_spdy'] === 'n') { - unset($app->tform->formDef["tabs"]['ssl']['fields']['enable_spdy']); - } // if($this->dataRecord["directive_snippets_id"] < 1) $this->dataRecord["enable_pagespeed"] = 'n'; //print_r($_POST['folder_directive_snippets']); diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index 94982a6dc1..fe73487fa0 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -14,17 +14,11 @@ SetHandler None - + RequestHeader unset Proxy early - {tmpl_if name="enable_spdy" op="==" value="y"} - - SpdyEnabled on - - {/tmpl_if} - DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -39,7 +33,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -54,7 +48,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps @@ -85,5 +79,3 @@ {/tmpl_if} - - diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index 978139174f..967a65ccd2 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -30,11 +30,11 @@ server { ssl_certificate ; ssl_certificate_key ; - + server_name ; root ; - + if ($scheme != "https") { @@ -72,16 +72,16 @@ server { } - + index index.html index.htm index.php index.cgi index.pl index.xhtml; - - + + location ~ \.shtml$ { ssi on; } - + error_page 400 /error/400.html; error_page 401 /error/401.html; error_page 403 /error/403.html; @@ -124,7 +124,7 @@ server { internal; } - + error_log /var/log/ispconfig/httpd//error.log; access_log /var/log/ispconfig/httpd//access.log combined; @@ -149,7 +149,7 @@ server { index index.html; try_files $uri $uri/ =404; } - + location = /favicon.ico { log_not_found off; access_log off; @@ -162,7 +162,7 @@ server { log_not_found off; access_log off; } - + location /stats/ { index index.html index.php; @@ -325,13 +325,13 @@ server { location { ##merge## auth_basic "Members Only"; auth_basic_user_file .htpasswd; - + location ~ \.php$ { try_files @php; } } - + } @@ -340,7 +340,7 @@ server { listen []:80; - + listen :443 ssl; @@ -349,7 +349,7 @@ server { ssl_certificate ; ssl_certificate_key ; - + server_name ; -- GitLab From 9c1386e164056fa4c8c9d68345bdaff821ee1fa7 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 19 Jun 2020 17:31:13 +0200 Subject: [PATCH 0248/1368] Use nofail instead of deprecated nobootwait (#5131) --- server/plugins-available/apache2_plugin.inc.php | 2 +- server/plugins-available/nginx_plugin.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 06b2afce9a..5f697d060e 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -778,7 +778,7 @@ class apache2_plugin { $app->system->chmod($data['new']['document_root'].'/'.$log_folder, 0755); $app->system->exec_safe('mount --bind ? ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'], $data['new']['document_root'].'/'.$log_folder); //* add mountpoint to fstab - $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait'; + $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail'; $fstab_line .= @($web_config['network_filesystem'] == 'y')?',_netdev 0 0':' 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line, $fstab_line, 1, 1); } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 68e295a97a..89ac35734d 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -619,7 +619,7 @@ class nginx_plugin { $app->system->chmod($data['new']['document_root'].'/'.$log_folder, 0755); $app->system->exec_safe('mount --bind ? ?', '/var/log/ispconfig/httpd/'.$data['new']['domain'], $data['new']['document_root'].'/'.$log_folder); //* add mountpoint to fstab - $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nobootwait'; + $fstab_line = '/var/log/ispconfig/httpd/'.$data['new']['domain'].' '.$data['new']['document_root'].'/'.$log_folder.' none bind,nofail'; $fstab_line .= @($web_config['network_filesystem'] == 'y')?',_netdev 0 0':' 0 0'; $app->system->replaceLine('/etc/fstab', $fstab_line, $fstab_line, 1, 1); } -- GitLab From cb1342c8f338e7633be68485908058c0798fb968 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Fri, 19 Jun 2020 20:37:27 +0200 Subject: [PATCH 0249/1368] Update ru_system_config.lng --- interface/web/admin/lib/lang/ru_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/ru_system_config.lng b/interface/web/admin/lib/lang/ru_system_config.lng index baed497b0e..b5ef1fba74 100644 --- a/interface/web/admin/lib/lang/ru_system_config.lng +++ b/interface/web/admin/lib/lang/ru_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Web-сервер по умолчанию'; $wb['default_dnsserver_txt'] = 'DNS-сервер по умолчанию'; $wb['default_slave_dnsserver_txt'] = 'Вторичный DNS-сервер по умолчанию'; $wb['default_dbserver_txt'] = 'Сервер базы данных по умолчанию'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 3381004ce49faf48d0c67187c336cf82ab654444 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Fri, 19 Jun 2020 20:37:42 +0200 Subject: [PATCH 0250/1368] Update sk_system_config.lng --- interface/web/admin/lib/lang/sk_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/sk_system_config.lng b/interface/web/admin/lib/lang/sk_system_config.lng index 90418e87d5..a8de64e7d0 100644 --- a/interface/web/admin/lib/lang/sk_system_config.lng +++ b/interface/web/admin/lib/lang/sk_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 30f00bd12977380bfac62ff11e4456fb312ccf8a Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Fri, 19 Jun 2020 20:37:52 +0200 Subject: [PATCH 0251/1368] Update ro_system_config.lng --- interface/web/admin/lib/lang/ro_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/ro_system_config.lng b/interface/web/admin/lib/lang/ro_system_config.lng index 2a39a454e8..9740c7e290 100644 --- a/interface/web/admin/lib/lang/ro_system_config.lng +++ b/interface/web/admin/lib/lang/ro_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From 60b1864288f918c89cc1cc210ddc7ab8a22b4059 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Fri, 19 Jun 2020 20:38:01 +0200 Subject: [PATCH 0252/1368] Update pl_system_config.lng --- interface/web/admin/lib/lang/pl_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/pl_system_config.lng b/interface/web/admin/lib/lang/pl_system_config.lng index a809251ec1..78abd19c38 100644 --- a/interface/web/admin/lib/lang/pl_system_config.lng +++ b/interface/web/admin/lib/lang/pl_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From e5c401a21d7bdd6e675b2c4152437b3c5ea2be70 Mon Sep 17 00:00:00 2001 From: Massimiliano Date: Fri, 19 Jun 2020 20:38:15 +0200 Subject: [PATCH 0253/1368] Update pt_system_config.lng --- interface/web/admin/lib/lang/pt_system_config.lng | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/admin/lib/lang/pt_system_config.lng b/interface/web/admin/lib/lang/pt_system_config.lng index 6fc26344c0..f5688291d8 100644 --- a/interface/web/admin/lib/lang/pt_system_config.lng +++ b/interface/web/admin/lib/lang/pt_system_config.lng @@ -81,6 +81,8 @@ $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; +$wb["default_remote_dbserver_txt"] = "Default DB Remote servers"; +$wb["disable_client_remote_dbserver_txt"] = "Disable DB Remote sections for Clients"; $wb['ca_name_txt'] = 'Name'; $wb['ca_issue_txt'] = 'Issue'; $wb['ca_wildcard_txt'] = 'Use Wildcard'; -- GitLab From a9f328202240adaaf36d7c3c4045ea1b13cc7909 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 22 Jun 2020 23:10:07 +0200 Subject: [PATCH 0254/1368] Remove SPDY (#5646) --- server/conf/nginx_vhost.conf.master | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index 967a65ccd2..24277f0485 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -12,7 +12,7 @@ server { listen [::]:; - listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}; listen : ssl proxy_protocol; @@ -22,10 +22,10 @@ server { # ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # ssl_prefer_server_ciphers on; - listen []: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen []: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}; - listen [::]: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen [::]: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}; ssl_certificate ; ssl_certificate_key ; -- GitLab From a40360dc53b325f4678b37d59e093133cc85563e Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 22 Jun 2020 23:23:58 +0200 Subject: [PATCH 0255/1368] Remove SPDY (#5646) --- install/tpl/apache_apps.vhost.master | 6 ------ 1 file changed, 6 deletions(-) diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index a21f5394b0..14f0f10da2 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -19,12 +19,6 @@ RequestHeader unset Proxy early - {tmpl_if name="enable_spdy" op="==" value="y"} - - SpdyEnabled on - - {/tmpl_if} - DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php -- GitLab From 07301fcf19718c6bbc52b61778c289815aa5a407 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 22 Jun 2020 23:42:55 +0200 Subject: [PATCH 0256/1368] Always enable HTTP2 if available (#5646) --- server/conf/nginx_vhost.conf.master | 6 +++--- server/conf/vhost.conf.master | 8 +++----- server/plugins-available/apache2_plugin.inc.php | 11 ----------- server/plugins-available/nginx_plugin.inc.php | 12 ------------ 4 files changed, 6 insertions(+), 31 deletions(-) diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index 24277f0485..ce245787a5 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -12,7 +12,7 @@ server { listen [::]:; - listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}; + listen : ssl http2; listen : ssl proxy_protocol; @@ -22,10 +22,10 @@ server { # ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # ssl_prefer_server_ciphers on; - listen []: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}; + listen []: ssl http2; - listen [::]: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}; + listen [::]: ssl http2; ssl_certificate ; ssl_certificate_key ; diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 0612c13f7f..1857499299 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -50,12 +50,10 @@ ServerAdmin webmaster@ - Protocols h2 http/1.1 SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite 'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS' - ErrorLog "|/usr/local/ispconfig/server/scripts/vlogger -e -n -P -t \"error.log\" /var/log/ispconfig/httpd/" @@ -387,7 +385,7 @@ Action php-fcgi /php-fcgi virtual Alias /php-fcgi {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} - FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type + FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -socket -pass-header Authorization -pass-header Content-Type @@ -513,9 +511,9 @@ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^ - + RewriteRule ^/(.*)$ $1 - + diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 06b2afce9a..9a1f72f8b3 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1235,17 +1235,6 @@ class apache2_plugin { // Use separate bundle file only for apache versions < 2.4.8 if(@is_file($bundle_file) && version_compare($app->system->getapacheversion(true), '2.4.8', '<')) $vhost_data['has_bundle_cert'] = 1; - // HTTP/2.0 ? - $vhost_data['enable_http2'] = 'n'; - if($vhost_data['enable_spdy'] == 'y'){ - // check if apache supports http_v2 - exec("2>&1 apachectl -M | grep http2_module", $tmp_output, $tmp_retval); - if($tmp_retval == 0){ - $vhost_data['enable_http2'] = 'y'; - } - unset($tmp_output, $tmp_retval); - } - // Set SEO Redirect if($data['new']['seo_redirect'] != ''){ $vhost_data['seo_redirect_enabled'] = 1; diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 68e295a97a..c2a2805701 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1517,18 +1517,6 @@ class nginx_plugin { } } - // http2 or spdy? - $vhost_data['enable_http2'] = 'n'; - if($vhost_data['enable_spdy'] == 'y'){ - // check if nginx support http_v2; if so, use that instead of spdy - exec("2>&1 nginx -V | tr -- - '\n' | grep http_v2_module", $tmp_output, $tmp_retval); - if($tmp_retval == 0){ - $vhost_data['enable_http2'] = 'y'; - $vhost_data['enable_spdy'] = 'n'; - } - unset($tmp_output, $tmp_retval); - } - //proxy protocol settings if($web_config['vhost_proxy_protocol_enabled'] == "y"){ if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { -- GitLab From 7f7d1d27df8c4010b4d2038a606d26167fcae6c9 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 25 Jun 2020 16:40:07 +0200 Subject: [PATCH 0257/1368] Disable FAQ edit functionality in demo mode. --- interface/web/help/faq_delete.php | 3 +++ interface/web/help/faq_edit.php | 3 +++ interface/web/help/faq_sections_delete.php | 3 +++ interface/web/help/faq_sections_edit.php | 3 +++ server/lib/classes/monitor_tools.inc.php | 4 ++++ 5 files changed, 16 insertions(+) diff --git a/interface/web/help/faq_delete.php b/interface/web/help/faq_delete.php index c1faed60d9..161b1ce45b 100644 --- a/interface/web/help/faq_delete.php +++ b/interface/web/help/faq_delete.php @@ -11,6 +11,9 @@ require_once '../../lib/app.inc.php'; // Check module permissions $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the form $app->uses('tform_actions'); $app->tform_actions->onDelete(); diff --git a/interface/web/help/faq_edit.php b/interface/web/help/faq_edit.php index 397f5cccf4..e0f0380f8c 100644 --- a/interface/web/help/faq_edit.php +++ b/interface/web/help/faq_edit.php @@ -10,6 +10,9 @@ require_once '../../lib/app.inc.php'; // Check the module permissions and redirect if not allowed. $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the templating and form classes $app->uses('tpl,tform,tform_actions'); $app->load('tform_actions'); diff --git a/interface/web/help/faq_sections_delete.php b/interface/web/help/faq_sections_delete.php index 865071ff25..76ff1c75a1 100644 --- a/interface/web/help/faq_sections_delete.php +++ b/interface/web/help/faq_sections_delete.php @@ -11,6 +11,9 @@ require_once '../../lib/app.inc.php'; // Check module permissions $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the form $app->uses('tform_actions'); $app->tform_actions->onDelete(); diff --git a/interface/web/help/faq_sections_edit.php b/interface/web/help/faq_sections_edit.php index f146db8605..56b3c77487 100644 --- a/interface/web/help/faq_sections_edit.php +++ b/interface/web/help/faq_sections_edit.php @@ -10,6 +10,9 @@ require_once '../../lib/app.inc.php'; // Check the module permissions and redirect if not allowed. $app->auth->check_module_permissions('admin'); +// Do not allow FAQ editor in DEMO mode +if($conf['demo_mode'] == true) $app->error('This function is disabled in demo mode.'); + // Load the templating and form classes $app->uses('tpl,tform,tform_actions'); $app->load('tform_actions'); diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index aba19df7a4..75e75c7f30 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -87,6 +87,10 @@ class monitor_tools { $mainver = $ver; } switch ($mainver){ + case "20.04": + $relname = "(Focal Fossa)"; + $distconfid = 'ubuntu2004'; + break; case "18.04": $relname = "(Bionic Beaver)"; $distconfid = 'ubuntu1804'; -- GitLab From 0a1340a853b730c814edbb9c319cab718bd83fc2 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 25 Jun 2020 16:41:49 +0200 Subject: [PATCH 0258/1368] Implemented #5650 Add support for Ubuntu 20.04 --- install/dist/conf/ubuntu2004.conf.php | 235 ++++++++++++++++++++++++++ install/lib/install.lib.php | 6 +- 2 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 install/dist/conf/ubuntu2004.conf.php diff --git a/install/dist/conf/ubuntu2004.conf.php b/install/dist/conf/ubuntu2004.conf.php new file mode 100644 index 0000000000..fe5a9b083b --- /dev/null +++ b/install/dist/conf/ubuntu2004.conf.php @@ -0,0 +1,235 @@ + diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index ea4e563a6a..4aa4d196c7 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -95,6 +95,10 @@ function get_distname() { $mainver = current($mainver).'.'.next($mainver); } switch ($mainver){ + case "20.04": + $relname = "(Focal Fossa)"; + $distconfid = 'ubuntu2004'; + break; case "18.04": $relname = "(Bionic Beaver)"; $distconfid = 'ubuntu1804'; @@ -186,7 +190,7 @@ function get_distname() { break; default: $relname = "UNKNOWN"; - $distconfid = 'ubuntu1804'; + $distconfid = 'ubuntu2004'; } $distver = $ver.$lts." ".$relname; swriteln("Operating System: ".$distname.' '.$distver."\n"); -- GitLab From b7e017a5022000579b8c88222fd39498890dc40c Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 25 Jun 2020 19:24:29 +0200 Subject: [PATCH 0259/1368] Implemented #5651 Make ISPConfig code base compatible with PHP 7.4 --- install/lib/install.lib.php | 3 +- install/lib/installer_base.lib.php | 6 +- install/lib/mysql.lib.php | 11 +- interface/lib/classes/cmstree.inc.php | 117 ------------------ interface/lib/classes/db_mysql.inc.php | 9 +- interface/lib/classes/simplepie.inc.php | 46 +++---- interface/lib/classes/system.inc.php | 3 +- .../mailuser/mail_user_autoresponder_edit.php | 6 + interface/web/remote/monitor.php | 69 +---------- server/lib/classes/db_mysql.inc.php | 8 +- server/lib/classes/file.inc.php | 20 --- server/lib/classes/system.inc.php | 2 +- 12 files changed, 56 insertions(+), 244 deletions(-) delete mode 100644 interface/lib/classes/cmstree.inc.php diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 4aa4d196c7..9312a8981a 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -691,8 +691,7 @@ function ini_to_array($ini) { //* Converts a config array to a string -function array_to_ini($config_array = '') { - if($config_array == '') $config_array = $this->config; +function array_to_ini($config_array) { $content = ''; foreach($config_array as $section => $data) { $content .= "[$section]\n"; diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 5ca16cc674..bc9ed26e18 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3228,6 +3228,9 @@ class installer_base { * @return bool */ protected function write_config_file($tConf, $tContents) { + + $args = func_get_args(); + // Backup config file before writing new contents and stat file if ( is_file($tConf) ) { $stat = exec('stat -c \'%a %U %G\' '.escapeshellarg($tConf), $output, $res); @@ -3241,10 +3244,9 @@ class installer_base { } wf($tConf, $tContents); // write file - if (func_num_args() >= 4) // override rights and/or ownership { - $args = func_get_args(); + $output = array_slice($args, 2); switch (sizeof($output)) { diff --git a/install/lib/mysql.lib.php b/install/lib/mysql.lib.php index 2528100cc5..3e091d10b8 100644 --- a/install/lib/mysql.lib.php +++ b/install/lib/mysql.lib.php @@ -192,6 +192,8 @@ class db } private function _query($sQuery = '') { + + $aArgs = func_get_args(); $this->do_connect(); if ($sQuery == '') { @@ -227,7 +229,6 @@ class db } } while($ok == false); - $aArgs = func_get_args(); $sQuery = call_user_func_array(array(&$this, '_build_query_string'), $aArgs); $this->_iQueryId = mysqli_query($this->_iConnId, $sQuery); @@ -283,9 +284,11 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { - if(!preg_match('/limit \d+\s*,\s*\d+$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; - + $aArgs = func_get_args(); + + if(!preg_match('/limit \d+\s*,\s*\d+$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; + $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); if(!$oResult) return null; @@ -956,7 +959,7 @@ class fakedb_result { if(!is_array($this->aLimitedData)) return $aItem; - if(list($vKey, $aItem) = each($this->aLimitedData)) { + foreach($this->aLimitedData as $vKey => $aItem) { if(!$aItem) $aItem = null; } return $aItem; diff --git a/interface/lib/classes/cmstree.inc.php b/interface/lib/classes/cmstree.inc.php deleted file mode 100644 index ead780ebf2..0000000000 --- a/interface/lib/classes/cmstree.inc.php +++ /dev/null @@ -1,117 +0,0 @@ -db->queryAllRecords('SELECT * FROM media_cat order by sort, name'); - - $optionlist = array(); - $my0 = new nodetree(); - - foreach($nodes as $row) { - - $id = 'my'.$row['media_cat_id']; - $btext = $row['name']; - $ordner = 'my'.$row['parent']; - if(!is_object($$id)) $$id = new nodetree(); - $$id->btext = $btext; - $$id->id = $row['media_cat_id']; - - if(is_object($$ordner)) { - $$ordner->childs[] = &$$id; - } else { - $$ordner = new nodetree(); - $$ordner->childs[] = &$$id; - } - } - - $this->ptree($my0, 0, $optionlist); - return is_array($nodes) ? $optionlist : false; - } - - private function ptree($myobj, $tiefe, &$optionlist){ - global $_SESSION; - $tiefe += 1; - $id = $myobj->id; - - if(is_array($myobj->childs) and ($_SESSION['s']['cat_open'][$id] == 1 or $tiefe <= 1)) { - foreach($myobj->childs as $val) { - // kategorie => str_repeat('-  ',$tiefe) . $val->btext, - - // Ergebnisse Formatieren - /* - if($tiefe == 0) { - $kategorie = ""; - } elseif ($tiefe == 1) { - $kategorie = ""; - } else { - $kategorie = ""; - } - */ - $val_id = $val->id; - if($_SESSION['s']['cat_open'][$val_id] == 1) { - $kategorie = ""; - } else { - $kategorie = ""; - } - - $optionlist[] = array( media_cat => $kategorie, - media_cat_id => $val->id, - depth => $tiefe); - $this->ptree($val, $tiefe, $optionlist); - } - } - } - -} -?> diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php index 9c7269e568..5348e41708 100644 --- a/interface/lib/classes/db_mysql.inc.php +++ b/interface/lib/classes/db_mysql.inc.php @@ -258,6 +258,8 @@ class db private function _query($sQuery = '') { global $app; + + $aArgs = func_get_args(); if ($sQuery == '') { $this->_sqlerror('Keine Anfrage angegeben / No query given'); @@ -297,7 +299,6 @@ class db } } while($ok == false); - $aArgs = func_get_args(); $sQuery = call_user_func_array(array(&$this, '_build_query_string'), $aArgs); $this->securityScan($sQuery); $this->_iQueryId = mysqli_query($this->_iConnId, $sQuery); @@ -353,9 +354,11 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { + + $aArgs = func_get_args(); + if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; - $aArgs = func_get_args(); $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); if(!$oResult) return null; @@ -1300,7 +1303,7 @@ class fakedb_result { if(!is_array($this->aLimitedData)) return $aItem; - if(list($vKey, $aItem) = each($this->aLimitedData)) { + foreach($this->aLimitedData as $vKey => $aItem) { if(!$aItem) $aItem = null; } return $aItem; diff --git a/interface/lib/classes/simplepie.inc.php b/interface/lib/classes/simplepie.inc.php index 626e801e42..a2b80ed25b 100644 --- a/interface/lib/classes/simplepie.inc.php +++ b/interface/lib/classes/simplepie.inc.php @@ -735,7 +735,7 @@ class simplepie * @param string $cache_location This is where you want the cache to be stored. * @param int $cache_duration This is the number of seconds that you want to store the cache file for. */ - function SimplePie($feed_url = null, $cache_location = null, $cache_duration = null) + function __construct($feed_url = null, $cache_location = null, $cache_duration = null) { // Other objects, instances created here so we can set options on them $this->sanitize = new SimplePie_Sanitize; @@ -3165,7 +3165,7 @@ class SimplePie_Item var $feed; var $data = array(); - function SimplePie_Item($feed, $data) + function __construct($feed, $data) { $this->feed = $feed; $this->data = $data; @@ -5789,7 +5789,7 @@ class SimplePie_Source var $item; var $data = array(); - function SimplePie_Source($item, $data) + function __construct($item, $data) { $this->item = $item; $this->data = $data; @@ -6344,7 +6344,7 @@ class SimplePie_Author var $email; // Constructor, used to input the data - function SimplePie_Author($name = null, $link = null, $email = null) + function __construct($name = null, $link = null, $email = null) { $this->name = $name; $this->link = $link; @@ -6402,7 +6402,7 @@ class SimplePie_Category var $label; // Constructor, used to input the data - function SimplePie_Category($term = null, $scheme = null, $label = null) + function __construct($term = null, $scheme = null, $label = null) { $this->term = $term; $this->scheme = $scheme; @@ -6484,7 +6484,7 @@ class SimplePie_Enclosure var $width; // Constructor, used to input the data - function SimplePie_Enclosure($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) + function __construct($link = null, $type = null, $length = null, $javascript = null, $bitrate = null, $captions = null, $categories = null, $channels = null, $copyright = null, $credits = null, $description = null, $duration = null, $expression = null, $framerate = null, $hashes = null, $height = null, $keywords = null, $lang = null, $medium = null, $player = null, $ratings = null, $restrictions = null, $samplingrate = null, $thumbnails = null, $title = null, $width = null) { $this->bitrate = $bitrate; $this->captions = $captions; @@ -7419,7 +7419,7 @@ class SimplePie_Caption var $text; // Constructor, used to input the data - function SimplePie_Caption($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) + function __construct($type = null, $lang = null, $startTime = null, $endTime = null, $text = null) { $this->type = $type; $this->lang = $lang; @@ -7503,7 +7503,7 @@ class SimplePie_Credit var $name; // Constructor, used to input the data - function SimplePie_Credit($role = null, $scheme = null, $name = null) + function __construct($role = null, $scheme = null, $name = null) { $this->role = $role; $this->scheme = $scheme; @@ -7560,7 +7560,7 @@ class SimplePie_Copyright var $label; // Constructor, used to input the data - function SimplePie_Copyright($url = null, $label = null) + function __construct($url = null, $label = null) { $this->url = $url; $this->label = $label; @@ -7604,7 +7604,7 @@ class SimplePie_Rating var $value; // Constructor, used to input the data - function SimplePie_Rating($scheme = null, $value = null) + function __construct($scheme = null, $value = null) { $this->scheme = $scheme; $this->value = $value; @@ -7649,7 +7649,7 @@ class SimplePie_Restriction var $value; // Constructor, used to input the data - function SimplePie_Restriction($relationship = null, $type = null, $value = null) + function __construct($relationship = null, $type = null, $value = null) { $this->relationship = $relationship; $this->type = $type; @@ -7715,7 +7715,7 @@ class SimplePie_File var $error; var $method = SIMPLEPIE_FILE_SOURCE_NONE; - function SimplePie_File($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) + function __construct($url, $timeout = 10, $redirects = 5, $headers = null, $useragent = null, $force_fsockopen = false) { if (class_exists('idna_convert')) { @@ -8036,7 +8036,7 @@ class SimplePie_HTTP_Parser * @access public * @param string $data Input data */ - function SimplePie_HTTP_Parser($data) + function __construct($data) { $this->data = $data; $this->data_length = strlen($this->data); @@ -8512,7 +8512,7 @@ class SimplePie_gzdecode * * @access public */ - function SimplePie_gzdecode($data) + function __construct($data) { $this->compressed_data = $data; $this->compressed_size = strlen($data); @@ -8705,7 +8705,7 @@ class SimplePie_Cache * * @access private */ - function SimplePie_Cache() + function __construct() { trigger_error('Please call SimplePie_Cache::create() instead of the constructor', E_USER_ERROR); } @@ -8743,7 +8743,7 @@ class SimplePie_Cache_File var $extension; var $name; - function SimplePie_Cache_File($location, $filename, $extension) + function __construct($location, $filename, $extension) { $this->location = $location; $this->filename = $filename; @@ -8905,7 +8905,7 @@ class SimplePie_Cache_MySQL extends SimplePie_Cache_DB var $options; var $id; - function SimplePie_Cache_MySQL($mysql_location, $name, $extension) + function __construct($mysql_location, $name, $extension) { $host = $mysql_location->get_host(); if (SimplePie_Misc::stripos($host, 'unix(') === 0 && substr($host, -1) === ')') @@ -11532,7 +11532,7 @@ class SimplePie_Decode_HTML_Entities * @access public * @param string $data Input data */ - function SimplePie_Decode_HTML_Entities($data) + function __construct($data) { $this->data = $data; } @@ -11795,7 +11795,7 @@ class SimplePie_IRI * @param string $iri * @return SimplePie_IRI */ - function SimplePie_IRI($iri) + function __construct($iri) { $iri = (string) $iri; if ($iri !== '') @@ -13184,7 +13184,7 @@ class SimplePie_Parse_Date * * @access private */ - function SimplePie_Parse_Date() + function __construct() { $this->day_pcre = '(' . implode(array_keys($this->day), '|') . ')'; $this->month_pcre = '(' . implode(array_keys($this->month), '|') . ')'; @@ -13658,7 +13658,7 @@ class SimplePie_Content_Type_Sniffer * @access public * @param SimplePie_Content_Type_Sniffer $file Input file */ - function SimplePie_Content_Type_Sniffer($file) + function __construct($file) { $this->file = $file; } @@ -13990,7 +13990,7 @@ class SimplePie_XML_Declaration_Parser * @access public * @param string $data Input data */ - function SimplePie_XML_Declaration_Parser($data) + function __construct($data) { $this->data = $data; $this->data_length = strlen($this->data); @@ -14259,7 +14259,7 @@ class SimplePie_Locator var $max_checked_feeds = 10; var $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer'; - function SimplePie_Locator(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') + function __construct(&$file, $timeout = 10, $useragent = null, $file_class = 'SimplePie_File', $max_checked_feeds = 10, $content_type_sniffer_class = 'SimplePie_Content_Type_Sniffer') { $this->file =& $file; $this->file_class = $file_class; diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index b6d3479694..89507ea68c 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -65,12 +65,13 @@ class system { public function exec_safe($cmd) { $arg_count = func_num_args(); + $args = func_get_args(); + if($arg_count != substr_count($cmd, '?') + 1) { trigger_error('Placeholder count not matching argument list.', E_USER_WARNING); return false; } if($arg_count > 1) { - $args = func_get_args(); array_shift($args); $pos = 0; diff --git a/interface/web/mailuser/mail_user_autoresponder_edit.php b/interface/web/mailuser/mail_user_autoresponder_edit.php index d93151bf24..827a585e50 100644 --- a/interface/web/mailuser/mail_user_autoresponder_edit.php +++ b/interface/web/mailuser/mail_user_autoresponder_edit.php @@ -66,6 +66,12 @@ class page_action extends tform_actions { if (!isset($_POST['autoresponder']) && array_key_exists('autoresponder_start_date', $_POST)) { $this->dataRecord['autoresponder_start_date'] = array_map(create_function('$item', 'return 0;'), $this->dataRecord['autoresponder_start_date']); $this->dataRecord['autoresponder_end_date'] = array_map(create_function('$item', 'return 0;'), $this->dataRecord['autoresponder_end_date']); + + /* To be used when we go to PHP 7.x as min PHP version + $this->dataRecord['autoresponder_start_date'] = array_map( function ('$item') { 'return 0;' }, $this->dataRecord['autoresponder_start_date']); + $this->dataRecord['autoresponder_end_date'] = array_map( function ('$item') { 'return 0;' }, $this->dataRecord['autoresponder_end_date']); + */ + } parent::onSubmit(); diff --git a/interface/web/remote/monitor.php b/interface/web/remote/monitor.php index 132bcf29a5..914a09382e 100644 --- a/interface/web/remote/monitor.php +++ b/interface/web/remote/monitor.php @@ -59,73 +59,6 @@ if($token == '' or $secret == '' or $token != $secret) { } } $out['type'] = $type; - -function __json_encode($data) { - if( is_array($data) || is_object($data) ) { - $islist = is_array($data) && ( empty($data) || array_keys($data) === range(0, count($data)-1) ); - - if( $islist ) { - $json = '[' . implode(',', array_map('__json_encode', $data) ) . ']'; - } else { - $items = array(); - foreach( $data as $key => $value ) { - $items[] = __json_encode("$key") . ':' . __json_encode($value); - } - $json = '{' . implode(',', $items) . '}'; - } - } elseif( is_string($data) ) { - // Escape non-printable or Non-ASCII characters. - // I also put the \\ character first, as suggested in comments on the 'addcslashes' page. - $string = '"' . addcslashes($data, "\\\"\n\r\t/" . chr(8) . chr(12)) . '"'; - $json = ''; - $len = strlen($string); - // Convert UTF-8 to Hexadecimal Codepoints. - for( $i = 0; $i < $len; $i++ ) { - - $char = $string[$i]; - $c1 = ord($char); - - // Single byte; - if( $c1 <128 ) { - $json .= ($c1 > 31) ? $char : sprintf("\\u%04x", $c1); - continue; - } - - // Double byte - $c2 = ord($string[++$i]); - if ( ($c1 & 32) === 0 ) { - $json .= sprintf("\\u%04x", ($c1 - 192) * 64 + $c2 - 128); - continue; - } - - // Triple - $c3 = ord($string[++$i]); - if( ($c1 & 16) === 0 ) { - $json .= sprintf("\\u%04x", (($c1 - 224) <<12) + (($c2 - 128) << 6) + ($c3 - 128)); - continue; - } - - // Quadruple - $c4 = ord($string[++$i]); - if( ($c1 & 8 ) === 0 ) { - $u = (($c1 & 15) << 2) + (($c2>>4) & 3) - 1; - - $w1 = (54<<10) + ($u<<6) + (($c2 & 15) << 2) + (($c3>>4) & 3); - $w2 = (55<<10) + (($c3 & 15)<<6) + ($c4-128); - $json .= sprintf("\\u%04x\\u%04x", $w1, $w2); - } - } - } else { - // int, floats, bools, null - $json = strtolower(var_export( $data, true )); - } - return $json; -} - -if(function_exists('json_encode')) { // PHP >= 5.2 - echo json_encode($out); -} else { // PHP < 5.2 - echo __json_encode($out); -} +echo json_encode($out); exit; ?> diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php index 4bbc84e3f9..2bccf1ecb7 100644 --- a/server/lib/classes/db_mysql.inc.php +++ b/server/lib/classes/db_mysql.inc.php @@ -258,6 +258,8 @@ class db private function _query($sQuery = '') { global $app; + + $aArgs = func_get_args(); if ($sQuery == '') { $this->_sqlerror('Keine Anfrage angegeben / No query given'); @@ -297,7 +299,6 @@ class db } } while($ok == false); - $aArgs = func_get_args(); $sQuery = call_user_func_array(array(&$this, '_build_query_string'), $aArgs); $this->securityScan($sQuery); $this->_iQueryId = mysqli_query($this->_iConnId, $sQuery); @@ -353,9 +354,10 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { - if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; $aArgs = func_get_args(); + if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; + $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); if(!$oResult) return null; @@ -1300,7 +1302,7 @@ class fakedb_result { if(!is_array($this->aLimitedData)) return $aItem; - if(list($vKey, $aItem) = each($this->aLimitedData)) { + foreach($this->aLimitedData as $vKey => $aItem) { if(!$aItem) $aItem = null; } return $aItem; diff --git a/server/lib/classes/file.inc.php b/server/lib/classes/file.inc.php index eadb38b789..28757d0dd5 100644 --- a/server/lib/classes/file.inc.php +++ b/server/lib/classes/file.inc.php @@ -158,26 +158,6 @@ class file{ return $ret_val; } - function edit_dist($var, $val){ - global $$var; - $files = array('/root/ispconfig/dist.inc.php'); - foreach($files as $file){ - if(is_file($file)){ - $file_content = $this->unix_nl($this->rf($file)); - $lines = explode("\n", $file_content); - for($i=0;$iwf($file, $file_content); - } - } - } - function getDirectoryListing($dirname, $sortorder = 'a', $show_subdirs = 0, $show_subdirfiles = 0, $exts = '', $ext_save = 1){ // This function will return an array with filenames based on the criteria you can set in the variables // @sortorder : a for ascending (the standard) or d for descending (you can use the "r" for reverse as well, works the same) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 551e4e4853..078c225c10 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -2121,13 +2121,13 @@ class system{ public function exec_safe($cmd) { global $app; + $args = func_get_args(); $arg_count = func_num_args(); if($arg_count != substr_count($cmd, '?') + 1) { trigger_error('Placeholder count not matching argument list.', E_USER_WARNING); return false; } if($arg_count > 1) { - $args = func_get_args(); array_shift($args); $pos = 0; -- GitLab From 2c43ed30f81d25807bbcbbbcc3a3904262dcd5c6 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 25 Jun 2020 19:51:06 +0200 Subject: [PATCH 0260/1368] Remove deprectaed get_magic_quotes_runtime() from config.inc.php.master --- install/tpl/config.inc.php.master | 1 - 1 file changed, 1 deletion(-) diff --git a/install/tpl/config.inc.php.master b/install/tpl/config.inc.php.master index 02a7b2f65c..8cc70a598d 100644 --- a/install/tpl/config.inc.php.master +++ b/install/tpl/config.inc.php.master @@ -45,7 +45,6 @@ if( !empty($_SERVER['DOCUMENT_ROOT']) ) { } //** Set a few php.ini values -if(get_magic_quotes_runtime()) set_magic_quotes_runtime(false); if(isset($app)) unset($app); if(isset($conf)) unset($conf); -- GitLab From d3983e82f2d2ae408068bb41e79653b43fb41e56 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 28 Jun 2020 14:05:54 +0200 Subject: [PATCH 0261/1368] Change locked string (#4714) --- interface/web/client/lib/lang/ar_client.lng | 2 +- interface/web/client/lib/lang/bg_client.lng | 2 +- interface/web/client/lib/lang/br_client.lng | 2 +- interface/web/client/lib/lang/ca_client.lng | 2 +- interface/web/client/lib/lang/cz_client.lng | 2 +- interface/web/client/lib/lang/de_client.lng | 2 +- interface/web/client/lib/lang/dk_client.lng | 2 +- interface/web/client/lib/lang/el_client.lng | 2 +- interface/web/client/lib/lang/en_client.lng | 2 +- interface/web/client/lib/lang/es_client.lng | 2 +- interface/web/client/lib/lang/fi_client.lng | 2 +- interface/web/client/lib/lang/fr_client.lng | 2 +- interface/web/client/lib/lang/hr_client.lng | 2 +- interface/web/client/lib/lang/hu_client.lng | 2 +- interface/web/client/lib/lang/id_client.lng | 2 +- interface/web/client/lib/lang/it_client.lng | 2 +- interface/web/client/lib/lang/ja_client.lng | 2 +- interface/web/client/lib/lang/nl_client.lng | 2 +- interface/web/client/lib/lang/pl_client.lng | 2 +- interface/web/client/lib/lang/pt_client.lng | 2 +- interface/web/client/lib/lang/ro_client.lng | 2 +- interface/web/client/lib/lang/ru_client.lng | 2 +- interface/web/client/lib/lang/se_client.lng | 2 +- interface/web/client/lib/lang/sk_client.lng | 2 +- interface/web/client/lib/lang/tr_client.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/client/lib/lang/ar_client.lng b/interface/web/client/lib/lang/ar_client.lng index deefcd8ade..2fcd02606f 100644 --- a/interface/web/client/lib/lang/ar_client.lng +++ b/interface/web/client/lib/lang/ar_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/bg_client.lng b/interface/web/client/lib/lang/bg_client.lng index 8b024de0eb..dcaba08f8b 100644 --- a/interface/web/client/lib/lang/bg_client.lng +++ b/interface/web/client/lib/lang/bg_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/br_client.lng b/interface/web/client/lib/lang/br_client.lng index ba26b61513..46ad85698b 100644 --- a/interface/web/client/lib/lang/br_client.lng +++ b/interface/web/client/lib/lang/br_client.lng @@ -150,7 +150,7 @@ $wb['aps_limits_txt'] = 'Limites de instalações de APPs'; $wb['limit_aps_txt'] = 'Limite de instâncias de APPs'; $wb['limit_aps_error_notint'] = 'O limite de instâncias de APPs deve ser um número.'; $wb['default_slave_dnsserver_txt'] = 'Servidor dns secundário padrão'; -$wb['locked_txt'] = 'Bloqueado (desabilita todos os sites, etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Cancelado (desabilita o acesso do cliente.)'; $wb['gender_txt'] = 'Título'; $wb['gender_m_txt'] = 'Sr.'; diff --git a/interface/web/client/lib/lang/ca_client.lng b/interface/web/client/lib/lang/ca_client.lng index 1797c17cd7..e4cc2f2dbe 100644 --- a/interface/web/client/lib/lang/ca_client.lng +++ b/interface/web/client/lib/lang/ca_client.lng @@ -144,7 +144,7 @@ $wb['aps_limits_txt'] = 'Nombre max d\'Installeur APS'; $wb['limit_aps_txt'] = 'Nombre max d\'instances APS'; $wb['limit_aps_error_notint'] = 'La limite d\'instances APS doit être un nombre'; $wb['default_slave_dnsserver_txt'] = 'Serveur DNS secondaire par défaut'; -$wb['locked_txt'] = 'Vérouillé (Désactive web, etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (Désactive connexion Ispconfig)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/cz_client.lng b/interface/web/client/lib/lang/cz_client.lng index 355611f50e..5d26a51cda 100644 --- a/interface/web/client/lib/lang/cz_client.lng +++ b/interface/web/client/lib/lang/cz_client.lng @@ -144,7 +144,7 @@ $wb['aps_limits_txt'] = 'APS limity instalátoru'; $wb['limit_aps_txt'] = 'Max. počet APS instalací'; $wb['limit_aps_error_notint'] = 'Limit pro APS instalace musí být číslo.'; $wb['default_slave_dnsserver_txt'] = 'Výchozí sekundární DNS server'; -$wb['locked_txt'] = 'Zamčeno (zakáže všechny weby atd.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Zrušeno (zakáže přihlášení klienta)'; $wb['gender_txt'] = 'Oslovení'; $wb['gender_m_txt'] = 'Pan'; diff --git a/interface/web/client/lib/lang/de_client.lng b/interface/web/client/lib/lang/de_client.lng index 58e390c9f2..ca22ce638c 100644 --- a/interface/web/client/lib/lang/de_client.lng +++ b/interface/web/client/lib/lang/de_client.lng @@ -147,7 +147,7 @@ $wb['aps_limits_txt'] = 'APS Installationsassistent Limits'; $wb['limit_aps_txt'] = 'Max. Anzahl an APS-Instanzen'; $wb['limit_aps_error_notint'] = 'Das APS Instanzen Limit muss eine Zahl sein.'; $wb['default_slave_dnsserver_txt'] = 'Standard Secondary DNS Server'; -$wb['locked_txt'] = 'Gesperrt (deaktiviert alle Webs, etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Gekündigt (verhindert Kundenlogin)'; $wb['gender_txt'] = 'Anrede'; $wb['gender_m_txt'] = 'Herr'; diff --git a/interface/web/client/lib/lang/dk_client.lng b/interface/web/client/lib/lang/dk_client.lng index c0e8734912..b1e549dd91 100644 --- a/interface/web/client/lib/lang/dk_client.lng +++ b/interface/web/client/lib/lang/dk_client.lng @@ -144,7 +144,7 @@ $wb['aps_limits_txt'] = 'APS Installer Begrænsninger'; $wb['limit_aps_txt'] = 'Max. antal af APS forekomster'; $wb['limit_aps_error_notint'] = 'APS forekomster grænse skal være et tal.'; $wb['default_slave_dnsserver_txt'] = 'Standard Sekundær DNS Server'; -$wb['locked_txt'] = 'Låst (deaktiverer alle webs mv)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Annulleret (deaktivere kunde log ind)'; $wb['gender_txt'] = 'Titel'; $wb['gender_m_txt'] = 'Hr.'; diff --git a/interface/web/client/lib/lang/el_client.lng b/interface/web/client/lib/lang/el_client.lng index 59d50b3c85..51f75bff05 100644 --- a/interface/web/client/lib/lang/el_client.lng +++ b/interface/web/client/lib/lang/el_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/en_client.lng b/interface/web/client/lib/lang/en_client.lng index 9b114d4e64..797161d791 100644 --- a/interface/web/client/lib/lang/en_client.lng +++ b/interface/web/client/lib/lang/en_client.lng @@ -151,7 +151,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb["default_slave_dnsserver_txt"] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/es_client.lng b/interface/web/client/lib/lang/es_client.lng index 2595853096..eae85315b6 100644 --- a/interface/web/client/lib/lang/es_client.lng +++ b/interface/web/client/lib/lang/es_client.lng @@ -146,7 +146,7 @@ $wb['limit_xmpp_status_txt'] = 'Host de estado disponible'; $wb['limit_xmpp_user_error_notint'] = 'El límite de usuarios XMPP debe ser un número.'; $wb['limit_xmpp_user_txt'] = 'Número máximo de cuentas XMPP'; $wb['limit_xmpp_vjud_txt'] = 'Directorio de usuarios VJUD disponible'; -$wb['locked_txt'] = 'Bloqueado (desactivar sitios web etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['mail_servers_placeholder'] = 'Seleccionar servidores de correo'; $wb['mail_servers_txt'] = 'Servidores de correo'; $wb['mail_servers_used'] = 'El servidor que está intentando borrar de este cliente está siendo utilizado como servidor de correo. Por favor asegúrese de que este servidor no esté siendo utilizado por este cliente antes de borrarlo.'; diff --git a/interface/web/client/lib/lang/fi_client.lng b/interface/web/client/lib/lang/fi_client.lng index 65893189b3..751b7e7836 100644 --- a/interface/web/client/lib/lang/fi_client.lng +++ b/interface/web/client/lib/lang/fi_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/fr_client.lng b/interface/web/client/lib/lang/fr_client.lng index 10f212e0f1..c3de724d93 100644 --- a/interface/web/client/lib/lang/fr_client.lng +++ b/interface/web/client/lib/lang/fr_client.lng @@ -144,7 +144,7 @@ $wb['aps_limits_txt'] = 'Nombre max d’Installeur APS'; $wb['limit_aps_txt'] = 'Nombre max d’instances APS'; $wb['limit_aps_error_notint'] = 'La limite d’instances APS doit être un nombre'; $wb['default_slave_dnsserver_txt'] = 'Serveur DNS secondaire par défaut'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Titre'; $wb['gender_m_txt'] = 'Monsieur'; diff --git a/interface/web/client/lib/lang/hr_client.lng b/interface/web/client/lib/lang/hr_client.lng index 9975861bde..4d16bac0cb 100644 --- a/interface/web/client/lib/lang/hr_client.lng +++ b/interface/web/client/lib/lang/hr_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/hu_client.lng b/interface/web/client/lib/lang/hu_client.lng index b74881e9bf..cd491f7b00 100644 --- a/interface/web/client/lib/lang/hu_client.lng +++ b/interface/web/client/lib/lang/hu_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/id_client.lng b/interface/web/client/lib/lang/id_client.lng index b9cec3c1e6..2b3c00bfe3 100644 --- a/interface/web/client/lib/lang/id_client.lng +++ b/interface/web/client/lib/lang/id_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/it_client.lng b/interface/web/client/lib/lang/it_client.lng index 09c93513ae..8491d54f20 100644 --- a/interface/web/client/lib/lang/it_client.lng +++ b/interface/web/client/lib/lang/it_client.lng @@ -144,7 +144,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Bloccato (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Cancellato(disables client login)'; $wb['gender_txt'] = 'Titolo'; $wb['gender_m_txt'] = 'Sig.'; diff --git a/interface/web/client/lib/lang/ja_client.lng b/interface/web/client/lib/lang/ja_client.lng index 41023dd0a6..cb1a7c2664 100644 --- a/interface/web/client/lib/lang/ja_client.lng +++ b/interface/web/client/lib/lang/ja_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/nl_client.lng b/interface/web/client/lib/lang/nl_client.lng index 4d6f11ca51..6dfc1a8525 100644 --- a/interface/web/client/lib/lang/nl_client.lng +++ b/interface/web/client/lib/lang/nl_client.lng @@ -147,7 +147,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/pl_client.lng b/interface/web/client/lib/lang/pl_client.lng index 5fcf7a26d4..89fafa6776 100644 --- a/interface/web/client/lib/lang/pl_client.lng +++ b/interface/web/client/lib/lang/pl_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'Limity Instalatora APS'; $wb['limit_aps_txt'] = 'Maks. liczba instalacji APS'; $wb['limit_aps_error_notint'] = 'Limit instalacji APS musi być liczbą'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/pt_client.lng b/interface/web/client/lib/lang/pt_client.lng index a3f98566ee..cccd950d3f 100644 --- a/interface/web/client/lib/lang/pt_client.lng +++ b/interface/web/client/lib/lang/pt_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/ro_client.lng b/interface/web/client/lib/lang/ro_client.lng index 0b7c552b37..6dd6da9dad 100644 --- a/interface/web/client/lib/lang/ro_client.lng +++ b/interface/web/client/lib/lang/ro_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/ru_client.lng b/interface/web/client/lib/lang/ru_client.lng index 94d0bb6a0d..080512f5b0 100644 --- a/interface/web/client/lib/lang/ru_client.lng +++ b/interface/web/client/lib/lang/ru_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'Лимиты Установщика APS'; $wb['limit_aps_txt'] = 'Макс. количество экземпляров APS'; $wb['limit_aps_error_notint'] = 'Лимит экземпляров APS должен быть числом.'; $wb['default_slave_dnsserver_txt'] = 'Вторичный DNS-сервер по умолчанию'; -$wb['locked_txt'] = 'Заблокировано (Отключены все web-сайты и т.д.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Отменено (отключен вход для клиентов)'; $wb['gender_txt'] = 'Обращение'; $wb['gender_m_txt'] = 'Г-н.'; diff --git a/interface/web/client/lib/lang/se_client.lng b/interface/web/client/lib/lang/se_client.lng index fb1151ed8e..6e0f025f90 100644 --- a/interface/web/client/lib/lang/se_client.lng +++ b/interface/web/client/lib/lang/se_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Förvald sekundär DNS-server'; -$wb['locked_txt'] = 'Låst (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Uppsagd (disables client login)'; $wb['gender_txt'] = 'Titel'; $wb['gender_m_txt'] = 'Herr'; diff --git a/interface/web/client/lib/lang/sk_client.lng b/interface/web/client/lib/lang/sk_client.lng index dcd291bc53..b215eb2b32 100644 --- a/interface/web/client/lib/lang/sk_client.lng +++ b/interface/web/client/lib/lang/sk_client.lng @@ -146,7 +146,7 @@ $wb['aps_limits_txt'] = 'APS Installer Limits'; $wb['limit_aps_txt'] = 'Max. number of APS instances'; $wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables all webs etc.)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'Canceled (disables client login)'; $wb['gender_txt'] = 'Title'; $wb['gender_m_txt'] = 'Mr.'; diff --git a/interface/web/client/lib/lang/tr_client.lng b/interface/web/client/lib/lang/tr_client.lng index 9e8e6b9be3..d87fe26da9 100644 --- a/interface/web/client/lib/lang/tr_client.lng +++ b/interface/web/client/lib/lang/tr_client.lng @@ -151,7 +151,7 @@ $wb['aps_limits_txt'] = 'APS Yükleyici Sınırları'; $wb['limit_aps_txt'] = 'En Fazla APS Kopyası Sayısı'; $wb['limit_aps_error_notint'] = 'APS kopya sayısı sınırı bir sayı olmalıdır.'; $wb['default_slave_dnsserver_txt'] = 'Varsayılan İkincil DNS Sunucusu'; -$wb['locked_txt'] = 'Kilitli
(tüm web vb. devre dışı)'; +$wb['locked_txt'] = 'Locked (disables everything except DNS)'; $wb['canceled_txt'] = 'İptal
(müşteri oturumu devre dışı)'; $wb['gender_txt'] = 'Unvan'; $wb['gender_m_txt'] = 'Bay'; -- GitLab From e5c0111bcddd29620a2e910e4f590b8c9df799a9 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 29 Jun 2020 10:06:13 -0600 Subject: [PATCH 0262/1368] jk_init.ini: remove duplicate includesections from [openvpn] jail --- install/tpl/jk_init.ini.master | 1 - 1 file changed, 1 deletion(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 469e655a31..6d064d8220 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -112,7 +112,6 @@ comment = jail for the openvpn daemon executables = /usr/sbin/openvpn users = root,nobody groups = root,nogroup -includesections = netbasics devices = /dev/urandom, /dev/random, /dev/net/tun includesections = netbasics, uidbasics need_logsocket = 1 -- GitLab From bbe020e47da76600de94959f3fe98ad455c002f5 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 29 Jun 2020 11:28:26 -0600 Subject: [PATCH 0263/1368] pass LANG to jail environment --- install/tpl/jk_chrootsh.ini.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/jk_chrootsh.ini.master b/install/tpl/jk_chrootsh.ini.master index cfd9e8d198..3373e6aec5 100644 --- a/install/tpl/jk_chrootsh.ini.master +++ b/install/tpl/jk_chrootsh.ini.master @@ -10,4 +10,4 @@ #relax_home_group=1 skip_injail_passwd_check=1 injail_shell=/bin/bash -env = TERM, PATH +env = TERM, PATH, LANG -- GitLab From e91fa78e85851fa16ff7aa57d9a9b4635ce48077 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 29 Jun 2020 15:59:00 -0600 Subject: [PATCH 0264/1368] update jk_init.ini based on upstream version 2.21, add coreutils and php sections --- install/tpl/jk_init.ini.master | 156 +++++++++++++++++++++++---------- 1 file changed, 109 insertions(+), 47 deletions(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 6d064d8220..ff8ed5675c 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -1,28 +1,34 @@ +# jk_init.ini: jailkit initialization config + +# Includes paths to handle Debian 10/9, +# if other paths are needed please create an issue with the details: +# https://git.ispconfig.org/ispconfig/ispconfig3/-/issues + [uidbasics] -# this section probably needs adjustment on 64bit systems -# or non-Linux systems +# this section probably needs adjustment non-Linux systems comment = common files for all jails that need user/group information -libraries = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2, /lib/x86_64-linux-gnu/libnss*.so.2 -regularfiles = /etc/nsswitch.conf, /etc/ld.so.conf +paths = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2, /lib/i386-linux-gnu/libnsl.so.1, /lib/i386-linux-gnu/libnss*.so.2, /lib/x86_64-linux-gnu/libnsl.so.1, /lib/x86_64-linux-gnu/libnss*.so.2, /lib/arm-linux-gnueabihf/libnss*.so.2, /lib/arm-linux-gnueabihf/libnsl*.so.1, /etc/nsswitch.conf, /etc/ld.so.conf +# Solaris allegedly needs +# paths = /etc/default/nss, /lib/libnsl.so.1, /usr/lib/nss_*.so.1, /etc/nsswitch.conf [netbasics] comment = common files for all jails that need any internet connectivity -libraries = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2 -regularfiles = /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols +paths = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/libnss_mdns*.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs +# on Solaris devices /dev/udp and /dev/tcp might be needed too, not sure [logbasics] -comment = timezone information -regularfiles = /etc/localtime +comment = timezone information and log sockets +paths = /etc/localtime need_logsocket = 1 +# Solaris allegedly does not need logsocket, but needs +# devices = /dev/log, /dev/conslog [jk_lsh] comment = Jailkit limited shell -executables = /usr/sbin/jk_lsh -regularfiles = /etc/jailkit/jk_lsh.ini +paths = /usr/sbin/jk_lsh, /etc/jailkit/jk_lsh.ini users = root groups = root -need_logsocket = 1 -includesections = uidbasics +includesections = uidbasics, logbasics [limitedshell] comment = alias for jk_lsh @@ -30,78 +36,77 @@ includesections = jk_lsh [cvs] comment = Concurrent Versions System -executables = /usr/bin/cvs +paths = cvs devices = /dev/null [git] comment = Fast Version Control System -executables = /usr/bin/git* -directories = /usr/share/git-core -includesections = editors +paths = /usr/bin/git*, /usr/lib/git-core, /usr/share/git-core, /usr/bin/pager +includesections = editors, perl, netbasics, basicshell, coreutils [scp] comment = ssh secure copy -executables = /usr/bin/scp +paths = scp includesections = netbasics, uidbasics devices = /dev/urandom [sftp] comment = ssh secure ftp -executables = /usr/lib/sftp-server, /usr/libexec/openssh/sftp-server, /usr/lib/misc/sftp-server, /usr/libexec/sftp-server +paths = /usr/lib/sftp-server, /usr/libexec/openssh/sftp-server, /usr/lib/misc/sftp-server, /usr/libexec/sftp-server, /usr/lib/openssh/sftp-server includesections = netbasics, uidbasics devices = /dev/urandom, /dev/null +# on solaris +#paths = /usr/lib/ssh/sftp-server [ssh] comment = ssh secure shell -executables = /usr/bin/ssh +paths = ssh includesections = netbasics, uidbasics -devices = /dev/urandom, /dev/tty +devices = /dev/urandom, /dev/tty, /dev/null [rsync] -executables = /usr/bin/rsync +paths = rsync includesections = netbasics, uidbasics [procmail] comment = procmail mail delivery -executables = /usr/bin/procmail, /bin/sh +paths = procmail, /bin/sh devices = /dev/null [basicshell] comment = bash based shell with several basic utilities -executables = /bin/sh, /bin/bash, /bin/ls, /bin/cat, /bin/chmod, /bin/mkdir, /bin/cp, /bin/cpio, /bin/date, /bin/dd, /bin/echo, /bin/egrep, /bin/false, /bin/fgrep, /bin/grep, /bin/gunzip, /bin/gzip, /bin/ln, /bin/ls, /bin/mkdir, /bin/mktemp, /bin/more, /bin/mv, /bin/pwd, /bin/rm, /bin/rmdir, /bin/sed, /bin/sh, /bin/sleep, /bin/sync, /bin/tar, /bin/touch, /bin/true, /bin/uncompress, /bin/zcat -regularfiles = /etc/motd, /etc/issue, /etc/bash.bashrc, /etc/bashrc, /etc/profile -directories = /usr/lib/locale/en_US.utf8 +paths = /bin/sh, bash, ls, cat, chmod, mkdir, cp, cpio, date, dd, echo, egrep, false, fgrep, grep, gunzip, gzip, ln, ls, mkdir, mktemp, more, mv, pwd, rm, rmdir, sed, sh, sleep, sync, tar, touch, true, uncompress, zcat, /etc/motd, /etc/issue, /etc/bash.bashrc, /etc/bashrc, /etc/profile, /usr/lib/locale/en_US.utf8, uname, expr, xargs users = root groups = root includesections = uidbasics [midnightcommander] comment = Midnight Commander -executables = /usr/bin/mc, /usr/bin/mcedit, /usr/bin/mcview -directories = /etc/terminfo, /usr/share/terminfo, /usr/share/mc -includesections = basicshell +paths = mc, mcedit, mcview, /usr/share/mc +includesections = basicshell, terminfo [extendedshell] comment = bash shell including things like awk, bzip, tail, less -executables = /usr/bin/awk, /usr/bin/bzip2, /usr/bin/bunzip2, /usr/bin/ldd, /usr/bin/less, /usr/bin/clear, /usr/bin/cut, /usr/bin/du, /usr/bin/find, /usr/bin/head, /usr/bin/less, /usr/bin/md5sum, /usr/bin/nice, /usr/bin/sort, /usr/bin/tac, /usr/bin/tail, /usr/bin/tr, /usr/bin/sort, /usr/bin/wc, /usr/bin/watch, /usr/bin/whoami +paths = awk, bzip2, bunzip2, ldd, less, clear, cut, du, find, head, less, md5sum, nice, sort, tac, tail, tr, sort, wc, watch, whoami includesections = basicshell, midnightcommander, editors +[terminfo] +comment = terminfo databases, required for example for ncurses or vim +paths = /etc/terminfo, /usr/share/terminfo, /lib/terminfo + [editors] comment = vim, joe and nano -executables = /usr/bin/joe, /usr/bin/nano, /usr/bin/vi, /usr/bin/vim, /usr/bin/pico -regularfiles = /etc/vimrc -directories = /etc/joe, /etc/terminfo, /usr/share/vim, /usr/share/terminfo, /lib/terminfo +includesections = terminfo +paths = joe, nano, vi, vim, /etc/vimrc, /etc/joe, /usr/share/vim [netutils] comment = several internet utilities like wget, ftp, rsync, scp, ssh -executables = /usr/bin/wget, /usr/bin/lynx, /usr/bin/ftp, /usr/bin/host, /usr/bin/rsync, /usr/bin/smbclient +paths = wget, lynx, ftp, host, rsync, smbclient includesections = netbasics, ssh, sftp, scp -directories = /etc/ssl/certs/ -regularfiles = /usr/lib/ssl/certs [apacheutils] comment = htpasswd utility -executables = /usr/bin/htpasswd +paths = htpasswd [extshellplusnet] comment = alias for extendedshell + netutils + apacheutils @@ -109,7 +114,7 @@ includesections = extendedshell, netutils, apacheutils [openvpn] comment = jail for the openvpn daemon -executables = /usr/sbin/openvpn +paths = /usr/sbin/openvpn users = root,nobody groups = root,nogroup devices = /dev/urandom, /dev/random, /dev/net/tun @@ -118,35 +123,92 @@ need_logsocket = 1 [apache] comment = the apache webserver, very basic setup, probably too limited for you -executables = /usr/sbin/apache +paths = /usr/sbin/apache users = root, www-data groups = root, www-data includesections = netbasics, uidbasics [perl] comment = the perl interpreter and libraries -executables = /usr/bin/perl -directories = /usr/lib/perl, /usr/lib/perl5, /usr/share/perl, /usr/share/perl5 +paths = perl, /usr/lib/perl, /usr/lib/perl5, /usr/share/perl, /usr/share/perl5 [xauth] comment = getting X authentication to work -executables = /usr/bin/X11/xauth -regularfiles = /usr/X11R6/lib/X11/rgb.txt, /etc/ld.so.conf +paths = /usr/bin/X11/xauth, /usr/X11R6/lib/X11/rgb.txt, /etc/ld.so.conf [xclients] comment = minimal files for X clients -regularfiles = /usr/X11R6/lib/X11/rgb.txt +paths = /usr/X11R6/lib/X11/rgb.txt includesections = xauth [vncserver] comment = the VNC server program -executables = /usr/bin/Xvnc, /usr/bin/Xrealvnc -directories = /usr/X11R6/lib/X11/fonts/ +paths = Xvnc, Xrealvnc, /usr/X11R6/lib/X11/fonts/ includesections = xclients +[ping] +comment = Ping program +paths_w_setuid = /bin/ping #[xterm] #comment = xterm -#executables = /usr/bin/X11/xterm -#directories = /usr/share/terminfo, /etc/terminfo +#paths = /usr/bin/X11/xterm, /usr/share/terminfo, /etc/terminfo #devices = /dev/pts/0, /dev/pts/1, /dev/pts/2, /dev/pts/3, /dev/pts/4, /dev/ptyb4, /dev/ptya4, /dev/tty, /dev/tty0, /dev/tty4 + ++# coreutils from: ++# (echo -ne '\n[coreutils]\ncomment = non-sbin progs from coreutils\npaths = '; dpkg --listfiles coreutils | grep -E '^/bin/|/usr/bin/' | xargs -n1 -i@ echo -n "@, " | sed -e 's/, *$/\n/g' -e 's|/usr/bin/||g' -e 's|/bin/||g') >> /etc/jailkit/jk_init.ini + +[coreutils] +comment = non-sbin progs from coreutils +paths = cat, chgrp, chmod, chown, cp, date, dd, df, dir, echo, false, ln, ls, mkdir, mknod, mktemp, mv, pwd, readlink, rm, rmdir, sleep, stty, sync, touch, true, uname, vdir, [, arch, b2sum, base32, base64, basename, chcon, cksum, comm, csplit, cut, dircolors, dirname, du, env, expand, expr, factor, fmt, fold, groups, head, hostid, id, install, join, link, logname, md5sum, mkfifo, nice, nl, nohup, nproc, numfmt, od, paste, pathchk, pinky, pr, printenv, printf, ptx, realpath, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sort, split, stat, stdbuf, sum, tac, tail, tee, test, timeout, tr, truncate, tsort, tty, unexpand, uniq, unlink, users, wc, who, whoami, yes, md5sum.textutils + +[env] +comment = /usr/bin/env for environment variables +paths = env + +# Debian 10 default php version is 7.3 (Debian 9 is 7.0) +# Todo: set default version in ISPConfig installer, +# but install the php cli version matching the website +[php] +comment = default php version and libraries +paths = /usr/bin/php +includesections = php_common, php7_3 + +[php_common] +comment = common php directories and libraries +# notice: potential information leak +# do not add all of /etc/php/ or any of the fpm directories +# or the php config (which includes custom php snippets) from *all* +# sites which use fpm will be copied to *every* jailkit +paths = /usr/bin/php, /usr/lib/php/, /usr/share/php/, /usr/share/zoneinfo/ +includesections = env + +[php5_6] +comment = php version 5.6 +paths = /usr/bin/php5.6, /usr/lib/php/5.6/, /usr/lib/php/20131226/, /usr/share/php/5.6/, /etc/php/5.6/cli/, /etc/php/5.6/mods-available/ +includesections = php_common + +[php7_0] +comment = php version 7.0 +paths = /usr/bin/php7.0, /usr/lib/php/7.0/, /usr/lib/php/20151012/, /usr/share/php/7.0/, /etc/php/7.0/cli/, /etc/php/7.0/mods-available/ +includesections = php_common + +[php7_1] +comment = php version 7.1 +paths = /usr/bin/php7.1, /usr/lib/php/7.1/, /usr/lib/php/20160303/, /usr/share/php/7.1/, /etc/php/7.1/cli/, /etc/php/7.1/mods-available/ +includesections = php_common + +[php7_2] +comment = php version 7.2 +paths = /usr/bin/php7.2, /usr/lib/php/7.2/, /usr/lib/php/20170718/, /usr/share/php/7.2/, /etc/php/7.2/cli/, /etc/php/7.2/mods-available/ +includesections = php_common + +[php7_3] +comment = php version 7.3 +paths = /usr/bin/php7.3, /usr/lib/php/7.3/, /usr/lib/php/20180731/, /usr/share/php/7.3/, /etc/php/7.3/cli/, /etc/php/7.3/mods-available/ +includesections = php_common + +[php7_4] +comment = php version 7.4 +paths = /usr/bin/php7.4, /usr/lib/php/7.4/, /usr/lib/php/20190902/, /usr/share/php/7.4/, /etc/php/7.4/cli/, /etc/php/7.4/mods-available/ +includesections = php_common -- GitLab From 89c1e47de6da2c40ed38663eec8f4d1b51faed34 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 29 Jun 2020 17:16:01 -0600 Subject: [PATCH 0265/1368] jk_init.ini: best-guess i386 paths, add wp, node and composer jails --- install/tpl/jk_init.ini.master | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index ff8ed5675c..0f62aac9ef 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -5,23 +5,17 @@ # https://git.ispconfig.org/ispconfig/ispconfig3/-/issues [uidbasics] -# this section probably needs adjustment non-Linux systems comment = common files for all jails that need user/group information paths = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2, /lib/i386-linux-gnu/libnsl.so.1, /lib/i386-linux-gnu/libnss*.so.2, /lib/x86_64-linux-gnu/libnsl.so.1, /lib/x86_64-linux-gnu/libnss*.so.2, /lib/arm-linux-gnueabihf/libnss*.so.2, /lib/arm-linux-gnueabihf/libnsl*.so.1, /etc/nsswitch.conf, /etc/ld.so.conf -# Solaris allegedly needs -# paths = /etc/default/nss, /lib/libnsl.so.1, /usr/lib/nss_*.so.1, /etc/nsswitch.conf [netbasics] comment = common files for all jails that need any internet connectivity -paths = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/libnss_mdns*.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs -# on Solaris devices /dev/udp and /dev/tcp might be needed too, not sure +paths = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/libnss_mdns*.so.2, /lib/i386-linux-gnu/libnss_dns.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs [logbasics] comment = timezone information and log sockets paths = /etc/localtime need_logsocket = 1 -# Solaris allegedly does not need logsocket, but needs -# devices = /dev/log, /dev/conslog [jk_lsh] comment = Jailkit limited shell @@ -162,6 +156,25 @@ paths_w_setuid = /bin/ping comment = non-sbin progs from coreutils paths = cat, chgrp, chmod, chown, cp, date, dd, df, dir, echo, false, ln, ls, mkdir, mknod, mktemp, mv, pwd, readlink, rm, rmdir, sleep, stty, sync, touch, true, uname, vdir, [, arch, b2sum, base32, base64, basename, chcon, cksum, comm, csplit, cut, dircolors, dirname, du, env, expand, expr, factor, fmt, fold, groups, head, hostid, id, install, join, link, logname, md5sum, mkfifo, nice, nl, nohup, nproc, numfmt, od, paste, pathchk, pinky, pr, printenv, printf, ptx, realpath, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sort, split, stat, stdbuf, sum, tac, tail, tee, test, timeout, tr, truncate, tsort, tty, unexpand, uniq, unlink, users, wc, who, whoami, yes, md5sum.textutils +[wp] +comment = WordPress Command Line +paths = wp, /usr/local/bin/php +includesections = php, mysql-client + +[mysql-client] +comment = mysql client +paths = mysql, mysqldump, mysqlshow, /usr/lib/libmysqlclient.so, /usr/lib/i386-linux-gnu/libmariadb.so.3, /usr/lib/i386-linux-gnu/mariadb19, /usr/lib/x86_64-linux-gnu/libmariadb.so.3, /usr/lib/x86_64-linux-gnu/mariadb19 +includesections = netbasics + +[composer] +comment = composer +paths = composer, /usr/local/bin/composer, /usr/share/doc/composer +includesections = php, uidbasics, netbasics + +[node] +comment = NodeJS +paths = npm, node, nodejs, /usr/lib/nodejs, /usr/share/node-mime, /usr/lib/node_modules, /usr/local/lib/nodejs, /usr/local/lib/node_modules, elmi-to-json, /usr/local/bin/elmi-to-json + [env] comment = /usr/bin/env for environment variables paths = env -- GitLab From 5d413ef629405381091048cee4cdde7f786012c2 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 30 Jun 2020 19:42:46 +0200 Subject: [PATCH 0266/1368] Only use ids.whitelist.custom if the file is readable. --- interface/lib/classes/ids.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/ids.inc.php b/interface/lib/classes/ids.inc.php index abdf32b302..6d19726417 100644 --- a/interface/lib/classes/ids.inc.php +++ b/interface/lib/classes/ids.inc.php @@ -68,7 +68,7 @@ class ids { // Get whitelist $whitelist_path = '/usr/local/ispconfig/security/ids.whitelist'; - if(is_file('/usr/local/ispconfig/security/ids.whitelist.custom')) $whitelist_path = '/usr/local/ispconfig/security/ids.whitelist.custom'; + if(is_readable('/usr/local/ispconfig/security/ids.whitelist.custom')) $whitelist_path = '/usr/local/ispconfig/security/ids.whitelist.custom'; if(!is_file($whitelist_path)) $whitelist_path = realpath(ISPC_ROOT_PATH.'/../security/ids.whitelist'); $whitelist_lines = file($whitelist_path); @@ -91,7 +91,7 @@ class ids { // Get HTML fields $htmlfield_path = '/usr/local/ispconfig/security/ids.htmlfield'; - if(is_file('/usr/local/ispconfig/security/ids.htmlfield.custom')) $htmlfield_path = '/usr/local/ispconfig/security/ids.htmlfield.custom'; + if(is_readable('/usr/local/ispconfig/security/ids.htmlfield.custom')) $htmlfield_path = '/usr/local/ispconfig/security/ids.htmlfield.custom'; if(!is_file($htmlfield_path)) $htmlfield_path = realpath(ISPC_ROOT_PATH.'/../security/ids.htmlfield'); $htmlfield_lines = file($htmlfield_path); -- GitLab From dfd82421be743323e0e4f4fa9a23293abbe4de82 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 30 Jun 2020 13:12:03 -0600 Subject: [PATCH 0267/1368] don't save invalid server config section --- interface/web/admin/lib/lang/ar_server_config.lng | 2 ++ interface/web/admin/lib/lang/bg_server_config.lng | 2 ++ interface/web/admin/lib/lang/br_server_config.lng | 2 ++ interface/web/admin/lib/lang/ca_server_config.lng | 2 ++ interface/web/admin/lib/lang/cz_server_config.lng | 2 ++ interface/web/admin/lib/lang/de_server_config.lng | 2 ++ interface/web/admin/lib/lang/dk_server_config.lng | 2 ++ interface/web/admin/lib/lang/el_server_config.lng | 2 ++ interface/web/admin/lib/lang/en_server_config.lng | 2 ++ interface/web/admin/lib/lang/es_server_config.lng | 2 ++ interface/web/admin/lib/lang/fi_server_config.lng | 2 ++ interface/web/admin/lib/lang/fr_server_config.lng | 2 ++ interface/web/admin/lib/lang/hr_server_config.lng | 2 ++ interface/web/admin/lib/lang/hu_server_config.lng | 2 ++ interface/web/admin/lib/lang/id_server_config.lng | 2 ++ interface/web/admin/lib/lang/it_server_config.lng | 2 ++ interface/web/admin/lib/lang/ja_server_config.lng | 2 ++ interface/web/admin/lib/lang/nl_server_config.lng | 2 ++ interface/web/admin/lib/lang/pl_server_config.lng | 2 ++ interface/web/admin/lib/lang/pt_server_config.lng | 2 ++ interface/web/admin/lib/lang/ro_server_config.lng | 2 ++ interface/web/admin/lib/lang/ru_server_config.lng | 2 ++ interface/web/admin/lib/lang/se_server_config.lng | 2 ++ interface/web/admin/lib/lang/sk_server_config.lng | 2 ++ interface/web/admin/lib/lang/tr_server_config.lng | 2 ++ interface/web/admin/server_config_edit.php | 14 ++++++++++++-- 26 files changed, 62 insertions(+), 2 deletions(-) diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index 0bcb361b14..0bd4567220 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -1,5 +1,7 @@ tform->errorMessage == '') { $server_config_array[$section] = $app->tform->encode($this->dataRecord, $section); - $server_config_str = $app->ini_parser->get_ini_string($server_config_array); + if ((! is_array($server_config_array[$section])) || count($server_config_array[$section]) == 0 ) { + $errMsg = sprintf( $app->tform->lng("server_config_error_section_not_updated"), $section ); + $app->tpl->setVar('error', $errMsg); + } else { + $server_config_str = $app->ini_parser->get_ini_string($server_config_array); - $app->db->datalogUpdate('server', array("config" => $server_config_str), 'server_id', $server_id); + if (count($server_config_array) == 0 || $server_config_str == '') { + $app->tpl->setVar('error', $app->tform->lng("server_config_error_not_updated")); + } else { + $app->db->datalogUpdate('server', array("config" => $server_config_str), 'server_id', $server_id); + $app->tpl->setVar('error', ''); + } + } } else { $app->error('Security breach!'); } -- GitLab From 0aa4f2de070303b6daf24e8f72da41cd7f92462d Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 2 Jul 2020 16:22:48 +0200 Subject: [PATCH 0268/1368] Use correct PHP-FPM sockets in apps vhost on Ubuntu 20.04. --- server/plugins-available/apps_vhost_plugin.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index 4d0866d1de..7fb5503802 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -184,6 +184,7 @@ class apps_vhost_plugin { || file_exists('/var/run/php/php7.1-fpm.sock') || file_exists('/var/run/php/php7.2-fpm.sock') || file_exists('/var/run/php/php7.3-fpm.sock') + || file_exists('/var/run/php/php7.4-fpm.sock') ){ $use_tcp = '#'; $use_socket = ''; @@ -206,6 +207,8 @@ class apps_vhost_plugin { if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); + if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); // PHP-FPM // Dont just copy over the php-fpm pool template but add some custom settings -- GitLab From 3015ec283d80e01158cd90b7ea02e24d080a06a7 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Jul 2020 13:37:27 -0600 Subject: [PATCH 0269/1368] add quota recalc to mailbox cleanup --- server/lib/classes/cron.d/500-clean_mailboxes.inc.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/lib/classes/cron.d/500-clean_mailboxes.inc.php b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php index 8617d0d76d..7e8c82da64 100755 --- a/server/lib/classes/cron.d/500-clean_mailboxes.inc.php +++ b/server/lib/classes/cron.d/500-clean_mailboxes.inc.php @@ -57,6 +57,7 @@ class cronjob_clean_mailboxes extends cronjob { $junk_names=array('Junk', 'Junk Email', 'SPAM', 'INBOX.SPAM'); $purge_cmd = 'doveadm expunge -u ? mailbox ? sentbefore '; + $recalc_cmd = 'doveadm quota recalc -u ?'; $server_id = intval($conf['server_id']); $records = $app->db->queryAllRecords("SELECT email, maildir, purge_trash_days, purge_junk_days FROM mail_user WHERE maildir_format = 'maildir' AND disableimap = 'n' AND server_id = ? AND (purge_trash_days > 0 OR purge_junk_days > 0)", $server_id); @@ -77,6 +78,7 @@ class cronjob_clean_mailboxes extends cronjob { } } } + $app->system->exec_safe($recalc_cmd, $email['email']); } } -- GitLab From 0f80900879f9f6d5e277e84cfc6c0284141290e3 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Jul 2020 13:50:05 -0600 Subject: [PATCH 0270/1368] prefer 'doveadm quota' for quota calculation if supported --- .../cron.d/100-monitor_email_quota.inc.php | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php index 8adf7c7253..01bc0ee78e 100644 --- a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php +++ b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php @@ -79,30 +79,36 @@ class cronjob_monitor_email_quota extends cronjob { if(is_array($mailboxes)) { //* with dovecot we can use doveadm instead of 'du -s' - $dovecot = false; - if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot' && is_executable('doveadm')) { - exec('doveadm quota 2>&1', $tmp_output, $tmp_retval); // with dovecot 2.2.x 'doveadm quota' is unuseable - if ($retval = 64) $dovecot = true; + $dovecotQuotaUsage = array(); + if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot') { + exec("doveadm quota get -A 2>&1", $res, $retval); + if ($retval = 64) { + foreach ($res as $v) { + $s = preg_split('/\s+/', $v); + if ($s[2] == 'STORAGE') $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + } + } } foreach($mailboxes as $mb) { $email = $mb['email']; $email_parts = explode('@', $mb['email']); $filename = $mb['maildir'].'/.quotausage'; - if(!file_exists($filename) && $dovecot) { - $app->system->exec_safe('doveadm quota recalc -u ?', $email); - } - if(file_exists($filename) && !is_link($filename)) { + if(count($dovecotQuotaUsage) > 0 && isset($dovecotQuotaUsage[$email])) { + $data[$email]['used'] = $dovecotQuotaUsage[$email]; + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); + } elseif(file_exists($filename) && !is_link($filename)) { $quotafile = file($filename); preg_match('/storage.*?([0-9]+)/s', implode('',$quotafile), $storage_value); $data[$email]['used'] = $storage_value[1]; - $app->log("Mail storage $email: " . $storage_value[1], LOGLEVEL_DEBUG); + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); unset($quotafile); } else { $app->system->exec_safe('du -s ?', $mb['maildir']); $out = $app->system->last_exec_out(); $parts = explode(' ', $out[0]); $data[$email]['used'] = intval($parts[0])*1024; + $app->log("Mail storage $email: " . $data[$email]['used'], LOGLEVEL_DEBUG); unset($out); unset($parts); } @@ -110,6 +116,7 @@ class cronjob_monitor_email_quota extends cronjob { } unset($mailboxes); + unset($dovecotQuotaUsage); //* Dovecot quota check Courier in progress lathama@gmail.com /* @@ -132,8 +139,8 @@ class cronjob_monitor_email_quota extends cronjob { $res['state'] = $state; /* - * Insert the data into the database - */ + * Insert the data into the database + */ $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' . 'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)'; $app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']); -- GitLab From a4ae330f8720049534997a394846acd32f416743 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Jul 2020 17:45:33 -0600 Subject: [PATCH 0271/1368] handle doveadm quota output from different versions --- server/lib/classes/cron.d/100-monitor_email_quota.inc.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php index 01bc0ee78e..40736a7bac 100644 --- a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php +++ b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php @@ -85,7 +85,11 @@ class cronjob_monitor_email_quota extends cronjob { if ($retval = 64) { foreach ($res as $v) { $s = preg_split('/\s+/', $v); - if ($s[2] == 'STORAGE') $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + if ($s[2] == 'STORAGE') { + $dovecotQuotaUsage[$s[0]] = $s[3] * 1024; // doveadm output is in kB + } elseif ($s[3] == 'STORAGE') { + $dovecotQuotaUsage[$s[0]] = $s[4] * 1024; // doveadm output is in kB + } } } } -- GitLab From a219931738ffc4933406f643a60bd68b1df2ded9 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 3 Jul 2020 15:46:39 +0200 Subject: [PATCH 0272/1368] Revert "Improved cron debug script" This reverts commit b34b1ad5bbc8d75db927116b517e6a23761e42bb. Fixes #5657 --- server/cron_debug.php | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/server/cron_debug.php b/server/cron_debug.php index fbf59ebc26..74065f02c4 100644 --- a/server/cron_debug.php +++ b/server/cron_debug.php @@ -39,25 +39,20 @@ ini_set('error_reporting', E_ALL & ~E_NOTICE); $conf['server_id'] = intval($conf['server_id']); // Load required base-classes -$app->uses('ini_parser,file,services,getconf,system,cron,functions'); +$app->uses('modules,plugins,ini_parser,file,services,getconf,system,cron,functions'); $app->load('libdatetime,cronjob'); // Path settings $path = SCRIPT_PATH . '/lib/classes/cron.d'; //** Get commandline options -$cmd_opt = getopt('', array('cronjob::', 'force', 'firstrun')); +$cmd_opt = getopt('', array('cronjob::')); if(isset($cmd_opt['cronjob']) && is_file($path.'/'.$cmd_opt['cronjob'])) { // Cronjob that shell be run $cronjob_file = $cmd_opt['cronjob']; } else { - echo "Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php [--force] [--firstrun]\n" ; - echo "Available cronjobs:\n"; - foreach(glob($path.'/*-*.inc.php') as $cronjob) { - echo basename($cronjob)."\n"; - } - die(); + die('Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php'); } // Load and run the cronjob @@ -66,20 +61,8 @@ if(preg_match('/^\d+\-(.*)$/', $name, $match)) $name = $match[1]; // strip numer include $path . '/' . $cronjob_file; $class_name = 'cronjob_' . $name; $cronjob = new $class_name(); - -if(isset($cmd_opt['force'])) { - $app->db->query("UPDATE `sys_cron` SET `running` = 0 WHERE `name` = ?", $class_name); -} - -$cronjob->onPrepare(); -$cronjob->onBeforeRun(isset($cmd_opt['firstrun'])); -if(!$cronjob->isRunning()) { - $app->db->query("UPDATE `sys_cron` SET `running` = ? WHERE `name` = ?", ($cronjob->canBeRunInParallel() !== true ? "1" : "0"), $class_name); - $cronjob->onRunJob(); - $cronjob->onAfterRun(); - $cronjob->onCompleted(); -} +$cronjob->run(true); die("finished.\n"); -?> \ No newline at end of file +?> -- GitLab From 2c65871b6038bef217863b74b0be49bac3f67eee Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sun, 5 Jul 2020 21:37:59 +0200 Subject: [PATCH 0273/1368] Fix colspan for no-result and pager, relates to !991 and #5090 --- interface/web/admin/templates/server_php_list.htm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/admin/templates/server_php_list.htm b/interface/web/admin/templates/server_php_list.htm index dd6547ba56..a2595a8474 100644 --- a/interface/web/admin/templates/server_php_list.htm +++ b/interface/web/admin/templates/server_php_list.htm @@ -48,13 +48,13 @@ - {tmpl_var name='globalsearch_noresults_text_txt'} + {tmpl_var name='globalsearch_noresults_text_txt'} - + -- GitLab From 1c85a6c76883c28614e958a27770cf22e463d919 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sun, 5 Jul 2020 21:41:27 +0200 Subject: [PATCH 0274/1368] Fix colspan for no-result and pager --- interface/web/admin/templates/server_ip_map_list.htm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/admin/templates/server_ip_map_list.htm b/interface/web/admin/templates/server_ip_map_list.htm index ea23856022..5523448c7b 100644 --- a/interface/web/admin/templates/server_ip_map_list.htm +++ b/interface/web/admin/templates/server_ip_map_list.htm @@ -38,13 +38,13 @@ - {tmpl_var name='globalsearch_noresults_text_txt'} + {tmpl_var name='globalsearch_noresults_text_txt'} - + -- GitLab From b93c35f26ff846c77b4f26a61d75403635b4d692 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 6 Jul 2020 11:58:23 +0200 Subject: [PATCH 0275/1368] Enforce email addresses to be lower case when adding an email address via remote API. --- interface/lib/classes/remote.d/mail.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php index 771698e9dc..eec5ff0718 100644 --- a/interface/lib/classes/remote.d/mail.inc.php +++ b/interface/lib/classes/remote.d/mail.inc.php @@ -205,6 +205,9 @@ class remoting_mail extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } + + // Email addresses must always be lower case + $params['email'] = strtolower($params['email']); //* Check if mail domain exists $email_parts = explode('@', $params['email']); -- GitLab From baff94e04401325bbe283a56cc3340cc57729a09 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 6 Jul 2020 17:33:29 -0600 Subject: [PATCH 0276/1368] vary CSP header for HTTP and HTTPS, and secure cookies --- install/tpl/apache_ispconfig.vhost.master | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index d8c56de22d..61e9a58859 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -89,11 +89,13 @@ NameVirtualHost *: # ISPConfig 3.1 currently requires unsafe-line for both scripts and styles, as well as unsafe-eval + Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'" Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'; upgrade-insecure-requests" Header set X-Content-Type-Options: nosniff Header set X-Frame-Options: SAMEORIGIN Header set X-XSS-Protection: "1; mode=block" - Header always edit Set-Cookie (.*) "$1; HTTPOnly; Secure" + Header always edit Set-Cookie (.*) "$1; HTTPOnly" + Header always edit Set-Cookie (.*) "$1; Secure" = 2.4.7> Header setifempty Strict-Transport-Security "max-age=15768000" -- GitLab From 6cdefbd90d16868a4ef9dbc4993c8f102ad2b923 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 8 Jul 2020 21:09:11 +0200 Subject: [PATCH 0277/1368] Update mysql-virtual_forwardings.cf.master --- install/tpl/mysql-virtual_forwardings.cf.master | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index 7d5c2e2a47..e39b129f50 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -1,9 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_forwarding -select_field = destination -where_field = source -# additional_conditions = and type != 'aliasdomain' and active = 'y' and server_id = {server_id} -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = SELECT u.email as target FROM mail_forwarding as s INNER JOIN mail_user as u ON (u.email = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND u.disabledeliver = 'n' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s WHERE s.source = '%s' AND s.type IN ('alias', 'forward') and s.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s INNER JOIN mail_forwarding as f ON (f.source = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND f.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s WHERE s.source = '@%d' AND s.type IN ('catchall') and s.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s INNER JOIN mail_forwarding as t ON (t.source = s.destination AND t.type = 'catchall') WHERE s.source = '@%d' AND s.type = 'aliasdomain' and s.active = 'y' AND t.active = 'y' AND s.server_id = {server_id} -- GitLab From 85744b5e3b1d71f963641cda1dbfa9c8130cc86b Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 9 Jul 2020 16:57:59 +0200 Subject: [PATCH 0278/1368] client_get_id error correctly describes the condition. --- interface/lib/classes/remote.d/client.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/remote.d/client.inc.php b/interface/lib/classes/remote.d/client.inc.php index 1457bf569a..57412e5e19 100644 --- a/interface/lib/classes/remote.d/client.inc.php +++ b/interface/lib/classes/remote.d/client.inc.php @@ -108,7 +108,7 @@ class remoting_client extends remoting { if(isset($rec['client_id'])) { return $app->functions->intval($rec['client_id']); } else { - throw new SoapFault('no_client_found', 'There is no sysuser account for this client ID.'); + throw new SoapFault('no_client_found', 'There is no sys_user account with this userid.'); return false; } -- GitLab From d822230b8c0a58278cc6eea2d0e7b9f9de6b7f8d Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 9 Jul 2020 21:14:55 +0200 Subject: [PATCH 0279/1368] Make the logged line 'finished' a bit more informative and easier to identify. --- server/cron.php | 2 +- server/cron_debug.php | 2 +- server/server.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/cron.php b/server/cron.php index ef13d06e2f..d21dcfa8ae 100644 --- a/server/cron.php +++ b/server/cron.php @@ -128,6 +128,6 @@ $app->services->processDelayedActions(); @unlink($conf['temppath'] . $conf['fs_div'] . '.ispconfig_cron_lock'); $app->log('Remove Lock: ' . $conf['temppath'] . $conf['fs_div'] . '.ispconfig_cron_lock', LOGLEVEL_DEBUG); -if($conf['log_priority'] <= LOGLEVEL_DEBUG) die("finished.\n"); +if($conf['log_priority'] <= LOGLEVEL_DEBUG) die("finished cron run."); ?> diff --git a/server/cron_debug.php b/server/cron_debug.php index 74065f02c4..de561577c8 100644 --- a/server/cron_debug.php +++ b/server/cron_debug.php @@ -63,6 +63,6 @@ $class_name = 'cronjob_' . $name; $cronjob = new $class_name(); $cronjob->run(true); -die("finished.\n"); +die("finished cron debug.\n"); ?> diff --git a/server/server.php b/server/server.php index 106d3edc65..164451babe 100644 --- a/server/server.php +++ b/server/server.php @@ -217,5 +217,5 @@ if ($needStartCore) { $app->log('Remove Lock: ' . $conf['temppath'] . $conf['fs_div'] . '.ispconfig_lock', LOGLEVEL_DEBUG); -die("finished.\n"); +die("finished server.php.\n"); ?> -- GitLab From 62006400e54f3338298c64196e2fa40b3e30701e Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 9 Jul 2020 21:25:27 +0200 Subject: [PATCH 0280/1368] Remove trailing whitespace ... logged as two blank lines every minute to cron.log --- server/plugins-available/backup_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/backup_plugin.inc.php b/server/plugins-available/backup_plugin.inc.php index 607491216d..53b8d6d288 100644 --- a/server/plugins-available/backup_plugin.inc.php +++ b/server/plugins-available/backup_plugin.inc.php @@ -321,5 +321,5 @@ class backup_plugin { } // end class -?> +?> -- GitLab From 3b146a40df9226dadd392f6d8e3d1d82d5cca681 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 9 Jul 2020 21:26:31 +0200 Subject: [PATCH 0281/1368] Redirect output, otherwise ends up polluting cron.log --- server/lib/classes/cron.d/100-monitor_iptables.inc.php | 4 ++-- server/plugins-available/backup_plugin.inc.php | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_iptables.inc.php b/server/lib/classes/cron.d/100-monitor_iptables.inc.php index 1ad11d9ecc..2bf9404735 100644 --- a/server/lib/classes/cron.d/100-monitor_iptables.inc.php +++ b/server/lib/classes/cron.d/100-monitor_iptables.inc.php @@ -67,7 +67,7 @@ class cronjob_monitor_iptables extends cronjob { $type = 'iptables_rules'; /* This monitoring is only available if fail2ban is installed */ - system('which iptables', $retval); // Debian, Ubuntu, Fedora + system('which iptables > /dev/null', $retval); // Debian, Ubuntu, Fedora if ($retval === 0) { /* Get the data of the log */ $data['output'] = '

iptables -S (ipv4)

'.shell_exec('iptables -S 2>/dev/null'); @@ -83,7 +83,7 @@ class cronjob_monitor_iptables extends cronjob { /* This monitoring is only available if fail2ban is installed */ - system('which ip6tables', $retval); // Debian, Ubuntu, Fedora + system('which ip6tables > /dev/null', $retval); // Debian, Ubuntu, Fedora if ($retval === 0) { /* Get the data of the log */ $data['output'] .= '

ip6tables -S (ipv6)

'.shell_exec('ip6tables -S 2>/dev/null'); diff --git a/server/plugins-available/backup_plugin.inc.php b/server/plugins-available/backup_plugin.inc.php index 53b8d6d288..ffbc5a6b79 100644 --- a/server/plugins-available/backup_plugin.inc.php +++ b/server/plugins-available/backup_plugin.inc.php @@ -322,4 +322,3 @@ class backup_plugin { } // end class ?> - -- GitLab From 323b2d4a2495a1cbcfc5c69d8efd97c84fa344e9 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 9 Jul 2020 21:43:53 +0200 Subject: [PATCH 0282/1368] Cleanup old commented code --- server/lib/classes/cron.d/150-awstats.inc.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/lib/classes/cron.d/150-awstats.inc.php b/server/lib/classes/cron.d/150-awstats.inc.php index 4ba286ea1a..891919cb02 100644 --- a/server/lib/classes/cron.d/150-awstats.inc.php +++ b/server/lib/classes/cron.d/150-awstats.inc.php @@ -60,7 +60,6 @@ class cronjob_awstats extends cronjob { $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); foreach($records as $rec) { - //$yesterday = date('Ymd',time() - 86400); $yesterday = date('Ymd', strtotime("-1 day", time())); $log_folder = 'log'; @@ -135,9 +134,6 @@ class cronjob_awstats extends cronjob { } } - // awstats_buildstaticpages.pl -update -config=mydomain.com -lang=en -dir=/var/www/domain.com/'.$web_folder.'/stats -awstatsprog=/path/to/awstats.pl - // $command = "$awstats_buildstaticpages_pl -update -config='$domain' -lang=".$conf['language']." -dir='$statsdir' -awstatsprog='$awstats_pl'"; - $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -lang=' . escapeshellarg($conf['language']) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl); if (date("d") == 2) { -- GitLab From 3ebca3232b2daa1f2863732dffe9bfb90d17d328 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 11:43:39 +0200 Subject: [PATCH 0283/1368] Refactor to use is_installed helper function --- server/lib/classes/cron.d/100-monitor_fail2ban.inc.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php b/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php index 5c4ba80561..a25d5c7106 100644 --- a/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php +++ b/server/lib/classes/cron.d/100-monitor_fail2ban.inc.php @@ -67,10 +67,8 @@ class cronjob_monitor_fail2ban extends cronjob { $type = 'log_fail2ban'; /* This monitoring is only available if fail2ban is installed */ - system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora - if ($retval !== 0) - system('which fail2ban', $retval); // CentOS - if ($retval === 0) { + if ($app->system->is_installed('fail2ban-client') // Debian, Ubuntu, Fedora + || $app->system->is_installed('fail2ban')) { // CentOS /* Get the data of the log */ $data = $this->_tools->_getLogData($type); -- GitLab From 877a0ee9ef4fee951b5ad016ae6c16291d27b103 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 12:03:33 +0200 Subject: [PATCH 0284/1368] Refactor to use is_installed helper function --- .../lib/classes/cron.d/100-monitor_iptables.inc.php | 6 ++---- server/lib/classes/cron.d/100-monitor_raid.inc.php | 12 ++++-------- .../lib/classes/cron.d/100-monitor_rkhunter.inc.php | 3 +-- server/lib/classes/cron.d/500-backup_mail.inc.php | 3 +-- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_iptables.inc.php b/server/lib/classes/cron.d/100-monitor_iptables.inc.php index 2bf9404735..cff0a73ac3 100644 --- a/server/lib/classes/cron.d/100-monitor_iptables.inc.php +++ b/server/lib/classes/cron.d/100-monitor_iptables.inc.php @@ -67,8 +67,7 @@ class cronjob_monitor_iptables extends cronjob { $type = 'iptables_rules'; /* This monitoring is only available if fail2ban is installed */ - system('which iptables > /dev/null', $retval); // Debian, Ubuntu, Fedora - if ($retval === 0) { + if ($app->system->is_installed('iptables')) { /* Get the data of the log */ $data['output'] = '

iptables -S (ipv4)

'.shell_exec('iptables -S 2>/dev/null'); @@ -83,8 +82,7 @@ class cronjob_monitor_iptables extends cronjob { /* This monitoring is only available if fail2ban is installed */ - system('which ip6tables > /dev/null', $retval); // Debian, Ubuntu, Fedora - if ($retval === 0) { + if ($app->system->is_installed('ip6tables')) { /* Get the data of the log */ $data['output'] .= '

ip6tables -S (ipv6)

'.shell_exec('ip6tables -S 2>/dev/null'); diff --git a/server/lib/classes/cron.d/100-monitor_raid.inc.php b/server/lib/classes/cron.d/100-monitor_raid.inc.php index d1a9a53455..7148aee1c8 100644 --- a/server/lib/classes/cron.d/100-monitor_raid.inc.php +++ b/server/lib/classes/cron.d/100-monitor_raid.inc.php @@ -126,8 +126,7 @@ class cronjob_monitor_raid extends cronjob { * Check, if we have mpt-status installed (LSIsoftware-raid) */ if (file_exists('/proc/mpt/summary')) { - system('which mpt-status', $retval); - if ($retval === 0) { + if ($app->system->is_installed('mpt-status')) { /* * Fetch the output */ @@ -174,8 +173,7 @@ class cronjob_monitor_raid extends cronjob { /* * 3ware Controller */ - system('which tw_cli', $retval); - if($retval === 0) { + if($app->system->is_installed('tw_cli')) { // TYPOWORX FIX | Determine Controler-ID $availableControlers = shell_exec('tw_cli info | grep -Eo "c[0-9]+"'); @@ -232,8 +230,7 @@ class cronjob_monitor_raid extends cronjob { /* * HP Proliant */ - system('which hpacucli', $retval); - if($retval === 0) { + if($app->system->is_installed('hpacucli')) { $state = 'ok'; $data['output'] = shell_exec('/usr/sbin/hpacucli ctrl all show config'); $tmp = explode("\n", $data['output']); @@ -298,8 +295,7 @@ class cronjob_monitor_raid extends cronjob { /* * Adaptec-RAID */ - system('which arcconf', $retval); - if($retval === 0) { + if($app->system->is_installed('arcconf')) { $state = 'ok'; $data['output'] = shell_exec('arcconf GETCONFIG 1 LD'); if(is_array($data['output'])) { diff --git a/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php b/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php index 43071b8387..5efb9420ec 100644 --- a/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php +++ b/server/lib/classes/cron.d/100-monitor_rkhunter.inc.php @@ -67,8 +67,7 @@ class cronjob_monitor_rkhunter extends cronjob { $type = 'rkhunter'; /* This monitoring is only available if rkhunter is installed */ - system('which rkhunter', $retval); - if ($retval === 0) { + if ($app->system->is_installed('rkhunter')) { /* * Fetch the output */ diff --git a/server/lib/classes/cron.d/500-backup_mail.inc.php b/server/lib/classes/cron.d/500-backup_mail.inc.php index 2b1fd58177..f631f0043c 100644 --- a/server/lib/classes/cron.d/500-backup_mail.inc.php +++ b/server/lib/classes/cron.d/500-backup_mail.inc.php @@ -78,8 +78,7 @@ class cronjob_backup_mail extends cronjob { } else { chmod($backup_dir, $backup_dir_permissions); } - system('which pigz > /dev/null', $ret); - if($ret === 0) { + if($app->system->is_installed('pigz')) { $use_pigz = true; } else { $use_pigz = false; -- GitLab From 5d0df4e50ce76b517cba0879040b540e5b2d434e Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 12:04:38 +0200 Subject: [PATCH 0285/1368] Refactor to use is_installed helper function --- server/lib/classes/cron.d/100-monitor_raid.inc.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server/lib/classes/cron.d/100-monitor_raid.inc.php b/server/lib/classes/cron.d/100-monitor_raid.inc.php index 7148aee1c8..80ab29b6c3 100644 --- a/server/lib/classes/cron.d/100-monitor_raid.inc.php +++ b/server/lib/classes/cron.d/100-monitor_raid.inc.php @@ -275,10 +275,14 @@ class cronjob_monitor_raid extends cronjob { /* * LSI MegaRaid */ - system('which megacli', $retval); - system('which megacli64', $retval64); - if($retval === 0 || $retval64 === 0) { - $binary=@($retval === 0)?'megacli':'megacli64'; + $binary = FALSE; + if ($app->system->is_installed('megacli')) { + $binary = 'megacli'; + } + if ($app->system->is_installed('megacli64')) { + $binary = 'megacli64'; + } + if($binary) { $state = 'ok'; $data['output'] = shell_exec($binary.' -LDInfo -Lall -aAll -NoLog'); if (strpos($data['output'], 'Optimal') !== false) { -- GitLab From 3b8f57584e0b9f5523cca1e064df2d0c1318b215 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 4 Jun 2020 17:47:33 -0600 Subject: [PATCH 0286/1368] migrate legacy postfix mysql query interface to "new" interface --- install/tpl/mysql-virtual_client.cf.master | 7 ++----- install/tpl/mysql-virtual_domains.cf.master | 7 ++----- .../tpl/mysql-virtual_email2email.cf.master | 9 ++++----- .../tpl/mysql-virtual_forwardings.cf.master | 18 +++++++++++++++++- install/tpl/mysql-virtual_gids.cf.master | 7 ++----- install/tpl/mysql-virtual_mailboxes.cf.master | 5 +---- install/tpl/mysql-virtual_outgoing_bcc.cf | 8 -------- .../tpl/mysql-virtual_outgoing_bcc.cf.master | 7 ++----- .../mysql-virtual_policy_greylist.cf.master | 3 +-- install/tpl/mysql-virtual_recipient.cf.master | 7 ++----- .../tpl/mysql-virtual_relaydomains.cf.master | 7 ++----- .../mysql-virtual_relayrecipientmaps.cf.master | 7 ++----- install/tpl/mysql-virtual_sender.cf.master | 7 ++----- .../mysql-virtual_sender_login_maps.cf.master | 2 +- install/tpl/mysql-virtual_transports.cf.master | 7 ++----- install/tpl/mysql-virtual_uids.cf.master | 5 +---- 16 files changed, 43 insertions(+), 70 deletions(-) delete mode 100644 install/tpl/mysql-virtual_outgoing_bcc.cf diff --git a/install/tpl/mysql-virtual_client.cf.master b/install/tpl/mysql-virtual_client.cf.master index bad0cb9655..106b647e4a 100644 --- a/install/tpl/mysql-virtual_client.cf.master +++ b/install/tpl/mysql-virtual_client.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_access -select_field = access -where_field = source -additional_conditions = and type = 'client' and active = 'y' -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_access where source = '%s' and type = 'client' and active = 'y' diff --git a/install/tpl/mysql-virtual_domains.cf.master b/install/tpl/mysql-virtual_domains.cf.master index 5b711422f2..0d1793a95a 100644 --- a/install/tpl/mysql-virtual_domains.cf.master +++ b/install/tpl/mysql-virtual_domains.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_domain -select_field = domain -where_field = domain -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select domain from mail_domain where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_email2email.cf.master b/install/tpl/mysql-virtual_email2email.cf.master index e18ef2407e..68d7f70ba9 100644 --- a/install/tpl/mysql-virtual_email2email.cf.master +++ b/install/tpl/mysql-virtual_email2email.cf.master @@ -1,8 +1,7 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = email -where_field = email -additional_conditions = and postfix = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select email from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'n' and server_id = {server_id} + union + select cc as email from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index e39b129f50..818cac07bc 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -2,4 +2,20 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT u.email as target FROM mail_forwarding as s INNER JOIN mail_user as u ON (u.email = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND u.disabledeliver = 'n' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s WHERE s.source = '%s' AND s.type IN ('alias', 'forward') and s.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s INNER JOIN mail_forwarding as f ON (f.source = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND f.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s WHERE s.source = '@%d' AND s.type IN ('catchall') and s.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s INNER JOIN mail_forwarding as t ON (t.source = s.destination AND t.type = 'catchall') WHERE s.source = '@%d' AND s.type = 'aliasdomain' and s.active = 'y' AND t.active = 'y' AND s.server_id = {server_id} +query = SELECT u.email as target FROM mail_forwarding as s + INNER JOIN mail_user as u ON (u.email = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) + WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND u.disabledeliver = 'n' AND s.server_id = {server_id} + UNION + SELECT s.destination as target FROM mail_forwarding as s + WHERE s.source = '%s' AND s.type IN ('alias', 'forward') and s.active = 'y' AND s.server_id = {server_id} + UNION + SELECT s.destination as target FROM mail_forwarding as s + INNER JOIN mail_forwarding as f ON (f.source = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) + WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND f.active = 'y' AND s.server_id = {server_id} + UNION + SELECT s.destination as target FROM mail_forwarding as s + WHERE s.source = '@%d' AND s.type IN ('catchall') and s.active = 'y' AND s.server_id = {server_id} + UNION + SELECT s.destination as target FROM mail_forwarding as s + INNER JOIN mail_forwarding as t ON (t.source = s.destination AND t.type = 'catchall') + WHERE s.source = '@%d' AND s.type = 'aliasdomain' and s.active = 'y' AND t.active = 'y' AND s.server_id = {server_id} diff --git a/install/tpl/mysql-virtual_gids.cf.master b/install/tpl/mysql-virtual_gids.cf.master index 7c7d995fc9..5611b935dd 100644 --- a/install/tpl/mysql-virtual_gids.cf.master +++ b/install/tpl/mysql-virtual_gids.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = gid -where_field = email -additional_conditions = and postfix = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select gid from mail_user where email = '%s' and postfix = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_mailboxes.cf.master b/install/tpl/mysql-virtual_mailboxes.cf.master index 2fe47bbdf5..97825f9ffc 100644 --- a/install/tpl/mysql-virtual_mailboxes.cf.master +++ b/install/tpl/mysql-virtual_mailboxes.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') -where_field = login -additional_conditions = and postfix = 'y' and server_id = {server_id} hosts = {mysql_server_ip} +query = select CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') from mail_user where login = '%s' and postfix = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf b/install/tpl/mysql-virtual_outgoing_bcc.cf deleted file mode 100644 index 78fca41a2f..0000000000 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf +++ /dev/null @@ -1,8 +0,0 @@ -user = {mysql_server_ispconfig_user} -password = {mysql_server_ispconfig_password} -dbname = {mysql_server_database} -table = mail_user -select_field = sender_cc -where_field = email -additional_conditions = and postfix = 'y' and disabledeliver = 'n' and disables$ -hosts = {mysql_server_ip} \ No newline at end of file diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index 53afa53106..9554847a9f 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = sender_cc -where_field = email -additional_conditions = and postfix = 'y' and disabledeliver = 'n' and disablesmtp = 'n' and sender_cc != '' -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select sender_cc from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'n' and disablesmtp = 'n' and sender_cc != '' diff --git a/install/tpl/mysql-virtual_policy_greylist.cf.master b/install/tpl/mysql-virtual_policy_greylist.cf.master index 55378b29ca..6ad282324e 100644 --- a/install/tpl/mysql-virtual_policy_greylist.cf.master +++ b/install/tpl/mysql-virtual_policy_greylist.cf.master @@ -1,10 +1,9 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} +hosts = {mysql_server_ip} query = SELECT 'greylisting' FROM (SELECT `greylisting`, 1 as `prio` FROM `mail_user` WHERE `server_id` = {server_id} AND `email` = '%s' UNION SELECT `greylisting`, 2 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '%s' UNION SELECT `greylisting`, 3 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '@%d' ORDER BY `prio` ASC LIMIT 1) as rules WHERE rules.greylisting = 'y' - -hosts = {mysql_server_ip} diff --git a/install/tpl/mysql-virtual_recipient.cf.master b/install/tpl/mysql-virtual_recipient.cf.master index 49024f3ebd..2099966df2 100644 --- a/install/tpl/mysql-virtual_recipient.cf.master +++ b/install/tpl/mysql-virtual_recipient.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_access -select_field = access -where_field = source -additional_conditions = and type = 'recipient' and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_access where source = '%s' and type = 'recipient' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_relaydomains.cf.master b/install/tpl/mysql-virtual_relaydomains.cf.master index fb7bec1a3a..5ce2db6954 100644 --- a/install/tpl/mysql-virtual_relaydomains.cf.master +++ b/install/tpl/mysql-virtual_relaydomains.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_transport -select_field = domain -where_field = domain -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select domain from mail_transport where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_relayrecipientmaps.cf.master b/install/tpl/mysql-virtual_relayrecipientmaps.cf.master index a6304fe323..ea67220215 100644 --- a/install/tpl/mysql-virtual_relayrecipientmaps.cf.master +++ b/install/tpl/mysql-virtual_relayrecipientmaps.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_relay_recipient -select_field = access -where_field = source -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_relay_recipient where source = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_sender.cf.master b/install/tpl/mysql-virtual_sender.cf.master index 0ef634aec7..1a5c4cb877 100644 --- a/install/tpl/mysql-virtual_sender.cf.master +++ b/install/tpl/mysql-virtual_sender.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_access -select_field = access -where_field = source -additional_conditions = and type = 'sender' and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select access from mail_access where source = '%s' and type = 'sender' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_sender_login_maps.cf.master b/install/tpl/mysql-virtual_sender_login_maps.cf.master index 5b7f144f8c..b51bddc96d 100644 --- a/install/tpl/mysql-virtual_sender_login_maps.cf.master +++ b/install/tpl/mysql-virtual_sender_login_maps.cf.master @@ -1,5 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} +hosts = {mysql_server_ip} query = SELECT destination FROM mail_forwarding WHERE source = '%s' AND active = 'y' AND allow_send_as = 'y' AND server_id = {server_id} UNION SELECT email FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND server_id = {server_id}; -hosts = {mysql_server_ip} \ No newline at end of file diff --git a/install/tpl/mysql-virtual_transports.cf.master b/install/tpl/mysql-virtual_transports.cf.master index 048a7a81ac..e9585ca6cc 100644 --- a/install/tpl/mysql-virtual_transports.cf.master +++ b/install/tpl/mysql-virtual_transports.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_transport -select_field = transport -where_field = domain -additional_conditions = and active = 'y' and server_id = {server_id} -hosts = {mysql_server_ip} \ No newline at end of file +hosts = {mysql_server_ip} +query = select transport from mail_transport where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/install/tpl/mysql-virtual_uids.cf.master b/install/tpl/mysql-virtual_uids.cf.master index da3cd7c2a0..de35368c0a 100644 --- a/install/tpl/mysql-virtual_uids.cf.master +++ b/install/tpl/mysql-virtual_uids.cf.master @@ -1,8 +1,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} -table = mail_user -select_field = uid -where_field = email -additional_conditions = and postfix = 'y' and server_id = {server_id} hosts = {mysql_server_ip} +query = select uid from mail_user where email = '%s' and postfix = 'y' and server_id = {server_id} -- GitLab From 036575e8647a3853a6ab2d847b158a1b50b57301 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 5 Jun 2020 11:44:57 -0600 Subject: [PATCH 0287/1368] respect outgoing bcc for mail aliases/forwards --- install/tpl/mysql-virtual_outgoing_bcc.cf.master | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index 9554847a9f..26090bce5b 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -2,4 +2,10 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select sender_cc from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'n' and disablesmtp = 'n' and sender_cc != '' +query = SELECT sender_cc FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT u.sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} -- GitLab From 3e5ff9a0a3972a413adcd4563d5db18670b04da9 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 5 Jun 2020 14:35:18 -0600 Subject: [PATCH 0288/1368] mail_user.disabledeliver has a checkbox and controls if local delivery is performed. fixed #5011 --- .../tpl/mysql-virtual_email2email.cf.master | 6 ++--- .../mysql-virtual_policy_greylist.cf.master | 10 +++++--- .../mysql-virtual_sender_login_maps.cf.master | 4 +++- interface/web/mail/form/mail_user.tform.php | 6 +++++ interface/web/mail/lib/lang/ar_mail_user.lng | 6 ++++- .../web/mail/lib/lang/ar_mail_user_list.lng | 1 + interface/web/mail/lib/lang/bg_mail_user.lng | 6 ++++- .../web/mail/lib/lang/bg_mail_user_list.lng | 1 + interface/web/mail/lib/lang/br_mail_user.lng | 4 ++++ .../web/mail/lib/lang/br_mail_user_list.lng | 1 + interface/web/mail/lib/lang/ca_mail_user.lng | 4 ++++ .../web/mail/lib/lang/ca_mail_user_list.lng | 1 + interface/web/mail/lib/lang/cz_mail_user.lng | 4 ++++ .../web/mail/lib/lang/cz_mail_user_list.lng | 1 + interface/web/mail/lib/lang/de_mail_user.lng | 4 ++++ .../web/mail/lib/lang/de_mail_user_list.lng | 1 + interface/web/mail/lib/lang/dk_mail_user.lng | 4 ++++ .../web/mail/lib/lang/dk_mail_user_list.lng | 1 + interface/web/mail/lib/lang/el_mail_user.lng | 6 ++++- .../web/mail/lib/lang/el_mail_user_list.lng | 1 + interface/web/mail/lib/lang/en_mail_user.lng | 10 +++++--- .../web/mail/lib/lang/en_mail_user_list.lng | 23 ++++++++++--------- interface/web/mail/lib/lang/es_mail_user.lng | 4 ++++ .../web/mail/lib/lang/es_mail_user_list.lng | 1 + interface/web/mail/lib/lang/fi_mail_user.lng | 6 ++++- .../web/mail/lib/lang/fi_mail_user_list.lng | 1 + interface/web/mail/lib/lang/fr_mail_user.lng | 4 ++++ .../web/mail/lib/lang/fr_mail_user_list.lng | 1 + interface/web/mail/lib/lang/hr_mail_user.lng | 6 ++++- .../web/mail/lib/lang/hr_mail_user_list.lng | 1 + interface/web/mail/lib/lang/hu_mail_user.lng | 6 ++++- .../web/mail/lib/lang/hu_mail_user_list.lng | 1 + interface/web/mail/lib/lang/id_mail_user.lng | 6 ++++- .../web/mail/lib/lang/id_mail_user_list.lng | 1 + interface/web/mail/lib/lang/it_mail_user.lng | 4 ++++ .../web/mail/lib/lang/it_mail_user_list.lng | 1 + interface/web/mail/lib/lang/ja_mail_user.lng | 6 ++++- .../web/mail/lib/lang/ja_mail_user_list.lng | 1 + interface/web/mail/lib/lang/nl_mail_user.lng | 4 ++++ .../web/mail/lib/lang/nl_mail_user_list.lng | 1 + interface/web/mail/lib/lang/pl_mail_user.lng | 6 ++++- .../web/mail/lib/lang/pl_mail_user_list.lng | 1 + interface/web/mail/lib/lang/pt_mail_user.lng | 6 ++++- .../web/mail/lib/lang/pt_mail_user_list.lng | 1 + interface/web/mail/lib/lang/ro_mail_user.lng | 6 ++++- .../web/mail/lib/lang/ro_mail_user_list.lng | 1 + interface/web/mail/lib/lang/ru_mail_user.lng | 4 ++++ .../web/mail/lib/lang/ru_mail_user_list.lng | 1 + interface/web/mail/lib/lang/se_mail_user.lng | 6 ++++- .../web/mail/lib/lang/se_mail_user_list.lng | 1 + interface/web/mail/lib/lang/sk_mail_user.lng | 6 ++++- .../web/mail/lib/lang/sk_mail_user_list.lng | 1 + interface/web/mail/lib/lang/tr_mail_user.lng | 4 ++++ .../web/mail/lib/lang/tr_mail_user_list.lng | 1 + interface/web/mail/list/mail_user.list.php | 9 ++++++++ interface/web/mail/mail_user_edit.php | 4 ++-- .../web/mail/templates/mail_user_list.htm | 3 +++ .../mail/templates/mail_user_mailbox_edit.htm | 10 ++++++-- 58 files changed, 193 insertions(+), 38 deletions(-) diff --git a/install/tpl/mysql-virtual_email2email.cf.master b/install/tpl/mysql-virtual_email2email.cf.master index 68d7f70ba9..17e1cdf0bf 100644 --- a/install/tpl/mysql-virtual_email2email.cf.master +++ b/install/tpl/mysql-virtual_email2email.cf.master @@ -2,6 +2,6 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select email from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'n' and server_id = {server_id} - union - select cc as email from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'y' and server_id = {server_id} +query = SELECT email FROM mail_user WHERE email = '%s' AND postfix = 'y' AND disabledeliver = 'n' AND server_id = {server_id} + UNION + SELECT cc AS email FROM mail_user WHERE email = '%s' AND postfix = 'y' AND disabledeliver = 'y' AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_policy_greylist.cf.master b/install/tpl/mysql-virtual_policy_greylist.cf.master index 6ad282324e..5203b1a2ea 100644 --- a/install/tpl/mysql-virtual_policy_greylist.cf.master +++ b/install/tpl/mysql-virtual_policy_greylist.cf.master @@ -3,7 +3,11 @@ password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} query = SELECT 'greylisting' FROM - (SELECT `greylisting`, 1 as `prio` FROM `mail_user` WHERE `server_id` = {server_id} AND `email` = '%s' - UNION SELECT `greylisting`, 2 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '%s' - UNION SELECT `greylisting`, 3 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '@%d' ORDER BY `prio` ASC LIMIT 1) as rules + ( + SELECT `greylisting`, 1 as `prio` FROM `mail_user` WHERE `server_id` = {server_id} AND `email` = '%s' + UNION + SELECT `greylisting`, 2 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '%s' + UNION + SELECT `greylisting`, 3 as `prio` FROM `mail_forwarding` WHERE `server_id` = {server_id} AND `source` = '@%d' ORDER BY `prio` ASC LIMIT 1 + ) AS rules WHERE rules.greylisting = 'y' diff --git a/install/tpl/mysql-virtual_sender_login_maps.cf.master b/install/tpl/mysql-virtual_sender_login_maps.cf.master index b51bddc96d..f97229d213 100644 --- a/install/tpl/mysql-virtual_sender_login_maps.cf.master +++ b/install/tpl/mysql-virtual_sender_login_maps.cf.master @@ -2,4 +2,6 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT destination FROM mail_forwarding WHERE source = '%s' AND active = 'y' AND allow_send_as = 'y' AND server_id = {server_id} UNION SELECT email FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND server_id = {server_id}; +query = SELECT destination FROM mail_forwarding WHERE source = '%s' AND active = 'y' AND allow_send_as = 'y' AND server_id = {server_id} + UNION + SELECT email FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND server_id = {server_id}; diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 3d1a8fde7f..19c74121f4 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -292,6 +292,12 @@ $form["tabs"]['mailuser'] = array( 'default' => 'n', 'value' => array(1 => 'y', 0 => 'n') ), + 'disabledeliver' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(1 => 'y', 0 => 'n') + ), 'disableimap' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index 9d4828b557..f5a8c82de0 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -20,6 +20,7 @@ $wb['server_id_txt'] = 'Aerver_id'; $wb['password_txt'] = 'Password'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Enable Receiving'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; @@ -56,7 +57,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/ar_mail_user_list.lng b/interface/web/mail/lib/lang/ar_mail_user_list.lng index 0bb531f785..bf905ed40a 100644 --- a/interface/web/mail/lib/lang/ar_mail_user_list.lng +++ b/interface/web/mail/lib/lang/ar_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Realname'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 1b9595da42..f0b446904d 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -16,6 +16,7 @@ $wb['server_id_txt'] = 'server_id'; $wb['password_txt'] = 'парола'; $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Разреши получаване'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Разреши достъп'; $wb['policy_txt'] = 'Спам филтър'; @@ -50,7 +51,10 @@ $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/bg_mail_user_list.lng b/interface/web/mail/lib/lang/bg_mail_user_list.lng index 9ccdb51124..f761ea4f23 100644 --- a/interface/web/mail/lib/lang/bg_mail_user_list.lng +++ b/interface/web/mail/lib/lang/bg_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Истинско име'; $wb['login_txt'] = 'Вход'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 2abe1931f6..3ff0114ecd 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -24,6 +24,7 @@ $wb['password_txt'] = 'Senha'; $wb['password_click_to_set_txt'] = 'Clique para configurar'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Habilitar recebimento'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Habilitar greylist'; $wb['access_txt'] = 'Habilitar acesso'; $wb['policy_txt'] = 'Filtros anti-spam'; @@ -31,6 +32,9 @@ $wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'O limite de contas de e-mail para esta conta foi alcançado.'; $wb['limit_mailquota_txt'] = 'O limite de tamanho para as contas de e-mails foi alcançado. O espaço disponível em MB é'; $wb['disablesmtp_txt'] = 'Desabilitar SMTP (envio)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['disableimap_txt'] = 'Desabilitar IMAP'; $wb['disablepop3_txt'] = 'Desabilitar POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Já existe um alias ou encaminhamento para este endereço de e-mail.'; diff --git a/interface/web/mail/lib/lang/br_mail_user_list.lng b/interface/web/mail/lib/lang/br_mail_user_list.lng index 3cd9c51740..01db690515 100644 --- a/interface/web/mail/lib/lang/br_mail_user_list.lng +++ b/interface/web/mail/lib/lang/br_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Nome real'; $wb['login_txt'] = 'acesso'; $wb['postfix_txt'] = 'Recebendo'; $wb['disablesmtp_txt'] = 'SMTP (envio)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 08c9bc78ec..2c63fa3353 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -16,6 +16,7 @@ $wb['server_id_txt'] = 'ID Serveur'; $wb['password_txt'] = 'Mot de passe'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['access_txt'] = 'Activer l\'accès'; $wb['policy_txt'] = 'Filtre antispam'; $wb['inherit_policy'] = '- Inherit domain setting -'; @@ -48,6 +49,9 @@ $wb['repeat_password_txt'] = 'Retaper le mot de passe'; $wb['password_mismatch_txt'] = 'Les mots de passe ne correspondent pas'; $wb['password_match_txt'] = 'Les mots de passe correspondent.'; $wb['disablesmtp_txt'] = 'Désactiver SMTP (envoi)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Séparer chaque adresses par une virgule)'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; diff --git a/interface/web/mail/lib/lang/ca_mail_user_list.lng b/interface/web/mail/lib/lang/ca_mail_user_list.lng index c3b79e38be..8d6ae9c30e 100644 --- a/interface/web/mail/lib/lang/ca_mail_user_list.lng +++ b/interface/web/mail/lib/lang/ca_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Nom véritable'; $wb['login_txt'] = 'Nom d\'utilisateur'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index fb09f0c0a0..ca113dc74c 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -20,6 +20,7 @@ $wb['server_id_txt'] = 'Server_id'; $wb['password_txt'] = 'Heslo'; $wb['maildir_txt'] = 'E-mailový adresář'; $wb['postfix_txt'] = 'Povolit příjem'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['access_txt'] = 'Povolit přístup'; $wb['policy_txt'] = 'Spamový filtr'; $wb['inherit_policy'] = '- Inherit domain setting -'; @@ -50,6 +51,9 @@ $wb['password_match_txt'] = 'Hesla se shodují.'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Při posílání kopií na více e-mailových adres, oddělte čárkami.)'; $wb['disablesmtp_txt'] = 'Zakázat SMTP (pouze odesílání)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['greylisting_txt'] = 'Povolit greylisting'; $wb['sender_cc_txt'] = 'Odeslat odchozí kopii na'; diff --git a/interface/web/mail/lib/lang/cz_mail_user_list.lng b/interface/web/mail/lib/lang/cz_mail_user_list.lng index e4e2241599..dcca69d8fe 100644 --- a/interface/web/mail/lib/lang/cz_mail_user_list.lng +++ b/interface/web/mail/lib/lang/cz_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Skutečný název'; $wb['login_txt'] = 'Přihlášení'; $wb['postfix_txt'] = 'Příjem'; $wb['disablesmtp_txt'] = 'SMTP (odesílání)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index e653fbe288..61b933d73a 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -17,6 +17,7 @@ $wb['server_id_txt'] = 'Server ID'; $wb['password_txt'] = 'Passwort'; $wb['maildir_txt'] = 'E-Mail Verzeichnis'; $wb['postfix_txt'] = 'Aktiviere Empfang'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Aktiviere Greylisting'; $wb['access_txt'] = 'Aktiviere Zugriff'; $wb['policy_txt'] = 'Spamfilter'; @@ -24,6 +25,9 @@ $wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Die maximale Anzahl an E-Mailkonten für Ihr Konto wurde erreicht.'; $wb['limit_mailquota_txt'] = 'Der maximale Speicherplatz für Ihr E-Mail Konto wurde erreicht. Der maximal verfügbare Speicher in MB ist'; $wb['disablesmtp_txt'] = 'SMTP (Mailversand) deaktivieren'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['disableimap_txt'] = 'IMAP deaktivieren'; $wb['disablepop3_txt'] = 'POP3 deaktivieren'; $wb['password_strength_txt'] = 'Passwortkomplexität'; diff --git a/interface/web/mail/lib/lang/de_mail_user_list.lng b/interface/web/mail/lib/lang/de_mail_user_list.lng index 5eeff280c2..255b25612f 100644 --- a/interface/web/mail/lib/lang/de_mail_user_list.lng +++ b/interface/web/mail/lib/lang/de_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Realname'; $wb['login_txt'] = 'Anmelden'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index 34bf076359..84b7744874 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -22,12 +22,16 @@ $wb['server_id_txt'] = 'Server ID'; $wb['password_txt'] = 'Adgangskode'; $wb['maildir_txt'] = 'Mailmappe'; $wb['postfix_txt'] = 'Aktiver modtagelse'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['access_txt'] = 'Aktiver adgang'; $wb['policy_txt'] = 'Spamfilter'; $wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Max. antal af mailbokse for din konto er nået.'; $wb['limit_mailquota_txt'] = 'Max. plads for postkasser er nået. Max. tilgængelig plads i MB er'; $wb['disablesmtp_txt'] = 'Deaktiver SMTP (afsending)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['disableimap_txt'] = 'Deaktiver IMAP'; $wb['disablepop3_txt'] = 'Deaktiver POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Der er allerede et alias eller forward for denne e-mail adresse.'; diff --git a/interface/web/mail/lib/lang/dk_mail_user_list.lng b/interface/web/mail/lib/lang/dk_mail_user_list.lng index ac07bb92b3..fc3afb7c46 100644 --- a/interface/web/mail/lib/lang/dk_mail_user_list.lng +++ b/interface/web/mail/lib/lang/dk_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Navn'; $wb['login_txt'] = 'Log ind'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index 76c266d591..1d15de986b 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -20,6 +20,7 @@ $wb['server_id_txt'] = 'Aerver_id'; $wb['password_txt'] = 'Συνθηματικό'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Ενεργοποίηση Λήψης'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Ενεργοποίηση Πρόσβασης'; $wb['policy_txt'] = 'Φίλτρο Spam'; @@ -48,7 +49,10 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; diff --git a/interface/web/mail/lib/lang/el_mail_user_list.lng b/interface/web/mail/lib/lang/el_mail_user_list.lng index 98cf9c200d..4a53225186 100644 --- a/interface/web/mail/lib/lang/el_mail_user_list.lng +++ b/interface/web/mail/lib/lang/el_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Πραγματικό Όνομα'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 69ac0a00a9..7307a77379 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -23,19 +23,23 @@ $wb["server_id_txt"] = 'Aerver_id'; $wb["password_txt"] = 'Password'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb["maildir_txt"] = 'Maildir'; -$wb["postfix_txt"] = 'Enable receiving'; +$wb['postfix_txt'] = 'Enable receiving'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb["access_txt"] = 'Enable access'; $wb["policy_txt"] = 'Spamfilter'; $wb['inherit_policy'] = '- Inherit domain setting -'; $wb["limit_mailbox_txt"] = 'The max. number of mailboxes for your account is reached.'; $wb["limit_mailquota_txt"] = 'The max space for mailboxes is reached. The max. available space in MB is'; -$wb["disablesmtp_txt"] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb["disableimap_txt"] = 'Disable IMAP'; $wb["disablepop3_txt"] = 'Disable POP3'; $wb["duplicate_alias_or_forward_txt"] = 'There is already an alias or forward with this email address.'; $wb["quota_error_value"] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; -$wb["move_junk_txt"] = 'Move Spam Emails to Junk directory.'; +$wb["move_junk_txt"] = 'Move Spam Emails to Junk folder.'; $wb["name_txt"] = 'Name'; $wb["name_optional_txt"] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/en_mail_user_list.lng b/interface/web/mail/lib/lang/en_mail_user_list.lng index c7b0a43ad2..bf905ed40a 100644 --- a/interface/web/mail/lib/lang/en_mail_user_list.lng +++ b/interface/web/mail/lib/lang/en_mail_user_list.lng @@ -1,12 +1,13 @@ \ No newline at end of file +$wb['list_head_txt'] = 'Mailbox'; +$wb['email_txt'] = 'Email'; +$wb['autoresponder_txt'] = 'Autoresponder'; +$wb['add_new_record_txt'] = 'Add new Mailbox'; +$wb['name_txt'] = 'Realname'; +$wb['login_txt'] = 'Login'; +$wb['postfix_txt'] = 'Receiving'; +$wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; +$wb['disableimap_txt'] = 'IMAP'; +$wb['disablepop3_txt'] = 'POP3'; +?> diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index be329c304a..f22e051031 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -22,6 +22,9 @@ $wb['daily_backup_txt'] = 'Diariamente'; $wb['disableimap_txt'] = 'Deshabilitar IMAP'; $wb['disablepop3_txt'] = 'Deshabilitar POP3'; $wb['disablesmtp_txt'] = 'Deshabilitar SMTP (envío)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['domain_txt'] = 'Dominio'; $wb['duplicate_alias_or_forward_txt'] = 'Ya existe un alias o reenvío con esta dirección de correo.'; $wb['email_error_isascii'] = 'Por favor, no use caracteres unicode especiales en su contraseña. Esto puede conllevar a errores en su cliente de correo.'; @@ -52,6 +55,7 @@ $wb['password_strength_txt'] = 'Seguridad de la contraseña'; $wb['password_txt'] = 'Contraseña'; $wb['policy_txt'] = 'Filtro de spam'; $wb['postfix_txt'] = 'Habilitar recepción'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['quota_error_isint'] = 'La cuota debe ser un número.'; $wb['quota_error_value'] = 'La cuota es inválida. Los valores permitidos son: 0 para cuota ilimitada o una cantidad superior a 1'; $wb['quota_txt'] = 'Cuota (0 para ilimitada)'; diff --git a/interface/web/mail/lib/lang/es_mail_user_list.lng b/interface/web/mail/lib/lang/es_mail_user_list.lng index 43a09d2808..19a2129307 100644 --- a/interface/web/mail/lib/lang/es_mail_user_list.lng +++ b/interface/web/mail/lib/lang/es_mail_user_list.lng @@ -4,6 +4,7 @@ $wb['autoresponder_txt'] = 'Auto respuesta'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; $wb['disablesmtp_txt'] = 'SMTP (envío)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['email_txt'] = 'Correo'; $wb['list_head_txt'] = 'Buzón'; $wb['login_txt'] = 'Entrar'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 45ea1d9b8b..549f4048a6 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -15,6 +15,7 @@ $wb['server_id_txt'] = 'Palvelimen tunnus'; $wb['password_txt'] = 'Salasana'; $wb['maildir_txt'] = 'Postikansio'; $wb['postfix_txt'] = 'Salli vastaanotto'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Salli yhteys'; $wb['policy_txt'] = 'Roskapostisuodatin'; @@ -56,7 +57,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/fi_mail_user_list.lng b/interface/web/mail/lib/lang/fi_mail_user_list.lng index ee3f2cec45..fefb8b0b79 100644 --- a/interface/web/mail/lib/lang/fi_mail_user_list.lng +++ b/interface/web/mail/lib/lang/fi_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Oikea nimi'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index 8df58233a3..2f131cb31d 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -16,6 +16,7 @@ $wb['server_id_txt'] = 'ID Serveur'; $wb['password_txt'] = 'Mot de passe'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Activer la réception'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['access_txt'] = 'Activer l’accès'; $wb['policy_txt'] = 'Filtre antispam'; $wb['inherit_policy'] = '- Inherit domain setting -'; @@ -48,6 +49,9 @@ $wb['repeat_password_txt'] = 'Répéter le mot de passe'; $wb['password_mismatch_txt'] = 'Les mots de passe ne correspondent pas.'; $wb['password_match_txt'] = 'Les mots de passe correspondent.'; $wb['disablesmtp_txt'] = 'Désactiver SMTP (envoi)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['email_error_isascii'] = 'Merci de ne pas utiliser de caractères spéciaux Unicode dans votre mot de passe. Ceci pourrait engendrer des problèmes avec votre client mail.'; $wb['cc_note_txt'] = '(Séparer les adresses e-mail multiples par des virgules)'; $wb['autoresponder_start_date_is_required'] = 'Une date de démarrage doit être renseignée quand le répondeur automatique est activé.'; diff --git a/interface/web/mail/lib/lang/fr_mail_user_list.lng b/interface/web/mail/lib/lang/fr_mail_user_list.lng index 0d4152913a..79e999b639 100644 --- a/interface/web/mail/lib/lang/fr_mail_user_list.lng +++ b/interface/web/mail/lib/lang/fr_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Nom véritable'; $wb['login_txt'] = 'Nom d’utilisateur'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 170aaa6b61..8885a212f4 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -20,6 +20,7 @@ $wb['password_txt'] = 'Šifra'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Enable Receiving'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; @@ -53,7 +54,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/hr_mail_user_list.lng b/interface/web/mail/lib/lang/hr_mail_user_list.lng index 498570c344..1c27b725d3 100644 --- a/interface/web/mail/lib/lang/hr_mail_user_list.lng +++ b/interface/web/mail/lib/lang/hr_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Ime'; $wb['login_txt'] = 'Prijava'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 65962cd21c..22ccb86b73 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -16,6 +16,7 @@ $wb['password_txt'] = 'Jelszó'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'levelezőláda'; $wb['postfix_txt'] = 'Bejövő engedélyezés'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Hozzáférés engelyezés'; $wb['policy_txt'] = 'Spam szűrő'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/hu_mail_user_list.lng b/interface/web/mail/lib/lang/hu_mail_user_list.lng index 8bf44e936c..7f1ec6265b 100644 --- a/interface/web/mail/lib/lang/hu_mail_user_list.lng +++ b/interface/web/mail/lib/lang/hu_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Név'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index 3bedbd9b93..f7aef165be 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -21,6 +21,7 @@ $wb['password_txt'] = 'Kata Sandi'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Dapat Menerima'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Dapat Mengakses'; $wb['policy_txt'] = 'Spamfilter'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/id_mail_user_list.lng b/interface/web/mail/lib/lang/id_mail_user_list.lng index 49a2afe943..3127853a0e 100644 --- a/interface/web/mail/lib/lang/id_mail_user_list.lng +++ b/interface/web/mail/lib/lang/id_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Nama Lengkap'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index a1a0f8cfd5..0fd610c22e 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'password'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Abilita ricezione'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['access_txt'] = 'Abilita indirizzo'; $wb['policy_txt'] = 'Spamfilter'; $wb['inherit_policy'] = '- Inherit domain setting -'; @@ -51,6 +52,9 @@ $wb['password_match_txt'] = 'Le passwords coincidono.'; $wb['email_error_isascii'] = 'Non utilizzare caratteri speciali unicode per la password. Potresti avere problemi con il tuo client di psota.'; $wb['cc_note_txt'] = '(Separa indirizzi email multipli con la virgola)'; $wb['disablesmtp_txt'] = 'Disabilita SMTP (trasmissione)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; diff --git a/interface/web/mail/lib/lang/it_mail_user_list.lng b/interface/web/mail/lib/lang/it_mail_user_list.lng index 098cb1a162..87038b875e 100644 --- a/interface/web/mail/lib/lang/it_mail_user_list.lng +++ b/interface/web/mail/lib/lang/it_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Nome reale'; $wb['login_txt'] = 'Accedi'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index b58b9d13dd..55c48abe03 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'パスワード'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'メールディレクトリ'; $wb['postfix_txt'] = 'メールを受信する'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'アクセスを許可する'; $wb['policy_txt'] = 'スパムフィルター'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/ja_mail_user_list.lng b/interface/web/mail/lib/lang/ja_mail_user_list.lng index 0bb531f785..bf905ed40a 100644 --- a/interface/web/mail/lib/lang/ja_mail_user_list.lng +++ b/interface/web/mail/lib/lang/ja_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Realname'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 9a644a129b..d66c64a9b6 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -20,6 +20,7 @@ $wb['password_txt'] = 'Wachtwoord'; $wb['password_click_to_set_txt'] = 'Klik om in te stellen'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Ontvangen inschakelen'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Greylisting inschakelen'; $wb['access_txt'] = 'Toegang inschakelen'; $wb['policy_txt'] = 'Spamfilter'; @@ -57,6 +58,9 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Meerdere e-mail adressen scheiden met een komma)'; $wb['disablesmtp_txt'] = 'Uitschakelen SMTP (versturen)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Een startdatun is vereist voor het inschakelen van Autobeantwoorden.'; $wb['sender_cc_txt'] = 'Stuur uitgaande kopie aan'; $wb['sender_cc_error_isemail'] = 'Het \\"Stuur uitgaande kopie aan\\" veld bevat geen geldig e-mail adres'; diff --git a/interface/web/mail/lib/lang/nl_mail_user_list.lng b/interface/web/mail/lib/lang/nl_mail_user_list.lng index 39125af2e0..da872b2c28 100644 --- a/interface/web/mail/lib/lang/nl_mail_user_list.lng +++ b/interface/web/mail/lib/lang/nl_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Echte naam'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Ontvangen'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 593f83531e..91b33eb06f 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'Hasło'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Zezwól na odbiór poczty'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Możliwy dostęp'; $wb['policy_txt'] = 'Filtr spamu'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/pl_mail_user_list.lng b/interface/web/mail/lib/lang/pl_mail_user_list.lng index 74ca840e30..f839a56720 100644 --- a/interface/web/mail/lib/lang/pl_mail_user_list.lng +++ b/interface/web/mail/lib/lang/pl_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Nazwa rzeczywista'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index 0b7ffe3d37..edbe7f9522 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'Senha'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Permitir Recepção'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Permitir Acesso'; $wb['policy_txt'] = 'Spamfilter'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/pt_mail_user_list.lng b/interface/web/mail/lib/lang/pt_mail_user_list.lng index fe89939e2b..9f19168fba 100644 --- a/interface/web/mail/lib/lang/pt_mail_user_list.lng +++ b/interface/web/mail/lib/lang/pt_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Realname'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index 97dfdafd88..b9de9b56f9 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'Password'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'Maildir'; $wb['postfix_txt'] = 'Enable Receiving'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Enable Access'; $wb['policy_txt'] = 'Spamfilter'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/ro_mail_user_list.lng b/interface/web/mail/lib/lang/ro_mail_user_list.lng index f55f8647a8..3eda064b75 100644 --- a/interface/web/mail/lib/lang/ro_mail_user_list.lng +++ b/interface/web/mail/lib/lang/ro_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Realname'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index 07bab6fd4f..ae6b06c084 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -16,6 +16,7 @@ $wb['password_txt'] = 'Пароль'; $wb['password_click_to_set_txt'] = 'Клик для установки'; $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Разрешить получение'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Включить серый список (Greylisting)'; $wb['access_txt'] = 'Включить доступ'; $wb['policy_txt'] = 'Спам-фильтр'; @@ -58,6 +59,9 @@ $wb['monthly_backup_txt'] = 'Ежемесячно'; $wb['email_error_isascii'] = 'Пожалуйста, не используйте специальные символы Юникода для вашего пароля. Это может привести к проблемам с вашим почтовым клиентом.'; $wb['cc_note_txt'] = '(Разделите несколько адресов электронной почты запятыми)'; $wb['disablesmtp_txt'] = 'Отключить SMTP (отправка)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Дата начала должна быть установлена когда автоответчик включен.'; $wb['sender_cc_txt'] = 'Отправка исходящей копии на'; $wb['sender_cc_error_isemail'] = 'Поле -Отправка исходящей копии на- не содержит действительный адрес электронной почты'; diff --git a/interface/web/mail/lib/lang/ru_mail_user_list.lng b/interface/web/mail/lib/lang/ru_mail_user_list.lng index 7dad47a416..d323d34750 100644 --- a/interface/web/mail/lib/lang/ru_mail_user_list.lng +++ b/interface/web/mail/lib/lang/ru_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Реальное имя'; $wb['login_txt'] = 'Логин'; $wb['postfix_txt'] = 'Получатель'; $wb['disablesmtp_txt'] = 'SMTP (отправка)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index da0282e118..26787d2a87 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'lösenord'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'maildir'; $wb['postfix_txt'] = 'Aktivera mottagning'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Aktivera åtkomst'; $wb['policy_txt'] = 'Spamfilter'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/se_mail_user_list.lng b/interface/web/mail/lib/lang/se_mail_user_list.lng index 65c724c292..4f6a7305d6 100644 --- a/interface/web/mail/lib/lang/se_mail_user_list.lng +++ b/interface/web/mail/lib/lang/se_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Riktigt namn'; $wb['login_txt'] = 'Logga in'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index d9a68404ae..176e879a90 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -17,6 +17,7 @@ $wb['password_txt'] = 'Heslo'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['maildir_txt'] = 'Mailová záložka'; $wb['postfix_txt'] = 'Povoliť príjem'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['access_txt'] = 'Povoliť Prístup'; $wb['policy_txt'] = 'Spamfilter'; @@ -57,7 +58,10 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; +$wb['disablesmtp_txt'] = 'Disable sending'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/sk_mail_user_list.lng b/interface/web/mail/lib/lang/sk_mail_user_list.lng index 3d18ad41f6..3a341f0967 100644 --- a/interface/web/mail/lib/lang/sk_mail_user_list.lng +++ b/interface/web/mail/lib/lang/sk_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Realname'; $wb['login_txt'] = 'Login'; $wb['postfix_txt'] = 'Receiving'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 9e964e5e8a..39939b4e19 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -24,6 +24,7 @@ $wb['password_txt'] = 'Parola'; $wb['password_click_to_set_txt'] = 'Ayarlamak için tıklayın'; $wb['maildir_txt'] = 'E-posta Klasörü'; $wb['postfix_txt'] = 'Alım Etkin'; +$wb['tooltip_postfix_txt'] = 'Allows incoming mail to this address.'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; $wb['access_txt'] = 'Erişim Etkin'; $wb['policy_txt'] = 'Önemsiz İleti Süzgeci'; @@ -31,6 +32,9 @@ $wb['inherit_policy'] = '- Inherit domain setting -'; $wb['limit_mailbox_txt'] = 'Hesabınıza ekleyebileceğiniz en fazla e-posta kutusu sayısına ulaştınız.'; $wb['limit_mailquota_txt'] = 'E-posta kutularınız için kullanabileceğiniz en fazla boyuta ulaştınız. Kullanılabilecek alan MB:'; $wb['disablesmtp_txt'] = 'SMTP Kullanılmasın (gönderim)'; +$wb['tooltip_disablesmtp_txt'] = 'Disables mail submission from this mail account.'; +$wb['disabledeliver_txt'] = 'Disable (local) delivering'; +$wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing by mail filters and sieve scripts. Mail forwards to \'Send copy to\' address.'; $wb['disableimap_txt'] = 'IMAP Kullanılmasın'; $wb['disablepop3_txt'] = 'POP3 Kullanılmasın'; $wb['duplicate_alias_or_forward_txt'] = 'Bu e-posta adresi zaten takma ya da yönlendirilmiş.'; diff --git a/interface/web/mail/lib/lang/tr_mail_user_list.lng b/interface/web/mail/lib/lang/tr_mail_user_list.lng index 66d33becae..3137af8928 100644 --- a/interface/web/mail/lib/lang/tr_mail_user_list.lng +++ b/interface/web/mail/lib/lang/tr_mail_user_list.lng @@ -7,6 +7,7 @@ $wb['name_txt'] = 'Gerçek Ad'; $wb['login_txt'] = 'Oturum Aç'; $wb['postfix_txt'] = 'Alınıyor'; $wb['disablesmtp_txt'] = 'SMTP (sending)'; +$wb['disabledeliver_txt'] = 'INBOX'; $wb['disableimap_txt'] = 'IMAP'; $wb['disablepop3_txt'] = 'POP3'; ?> diff --git a/interface/web/mail/list/mail_user.list.php b/interface/web/mail/list/mail_user.list.php index 4513a516c9..3e020ea603 100644 --- a/interface/web/mail/list/mail_user.list.php +++ b/interface/web/mail/list/mail_user.list.php @@ -107,6 +107,15 @@ $liste["item"][] = array( 'field' => "disablesmtp", 'width' => "", 'value' => array('n' => $app->lng('yes_txt'), 'y' => $app->lng('no_txt'))); +$liste["item"][] = array( 'field' => "disabledeliver", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('n' => $app->lng('yes_txt'), 'y' => $app->lng('no_txt'))); + $liste["item"][] = array( 'field' => "disableimap", 'datatype' => "VARCHAR", 'formtype' => "SELECT", diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 83a02e0ed2..1dca1db848 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -310,8 +310,8 @@ class page_action extends tform_actions { if(isset($this->dataRecord["email"])) { $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; - $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = ($this->dataRecord["disabledeliver"])?'y':'n'; $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; @@ -363,8 +363,8 @@ class page_action extends tform_actions { if(isset($this->dataRecord["email"])) { $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; - $disabledeliver = ($this->dataRecord["postfix"] == 'y')?'n':'y'; $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); diff --git a/interface/web/mail/templates/mail_user_list.htm b/interface/web/mail/templates/mail_user_list.htm index 6d800de57e..6cd5961fcc 100644 --- a/interface/web/mail/templates/mail_user_list.htm +++ b/interface/web/mail/templates/mail_user_list.htm @@ -38,6 +38,7 @@ + {tmpl_var name='search_limit'} @@ -49,6 +50,7 @@ + @@ -69,6 +71,7 @@ {tmpl_var name="autoresponder"} {tmpl_var name="postfix"} {tmpl_var name="disablesmtp"} + {tmpl_var name="disabledeliver"} {tmpl_var name="disableimap"} {tmpl_var name="disablepop3"} diff --git a/interface/web/mail/templates/mail_user_mailbox_edit.htm b/interface/web/mail/templates/mail_user_mailbox_edit.htm index a90799cf11..c53bc85292 100644 --- a/interface/web/mail/templates/mail_user_mailbox_edit.htm +++ b/interface/web/mail/templates/mail_user_mailbox_edit.htm @@ -67,13 +67,19 @@
- {tmpl_var name='postfix'} + {tmpl_var name='postfix'}
- {tmpl_var name='disablesmtp'} + {tmpl_var name='disablesmtp'} +
+
+
+ +
-- GitLab From 4339dba0f7b6b8b800bceb977ec64985c5556234 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 9 Jul 2020 12:53:52 -0600 Subject: [PATCH 0289/1368] split multiple sender_cc addrs on comma --- .../tpl/mysql-virtual_outgoing_bcc.cf.master | 118 +++++++++++++++++- 1 file changed, 112 insertions(+), 6 deletions(-) diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index 26090bce5b..a46835c235 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -2,10 +2,116 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT sender_cc FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} +query = SELECT sender_cc FROM ( + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + SUBSTRING_INDEX(sender_cc, ',', 1) AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 2), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 3), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 3, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 4), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 4, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 5), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 5, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 6), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 6, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 7), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 7, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 8), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 8, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 9), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 9, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 10), ',', -1), '') AS sender_cc + FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} + ) table1 WHERE sender_cc != '' UNION - SELECT u.sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + SELECT sender_cc FROM ( + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + SUBSTRING_INDEX(u.sender_cc, ',', 1) AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 2), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 3), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 3, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 4), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 4, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 5), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 5, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 6), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 6, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 7), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 7, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 8), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 8, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 9), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + UNION + SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, + IF(@num_sender_cc > 9, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 10), ',', -1), '') AS sender_cc + FROM mail_user u, mail_forwarding f + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} + AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} + ) table2 WHERE sender_cc != '' -- GitLab From f8cc822f5cdcbbf46f2bfd15fa274537c5e710f6 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 9 Jul 2020 16:18:03 -0600 Subject: [PATCH 0290/1368] sender_cc should only have one email address. fixes #5298 --- .../tpl/mysql-virtual_outgoing_bcc.cf.master | 105 +----------------- interface/web/mail/form/mail_user.tform.php | 6 +- interface/web/mail/lib/lang/ar_mail_user.lng | 2 +- interface/web/mail/lib/lang/bg_mail_user.lng | 2 +- interface/web/mail/lib/lang/br_mail_user.lng | 2 +- interface/web/mail/lib/lang/ca_mail_user.lng | 2 +- interface/web/mail/lib/lang/cz_mail_user.lng | 2 +- interface/web/mail/lib/lang/de_mail_user.lng | 2 +- interface/web/mail/lib/lang/dk_mail_user.lng | 2 +- interface/web/mail/lib/lang/el_mail_user.lng | 2 +- interface/web/mail/lib/lang/en_mail_user.lng | 2 +- interface/web/mail/lib/lang/es_mail_user.lng | 2 +- interface/web/mail/lib/lang/fi_mail_user.lng | 2 +- interface/web/mail/lib/lang/fr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hr_mail_user.lng | 2 +- interface/web/mail/lib/lang/hu_mail_user.lng | 2 +- interface/web/mail/lib/lang/id_mail_user.lng | 2 +- interface/web/mail/lib/lang/it_mail_user.lng | 2 +- interface/web/mail/lib/lang/ja_mail_user.lng | 2 +- interface/web/mail/lib/lang/nl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pl_mail_user.lng | 2 +- interface/web/mail/lib/lang/pt_mail_user.lng | 2 +- interface/web/mail/lib/lang/ro_mail_user.lng | 2 +- interface/web/mail/lib/lang/ru_mail_user.lng | 2 +- interface/web/mail/lib/lang/se_mail_user.lng | 2 +- interface/web/mail/lib/lang/sk_mail_user.lng | 2 +- interface/web/mail/lib/lang/tr_mail_user.lng | 2 +- 27 files changed, 30 insertions(+), 131 deletions(-) diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index a46835c235..bea39f8451 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -7,111 +7,10 @@ query = SELECT sender_cc FROM ( SUBSTRING_INDEX(sender_cc, ',', 1) AS sender_cc FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 2), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 3), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 3, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 4), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 4, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 5), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 5, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 6), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 6, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 7), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 7, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 8), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 8, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 9), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 9, SUBSTRING_INDEX(SUBSTRING_INDEX(sender_cc, ',', 10), ',', -1), '') AS sender_cc - FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} - ) table1 WHERE sender_cc != '' - UNION - SELECT sender_cc FROM ( SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, SUBSTRING_INDEX(u.sender_cc, ',', 1) AS sender_cc FROM mail_user u, mail_forwarding f WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 1, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 2), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 2, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 3), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 3, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 4), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 4, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 5), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 5, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 6), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 6, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 7), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 7, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 8), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 8, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 9), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - IF(@num_sender_cc > 9, SUBSTRING_INDEX(SUBSTRING_INDEX(u.sender_cc, ',', 10), ',', -1), '') AS sender_cc - FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) - AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} - AND f.source = '%s' AND f.active = 'y' AND f.allow_send_as = 'y' AND f.server_id = {server_id} - ) table2 WHERE sender_cc != '' + AND f.source = '%s' AND f.allow_send_as = 'y' AND f.active = 'y' AND f.server_id = {server_id} + ) table1 WHERE sender_cc != '' LIMIT 1 diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 19c74121f4..9a5f1889d8 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -199,14 +199,14 @@ $form["tabs"]['mailuser'] = array( 2 => array( 'event' => 'SAVE', 'type' => 'TOLOWER') ), - 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex'=>'/^(\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,63}){0,1}(,\s*\w+[\w\.\-\+]*\w{0,}@\w+[\w.-]*\.[a-z\-]{2,63}){0,}$/i', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'sender_cc_error_isemail'), ), 'default' => '', 'value' => '', 'width' => '30', - 'maxlength' => '255' + 'maxlength' => '255', + 'searchable' => 2 ), 'maildir' => array ( 'datatype' => 'VARCHAR', diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index f5a8c82de0..532386d411 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -64,7 +64,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index f0b446904d..b90a53498c 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -64,7 +64,7 @@ $wb['no_backup_txt'] = 'No backup'; $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 3ff0114ecd..01a2d6a086 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -65,7 +65,7 @@ $wb['weekly_backup_txt'] = 'Semanal'; $wb['monthly_backup_txt'] = 'Mensal'; $wb['email_error_isascii'] = 'Por favor, não use caracteres especiais para a senha. Isto poderá causar problemas no cliente de e-mail.'; $wb['cc_note_txt'] = '(separar múltiplos endereços de e-mails com vírgulas)'; -$wb['sender_cc_note_txt'] = '(separar múltiplos endereços de e-mails com vírgulas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 2c63fa3353..247c061897 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -64,7 +64,7 @@ $wb['no_backup_txt'] = 'No backup'; $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index ca113dc74c..db31f402d9 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -64,7 +64,7 @@ $wb['no_backup_txt'] = 'Žádná záloha'; $wb['daily_backup_txt'] = 'Denní'; $wb['weekly_backup_txt'] = 'Týdenní'; $wb['monthly_backup_txt'] = 'Měsíční'; -$wb['sender_cc_note_txt'] = '(Při posílání kopií na více e-mailových adres, oddělte čárkami.) '; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Pro nastavení klikni zde'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index 61b933d73a..a0975a18ff 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -64,7 +64,7 @@ $wb['cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; $wb['autoresponder_start_date_is_required'] = 'Startdatum muss angegeben werden.'; $wb['sender_cc_txt'] = 'Kopie ausgehender Emails senden an (BCC)'; $wb['sender_cc_error_isemail'] = '-Kopie ausgehender Emails senden an- Feld enthält keine gültige Emailadresse'; -$wb['sender_cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index 84b7744874..e467053890 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -65,7 +65,7 @@ $wb['no_backup_txt'] = 'No backup'; $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index 1d15de986b..1fefb9de62 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -64,7 +64,7 @@ $wb['no_backup_txt'] = 'No backup'; $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 7307a77379..33bd19b45d 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -65,7 +65,7 @@ $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index f22e051031..97404c9451 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -61,7 +61,7 @@ $wb['quota_error_value'] = 'La cuota es inválida. Los valores permitidos son: 0 $wb['quota_txt'] = 'Cuota (0 para ilimitada)'; $wb['repeat_password_txt'] = 'Repetir contraseña'; $wb['sender_cc_error_isemail'] = 'El campo -Enviar copia a- no contiene una dirección de correo válida'; -$wb['sender_cc_note_txt'] = '(Separe múltiples cuentas de correo con comas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['sender_cc_txt'] = 'Enviar copia saliente a'; $wb['server_id_txt'] = 'id_del_servidor'; $wb['weekly_backup_txt'] = 'Semanalmente'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 549f4048a6..6893273b9c 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -64,7 +64,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index 2f131cb31d..dad892c470 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -64,7 +64,7 @@ $wb['no_backup_txt'] = 'Pas de backup'; $wb['daily_backup_txt'] = 'Journalier'; $wb['weekly_backup_txt'] = 'Hebdomadaire'; $wb['monthly_backup_txt'] = 'Mensuel'; -$wb['sender_cc_note_txt'] = '(Séparer les adresses e-mail multiples par des virgules)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['password_click_to_set_txt'] = 'Cliquez pour définir'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 8885a212f4..6d2907a1e2 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -65,7 +65,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 22ccb86b73..283a1eb209 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index f7aef165be..b0b7ef8770 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index 0fd610c22e..94625205da 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -65,7 +65,7 @@ $wb['no_backup_txt'] = 'No backup'; $wb['daily_backup_txt'] = 'Daily'; $wb['weekly_backup_txt'] = 'Weekly'; $wb['monthly_backup_txt'] = 'Monthly'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index 55c48abe03..332a500754 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index d66c64a9b6..9b260d7391 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -64,7 +64,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Een startdatun is vereist voor het inschakelen van Autobeantwoorden.'; $wb['sender_cc_txt'] = 'Stuur uitgaande kopie aan'; $wb['sender_cc_error_isemail'] = 'Het \\"Stuur uitgaande kopie aan\\" veld bevat geen geldig e-mail adres'; -$wb['sender_cc_note_txt'] = '(Meerdere e-mail adressen scheiden met een komma)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 91b33eb06f..c4d458705f 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index edbe7f9522..ac20e53696 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index b9de9b56f9..c623744635 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index ae6b06c084..ad2b4b5e7b 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Дата начала должна быть установлена когда автоответчик включен.'; $wb['sender_cc_txt'] = 'Отправка исходящей копии на'; $wb['sender_cc_error_isemail'] = 'Поле -Отправка исходящей копии на- не содержит действительный адрес электронной почты'; -$wb['sender_cc_note_txt'] = '(Разделите несколько адресов электронной почты запятыми)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index 26787d2a87..e540533a61 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index 176e879a90..8cd4614783 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -65,7 +65,7 @@ $wb['tooltip_disabledeliver_txt'] = 'Disables delivery to INBOX, and processing $wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; -$wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 39939b4e19..6cac8790ca 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -65,7 +65,7 @@ $wb['weekly_backup_txt'] = 'Haftalık'; $wb['monthly_backup_txt'] = 'Aylık'; $wb['email_error_isascii'] = 'E-posta istemcinizde sorun yaşamamak için lütfen parolanızda dile özel unikod karakterler kullanmayın.'; $wb['cc_note_txt'] = '(Birden çok e-posta adresini virgül ile ayırarak yazın)'; -$wb['sender_cc_note_txt'] = '(Birden çok e-posta adresini virgül ile ayırarak yazın)'; +$wb['sender_cc_note_txt'] = '(One email address only)'; $wb['purge_trash_days_txt'] = 'Purge Trash automatically after X days'; $wb['tooltip_purge_trash_days_txt'] = '0 = disabled'; $wb['purge_junk_days_txt'] = 'Purge Junk automatically after X days'; -- GitLab From 51671568345be6cd608d1fd0498db08746e33649 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 20:15:45 +0200 Subject: [PATCH 0291/1368] Avoid a fatal error when the dir does not exist --- server/lib/classes/backup.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/lib/classes/backup.inc.php b/server/lib/classes/backup.inc.php index f996340bd5..ba28cd4c90 100644 --- a/server/lib/classes/backup.inc.php +++ b/server/lib/classes/backup.inc.php @@ -856,6 +856,10 @@ class backup if (is_null($endings_list)) $endings_list = $default_endings_list; + if (!is_dir($directory)) { + return array(); + } + $dir_handle = dir($directory); $files = array(); while (false !== ($entry = $dir_handle->read())) { -- GitLab From 193295929b4b449443587e944fe245429bed95c5 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 12 Mar 2020 16:35:17 +0100 Subject: [PATCH 0292/1368] Add Username field to datalog view --- interface/web/monitor/dataloghistory_view.php | 1 + interface/web/monitor/lib/lang/en_dataloghistory_view.lng | 1 + interface/web/monitor/templates/dataloghistory_view.htm | 4 ++++ 3 files changed, 6 insertions(+) diff --git a/interface/web/monitor/dataloghistory_view.php b/interface/web/monitor/dataloghistory_view.php index 2b5ea1e032..f956591969 100644 --- a/interface/web/monitor/dataloghistory_view.php +++ b/interface/web/monitor/dataloghistory_view.php @@ -50,6 +50,7 @@ $id = intval($_GET['id']); $record = $app->db->queryOneRecord('SELECT * FROM sys_datalog WHERE datalog_id = ?', $id); $out['id'] = $id; +$out['username'] = $record['user']; $out['timestamp'] = date($app->lng('conf_format_datetime'), $record['tstamp']); $out['table'] = $record['dbtable']; diff --git a/interface/web/monitor/lib/lang/en_dataloghistory_view.lng b/interface/web/monitor/lib/lang/en_dataloghistory_view.lng index df9ddd286f..3d5d6829ae 100644 --- a/interface/web/monitor/lib/lang/en_dataloghistory_view.lng +++ b/interface/web/monitor/lib/lang/en_dataloghistory_view.lng @@ -23,4 +23,5 @@ $wb['new_txt'] = 'New'; $wb['btn_cancel_txt'] = 'Back'; $wb['undo_txt'] = 'Undo action'; $wb['undo_confirmation_txt'] = 'Do you really want to undo this action?'; +$wb['username_txt'] = 'Username'; ?> diff --git a/interface/web/monitor/templates/dataloghistory_view.htm b/interface/web/monitor/templates/dataloghistory_view.htm index 4ba82bbf05..1e0feda9c6 100644 --- a/interface/web/monitor/templates/dataloghistory_view.htm +++ b/interface/web/monitor/templates/dataloghistory_view.htm @@ -12,6 +12,10 @@ + + + + -- GitLab From 0ab69a8a017086d958ad7274f78025ff2c887086 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 12 Mar 2020 20:29:29 +0100 Subject: [PATCH 0293/1368] Draft link to modified record --- interface/web/monitor/dataloghistory_view.php | 10 ++++++++++ .../web/monitor/templates/dataloghistory_view.htm | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/interface/web/monitor/dataloghistory_view.php b/interface/web/monitor/dataloghistory_view.php index f956591969..5c2043d63f 100644 --- a/interface/web/monitor/dataloghistory_view.php +++ b/interface/web/monitor/dataloghistory_view.php @@ -54,6 +54,16 @@ $out['username'] = $record['user']; $out['timestamp'] = date($app->lng('conf_format_datetime'), $record['tstamp']); $out['table'] = $record['dbtable']; +list($key, $value) = explode(':', $record['dbidx']); +if (!empty($value)) { + if ($record['action'] == 'd') { + // No link for deleted content. + $out['table_id'] = $record['dbidx']; + } else { + // TODO link per content type + $out['table_id'] = ''.$record['dbidx'].''; + } +} $out['action_char'] = $record['action']; $out['action_name'] = $app->lng($record['action']); diff --git a/interface/web/monitor/templates/dataloghistory_view.htm b/interface/web/monitor/templates/dataloghistory_view.htm index 1e0feda9c6..3e61e4cf6d 100644 --- a/interface/web/monitor/templates/dataloghistory_view.htm +++ b/interface/web/monitor/templates/dataloghistory_view.htm @@ -22,7 +22,7 @@ - + () -- GitLab From 72c9b5b91e689e6cc6f2d5138fc405ab506ee07f Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 12 Mar 2020 20:40:52 +0100 Subject: [PATCH 0294/1368] Add a few types --- interface/web/monitor/dataloghistory_view.php | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/interface/web/monitor/dataloghistory_view.php b/interface/web/monitor/dataloghistory_view.php index 5c2043d63f..2e3d3bd2f9 100644 --- a/interface/web/monitor/dataloghistory_view.php +++ b/interface/web/monitor/dataloghistory_view.php @@ -56,13 +56,26 @@ $out['timestamp'] = date($app->lng('conf_format_datetime'), $record['tstamp']); $out['table'] = $record['dbtable']; list($key, $value) = explode(':', $record['dbidx']); if (!empty($value)) { - if ($record['action'] == 'd') { - // No link for deleted content. - $out['table_id'] = $record['dbidx']; - } else { - // TODO link per content type - $out['table_id'] = ''.$record['dbidx'].''; - } + if ($record['action'] == 'd') { + // No link for deleted content. + $out['table_id'] = $record['dbidx']; + } else { + switch ($out['table']) { + case 'mail_forwarding': + $file = 'mail/mail_forward_edit.php'; + break; + case 'mail_user': + $file = 'mail/mail_user_edit.php'; + break; + case 'mail_domain': + $file = 'mail/mail_domain_edit.php'; + break; + default: + $file = ''; + } + // TODO link per content type + $out['table_id'] = ''.$record['dbidx'] . $file .''; + } } $out['action_char'] = $record['action']; -- GitLab From 9441fb35c9a25799468d8c8b5b800593cd5cceb4 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 21:40:32 +0200 Subject: [PATCH 0295/1368] Add a few types and tab indent --- interface/web/monitor/dataloghistory_view.php | 55 ++++++++++++------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/interface/web/monitor/dataloghistory_view.php b/interface/web/monitor/dataloghistory_view.php index 2e3d3bd2f9..b86334b0af 100644 --- a/interface/web/monitor/dataloghistory_view.php +++ b/interface/web/monitor/dataloghistory_view.php @@ -56,26 +56,41 @@ $out['timestamp'] = date($app->lng('conf_format_datetime'), $record['tstamp']); $out['table'] = $record['dbtable']; list($key, $value) = explode(':', $record['dbidx']); if (!empty($value)) { - if ($record['action'] == 'd') { - // No link for deleted content. - $out['table_id'] = $record['dbidx']; - } else { - switch ($out['table']) { - case 'mail_forwarding': - $file = 'mail/mail_forward_edit.php'; - break; - case 'mail_user': - $file = 'mail/mail_user_edit.php'; - break; - case 'mail_domain': - $file = 'mail/mail_domain_edit.php'; - break; - default: - $file = ''; - } - // TODO link per content type - $out['table_id'] = ''.$record['dbidx'] . $file .''; - } + if ($record['action'] == 'd') { + // No link for deleted content. + $out['table_id'] = $record['dbidx']; + } else { + switch ($out['table']) { + case 'mail_forwarding': + $file = 'mail/mail_forward_edit.php'; + break; + case 'mail_user': + $file = 'mail/mail_user_edit.php'; + break; + case 'mail_domain': + $file = 'mail/mail_domain_edit.php'; + break; + case 'web_domain': + $file = 'sites/web_vhost_domain_edit.php'; + break; + case 'web_database': + $file = 'sites/database_edit.php'; + break; + case 'web_database_user': + $file = 'sites/database_user_edit.php'; + break; + + // TODO Add a link per content type + default: + $file = ''; + } + + if (!empty($file)) { + $out['table_id'] = '' + . $record['dbidx'] . ''; + } + } } $out['action_char'] = $record['action']; -- GitLab From c9466db4d39d1b1fc163f3da41aea19c3ea6c4c3 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 21:40:51 +0200 Subject: [PATCH 0296/1368] Skip if empty --- interface/web/monitor/templates/dataloghistory_view.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/monitor/templates/dataloghistory_view.htm b/interface/web/monitor/templates/dataloghistory_view.htm index 3e61e4cf6d..d02953ede9 100644 --- a/interface/web/monitor/templates/dataloghistory_view.htm +++ b/interface/web/monitor/templates/dataloghistory_view.htm @@ -22,7 +22,7 @@ - () + () -- GitLab From aba983e151f1d4e8a77cd2ad6a5be7be899fefc1 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 10 Jul 2020 21:46:47 +0200 Subject: [PATCH 0297/1368] tab indent --- interface/web/monitor/templates/dataloghistory_view.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/monitor/templates/dataloghistory_view.htm b/interface/web/monitor/templates/dataloghistory_view.htm index d02953ede9..9741d70be8 100644 --- a/interface/web/monitor/templates/dataloghistory_view.htm +++ b/interface/web/monitor/templates/dataloghistory_view.htm @@ -22,7 +22,7 @@ - () + () -- GitLab From 21c60636411586bee4eb9ec998fa370bf8f19ecb Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 11 Jul 2020 10:40:27 +0200 Subject: [PATCH 0298/1368] tab indent --- interface/web/admin/templates/server_ip_map_list.htm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/admin/templates/server_ip_map_list.htm b/interface/web/admin/templates/server_ip_map_list.htm index 5523448c7b..527ef69b9a 100644 --- a/interface/web/admin/templates/server_ip_map_list.htm +++ b/interface/web/admin/templates/server_ip_map_list.htm @@ -38,13 +38,13 @@ - {tmpl_var name='globalsearch_noresults_text_txt'} + {tmpl_var name='globalsearch_noresults_text_txt'} - + -- GitLab From 2a45bd1b3940a80cc93ef46696a509fc1f21f9e8 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 13 Jul 2020 22:20:55 +0200 Subject: [PATCH 0299/1368] auto sidebar width (#4465) --- interface/web/themes/default/assets/stylesheets/ispconfig.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index 534d2390f8..c255573e6c 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -141,7 +141,9 @@ body { #sidebar { margin-top: 27px; - width: 18%; + min-width: 18%; + max-width: 21%; + width: auto; border-style: solid; border-width: 1px; border-radius: 4px; } -- GitLab From bf736d765f2e99d381b90d5e3c8e8872b624a38d Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 14 Jul 2020 10:27:09 +0200 Subject: [PATCH 0300/1368] Update cron.php, added newline to finished cron message. --- server/cron.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/cron.php b/server/cron.php index d21dcfa8ae..0fe1dfc6cf 100644 --- a/server/cron.php +++ b/server/cron.php @@ -128,6 +128,6 @@ $app->services->processDelayedActions(); @unlink($conf['temppath'] . $conf['fs_div'] . '.ispconfig_cron_lock'); $app->log('Remove Lock: ' . $conf['temppath'] . $conf['fs_div'] . '.ispconfig_cron_lock', LOGLEVEL_DEBUG); -if($conf['log_priority'] <= LOGLEVEL_DEBUG) die("finished cron run."); +if($conf['log_priority'] <= LOGLEVEL_DEBUG) die("finished cron run.\n"); ?> -- GitLab From 689efa98f24574ab95f32604642db9c1b0d38326 Mon Sep 17 00:00:00 2001 From: Dominik Date: Tue, 14 Jul 2020 12:34:42 +0200 Subject: [PATCH 0301/1368] change cc and sender_cc column type to text to support more than 4-5 redirects --- install/sql/incremental/upd_dev_collection.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 8e924a62b0..9dc0d0cd22 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -35,3 +35,7 @@ ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET -- add SSHFP and DNAME record ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; + +-- change cc and sender_cc column type +ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `mail_user` CHANGE `sender_cc` `sender_cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; -- GitLab From e6c50f0a75c8c55ebda1865f157dedfa48ed54ff Mon Sep 17 00:00:00 2001 From: Dominik Date: Tue, 14 Jul 2020 12:36:54 +0200 Subject: [PATCH 0302/1368] change cc and sender_cc column type to text to support more than 4-5 redirects --- install/sql/ispconfig3.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index c54f0ac345..a41853324b 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1038,8 +1038,8 @@ CREATE TABLE `mail_user` ( `maildir` varchar(255) NOT NULL default '', `maildir_format` varchar(255) NOT NULL default 'maildir', `quota` bigint(20) NOT NULL default '-1', - `cc` varchar(255) NOT NULL default '', - `sender_cc` varchar(255) NOT NULL default '', + `cc` text, + `sender_cc` text, `homedir` varchar(255) NOT NULL default '', `autoresponder` enum('n','y') NOT NULL default 'n', `autoresponder_start_date` datetime NULL default NULL, -- GitLab From 85f9d1d8c5d319305fe2ca9b626fc791a1120805 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 14 Jul 2020 16:58:29 +0200 Subject: [PATCH 0303/1368] folder_directive_snippets was missing in incremental, inserted for fixing older installations --- install/sql/incremental/upd_0085.sql | 2 ++ install/sql/incremental/upd_dev_collection.sql | 3 +++ 2 files changed, 5 insertions(+) diff --git a/install/sql/incremental/upd_0085.sql b/install/sql/incremental/upd_0085.sql index 1291262ee7..755143fc4f 100644 --- a/install/sql/incremental/upd_0085.sql +++ b/install/sql/incremental/upd_0085.sql @@ -1,3 +1,5 @@ +-- folder_directive_snippets was missing in incremental, inserted for fixing older installations +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; ALTER TABLE `web_domain` CHANGE `folder_directive_snippets` `folder_directive_snippets` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NULL; ALTER TABLE `web_domain` ADD `log_retention` INT NOT NULL DEFAULT '30' AFTER `https_port`; ALTER TABLE `web_domain` CHANGE `stats_type` `stats_type` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT 'awstats'; diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 8e924a62b0..bf2f02f677 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -35,3 +35,6 @@ ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET -- add SSHFP and DNAME record ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; + +-- was missing in incremental, inserted for fixing older installations +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; \ No newline at end of file -- GitLab From ff5fe5dbaac63c56b7f2b1e39e5fefc9a6064ac4 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 14 Jul 2020 17:00:03 +0200 Subject: [PATCH 0304/1368] Fixed PHP 7.4 compatibility problem with limit query in mysql database lib. --- install/lib/mysql.lib.php | 13 +++++++++---- interface/lib/classes/db_mysql.inc.php | 13 +++++++++---- interface/lib/classes/getconf.inc.php | 2 +- server/lib/classes/db_mysql.inc.php | 14 ++++++++++---- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/install/lib/mysql.lib.php b/install/lib/mysql.lib.php index 3e091d10b8..c24a454d04 100644 --- a/install/lib/mysql.lib.php +++ b/install/lib/mysql.lib.php @@ -286,10 +286,15 @@ class db public function queryOneRecord($sQuery = '') { $aArgs = func_get_args(); - - if(!preg_match('/limit \d+\s*,\s*\d+$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; - - $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); + if(!empty($aArgs)) { + $sQuery = array_shift($aArgs); + if($sQuery && !preg_match('/limit \d+(\s*,\s*\d+)?$/i', $sQuery)) { + $sQuery .= ' LIMIT 0,1'; + } + array_unshift($aArgs, $sQuery); + } + + $oResult = call_user_func_array([&$this, 'query'], $aArgs); if(!$oResult) return null; $aReturn = $oResult->get(); diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php index 5348e41708..014feec8c3 100644 --- a/interface/lib/classes/db_mysql.inc.php +++ b/interface/lib/classes/db_mysql.inc.php @@ -356,10 +356,15 @@ class db public function queryOneRecord($sQuery = '') { $aArgs = func_get_args(); - - if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; - - $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); + if(!empty($aArgs)) { + $sQuery = array_shift($aArgs); + if($sQuery && !preg_match('/limit \d+(\s*,\s*\d+)?$/i', $sQuery)) { + $sQuery .= ' LIMIT 0,1'; + } + array_unshift($aArgs, $sQuery); + } + + $oResult = call_user_func_array([&$this, 'query'], $aArgs); if(!$oResult) return null; $aReturn = $oResult->get(); diff --git a/interface/lib/classes/getconf.inc.php b/interface/lib/classes/getconf.inc.php index ef9e0702d2..bbb57d6014 100644 --- a/interface/lib/classes/getconf.inc.php +++ b/interface/lib/classes/getconf.inc.php @@ -65,7 +65,7 @@ class getconf { } else { $app->uses('ini_parser'); $security_config_path = '/usr/local/ispconfig/security/security_settings.ini'; - if(!is_file($security_config_path)) $security_config_path = realpath(ISPC_ROOT_PATH.'/../security/security_settings.ini'); + if(!is_readable($security_config_path)) $security_config_path = realpath(ISPC_ROOT_PATH.'/../security/security_settings.ini'); $this->security_config = $app->ini_parser->parse_ini_string(file_get_contents($security_config_path)); return ($section == '') ? $this->security_config : $this->security_config[$section]; diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php index 2bccf1ecb7..8c38123096 100644 --- a/server/lib/classes/db_mysql.inc.php +++ b/server/lib/classes/db_mysql.inc.php @@ -354,11 +354,17 @@ class db * @return array result row or NULL if none found */ public function queryOneRecord($sQuery = '') { - + $aArgs = func_get_args(); - if(!preg_match('/limit \d+\s*(,\s*\d+)?$/i', $sQuery)) $sQuery .= ' LIMIT 0,1'; - - $oResult = call_user_func_array(array(&$this, 'query'), $aArgs); + if(!empty($aArgs)) { + $sQuery = array_shift($aArgs); + if($sQuery && !preg_match('/limit \d+(\s*,\s*\d+)?$/i', $sQuery)) { + $sQuery .= ' LIMIT 0,1'; + } + array_unshift($aArgs, $sQuery); + } + + $oResult = call_user_func_array([&$this, 'query'], $aArgs); if(!$oResult) return null; $aReturn = $oResult->get(); -- GitLab From f31b004c6db29a8b494f2479ea82de98bab180bd Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 15 Jul 2020 22:49:09 +0200 Subject: [PATCH 0305/1368] Resolve merge conflict for 1033 --- install/sql/incremental/upd_dev_collection.sql | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e446b60c9f..8d673ae866 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -38,3 +38,6 @@ ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME -- remove SPDY option ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; + +-- was missing in incremental, inserted for fixing older installations +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; -- GitLab From ecd7f3d7d8b0e77b31b21ce92d6a8f38d8204a7b Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 18 Jul 2020 14:32:40 +0200 Subject: [PATCH 0306/1368] Allow separator in catchall email adress (#4999) --- interface/lib/classes/tform_base.inc.php | 55 +++++++++++++------ .../mail/form/mail_domain_catchall.tform.php | 2 +- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/interface/lib/classes/tform_base.inc.php b/interface/lib/classes/tform_base.inc.php index e6174d2da7..a28644e3ef 100644 --- a/interface/lib/classes/tform_base.inc.php +++ b/interface/lib/classes/tform_base.inc.php @@ -152,9 +152,9 @@ class tform_base { $wb = $app->functions->array_merge($wb_global, $wb); } if(isset($wb_global)) unset($wb_global); - + $this->wordbook = $wb; - + $app->plugin->raiseEvent($_SESSION['s']['module']['name'].':'.$app->tform->formDef['name'] . ':on_after_formdef', $this); $this->dateformat = $app->lng('conf_format_dateshort'); @@ -323,7 +323,7 @@ class tform_base { return $this->getAuthSQL('r', $matches[1]); } */ - + /** * Get the key => value array of a form filled from a datasource definitiom * @@ -339,12 +339,12 @@ class tform_base { function applyValueLimit($limit, $values, $current_value = '') { global $app; - + // we mas have multiple limits, therefore we explode by ; first // Example: "system:sites:web_php_options;client:web_php_options" $limits = explode(';',$limit); - - + + foreach($limits as $limit) { $limit_parts = explode(':', $limit); @@ -399,7 +399,7 @@ class tform_base { $tmp_key = $limit_parts[2]; $allowed = $allowed = explode(',',$tmp_conf[$tmp_key]); } - + // add the current value to the allowed array $allowed[] = $current_value; @@ -438,7 +438,7 @@ class tform_base { $csrf_token = $app->auth->csrf_token_get($this->formDef['name']); $_csrf_id = $csrf_token['csrf_id']; $_csrf_value = $csrf_token['csrf_key']; - + $this->formDef['tabs'][$tab]['fields']['_csrf_id'] = array( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', @@ -454,7 +454,7 @@ class tform_base { $record['_csrf_id'] = $_csrf_id; $record['_csrf_key'] = $_csrf_value; /* CSRF PROTECTION */ - + $new_record = array(); if($action == 'EDIT') { $record = $this->decode($record, $tab); @@ -589,7 +589,7 @@ class tform_base { $new_record[$key] = $this->_getDateHTML($key, $dt_value); break; - + default: if(isset($record[$key])) { $new_record[$key] = $app->functions->htmlentities($record[$key]); @@ -701,7 +701,7 @@ class tform_base { $new_record[$key] = $this->_getDateTimeHTML($key, $dt_value, $display_seconds); break; - + case 'DATE': $dt_value = (isset($field['default'])) ? $field['default'] : 0; @@ -750,7 +750,7 @@ class tform_base { unset($_POST); unset($record); } - + if(isset($_SESSION['_csrf_timeout']) && is_array($_SESSION['_csrf_timeout'])) { $to_unset = array(); foreach($_SESSION['_csrf_timeout'] as $_csrf_id => $timeout) { @@ -767,7 +767,7 @@ class tform_base { } /* CSRF PROTECTION */ } - + $new_record = array(); if(is_array($record)) { foreach($fields as $key => $field) { @@ -1065,6 +1065,29 @@ class tform_base { } unset($error); break; + case 'ISEMAILADRESS': + $error = false; + if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n'; + if($validator['allowempty'] == 'y' && $field_value == '') { + //* Do nothing + } else { + if(function_exists('filter_var')) { + if(filter_var($field_value, FILTER_VALIDATE_EMAIL) === false) { + $error = true; + } + if ($error) { + $errmsg = $validator['errmsg']; + if(isset($this->wordbook[$errmsg])) { + $this->errorMessage .= $this->wordbook[$errmsg]."
\r\n"; + } else { + $this->errorMessage .= $errmsg."
\r\n"; + } + } + + } else $this->errorMessage .= "function filter_var missing
\r\n"; + } + unset($error); + break; case 'ISINT': if(function_exists('filter_var') && $field_value < PHP_INT_MAX) { //if($field_value != '' && filter_var($field_value, FILTER_VALIDATE_INT, array("options" => array('min_range'=>0))) === false) { @@ -1198,7 +1221,7 @@ class tform_base { } } break; - + case 'ISDATETIME': /* Checks a datetime value against the date format of the current language */ if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n'; @@ -1216,7 +1239,7 @@ class tform_base { } } break; - + case 'RANGE': //* Checks if the value is within the given range or above / below a value //* Range examples: < 10 = ":10", between 2 and 10 = "2:10", above 5 = "5:". @@ -1281,7 +1304,7 @@ class tform_base { $sql_update = ''; $record = $this->encode($record, $tab, true); - + if(($this->primary_id_override > 0)) { $sql_insert_key .= '`'.$this->formDef["db_table_idx"].'`, '; $sql_insert_val .= $this->primary_id_override.", "; diff --git a/interface/web/mail/form/mail_domain_catchall.tform.php b/interface/web/mail/form/mail_domain_catchall.tform.php index 72261e05e0..ebc4cebd7c 100644 --- a/interface/web/mail/form/mail_domain_catchall.tform.php +++ b/interface/web/mail/form/mail_domain_catchall.tform.php @@ -113,7 +113,7 @@ $form["tabs"]['catchall'] = array ( 'valuefield' => 'email' ), */ - 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAILADRESS', 'errmsg'=> 'destination_error_isemail'), ), 'value' => '', -- GitLab From 464cc4f31dd7578d5997dd10d186719479d70395 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 18 Jul 2020 14:36:04 +0200 Subject: [PATCH 0307/1368] Mispelled address --- interface/lib/classes/tform_base.inc.php | 2 +- interface/web/mail/form/mail_domain_catchall.tform.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/tform_base.inc.php b/interface/lib/classes/tform_base.inc.php index a28644e3ef..bd9f70a626 100644 --- a/interface/lib/classes/tform_base.inc.php +++ b/interface/lib/classes/tform_base.inc.php @@ -1065,7 +1065,7 @@ class tform_base { } unset($error); break; - case 'ISEMAILADRESS': + case 'ISEMAILADDRESS': $error = false; if($validator['allowempty'] != 'y') $validator['allowempty'] = 'n'; if($validator['allowempty'] == 'y' && $field_value == '') { diff --git a/interface/web/mail/form/mail_domain_catchall.tform.php b/interface/web/mail/form/mail_domain_catchall.tform.php index ebc4cebd7c..c43aeb3339 100644 --- a/interface/web/mail/form/mail_domain_catchall.tform.php +++ b/interface/web/mail/form/mail_domain_catchall.tform.php @@ -113,7 +113,7 @@ $form["tabs"]['catchall'] = array ( 'valuefield' => 'email' ), */ - 'validators' => array ( 0 => array ( 'type' => 'ISEMAILADRESS', + 'validators' => array ( 0 => array ( 'type' => 'ISEMAILADDRESS', 'errmsg'=> 'destination_error_isemail'), ), 'value' => '', -- GitLab From 0b65e47a41571e46ac9aeb46163b57d196b2b9ec Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 18 Jul 2020 14:56:40 +0200 Subject: [PATCH 0308/1368] Fix whitespace (#4507) --- interface/web/mail/templates/mail_user_list.htm | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/interface/web/mail/templates/mail_user_list.htm b/interface/web/mail/templates/mail_user_list.htm index 6d800de57e..69291f4be8 100644 --- a/interface/web/mail/templates/mail_user_list.htm +++ b/interface/web/mail/templates/mail_user_list.htm @@ -21,12 +21,12 @@

{tmpl_var name="toolsarea_head_txt"}

- + - - - + + +

@@ -60,11 +60,7 @@ - - - + -- GitLab From 61867049ba3eca7560bc4c3eb122368d3f364a26 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 18 Jul 2020 15:05:26 +0200 Subject: [PATCH 0309/1368] Variable for mpm_itk_module (#4756) --- server/conf/apache_ispconfig.conf.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master index 6acb16f7c8..e30ccd6d3b 100644 --- a/server/conf/apache_ispconfig.conf.master +++ b/server/conf/apache_ispconfig.conf.master @@ -132,7 +132,7 @@ Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-know Allow from all - AssignUserId www-data www-data + AssignUserId -- GitLab From 9a2c9326a3cbaf7f9c054684e1ebf9356e8fc4a5 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 18 Jul 2020 15:29:06 +0200 Subject: [PATCH 0310/1368] Allow separator in email address --- interface/web/client/form/client.tform.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index 5b45ffb972..17b9e623b6 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -390,8 +390,8 @@ $form["tabs"]['address'] = array ( 2 => array( 'event' => 'SAVE', 'type' => 'TOLOWER') ), - 'validators' => array ( - 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'email_error_isemail'), + 'validators' => array ( + 0 => array ( 'type' => 'ISEMAILADDRESS', 'errmsg'=> 'email_error_isemail'), 1 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'email_error_empty'), ), @@ -621,7 +621,7 @@ $form["tabs"]['address'] = array ( 'type' => 'TOLOWER') ), 'validators' => array ( - 0 => array ( 'type' => 'ISEMAIL', 'allowempty' => 'y', 'errmsg'=> 'email_error_isemail'), + 0 => array ( 'type' => 'ISEMAILADDRESS', 'allowempty' => 'y', 'errmsg'=> 'email_error_isemail'), ), 'default' => '', 'value' => '', -- GitLab From e5b006009006dbd738a8a11cf2415bb9a30580d0 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 21 Jul 2020 15:17:58 +0200 Subject: [PATCH 0311/1368] Fixed issue with security_settings.ini not being creted on CentOS. --- install/dist/lib/fedora.lib.php | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php index 3af8746908..6a1c5048e8 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -953,24 +953,13 @@ class installer_dist extends installer_base { //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - - //* Apply changed security_settings.ini values to new security_settings.ini file - if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { - $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); - $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini')); - if(is_array($security_settings_new) && is_array($security_settings_old)) { - foreach($security_settings_new as $section => $sval) { - if(is_array($sval)) { - foreach($sval as $key => $val) { - if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) { - $security_settings_new[$section][$key] = $security_settings_old[$section][$key]; - } - } - } - } - file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new)); - } + + $configfile = 'security_settings.ini'; + if(is_file($install_dir.'/security/'.$configfile)) { + copy($install_dir.'/security/'.$configfile, $install_dir.'/security/'.$configfile.'~'); } + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); + wf($install_dir.'/security/'.$configfile, $content); //* Create a symlink, so ISPConfig is accessible via web // Replaced by a separate vhost definition for port 8080 -- GitLab From f765f1b55fec7402cb327f8b26a18ce88580271c Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 21 Jul 2020 15:18:14 +0200 Subject: [PATCH 0312/1368] Fixed formatting --- install/lib/install.lib.php | 16 ++++++++-------- server/lib/classes/monitor_tools.inc.php | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 9312a8981a..2ed873d9ba 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -345,15 +345,15 @@ function get_distname() { $distid = 'centos72'; } swriteln("Operating System: CentOS $var\n"); - } elseif(stristr($content, 'CentOS Linux release 8')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distbaseid = 'fedora'; + } elseif(stristr($content, 'CentOS Linux release 8')) { + $distname = 'CentOS'; + $distver = 'Unknown'; + $distbaseid = 'fedora'; $distid = 'centos80'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - swriteln("Operating System: CentOS $var\n"); + $var=explode(" ", $content); + $var=explode(".", $var[3]); + $var=$var[0].".".$var[1]; + swriteln("Operating System: CentOS $var\n"); } else { $distname = 'Redhat'; $distver = 'Unknown'; diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 75e75c7f30..e349acd128 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -323,14 +323,14 @@ class monitor_tools { } else { $distid = 'centos72'; } - } elseif(stristr($content, 'CentOS Linux release 8')) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); - $distname = 'CentOS'; - $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; - $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; + } elseif(stristr($content, 'CentOS Linux release 8')) { + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); + $distname = 'CentOS'; + $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; + $distbaseid = 'fedora'; + $var=explode(" ", $content); + $var=explode(".", $var[3]); + $var=$var[0].".".$var[1]; } else { $distname = 'Redhat'; $distver = 'Unknown'; -- GitLab From 60f83685bccbe050c17694149db696ae5ced9a10 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 21 Jul 2020 17:57:05 +0200 Subject: [PATCH 0313/1368] Prevent error to be shown on the shell when bind version is queried. --- server/plugins-available/bind_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php index f2dc603ec5..d4b4a7c01c 100644 --- a/server/plugins-available/bind_plugin.inc.php +++ b/server/plugins-available/bind_plugin.inc.php @@ -225,7 +225,7 @@ class bind_plugin { //* Get the bind version $bind_caa = false; - $bind = explode("\n", shell_exec('which named bind')); + $bind = explode("\n", shell_exec('which named bind 2> /dev/null')); $bind = reset($bind); if(is_executable($bind)) { exec($bind . ' -v 2>&1', $tmp); -- GitLab From f3c43b1411112441b93f0293c6e538f0a7f1b80b Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Tue, 31 Dec 2019 21:51:40 +0100 Subject: [PATCH 0314/1368] Check if we actually have a service enabled --- interface/lib/classes/system.inc.php | 12 +++++++ interface/web/mail/lib/module.conf.php | 48 ++++++++++++++------------ 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index 89507ea68c..a4e1d06550 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -39,6 +39,18 @@ class system { if(!preg_match('/^[a-z]+$/', $service)) $app->error('Invalid service '.$service); + // Check the servers table to see which kinds of servers we actually have enabled. + // simple query cache + if($this->server_count===null) { + $this->server_count = $app->db->queryOneRecord("SELECT SUM(mail_server) as mail, SUM(web_server) AS web, SUM(dns_server) AS dns, SUM(file_server) AS file, + SUM(db_server) AS db, SUM(vserver_server) AS vserver, SUM(proxy_server) AS proxy, SUM(firewall_server) AS firewall, SUM(xmpp_server) AS xmpp + FROM `server` WHERE mirror_server_id = 0"); + } + // Check if we have the service enabled. + if ($this->server_count[$service] == 0) { + return FALSE; + } + if(isset($_SESSION['s']['user']) && $_SESSION['s']['user']['typ'] == 'admin') return true; //* We do not check admin-users // simple query cache diff --git a/interface/web/mail/lib/module.conf.php b/interface/web/mail/lib/module.conf.php index cc100cd7d2..5a06eb8b65 100644 --- a/interface/web/mail/lib/module.conf.php +++ b/interface/web/mail/lib/module.conf.php @@ -150,31 +150,33 @@ if($app->auth->get_client_limit($userid, 'fetchmail') != 0) } //**** XMPP Menu -$items = array(); - -if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) -{ - $items[] = array( 'title' => 'XMPP Domain', - 'target' => 'content', - 'link' => 'mail/xmpp_domain_list.php', - 'html_id' => 'xmpp_domain_list'); +if ($app->system->has_service($userid, 'xmpp')) { + $items = array(); + + if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) + { + $items[] = array( 'title' => 'XMPP Domain', + 'target' => 'content', + 'link' => 'mail/xmpp_domain_list.php', + 'html_id' => 'xmpp_domain_list'); + } + + if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) + { + $items[] = array( 'title' => 'XMPP Account', + 'target' => 'content', + 'link' => 'mail/xmpp_user_list.php', + 'html_id' => 'xmpp_user_list'); + } + + if(count($items)) + { + $module['nav'][] = array( 'title' => 'Jabber / XMPP', + 'open' => 1, + 'items' => $items); + } } -if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) -{ - $items[] = array( 'title' => 'XMPP Account', - 'target' => 'content', - 'link' => 'mail/xmpp_user_list.php', - 'html_id' => 'xmpp_user_list'); -} - -if(count($items) && $app->system->has_service($userid, 'xmpp')) - $module['nav'][] = array( 'title' => 'Jabber / XMPP', - 'open' => 1, - 'items' => $items); - - - //**** Statistics menu $items = array(); -- GitLab From 59f5fa875d97d0e613e6d94077c1cfaff34dad20 Mon Sep 17 00:00:00 2001 From: Dominik Date: Wed, 22 Jul 2020 14:23:19 +0200 Subject: [PATCH 0315/1368] rollback sender_cc change --- install/sql/incremental/upd_dev_collection.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index d4acf6914d..a5d4acdc62 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -38,7 +38,6 @@ ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME -- change cc and sender_cc column type ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; -ALTER TABLE `mail_user` CHANGE `sender_cc` `sender_cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; -- was missing in incremental, inserted for fixing older installations ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; -- GitLab From c8ac70ba7ccf3ba14eab6c9ad934808b5fdf9869 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 22 Jul 2020 15:04:44 +0200 Subject: [PATCH 0316/1368] space to tabs --- interface/lib/classes/system.inc.php | 22 ++++++------- interface/web/mail/lib/module.conf.php | 44 +++++++++++++------------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index a4e1d06550..484ef2b665 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -39,17 +39,17 @@ class system { if(!preg_match('/^[a-z]+$/', $service)) $app->error('Invalid service '.$service); - // Check the servers table to see which kinds of servers we actually have enabled. - // simple query cache - if($this->server_count===null) { - $this->server_count = $app->db->queryOneRecord("SELECT SUM(mail_server) as mail, SUM(web_server) AS web, SUM(dns_server) AS dns, SUM(file_server) AS file, - SUM(db_server) AS db, SUM(vserver_server) AS vserver, SUM(proxy_server) AS proxy, SUM(firewall_server) AS firewall, SUM(xmpp_server) AS xmpp - FROM `server` WHERE mirror_server_id = 0"); - } - // Check if we have the service enabled. - if ($this->server_count[$service] == 0) { - return FALSE; - } + // Check the servers table to see which kinds of servers we actually have enabled. + // simple query cache + if($this->server_count === null) { + $this->server_count = $app->db->queryOneRecord("SELECT SUM(mail_server) as mail, SUM(web_server) AS web, SUM(dns_server) AS dns, SUM(file_server) AS file, + SUM(db_server) AS db, SUM(vserver_server) AS vserver, SUM(proxy_server) AS proxy, SUM(firewall_server) AS firewall, SUM(xmpp_server) AS xmpp + FROM `server` WHERE mirror_server_id = 0"); + } + // Check if we have the service enabled. + if ($this->server_count[$service] == 0) { + return FALSE; + } if(isset($_SESSION['s']['user']) && $_SESSION['s']['user']['typ'] == 'admin') return true; //* We do not check admin-users diff --git a/interface/web/mail/lib/module.conf.php b/interface/web/mail/lib/module.conf.php index 5a06eb8b65..d9d97bc8b2 100644 --- a/interface/web/mail/lib/module.conf.php +++ b/interface/web/mail/lib/module.conf.php @@ -153,28 +153,28 @@ if($app->auth->get_client_limit($userid, 'fetchmail') != 0) if ($app->system->has_service($userid, 'xmpp')) { $items = array(); - if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) - { - $items[] = array( 'title' => 'XMPP Domain', - 'target' => 'content', - 'link' => 'mail/xmpp_domain_list.php', - 'html_id' => 'xmpp_domain_list'); - } - - if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) - { - $items[] = array( 'title' => 'XMPP Account', - 'target' => 'content', - 'link' => 'mail/xmpp_user_list.php', - 'html_id' => 'xmpp_user_list'); - } - - if(count($items)) - { - $module['nav'][] = array( 'title' => 'Jabber / XMPP', - 'open' => 1, - 'items' => $items); - } + if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) + { + $items[] = array( 'title' => 'XMPP Domain', + 'target' => 'content', + 'link' => 'mail/xmpp_domain_list.php', + 'html_id' => 'xmpp_domain_list'); + } + + if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) + { + $items[] = array( 'title' => 'XMPP Account', + 'target' => 'content', + 'link' => 'mail/xmpp_user_list.php', + 'html_id' => 'xmpp_user_list'); + } + + if(count($items)) + { + $module['nav'][] = array( 'title' => 'Jabber / XMPP', + 'open' => 1, + 'items' => $items); + } } //**** Statistics menu -- GitLab From 09da773b12b32ce79a73cd2824bd6414ff45004c Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Wed, 22 Jul 2020 17:04:07 +0200 Subject: [PATCH 0317/1368] Extended client delete dialog (Implements #4370) --- interface/web/client/client_del.php | 53 +++++++++++++----- .../web/client/lib/lang/ar_client_del.lng | 3 + .../web/client/lib/lang/bg_client_del.lng | 3 + .../web/client/lib/lang/br_client_del.lng | 3 + .../web/client/lib/lang/ca_client_del.lng | 3 + .../web/client/lib/lang/cz_client_del.lng | 3 + .../web/client/lib/lang/de_client_del.lng | 5 +- .../web/client/lib/lang/dk_client_del.lng | 3 + .../web/client/lib/lang/el_client_del.lng | 3 + .../web/client/lib/lang/en_client_del.lng | 3 + .../web/client/lib/lang/es_client_del.lng | 3 + .../web/client/lib/lang/fi_client_del.lng | 3 + .../web/client/lib/lang/fr_client_del.lng | 3 + .../web/client/lib/lang/hr_client_del.lng | 3 + .../web/client/lib/lang/hu_client_del.lng | 3 + .../web/client/lib/lang/id_client_del.lng | 3 + .../web/client/lib/lang/it_client_del.lng | 3 + .../web/client/lib/lang/ja_client_del.lng | 3 + .../web/client/lib/lang/nl_client_del.lng | 3 + .../web/client/lib/lang/pl_client_del.lng | 3 + .../web/client/lib/lang/pt_client_del.lng | 3 + .../web/client/lib/lang/ro_client_del.lng | 3 + .../web/client/lib/lang/ru_client_del.lng | 3 + .../web/client/lib/lang/se_client_del.lng | 3 + .../web/client/lib/lang/sk_client_del.lng | 3 + .../web/client/lib/lang/tr_client_del.lng | 3 + interface/web/client/templates/client_del.htm | 56 +++++++++++-------- 27 files changed, 148 insertions(+), 38 deletions(-) diff --git a/interface/web/client/client_del.php b/interface/web/client/client_del.php index d92dc56008..c018b7a27d 100644 --- a/interface/web/client/client_del.php +++ b/interface/web/client/client_del.php @@ -51,6 +51,32 @@ $app->load('tform_actions'); class page_action extends tform_actions { + // db_table => info_field for onDelete - empty = show only the amount + private $tables = array( + 'cron' => '', + 'client' => 'contact_name', + 'dns_rr' => '', + 'dns_soa' => 'origin', + 'dns_slave' => 'origin', + 'domain' => 'domain', + 'ftp_user' => 'username', + 'mail_access' => 'source', + 'mail_content_filter' => '', + 'mail_domain' => 'domain', + 'mail_forwarding' => '', + 'mail_get' => '', + 'mail_mailinglist' => 'listname', + 'mail_user' => 'email', + 'mail_user_filter' => '', + 'shell_user' => 'username', + 'spamfilter_users' => '', 'spamfilter_wblist' => '', + 'support_message' => '', + 'web_domain' => 'domain', + 'web_folder' => 'path', + 'web_folder_user' => 'username', + 'web_database_user' => 'database_user', + ); + function onDelete() { global $app, $conf, $list_def_file, $tform_def_file; @@ -80,19 +106,22 @@ class page_action extends tform_actions { $this->dataRecord = $app->tform->getDataRecord($this->id); $client_id = $app->functions->intval($this->dataRecord['client_id']); $client_group = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $client_id); - - // Get all records (sub-clients, mail, web, etc....) of this client. - $tables = 'cron,client,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_traffic,domain'; - $tables_array = explode(',', $tables); - $client_group_id = $app->functions->intval($client_group['groupid']); - $table_list = array(); + $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { - foreach($tables_array as $table) { + foreach($this->tables as $table => $field) { if($table != '') { $records = $app->db->queryAllRecords("SELECT * FROM ?? WHERE sys_groupid = ?", $table, $client_group_id); - $number = count($records); - if($number > 0) $table_list[] = array('table' => $table."(".$number.")"); + if(is_array($records) && !empty($records) && $field !== false) { + $data = array(); + $number = count($records); + foreach($records as $rec) { + if($field != '' && $field !== false) $data['data'] .= '
  • '.$rec[$field].'
  • '; + } + $data['count'] = $number; + $data['table'] = $table; + $table_list[] = $data; + } } } } @@ -100,7 +129,6 @@ class page_action extends tform_actions { $app->tpl->setVar('id', $this->id); $app->tpl->setVar('number_records', $number); $app->tpl->setLoop('records', $table_list); - //* load language file $lng_file = 'lib/lang/'.$app->functions->check_language($_SESSION['s']['language']).'_client_del.lng'; include $lng_file; @@ -138,11 +166,9 @@ class page_action extends tform_actions { $app->db->query("DELETE FROM sys_user WHERE client_id = ?", $client_id); // Delete all records (sub-clients, mail, web, etc....) of this client. - $tables = 'cron,client,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_folder,web_folder_user,domain,mail_mailinglist,spamfilter_wblist'; - $tables_array = explode(',', $tables); $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { - foreach($tables_array as $table) { + foreach($this->tables as $table => $field) { if($table != '') { //* find the primary ID of the table $table_info = $app->db->tableInfo($table); @@ -150,6 +176,7 @@ class page_action extends tform_actions { foreach($table_info as $tmp) { if($tmp['option'] == 'primary') $index_field = $tmp['name']; } + //* Delete the records if($index_field != '') { $records = $app->db->queryAllRecords("SELECT * FROM ?? WHERE sys_groupid = ? ORDER BY ?? DESC", $table, $client_group_id, $index_field); diff --git a/interface/web/client/lib/lang/ar_client_del.lng b/interface/web/client/lib/lang/ar_client_del.lng index 0932e9568a..21ddcb9ea4 100644 --- a/interface/web/client/lib/lang/ar_client_del.lng +++ b/interface/web/client/lib/lang/ar_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/bg_client_del.lng b/interface/web/client/lib/lang/bg_client_del.lng index 54d4831d77..418abdc20c 100644 --- a/interface/web/client/lib/lang/bg_client_del.lng +++ b/interface/web/client/lib/lang/bg_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Изтрии клиента'; $wb['btn_cancel_txt'] = 'Отказ, без изтриване на клиента'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/br_client_del.lng b/interface/web/client/lib/lang/br_client_del.lng index 880c12c36a..fbea0a66a0 100644 --- a/interface/web/client/lib/lang/br_client_del.lng +++ b/interface/web/client/lib/lang/br_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Esta ação removerá os seguintes registros associ $wb['btn_save_txt'] = 'Remover o cliente'; $wb['btn_cancel_txt'] = 'Cancelar sem remover o cliente'; $wb['confirm_client_delete_txt'] = 'Você tem certeza que deseja remover este cliente?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/ca_client_del.lng b/interface/web/client/lib/lang/ca_client_del.lng index 2ec2d877bf..4c4506c99b 100644 --- a/interface/web/client/lib/lang/ca_client_del.lng +++ b/interface/web/client/lib/lang/ca_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Cette action va supprimer le nombre d\'enregistreme $wb['btn_save_txt'] = 'Effacer le client'; $wb['btn_cancel_txt'] = 'Annuler sans effacer le client'; $wb['confirm_client_delete_txt'] = 'Confirmez-vous la suppression de ce client ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/cz_client_del.lng b/interface/web/client/lib/lang/cz_client_del.lng index 5374ea6f75..d19949fec5 100644 --- a/interface/web/client/lib/lang/cz_client_del.lng +++ b/interface/web/client/lib/lang/cz_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Tato akce smaže následující počet záznamů p $wb['btn_save_txt'] = 'Smazat klienta'; $wb['btn_cancel_txt'] = 'Zrušit bez smazání klienta'; $wb['confirm_client_delete_txt'] = 'Jste si jisti, že chcete smazat tohoto klienta ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/de_client_del.lng b/interface/web/client/lib/lang/de_client_del.lng index d13fcfa8fc..53aa0973c4 100644 --- a/interface/web/client/lib/lang/de_client_del.lng +++ b/interface/web/client/lib/lang/de_client_del.lng @@ -3,5 +3,8 @@ $wb['confirm_action_txt'] = 'Aktion bestätigen'; $wb['delete_explanation'] = 'Diese Aktion wird folgende Anzahl an Datensätzen des Kunden löschen'; $wb['btn_save_txt'] = 'Kunden löschen'; $wb['btn_cancel_txt'] = 'Abbrechen, ohne den Kunden zu löschen'; -$wb['confirm_client_delete_txt'] = 'Sind Sie sicher, daß Sie den Kunden löschen möchten?'; +$wb['confirm_client_delete_txt'] = 'Sind Sie sicher, dass Sie den Kunden löschen möchte'; +$wb['table_txt'] = 'Tabelle'; +$wb['data_txt'] = 'Daten'; +$wb['list_head_txt'] = 'Kunde löschen'; ?> diff --git a/interface/web/client/lib/lang/dk_client_del.lng b/interface/web/client/lib/lang/dk_client_del.lng index ba5f592219..9bb157cdf4 100644 --- a/interface/web/client/lib/lang/dk_client_del.lng +++ b/interface/web/client/lib/lang/dk_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Denne handling vil slette følgende antal poster fo $wb['btn_save_txt'] = 'Slet kunden'; $wb['btn_cancel_txt'] = 'Annullere uden at slette kunden'; $wb['confirm_client_delete_txt'] = 'Er du sikker på at du vil slette denne kunde?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/el_client_del.lng b/interface/web/client/lib/lang/el_client_del.lng index 60ebd617d0..3f91a5c2b0 100644 --- a/interface/web/client/lib/lang/el_client_del.lng +++ b/interface/web/client/lib/lang/el_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Η ενέργεια θα διαγράψει τις $wb['btn_save_txt'] = 'Διαγραφή πελάτη'; $wb['btn_cancel_txt'] = 'Ακύρωση χωρίς διαγραφή πελάτη'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/en_client_del.lng b/interface/web/client/lib/lang/en_client_del.lng index 7b1bbf9d70..5e2a00b929 100644 --- a/interface/web/client/lib/lang/en_client_del.lng +++ b/interface/web/client/lib/lang/en_client_del.lng @@ -4,4 +4,7 @@ $wb["delete_explanation"] = 'This action will delete the following number of rec $wb["btn_save_txt"] = 'Delete the client'; $wb["btn_cancel_txt"] = 'Cancel without deleting the client'; $wb["confirm_client_delete_txt"] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/es_client_del.lng b/interface/web/client/lib/lang/es_client_del.lng index ff7c09c191..9496eb8146 100644 --- a/interface/web/client/lib/lang/es_client_del.lng +++ b/interface/web/client/lib/lang/es_client_del.lng @@ -4,4 +4,7 @@ $wb['btn_save_txt'] = 'Borrar el cliente'; $wb['confirm_action_txt'] = 'Confirmar acción'; $wb['confirm_client_delete_txt'] = '¿Está seguro de que desea borrar el cliente?'; $wb['delete_explanation'] = 'Esta acción eliminará el siguiente número de registros asociados con este cliente'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/fi_client_del.lng b/interface/web/client/lib/lang/fi_client_del.lng index b87895b8c0..4336b765d3 100644 --- a/interface/web/client/lib/lang/fi_client_del.lng +++ b/interface/web/client/lib/lang/fi_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Tämä toiminto alla olevan määrän tämän asiak $wb['btn_save_txt'] = 'Poista käyttäjä'; $wb['btn_cancel_txt'] = 'Keskeytä poistamatta asiakasta'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/fr_client_del.lng b/interface/web/client/lib/lang/fr_client_del.lng index 4fdb5dac77..051c840fb2 100644 --- a/interface/web/client/lib/lang/fr_client_del.lng +++ b/interface/web/client/lib/lang/fr_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Cette action va supprimer le nombre d’enregistrem $wb['btn_save_txt'] = 'Effacer le client'; $wb['btn_cancel_txt'] = 'Annuler sans effacer le client'; $wb['confirm_client_delete_txt'] = 'Confirmez-vous la suppression de ce client ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/hr_client_del.lng b/interface/web/client/lib/lang/hr_client_del.lng index 939cc59fb6..5f06b87008 100644 --- a/interface/web/client/lib/lang/hr_client_del.lng +++ b/interface/web/client/lib/lang/hr_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Ukoliko potvrdite izbrisati će se svi zapisi povez $wb['btn_save_txt'] = 'Obriši klijenta'; $wb['btn_cancel_txt'] = 'Prekini i ne briši klijenta'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/hu_client_del.lng b/interface/web/client/lib/lang/hu_client_del.lng index 0932e9568a..21ddcb9ea4 100644 --- a/interface/web/client/lib/lang/hu_client_del.lng +++ b/interface/web/client/lib/lang/hu_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/id_client_del.lng b/interface/web/client/lib/lang/id_client_del.lng index 1adf18bd7d..2a8c6e32a1 100644 --- a/interface/web/client/lib/lang/id_client_del.lng +++ b/interface/web/client/lib/lang/id_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Tindakan ini akan menghapus sejumlah record yang te $wb['btn_save_txt'] = 'Hapus Klien'; $wb['btn_cancel_txt'] = 'Batalkan Tanpa Menghapus Klien'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/it_client_del.lng b/interface/web/client/lib/lang/it_client_del.lng index 49811c377e..a17dc6a7ff 100644 --- a/interface/web/client/lib/lang/it_client_del.lng +++ b/interface/web/client/lib/lang/it_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Questa operazione cancellerà i seguenti record ass $wb['btn_save_txt'] = 'Cancella cliente'; $wb['btn_cancel_txt'] = 'Annulla senza cancellare il cliente'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/ja_client_del.lng b/interface/web/client/lib/lang/ja_client_del.lng index 0932e9568a..21ddcb9ea4 100644 --- a/interface/web/client/lib/lang/ja_client_del.lng +++ b/interface/web/client/lib/lang/ja_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/nl_client_del.lng b/interface/web/client/lib/lang/nl_client_del.lng index 294fb5011b..9b9e5d5bc3 100644 --- a/interface/web/client/lib/lang/nl_client_del.lng +++ b/interface/web/client/lib/lang/nl_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Deze actie verwijderd het volgende aantal aan recor $wb['btn_save_txt'] = 'Verwijder de klant'; $wb['btn_cancel_txt'] = 'Annuleren zonder de klant te verwijderen'; $wb['confirm_client_delete_txt'] = 'Weet je zeker dat je deze klant wil verwijderen ?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/pl_client_del.lng b/interface/web/client/lib/lang/pl_client_del.lng index 429c61b4c7..4e5a2386f9 100644 --- a/interface/web/client/lib/lang/pl_client_del.lng +++ b/interface/web/client/lib/lang/pl_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Ta akcja usunie następującą liczbę rekordów po $wb['btn_save_txt'] = 'Usuń klienta'; $wb['btn_cancel_txt'] = 'Anuluj bez usuwania klienta'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/pt_client_del.lng b/interface/web/client/lib/lang/pt_client_del.lng index ef71fa91e5..7b56473550 100644 --- a/interface/web/client/lib/lang/pt_client_del.lng +++ b/interface/web/client/lib/lang/pt_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Atenção: está acção ira remover todos os objec $wb['btn_save_txt'] = 'Remover o cliente'; $wb['btn_cancel_txt'] = 'Cancelar sem remover o cliente'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/ro_client_del.lng b/interface/web/client/lib/lang/ro_client_del.lng index 0932e9568a..21ddcb9ea4 100644 --- a/interface/web/client/lib/lang/ro_client_del.lng +++ b/interface/web/client/lib/lang/ro_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/ru_client_del.lng b/interface/web/client/lib/lang/ru_client_del.lng index 94a05acca0..cf371efeb9 100644 --- a/interface/web/client/lib/lang/ru_client_del.lng +++ b/interface/web/client/lib/lang/ru_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Это действие удалит следующ $wb['btn_save_txt'] = 'Удалить клиента'; $wb['btn_cancel_txt'] = 'Отменить без удаления'; $wb['confirm_client_delete_txt'] = 'Вы уверены, что хотите удалить этот клиента?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/se_client_del.lng b/interface/web/client/lib/lang/se_client_del.lng index 99aa9d8a42..56f2f0d9d7 100644 --- a/interface/web/client/lib/lang/se_client_del.lng +++ b/interface/web/client/lib/lang/se_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Radera kunden'; $wb['btn_cancel_txt'] = 'Avbryt utan att radera kunden'; $wb['confirm_client_delete_txt'] = 'Är du säker på att du vill radera den här kunden?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/sk_client_del.lng b/interface/web/client/lib/lang/sk_client_del.lng index 0932e9568a..21ddcb9ea4 100644 --- a/interface/web/client/lib/lang/sk_client_del.lng +++ b/interface/web/client/lib/lang/sk_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'This action will delete the following number of rec $wb['btn_save_txt'] = 'Delete the client'; $wb['btn_cancel_txt'] = 'Cancel without deleting the client'; $wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/lib/lang/tr_client_del.lng b/interface/web/client/lib/lang/tr_client_del.lng index b93579998b..82f00ba9d5 100644 --- a/interface/web/client/lib/lang/tr_client_del.lng +++ b/interface/web/client/lib/lang/tr_client_del.lng @@ -4,4 +4,7 @@ $wb['delete_explanation'] = 'Bu işlem bu müşteri ile ilgili şu kayıtları s $wb['btn_save_txt'] = 'Müşteriyi sil'; $wb['btn_cancel_txt'] = 'Müşteriyi silmeden iptal et'; $wb['confirm_client_delete_txt'] = 'Bu müşteriyi silmek istediğinize emin misiniz?'; +$wb['list_head_txt'] = 'Delete Client'; +$wb['table_txt'] = 'Table'; +$wb['data_txt'] = 'Data'; ?> diff --git a/interface/web/client/templates/client_del.htm b/interface/web/client/templates/client_del.htm index e24ca768c2..5e7201ce5c 100644 --- a/interface/web/client/templates/client_del.htm +++ b/interface/web/client/templates/client_del.htm @@ -1,24 +1,32 @@ - -

    - -
    - - :

    - - , - - -

    -
    -
    -   -
    -   - - -
    - - -
    \ No newline at end of file + + + :

    +
    +
    {tmpl_var name="email"} - {tmpl_var name="login"} - {tmpl_var name="login"} {tmpl_var name="name"} {tmpl_var name="autoresponder"} {tmpl_var name="postfix"}
    + + + + + + + + + + + + + + +
    {tmpl_var name="table"} ({tmpl_var name="count"}){tmpl_var name="data"}
    +
    + +

    + +  +
    +  + +
    + + +
    -- GitLab From 21b6004208d44289e4695016e9c7634ea658bd77 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Mon, 10 Feb 2020 09:40:53 +0100 Subject: [PATCH 0318/1368] Show (disabled) client field on mail_domain edit --- interface/web/mail/mail_domain_edit.php | 8 +++++++- interface/web/mail/templates/mail_domain_edit.htm | 13 ++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 51d55ef2de..6f2bdb8f91 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -75,7 +75,13 @@ class page_action extends tform_actions { $app->uses('ini_parser,getconf'); $settings = $app->getconf->get_global_config('domains'); - if($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] != 'y') { + if($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] == 'y') { + $sql = "SELECT CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id = ?"; + $clients = $app->db->queryAllRecords($sql, $this->dataRecord['sys_groupid']); + $client_select = ''; + $app->tpl->setVar("client_group_name", $client_select); + } + elseif($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] != 'y') { // Getting Clients of the user $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY client.company_name, client.contact_name, sys_group.name"; diff --git a/interface/web/mail/templates/mail_domain_edit.htm b/interface/web/mail/templates/mail_domain_edit.htm index 1e4a49c2a5..42ae8fe280 100644 --- a/interface/web/mail/templates/mail_domain_edit.htm +++ b/interface/web/mail/templates/mail_domain_edit.htm @@ -6,21 +6,28 @@ {tmpl_var name='server_id'} - +
    - + +
    + +
    +
    +
    -
    + -- GitLab From 272fc9ac8fc74b1e595598dc04c40ca66e724d12 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 23 Jul 2020 10:22:24 +0200 Subject: [PATCH 0319/1368] Fix query and tab indent --- interface/web/mail/mail_domain_edit.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 6f2bdb8f91..19aa4f91e6 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -75,13 +75,13 @@ class page_action extends tform_actions { $app->uses('ini_parser,getconf'); $settings = $app->getconf->get_global_config('domains'); - if($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] == 'y') { - $sql = "SELECT CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id = ?"; - $clients = $app->db->queryAllRecords($sql, $this->dataRecord['sys_groupid']); - $client_select = ''; - $app->tpl->setVar("client_group_name", $client_select); - } - elseif($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] != 'y') { + if($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] == 'y') { + $sql = "SELECT CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.groupid = ?"; + $clients = $app->db->queryAllRecords($sql, $this->dataRecord['sys_groupid']); + $client_select = ''; + $app->tpl->setVar("client_group_name", $client_select); + } + elseif($_SESSION["s"]["user"]["typ"] == 'admin' && $settings['use_domain_module'] != 'y') { // Getting Clients of the user $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY client.company_name, client.contact_name, sys_group.name"; -- GitLab From 0d61c249a2e10fbaa93faaadec93391e6f9ef2ed Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 11:28:27 +0200 Subject: [PATCH 0320/1368] Revert "Merge branch 'http2-always' into 'stable-3.1'" This reverts merge request !1033 --- .../sql/incremental/upd_dev_collection.sql | 5 +-- install/sql/ispconfig3.sql | 1 + install/tpl/apache_apps.vhost.master | 16 +++++++--- install/tpl/server.ini.master | 1 + .../web/admin/form/server_config.tform.php | 9 ++++++ .../web/admin/lib/lang/ar_server_config.lng | 1 + .../web/admin/lib/lang/bg_server_config.lng | 1 + .../web/admin/lib/lang/br_server_config.lng | 1 + .../web/admin/lib/lang/ca_server_config.lng | 1 + .../web/admin/lib/lang/cz_server_config.lng | 1 + .../web/admin/lib/lang/de_server_config.lng | 1 + .../web/admin/lib/lang/dk_server_config.lng | 1 + .../web/admin/lib/lang/el_server_config.lng | 1 + .../web/admin/lib/lang/en_server_config.lng | 1 + .../web/admin/lib/lang/es_server_config.lng | 1 + .../web/admin/lib/lang/fi_server_config.lng | 1 + .../web/admin/lib/lang/fr_server_config.lng | 1 + .../web/admin/lib/lang/hr_server_config.lng | 1 + .../web/admin/lib/lang/hu_server_config.lng | 1 + .../web/admin/lib/lang/id_server_config.lng | 1 + .../web/admin/lib/lang/it_server_config.lng | 1 + .../web/admin/lib/lang/ja_server_config.lng | 1 + .../web/admin/lib/lang/nl_server_config.lng | 1 + .../web/admin/lib/lang/pl_server_config.lng | 1 + .../web/admin/lib/lang/pt_server_config.lng | 1 + .../web/admin/lib/lang/ro_server_config.lng | 1 + .../web/admin/lib/lang/ru_server_config.lng | 1 + .../web/admin/lib/lang/se_server_config.lng | 1 + .../web/admin/lib/lang/sk_server_config.lng | 1 + .../web/admin/lib/lang/tr_server_config.lng | 1 + .../templates/server_config_web_edit.htm | 22 +++++++++---- .../web/sites/form/web_vhost_domain.tform.php | 9 ++++++ .../sites/lib/lang/ar_web_vhost_domain.lng | 1 + .../sites/lib/lang/bg_web_vhost_domain.lng | 1 + .../sites/lib/lang/br_web_vhost_domain.lng | 1 + .../sites/lib/lang/ca_web_vhost_domain.lng | 1 + .../sites/lib/lang/cz_web_vhost_domain.lng | 1 + .../sites/lib/lang/de_web_vhost_domain.lng | 1 + .../sites/lib/lang/dk_web_vhost_domain.lng | 1 + .../sites/lib/lang/el_web_vhost_domain.lng | 1 + .../sites/lib/lang/en_web_vhost_domain.lng | 1 + .../sites/lib/lang/es_web_vhost_domain.lng | 1 + .../sites/lib/lang/fi_web_vhost_domain.lng | 1 + .../sites/lib/lang/fr_web_vhost_domain.lng | 1 + .../sites/lib/lang/hr_web_vhost_domain.lng | 1 + .../sites/lib/lang/hu_web_vhost_domain.lng | 1 + .../sites/lib/lang/id_web_vhost_domain.lng | 1 + .../sites/lib/lang/it_web_vhost_domain.lng | 1 + .../sites/lib/lang/ja_web_vhost_domain.lng | 1 + .../sites/lib/lang/nl_web_vhost_domain.lng | 1 + .../sites/lib/lang/pl_web_vhost_domain.lng | 1 + .../sites/lib/lang/pt_web_vhost_domain.lng | 1 + .../sites/lib/lang/ro_web_vhost_domain.lng | 1 + .../sites/lib/lang/ru_web_vhost_domain.lng | 1 + .../sites/lib/lang/se_web_vhost_domain.lng | 1 + .../sites/lib/lang/sk_web_vhost_domain.lng | 1 + .../sites/lib/lang/tr_web_vhost_domain.lng | 1 + .../sites/templates/web_vhost_domain_ssl.htm | 16 +++++++--- interface/web/sites/web_vhost_domain_edit.php | 7 ++++ server/conf/apache_apps.vhost.master | 14 ++++++-- server/conf/nginx_vhost.conf.master | 32 +++++++++---------- server/conf/vhost.conf.master | 8 +++-- .../plugins-available/apache2_plugin.inc.php | 11 +++++++ server/plugins-available/nginx_plugin.inc.php | 12 +++++++ 64 files changed, 172 insertions(+), 41 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 8d673ae866..bf2f02f677 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -36,8 +36,5 @@ ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET -- add SSHFP and DNAME record ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; --- remove SPDY option -ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; - -- was missing in incremental, inserted for fixing older installations -ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index e0c3848aa5..c54f0ac345 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2070,6 +2070,7 @@ CREATE TABLE `web_domain` ( `traffic_quota_lock` enum('n','y') NOT NULL default 'n', `fastcgi_php_version` varchar(255) DEFAULT NULL, `proxy_directives` mediumtext, + `enable_spdy` ENUM('y','n') NULL DEFAULT 'n', `last_quota_notification` date NULL default NULL, `rewrite_rules` mediumtext, `added_date` date NULL DEFAULT NULL, diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 14f0f10da2..9cccf8d38e 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -10,14 +10,20 @@ ServerAdmin webmaster@localhost {tmpl_var name='apps_vhost_servername'} - + SetHandler None - + RequestHeader unset Proxy early + + {tmpl_if name="enable_spdy" op="==" value="y"} + + SpdyEnabled on + + {/tmpl_if} DocumentRoot {tmpl_var name='apps_vhost_dir'} @@ -33,7 +39,7 @@
    - + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -48,7 +54,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps @@ -81,3 +87,5 @@ + + diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index c500fb0cc2..5edc09807c 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -94,6 +94,7 @@ php_ini_path_apache=/etc/php5/apache2/php.ini php_ini_path_cgi=/etc/php5/cgi/php.ini check_apache_config=y enable_sni=y +enable_spdy=n skip_le_check=n enable_ip_wildcard=y overtraffic_notify_admin=y diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index de2caf1750..0d570f2e94 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -1317,6 +1317,15 @@ $form["tabs"]['web'] = array( 'width' => '40', 'maxlength' => '255' ), + 'enable_spdy' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array ( + 0 => 'n', + 1 => 'y' + ) + ), 'apps_vhost_enabled' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index 4123c113d1..0bd4567220 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index 463d1c7b2a..ae760d95cc 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index 65a2dc4fd7..b24f1ef905 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -277,6 +277,7 @@ $wb['network_filesystem_txt'] = 'Sistema de arquivos de rede'; $wb['php_ini_check_minutes_txt'] = 'Verificar alterações no php.ini a cada X minutos'; $wb['php_ini_check_minutes_error_empty'] = 'Por favor, insira um valor para verificação de alterações no php.ini.'; $wb['php_ini_check_minutes_info_txt'] = '0 = sem verificações'; +$wb['enable_spdy_txt'] = 'Tornar SPDY/HTTP2 disponível'; $wb['web_settings_txt'] = 'Servidor web'; $wb['xmpp_server_txt'] = 'Servidor xmpp'; $wb['xmpp_use_ipv6_txt'] = 'Usar IPv6'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 496df78f77..b4af211185 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -272,6 +272,7 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index fbc1d777c3..76783fd95a 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -269,6 +269,7 @@ $wb['disabled_txt'] = 'Vypnuto'; $wb['php_ini_check_minutes_txt'] = 'Provádět kontrolu změny obsahu souboru php.ini každých X minut'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Použít IPv6'; diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index 1646360a7a..7487bec764 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -275,6 +275,7 @@ $wb['php_ini_check_minutes_info_txt'] = '0 = keine Prüfung'; $wb['php_handler_txt'] = 'Standard-PHP-Handler'; $wb['php_fpm_default_chroot_txt'] = 'Default chrooted PHP-FPM'; $wb['php_fpm_incron_reload_txt'] = 'Install incron trigger file to reload PHP-FPM'; +$wb['enable_spdy_txt'] = 'Stellt SPDY/HTTP2 zur Verfügung'; $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['disabled_txt'] = 'Disabled'; diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index 476e432161..44ffc53391 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -273,6 +273,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index cf215b939e..46ce9bfcfc 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index e12e1d4042..2eea4f220d 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -277,6 +277,7 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index f343931695..d400e81367 100644 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -68,6 +68,7 @@ $wb['do_not_try_rescue_mongodb_txt'] = 'Deshabilitar monitorización de MongoDB' $wb['do_not_try_rescue_mysql_txt'] = 'Deshabilitar monitorización de MySQL'; $wb['enable_ip_wildcard_txt'] = 'Activar comodín IP (*)'; $wb['enable_sni_txt'] = 'Habilitar SNI'; +$wb['enable_spdy_txt'] = 'Hacer que SPDY/HTTP2 esté disponible'; $wb['fastcgi_alias_error_empty'] = 'El alias de FastCGI está vacío.'; $wb['fastcgi_alias_error_regex'] = 'El alias de fastcgi es inválido.'; $wb['fastcgi_alias_txt'] = 'Alias de FastCGI'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index 6eefadb45f..b5fd51c4f8 100644 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index 8871795209..4b020da068 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -272,6 +272,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index b36fd13486..93333280b6 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index 789e86a649..e48f231f2e 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index ee197a4d0a..4023e619b0 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index cd71123720..928ca7ebc2 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -272,6 +272,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 4ef8d13422..1220886fc3 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index 5b5fcf122b..9ff06f34d3 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index 1d6caa8e5e..95b289ef72 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index fcf7a23e88..31360c0b0e 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index 2c3b4fdce4..74055e9874 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index f3f5a47c7d..8754aece3c 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'Стойкость DKIM'; $wb['php_ini_check_minutes_txt'] = 'Проверять изменения в PHP.ini файле каждые Х минут'; $wb['php_ini_check_minutes_error_empty'] = 'Пожалуйста, укажите значение, как часто php.ini должен быть проверен на изменения.'; $wb['php_ini_check_minutes_info_txt'] = '0 = не проверять'; +$wb['enable_spdy_txt'] = 'Сделать SPDY/HTTP2 доступным'; $wb['web_settings_txt'] = 'Web-сервер'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Использовать IPv6'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index 634c3655a7..c45116d4fa 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index 50c8c0b4c9..c4858143b0 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -274,6 +274,7 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; +$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index 09aa3adf2d..b52479ecf5 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -276,6 +276,7 @@ $wb['network_filesystem_txt'] = 'Ağ Dosya Sistemi'; $wb['php_ini_check_minutes_txt'] = 'Her X dakikada php.ini dosyasındaki değişiklikler denetlensin'; $wb['php_ini_check_minutes_error_empty'] = 'php.ini dosyasındaki değişikliklerin kaç dakikada bir denetleneceğini yazın.'; $wb['php_ini_check_minutes_info_txt'] = '0 = denetim yapılmaz'; +$wb['enable_spdy_txt'] = 'SPDY/HTTP2 Kullanılsın'; $wb['web_settings_txt'] = 'Web Sunucu'; $wb['xmpp_server_txt'] = 'XMPP Sunucu'; $wb['xmpp_use_ipv6_txt'] = 'IPv6 Kullanılsın'; diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index 64173549c9..f5f38affe7 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -163,7 +163,7 @@
    - {tmpl_var name='overquota_db_notify_client'} + {tmpl_var name='overquota_db_notify_client'}
    @@ -197,6 +197,14 @@ {tmpl_var name='enable_sni'}
    +
    + +
    + +
    +
    @@ -249,7 +257,7 @@
    - + @@ -353,7 +361,7 @@
    - + @@ -381,15 +389,15 @@
    - + - + - +
    @@ -402,7 +410,7 @@ serverType = $(this).val(); adjustForm(); }); - + function adjustForm(){ if(serverType == "nginx"){ jQuery('.nginx').show(); diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index 7da71281cf..beb952bfe6 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -591,6 +591,15 @@ if($ssl_available) { 'default' => '', 'value' => array('' => 'none_txt', 'save' => 'save_certificate_txt', 'create' => 'create_certificate_txt', 'del' => 'delete_certificate_txt') ), + 'enable_spdy' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array ( + 0 => 'n', + 1 => 'y' + ) + ), //################################# // END Datatable fields //################################# diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index 136829a7b2..f9c396616b 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -140,6 +140,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index 8c48f035fe..1ab6c244cc 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index a3a14e335b..a074b160a3 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -143,6 +143,7 @@ $wb['backup_excludes_error_regex'] = 'Os diretórios excluídos possuem caracter $wb['subdomain_error_empty'] = 'O subdomínio está em branco ou possui caracteres inválidos.'; $wb['btn_save_txt'] = 'Salvar'; $wb['btn_cancel_txt'] = 'Cancelar'; +$wb['enable_spdy_txt'] = 'Habilitar SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Carregar detalhes do cliente'; $wb['load_my_data_txt'] = 'Carregar detalhes do contato'; $wb['reset_client_data_txt'] = 'Limpar dados'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index cf25d81260..d0a5a58bd3 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index ea814b0cb9..250f98c890 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -138,6 +138,7 @@ $wb['server_chosen_not_ok'] = 'Vybraný server není pro tento účet povolen.'; $wb['subdomain_error_empty'] = 'Pole subdomény je prázdné nebo obsahuje neplatné znaky.'; $wb['btn_save_txt'] = 'Uložit'; $wb['btn_cancel_txt'] = 'Zrušit'; +$wb['enable_spdy_txt'] = 'Povolit SPDY / HTTP2'; $wb['load_client_data_txt'] = 'Nahrát údaje z podrobností registrovaného klienta'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Obnovit údaje (resetovat)'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index 449bcb588a..e4424799a6 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -138,6 +138,7 @@ $wb['host_txt'] = 'Host'; $wb['domain_error_wildcard'] = 'Wildcard-Subdomains sind nicht erlaubt.'; $wb['btn_save_txt'] = 'Speichern'; $wb['btn_cancel_txt'] = 'Abbrechen'; +$wb['enable_spdy_txt'] = 'Aktiviere SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Kundendaten übernehmen'; $wb['load_my_data_txt'] = 'Meine Kontaktdaten laden'; $wb['reset_client_data_txt'] = 'Daten verwerfen'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index cf25d81260..d0a5a58bd3 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index f39ce19a9b..d4cb988a17 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -140,6 +140,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 497fcd1993..66bfd1ca19 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -143,6 +143,7 @@ $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid c $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = "Save"; $wb['btn_cancel_txt'] = "Cancel"; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 3f60826008..504bea2aa6 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -138,6 +138,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index 82fd44a56a..460fbadff7 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 5d817c611b..306a48aedc 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid c $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 4d70565928..d883532397 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index d8bb15537b..4d54b0a4c7 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 39df360c89..3aa65982cd 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 807039ca6c..cc890d855e 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -140,6 +140,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index 288b9fab11..bfb5e8b137 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index 27371eee35..d67cde421a 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Opslaan'; $wb['btn_cancel_txt'] = 'Annuleren'; +$wb['enable_spdy_txt'] = 'SPDY/HTTP2 inschakelen'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index f1e945df6f..c24c319fe5 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 9eb927f000..dc6895c3e1 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 0127c4ee80..8e27105a6a 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -140,6 +140,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index 827f149dd8..c9a2a0a4ba 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'Выбранный сервер запрещён $wb['subdomain_error_empty'] = 'Поле поддомена пуст или содержит недопустимые символы.'; $wb['btn_save_txt'] = 'Сохранить'; $wb['btn_cancel_txt'] = 'Отменить'; +$wb['enable_spdy_txt'] = 'Включить SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Загрузить информацию о клиенте'; $wb['load_my_data_txt'] = 'Загрузить мои контактные данные'; $wb['reset_client_data_txt'] = 'Сброс данных'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 1bac2468c1..ec509b333a 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -140,6 +140,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index c3b680b2b4..0509b1a3bb 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -139,6 +139,7 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; +$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 2e004d87ef..071df396e4 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -142,6 +142,7 @@ $wb['backup_excludes_error_regex'] = 'Katılmayacak klasörlerde geçersiz karak $wb['subdomain_error_empty'] = 'Alt etki alanı boş ya da geçersiz karakterler içeriyor.'; $wb['btn_save_txt'] = 'Kaydet'; $wb['btn_cancel_txt'] = 'İptal'; +$wb['enable_spdy_txt'] = 'SPDY kullanılsın'; $wb['load_client_data_txt'] = 'Müşteri Bilgilerini Yükle'; $wb['load_my_data_txt'] = 'Profil Bilgilerimi Yükle'; $wb['reset_client_data_txt'] = 'Verileri Sıfırla'; diff --git a/interface/web/sites/templates/web_vhost_domain_ssl.htm b/interface/web/sites/templates/web_vhost_domain_ssl.htm index d4ec6749e2..8b3d986a02 100644 --- a/interface/web/sites/templates/web_vhost_domain_ssl.htm +++ b/interface/web/sites/templates/web_vhost_domain_ssl.htm @@ -62,7 +62,15 @@ {tmpl_var name='ssl_action'}
    - + {tmpl_if name="is_spdy_enabled"} +
    + +
    + {tmpl_var name="enable_spdy"} +
    +
    + {/tmpl_if} + @@ -83,11 +91,11 @@ $('#load_data').click(function(){ loadClientData(); }); - - + + function loadClientData() { var web_id = $("input[name=id]").val(); - + jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {'web_id': web_id, 'type': "getclientssldata"}, function(data) { $('#ssl_organisation').val(data['company_name']); $('#ssl_locality').val(data['city']); diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 0d770476d1..82da18ae1e 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -840,6 +840,7 @@ class page_action extends tform_actions { $app->tpl->setVar('vhostdomain_type', $this->_vhostdomain_type, true); + $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'] === 'y')); $app->tpl->setVar("is_admin", $is_admin); @@ -949,8 +950,10 @@ class page_action extends tform_actions { } $app->tpl->setLoop('folder_directive_snippets', $folder_directive_snippets); if(is_array($web_config[$server_id])) { + $app->tpl->setVar('is_spdy_enabled', ($web_config[$server_id]['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config[$server_id]['nginx_enable_pagespeed'])); } else { + $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'])); } @@ -1322,6 +1325,10 @@ class page_action extends tform_actions { $app->tform->errorMessage .= $app->tform->lng("invalid_custom_php_ini_settings_txt").'
    '; } } + + if($web_config['enable_spdy'] === 'n') { + unset($app->tform->formDef["tabs"]['ssl']['fields']['enable_spdy']); + } // if($this->dataRecord["directive_snippets_id"] < 1) $this->dataRecord["enable_pagespeed"] = 'n'; //print_r($_POST['folder_directive_snippets']); diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index fe73487fa0..94982a6dc1 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -14,11 +14,17 @@ SetHandler None - + RequestHeader unset Proxy early + {tmpl_if name="enable_spdy" op="==" value="y"} + + SpdyEnabled on + + {/tmpl_if} + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -33,7 +39,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -48,7 +54,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps @@ -79,3 +85,5 @@ {/tmpl_if} + + diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index ce245787a5..978139174f 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -12,7 +12,7 @@ server { listen [::]:; - listen : ssl http2; + listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; listen : ssl proxy_protocol; @@ -22,19 +22,19 @@ server { # ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # ssl_prefer_server_ciphers on; - listen []: ssl http2; + listen []: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; - listen [::]: ssl http2; + listen [::]: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; ssl_certificate ; ssl_certificate_key ; - + server_name ; root ; - + if ($scheme != "https") { @@ -72,16 +72,16 @@ server { } - + index index.html index.htm index.php index.cgi index.pl index.xhtml; - - + + location ~ \.shtml$ { ssi on; } - + error_page 400 /error/400.html; error_page 401 /error/401.html; error_page 403 /error/403.html; @@ -124,7 +124,7 @@ server { internal; } - + error_log /var/log/ispconfig/httpd//error.log; access_log /var/log/ispconfig/httpd//access.log combined; @@ -149,7 +149,7 @@ server { index index.html; try_files $uri $uri/ =404; } - + location = /favicon.ico { log_not_found off; access_log off; @@ -162,7 +162,7 @@ server { log_not_found off; access_log off; } - + location /stats/ { index index.html index.php; @@ -325,13 +325,13 @@ server { location { ##merge## auth_basic "Members Only"; auth_basic_user_file .htpasswd; - + location ~ \.php$ { try_files @php; } } - + } @@ -340,7 +340,7 @@ server { listen []:80; - + listen :443 ssl; @@ -349,7 +349,7 @@ server { ssl_certificate ; ssl_certificate_key ; - + server_name ; diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 1857499299..0612c13f7f 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -50,10 +50,12 @@ ServerAdmin webmaster@ + Protocols h2 http/1.1 SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite 'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS' + ErrorLog "|/usr/local/ispconfig/server/scripts/vlogger -e -n -P -t \"error.log\" /var/log/ispconfig/httpd/" @@ -385,7 +387,7 @@ Action php-fcgi /php-fcgi virtual Alias /php-fcgi {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} - FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type + FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -socket -pass-header Authorization -pass-header Content-Type @@ -511,9 +513,9 @@ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^ - + RewriteRule ^/(.*)$ $1 - + diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index b969882f2b..5f697d060e 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1235,6 +1235,17 @@ class apache2_plugin { // Use separate bundle file only for apache versions < 2.4.8 if(@is_file($bundle_file) && version_compare($app->system->getapacheversion(true), '2.4.8', '<')) $vhost_data['has_bundle_cert'] = 1; + // HTTP/2.0 ? + $vhost_data['enable_http2'] = 'n'; + if($vhost_data['enable_spdy'] == 'y'){ + // check if apache supports http_v2 + exec("2>&1 apachectl -M | grep http2_module", $tmp_output, $tmp_retval); + if($tmp_retval == 0){ + $vhost_data['enable_http2'] = 'y'; + } + unset($tmp_output, $tmp_retval); + } + // Set SEO Redirect if($data['new']['seo_redirect'] != ''){ $vhost_data['seo_redirect_enabled'] = 1; diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index b57d38516e..89ac35734d 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1517,6 +1517,18 @@ class nginx_plugin { } } + // http2 or spdy? + $vhost_data['enable_http2'] = 'n'; + if($vhost_data['enable_spdy'] == 'y'){ + // check if nginx support http_v2; if so, use that instead of spdy + exec("2>&1 nginx -V | tr -- - '\n' | grep http_v2_module", $tmp_output, $tmp_retval); + if($tmp_retval == 0){ + $vhost_data['enable_http2'] = 'y'; + $vhost_data['enable_spdy'] = 'n'; + } + unset($tmp_output, $tmp_retval); + } + //proxy protocol settings if($web_config['vhost_proxy_protocol_enabled'] == "y"){ if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { -- GitLab From d80257cf2b46d8f78da5b197a548604f55821843 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 11:57:24 +0200 Subject: [PATCH 0321/1368] Revert "Revert "Merge branch 'http2-always' into 'stable-3.1'"" This reverts commit 0d61c249a2e10fbaa93faaadec93391e6f9ef2ed --- .../sql/incremental/upd_dev_collection.sql | 5 ++- install/sql/ispconfig3.sql | 1 - install/tpl/apache_apps.vhost.master | 16 +++------- install/tpl/server.ini.master | 1 - .../web/admin/form/server_config.tform.php | 9 ------ .../web/admin/lib/lang/ar_server_config.lng | 1 - .../web/admin/lib/lang/bg_server_config.lng | 1 - .../web/admin/lib/lang/br_server_config.lng | 1 - .../web/admin/lib/lang/ca_server_config.lng | 1 - .../web/admin/lib/lang/cz_server_config.lng | 1 - .../web/admin/lib/lang/de_server_config.lng | 1 - .../web/admin/lib/lang/dk_server_config.lng | 1 - .../web/admin/lib/lang/el_server_config.lng | 1 - .../web/admin/lib/lang/en_server_config.lng | 1 - .../web/admin/lib/lang/es_server_config.lng | 1 - .../web/admin/lib/lang/fi_server_config.lng | 1 - .../web/admin/lib/lang/fr_server_config.lng | 1 - .../web/admin/lib/lang/hr_server_config.lng | 1 - .../web/admin/lib/lang/hu_server_config.lng | 1 - .../web/admin/lib/lang/id_server_config.lng | 1 - .../web/admin/lib/lang/it_server_config.lng | 1 - .../web/admin/lib/lang/ja_server_config.lng | 1 - .../web/admin/lib/lang/nl_server_config.lng | 1 - .../web/admin/lib/lang/pl_server_config.lng | 1 - .../web/admin/lib/lang/pt_server_config.lng | 1 - .../web/admin/lib/lang/ro_server_config.lng | 1 - .../web/admin/lib/lang/ru_server_config.lng | 1 - .../web/admin/lib/lang/se_server_config.lng | 1 - .../web/admin/lib/lang/sk_server_config.lng | 1 - .../web/admin/lib/lang/tr_server_config.lng | 1 - .../templates/server_config_web_edit.htm | 22 ++++--------- .../web/sites/form/web_vhost_domain.tform.php | 9 ------ .../sites/lib/lang/ar_web_vhost_domain.lng | 1 - .../sites/lib/lang/bg_web_vhost_domain.lng | 1 - .../sites/lib/lang/br_web_vhost_domain.lng | 1 - .../sites/lib/lang/ca_web_vhost_domain.lng | 1 - .../sites/lib/lang/cz_web_vhost_domain.lng | 1 - .../sites/lib/lang/de_web_vhost_domain.lng | 1 - .../sites/lib/lang/dk_web_vhost_domain.lng | 1 - .../sites/lib/lang/el_web_vhost_domain.lng | 1 - .../sites/lib/lang/en_web_vhost_domain.lng | 1 - .../sites/lib/lang/es_web_vhost_domain.lng | 1 - .../sites/lib/lang/fi_web_vhost_domain.lng | 1 - .../sites/lib/lang/fr_web_vhost_domain.lng | 1 - .../sites/lib/lang/hr_web_vhost_domain.lng | 1 - .../sites/lib/lang/hu_web_vhost_domain.lng | 1 - .../sites/lib/lang/id_web_vhost_domain.lng | 1 - .../sites/lib/lang/it_web_vhost_domain.lng | 1 - .../sites/lib/lang/ja_web_vhost_domain.lng | 1 - .../sites/lib/lang/nl_web_vhost_domain.lng | 1 - .../sites/lib/lang/pl_web_vhost_domain.lng | 1 - .../sites/lib/lang/pt_web_vhost_domain.lng | 1 - .../sites/lib/lang/ro_web_vhost_domain.lng | 1 - .../sites/lib/lang/ru_web_vhost_domain.lng | 1 - .../sites/lib/lang/se_web_vhost_domain.lng | 1 - .../sites/lib/lang/sk_web_vhost_domain.lng | 1 - .../sites/lib/lang/tr_web_vhost_domain.lng | 1 - .../sites/templates/web_vhost_domain_ssl.htm | 16 +++------- interface/web/sites/web_vhost_domain_edit.php | 7 ---- server/conf/apache_apps.vhost.master | 14 ++------ server/conf/nginx_vhost.conf.master | 32 +++++++++---------- server/conf/vhost.conf.master | 8 ++--- .../plugins-available/apache2_plugin.inc.php | 11 ------- server/plugins-available/nginx_plugin.inc.php | 12 ------- 64 files changed, 41 insertions(+), 172 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index bf2f02f677..8d673ae866 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -36,5 +36,8 @@ ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET -- add SSHFP and DNAME record ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; +-- remove SPDY option +ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; + -- was missing in incremental, inserted for fixing older installations -ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; \ No newline at end of file +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index c54f0ac345..e0c3848aa5 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2070,7 +2070,6 @@ CREATE TABLE `web_domain` ( `traffic_quota_lock` enum('n','y') NOT NULL default 'n', `fastcgi_php_version` varchar(255) DEFAULT NULL, `proxy_directives` mediumtext, - `enable_spdy` ENUM('y','n') NULL DEFAULT 'n', `last_quota_notification` date NULL default NULL, `rewrite_rules` mediumtext, `added_date` date NULL DEFAULT NULL, diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 9cccf8d38e..14f0f10da2 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -10,20 +10,14 @@ ServerAdmin webmaster@localhost {tmpl_var name='apps_vhost_servername'} - + SetHandler None - + RequestHeader unset Proxy early - - {tmpl_if name="enable_spdy" op="==" value="y"} - - SpdyEnabled on - - {/tmpl_if} DocumentRoot {tmpl_var name='apps_vhost_dir'} @@ -39,7 +33,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -54,7 +48,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps @@ -87,5 +81,3 @@ - - diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 5edc09807c..c500fb0cc2 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -94,7 +94,6 @@ php_ini_path_apache=/etc/php5/apache2/php.ini php_ini_path_cgi=/etc/php5/cgi/php.ini check_apache_config=y enable_sni=y -enable_spdy=n skip_le_check=n enable_ip_wildcard=y overtraffic_notify_admin=y diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 0d570f2e94..de2caf1750 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -1317,15 +1317,6 @@ $form["tabs"]['web'] = array( 'width' => '40', 'maxlength' => '255' ), - 'enable_spdy' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'y', - 'value' => array ( - 0 => 'n', - 1 => 'y' - ) - ), 'apps_vhost_enabled' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index 0bd4567220..4123c113d1 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index ae760d95cc..463d1c7b2a 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index b24f1ef905..65a2dc4fd7 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -277,7 +277,6 @@ $wb['network_filesystem_txt'] = 'Sistema de arquivos de rede'; $wb['php_ini_check_minutes_txt'] = 'Verificar alterações no php.ini a cada X minutos'; $wb['php_ini_check_minutes_error_empty'] = 'Por favor, insira um valor para verificação de alterações no php.ini.'; $wb['php_ini_check_minutes_info_txt'] = '0 = sem verificações'; -$wb['enable_spdy_txt'] = 'Tornar SPDY/HTTP2 disponível'; $wb['web_settings_txt'] = 'Servidor web'; $wb['xmpp_server_txt'] = 'Servidor xmpp'; $wb['xmpp_use_ipv6_txt'] = 'Usar IPv6'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index b4af211185..496df78f77 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -272,7 +272,6 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index 76783fd95a..fbc1d777c3 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -269,7 +269,6 @@ $wb['disabled_txt'] = 'Vypnuto'; $wb['php_ini_check_minutes_txt'] = 'Provádět kontrolu změny obsahu souboru php.ini každých X minut'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Použít IPv6'; diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index 7487bec764..1646360a7a 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -275,7 +275,6 @@ $wb['php_ini_check_minutes_info_txt'] = '0 = keine Prüfung'; $wb['php_handler_txt'] = 'Standard-PHP-Handler'; $wb['php_fpm_default_chroot_txt'] = 'Default chrooted PHP-FPM'; $wb['php_fpm_incron_reload_txt'] = 'Install incron trigger file to reload PHP-FPM'; -$wb['enable_spdy_txt'] = 'Stellt SPDY/HTTP2 zur Verfügung'; $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['disabled_txt'] = 'Disabled'; diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index 44ffc53391..476e432161 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -273,7 +273,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index 46ce9bfcfc..cf215b939e 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 2eea4f220d..e12e1d4042 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -277,7 +277,6 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index d400e81367..f343931695 100644 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -68,7 +68,6 @@ $wb['do_not_try_rescue_mongodb_txt'] = 'Deshabilitar monitorización de MongoDB' $wb['do_not_try_rescue_mysql_txt'] = 'Deshabilitar monitorización de MySQL'; $wb['enable_ip_wildcard_txt'] = 'Activar comodín IP (*)'; $wb['enable_sni_txt'] = 'Habilitar SNI'; -$wb['enable_spdy_txt'] = 'Hacer que SPDY/HTTP2 esté disponible'; $wb['fastcgi_alias_error_empty'] = 'El alias de FastCGI está vacío.'; $wb['fastcgi_alias_error_regex'] = 'El alias de fastcgi es inválido.'; $wb['fastcgi_alias_txt'] = 'Alias de FastCGI'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index b5fd51c4f8..6eefadb45f 100644 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index 4b020da068..8871795209 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index 93333280b6..b36fd13486 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index e48f231f2e..789e86a649 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index 4023e619b0..ee197a4d0a 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index 928ca7ebc2..cd71123720 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -272,7 +272,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 1220886fc3..4ef8d13422 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index 9ff06f34d3..5b5fcf122b 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index 95b289ef72..1d6caa8e5e 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index 31360c0b0e..fcf7a23e88 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index 74055e9874..2c3b4fdce4 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index 8754aece3c..f3f5a47c7d 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'Стойкость DKIM'; $wb['php_ini_check_minutes_txt'] = 'Проверять изменения в PHP.ini файле каждые Х минут'; $wb['php_ini_check_minutes_error_empty'] = 'Пожалуйста, укажите значение, как часто php.ini должен быть проверен на изменения.'; $wb['php_ini_check_minutes_info_txt'] = '0 = не проверять'; -$wb['enable_spdy_txt'] = 'Сделать SPDY/HTTP2 доступным'; $wb['web_settings_txt'] = 'Web-сервер'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Использовать IPv6'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index c45116d4fa..634c3655a7 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index c4858143b0..50c8c0b4c9 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -274,7 +274,6 @@ $wb['dkim_strength_txt'] = 'DKIM strength'; $wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; $wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; -$wb['enable_spdy_txt'] = 'Makes SPDY/HTTP2 available'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index b52479ecf5..09aa3adf2d 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -276,7 +276,6 @@ $wb['network_filesystem_txt'] = 'Ağ Dosya Sistemi'; $wb['php_ini_check_minutes_txt'] = 'Her X dakikada php.ini dosyasındaki değişiklikler denetlensin'; $wb['php_ini_check_minutes_error_empty'] = 'php.ini dosyasındaki değişikliklerin kaç dakikada bir denetleneceğini yazın.'; $wb['php_ini_check_minutes_info_txt'] = '0 = denetim yapılmaz'; -$wb['enable_spdy_txt'] = 'SPDY/HTTP2 Kullanılsın'; $wb['web_settings_txt'] = 'Web Sunucu'; $wb['xmpp_server_txt'] = 'XMPP Sunucu'; $wb['xmpp_use_ipv6_txt'] = 'IPv6 Kullanılsın'; diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index f5f38affe7..64173549c9 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -163,7 +163,7 @@
    - {tmpl_var name='overquota_db_notify_client'} + {tmpl_var name='overquota_db_notify_client'}
    @@ -197,14 +197,6 @@ {tmpl_var name='enable_sni'}
    -
    - -
    - -
    -
    @@ -257,7 +249,7 @@
    - + @@ -361,7 +353,7 @@
    - + @@ -389,15 +381,15 @@
    - + - + - +
    @@ -410,7 +402,7 @@ serverType = $(this).val(); adjustForm(); }); - + function adjustForm(){ if(serverType == "nginx"){ jQuery('.nginx').show(); diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index beb952bfe6..7da71281cf 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -591,15 +591,6 @@ if($ssl_available) { 'default' => '', 'value' => array('' => 'none_txt', 'save' => 'save_certificate_txt', 'create' => 'create_certificate_txt', 'del' => 'delete_certificate_txt') ), - 'enable_spdy' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'n', - 'value' => array ( - 0 => 'n', - 1 => 'y' - ) - ), //################################# // END Datatable fields //################################# diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index f9c396616b..136829a7b2 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index 1ab6c244cc..8c48f035fe 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index a074b160a3..a3a14e335b 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -143,7 +143,6 @@ $wb['backup_excludes_error_regex'] = 'Os diretórios excluídos possuem caracter $wb['subdomain_error_empty'] = 'O subdomínio está em branco ou possui caracteres inválidos.'; $wb['btn_save_txt'] = 'Salvar'; $wb['btn_cancel_txt'] = 'Cancelar'; -$wb['enable_spdy_txt'] = 'Habilitar SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Carregar detalhes do cliente'; $wb['load_my_data_txt'] = 'Carregar detalhes do contato'; $wb['reset_client_data_txt'] = 'Limpar dados'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index d0a5a58bd3..cf25d81260 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index 250f98c890..ea814b0cb9 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -138,7 +138,6 @@ $wb['server_chosen_not_ok'] = 'Vybraný server není pro tento účet povolen.'; $wb['subdomain_error_empty'] = 'Pole subdomény je prázdné nebo obsahuje neplatné znaky.'; $wb['btn_save_txt'] = 'Uložit'; $wb['btn_cancel_txt'] = 'Zrušit'; -$wb['enable_spdy_txt'] = 'Povolit SPDY / HTTP2'; $wb['load_client_data_txt'] = 'Nahrát údaje z podrobností registrovaného klienta'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Obnovit údaje (resetovat)'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index e4424799a6..449bcb588a 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -138,7 +138,6 @@ $wb['host_txt'] = 'Host'; $wb['domain_error_wildcard'] = 'Wildcard-Subdomains sind nicht erlaubt.'; $wb['btn_save_txt'] = 'Speichern'; $wb['btn_cancel_txt'] = 'Abbrechen'; -$wb['enable_spdy_txt'] = 'Aktiviere SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Kundendaten übernehmen'; $wb['load_my_data_txt'] = 'Meine Kontaktdaten laden'; $wb['reset_client_data_txt'] = 'Daten verwerfen'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index d0a5a58bd3..cf25d81260 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index d4cb988a17..f39ce19a9b 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 66bfd1ca19..497fcd1993 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -143,7 +143,6 @@ $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid c $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = "Save"; $wb['btn_cancel_txt'] = "Cancel"; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 504bea2aa6..3f60826008 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -138,7 +138,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index 460fbadff7..82fd44a56a 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 306a48aedc..5d817c611b 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid c $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index d883532397..4d70565928 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index 4d54b0a4c7..d8bb15537b 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 3aa65982cd..39df360c89 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index cc890d855e..807039ca6c 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index bfb5e8b137..288b9fab11 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index d67cde421a..27371eee35 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Opslaan'; $wb['btn_cancel_txt'] = 'Annuleren'; -$wb['enable_spdy_txt'] = 'SPDY/HTTP2 inschakelen'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index c24c319fe5..f1e945df6f 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index dc6895c3e1..9eb927f000 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 8e27105a6a..0127c4ee80 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index c9a2a0a4ba..827f149dd8 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'Выбранный сервер запрещён $wb['subdomain_error_empty'] = 'Поле поддомена пуст или содержит недопустимые символы.'; $wb['btn_save_txt'] = 'Сохранить'; $wb['btn_cancel_txt'] = 'Отменить'; -$wb['enable_spdy_txt'] = 'Включить SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Загрузить информацию о клиенте'; $wb['load_my_data_txt'] = 'Загрузить мои контактные данные'; $wb['reset_client_data_txt'] = 'Сброс данных'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index ec509b333a..1bac2468c1 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -140,7 +140,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 0509b1a3bb..c3b680b2b4 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -139,7 +139,6 @@ $wb['server_chosen_not_ok'] = 'The selected server is not allowed for this accou $wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; $wb['btn_save_txt'] = 'Save'; $wb['btn_cancel_txt'] = 'Cancel'; -$wb['enable_spdy_txt'] = 'Enable SPDY/HTTP2'; $wb['load_client_data_txt'] = 'Load client details'; $wb['load_my_data_txt'] = 'Load my contact details'; $wb['reset_client_data_txt'] = 'Reset data'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 071df396e4..2e004d87ef 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -142,7 +142,6 @@ $wb['backup_excludes_error_regex'] = 'Katılmayacak klasörlerde geçersiz karak $wb['subdomain_error_empty'] = 'Alt etki alanı boş ya da geçersiz karakterler içeriyor.'; $wb['btn_save_txt'] = 'Kaydet'; $wb['btn_cancel_txt'] = 'İptal'; -$wb['enable_spdy_txt'] = 'SPDY kullanılsın'; $wb['load_client_data_txt'] = 'Müşteri Bilgilerini Yükle'; $wb['load_my_data_txt'] = 'Profil Bilgilerimi Yükle'; $wb['reset_client_data_txt'] = 'Verileri Sıfırla'; diff --git a/interface/web/sites/templates/web_vhost_domain_ssl.htm b/interface/web/sites/templates/web_vhost_domain_ssl.htm index 8b3d986a02..d4ec6749e2 100644 --- a/interface/web/sites/templates/web_vhost_domain_ssl.htm +++ b/interface/web/sites/templates/web_vhost_domain_ssl.htm @@ -62,15 +62,7 @@ {tmpl_var name='ssl_action'}
    - {tmpl_if name="is_spdy_enabled"} -
    - -
    - {tmpl_var name="enable_spdy"} -
    -
    - {/tmpl_if} - + @@ -91,11 +83,11 @@ $('#load_data').click(function(){ loadClientData(); }); - - + + function loadClientData() { var web_id = $("input[name=id]").val(); - + jQuery.getJSON('sites/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {'web_id': web_id, 'type': "getclientssldata"}, function(data) { $('#ssl_organisation').val(data['company_name']); $('#ssl_locality').val(data['city']); diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 82da18ae1e..0d770476d1 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -840,7 +840,6 @@ class page_action extends tform_actions { $app->tpl->setVar('vhostdomain_type', $this->_vhostdomain_type, true); - $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'] === 'y')); $app->tpl->setVar("is_admin", $is_admin); @@ -950,10 +949,8 @@ class page_action extends tform_actions { } $app->tpl->setLoop('folder_directive_snippets', $folder_directive_snippets); if(is_array($web_config[$server_id])) { - $app->tpl->setVar('is_spdy_enabled', ($web_config[$server_id]['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config[$server_id]['nginx_enable_pagespeed'])); } else { - $app->tpl->setVar('is_spdy_enabled', ($web_config['enable_spdy'] === 'y')); $app->tpl->setVar('is_pagespeed_enabled', ($web_config['nginx_enable_pagespeed'])); } @@ -1325,10 +1322,6 @@ class page_action extends tform_actions { $app->tform->errorMessage .= $app->tform->lng("invalid_custom_php_ini_settings_txt").'
    '; } } - - if($web_config['enable_spdy'] === 'n') { - unset($app->tform->formDef["tabs"]['ssl']['fields']['enable_spdy']); - } // if($this->dataRecord["directive_snippets_id"] < 1) $this->dataRecord["enable_pagespeed"] = 'n'; //print_r($_POST['folder_directive_snippets']); diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index 94982a6dc1..fe73487fa0 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -14,17 +14,11 @@ SetHandler None - + RequestHeader unset Proxy early - {tmpl_if name="enable_spdy" op="==" value="y"} - - SpdyEnabled on - - {/tmpl_if} - DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -39,7 +33,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} AddType application/x-httpd-php .php @@ -54,7 +48,7 @@ - + DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps @@ -85,5 +79,3 @@ {/tmpl_if} - - diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index 978139174f..ce245787a5 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -12,7 +12,7 @@ server { listen [::]:; - listen : ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen : ssl http2; listen : ssl proxy_protocol; @@ -22,19 +22,19 @@ server { # ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; # ssl_prefer_server_ciphers on; - listen []: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen []: ssl http2; - listen [::]: ssl{tmpl_if name='enable_http2' op='==' value='y'} http2{/tmpl_if}{tmpl_if name='enable_spdy' op='==' value='y'} spdy{/tmpl_if}; + listen [::]: ssl http2; ssl_certificate ; ssl_certificate_key ; - + server_name ; root ; - + if ($scheme != "https") { @@ -72,16 +72,16 @@ server { } - + index index.html index.htm index.php index.cgi index.pl index.xhtml; - - + + location ~ \.shtml$ { ssi on; } - + error_page 400 /error/400.html; error_page 401 /error/401.html; error_page 403 /error/403.html; @@ -124,7 +124,7 @@ server { internal; } - + error_log /var/log/ispconfig/httpd//error.log; access_log /var/log/ispconfig/httpd//access.log combined; @@ -149,7 +149,7 @@ server { index index.html; try_files $uri $uri/ =404; } - + location = /favicon.ico { log_not_found off; access_log off; @@ -162,7 +162,7 @@ server { log_not_found off; access_log off; } - + location /stats/ { index index.html index.php; @@ -325,13 +325,13 @@ server { location { ##merge## auth_basic "Members Only"; auth_basic_user_file .htpasswd; - + location ~ \.php$ { try_files @php; } } - + } @@ -340,7 +340,7 @@ server { listen []:80; - + listen :443 ssl; @@ -349,7 +349,7 @@ server { ssl_certificate ; ssl_certificate_key ; - + server_name ; diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 0612c13f7f..1857499299 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -50,12 +50,10 @@ ServerAdmin webmaster@ - Protocols h2 http/1.1 SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite 'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS' - ErrorLog "|/usr/local/ispconfig/server/scripts/vlogger -e -n -P -t \"error.log\" /var/log/ispconfig/httpd/" @@ -387,7 +385,7 @@ Action php-fcgi /php-fcgi virtual Alias /php-fcgi {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} - FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type + FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -host 127.0.0.1: -pass-header Authorization -pass-header Content-Type FastCgiExternalServer {tmpl_var name='document_root'}/cgi-bin/php-fcgi-{tmpl_var name='ip_address'}-{tmpl_var name='port'}-{tmpl_var name='domain'} -idle-timeout 300 -socket -pass-header Authorization -pass-header Content-Type @@ -513,9 +511,9 @@ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^ - + RewriteRule ^/(.*)$ $1 - + diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 5f697d060e..b969882f2b 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1235,17 +1235,6 @@ class apache2_plugin { // Use separate bundle file only for apache versions < 2.4.8 if(@is_file($bundle_file) && version_compare($app->system->getapacheversion(true), '2.4.8', '<')) $vhost_data['has_bundle_cert'] = 1; - // HTTP/2.0 ? - $vhost_data['enable_http2'] = 'n'; - if($vhost_data['enable_spdy'] == 'y'){ - // check if apache supports http_v2 - exec("2>&1 apachectl -M | grep http2_module", $tmp_output, $tmp_retval); - if($tmp_retval == 0){ - $vhost_data['enable_http2'] = 'y'; - } - unset($tmp_output, $tmp_retval); - } - // Set SEO Redirect if($data['new']['seo_redirect'] != ''){ $vhost_data['seo_redirect_enabled'] = 1; diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 89ac35734d..b57d38516e 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1517,18 +1517,6 @@ class nginx_plugin { } } - // http2 or spdy? - $vhost_data['enable_http2'] = 'n'; - if($vhost_data['enable_spdy'] == 'y'){ - // check if nginx support http_v2; if so, use that instead of spdy - exec("2>&1 nginx -V | tr -- - '\n' | grep http_v2_module", $tmp_output, $tmp_retval); - if($tmp_retval == 0){ - $vhost_data['enable_http2'] = 'y'; - $vhost_data['enable_spdy'] = 'n'; - } - unset($tmp_output, $tmp_retval); - } - //proxy protocol settings if($web_config['vhost_proxy_protocol_enabled'] == "y"){ if((int)$web_config['vhost_proxy_protocol_https_port'] > 0) { -- GitLab From f09c9af5009e0716b98cd42dedf1b1875de741f5 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 12:00:07 +0200 Subject: [PATCH 0322/1368] Do not use Protocols directive on systems without http2 module --- server/conf/vhost.conf.master | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 1857499299..8cc87515b1 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -50,7 +50,9 @@ ServerAdmin webmaster@ - Protocols h2 http/1.1 + + Protocols h2 http/1.1 + SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite 'EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS' -- GitLab From 5f15485ec1bbfcffd51613fcbe425d905b482e5f Mon Sep 17 00:00:00 2001 From: Dominik Date: Thu, 23 Jul 2020 13:32:53 +0200 Subject: [PATCH 0323/1368] allow longer cc-Fields --- interface/web/mail/form/mail_user.tform.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 3d1a8fde7f..8fb6c4a692 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -187,7 +187,7 @@ $form["tabs"]['mailuser'] = array( 'default' => '', 'value' => '', 'width' => '30', - 'maxlength' => '255' + 'maxlength' => '65535' ), 'sender_cc' => array ( 'datatype' => 'VARCHAR', -- GitLab From 1076198f1126b9edb87715bb8e5de0c1f1729b87 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 14:40:53 +0200 Subject: [PATCH 0324/1368] Update system_config.tform.php to trigger MR pipeline --- interface/web/admin/form/system_config.tform.php | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index 84c586da89..562c3a5226 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -776,4 +776,3 @@ $form['tabs']['dns_ca'] = array ( ) ); -?> \ No newline at end of file -- GitLab From 2532502e085772ef10317b3859c7d3a37c7c3bc0 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 15:31:42 +0200 Subject: [PATCH 0325/1368] - fixed issue with file names in rspamd user filter config --- .git-scripts/syntax.sh | 4 +- interface/lib/classes/remote.d/sites.inc.php | 70 +++++++++---------- .../plugins-available/rspamd_plugin.inc.php | 11 +++ 3 files changed, 48 insertions(+), 37 deletions(-) diff --git a/.git-scripts/syntax.sh b/.git-scripts/syntax.sh index e584e2ef10..d66022c7c3 100644 --- a/.git-scripts/syntax.sh +++ b/.git-scripts/syntax.sh @@ -20,7 +20,7 @@ fi FILECNT=$(eval "${CMD} | wc -l") ; for F in $(eval "$CMD") ; do - if [[ ! -e "${F}" && -f "${F}" ]] ; then + if [[ ! -e "${F}" || ! -f "${F}" ]] ; then continue ; fi R=$(php -d error_reporting=E_ALL -d display_errors=On -l "$F" 2>/dev/null) ; @@ -64,4 +64,4 @@ if [ $WARNCNT -gt 0 ] ; then echo "" fi -exit $EX \ No newline at end of file +exit $EX diff --git a/interface/lib/classes/remote.d/sites.inc.php b/interface/lib/classes/remote.d/sites.inc.php index 9efbecc091..10fc028e64 100644 --- a/interface/lib/classes/remote.d/sites.inc.php +++ b/interface/lib/classes/remote.d/sites.inc.php @@ -102,7 +102,7 @@ class remoting_sites extends remoting { $app->remoting_lib->loadFormDef('../sites/form/database.tform.php'); return $app->remoting_lib->getDataRecord($primary_id); } - + /* TODO: secure queries! */ //* Add a record public function sites_database_add($session_id, $client_id, $params) @@ -130,7 +130,7 @@ class remoting_sites extends remoting { $retval = $this->insertQueryExecute($sql, $params); $app->sites_database_plugin->processDatabaseInsert($this); - + // set correct values for backup_interval and backup_copies if(isset($params['backup_interval']) || isset($params['backup_copies']) || isset($params['backup_format_web']) || isset($params['backup_format_db'])){ $sql_set = array(); @@ -140,7 +140,7 @@ class remoting_sites extends remoting { if(isset($params['backup_format_db'])) $sql_set[] = "backup_format_db = ".$app->functions->intval($params['backup_format_db']); $this->updateQueryExecute("UPDATE web_database SET ".implode(', ', $sql_set)." WHERE database_id = ".$retval, $retval, $params); } - + return $retval; } @@ -165,7 +165,7 @@ class remoting_sites extends remoting { $this->dataRecord = $params; $app->sites_database_plugin->processDatabaseUpdate($this); $retval = $this->updateQueryExecute($sql, $primary_id, $params); - + // set correct values for backup_interval and backup_copies if(isset($params['backup_interval']) || isset($params['backup_copies']) || isset($params['backup_format_web']) || isset($params['backup_format_db'])){ $sql_set = array(); @@ -175,7 +175,7 @@ class remoting_sites extends remoting { if(isset($params['backup_format_db'])) $sql_set[] = "backup_format_db = ".$app->functions->intval($params['backup_format_db']); $this->updateQueryExecute("UPDATE web_database SET ".implode(', ', $sql_set)." WHERE database_id = ".$primary_id, $primary_id, $params); } - + return $retval; } @@ -452,7 +452,7 @@ class remoting_sites extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + if($params['log_retention'] == '') $params['log_retention'] = 30; //* Set a few defaults for nginx servers @@ -524,7 +524,7 @@ class remoting_sites extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + if($params['log_retention'] == '') $params['log_retention'] = 30; //* Set a few defaults for nginx servers @@ -596,7 +596,7 @@ class remoting_sites extends remoting { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + if($params['log_retention'] == '') $params['log_retention'] = 30; //* Set a few defaults for nginx servers @@ -880,7 +880,7 @@ class remoting_sites extends remoting { $app->remoting_lib->loadFormDef('../sites/form/web_vhost_domain.tform.php'); $params = $app->remoting_lib->getDataRecord($primary_id); $params['active'] = $status; - + $affected_rows = $this->updateQuery('../sites/form/web_vhost_domain.tform.php', 0, $primary_id, $params); return $affected_rows; } else { @@ -905,57 +905,57 @@ class remoting_sites extends remoting { $all = $app->db->queryAllRecords($sql, $client_id); return $all; } - + //** backup functions ----------------------------------------------------------------------------------- public function sites_web_domain_backup_list($session_id, $site_id = null) { global $app; - + if(!$this->checkPerm($session_id, 'sites_web_domain_backup')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + $result = $app->db->queryAllRecords("SELECT * FROM web_backup".(($site_id != null)?' WHERE parent_domain_id = ?':''), $site_id); return $result; } - + //* Backup download and restoration by Abdi Joseph public function sites_web_domain_backup($session_id, $primary_id, $action_type) { global $app; - + if(!$this->checkPerm($session_id, 'sites_web_domain_backup')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + //*Set variables $backup_record = $app->db->queryOneRecord("SELECT * FROM `web_backup` WHERE `backup_id`= ?", $primary_id); $server_id = $backup_record['server_id']; - + //*Set default action state $action_state = "pending"; $tstamp = time(); - + //* Basic validation of variables if ($server_id <= 0) { throw new SoapFault('invalid_backup_id', "Invalid or non existant backup_id $primary_id"); return false; } - + if ($action_type != 'backup_download' and $action_type != 'backup_restore' and $action_type != 'backup_delete') { throw new SoapFault('invalid_action', "Invalid action_type $action_type"); return false; } - + //* Validate instance $instance_record = $app->db->queryOneRecord("SELECT * FROM `sys_remoteaction` WHERE `action_param`= ? and `action_type`= ? and `action_state`= ?", $primary_id, $action_type, 'pending'); if ($instance_record['action_id'] >= 1) { throw new SoapFault('duplicate_action', "There is already a pending $action_type action"); return false; } - + //* Save the record if ($app->db->query("INSERT INTO `sys_remoteaction` SET `server_id` = ?, `tstamp` = ?, `action_type` = ?, `action_param` = ?, `action_state` = ?", $server_id, $tstamp, $action_type, $primary_id, $action_state)) { return true; @@ -963,64 +963,64 @@ class remoting_sites extends remoting { return false; } } - + //** quota functions ----------------------------------------------------------------------------------- public function quota_get_by_user($session_id, $client_id) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'quota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + return $app->quota_lib->get_quota_data($client_id, false); } - + public function trafficquota_get_by_user($session_id, $client_id, $lastdays = 0) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'trafficquota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } if ($client_id != null) $client_id = $app->functions->intval($client_id); - + return $app->quota_lib->get_trafficquota_data($client_id, $lastdays); } - + public function ftptrafficquota_data($session_id, $client_id, $lastdays = 0) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'trafficquota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } if ($client_id != null) $client_id = $app->functions->intval($client_id); - + return $app->quota_lib->get_ftptrafficquota_data($client_id, $lastdays); } - + public function databasequota_get_by_user($session_id, $client_id) { global $app; $app->uses('quota_lib'); - + if(!$this->checkPerm($session_id, 'databasequota_get_by_user')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); return false; } - + return $app->quota_lib->get_databasequota_data($client_id, false); } - + // ---------------------------------------------------------------------------------------------------------- //* Get record details @@ -1070,8 +1070,8 @@ class remoting_sites extends remoting { $affected_rows = $this->deleteQuery('../sites/form/webdav_user.tform.php', $primary_id); return $affected_rows; } - - + + } ?> diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index 4812deb683..e9a6cdd633 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -206,6 +206,17 @@ class rspamd_plugin { return; } + $old_settings_name = $settings_name; + $settings_name = $app->functions->idn_encode($settings_name); + + if($old_settings_name !== $settings_name) { + // we changed naming to idn-encoded form due to path check issues. Delete old file if existing. + $old_settings_file = $this->users_config_dir . str_replace('@', '_', $old_settings_name) . '.conf'; + if(is_file($old_settings_file)) { + unlink($old_settings_file); + } + } + $settings_file = $this->users_config_dir . str_replace('@', '_', $settings_name) . '.conf'; //$app->log('Settings file for rspamd is ' . $settings_file, LOGLEVEL_WARN); if($mode === 'delete') { -- GitLab From 38fdcf89eb3b7f592f38792446c4c20335d518f6 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 15:41:28 +0200 Subject: [PATCH 0326/1368] - add logging to acme.sh commands and add that log file to internal log rotation --- server/lib/classes/cron.d/200-logfiles.inc.php | 16 ++++++++-------- server/lib/classes/letsencrypt.inc.php | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/server/lib/classes/cron.d/200-logfiles.inc.php b/server/lib/classes/cron.d/200-logfiles.inc.php index 203d3c0bda..b0470b2ec7 100644 --- a/server/lib/classes/cron.d/200-logfiles.inc.php +++ b/server/lib/classes/cron.d/200-logfiles.inc.php @@ -49,10 +49,10 @@ class cronjob_logfiles extends cronjob { public function onRunJob() { global $app, $conf; - + $app->uses('getconf'); $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); - + if($server_config['log_retention'] > 0) { $max_syslog = $app->functions->intval($server_config['log_retention']); } else { @@ -121,18 +121,18 @@ class cronjob_logfiles extends cronjob { $app->system->exec_safe("gzip -c ? > ?", $logfile, $logfile . '.gz'); unlink($logfile); } - + $cron_logfiles = array('cron.log', 'cron_error.log', 'cron_wget.log'); foreach($cron_logfiles as $cron_logfile) { $cron_logfile = $rec['document_root'].'/' . $log_folder . '/' . $cron_logfile; - + // rename older files (move up by one) $num = $log_retention; while($num >= 1) { if(is_file($cron_logfile . '.' . $num . '.gz')) rename($cron_logfile . '.' . $num . '.gz', $cron_logfile . '.' . ($num + 1) . '.gz'); $num--; } - + // compress current logfile if(is_file($cron_logfile)) { $app->system->exec_safe("gzip -c ? > ?", $cron_logfile, $cron_logfile . '.1.gz'); @@ -146,7 +146,7 @@ class cronjob_logfiles extends cronjob { } } - // rotate and compress the error.log + // rotate and compress the error.log $error_logfile = $rec['document_root'].'/' . $log_folder . '/error.log'; // rename older files (move up by one) $num = $log_retention; @@ -184,7 +184,7 @@ class cronjob_logfiles extends cronjob { //###################################################################################################### - $ispconfig_logfiles = array('ispconfig.log', 'cron.log', 'auth.log'); + $ispconfig_logfiles = array('ispconfig.log', 'cron.log', 'auth.log', 'acme.log'); foreach($ispconfig_logfiles as $ispconfig_logfile) { $num = $max_syslog; $ispconfig_logfile = $conf['ispconfig_log_dir'].'/'.$ispconfig_logfile; @@ -240,7 +240,7 @@ class cronjob_logfiles extends cronjob { */ $sql = "DELETE FROM sys_log WHERE tstamp < ? AND server_id != 0"; $app->dbmaster->query($sql, $tstamp); - + /* * now delete those entries without a linked datalog entry (datalog_id = 0) */ diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 4e9bb74e13..7346638119 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -54,7 +54,7 @@ class letsencrypt { } public function get_acme_command($domains, $key_file, $bundle_file, $cert_file, $server_type = 'apache') { - global $app; + global $app, $conf; $letsencrypt = $this->get_acme_script(); @@ -74,7 +74,7 @@ class letsencrypt { $cert_arg = '--fullchain-file ' . escapeshellarg($bundle_file) . ' --cert-file ' . escapeshellarg($cert_file); } - $cmd = 'R=0 ; C=0 ; ' . $letsencrypt . ' --issue ' . $cmd . ' -w /usr/local/ispconfig/interface/acme ; R=$? ; if [[ $R -eq 0 || $R -eq 2 ]] ; then ' . $letsencrypt . ' --install-cert ' . $cmd . ' --key-file ' . escapeshellarg($key_file) . ' ' . $cert_arg . ' --reloadcmd ' . escapeshellarg($this->get_reload_command()) . '; C=$? ; fi ; if [[ $C -eq 0 ]] ; then exit $R ; else exit $C ; fi'; + $cmd = 'R=0 ; C=0 ; ' . $letsencrypt . ' --issue ' . $cmd . ' -w /usr/local/ispconfig/interface/acme ; R=$? ; if [[ $R -eq 0 || $R -eq 2 ]] ; then ' . $letsencrypt . ' --install-cert ' . $cmd . ' --key-file ' . escapeshellarg($key_file) . ' ' . $cert_arg . ' --reloadcmd ' . escapeshellarg($this->get_reload_command()) . ' --log ' . escapeshellarg($conf['ispconfig_log_dir'].'/acme.log') . '; C=$? ; fi ; if [[ $C -eq 0 ]] ; then exit $R ; else exit $C ; fi'; return $cmd; } -- GitLab From 6855f505300b95013ee77a42f454b66def84db6e Mon Sep 17 00:00:00 2001 From: Dominik Date: Thu, 23 Jul 2020 15:58:53 +0200 Subject: [PATCH 0327/1368] Rollback sender_cc type change --- install/sql/ispconfig3.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 3957e327e9..be39910961 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1039,7 +1039,7 @@ CREATE TABLE `mail_user` ( `maildir_format` varchar(255) NOT NULL default 'maildir', `quota` bigint(20) NOT NULL default '-1', `cc` text, - `sender_cc` text, + `sender_cc` varchar(255) NOT NULL default '', `homedir` varchar(255) NOT NULL default '', `autoresponder` enum('n','y') NOT NULL default 'n', `autoresponder_start_date` datetime NULL default NULL, -- GitLab From b1cedcdf386ae613b2b027fcb84a7ac8b7430c61 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 23 Jul 2020 16:36:07 +0200 Subject: [PATCH 0328/1368] - set immutable bit for php cgi and fcgi starter files --- install/dist/lib/fedora.lib.php | 80 +++++----- install/dist/lib/gentoo.lib.php | 49 +++--- install/dist/lib/opensuse.lib.php | 58 +++---- install/lib/installer_base.lib.php | 147 ++++++++++-------- install/uninstall.php | 13 +- server/lib/classes/system.inc.php | 136 +++++++++------- .../plugins-available/apache2_plugin.inc.php | 9 ++ server/plugins-available/nginx_plugin.inc.php | 4 + 8 files changed, 271 insertions(+), 225 deletions(-) diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php index 6a1c5048e8..4a7c9cfbfe 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class installer_dist extends installer_base { protected $mailman_group = 'mailman'; - + public function __construct() { //** check apache modules */ $mods = getapachemodules(); @@ -42,7 +42,7 @@ class installer_dist extends installer_base { swriteln($inst->lng(' AllowOverride None')); swriteln($inst->lng(' Require all denied')); swriteln($inst->lng(' '."\n")); - + swriteln($inst->lng(' If it uses the old syntax (deny from all) ISPConfig would fail to work.')); } } @@ -80,7 +80,7 @@ class installer_dist extends installer_base { //* mysql-virtual_sender_login_maps.cf $this->process_postfix_config('mysql-virtual_sender_login_maps.cf'); - + //* mysql-virtual_client.cf $this->process_postfix_config('mysql-virtual_client.cf'); @@ -89,7 +89,7 @@ class installer_dist extends installer_base { //* mysql-virtual_relayrecipientmaps.cf $this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf'); - + //* mysql-virtual_outgoing_bcc.cf $this->process_postfix_config('mysql-virtual_outgoing_bcc.cf'); @@ -142,19 +142,19 @@ class installer_dist extends installer_base { } } unset($rbl_hosts); - + //* If Postgrey is installed, configure it $greylisting = ''; if($conf['postgrey']['installed'] == true) { $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf'; } - + $reject_sender_login_mismatch = ''; if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) { $reject_sender_login_mismatch = ', reject_authenticated_sender_login_mismatch'; } unset($server_ini_array); - + $postconf_placeholders = array('{config_dir}' => $config_dir, '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'], '{vmail_userid}' => $cf['vmail_userid'], @@ -163,7 +163,7 @@ class installer_dist extends installer_base { '{greylisting}' => $greylisting, '{reject_slm}' => $reject_sender_login_mismatch, ); - + $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_postfix.conf.master', 'tpl/fedora_postfix.conf.master'); $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders); $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines @@ -368,13 +368,13 @@ class installer_dist extends installer_base { $virtual_transport = 'dovecot'; $configure_lmtp = false; - + // check if virtual_transport must be changed if ($this->is_update) { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']); $ini_array = ini_to_array(stripslashes($tmp['config'])); // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni() - + if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') { $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; $configure_lmtp = true; @@ -452,7 +452,7 @@ class installer_dist extends installer_base { if(version_compare($dovecot_version,2.3) >= 0) { // Remove deprecated setting(s) removeLine($config_dir.'/'.$configfile, 'ssl_protocols ='); - + // Check if we have a dhparams file and if not, create it if(!file_exists('/etc/dovecot/dh.pem')) { swriteln('Creating new DHParams file, this takes several minutes. Do not interrupt the script.'); @@ -475,7 +475,7 @@ class installer_dist extends installer_base { $content = str_replace('#2.3+','',$content); file_put_contents($config_dir.'/'.$configfile,$content); unset($content); - + } else { // remove settings which are not supported in Dovecot < 2.3 removeLine($config_dir.'/'.$configfile, 'ssl_min_protocol ='); @@ -502,7 +502,7 @@ class installer_dist extends installer_base { copy("$config_dir/$configfile", "$config_dir/$configfile~"); exec("chmod 400 $config_dir/$configfile~"); } - + if(!@file_exists('/etc/dovecot-sql.conf')) exec('ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf'); $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/fedora_dovecot-sql.conf.master', "tpl/fedora_dovecot-sql.conf.master"); @@ -520,7 +520,7 @@ class installer_dist extends installer_base { exec("chmod 600 $config_dir/$configfile"); exec("chown root:root $config_dir/$configfile"); - + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/var/www/*' ignore > /dev/null 2> /dev/null"); @@ -543,12 +543,12 @@ class installer_dist extends installer_base { $content = str_replace('{amavis_config_dir}', $conf['amavis']['config_dir'], $content); wf($conf["amavis"]["config_dir"].'/amavisd.conf', $content); chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640); - + if(!is_file($conf['amavis']['config_dir'].'/60-dkim')) { touch($conf['amavis']['config_dir'].'/60-dkim'); chmod($conf['amavis']['config_dir'].'/60-dkim', 0640); } - + // for CentOS 7.2 only if($dist['confid'] == 'centos72') { chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0750); @@ -752,16 +752,16 @@ class installer_dist extends installer_base { $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -780,7 +780,7 @@ class installer_dist extends installer_base { } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab()); @@ -843,7 +843,7 @@ class installer_dist extends installer_base { //* add a sshusers group $command = 'groupadd sshusers'; if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + // add anonymized log option to nginxx.conf file $nginx_conf_file = $conf['nginx']['config_dir'].'/nginx.conf'; if(is_file($nginx_conf_file)) { @@ -853,7 +853,7 @@ class installer_dist extends installer_base { replaceLine($nginx_conf_file, 'http {', "http {\n\n".file_get_contents('tpl/nginx_anonlog.master'), 0, 0); } } - + } public function configure_bastille_firewall() @@ -946,14 +946,14 @@ class installer_dist extends installer_base { //* copy the ISPConfig server part $command = "cp -rf ../server $install_dir"; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + $configfile = 'security_settings.ini'; if(is_file($install_dir.'/security/'.$configfile)) { copy($install_dir.'/security/'.$configfile, $install_dir.'/security/'.$configfile.'~'); @@ -1100,15 +1100,15 @@ class installer_dist extends installer_base { //* chown the interface files to the ispconfig user and group $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -1163,12 +1163,12 @@ class installer_dist extends installer_base { exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf"); exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf"); } - + if(is_dir($install_dir.'/interface/invoices')) { exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -1199,7 +1199,7 @@ class installer_dist extends installer_base { $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; $this->db->query($sql, $conf['interface_password']); } - + if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ //* Copy the ISPConfig vhost for the controlpanel // TODO: These are missing! should they be "vhost_dist_*_dir" ? @@ -1228,7 +1228,7 @@ class installer_dist extends installer_base { } else { $tpl->setVar('ssl_bundle_comment','#'); } - + $tpl->setVar('apache_version',getapacheversion()); wf($vhost_conf_dir.'/ispconfig.vhost', $tpl->grab()); @@ -1241,24 +1241,16 @@ class installer_dist extends installer_base { exec("ln -s $vhost_conf_dir/ispconfig.vhost $vhost_conf_enabled_dir/000-ispconfig.vhost"); } - /* - exec('mkdir -p /var/www/php-fcgi-scripts/ispconfig'); - exec('cp tpl/apache_ispconfig_fcgi_starter.master /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); - exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); - exec('ln -s /usr/local/ispconfig/interface/web /var/www/ispconfig'); - exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); - - replaceLine('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter','PHPRC=','PHPRC=/etc/',0,0); - */ - //if(!is_file('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) { $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master'); $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); if(!is_dir('/var/www/php-fcgi-scripts/ispconfig')) exec('mkdir -p /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); if(!is_link('/var/www/ispconfig')) exec('ln -s /usr/local/ispconfig/interface/web /var/www/ispconfig'); exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); //} //} } @@ -1373,10 +1365,10 @@ class installer_dist extends installer_base { //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php index 5bb0d9df19..a39c346376 100644 --- a/install/dist/lib/gentoo.lib.php +++ b/install/dist/lib/gentoo.lib.php @@ -100,13 +100,13 @@ class installer extends installer_base if($conf['postgrey']['installed'] == true) { $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf'; } - + $reject_sender_login_mismatch = ''; if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) { $reject_sender_login_mismatch = ', reject_authenticated_sender_login_mismatch'; } unset($server_ini_array); - + $postconf_placeholders = array('{config_dir}' => $config_dir, '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'], '{vmail_userid}' => $cf['vmail_userid'], @@ -277,13 +277,13 @@ class installer extends installer_base $virtual_transport = 'dovecot'; $configure_lmtp = false; - + // check if virtual_transport must be changed if ($this->is_update) { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"].".server", $conf['server_id']); $ini_array = ini_to_array(stripslashes($tmp['config'])); // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni() - + if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') { $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; $configure_lmtp = true; @@ -602,16 +602,16 @@ class installer extends installer_base //* Copy the ISPConfig configuration include $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -630,7 +630,7 @@ class installer extends installer_base } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); wf($conf['apache']['vhost_conf_dir'].'/000-ispconfig.conf', $tpl->grab()); @@ -727,10 +727,11 @@ class installer extends installer_base $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); mkdir($conf['web']['website_basedir'].'/php-fcgi-scripts/apps', 0755, true); //copy('tpl/apache_apps_fcgi_starter.master',$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', false); wf($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', $content); exec('chmod +x '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); exec('chown -R ispapps:ispapps '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps'); - + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', true); //} } if($conf['nginx']['installed'] == true){ @@ -783,11 +784,11 @@ class installer extends installer_base //$content = str_replace('{fpm_port}', ($conf['nginx']['php_fpm_start_port']+1), $content); $content = str_replace('{fpm_socket}', $fpm_socket, $content); $content = str_replace('{cgi_socket}', $cgi_socket, $content); - + // SSL in apps vhost is off by default. Might change later. $content = str_replace('{ssl_on}', 'ssl', $content); $content = str_replace('{ssl_comment}', '#', $content); - + wf($vhost_conf_dir.'/apps.vhost', $content); // PHP-FPM @@ -843,14 +844,14 @@ class installer extends installer_base //* copy the ISPConfig server part $command = "cp -rf ../server $install_dir"; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Apply changed security_settings.ini values to new security_settings.ini file if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); @@ -983,15 +984,15 @@ class installer extends installer_base //* chown the interface files to the ispconfig user and group $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -1005,7 +1006,7 @@ class installer extends installer_base caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); $command = 'chown root:ispconfig '.$install_dir.'/security/nginx_directives.blacklist'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make the global language file directory group writable exec("chmod -R 770 $install_dir/interface/lib/lang"); @@ -1058,7 +1059,7 @@ class installer extends installer_base exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -1089,7 +1090,7 @@ class installer extends installer_base $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; $this->db->query($sql, $conf['interface_password']); } - + if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ //* Copy the ISPConfig vhost for the controlpanel $content = $this->get_template_file("apache_ispconfig.vhost", true); @@ -1121,11 +1122,13 @@ class installer extends installer_base $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); @mkdir('/var/www/php-fcgi-scripts/ispconfig', 0755, true); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); chmod('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', 0755); @symlink($install_dir.'/interface/web', '/var/www/ispconfig'); exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); } } @@ -1238,16 +1241,16 @@ class installer extends installer_base //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400); - + } } diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index 21cfd9f2ba..60fb0511fd 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class installer_dist extends installer_base { protected $mailman_group = 'mailman'; - + public function __construct() { //** check apache modules */ $mods = getapachemodules(); @@ -42,7 +42,7 @@ class installer_dist extends installer_base { swriteln($inst->lng(' AllowOverride None')); swriteln($inst->lng(' Require all denied')); swriteln($inst->lng(' '."\n")); - + swriteln($inst->lng(' If it uses the old syntax (deny from all) ISPConfig would fail to work.')); } } @@ -80,7 +80,7 @@ class installer_dist extends installer_base { //* mysql-virtual_sender_login_maps.cf $this->process_postfix_config('mysql-virtual_sender_login_maps.cf'); - + //* mysql-virtual_client.cf $this->process_postfix_config('mysql-virtual_client.cf'); @@ -159,13 +159,13 @@ class installer_dist extends installer_base { if($conf['postgrey']['installed'] == true) { $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf'; } - + $reject_sender_login_mismatch = ''; if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) { $reject_sender_login_mismatch = ', reject_authenticated_sender_login_mismatch'; } unset($server_ini_array); - + $postconf_placeholders = array('{config_dir}' => $config_dir, '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'], '{vmail_userid}' => $cf['vmail_userid'], @@ -174,7 +174,7 @@ class installer_dist extends installer_base { '{greylisting}' => $greylisting, '{reject_slm}' => $reject_sender_login_mismatch, ); - + $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_postfix.conf.master', 'tpl/opensuse_postfix.conf.master'); $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders); $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines @@ -378,13 +378,13 @@ class installer_dist extends installer_base { $virtual_transport = 'dovecot'; $configure_lmtp = false; - + // check if virtual_transport must be changed if ($this->is_update) { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']); $ini_array = ini_to_array(stripslashes($tmp['config'])); // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni() - + if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') { $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; $configure_lmtp = true; @@ -487,7 +487,7 @@ class installer_dist extends installer_base { exec("chmod 600 $config_dir/$configfile"); exec("chown root:root $config_dir/$configfile"); - + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/srv/www/*' ignore > /dev/null 2> /dev/null"); @@ -659,7 +659,7 @@ class installer_dist extends installer_base { if($conf['apache']['installed'] == false) return; //* Create the logging directory for the vhost logfiles exec('mkdir -p /var/log/ispconfig/httpd'); - + //* enable apache logio module exec('a2enmod logio'); @@ -690,16 +690,16 @@ class installer_dist extends installer_base { $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -718,7 +718,7 @@ class installer_dist extends installer_base { } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab()); @@ -823,7 +823,7 @@ class installer_dist extends installer_base { //* add a sshusers group $command = 'groupadd sshusers'; if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + // add anonymized log option to nginxx.conf file $nginx_conf_file = $conf['nginx']['config_dir'].'/nginx.conf'; if(is_file($nginx_conf_file)) { @@ -925,14 +925,14 @@ class installer_dist extends installer_base { //* copy the ISPConfig server part $command = "cp -rf ../server $install_dir"; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Apply changed security_settings.ini values to new security_settings.ini file if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) { $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~')); @@ -1090,15 +1090,15 @@ class installer_dist extends installer_base { //* chown the interface files to the ispconfig user and group $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -1112,7 +1112,7 @@ class installer_dist extends installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); $command = 'chown root:ispconfig '.$install_dir.'/security/nginx_directives.blacklist'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make the global language file directory group writable exec("chmod -R 770 $install_dir/interface/lib/lang"); @@ -1153,12 +1153,12 @@ class installer_dist extends installer_base { exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf"); exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf"); } - + if(is_dir($install_dir.'/interface/invoices')) { exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -1192,7 +1192,7 @@ class installer_dist extends installer_base { $sql = "UPDATE sys_user SET passwort = md5(?) WHERE username = 'admin';"; $this->db->query($sql, $conf['interface_password']); } - + if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){ //* Copy the ISPConfig vhost for the controlpanel // TODO: These are missing! should they be "vhost_dist_*_dir" ? @@ -1221,7 +1221,7 @@ class installer_dist extends installer_base { } else { $tpl->setVar('ssl_bundle_comment','#'); } - + $tpl->setVar('apache_version',getapacheversion()); $content = $tpl->grab(); @@ -1233,10 +1233,12 @@ class installer_dist extends installer_base { $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); exec('mkdir -p /srv/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); exec('ln -s /usr/local/ispconfig/interface/web /srv/www/ispconfig'); exec('chown -R ispconfig:ispconfig /srv/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); //} @@ -1362,10 +1364,10 @@ class installer_dist extends installer_base { //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index bc9ed26e18..81b1257db0 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -143,6 +143,16 @@ class installer_base { } */ + public function set_immutable($path, $enable = true) { + if($path != '' && $path != '/' && strlen($path) > 6 && strpos($path, '..') === false && (is_file($path) || is_dir($path))) { + if($enable) { + exec('chattr +i ' . escapeshellarg($path)); + } else { + exec('chattr -i ' . escapeshellarg($path)); + } + } + } + //** Detect PHP-Version public function get_php_version() { if(version_compare(PHP_VERSION, $this->min_php, '<')) return false; @@ -235,7 +245,7 @@ class installer_base { die(); }*/ - $unwanted_sql_plugins = array('validate_password'); + $unwanted_sql_plugins = array('validate_password'); $sql_plugins = $this->db->queryAllRecords("SELECT plugin_name FROM information_schema.plugins WHERE plugin_status='ACTIVE' AND plugin_name IN ?", $unwanted_sql_plugins); if(is_array($sql_plugins) && !empty($sql_plugins)) { foreach ($sql_plugins as $plugin) echo "Login in to MySQL and disable $plugin[plugin_name] with:\n\n UNINSTALL PLUGIN $plugin[plugin_name];"; @@ -357,7 +367,7 @@ class installer_base { } $server_ini_content = array_to_ini($tpl_ini_array); - + $mail_server_enabled = ($conf['services']['mail'])?1:0; $web_server_enabled = ($conf['services']['web'])?1:0; $dns_server_enabled = ($conf['services']['dns'])?1:0; @@ -427,7 +437,7 @@ class installer_base { public function detect_ips(){ global $conf; - + $output = $this->get_host_ips(); if(is_array($output) && !empty($output)){ @@ -675,7 +685,7 @@ class installer_base { if(!$this->dbmaster->query($query, $value['db'] . '.aps_instances', $value['user'], $host)) { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - + $query = "GRANT SELECT, DELETE ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; @@ -699,7 +709,7 @@ class installer_base { if(!$this->dbmaster->query($query, $value['db'] . '.mail_backup', $value['user'], $host)) { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - + $query = "GRANT SELECT, UPDATE(`dnssec_initialized`, `dnssec_info`, `dnssec_last_signed`) ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; @@ -707,7 +717,7 @@ class installer_base { if(!$this->dbmaster->query($query, $value['db'] . '.dns_soa', $value['user'], $host)) { $this->warning('Unable to set rights of user in master database: '.$value['db']."\n Query: ".$query."\n Error: ".$this->dbmaster->errorMessage); } - + $query = "GRANT SELECT, INSERT, UPDATE ON ?? TO ?@?"; if ($verbose){ echo $query ."\n"; @@ -866,7 +876,7 @@ class installer_base { $postfix_service = @($out[0]=='')?false:true; } else { //* fallback - Postfix < 2.9 $content = rf($conf['postfix']['config_dir'].'/master.cf'); - $regex = "/^((?!#)".$service.".*".$type.".*)$/m"; + $regex = "/^((?!#)".$service.".*".$type.".*)$/m"; $postfix_service = @(preg_match($regex, $content))?true:false; } @@ -976,7 +986,7 @@ class installer_base { //* mysql-virtual_relayrecipientmaps.cf $this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf'); - + //* mysql-virtual_outgoing_bcc.cf $this->process_postfix_config('mysql-virtual_outgoing_bcc.cf'); @@ -1044,13 +1054,13 @@ class installer_base { if($conf['postgrey']['installed'] == true) { $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf'; } - + $reject_sender_login_mismatch = ''; if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) { $reject_sender_login_mismatch = ', reject_authenticated_sender_login_mismatch'; } unset($server_ini_array); - + $tmp = str_replace('.','\.',$conf['hostname']); $postconf_placeholders = array('{config_dir}' => $config_dir, @@ -1188,7 +1198,7 @@ class installer_base { caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); } - + public function configure_saslauthd() { global $conf; @@ -1304,7 +1314,7 @@ class installer_base { public function configure_dovecot() { global $conf; - + $virtual_transport = 'dovecot'; $configure_lmtp = false; @@ -1319,7 +1329,7 @@ class installer_base { $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']); $ini_array = ini_to_array(stripslashes($tmp['config'])); // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni() - + if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') { $virtual_transport = 'lmtp:unix:private/dovecot-lmtp'; $configure_lmtp = true; @@ -1403,7 +1413,7 @@ class installer_base { if(version_compare($dovecot_version,2.3) >= 0) { // Remove deprecated setting(s) removeLine($config_dir.'/'.$configfile, 'ssl_protocols ='); - + // Check if we have a dhparams file and if not, create it if(!file_exists('/etc/dovecot/dh.pem')) { swriteln('Creating new DHParams file, this takes several minutes. Do not interrupt the script.'); @@ -1426,7 +1436,7 @@ class installer_base { $content = str_replace('#2.3+ ','',$content); file_put_contents($config_dir.'/'.$configfile,$content); unset($content); - + } else { // remove settings which are not supported in Dovecot < 2.3 removeLine($config_dir.'/'.$configfile, 'ssl_min_protocol ='); @@ -1470,7 +1480,7 @@ class installer_base { chmod($config_dir.'/'.$configfile, 0600); chown($config_dir.'/'.$configfile, 'root'); chgrp($config_dir.'/'.$configfile, 'root'); - + // Dovecot shall ignore mounts in website directory if(is_installed('doveadm')) exec("doveadm mount add '/var/www/*' ignore > /dev/null 2> /dev/null"); @@ -1576,12 +1586,12 @@ class installer_base { public function configure_rspamd() { global $conf; - + //* These postconf commands will be executed on installation and update $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); unset($server_ini_rec); - + $mail_config = $server_ini_array['mail']; if($mail_config['content_filter'] === 'rspamd') { exec("postconf -X 'receive_override_options'"); @@ -1603,7 +1613,7 @@ class installer_base { } } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - + } if(is_user('_rspamd') && is_group('amavis')) { @@ -1611,7 +1621,7 @@ class installer_base { } elseif(is_user('rspamd') && is_group('amavis')) { exec("usermod -G amavis rspamd"); } - + if(!is_dir('/etc/rspamd/local.d/')){ mkdir('/etc/rspamd/local.d/', 0755, true); } @@ -1619,7 +1629,7 @@ class installer_base { if(!is_dir('/etc/rspamd/override.d/')){ mkdir('/etc/rspamd/override.d/', 0755, true); } - + if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' ) { $mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1); } @@ -1731,17 +1741,17 @@ class installer_base { wf('/etc/rspamd/local.d/dkim_signing.conf', $tpl->grab()); exec('chmod a+r /etc/rspamd/local.d/* /etc/rspamd/override.d/*'); - + $command = 'usermod -a -G amavis _rspamd'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + if(strpos(rf('/etc/rspamd/rspamd.conf'), '.include "$LOCAL_CONFDIR/local.d/users.conf"') === false){ af('/etc/rspamd/rspamd.conf', '.include "$LOCAL_CONFDIR/local.d/users.conf"'); } - + if(!isset($mail_config['rspamd_password']) || !$mail_config['rspamd_password']) { $mail_config['rspamd_password'] = str_shuffle(bin2hex(openssl_random_pseudo_bytes(12))); - + $server_ini_array['mail']['rspamd_password'] = $mail_config['rspamd_password']; } @@ -1753,7 +1763,7 @@ class installer_base { $this->db->query('UPDATE `server` SET `config` = ? WHERE `server_id` = ?', $server_ini_string, $conf['server_id']); unset($server_ini_array); unset($server_ini_string); - + $tpl = new tpl(); $tpl->newTemplate('rspamd_worker-controller.inc.master'); $tpl->setVar('rspamd_password', $mail_config['rspamd_password']); @@ -1896,14 +1906,14 @@ class installer_base { } - + //** writes bind configuration files public function process_bind_file($configfile, $target='/', $absolute=false) { global $conf; if ($absolute) $full_file_name = $target.$configfile; else $full_file_name = $conf['ispconfig_install_dir'].$target.$configfile; - + //* Backup exiting file if(is_file($full_file_name)) { copy($full_file_name, $config_dir.$configfile.'~'); @@ -1935,7 +1945,7 @@ class installer_base { chown($content, $conf['bind']['bind_user']); chgrp($content, $conf['bind']['bind_group']); chmod($content, 02770); - + //* Install scripts for dnssec implementation $this->process_bind_file('named.conf.options', '/etc/bind/', true); //TODO replace hardcoded path } @@ -2055,12 +2065,12 @@ class installer_base { if(is_file('/etc/apache2/ports.conf')) { // add a line "Listen 443" to ports conf if line does not exist replaceLine('/etc/apache2/ports.conf', 'Listen 443', 'Listen 443', 1); - + // Comment out the namevirtualhost lines, as they were added by ispconfig in ispconfig.conf file again replaceLine('/etc/apache2/ports.conf', 'NameVirtualHost *:80', '# NameVirtualHost *:80', 1); replaceLine('/etc/apache2/ports.conf', 'NameVirtualHost *:443', '# NameVirtualHost *:443', 1); } - + if(is_file('/etc/apache2/mods-available/fcgid.conf')) { // add or modify the parameters for fcgid.conf replaceLine('/etc/apache2/mods-available/fcgid.conf','MaxRequestLen','MaxRequestLen 15728640',1); @@ -2075,7 +2085,7 @@ class installer_base { } } } - + if(is_file('/etc/apache2/apache2.conf')) { if(hasLine('/etc/apache2/apache2.conf', 'Include sites-enabled/', 1) == false && hasLine('/etc/apache2/apache2.conf', 'IncludeOptional sites-enabled/', 1) == false) { if(hasLine('/etc/apache2/apache2.conf', 'Include sites-enabled/*.conf', 1) == true) { @@ -2092,16 +2102,16 @@ class installer_base { $tpl = new tpl('apache_ispconfig.conf.master'); $tpl->setVar('apache_version',getapacheversion()); - + if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); } else { $tpl->setVar('logging','yes'); } - + $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']); $ip_addresses = array(); - + if(is_array($records) && count($records) > 0) { foreach($records as $rec) { if($rec['ip_type'] == 'IPv6') { @@ -2120,9 +2130,9 @@ class installer_base { } } } - + if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses); - + wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab()); unset($tpl); @@ -2182,7 +2192,7 @@ class installer_base { //* add a sshusers group $command = 'groupadd sshusers'; if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + // add anonymized log option to nginxx.conf file $nginx_conf_file = $conf['nginx']['config_dir'].'/nginx.conf'; if(is_file($nginx_conf_file)) { @@ -2192,7 +2202,7 @@ class installer_base { replaceLine($nginx_conf_file, 'http {', "http {\n\n".file_get_contents('tpl/nginx_anonlog.master'), 0, 0); } } - + } public function configure_fail2ban() { @@ -2352,7 +2362,7 @@ class installer_base { $vhost_conf_dir = $conf['apache']['vhost_conf_dir']; $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir']; $apps_vhost_servername = ($conf['web']['apps_vhost_servername'] == '')?'':'ServerName '.$conf['web']['apps_vhost_servername']; - + //* Get the apps vhost port if($this->is_update == true) { $conf['web']['apps_vhost_port'] = get_apps_vhost_port_number(); @@ -2375,7 +2385,7 @@ class installer_base { if($conf['rspamd']['installed'] == true) { $tpl->setVar('use_rspamd', 'yes'); } - + // comment out the listen directive if port is 80 or 443 if($conf['web']['apps_vhost_ip'] == 80 or $conf['web']['apps_vhost_ip'] == 443) { $tpl->setVar('vhost_port_listen','#'); @@ -2398,11 +2408,12 @@ class installer_base { $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); mkdir($conf['web']['website_basedir'].'/php-fcgi-scripts/apps', 0755, true); + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', false); //copy('tpl/apache_apps_fcgi_starter.master',$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); wf($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', $content); exec('chmod +x '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter'); exec('chown -R ispapps:ispapps '.$conf['web']['website_basedir'].'/php-fcgi-scripts/apps'); - + $this->set_immutable($conf['web']['website_basedir'].'/php-fcgi-scripts/apps/.php-fcgi-starter', true); } } if($conf['nginx']['installed'] == true){ @@ -2448,7 +2459,7 @@ class installer_base { } else { $content = str_replace('{use_rspamd}', '# ', $content); } - + $socket_dir = escapeshellcmd($conf['nginx']['php_fpm_socket_dir']); if(substr($socket_dir, -1) != '/') $socket_dir .= '/'; if(!is_dir($socket_dir)) exec('mkdir -p '.$socket_dir); @@ -2478,11 +2489,11 @@ class installer_base { } $content = str_replace('{use_tcp}', $use_tcp, $content); $content = str_replace('{use_socket}', $use_socket, $content); - + // SSL in apps vhost is off by default. Might change later. $content = str_replace('{ssl_on}', '', $content); $content = str_replace('{ssl_comment}', '#', $content); - + // Fix socket path on PHP 7 systems if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); @@ -2534,7 +2545,7 @@ class installer_base { exec("openssl rsa -passin pass:$ssl_pw -in $ssl_key_file -out $ssl_key_file.insecure"); rename($ssl_key_file, $ssl_key_file.'.secure'); rename($ssl_key_file.'.insecure', $ssl_key_file); - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); } @@ -2564,20 +2575,20 @@ class installer_base { //* copy the ISPConfig server part $command = 'cp -rf ../server '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make a backup of the security settings if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~'); - + //* copy the ISPConfig security part $command = 'cp -rf ../security '.$install_dir; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + $configfile = 'security_settings.ini'; if(is_file($install_dir.'/security/'.$configfile)) { copy($install_dir.'/security/'.$configfile, $install_dir.'/security/'.$configfile.'~'); } $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); - wf($install_dir.'/security/'.$configfile, $content); + wf($install_dir.'/security/'.$configfile, $content); //* Create a symlink, so ISPConfig is accessible via web // Replaced by a separate vhost definition for port 8080 @@ -2739,15 +2750,15 @@ class installer_base { //* Chmod the files and directories in the acme dir $command = 'chmod -R 755 '.$install_dir.'/interface/acme'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the server files to the root user and group $command = 'chown -R root:root '.$install_dir.'/server'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security files to the root user and group $command = 'chown -R root:root '.$install_dir.'/security'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* chown the security directory and security_settings.ini to root:ispconfig $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); @@ -2761,7 +2772,7 @@ class installer_base { caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); $command = 'chown root:ispconfig '.$install_dir.'/security/nginx_directives.blacklist'; caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - + //* Make the global language file directory group writable exec("chmod -R 770 $install_dir/interface/lib/lang"); @@ -2812,7 +2823,7 @@ class installer_base { exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices')); exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices')); } - + exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing @@ -2870,7 +2881,7 @@ class installer_base { } else { $tpl->setVar('ssl_bundle_comment','#'); } - + $tpl->setVar('apache_version',getapacheversion()); wf($vhost_conf_dir.'/ispconfig.vhost', $tpl->grab()); @@ -2887,10 +2898,12 @@ class installer_base { $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content); $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content); @mkdir('/var/www/php-fcgi-scripts/ispconfig', 0755, true); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', false); wf('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content); exec('chmod +x /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); @symlink($install_dir.'/interface/web', '/var/www/ispconfig'); exec('chown -R ispconfig:ispconfig /var/www/php-fcgi-scripts/ispconfig'); + $this->set_immutable('/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', true); //} } @@ -3009,16 +3022,16 @@ class installer_base { //* Remove Domain module as its functions are available in the client module now if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain'); - + //* Disable rkhunter run and update in debian cronjob as ispconfig is running and updating rkhunter if(is_file('/etc/default/rkhunter')) { replaceLine('/etc/default/rkhunter', 'CRON_DAILY_RUN="yes"', 'CRON_DAILY_RUN="no"', 1, 0); replaceLine('/etc/default/rkhunter', 'CRON_DB_UPDATE="yes"', 'CRON_DB_UPDATE="no"', 1, 0); } - + // Add symlink for patch tool if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); @@ -3112,12 +3125,12 @@ class installer_base { chmod($conf['ispconfig_log_dir'].'/cron.log', 0660); } - + public function create_mount_script(){ global $app, $conf; $mount_script = '/usr/local/ispconfig/server/scripts/backup_dir_mount.sh'; $mount_command = ''; - + if(is_file($mount_script)) return; if(is_file('/etc/rc.local')){ $rc_local = file('/etc/rc.local'); @@ -3138,25 +3151,25 @@ class installer_base { } } } - + // This function is called at the end of the update process and contains code to clean up parts of old ISPCONfig releases public function cleanup_ispconfig() { global $app,$conf; - + // Remove directories recursively if(is_dir('/usr/local/ispconfig/interface/web/designer')) exec('rm -rf /usr/local/ispconfig/interface/web/designer'); if(is_dir('/usr/local/ispconfig/interface/web/themes/default-304')) exec('rm -rf /usr/local/ispconfig/interface/web/themes/default-304'); - + // Remove files if(is_file('/usr/local/ispconfig/interface/lib/classes/db_firebird.inc.php')) unlink('/usr/local/ispconfig/interface/lib/classes/db_firebird.inc.php'); if(is_file('/usr/local/ispconfig/interface/lib/classes/form.inc.php')) unlink('/usr/local/ispconfig/interface/lib/classes/form.inc.php'); - + // Change mode of a few files from amavisd if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640); if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400); - + } public function getinitcommand($servicename, $action, $init_script_directory = ''){ @@ -3246,7 +3259,7 @@ class installer_base { wf($tConf, $tContents); // write file if (func_num_args() >= 4) // override rights and/or ownership { - + $output = array_slice($args, 2); switch (sizeof($output)) { diff --git a/install/uninstall.php b/install/uninstall.php index c565d4653d..fdac79d61e 100644 --- a/install/uninstall.php +++ b/install/uninstall.php @@ -70,31 +70,32 @@ if($do_uninstall == 'yes') { if (!$result) echo "Unable to remove the ispconfig-database-user ".$conf['db_user']." ".mysqli_error($link)."\n"; } mysqli_close($link); - + // Deleting the symlink in /var/www // Apache @unlink("/etc/apache2/sites-enabled/000-ispconfig.vhost"); @unlink("/etc/apache2/sites-available/ispconfig.vhost"); @unlink("/etc/apache2/sites-enabled/000-apps.vhost"); @unlink("/etc/apache2/sites-available/apps.vhost"); - + // nginx @unlink("/etc/nginx/sites-enabled/000-ispconfig.vhost"); @unlink("/etc/nginx/sites-available/ispconfig.vhost"); @unlink("/etc/nginx/sites-enabled/000-apps.vhost"); @unlink("/etc/nginx/sites-available/apps.vhost"); - + // Delete the ispconfig files exec('rm -rf /usr/local/ispconfig'); - + // Delete various other files @unlink("/usr/local/bin/ispconfig_update.sh"); @unlink("/usr/local/bin/ispconfig_update_from_svn.sh"); @unlink("/var/spool/mail/ispconfig"); @unlink("/var/www/ispconfig"); - @unlink("/var/www/php-fcgi-scripts/ispconfig"); + @exec('chattr -i /var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter'); @unlink("/var/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter"); - + @unlink("/var/www/php-fcgi-scripts/ispconfig"); + echo "Backups in /var/backup/ and log files in /var/log/ispconfig are not deleted."; echo "Finished uninstalling.\n"; diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 078c225c10..0556578a96 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -36,10 +36,10 @@ class system{ var $data; var $min_uid = 500; var $min_gid = 500; - + private $_last_exec_out = null; private $_last_exec_retcode = null; - + /** * Construct for this class * @@ -872,7 +872,7 @@ class system{ $app->log("Action aborted, file is a symlink: $filename", LOGLEVEL_WARN); return false; } - + if($run_as_user !== null && $run_as_user !== 'root') { if(!$this->check_run_as_user($run_as_user)) { $app->log("Action aborted, invalid run-as-user: $run_as_user", LOGLEVEL_WARN); @@ -1657,7 +1657,7 @@ class system{ function maildirmake($maildir_path, $user = '', $subfolder = '', $group = '') { global $app, $conf; - + // load the server configuration options $app->uses("getconf"); $mail_config = $app->getconf->get_server_config($conf["server_id"], 'mail'); @@ -1678,7 +1678,7 @@ class system{ if($group != '' && $group != 'root' && $this->is_group($group)) { if(is_dir($dir)) $this->chgrp($dir, $group); - + $chgrp_mdsub = true; } @@ -1694,7 +1694,7 @@ class system{ //* Add the subfolder to the subscriptions and courierimapsubscribed files if($subfolder != '') { - + // Courier if($mail_config['pop3_imap_daemon'] == 'courier') { if(!is_file($maildir_path.'/courierimapsubscribed')) { @@ -1741,7 +1741,7 @@ class system{ } } - + function _exec($command, $allow_return_codes = null) { global $app; $out = array(); @@ -1765,6 +1765,28 @@ class system{ } } + function set_immutable($path, $enable = true, $recursive = false) { + global $app; + + if($this->checkpath($path) == false) { + $app->log("Action aborted, target is a symlink: $path", LOGLEVEL_DEBUG); + return false; + } + + if($path != '' && $path != '/' && strlen($path) > 6 && strpos($path, '..') === false && (is_file($path) || is_dir($path))) { + if($enable) { + $this->exec_safe('chattr +i ?', $path); + } else { + $this->exec_safe('chattr -i ?', $path); + } + + if($enable === false && $recursive === true && is_dir($path)) { + // only allow when removing immutable + $this->exec_safe('chattr -R -i ?', $path); + } + } + } + function web_folder_protection($document_root, $protect) { global $app, $conf; @@ -1902,9 +1924,9 @@ class system{ function mount_backup_dir($backup_dir, $mount_cmd = '/usr/local/ispconfig/server/scripts/backup_dir_mount.sh'){ global $app, $conf; - + if($this->is_mounted($backup_dir)) return true; - + $mounted = true; if ( is_file($mount_cmd) && is_executable($mount_cmd) && @@ -2000,7 +2022,7 @@ class system{ function getapacheversion($get_minor = false) { global $app; - + $cmd = ''; if($this->is_installed('apache2ctl')) $cmd = 'apache2ctl -v'; elseif($this->is_installed('apachectl')) $cmd = 'apachectl -v'; @@ -2008,13 +2030,13 @@ class system{ $app->log("Could not check apache version, apachectl not found.", LOGLEVEL_DEBUG); return '2.2'; } - + exec($cmd, $output, $return_var); if($return_var != 0 || !$output[0]) { $app->log("Could not check apache version, apachectl did not return any data.", LOGLEVEL_WARN); return '2.2'; } - + if(preg_match('/version:\s*Apache\/(\d+)(\.(\d+)(\.(\d+))*)?(\D|$)/i', $output[0], $matches)) { return $matches[1] . (isset($matches[3]) ? '.' . $matches[3] : '') . (isset($matches[5]) && $get_minor == true ? '.' . $matches[5] : ''); } else { @@ -2025,7 +2047,7 @@ class system{ function getapachemodules() { global $app; - + $cmd = ''; if($this->is_installed('apache2ctl')) $cmd = 'apache2ctl -t -D DUMP_MODULES'; elseif($this->is_installed('apachectl')) $cmd = 'apachectl -t -D DUMP_MODULES'; @@ -2033,23 +2055,23 @@ class system{ $app->log("Could not check apache modules, apachectl not found.", LOGLEVEL_WARN); return array(); } - + exec($cmd . ' 2>/dev/null', $output, $return_var); if($return_var != 0 || !$output[0]) { $app->log("Could not check apache modules, apachectl did not return any data.", LOGLEVEL_WARN); return array(); } - + $modules = array(); for($i = 0; $i < count($output); $i++) { if(preg_match('/^\s*(\w+)\s+\((shared|static)\)\s*$/', $output[$i], $matches)) { $modules[] = $matches[1]; } } - + return $modules; } - + //* ISPConfig mail function public function mail($to, $subject, $text, $from, $filepath = '', $filetype = 'application/pdf', $filename = '', $cc = '', $bcc = '', $from_name = '') { global $app, $conf; @@ -2076,51 +2098,51 @@ class system{ $app->ispcmail->send($to); $app->ispcmail->finish(); - + return true; } - + public function is_allowed_user($username, $check_id = true, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($username,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $username) == false) return false; - + if($check_id && intval($this->getuid($username)) < $this->min_uid) return false; - + if($restrict_names == true && preg_match('/^web\d+$/', $username) == false) return false; - + return true; } - + public function is_allowed_group($groupname, $check_id = true, $restrict_names = false) { global $app; - + $name_blacklist = array('root','ispconfig','vmail','getmail'); if(in_array($groupname,$name_blacklist)) return false; - + if(preg_match('/^[a-zA-Z0-9\.\-_]{1,32}$/', $groupname) == false) return false; - + if($check_id && intval($this->getgid($groupname)) < $this->min_gid) return false; - + if($restrict_names == true && preg_match('/^client\d+$/', $groupname) == false) return false; - + return true; } - + public function last_exec_out() { return $this->_last_exec_out; } - + public function last_exec_retcode() { return $this->_last_exec_retcode; } - + public function exec_safe($cmd) { global $app; - + $args = func_get_args(); $arg_count = func_num_args(); if($arg_count != substr_count($cmd, '?') + 1) { @@ -2134,7 +2156,7 @@ class system{ $a = 0; foreach($args as $value) { $a++; - + $pos = strpos($cmd, '?', $pos); if($pos === false) { break; @@ -2144,21 +2166,21 @@ class system{ $pos += strlen($value); } } - + $this->_last_exec_out = null; $this->_last_exec_retcode = null; $ret = exec($cmd, $this->_last_exec_out, $this->_last_exec_retcode); - + $app->log("safe_exec cmd: " . $cmd . " - return code: " . $this->_last_exec_retcode, LOGLEVEL_DEBUG); - + return $ret; } - + public function system_safe($cmd) { call_user_func_array(array($this, 'exec_safe'), func_get_args()); return implode("\n", $this->_last_exec_out); } - + public function create_jailkit_user($username, $home_dir, $user_home_dir, $shell = '/bin/bash', $p_user = null, $p_user_home_dir = null) { // Check if USERHOMEDIR already exists if(!is_dir($home_dir . '/.' . $user_home_dir)) { @@ -2178,10 +2200,10 @@ class system{ $cmd = 'usermod --home=? ? 2>/dev/null'; $this->exec_safe($cmd, $home_dir . '/.' . $p_user_home_dir, $p_user); } - + return true; } - + public function create_jailkit_programs($home_dir, $programs = array()) { if(empty($programs)) { return true; @@ -2192,20 +2214,20 @@ class system{ foreach($programs as $prog) { $program_args .= ' ' . escapeshellarg($prog); } - + $cmd = 'jk_cp -k ?' . $program_args; $this->exec_safe($cmd, $home_dir); - + return true; } - + public function create_jailkit_chroot($home_dir, $app_sections = array()) { if(empty($app_sections)) { return true; } elseif(is_string($app_sections)) { $app_sections = preg_split('/[\s,]+/', $app_sections); } - + // Change ownership of the chroot directory to root $this->chown($home_dir, 'root'); $this->chgrp($home_dir, 'root'); @@ -2214,7 +2236,7 @@ class system{ foreach($app_sections as $app_section) { $app_args .= ' ' . escapeshellarg($app_section); } - + // Initialize the chroot into the specified directory with the specified applications $cmd = 'jk_init -f -k -c /etc/jailkit/jk_init.ini -j ?' . $app_args; $this->exec_safe($cmd, $home_dir); @@ -2231,47 +2253,47 @@ class system{ // mysql needs the socket in the chrooted environment $this->mkdirpath($home_dir . '/var/run/mysqld'); - + // ln /var/run/mysqld/mysqld.sock $CHROOT_HOMEDIR/var/run/mysqld/mysqld.sock if(!file_exists("/var/run/mysqld/mysqld.sock")) { $this->exec_safe('ln ? ?', '/var/run/mysqld/mysqld.sock', $home_dir . '/var/run/mysqld/mysqld.sock'); } - + return true; } - - + + public function pipe_exec($cmd, $stdin, &$retval = null, &$stderr = null) { $descriptors = array( 0 => array('pipe', 'r'), 1 => array('pipe', 'w'), 2 => array('pipe', 'w') ); - + $result = ''; $pipes = null; $proc = proc_open($cmd, $descriptors, $pipes); if(is_resource($proc)) { fwrite($pipes[0], $stdin); fclose($pipes[0]); - + $result = stream_get_contents($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[1]); fclose($pipes[2]); - + $retval = proc_close($proc); - + return $result; } else { return false; } } - + private function get_sudo_command($cmd, $run_as_user) { return 'sudo -u ' . escapeshellarg($run_as_user) . ' sh -c ' . escapeshellarg($cmd); } - + private function check_run_as_user($username) { if(preg_match('/^[a-zA-Z0-9_\-]+$/', $username)) { return true; diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index b969882f2b..61116d0041 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1497,6 +1497,7 @@ class apache2_plugin { $fcgi_tpl->setVar('open_basedir', $php_open_basedir); $fcgi_starter_script = $fastcgi_starter_path.$fastcgi_config['fastcgi_starter_script'].(($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') ? '_web' . $data['new']['domain_id'] : ''); + $app->system->set_immutable($fcgi_starter_script, false); $app->system->file_put_contents($fcgi_starter_script, $fcgi_tpl->grab()); unset($fcgi_tpl); @@ -1509,6 +1510,7 @@ class apache2_plugin { } $app->system->chown($fcgi_starter_script, $data['new']['system_user']); $app->system->chgrp($fcgi_starter_script, $data['new']['system_group']); + $app->system->set_immutable($fcgi_starter_script, true); $tpl->setVar('fastcgi_alias', $fastcgi_config['fastcgi_alias']); $tpl->setVar('fastcgi_starter_path', $fastcgi_starter_path); @@ -1522,6 +1524,7 @@ class apache2_plugin { if ($data['old']['php'] == 'fast-cgi') { $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); + $app->system->set_immutable($fastcgi_starter_path, false, true); if($data['old']['type'] == 'vhost') { if(is_file($fastcgi_starter_script)) @unlink($fastcgi_starter_script); if (is_dir($fastcgi_starter_path)) @rmdir($fastcgi_starter_path); @@ -1633,6 +1636,7 @@ class apache2_plugin { } $cgi_starter_script = $cgi_starter_path.$cgi_config['cgi_starter_script'].(($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') ? '_web' . $data['new']['domain_id'] : ''); + $app->system->set_immutable($cgi_starter_script, false); $app->system->file_put_contents($cgi_starter_script, $cgi_tpl->grab()); unset($cgi_tpl); @@ -1646,6 +1650,7 @@ class apache2_plugin { } $app->system->chown($cgi_starter_script, $data['new']['system_user']); $app->system->chgrp($cgi_starter_script, $data['new']['system_group']); + $app->system->set_immutable($cgi_starter_script, true); $tpl->setVar('cgi_starter_path', $cgi_starter_path); $tpl->setVar('cgi_starter_script', $cgi_config['cgi_starter_script'].(($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') ? '_web' . $data['new']['domain_id'] : '')); @@ -2175,11 +2180,13 @@ class apache2_plugin { $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)) { + $app->system->set_immutable($fastcgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $fastcgi_starter_path); } } else { $fcgi_starter_script = $fastcgi_starter_path.$fastcgi_config['fastcgi_starter_script'].'_web'.$data['old']['domain_id']; if (file_exists($fcgi_starter_script)) { + $app->system->set_immutable($fcgi_starter_script, false); $app->system->exec_safe('rm -f ?', $fcgi_starter_script); } } @@ -2200,11 +2207,13 @@ class apache2_plugin { $cgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $web_config['cgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($cgi_starter_path)) { + $app->system->set_immutable($cgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $cgi_starter_path); } } else { $cgi_starter_script = $cgi_starter_path.'php-cgi-starter_web'.$data['old']['domain_id']; if (file_exists($cgi_starter_script)) { + $app->system->set_immutable($cgi_starter_script, false); $app->system->exec_safe('rm -f ?', $cgi_starter_script); } } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index b57d38516e..51f566a00c 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -2196,11 +2196,13 @@ class nginx_plugin { $fastcgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $web_config['fastcgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($fastcgi_starter_path)) { + $app->system->set_immutable($fastcgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $fastcgi_starter_path); } } else { $fcgi_starter_script = $fastcgi_starter_path.$web_config['fastcgi_starter_script'].'_web'.$data['old']['domain_id']; if (file_exists($fcgi_starter_script)) { + $app->system->set_immutable($fcgi_starter_script, false); $app->system->exec_safe('rm -f ?', $fcgi_starter_script); } } @@ -2222,11 +2224,13 @@ class nginx_plugin { $cgi_starter_path = str_replace('[system_user]', $data['old']['system_user'], $web_config['cgi_starter_path']); if($data['old']['type'] == 'vhost') { if (is_dir($cgi_starter_path)) { + $app->system->set_immutable($cgi_starter_path, false, true); $app->system->exec_safe('rm -rf ?', $cgi_starter_path); } } else { $cgi_starter_script = $cgi_starter_path.'php-cgi-starter_web'.$data['old']['domain_id']; if (file_exists($cgi_starter_script)) { + $app->system->set_immutable($cgi_starter_script, false); $app->system->exec_safe('rm -f ?', $cgi_starter_script); } } -- GitLab From 8c144068d992e29d541d0aababd1153b9e05beb8 Mon Sep 17 00:00:00 2001 From: Dominik Date: Thu, 23 Jul 2020 21:03:23 +0200 Subject: [PATCH 0329/1368] added defaul value to cc field --- install/sql/ispconfig3.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index be39910961..cdf85d7443 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1038,7 +1038,7 @@ CREATE TABLE `mail_user` ( `maildir` varchar(255) NOT NULL default '', `maildir_format` varchar(255) NOT NULL default 'maildir', `quota` bigint(20) NOT NULL default '-1', - `cc` text, + `cc` text NOT NULL default '', `sender_cc` varchar(255) NOT NULL default '', `homedir` varchar(255) NOT NULL default '', `autoresponder` enum('n','y') NOT NULL default 'n', -- GitLab From e5a00f9d24f2621611abae7f46638328c9c1bc88 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 23 Jul 2020 13:30:57 -0600 Subject: [PATCH 0330/1368] update mysql-virtual_forwardings.cf.master --- install/tpl/mysql-virtual_forwardings.cf.master | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index 818cac07bc..04a94ee634 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -14,7 +14,9 @@ query = SELECT u.email as target FROM mail_forwarding as s WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND f.active = 'y' AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s - WHERE s.source = '@%d' AND s.type IN ('catchall') and s.active = 'y' AND s.server_id = {server_id} + LEFT JOIN mail_user as uu ON (uu.email = '%s' AND uu.disabledeliver = 'n') + LEFT JOIN mail_forwarding as uf ON (uf.source = '%s' AND uf.type IN ('alias', 'forward') AND uf.active = 'y') + WHERE s.source = '@%d' AND s.type IN ('catchall') and s.active = 'y' AND uu.mailuser_id IS NULL AND uf.forwarding_id IS NULL AND s.server_id = {server_id} UNION SELECT s.destination as target FROM mail_forwarding as s INNER JOIN mail_forwarding as t ON (t.source = s.destination AND t.type = 'catchall') -- GitLab From 57b06a88407b37c099a2353f708c74d849b1ecb7 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 09:27:00 +0200 Subject: [PATCH 0331/1368] - fix mailman images not showing on nginx --- install/tpl/nginx_apps.vhost.master | 2 +- server/conf/nginx_apps.vhost.master | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install/tpl/nginx_apps.vhost.master b/install/tpl/nginx_apps.vhost.master index 871dff8c57..a22b1aab46 100644 --- a/install/tpl/nginx_apps.vhost.master +++ b/install/tpl/nginx_apps.vhost.master @@ -200,7 +200,7 @@ server { fastcgi_pass unix:{cgi_socket}; } - location /images/mailman { + location ^~ /images/mailman { alias /usr/share/images/mailman; } diff --git a/server/conf/nginx_apps.vhost.master b/server/conf/nginx_apps.vhost.master index 8a97f82a43..0c82c4631e 100644 --- a/server/conf/nginx_apps.vhost.master +++ b/server/conf/nginx_apps.vhost.master @@ -191,7 +191,7 @@ server { fastcgi_pass unix:{cgi_socket}; } - location /images/mailman { + location ^~ /images/mailman { alias /usr/share/images/mailman; } -- GitLab From b8157bbf725e2c7311913d64814a27ae396743d6 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 09:38:59 +0200 Subject: [PATCH 0332/1368] - fixed wrong permissions for web folder of vhost alias and subdomain --- server/plugins-available/nginx_plugin.inc.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 51f566a00c..f7f93b4be5 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -573,7 +573,13 @@ class nginx_plugin { // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); - if(!is_dir($data['new']['document_root'].'/' . $web_folder)) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + if(!is_dir($data['new']['document_root'].'/' . $web_folder)) { + if($web_folder !== 'web') { //vhost sub/alias + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder, 0755, $username, $groupname); + } else { + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + } + } if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/error') and $data['new']['errordocs']) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/error'); if($data['new']['stats_type'] != '' && !is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/stats'); if(!is_dir($data['new']['document_root'].'/ssl')) $app->system->mkdirpath($data['new']['document_root'].'/ssl'); -- GitLab From c59bbda3323d8d9e0de44c80b2a5cd4365a3938e Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 09:43:39 +0200 Subject: [PATCH 0333/1368] - missed file from previous commit --- server/plugins-available/apache2_plugin.inc.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 61116d0041..cf58ed8a20 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -731,7 +731,13 @@ class apache2_plugin { // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); - if(!is_dir($data['new']['document_root'].'/' . $web_folder)) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + if(!is_dir($data['new']['document_root'].'/' . $web_folder)) { + if($web_folder !== 'web') { //vhost sub/alias + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder, 0755, $username, $groupname); + } else { + $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder); + } + } if(!is_dir($data['new']['document_root'].'/' . $web_folder . '/error') and $data['new']['errordocs']) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/error'); if($data['new']['stats_type'] != '' && !is_dir($data['new']['document_root'].'/' . $web_folder . '/stats')) $app->system->mkdirpath($data['new']['document_root'].'/' . $web_folder . '/stats'); if(!is_dir($data['new']['document_root'].'/ssl')) $app->system->mkdirpath($data['new']['document_root'].'/ssl'); -- GitLab From d60ccc1f16fdc5dd8a24bc1eb1b6d0cf17730d08 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 10:02:22 +0200 Subject: [PATCH 0334/1368] - disallow several folders for vhost subdomains and aliasdomains --- interface/lib/classes/system.inc.php | 30 +++++++++++++------ interface/web/sites/web_vhost_domain_edit.php | 6 +--- server/lib/classes/system.inc.php | 12 ++++++++ .../plugins-available/apache2_plugin.inc.php | 5 ++++ server/plugins-available/nginx_plugin.inc.php | 5 ++++ 5 files changed, 44 insertions(+), 14 deletions(-) diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index 484ef2b665..8c3decfd5c 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -67,30 +67,42 @@ class system { } } + public function is_blacklisted_web_path($path) { + $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var'); + + $path = ltrim($path, '/'); + $parts = explode('/', $path); + if(in_array(strtolower($parts[0]), $blacklist, true)) { + return true; + } + + return false; + } + public function last_exec_out() { return $this->_last_exec_out; } - + public function last_exec_retcode() { return $this->_last_exec_retcode; } - + public function exec_safe($cmd) { $arg_count = func_num_args(); $args = func_get_args(); - + if($arg_count != substr_count($cmd, '?') + 1) { trigger_error('Placeholder count not matching argument list.', E_USER_WARNING); return false; } if($arg_count > 1) { array_shift($args); - + $pos = 0; $a = 0; foreach($args as $value) { $a++; - + $pos = strpos($cmd, '?', $pos); if($pos === false) { break; @@ -100,16 +112,16 @@ class system { $pos += strlen($value); } } - + $this->_last_exec_out = null; $this->_last_exec_retcode = null; return exec($cmd, $this->_last_exec_out, $this->_last_exec_retcode); } - + public function system_safe($cmd) { call_user_func_array(array($this, 'exec_safe'), func_get_args()); return implode("\n", $this->_last_exec_out); - } + } //* Check if a application is installed public function is_installed($appname) { @@ -122,5 +134,5 @@ class system { return false; } } - + } //* End Class diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 0d770476d1..41b40784c0 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -1030,11 +1030,7 @@ 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 - if(strpos($check_folder, '/') !== false) $check_folder = substr($check_folder, 0, strpos($check_folder, '/')); // get the first part of the path to check it - if(in_array($check_folder, $forbidden_folders)) { + if($app->system->is_blacklisted_web_path($this->dataRecord['web_folder'])) { $app->tform->errorMessage .= $app->tform->lng("web_folder_invalid_txt")."
    "; } diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 0556578a96..71b901d920 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1787,6 +1787,18 @@ class system{ } } + public function is_blacklisted_web_path($path) { + $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var'); + + $path = ltrim($path, '/'); + $parts = explode('/', $path); + if(in_array(strtolower($parts[0]), $blacklist, true)) { + return true; + } + + return false; + } + function web_folder_protection($document_root, $protect) { global $app, $conf; diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 61116d0041..0a07177135 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -580,6 +580,11 @@ class apache2_plugin { $log_folder .= '/' . $subdomain_host; unset($tmp); + if($app->system->is_blacklisted_web_path($web_folder)) { + $app->log('Vhost is using a blacklisted web folder: ' . $web_folder, LOGLEVEL_ERROR); + return 0; + } + if(isset($data['old']['parent_domain_id'])) { // old one $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $data['old']['parent_domain_id']); diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 51f566a00c..711e54ab9a 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -425,6 +425,11 @@ class nginx_plugin { $log_folder .= '/' . $subdomain_host; unset($tmp); + if($app->system->is_blacklisted_web_path($web_folder)) { + $app->log('Vhost is using a blacklisted web folder: ' . $web_folder, LOGLEVEL_ERROR); + return 0; + } + if(isset($data['old']['parent_domain_id'])) { // old one $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $data['old']['parent_domain_id']); -- GitLab From fc981223a76fe0d268ba42b2728865d8dd91ece8 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 11:32:07 +0200 Subject: [PATCH 0335/1368] - replace php selector by id selector instead of string with paths --- .../sql/incremental/upd_dev_collection.sql | 9 ++ interface/web/admin/server_php_del.php | 27 +---- interface/web/admin/server_php_edit.php | 30 +---- interface/web/admin/server_php_list.php | 4 +- .../web/sites/form/web_vhost_domain.tform.php | 6 +- .../web/sites/lib/lang/ar_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/ar_web_childdomain.lng | 2 +- .../web/sites/lib/lang/ar_web_domain.lng | 2 +- .../sites/lib/lang/ar_web_vhost_domain.lng | 6 +- .../sites/lib/lang/ar_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/bg_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/bg_web_childdomain.lng | 2 +- .../web/sites/lib/lang/bg_web_domain.lng | 2 +- .../sites/lib/lang/bg_web_vhost_domain.lng | 6 +- .../sites/lib/lang/bg_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/br_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/br_web_childdomain.lng | 2 +- .../web/sites/lib/lang/br_web_domain.lng | 2 +- .../sites/lib/lang/br_web_vhost_domain.lng | 6 +- .../sites/lib/lang/br_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/ca_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/ca_web_childdomain.lng | 2 +- .../web/sites/lib/lang/ca_web_domain.lng | 2 +- .../sites/lib/lang/ca_web_vhost_domain.lng | 6 +- .../sites/lib/lang/ca_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/cz_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/cz_web_childdomain.lng | 2 +- .../web/sites/lib/lang/cz_web_domain.lng | 2 +- .../sites/lib/lang/cz_web_vhost_domain.lng | 6 +- .../sites/lib/lang/cz_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/de_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/de_web_childdomain.lng | 2 +- .../web/sites/lib/lang/de_web_domain.lng | 2 +- .../sites/lib/lang/de_web_vhost_domain.lng | 6 +- .../sites/lib/lang/de_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/dk_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/dk_web_childdomain.lng | 2 +- .../web/sites/lib/lang/dk_web_domain.lng | 2 +- .../sites/lib/lang/dk_web_vhost_domain.lng | 6 +- .../sites/lib/lang/dk_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/el_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/el_web_childdomain.lng | 2 +- .../web/sites/lib/lang/el_web_domain.lng | 2 +- .../sites/lib/lang/el_web_vhost_domain.lng | 6 +- .../sites/lib/lang/el_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/en_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/en_web_childdomain.lng | 2 +- .../web/sites/lib/lang/en_web_domain.lng | 2 +- .../sites/lib/lang/en_web_vhost_domain.lng | 6 +- .../sites/lib/lang/en_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/es_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/es_web_childdomain.lng | 2 +- .../web/sites/lib/lang/es_web_domain.lng | 2 +- .../sites/lib/lang/es_web_vhost_domain.lng | 6 +- .../sites/lib/lang/es_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/fi_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/fi_web_childdomain.lng | 2 +- .../web/sites/lib/lang/fi_web_domain.lng | 2 +- .../sites/lib/lang/fi_web_vhost_domain.lng | 6 +- .../sites/lib/lang/fi_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/fr_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/fr_web_childdomain.lng | 2 +- .../web/sites/lib/lang/fr_web_domain.lng | 2 +- .../sites/lib/lang/fr_web_vhost_domain.lng | 6 +- .../sites/lib/lang/fr_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/hr_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/hr_web_childdomain.lng | 2 +- .../web/sites/lib/lang/hr_web_domain.lng | 2 +- .../sites/lib/lang/hr_web_vhost_domain.lng | 6 +- .../sites/lib/lang/hr_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/hu_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/hu_web_childdomain.lng | 2 +- .../web/sites/lib/lang/hu_web_domain.lng | 2 +- .../sites/lib/lang/hu_web_vhost_domain.lng | 6 +- .../sites/lib/lang/hu_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/id_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/id_web_childdomain.lng | 2 +- .../web/sites/lib/lang/id_web_domain.lng | 2 +- .../sites/lib/lang/id_web_vhost_domain.lng | 6 +- .../sites/lib/lang/id_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/it_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/it_web_childdomain.lng | 2 +- .../web/sites/lib/lang/it_web_domain.lng | 2 +- .../sites/lib/lang/it_web_vhost_domain.lng | 6 +- .../sites/lib/lang/it_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/ja_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/ja_web_childdomain.lng | 2 +- .../web/sites/lib/lang/ja_web_domain.lng | 2 +- .../sites/lib/lang/ja_web_vhost_domain.lng | 6 +- .../sites/lib/lang/ja_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/nl_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/nl_web_childdomain.lng | 2 +- .../web/sites/lib/lang/nl_web_domain.lng | 2 +- .../sites/lib/lang/nl_web_vhost_domain.lng | 6 +- .../sites/lib/lang/nl_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/pl_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/pl_web_childdomain.lng | 2 +- .../web/sites/lib/lang/pl_web_domain.lng | 2 +- .../sites/lib/lang/pl_web_vhost_domain.lng | 6 +- .../sites/lib/lang/pl_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/pt_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/pt_web_childdomain.lng | 2 +- .../web/sites/lib/lang/pt_web_domain.lng | 2 +- .../sites/lib/lang/pt_web_vhost_domain.lng | 6 +- .../sites/lib/lang/pt_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/ro_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/ro_web_childdomain.lng | 2 +- .../web/sites/lib/lang/ro_web_domain.lng | 2 +- .../sites/lib/lang/ro_web_vhost_domain.lng | 6 +- .../sites/lib/lang/ro_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/ru_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/ru_web_childdomain.lng | 2 +- .../web/sites/lib/lang/ru_web_domain.lng | 2 +- .../sites/lib/lang/ru_web_vhost_domain.lng | 6 +- .../sites/lib/lang/ru_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/se_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/se_web_childdomain.lng | 2 +- .../web/sites/lib/lang/se_web_domain.lng | 2 +- .../sites/lib/lang/se_web_vhost_domain.lng | 6 +- .../sites/lib/lang/se_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/sk_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/sk_web_childdomain.lng | 2 +- .../web/sites/lib/lang/sk_web_domain.lng | 2 +- .../sites/lib/lang/sk_web_vhost_domain.lng | 6 +- .../sites/lib/lang/sk_web_vhost_subdomain.lng | 2 +- .../web/sites/lib/lang/tr_web_aliasdomain.lng | 2 +- .../web/sites/lib/lang/tr_web_childdomain.lng | 2 +- .../web/sites/lib/lang/tr_web_domain.lng | 2 +- .../sites/lib/lang/tr_web_vhost_domain.lng | 6 +- .../sites/lib/lang/tr_web_vhost_subdomain.lng | 2 +- .../sites/templates/web_vhost_domain_edit.htm | 36 +++--- interface/web/sites/web_vhost_domain_edit.php | 79 +++++-------- .../plugins-available/apache2_plugin.inc.php | 107 ++++++++++++------ server/plugins-available/nginx_plugin.inc.php | 66 ++++++----- .../shelluser_base_plugin.inc.php | 65 ++++++----- .../webserver_plugin.inc.php | 12 +- .../z_php_fpm_incron_reload_plugin.inc.php | 10 +- 137 files changed, 403 insertions(+), 398 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 1c4bd539d9..9d34258f36 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -44,3 +44,12 @@ ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; -- was missing in incremental, inserted for fixing older installations ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; + +ALTER TABLE `web_domain` ADD `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0; + +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fastcgi_binary, ':', p.php_fastcgi_ini_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; + +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fpm_init_script, ':', p.php_fpm_ini_dir, ':', p.php_fpm_pool_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; + +-- we have to decide whether to delete the column or leave it there for investigating not-converted entries +-- ALTER TABLE `web_domain` DROP COLUMN `fastcgi_php_version`; diff --git a/interface/web/admin/server_php_del.php b/interface/web/admin/server_php_del.php index f160c1b2d9..82b4c8a17d 100644 --- a/interface/web/admin/server_php_del.php +++ b/interface/web/admin/server_php_del.php @@ -52,28 +52,14 @@ $app->load('tform_actions'); class page_action extends tform_actions { function onBeforeDelete() { - global $app; $conf; + global $app; - $check = array(); - - // fastcgi - if(!empty(trim($this->dataRecord['php_fastcgi_binary']))) $check[] = trim($this->dataRecord['php_fastcgi_binary']); - if(!empty(trim($this->dataRecord['php_fastcgi_ini_dir']))) $check[] = trim($this->dataRecord['php_fastcgi_ini_dir']); - if(!empty($check)) $fastcgi_check = implode(':', $check); - unset($check); - - // fpm - if(!empty(trim($this->dataRecord['php_fpm_init_script']))) $check[] = trim($this->dataRecord['php_fpm_init_script']); - if(!empty(trim($this->dataRecord['php_fpm_ini_dir']))) $check[] = trim($this->dataRecord['php_fpm_ini_dir']); - if(!empty(trim($this->dataRecord['php_fpm_pool_dir']))) $check[] = trim($this->dataRecord['php_fpm_pool_dir']); - if(!empty($check)) $fpm_check = implode(':', $check); - - $sql = 'SELECT domain_id FROM web_domain WHERE server_id = ? AND fastcgi_php_version LIKE ?'; - if(isset($fastcgi_check)) $web_domains_fastcgi = $app->db->queryAllRecords($sql, $this->dataRecord['server_id'], '%:'.$fastcgi_check); - if(isset($fpm_check)) $web_domains_fpm = $app->db->queryAllRecords($sql, $this->dataRecord['server_id'], '%:'.$fpm_check); - - if(!empty($webdomains_fastcgi) || !empty($web_domains_fpm)) $app->error($app->tform->lng('php_in_use_error')); + $sql = 'SELECT domain_id FROM web_domain WHERE server_id = ? AND server_php_id = ?'; + $web_domains = $app->db->queryAllRecords($sql, $this->dataRecord['server_id'], $this->id); + if(!empty($web_domains)) { + $app->error($app->tform->lng('php_in_use_error')); + } } } @@ -81,4 +67,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onDelete(); -?> diff --git a/interface/web/admin/server_php_edit.php b/interface/web/admin/server_php_edit.php index c200b25bae..a9e7b38bbb 100644 --- a/interface/web/admin/server_php_edit.php +++ b/interface/web/admin/server_php_edit.php @@ -51,36 +51,10 @@ $app->load('tform_actions'); class page_action extends tform_actions { function onSubmit() { - global $app; - - if(isset($this->id) && $this->id > 0 && $app->tform->getCurrentTab() == 'php_name') { - $rec = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $this->id); - if($rec['name'] != $this->dataRecord['name']) { - $check = array(); - // fastcgi - if($rec['php_fastcgi_binary'] != '') $check[] = $rec['php_fastcgi_binary']; - if($rec['php_fastcgi_ini_dir'] != '') $check[] = $rec['php_fastcgi_ini_dir']; - if(!empty($check)) $fastcgi_check = implode(':', $check); - unset($check); - // fpm - if($rec['php_fpm_init_script'] != '') $check[] = $rec['php_fpm_init_script']; - if($rec['php_fpm_ini_dir'] != '') $check[] = $rec['php_fpm_ini_dir']; - if($rec['php_fpm_pool_dir'] != '') $check[] = $rec['php_fpm_pool_dir']; - if(!empty($check)) $fpm_check = implode(':', $check); - - $sql = 'SELECT domain_id FROM web_domain WHERE server_id = ? AND fastcgi_php_version LIKE ?'; - if(isset($fastcgi_check)) $web_domains_fastcgi = $app->db->queryAllRecords($sql, $this->dataRecord['server_id'], '%:'.$fastcgi_check); - if(isset($fpm_check)) $web_domains_fpm = $app->db->queryAllRecords($sql, $this->dataRecord['server_id'], '%:'.$fpm_check); - - if(!empty($webdomains_fastcgi) || !empty($web_domains_fpm)) $app->error($app->tform->lng('php_in_use_error').' '.$app->tform->lng('php_name_in_use_error')); - } - } - parent::onSubmit(); - } function onBeforeUpdate() { - global $app, $conf; + global $app; //* Check if the server has been changed // We do this only for the admin or reseller users, as normal clients can not change the server ID anyway @@ -99,5 +73,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onLoad(); - -?> diff --git a/interface/web/admin/server_php_list.php b/interface/web/admin/server_php_list.php index a3c4d6354f..11ef881792 100644 --- a/interface/web/admin/server_php_list.php +++ b/interface/web/admin/server_php_list.php @@ -51,7 +51,7 @@ $app->listform_actions->SQLOrderBy = "ORDER BY server_php.server_id, server_php. $app->listform_actions->SQLExtSelect = "(SELECT COUNT(w.server_id) FROM - server_php s LEFT JOIN web_domain w ON (w.fastcgi_php_version LIKE CONCAT(s.name, '%') AND s.server_id=w.server_id) + server_php s LEFT JOIN web_domain w ON (w.server_php_id = s.server_php_id AND s.server_id=w.server_id) WHERE server_php.server_php_id=s.server_php_id GROUP BY @@ -60,5 +60,3 @@ $app->listform_actions->SQLExtSelect = "(SELECT $app->listform_actions->onLoad(); - -?> diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index 7da71281cf..6031b7ea94 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -254,10 +254,10 @@ $form["tabs"]['domain'] = array ( 'value' => array('no' => 'disabled_txt', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM'), 'searchable' => 2 ), - 'fastcgi_php_version' => array ( - 'datatype' => 'VARCHAR', + 'server_php_id' => array ( + 'datatype' => 'INTEGER', 'formtype' => 'SELECT', - 'default' => '', + 'default' => '0', /*'datasource' => array ( 'type' => 'SQL', 'querystring' => "SELECT ip_address,ip_address FROM server_ip WHERE ip_type = 'IPv4' AND {AUTHSQL} ORDER BY ip_address", 'keyfield'=> 'ip_address', diff --git a/interface/web/sites/lib/lang/ar_web_aliasdomain.lng b/interface/web/sites/lib/lang/ar_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/ar_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/ar_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ar_web_childdomain.lng b/interface/web/sites/lib/lang/ar_web_childdomain.lng index 636505f248..95c9944f12 100644 --- a/interface/web/sites/lib/lang/ar_web_childdomain.lng +++ b/interface/web/sites/lib/lang/ar_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ar_web_domain.lng b/interface/web/sites/lib/lang/ar_web_domain.lng index 1ab9c55d3d..11247be982 100644 --- a/interface/web/sites/lib/lang/ar_web_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index 136829a7b2..3ce40d9b0c 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ar_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/ar_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/bg_web_aliasdomain.lng b/interface/web/sites/lib/lang/bg_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/bg_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/bg_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/bg_web_childdomain.lng b/interface/web/sites/lib/lang/bg_web_childdomain.lng index c7549b76f7..e62b0af4d5 100644 --- a/interface/web/sites/lib/lang/bg_web_childdomain.lng +++ b/interface/web/sites/lib/lang/bg_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/bg_web_domain.lng b/interface/web/sites/lib/lang/bg_web_domain.lng index 901c34a6ec..2146229cd0 100644 --- a/interface/web/sites/lib/lang/bg_web_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_domain.lng @@ -91,7 +91,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'квотата за дисковото пространство е грешна.'; $wb['traffic_quota_error_regex'] = 'Трафик квота е грешна.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index 8c48f035fe..828b79931f 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -93,9 +93,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'квотата за дисковото пространство е грешна.'; $wb['traffic_quota_error_regex'] = 'Трафик квота е грешна.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/bg_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/br_web_aliasdomain.lng b/interface/web/sites/lib/lang/br_web_aliasdomain.lng index d6142fd374..779d2c2383 100644 --- a/interface/web/sites/lib/lang/br_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/br_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve ter $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve ter um valor inteiro positivo.'; $wb['hd_quota_error_regex'] = 'Cota do disco é inválida.'; $wb['traffic_quota_error_regex'] = 'Cota de tráfego é inválida.'; -$wb['fastcgi_php_version_txt'] = 'Versão do php'; +$wb['server_php_id_txt'] = 'Versão do php'; $wb['pm_txt'] = 'Gerenciador de Processos do php-fpm'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/br_web_childdomain.lng b/interface/web/sites/lib/lang/br_web_childdomain.lng index fbbb40635e..fc5f31a2ec 100644 --- a/interface/web/sites/lib/lang/br_web_childdomain.lng +++ b/interface/web/sites/lib/lang/br_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve ter $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve ter um valor inteiro positivo.'; $wb['hd_quota_error_regex'] = 'Cota do disco é inválida.'; $wb['traffic_quota_error_regex'] = 'Cota de tráfego é inválida.'; -$wb['fastcgi_php_version_txt'] = 'Versão do php'; +$wb['server_php_id_txt'] = 'Versão do php'; $wb['pm_txt'] = 'Gerenciador de processos do php-fpm'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/br_web_domain.lng b/interface/web/sites/lib/lang/br_web_domain.lng index 1a2a2b301b..31b39974f1 100644 --- a/interface/web/sites/lib/lang/br_web_domain.lng +++ b/interface/web/sites/lib/lang/br_web_domain.lng @@ -94,7 +94,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve ter $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve ter um valor inteiro positivo.'; $wb['hd_quota_error_regex'] = 'Cota do disco é inválida.'; $wb['traffic_quota_error_regex'] = 'Cota de tráfego é inválida.'; -$wb['fastcgi_php_version_txt'] = 'Versão do php'; +$wb['server_php_id_txt'] = 'Versão do php'; $wb['pm_txt'] = 'Gerenciador de Processos do php-fpm'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index a3a14e335b..706125676a 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -97,9 +97,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve ter $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve ter um valor inteiro positivo.'; $wb['hd_quota_error_regex'] = 'Cota do disco é inválida.'; $wb['traffic_quota_error_regex'] = 'Cota de tráfego é inválida.'; -$wb['fastcgi_php_version_txt'] = 'Versão do php'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Versão do php'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'Gerenciador de Processos do php-fpm'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/br_web_vhost_subdomain.lng index 390b7402e7..03526d049b 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_subdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve ter $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve ter um valor inteiro positivo.'; $wb['hd_quota_error_regex'] = 'Cota do disco é inválida.'; $wb['traffic_quota_error_regex'] = 'Cota de tráfego é inválida.'; -$wb['fastcgi_php_version_txt'] = 'Versão do php'; +$wb['server_php_id_txt'] = 'Versão do php'; $wb['pm_txt'] = 'Gerenciador de Processos do php-fpm'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ca_web_aliasdomain.lng b/interface/web/sites/lib/lang/ca_web_aliasdomain.lng index 92c9c35538..990a5342cc 100644 --- a/interface/web/sites/lib/lang/ca_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/ca_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'La valeur de PHP-FPM pm.min_spare_ser $wb['pm_max_spare_servers_error_regex'] = 'La valeur de PHP-FPM pm.max_spare_servers doit être un entier positif.'; $wb['hd_quota_error_regex'] = 'Le quota de disque dur est invalide.'; $wb['traffic_quota_error_regex'] = 'Le quota de trafic est invalide.'; -$wb['fastcgi_php_version_txt'] = 'Version de PHP'; +$wb['server_php_id_txt'] = 'Version de PHP'; $wb['pm_txt'] = 'Manager de process PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ca_web_childdomain.lng b/interface/web/sites/lib/lang/ca_web_childdomain.lng index 762acfe244..c766bae881 100644 --- a/interface/web/sites/lib/lang/ca_web_childdomain.lng +++ b/interface/web/sites/lib/lang/ca_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ca_web_domain.lng b/interface/web/sites/lib/lang/ca_web_domain.lng index a3475c43c2..c240d5c349 100644 --- a/interface/web/sites/lib/lang/ca_web_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Le quota de disque dur est invalide.'; $wb['traffic_quota_error_regex'] = 'Le quota de trafic est invalide.'; $wb['ssl_key_txt'] = 'Clé SSL'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Version de PHP'; +$wb['server_php_id_txt'] = 'Version de PHP'; $wb['pm_txt'] = 'Manager de process PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index cf25d81260..8d0e660492 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -97,9 +97,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/ca_web_vhost_subdomain.lng index c9a4686608..faae8ba2b0 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/cz_web_aliasdomain.lng b/interface/web/sites/lib/lang/cz_web_aliasdomain.lng index 0f8d3e5dec..9861b62046 100644 --- a/interface/web/sites/lib/lang/cz_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/cz_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Verze'; +$wb['server_php_id_txt'] = 'PHP Verze'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/cz_web_childdomain.lng b/interface/web/sites/lib/lang/cz_web_childdomain.lng index b159976b29..6838d351ee 100644 --- a/interface/web/sites/lib/lang/cz_web_childdomain.lng +++ b/interface/web/sites/lib/lang/cz_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Verze'; +$wb['server_php_id_txt'] = 'PHP Verze'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/cz_web_domain.lng b/interface/web/sites/lib/lang/cz_web_domain.lng index 0998cb1264..b61ca0741a 100644 --- a/interface/web/sites/lib/lang/cz_web_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Kvóta pevného disku je neplatná.'; $wb['traffic_quota_error_regex'] = 'Traffik kvóta je neplatná.'; $wb['ssl_key_txt'] = 'SSL klíč'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Výběr PHP verze'; +$wb['server_php_id_txt'] = 'Výběr PHP verze'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index ea814b0cb9..cd7d06c8aa 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -99,9 +99,9 @@ $wb['hd_quota_error_regex'] = 'Kvóta pevného disku je neplatná.'; $wb['traffic_quota_error_regex'] = 'Traffik kvóta je neplatná.'; $wb['ssl_key_txt'] = 'SSL klíč'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Výběr PHP verze'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Výběr PHP verze'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/cz_web_vhost_subdomain.lng index 268368c139..e15b9c5863 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Kvóta pevného disku je neplatná.'; $wb['traffic_quota_error_regex'] = 'Traffik kvóta je neplatná.'; -$wb['fastcgi_php_version_txt'] = 'Výběr PHP verze'; +$wb['server_php_id_txt'] = 'Výběr PHP verze'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/de_web_aliasdomain.lng b/interface/web/sites/lib/lang/de_web_aliasdomain.lng index 5889b17d57..14e4c79d25 100644 --- a/interface/web/sites/lib/lang/de_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/de_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers muss ein $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers muss ein positiver integer Wert sein.'; $wb['hd_quota_error_regex'] = 'Speicherplatz-Beschränkung ist ungültig.'; $wb['traffic_quota_error_regex'] = 'Datentransfer-Beschränkung ist ungültig.'; -$wb['fastcgi_php_version_txt'] = 'PHP-Version'; +$wb['server_php_id_txt'] = 'PHP-Version'; $wb['pm_txt'] = 'PHP-FPM Prozess Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/de_web_childdomain.lng b/interface/web/sites/lib/lang/de_web_childdomain.lng index 05b1f1d51d..2f1248740d 100644 --- a/interface/web/sites/lib/lang/de_web_childdomain.lng +++ b/interface/web/sites/lib/lang/de_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers muss ein $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers muss ein positiver integer Wert sein.'; $wb['hd_quota_error_regex'] = 'Speicherplatz-Beschränkung ist ungültig.'; $wb['traffic_quota_error_regex'] = 'Datentransfer-Beschränkung ist ungültig.'; -$wb['fastcgi_php_version_txt'] = 'PHP-Version'; +$wb['server_php_id_txt'] = 'PHP-Version'; $wb['pm_txt'] = 'PHP-FPM Prozess Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/de_web_domain.lng b/interface/web/sites/lib/lang/de_web_domain.lng index 7232d8fa5f..b9c77a8b7b 100644 --- a/interface/web/sites/lib/lang/de_web_domain.lng +++ b/interface/web/sites/lib/lang/de_web_domain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers muß ein $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers muß eine positive ganze Zahl sein.'; $wb['hd_quota_error_regex'] = 'Speicherplatzbeschränkung ist ungültig.'; $wb['traffic_quota_error_regex'] = 'Transfervolumenbeschränkung ist ungültig.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM FastCGI Prozess Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index 449bcb588a..2607017139 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -98,9 +98,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers muß ein $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers muß eine positive ganze Zahl sein.'; $wb['hd_quota_error_regex'] = 'Speicherplatzbeschränkung ist ungültig.'; $wb['traffic_quota_error_regex'] = 'Transfervolumenbeschränkung ist ungültig.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM FastCGI Prozess Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng index 89e50f2df4..b2211e314b 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers muß ein $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers muß eine positive ganze Zahl sein.'; $wb['hd_quota_error_regex'] = 'Harddisk-Quota ist ungültig.'; $wb['traffic_quota_error_regex'] = 'Traffic-Quota ist ungültig.'; -$wb['fastcgi_php_version_txt'] = 'PHP-Version'; +$wb['server_php_id_txt'] = 'PHP-Version'; $wb['pm_txt'] = 'PHP-FPM Prozess Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/dk_web_aliasdomain.lng b/interface/web/sites/lib/lang/dk_web_aliasdomain.lng index 98b7e4d898..6a324cca90 100644 --- a/interface/web/sites/lib/lang/dk_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/dk_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk kvote is ugyldigt.'; $wb['traffic_quota_error_regex'] = 'Trafik kvote is ugyldigt.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/dk_web_childdomain.lng b/interface/web/sites/lib/lang/dk_web_childdomain.lng index 762acfe244..c766bae881 100644 --- a/interface/web/sites/lib/lang/dk_web_childdomain.lng +++ b/interface/web/sites/lib/lang/dk_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/dk_web_domain.lng b/interface/web/sites/lib/lang/dk_web_domain.lng index 7b61835543..05920d39d2 100644 --- a/interface/web/sites/lib/lang/dk_web_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_domain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk kvote is ugyldigt.'; $wb['traffic_quota_error_regex'] = 'Trafik kvote is ugyldigt.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index cf25d81260..8d0e660492 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -97,9 +97,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/dk_web_vhost_subdomain.lng index ba7aad0403..18eebc2665 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk kvote is ugyldigt.'; $wb['traffic_quota_error_regex'] = 'Trafik kvote is ugyldigt.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/el_web_aliasdomain.lng b/interface/web/sites/lib/lang/el_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/el_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/el_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/el_web_childdomain.lng b/interface/web/sites/lib/lang/el_web_childdomain.lng index 3c5cb7a936..f6c2c743bf 100644 --- a/interface/web/sites/lib/lang/el_web_childdomain.lng +++ b/interface/web/sites/lib/lang/el_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/el_web_domain.lng b/interface/web/sites/lib/lang/el_web_domain.lng index 1787aa0e33..1d067f9f8c 100644 --- a/interface/web/sites/lib/lang/el_web_domain.lng +++ b/interface/web/sites/lib/lang/el_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index f39ce19a9b..47115c8098 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/el_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/en_web_aliasdomain.lng b/interface/web/sites/lib/lang/en_web_aliasdomain.lng index eeae6770c6..5499768e06 100644 --- a/interface/web/sites/lib/lang/en_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/en_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb["pm_min_spare_servers_error_regex"] = 'PHP-FPM pm.min_spare_servers must be $wb["pm_max_spare_servers_error_regex"] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb["hd_quota_error_regex"] = 'Harddisk quota is invalid.'; $wb["traffic_quota_error_regex"] = 'Traffic quota is invalid.'; -$wb["fastcgi_php_version_txt"] = 'PHP Version'; +$wb["server_php_id_txt"] = 'PHP Version'; $wb["pm_txt"] = 'PHP-FPM Process Manager'; $wb["pm_process_idle_timeout_txt"] = 'PHP-FPM pm.process_idle_timeout'; $wb["pm_max_requests_txt"] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/en_web_childdomain.lng b/interface/web/sites/lib/lang/en_web_childdomain.lng index 54def69214..b4dd9e9326 100644 --- a/interface/web/sites/lib/lang/en_web_childdomain.lng +++ b/interface/web/sites/lib/lang/en_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/en_web_domain.lng b/interface/web/sites/lib/lang/en_web_domain.lng index 28c7c3e4e1..1785358209 100644 --- a/interface/web/sites/lib/lang/en_web_domain.lng +++ b/interface/web/sites/lib/lang/en_web_domain.lng @@ -95,7 +95,7 @@ $wb["pm_min_spare_servers_error_regex"] = 'PHP-FPM pm.min_spare_servers must be $wb["pm_max_spare_servers_error_regex"] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb["hd_quota_error_regex"] = 'Harddisk quota is invalid.'; $wb["traffic_quota_error_regex"] = 'Traffic quota is invalid.'; -$wb["fastcgi_php_version_txt"] = 'PHP Version'; +$wb["server_php_id_txt"] = 'PHP Version'; $wb["pm_txt"] = 'PHP-FPM Process Manager'; $wb["pm_process_idle_timeout_txt"] = 'PHP-FPM pm.process_idle_timeout'; $wb["pm_max_requests_txt"] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 497fcd1993..19b12ea2c4 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -97,9 +97,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng index 0c7ac92c61..f8acd2d26b 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_subdomain.lng @@ -100,7 +100,7 @@ $wb["pm_min_spare_servers_error_regex"] = 'PHP-FPM pm.min_spare_servers must be $wb["pm_max_spare_servers_error_regex"] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb["hd_quota_error_regex"] = 'Harddisk quota is invalid.'; $wb["traffic_quota_error_regex"] = 'Traffic quota is invalid.'; -$wb["fastcgi_php_version_txt"] = 'PHP Version'; +$wb["server_php_id_txt"] = 'PHP Version'; $wb["pm_txt"] = 'PHP-FPM Process Manager'; $wb["pm_process_idle_timeout_txt"] = 'PHP-FPM pm.process_idle_timeout'; $wb["pm_max_requests_txt"] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/es_web_aliasdomain.lng b/interface/web/sites/lib/lang/es_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/es_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/es_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/es_web_childdomain.lng b/interface/web/sites/lib/lang/es_web_childdomain.lng index 25843a0e21..6cf662c2ff 100644 --- a/interface/web/sites/lib/lang/es_web_childdomain.lng +++ b/interface/web/sites/lib/lang/es_web_childdomain.lng @@ -98,7 +98,7 @@ $wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children debe ser un valor $wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers debe ser un valor entero positivo.'; $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers debe ser un valor entero positivo.'; $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers debe ser un valor entero positivo.'; -$wb['fastcgi_php_version_txt'] = 'Versión de PHP'; +$wb['server_php_id_txt'] = 'Versión de PHP'; $wb['pm_txt'] = 'PHP-FPM Gestor de Procesos'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/es_web_domain.lng b/interface/web/sites/lib/lang/es_web_domain.lng index 889d29bd95..2dfe3d6cac 100644 --- a/interface/web/sites/lib/lang/es_web_domain.lng +++ b/interface/web/sites/lib/lang/es_web_domain.lng @@ -95,7 +95,7 @@ $wb['domain_error_autosub'] = 'There is already a subdomain with these settings. $wb['perl_txt'] = 'Perl'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 3f60826008..c1960ae38b 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['domain_error_autosub'] = 'Ya hay un subdominio con estas configuraciones.'; $wb['perl_txt'] = 'Perl'; $wb['hd_quota_error_regex'] = 'Cuota de disco no es válida.'; $wb['traffic_quota_error_regex'] = 'Cuota de tráfico no es válida.'; -$wb['fastcgi_php_version_txt'] = 'Versión de PHP'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Versión de PHP'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Gestor de Procesos'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/es_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fi_web_aliasdomain.lng b/interface/web/sites/lib/lang/fi_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/fi_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/fi_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fi_web_childdomain.lng b/interface/web/sites/lib/lang/fi_web_childdomain.lng index 5105ba3f2e..bbc12a35fd 100644 --- a/interface/web/sites/lib/lang/fi_web_childdomain.lng +++ b/interface/web/sites/lib/lang/fi_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fi_web_domain.lng b/interface/web/sites/lib/lang/fi_web_domain.lng index 1cc2a2024d..38434653ef 100644 --- a/interface/web/sites/lib/lang/fi_web_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index 82fd44a56a..7ba9a95d35 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/fi_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fr_web_aliasdomain.lng b/interface/web/sites/lib/lang/fr_web_aliasdomain.lng index 59a69d4f23..5ce638002b 100644 --- a/interface/web/sites/lib/lang/fr_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/fr_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'La valeur de PHP-FPM pm.min_spare_ser $wb['pm_max_spare_servers_error_regex'] = 'La valeur de PHP-FPM pm.max_spare_servers doit être un entier positif.'; $wb['hd_quota_error_regex'] = 'Le quota de disque dur est invalide.'; $wb['traffic_quota_error_regex'] = 'Le quota de trafic est invalide.'; -$wb['fastcgi_php_version_txt'] = 'Version de PHP'; +$wb['server_php_id_txt'] = 'Version de PHP'; $wb['pm_txt'] = 'Manager de process PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fr_web_childdomain.lng b/interface/web/sites/lib/lang/fr_web_childdomain.lng index 1be206e122..d636dc2d48 100644 --- a/interface/web/sites/lib/lang/fr_web_childdomain.lng +++ b/interface/web/sites/lib/lang/fr_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fr_web_domain.lng b/interface/web/sites/lib/lang/fr_web_domain.lng index 421693a0e6..a0e6ff9847 100644 --- a/interface/web/sites/lib/lang/fr_web_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Le quota de disque dur est invalide.'; $wb['traffic_quota_error_regex'] = 'Le quota de trafic est invalide.'; $wb['ssl_key_txt'] = 'Clé SSL'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Version de PHP'; +$wb['server_php_id_txt'] = 'Version de PHP'; $wb['pm_txt'] = 'Manager de process PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 5d817c611b..b3f1602e63 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Le quota de disque dur est invalide.'; $wb['traffic_quota_error_regex'] = 'Le quota de trafic est invalide.'; $wb['ssl_key_txt'] = 'Clé SSL'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Version de PHP'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Version de PHP'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'Manager de process PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/fr_web_vhost_subdomain.lng index a97883fe46..bdd704f93b 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hr_web_aliasdomain.lng b/interface/web/sites/lib/lang/hr_web_aliasdomain.lng index 67eb8363f5..7a2df148e1 100644 --- a/interface/web/sites/lib/lang/hr_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/hr_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP verzija'; +$wb['server_php_id_txt'] = 'PHP verzija'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hr_web_childdomain.lng b/interface/web/sites/lib/lang/hr_web_childdomain.lng index 99df0d2fdf..b0f7a1f2db 100644 --- a/interface/web/sites/lib/lang/hr_web_childdomain.lng +++ b/interface/web/sites/lib/lang/hr_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hr_web_domain.lng b/interface/web/sites/lib/lang/hr_web_domain.lng index 8a089e6ba5..0b27cc5e65 100644 --- a/interface/web/sites/lib/lang/hr_web_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 4d70565928..14bb2c6687 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/hr_web_vhost_subdomain.lng index 82fa901c1f..5f5f74062f 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP verzija'; +$wb['server_php_id_txt'] = 'PHP verzija'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hu_web_aliasdomain.lng b/interface/web/sites/lib/lang/hu_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/hu_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/hu_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hu_web_childdomain.lng b/interface/web/sites/lib/lang/hu_web_childdomain.lng index 5ac19c3bbc..a05534c4f7 100644 --- a/interface/web/sites/lib/lang/hu_web_childdomain.lng +++ b/interface/web/sites/lib/lang/hu_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hu_web_domain.lng b/interface/web/sites/lib/lang/hu_web_domain.lng index 5ddf06593d..711f0abee2 100644 --- a/interface/web/sites/lib/lang/hu_web_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index d8bb15537b..86e5492408 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/hu_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/id_web_aliasdomain.lng b/interface/web/sites/lib/lang/id_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/id_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/id_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/id_web_childdomain.lng b/interface/web/sites/lib/lang/id_web_childdomain.lng index d5fd9711a4..d839094ff9 100644 --- a/interface/web/sites/lib/lang/id_web_childdomain.lng +++ b/interface/web/sites/lib/lang/id_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/id_web_domain.lng b/interface/web/sites/lib/lang/id_web_domain.lng index 785d7fc0da..1dbdae9059 100644 --- a/interface/web/sites/lib/lang/id_web_domain.lng +++ b/interface/web/sites/lib/lang/id_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 39df360c89..7de6c2c6fa 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/id_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/it_web_aliasdomain.lng b/interface/web/sites/lib/lang/it_web_aliasdomain.lng index 4723783201..0dc91e1371 100644 --- a/interface/web/sites/lib/lang/it_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/it_web_aliasdomain.lng @@ -94,7 +94,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve ess $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero postivo.'; $wb['hd_quota_error_regex'] = 'Quota Spazio Disco non valido.'; $wb['traffic_quota_error_regex'] = 'Quota Traffico non valido.'; -$wb['fastcgi_php_version_txt'] = 'Versione PHP'; +$wb['server_php_id_txt'] = 'Versione PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/it_web_childdomain.lng b/interface/web/sites/lib/lang/it_web_childdomain.lng index 3a214e298e..e10211cdf7 100644 --- a/interface/web/sites/lib/lang/it_web_childdomain.lng +++ b/interface/web/sites/lib/lang/it_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/it_web_domain.lng b/interface/web/sites/lib/lang/it_web_domain.lng index 68eae554fc..497f41d74c 100644 --- a/interface/web/sites/lib/lang/it_web_domain.lng +++ b/interface/web/sites/lib/lang/it_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Quota spazio disco non valida.'; $wb['traffic_quota_error_regex'] = 'Quota Traffico non valida.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Versione'; +$wb['server_php_id_txt'] = 'PHP Versione'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 807039ca6c..3951e5d19d 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng index 259d1c820c..d1bb71c625 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve es $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero positivo.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ja_web_aliasdomain.lng b/interface/web/sites/lib/lang/ja_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/ja_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/ja_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ja_web_childdomain.lng b/interface/web/sites/lib/lang/ja_web_childdomain.lng index d59d7bbda5..fb705f1af5 100644 --- a/interface/web/sites/lib/lang/ja_web_childdomain.lng +++ b/interface/web/sites/lib/lang/ja_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ja_web_domain.lng b/interface/web/sites/lib/lang/ja_web_domain.lng index 2dbf65d2e5..5582ad82a5 100644 --- a/interface/web/sites/lib/lang/ja_web_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index 288b9fab11..a9d284b46c 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/ja_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/nl_web_aliasdomain.lng b/interface/web/sites/lib/lang/nl_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/nl_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/nl_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/nl_web_childdomain.lng b/interface/web/sites/lib/lang/nl_web_childdomain.lng index e99616ce11..9b73b148a2 100644 --- a/interface/web/sites/lib/lang/nl_web_childdomain.lng +++ b/interface/web/sites/lib/lang/nl_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/nl_web_domain.lng b/interface/web/sites/lib/lang/nl_web_domain.lng index aa57c6e012..f50539ae7c 100644 --- a/interface/web/sites/lib/lang/nl_web_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is ongeldig.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is ongeldig.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Versie'; +$wb['server_php_id_txt'] = 'PHP Versie'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index 27371eee35..50932cc9e1 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is niet correct.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is niet correct.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Versie'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Versie'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/nl_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pl_web_aliasdomain.lng b/interface/web/sites/lib/lang/pl_web_aliasdomain.lng index 19cd691beb..618ae50e84 100644 --- a/interface/web/sites/lib/lang/pl_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/pl_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers musi by $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers musi być dodatnią wartością całkowitą.'; $wb['hd_quota_error_regex'] = 'Limit dysku jest nieprawidłowy'; $wb['traffic_quota_error_regex'] = 'Limit transferu jest nieprawidłowy'; -$wb['fastcgi_php_version_txt'] = 'Wersja PHP'; +$wb['server_php_id_txt'] = 'Wersja PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pl_web_childdomain.lng b/interface/web/sites/lib/lang/pl_web_childdomain.lng index 9b8a2b56ba..ab3a61582a 100644 --- a/interface/web/sites/lib/lang/pl_web_childdomain.lng +++ b/interface/web/sites/lib/lang/pl_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers musi by $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers musi być dodatnią wartością całkowitą.'; $wb['hd_quota_error_regex'] = 'Limit dysku jest nieprawidłowy'; $wb['traffic_quota_error_regex'] = 'Limit transferu jest nieprawidłowy'; -$wb['fastcgi_php_version_txt'] = 'Wersja PHP'; +$wb['server_php_id_txt'] = 'Wersja PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pl_web_domain.lng b/interface/web/sites/lib/lang/pl_web_domain.lng index 2521f17406..e615f70303 100644 --- a/interface/web/sites/lib/lang/pl_web_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_domain.lng @@ -95,7 +95,7 @@ $wb['ssl_key_txt'] = 'Klucz SSL'; $wb['web_folder_error_regex'] = 'Wprowadzono nieprawidłowy katalog. Proszę nie wpisywać znaku slash [ / ]'; $wb['domain_error_autosub'] = 'Istnieje już subdomena z tymi ustawieniami.'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Wersja PHP'; +$wb['server_php_id_txt'] = 'Wersja PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index f1e945df6f..93752a063c 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -97,9 +97,9 @@ $wb['ssl_key_txt'] = 'Klucz SSL'; $wb['web_folder_error_regex'] = 'Wprowadzono nieprawidłowy katalog. Proszę nie wpisywać znaku slash [ / ]'; $wb['domain_error_autosub'] = 'Istnieje już subdomena z tymi ustawieniami.'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Wersja PHP'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Wersja PHP'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/pl_web_vhost_subdomain.lng index cc2431dbec..884210be39 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers musi by $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers musi być dodatnią wartością całkowitą.'; $wb['hd_quota_error_regex'] = 'Limit dyski jest nieprawidłowy'; $wb['traffic_quota_error_regex'] = 'Limit transferu jest nieprawidłowy'; -$wb['fastcgi_php_version_txt'] = 'Wersja PHP'; +$wb['server_php_id_txt'] = 'Wersja PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pt_web_aliasdomain.lng b/interface/web/sites/lib/lang/pt_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/pt_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/pt_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pt_web_childdomain.lng b/interface/web/sites/lib/lang/pt_web_childdomain.lng index 4cbc032c19..48ee53c856 100644 --- a/interface/web/sites/lib/lang/pt_web_childdomain.lng +++ b/interface/web/sites/lib/lang/pt_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pt_web_domain.lng b/interface/web/sites/lib/lang/pt_web_domain.lng index fc7add5d89..5ed2112e1e 100644 --- a/interface/web/sites/lib/lang/pt_web_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 9eb927f000..2b07795507 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/pt_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ro_web_aliasdomain.lng b/interface/web/sites/lib/lang/ro_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/ro_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/ro_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ro_web_childdomain.lng b/interface/web/sites/lib/lang/ro_web_childdomain.lng index 30f83e7283..c172b3d70f 100644 --- a/interface/web/sites/lib/lang/ro_web_childdomain.lng +++ b/interface/web/sites/lib/lang/ro_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ro_web_domain.lng b/interface/web/sites/lib/lang/ro_web_domain.lng index 7e98b45d02..3b3e8b339a 100644 --- a/interface/web/sites/lib/lang/ro_web_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 0127c4ee80..e52310bf08 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/ro_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ru_web_aliasdomain.lng b/interface/web/sites/lib/lang/ru_web_aliasdomain.lng index 7555b823b0..e63d9b039f 100644 --- a/interface/web/sites/lib/lang/ru_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/ru_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers долж $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers должен быть положительным целым числом.'; $wb['hd_quota_error_regex'] = 'Некорректная квота HDD.'; $wb['traffic_quota_error_regex'] = 'Некорректная квота трафика.'; -$wb['fastcgi_php_version_txt'] = 'Версия PHP'; +$wb['server_php_id_txt'] = 'Версия PHP'; $wb['pm_txt'] = 'Менеджер процессов PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ru_web_childdomain.lng b/interface/web/sites/lib/lang/ru_web_childdomain.lng index af71669a47..ffe19805ab 100644 --- a/interface/web/sites/lib/lang/ru_web_childdomain.lng +++ b/interface/web/sites/lib/lang/ru_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers долж $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers должен быть положительным целым числом.'; $wb['hd_quota_error_regex'] = 'Некорректная квота HDD.'; $wb['traffic_quota_error_regex'] = 'Некорректная квота трафика.'; -$wb['fastcgi_php_version_txt'] = 'Версия PHP'; +$wb['server_php_id_txt'] = 'Версия PHP'; $wb['pm_txt'] = 'Менеджер процессов PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ru_web_domain.lng b/interface/web/sites/lib/lang/ru_web_domain.lng index 6cba45f1b7..bc47bfff7e 100644 --- a/interface/web/sites/lib/lang/ru_web_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Некорректная квота HDD.'; $wb['traffic_quota_error_regex'] = 'Некорректная квота трафика.'; $wb['ssl_key_txt'] = 'SSL-ключ'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Версия PHP'; +$wb['server_php_id_txt'] = 'Версия PHP'; $wb['pm_txt'] = 'Менеджер процессов PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index 827f149dd8..07c345f0da 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Некорректная квота HDD.'; $wb['traffic_quota_error_regex'] = 'Некорректная квота трафика.'; $wb['ssl_key_txt'] = 'SSL-ключ'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'Версия PHP'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'Версия PHP'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'Менеджер процессов PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/ru_web_vhost_subdomain.lng index d548c2abe2..e504af3dad 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers долж $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers должен быть положительным целым числом.'; $wb['hd_quota_error_regex'] = 'Некорректная квота HDD.'; $wb['traffic_quota_error_regex'] = 'Некорректная квота трафика.'; -$wb['fastcgi_php_version_txt'] = 'Версия PHP'; +$wb['server_php_id_txt'] = 'Версия PHP'; $wb['pm_txt'] = 'Менеджер процессов PHP-FPM'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/se_web_aliasdomain.lng b/interface/web/sites/lib/lang/se_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/se_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/se_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/se_web_childdomain.lng b/interface/web/sites/lib/lang/se_web_childdomain.lng index eff6791c65..42e4591835 100644 --- a/interface/web/sites/lib/lang/se_web_childdomain.lng +++ b/interface/web/sites/lib/lang/se_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/se_web_domain.lng b/interface/web/sites/lib/lang/se_web_domain.lng index 91fa8c4db5..a293af77ea 100644 --- a/interface/web/sites/lib/lang/se_web_domain.lng +++ b/interface/web/sites/lib/lang/se_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 1bac2468c1..f398991442 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/se_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/sk_web_aliasdomain.lng b/interface/web/sites/lib/lang/sk_web_aliasdomain.lng index 4149c71149..74697bdb33 100644 --- a/interface/web/sites/lib/lang/sk_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/sk_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/sk_web_childdomain.lng b/interface/web/sites/lib/lang/sk_web_childdomain.lng index e0d26667bc..d14f9815f6 100644 --- a/interface/web/sites/lib/lang/sk_web_childdomain.lng +++ b/interface/web/sites/lib/lang/sk_web_childdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/sk_web_domain.lng b/interface/web/sites/lib/lang/sk_web_domain.lng index f8f2f79b96..2b18602008 100644 --- a/interface/web/sites/lib/lang/sk_web_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_domain.lng @@ -93,7 +93,7 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index c3b680b2b4..3d4a76186f 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -95,9 +95,9 @@ $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; $wb['ssl_key_txt'] = 'SSL Key'; $wb['perl_txt'] = 'Perl'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Version'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/sk_web_vhost_subdomain.lng index 35c9298e71..4ded131f4a 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_subdomain.lng @@ -99,7 +99,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers must be $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers must be a positive integer value.'; $wb['hd_quota_error_regex'] = 'Harddisk quota is invalid.'; $wb['traffic_quota_error_regex'] = 'Traffic quota is invalid.'; -$wb['fastcgi_php_version_txt'] = 'PHP Version'; +$wb['server_php_id_txt'] = 'PHP Version'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/tr_web_aliasdomain.lng b/interface/web/sites/lib/lang/tr_web_aliasdomain.lng index d7ded7849a..108f1d9a67 100644 --- a/interface/web/sites/lib/lang/tr_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/tr_web_aliasdomain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers değeri $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers değeri pozitif bir tamsayı olmalıdır.'; $wb['hd_quota_error_regex'] = 'Disk kotası geçersiz.'; $wb['traffic_quota_error_regex'] = 'Trafik kotası geçersiz.'; -$wb['fastcgi_php_version_txt'] = 'PHP Sürümü'; +$wb['server_php_id_txt'] = 'PHP Sürümü'; $wb['pm_txt'] = 'PHP-FPM İşlem Yöneticisi'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/tr_web_childdomain.lng b/interface/web/sites/lib/lang/tr_web_childdomain.lng index 235e870117..55a82167d6 100644 --- a/interface/web/sites/lib/lang/tr_web_childdomain.lng +++ b/interface/web/sites/lib/lang/tr_web_childdomain.lng @@ -101,7 +101,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers değeri $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers değeri pozitif bir tamsayı olmalıdır.'; $wb['hd_quota_error_regex'] = 'Sabit disk kotası geçersiz.'; $wb['traffic_quota_error_regex'] = 'Trafik kotası geçersiz.'; -$wb['fastcgi_php_version_txt'] = 'PHP Sürümü'; +$wb['server_php_id_txt'] = 'PHP Sürümü'; $wb['pm_txt'] = 'PHP-FPM İşlem Yönetimi'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/tr_web_domain.lng b/interface/web/sites/lib/lang/tr_web_domain.lng index 65db621f56..4d20d3efad 100644 --- a/interface/web/sites/lib/lang/tr_web_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_domain.lng @@ -95,7 +95,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers değeri $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers değeri pozitif bir tamsayı olmalıdır.'; $wb['hd_quota_error_regex'] = 'Disk kotası geçersiz.'; $wb['traffic_quota_error_regex'] = 'Trafik kotası geçersiz.'; -$wb['fastcgi_php_version_txt'] = 'PHP Sürümü'; +$wb['server_php_id_txt'] = 'PHP Sürümü'; $wb['pm_txt'] = 'PHP-FPM İşlem Yöneticisi'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 2e004d87ef..8aa1684478 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -96,9 +96,9 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers değeri $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers değeri pozitif bir tamsayı olmalıdır.'; $wb['hd_quota_error_regex'] = 'Disk kotası geçersiz.'; $wb['traffic_quota_error_regex'] = 'Trafik kotası geçersiz.'; -$wb['fastcgi_php_version_txt'] = 'PHP Sürümü'; -$wb['fastcgi_php_version_invalid_txt'] = 'PHP Version is invalid.'; -$wb['fastcgi_php_version_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; +$wb['server_php_id_txt'] = 'PHP Sürümü'; +$wb['server_php_id_invalid_txt'] = 'PHP Version is invalid.'; +$wb['server_php_id_default_hidden_warning_txt'] = 'PHP Version was set to "default" but that can no longer be selected. Choose your desired PHP Version and save your settings.'; $wb['pm_txt'] = 'PHP-FPM İşlem Yöneticisi'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/tr_web_vhost_subdomain.lng index a24883881f..7cdf15947a 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_subdomain.lng @@ -100,7 +100,7 @@ $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers değeri $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers değeri pozitif bir tamsayı olmalıdır.'; $wb['hd_quota_error_regex'] = 'Disk kotası geçersiz.'; $wb['traffic_quota_error_regex'] = 'Trafik kotası geçersiz.'; -$wb['fastcgi_php_version_txt'] = 'PHP Sürümü'; +$wb['server_php_id_txt'] = 'PHP Sürümü'; $wb['pm_txt'] = 'PHP-FPM İşlem Yöneticisi'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index e39b889d4c..0b17e38022 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -221,14 +221,14 @@ {tmpl_var name='php'} - {tmpl_hook name="field_fastcgi_php_version"} -
    - -
    + {tmpl_var name='server_php_id'}
    - - + +
    @@ -294,32 +294,32 @@ }); if(jQuery('#php').val() == 'fast-cgi' || jQuery('#php').val() == 'php-fpm' || (jQuery('#php').val() == 'hhvm' && serverType == 'nginx')){ - jQuery('.fastcgi_php_version:hidden').show(); + jQuery('.server_php_id:hidden').show(); if(jQuery('#php').val() == 'hhvm'){ - jQuery('#fastcgi_php_version_txt').hide(); + jQuery('#server_php_id_txt').hide(); jQuery('#fastcgi_php_fallback_version_txt').show(); } else { - jQuery('#fastcgi_php_version_txt').show(); + jQuery('#server_php_id_txt').show(); jQuery('#fastcgi_php_fallback_version_txt').hide(); } } else { - jQuery('.fastcgi_php_version:visible').hide(); + jQuery('.server_php_id:visible').hide(); } //ISPConfig.resetFormChanged(); jQuery('#php').change(function(){ reloadFastcgiPHPVersions(); if(jQuery(this).val() == 'fast-cgi' || jQuery(this).val() == 'php-fpm' || (jQuery(this).val() == 'hhvm' && serverType == 'nginx')){ - jQuery('.fastcgi_php_version:hidden').show(); + jQuery('.server_php_id:hidden').show(); if(jQuery(this).val() == 'hhvm'){ - jQuery('#fastcgi_php_version_txt').hide(); + jQuery('#server_php_id_txt').hide(); jQuery('#fastcgi_php_fallback_version_txt').show(); } else { - jQuery('#fastcgi_php_version_txt').show(); + jQuery('#server_php_id_txt').show(); jQuery('#fastcgi_php_fallback_version_txt').hide(); } } else { - jQuery('.fastcgi_php_version:visible').hide(); + jQuery('.server_php_id:visible').hide(); } }); jQuery('#parent_domain_id').change(function() { @@ -445,7 +445,7 @@ var phpfastcgiselected = ''; $.each(data, function(key, val) { - if($('#fastcgi_php_version').val() == key){ + if($('#server_php_id').val() == key){ phpfastcgiselected = ' selected="selected"'; } else { phpfastcgiselected = ''; @@ -456,7 +456,7 @@ options += ''; }); - if($('#fastcgi_php_version').val() == ''){ + if($('#server_php_id').val() == ''){ phpfastcgiselected = ' selected="selected"'; } else { phpfastcgiselected = ''; @@ -465,7 +465,7 @@ phpfastcgiselected = ''; //options += ''; - $('#fastcgi_php_version').html(options).change(); + $('#server_php_id').html(options).change(); if(noFormChange) ISPConfig.resetFormChanged(); }); } diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 0d770476d1..277fde2703 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -258,20 +258,15 @@ class page_action extends tform_actions { } } if (empty($web_config['php_default_hide']) || 'n' === $web_config['php_default_hide']) { - $php_select = ""; + $php_select = ""; } if(is_array($php_records) && !empty($php_records)) { foreach( $php_records as $php_record) { - if($this->dataRecord['php'] == 'php-fpm' || ($this->dataRecord['php'] == 'hhvm' && $server_type == 'nginx')){ - $php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir']; - } else { - $php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir']; - } - $selected = ($php_version == $this->dataRecord["fastcgi_php_version"])?'SELECTED':''; - $php_select .= "\r\n"; + $selected = ($php_record['server_php_id'] == $this->dataRecord["server_php_id"])?'SELECTED':''; + $php_select .= "\r\n"; } } - $app->tpl->setVar("fastcgi_php_version", $php_select); + $app->tpl->setVar("server_php_id", $php_select); unset($php_records); // add limits to template to be able to hide settings @@ -406,20 +401,15 @@ class page_action extends tform_actions { } } if (empty($web_config['php_default_hide']) || 'n' === $web_config['php_default_hide']) { - $php_select = ""; + $php_select = ""; } if(is_array($php_records) && !empty($php_records)) { foreach( $php_records as $php_record) { - if($this->dataRecord['php'] == 'php-fpm' || ($this->dataRecord['php'] == 'hhvm' && $server_type == 'nginx')){ - $php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir']; - } else { - $php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir']; - } - $selected = ($php_version == $this->dataRecord["fastcgi_php_version"])?'SELECTED':''; - $php_select .= "\r\n"; + $selected = ($php_record['server_php_id'] == $this->dataRecord["server_php_id"])?'SELECTED':''; + $php_select .= "\r\n"; } } - $app->tpl->setVar("fastcgi_php_version", $php_select); + $app->tpl->setVar("server_php_id", $php_select); unset($php_records); // add limits to template to be able to hide settings @@ -628,20 +618,15 @@ class page_action extends tform_actions { } } if (empty($web_config['php_default_hide']) || 'n' === $web_config['php_default_hide']) { - $php_select = ""; + $php_select = ""; } if(is_array($php_records) && !empty($php_records)) { foreach( $php_records as $php_record) { - if($this->dataRecord['php'] == 'php-fpm' || ($this->dataRecord['php'] == 'hhvm' && $server_type == 'nginx')){ - $php_version = $php_record['name'].':'.$php_record['php_fpm_init_script'].':'.$php_record['php_fpm_ini_dir'].':'.$php_record['php_fpm_pool_dir']; - } else { - $php_version = $php_record['name'].':'.$php_record['php_fastcgi_binary'].':'.$php_record['php_fastcgi_ini_dir']; - } - $selected = ($php_version == $this->dataRecord["fastcgi_php_version"])?'SELECTED':''; - $php_select .= "\r\n"; + $selected = ($php_record['server_php_id'] == $this->dataRecord["server_php_id"])?'SELECTED':''; + $php_select .= "\r\n"; } } - $app->tpl->setVar("fastcgi_php_version", $php_select); + $app->tpl->setVar("server_php_id", $php_select); unset($php_records); foreach($read_limits as $limit) $app->tpl->setVar($limit, ($limit == 'force_suexec' ? 'n' : 'y')); @@ -1349,28 +1334,24 @@ class page_action extends tform_actions { } // Check custom PHP version - if(isset($this->dataRecord['fastcgi_php_version']) && $this->dataRecord['fastcgi_php_version'] != '') { + if(isset($this->dataRecord['server_php_id']) && $this->dataRecord['server_php_id'] != 0) { // Check php-fpm mode if($this->dataRecord['php'] == 'php-fpm'){ - $tmp = $app->db->queryOneRecord("SELECT * FROM server_php WHERE active = 'y' AND CONCAT(name,':',php_fpm_init_script,':',php_fpm_ini_dir,':',php_fpm_pool_dir) = '".$app->db->quote($this->dataRecord['fastcgi_php_version'])."'"); - if(is_array($tmp)) { - $this->dataRecord['fastcgi_php_version'] = $tmp['name'].':'.$tmp['php_fpm_init_script'].':'.$tmp['php_fpm_ini_dir'].':'.$tmp['php_fpm_pool_dir']; - } else { - $this->dataRecord['fastcgi_php_version'] = ''; + $tmp = $app->db->queryOneRecord("SELECT * FROM server_php WHERE active = 'y' AND server_php_id = ?", $this->dataRecord['server_php_id']); + if(!is_array($tmp) || !$tmp['php_fpm_init_script']) { + $this->dataRecord['server_php_id'] = 0; } unset($tmp); // Check fast-cgi mode } elseif($this->dataRecord['php'] == 'fast-cgi') { - $tmp = $app->db->queryOneRecord("SELECT * FROM server_php WHERE active = 'y' AND CONCAT(name,':',php_fastcgi_binary,':',php_fastcgi_ini_dir) = '".$app->db->quote($this->dataRecord['fastcgi_php_version'])."'"); - if(is_array($tmp)) { - $this->dataRecord['fastcgi_php_version'] = $tmp['name'].':'.$tmp['php_fastcgi_binary'].':'.$tmp['php_fastcgi_ini_dir']; - } else { - $this->dataRecord['fastcgi_php_version'] = ''; + $tmp = $app->db->queryOneRecord("SELECT * FROM server_php WHERE active = 'y' AND server_php_id = ?", $this->dataRecord['server_php_id']); + if(!is_array($tmp) || !$tmp['php_fastcgi_binary']) { + $this->dataRecord['server_php_id'] = 0; } unset($tmp); } else { - // Other PHP modes do not have custom versions, so we force the value to be empty - $this->dataRecord['fastcgi_php_version'] = ''; + // Other PHP modes do not have custom versions, so we force the value to be zero + $this->dataRecord['server_php_id'] = 0; } } @@ -1564,27 +1545,27 @@ class page_action extends tform_actions { // The default PHP version is indicated by an empty string, so if the default PHP version is hidden // then an empty string is not a valid PHP version. - if (empty($this->dataRecord['fastcgi_php_version'])) { - $app->tform->errorMessage .= sprintf('%s
    ', $app->tform->lng('fastcgi_php_version_invalid_txt')); + if (empty($this->dataRecord['server_php_id'])) { + $app->tform->errorMessage .= sprintf('%s
    ', $app->tform->lng('server_php_id_invalid_txt')); return; } // If the default PHP version is now hidden but this vhost was using it, we don't want to implicitly // switch the user to some random Additional PHP version. So we show a warning instead. - $old_fastcgi_php_version = null; + $old_server_php_id = null; if ($this->id > 0) { - $existing = $app->db->queryOneRecord('SELECT fastcgi_php_version FROM web_domain WHERE domain_id = ?', $this->id); - $old_fastcgi_php_version = $existing['fastcgi_php_version']; + $existing = $app->db->queryOneRecord('SELECT server_php_id FROM web_domain WHERE domain_id = ?', $this->id); + $old_server_php_id = $existing['server_php_id']; } - if ('' === $old_fastcgi_php_version) { + if ('' === $old_server_php_id) { // Warning was already shown, user confirmed the new PHP version - if (!empty($_POST['fastcgi_php_version_default_hidden_warning_confirmed'])) { + if (!empty($_POST['server_php_id_default_hidden_warning_confirmed'])) { return; } - $app->tform->errorMessage .= sprintf('%s
    ', $app->tform->lng('fastcgi_php_version_default_hidden_warning_txt')); - $app->tpl->setVar('fastcgi_php_version_default_hidden_warning_confirmed', 1); + $app->tform->errorMessage .= sprintf('%s
    ', $app->tform->lng('server_php_id_default_hidden_warning_txt')); + $app->tpl->setVar('server_php_id_default_hidden_warning_confirmed', 1); } } } diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 61116d0041..bb8c60fb5a 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -109,10 +109,14 @@ class apache2_plugin { $master_php_ini_path = $web_config['php_ini_path_apache']; } else { // check for custom php - if($web_data['fastcgi_php_version'] != '') { - $tmp = explode(':', $web_data['fastcgi_php_version']); - if(isset($tmp[2])) { - $tmppath = $tmp[2]; + if($web_data['server_php_id'] != 0) { + $tmp = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $web_data['server_php_id']); + $ini_key = 'php_fastcgi_ini_dir'; + if($web_data['php'] === 'php-fpm') { + $ini_key = 'php_fpm_ini_dir'; + } + if($tmp && $tmp[$ini_key]) { + $tmppath = $tmp[$ini_key]; if(substr($tmppath, -7) != 'php.ini') { if(substr($tmppath, -1) != '/') $tmppath .= '/'; $tmppath .= 'php.ini'; @@ -169,21 +173,21 @@ class apache2_plugin { $qrystr .= " AND php = 'mod'"; } elseif($data['mode'] == 'fast-cgi') { $qrystr .= " AND php = 'fast-cgi'"; - if($data['php_version']) { - $qrystr .= " AND fastcgi_php_version LIKE ?"; - $param = '%:' . $data['php_version']; + if(isset($data['php_version'])) { + $qrystr .= " AND server_php_id = ?"; + $param = $data['php_version']; } } elseif($data['mode'] == 'php-fpm') { $qrystr .= " AND php = 'php-fpm'"; - if($data['php_version']) { - $qrystr .= " AND fastcgi_php_version LIKE ?"; - $param = '%:' . $data['php_version'] . ':%'; + if(isset($data['php_version'])) { + $qrystr .= " AND server_php_id = ?"; + $param = $data['php_version']; } } elseif($data['mode'] == 'hhvm') { $qrystr .= " AND php = 'hhvm'"; - if($data['php_version']) { - $qrystr .= " AND fastcgi_php_version LIKE ?"; - $param = '%:' . $data['php_version'] . ':%'; + if(isset($data['php_version'])) { + $qrystr .= " AND server_php_id = ?"; + $param = $data['php_version']; } } else { $qrystr .= " AND php != 'mod' AND php != 'fast-cgi'"; @@ -1113,11 +1117,21 @@ class apache2_plugin { } $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); + $custom_fastcgi_php_executable = ''; + + if($data['new']['server_php_id'] != 0){ + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + if($data['new']['php'] === 'php-fpm') { + $custom_fastcgi_php_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_fastcgi_php_executable = $tmp_php['php_fpm_init_script']; + } else { + $custom_fastcgi_php_ini_dir = $tmp_php['php_fastcgi_ini_dir']; + $custom_fastcgi_php_executable = $tmp_php['php_fastcgi_binary']; + } + 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 @@ -1466,7 +1480,7 @@ class apache2_plugin { $fcgi_tpl->setVar('apache_version', $app->system->getapacheversion()); // Support for multiple PHP versions (FastCGI) - if(trim($data['new']['fastcgi_php_version']) != ''){ + if($data['new']['server_php_id'] != 0){ $default_fastcgi_php = false; if(substr($custom_fastcgi_php_ini_dir, -1) != '/') $custom_fastcgi_php_ini_dir .= '/'; } else { @@ -1541,18 +1555,28 @@ class apache2_plugin { */ // Support for multiple PHP versions if($data['new']['php'] == 'php-fpm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ + if($data['new']['server_php_id'] != 0){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && ($data['old']['php'] == 'php-fpm' || $data['old']['php'] == 'hhvm')){ + if($data['old']['server_php_id'] != 0 && ($data['old']['php'] == 'php-fpm' || $data['old']['php'] == 'hhvm')){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } @@ -3054,18 +3078,28 @@ class apache2_plugin { //$reload = false; if($data['new']['php'] == 'php-fpm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ + if($data['new']['server_php_id'] != 0){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] == 'php-fpm'){ + if($data['old']['server_php_id'] != 0 && $data['old']['php'] == 'php-fpm'){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } @@ -3262,10 +3296,15 @@ class apache2_plugin { $php_fpm_reload_mode = ($web_config['php_fpm_reload_mode'] == 'reload')?'reload':'restart'; - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] == 'php-fpm'){ + if($data['old']['server_php_id'] != 0 && $data['old']['php'] == 'php-fpm'){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 51f566a00c..12961ef1d1 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -994,30 +994,29 @@ class nginx_plugin { } if($data['new']['ip_address'] == '*' && $data['new']['ipv6_address'] == '') $tpl->setVar('ipv6_wildcard', 1); - // PHP-FPM - // Support for multiple PHP versions - /* - if(trim($data['new']['fastcgi_php_version']) != ''){ - $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir,-1) != '/') $custom_php_fpm_ini_dir .= '/'; - } else { - $default_php_fpm = true; - } - */ if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ + if($data['new']['server_php_id'] != 0){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] != 'no'){ + if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } @@ -2657,18 +2656,28 @@ class nginx_plugin { // HHVM => PHP-FPM-Fallback if($data['new']['php'] == 'php-fpm' || $data['new']['php'] == 'hhvm'){ - if(trim($data['new']['fastcgi_php_version']) != ''){ + if($data['new']['server_php_id'] != 0){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['new']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['new']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } } else { - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] != 'no'){ + if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } @@ -2869,10 +2878,15 @@ class nginx_plugin { private function php_fpm_pool_delete ($data, $web_config) { global $app, $conf; - if(trim($data['old']['fastcgi_php_version']) != '' && $data['old']['php'] != 'no'){ + if($data['old']['server_php_id'] != 0 && $data['old']['php'] != 'no'){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($data['old']['fastcgi_php_version'])); - if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $data['old']['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } diff --git a/server/plugins-available/shelluser_base_plugin.inc.php b/server/plugins-available/shelluser_base_plugin.inc.php index 9f19c2be58..69d96a961e 100755 --- a/server/plugins-available/shelluser_base_plugin.inc.php +++ b/server/plugins-available/shelluser_base_plugin.inc.php @@ -58,20 +58,20 @@ class shelluser_base_plugin { /* Register for the events */ - + $app->plugins->registerEvent('shell_user_insert', $this->plugin_name, 'insert'); $app->plugins->registerEvent('shell_user_update', $this->plugin_name, 'update'); $app->plugins->registerEvent('shell_user_delete', $this->plugin_name, 'delete'); - + } function insert($event_name, $data) { global $app, $conf; - + $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); @@ -88,7 +88,7 @@ class shelluser_base_plugin { $app->log('Directory of the shell user is not valid.',LOGLEVEL_WARN); return false; } - + if(!$app->system->is_allowed_user($data['new']['username'], false, false) || !$app->system->is_allowed_user($data['new']['puser'], true, true) || !$app->system->is_allowed_group($data['new']['pgroup'], true, true)) { @@ -97,7 +97,7 @@ class shelluser_base_plugin { } if($data['new']['active'] != 'y') $data['new']['shell'] = '/bin/false'; - + if($app->system->is_user($data['new']['puser'])) { // Get the UID of the parent user @@ -105,24 +105,24 @@ class shelluser_base_plugin { if($uid > $this->min_uid) { //* Remove webfolder protection $app->system->web_folder_protection($web['document_root'], false); - + //* Home directory of the new shell user if($data['new']['chroot'] == 'jailkit') { $homedir = $data['new']['dir']; } else { $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; } - + // Create home base directory if it does not exist if(!is_dir($data['new']['dir'].'/home')){ $app->file->mkdirs($data['new']['dir'].'/home', '0755'); } - + // Change ownership of home base dir to root user $app->system->chown($data['new']['dir'].'/home','root'); $app->system->chgrp($data['new']['dir'].'/home','root'); $app->system->chmod($data['new']['dir'].'/home',0755); - + if(!is_dir($homedir)){ $app->file->mkdirs($homedir, '0750'); $app->system->chown($homedir,$data['new']['puser'],false); @@ -142,10 +142,10 @@ class shelluser_base_plugin { $app->log("Command chpasswd failed for user ".$data['new']['username'] . ' with code ' . $retval . ': ' . $stderr, LOGLEVEL_WARN); } } - + $app->system->chown($data['new']['dir'],$data['new']['username'],false); $app->system->chgrp($data['new']['dir'],$data['new']['pgroup'],false); - + // call the ssh-rsa update function $app->uses("getconf"); @@ -186,7 +186,7 @@ class shelluser_base_plugin { global $app, $conf; $app->uses('system,getconf'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); @@ -199,7 +199,7 @@ class shelluser_base_plugin { $app->log('Directory of the shell user is outside of website docroot.',LOGLEVEL_WARN); return false; } - + if(strpos($data['new']['dir'], '/../') !== false || substr($data['new']['dir'],-3) == '/..') { $app->log('Directory of the shell user is not valid.',LOGLEVEL_WARN); return false; @@ -211,14 +211,14 @@ class shelluser_base_plugin { $app->log('Shell user must not be root or in group root.',LOGLEVEL_WARN); return false; } - + if($data['new']['active'] != 'y') $data['new']['shell'] = '/bin/false'; - + if($app->system->is_user($data['new']['puser'])) { // Get the UID of the parent user $uid = intval($app->system->getuid($data['new']['puser'])); if($uid > $this->min_uid) { - + //* Home directory of the shell user if($data['new']['chroot'] == 'jailkit') { $homedir = $data['new']['dir']; @@ -227,10 +227,10 @@ class shelluser_base_plugin { $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; $homedir_old = $data['old']['dir'].'/home/'.$data['old']['username']; } - + $app->log("Homedir New: ".$homedir, LOGLEVEL_DEBUG); $app->log("Homedir Old: ".$homedir_old, LOGLEVEL_DEBUG); - + // Check if the user that we want to update exists, if not, we insert it if($app->system->is_user($data['old']['username'])) { //* Remove webfolder protection @@ -243,7 +243,7 @@ class shelluser_base_plugin { $app->log("New Homedir exists, renaming it to ".$homedir.'_bak', LOGLEVEL_DEBUG); $app->system->rename($homedir,$homedir.'_bak'); } - + // Move old directory to new path $app->system->rename($homedir_old,$homedir); $app->file->mkdirs($homedir, '0750'); @@ -280,7 +280,7 @@ class shelluser_base_plugin { $app->system->chown($homedir.'/.bash_history', $data['new']['username']); $app->system->chgrp($homedir.'/.bash_history', $data['new']['pgroup']); } - + //* Create .profile file if(!is_file($data['new']['dir']).'/.profile') { $app->system->touch($homedir.'/.profile'); @@ -307,7 +307,7 @@ class shelluser_base_plugin { global $app, $conf; $app->uses('system,getconf,services'); - + $security_config = $app->getconf->get_security_config('permissions'); if($security_config['allow_shell_user'] != 'yes') { $app->log('Shell user plugin disabled by security settings.',LOGLEVEL_WARN); @@ -319,21 +319,21 @@ class shelluser_base_plugin { $userid = intval($app->system->getuid($data['old']['username'])); if($userid > $this->min_uid) { $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ".intval($data['old']['parent_domain_id'])); - + // check if we have to delete the dir $check = $app->db->queryOneRecord('SELECT shell_user_id FROM `shell_user` WHERE `dir` = ?', $data['old']['dir']); if(!$check && is_dir($data['old']['dir'])) { - + $web = $app->db->queryOneRecord("SELECT * FROM web_domain WHERE domain_id = ?", $data['old']['parent_domain_id']); $app->system->web_folder_protection($web['document_root'], false); - + // delete dir if($data['new']['chroot'] == 'jailkit') { $homedir = $data['old']['dir']; } else { $homedir = $data['old']['dir'].'/home/'.$data['old']['username']; } - + if(substr($homedir, -1) !== '/') $homedir .= '/'; $files = array('.bash_logout', '.bash_history', '.bashrc', '.profile'); $dirs = array('.ssh', '.cache'); @@ -359,17 +359,22 @@ class shelluser_base_plugin { } unset($files); unset($dirs); - + $app->system->web_folder_protection($web['document_root'], true); } - + // We delete only non jailkit users, jailkit users will be deleted by the jailkit plugin. if ($data['old']['chroot'] != "jailkit") { // if this web uses PHP-FPM, that PPH-FPM service must be stopped before we can delete this user if($web['php'] == 'php-fpm'){ - if(trim($web['fastcgi_php_version']) != ''){ + if($web['server_php_id'] != 0){ $default_php_fpm = false; - list($custom_php_fpm_name, $custom_php_fpm_init_script, $custom_php_fpm_ini_dir, $custom_php_fpm_pool_dir) = explode(':', trim($web['fastcgi_php_version'])); + $tmp_php = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $web['server_php_id']); + if($tmp_php) { + $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; + $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; + if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; + } } else { $default_php_fpm = true; } diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php index cca339ace0..3dae9216fa 100644 --- a/server/plugins-available/webserver_plugin.inc.php +++ b/server/plugins-available/webserver_plugin.inc.php @@ -89,20 +89,20 @@ class webserver_plugin { //** add default php.ini files to check $check_files[] = array('file' => $web_config['php_ini_path_apache'], 'mode' => 'mod', - 'php_version' => ''); // default; + 'php_version' => 0); // default; $check_files[] = array('file' => $web_config['php_ini_path_cgi'], 'mode' => '', // all but 'mod' and 'fast-cgi' - 'php_version' => ''); // default; + 'php_version' => 0); // default; if($fastcgi_config["fastcgi_phpini_path"] && $fastcgi_config["fastcgi_phpini_path"] != $web_config['php_ini_path_cgi']) { $check_files[] = array('file' => $fastcgi_config["fastcgi_phpini_path"], 'mode' => 'fast-cgi', - 'php_version' => ''); // default; + 'php_version' => 0); // default; } else { $check_files[] = array('file' => $web_config['php_ini_path_cgi'], 'mode' => 'fast-cgi', // all but 'mod' - 'php_version' => ''); // default; + 'php_version' => 0); // default; } @@ -112,11 +112,11 @@ class webserver_plugin { if($php['php_fastcgi_ini_dir'] && $php['php_fastcgi_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { $check_files[] = array('file' => $php['php_fastcgi_ini_dir'] . '/php.ini', 'mode' => 'fast-cgi', - 'php_version' => $php['php_fastcgi_ini_dir']); + 'php_version' => $php['server_php_id']); } elseif($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { $check_files[] = array('file' => $php['php_fpm_ini_dir'] . '/php.ini', 'mode' => 'php-fpm', - 'php_version' => $php['php_fpm_ini_dir']); + 'php_version' => $php['server_php_id']); } } unset($php_versions); diff --git a/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php b/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php index 5a643a660a..b2dd92265e 100644 --- a/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php +++ b/server/plugins-available/z_php_fpm_incron_reload_plugin.inc.php @@ -66,7 +66,7 @@ class z_php_fpm_incron_reload_plugin { private function phpVersionUnchanged($data) { - return $data['new']['fastcgi_php_version'] === $data['old']['fastcgi_php_version']; + return $data['new']['server_php_id'] === $data['old']['server_php_id']; } private function setup($data) @@ -77,7 +77,7 @@ class z_php_fpm_incron_reload_plugin { $this->createIncronConfiguration( $triggerFile, $data['system_user'], - $data['fastcgi_php_version'] + $data['server_php_id'] ); $this->restartIncronService(); @@ -173,12 +173,14 @@ class z_php_fpm_incron_reload_plugin { } private function getPhpService($fastcgiPhpVersion) { - $phpInfo = explode(':', $fastcgiPhpVersion); + global $app; + + $phpInfo = $app->db->queryOneRecord('SELECT * FROM server_php WHERE server_php_id = ?', $fastcgiPhpVersion); if (empty($phpInfo)) { return null; } - $phpService = $phpInfo[1]; + $phpService = $phpInfo['php_fpm_init_script']; if (empty($phpService)) { return null; } -- GitLab From 760efc16bd272ea24ab99002dd9be03fc9a0d4d1 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 11:52:54 +0200 Subject: [PATCH 0336/1368] - fixed deleting cronjobs on deleted website --- server/plugins-available/cron_plugin.inc.php | 40 ++++++++++---------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php index ad122807ba..1d44a849aa 100644 --- a/server/plugins-available/cron_plugin.inc.php +++ b/server/plugins-available/cron_plugin.inc.php @@ -103,7 +103,7 @@ class cron_plugin { $app->log("Websites (and Crons) cannot be owned by the root user or group.", LOGLEVEL_WARN); return false; } - + // Get the client ID $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ?", $data["new"]["sys_groupid"]); $client_id = intval($client["client_id"]); @@ -123,7 +123,7 @@ class cron_plugin { $app->system->exec_safe("useradd -d ? -g ? ? -s /bin/false", $parent_domain["document_root"], $groupname, $username); $app->log("Adding the user: $username", LOGLEVEL_DEBUG); } - + // Set the quota for the user if($username != '' && $app->system->is_user($username)) { if($parent_domain['hd_quota'] > 0) { @@ -144,7 +144,7 @@ class cron_plugin { $app->system->exec_safe('setquota -u ? ? ? 0 0 -a &> /dev/null', $username, $blocks_soft, $blocks_hard); $app->system->exec_safe('setquota -T -u ? 604800 604800 -a &> /dev/null', $username); } elseif ($file_system == 'xfs') { - + $app->system->exec_safe("xfs_quota -x -c ? ?", "limit -u bsoft=$mb_soft" . 'm'. " bhard=$mb_hard" . 'm'. " $username", $primitive_root); // xfs only supports timers globally, not per user. @@ -177,21 +177,23 @@ class cron_plugin { } function delete($event_name, $data) { - global $app, $conf; + global $app; //* get data from web $parent_domain = $app->db->queryOneRecord("SELECT `domain_id`, `system_user`, `system_group`, `document_root`, `hd_quota` FROM `web_domain` WHERE `domain_id` = ?", $data["old"]["parent_domain_id"]); - if(!$parent_domain["domain_id"]) { - $app->log("Parent domain not found", LOGLEVEL_WARN); - return 0; - } - - // Get the client ID - $client = $app->dbmaster->queryOneRecord("SELECT client_id FROM sys_group WHERE sys_group.groupid = ?", $data["old"]["sys_groupid"]); - $client_id = intval($client["client_id"]); - unset($client); - $this->parent_domain = $parent_domain; + if(!$parent_domain) { + $tmp = $app->db->queryOneRecord('SELECT * FROM sys_datalog WHERE dbtable = ? AND dbidx = ? AND `action` = ? ORDER BY `datalog_id` DESC', 'web_domain', 'domain_id:' . $data['old']['parent_domain_id'], 'd'); + $tmp = unserialize($tmp); + if($tmp && isset($tmp['old'])) { + $this->parent_domain = $tmp['old']; + } else { + $app->log("Parent domain not found", LOGLEVEL_WARN); + return 0; + } + } else { + $this->parent_domain = $parent_domain; + } $this->_write_crontab(); } @@ -223,18 +225,18 @@ class cron_plugin { } else { $cron_line = str_replace(" ", "", $job['run_min']) . "\t" . str_replace(" ", "", $job['run_hour']) . "\t" . str_replace(" ", "", $job['run_mday']) . "\t" . str_replace(" ", "", $job['run_month']) . "\t" . str_replace(" ", "", $job['run_wday']); } - + $log_target = ""; $log_wget_target = '/dev/null'; $log_root = ''; if($job['log'] == 'y') { if($job['type'] != 'chrooted') $log_root = $this->parent_domain['document_root']; $log_root .= '/private'; - + $log_target = '>>' . $log_root . '/cron.log 2>>' . $log_root . '/cron_error.log'; $log_wget_target = $log_root . '/cron_wget.log'; } - + $cron_line .= "\t{$this->parent_domain['system_user']}"; //* running as user if($job['type'] == 'url') { $cron_line .= "\t{$cron_config['wget']} --no-check-certificate --user-agent='Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0' -q -t 1 -T 7200 -O " . $log_wget_target . " " . escapeshellarg($job['command']) . " " . $log_target; @@ -243,7 +245,7 @@ class cron_plugin { $app->log("Insecure Cron job SKIPPED: " . $job['command'], LOGLEVEL_WARN); continue; } - + $web_root = ''; if($job['type'] == 'chrooted') { if(substr($job['command'], 0, strlen($this->parent_domain['document_root'])) == $this->parent_domain['document_root']) { @@ -253,7 +255,7 @@ class cron_plugin { } else { $web_root = $this->parent_domain['document_root']; } - + $web_root .= '/web'; $job['command'] = str_replace('[web_root]', $web_root, $job['command']); -- GitLab From 6891708d85596e2f568c81327d67f261d923053e Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 12:16:04 +0200 Subject: [PATCH 0337/1368] - nginx/apache directives are missing default value --- install/sql/incremental/upd_dev_collection.sql | 3 +++ install/sql/ispconfig3.sql | 4 ++-- server/plugins-available/apache2_plugin.inc.php | 5 +++++ server/plugins-available/nginx_plugin.inc.php | 3 +++ server/plugins-available/nginx_reverseproxy_plugin.inc.php | 4 +++- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 1c4bd539d9..1aaf51cd2a 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -44,3 +44,6 @@ ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; -- was missing in incremental, inserted for fixing older installations ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; + +ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumtext NULL DEFAULT NULL; +ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index cdf85d7443..3f6f04ace7 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2046,8 +2046,8 @@ CREATE TABLE `web_domain` ( `stats_password` varchar(255) default NULL, `stats_type` varchar(255) default 'awstats', `allow_override` varchar(255) NOT NULL default 'All', - `apache_directives` mediumtext, - `nginx_directives` mediumtext, + `apache_directives` mediumtext NULL DEFAULT NULL, + `nginx_directives` mediumtext NULL DEFAULT NULL, `php_fpm_use_socket` ENUM('n','y') NOT NULL DEFAULT 'y', `php_fpm_chroot` enum('n','y') NOT NULL DEFAULT 'n', `pm` enum('static','dynamic','ondemand') NOT NULL DEFAULT 'ondemand', diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index cf58ed8a20..aab3986376 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1186,6 +1186,11 @@ class apache2_plugin { $vhost_data['apache_directives'] = $snippet['snippet']; } } + + if(!$vhost_data['apache_directives']) { + $vhost_data['apache_directives'] = ''; // ensure it is not null + } + // Make sure we only have Unix linebreaks $vhost_data['apache_directives'] = str_replace("\r\n", "\n", $vhost_data['apache_directives']); $vhost_data['apache_directives'] = str_replace("\r", "\n", $vhost_data['apache_directives']); diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index f7f93b4be5..dd9316c926 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1200,6 +1200,9 @@ class nginx_plugin { $nginx_directives = $data['new']['nginx_directives']; // $vhost_data['enable_pagespeed'] = false; } + if(!$nginx_directives) { + $nginx_directives = ''; // ensure it is not null + } // folder_directive_snippets if(trim($data['new']['folder_directive_snippets']) != ''){ diff --git a/server/plugins-available/nginx_reverseproxy_plugin.inc.php b/server/plugins-available/nginx_reverseproxy_plugin.inc.php index 1013042254..f35f40d34a 100644 --- a/server/plugins-available/nginx_reverseproxy_plugin.inc.php +++ b/server/plugins-available/nginx_reverseproxy_plugin.inc.php @@ -111,7 +111,9 @@ class nginx_reverseproxy_plugin { $crt_file = $ssl_dir.'/'.$domain.'.crt'; $bundle_file = $ssl_dir.'/'.$domain.'.bundle'; - $vhost_data['nginx_directives'] = preg_replace("/\[IP\]/", $vhost_data['ip_address'], $vhost_data['nginx_directives']); + if($vhost_data['nginx_directives']) { + $vhost_data['nginx_directives'] = preg_replace("/\[IP\]/", $vhost_data['ip_address'], $vhost_data['nginx_directives']); + } if($data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file)) { -- GitLab From cb4ddc318c00e4576b07f8245e40b9b2879c1d4b Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 24 Jul 2020 12:47:43 +0200 Subject: [PATCH 0338/1368] - added blacklisted paths --- interface/lib/classes/system.inc.php | 2 +- server/lib/classes/system.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index 8c3decfd5c..d6b0ef149e 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -68,7 +68,7 @@ class system { } public function is_blacklisted_web_path($path) { - $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var'); + $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var', 'proc', 'net', 'sys', 'srv', 'sbin', 'run'); $path = ltrim($path, '/'); $parts = explode('/', $path); diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 71b901d920..e0699a7f82 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1788,7 +1788,7 @@ class system{ } public function is_blacklisted_web_path($path) { - $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var'); + $blacklist = array('bin', 'cgi-bin', 'dev', 'etc', 'home', 'lib', 'lib64', 'log', 'ssl', 'usr', 'var', 'proc', 'net', 'sys', 'srv', 'sbin', 'run'); $path = ltrim($path, '/'); $parts = explode('/', $path); -- GitLab From cefa5f09e45d64b8206aa93391ecb1d6b971e482 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 24 Jul 2020 11:12:09 -0600 Subject: [PATCH 0339/1368] simplify query, escape regex special chars --- install/tpl/mysql-virtual_outgoing_bcc.cf.master | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index bea39f8451..eafd098a3f 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -3,14 +3,14 @@ password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} query = SELECT sender_cc FROM ( - SELECT @num_sender_cc := 1 + LENGTH(sender_cc) - LENGTH(REPLACE(sender_cc, ',', '')) AS num_sender_cc, - SUBSTRING_INDEX(sender_cc, ',', 1) AS sender_cc + SELECT SUBSTRING_INDEX(sender_cc, ',', 1) AS sender_cc FROM mail_user WHERE email = '%s' AND disablesmtp = 'n' AND sender_cc != '' AND server_id = {server_id} UNION - SELECT @num_sender_cc := 1 + LENGTH(u.sender_cc) - LENGTH(REPLACE(u.sender_cc, ',', '')) AS num_sender_cc, - SUBSTRING_INDEX(u.sender_cc, ',', 1) AS sender_cc + SELECT SUBSTRING_INDEX(u.sender_cc, ',', 1) AS sender_cc FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', u.email, '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', + REPLACE( REPLACE(u.email, '+', '\\+'), '.', '\\.' ), + '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} AND f.source = '%s' AND f.allow_send_as = 'y' AND f.active = 'y' AND f.server_id = {server_id} ) table1 WHERE sender_cc != '' LIMIT 1 -- GitLab From acdbd68bfffc965a64b8a82d23e40ff1fde56d49 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 21 Jul 2020 16:54:02 -0600 Subject: [PATCH 0340/1368] select Move to Junk before/after custom filters --- .../sql/incremental/upd_dev_collection.sql | 5 +- install/sql/ispconfig3.sql | 2 +- install/tpl/debian6_dovecot.conf.master | 3 +- install/tpl/debian6_dovecot2.conf.master | 3 +- install/tpl/debian_dovecot.conf.master | 3 +- install/tpl/debian_dovecot2.conf.master | 3 +- install/tpl/fedora_dovecot.conf.master | 3 +- install/tpl/fedora_dovecot2.conf.master | 3 +- install/tpl/opensuse_dovecot.conf.master | 3 +- install/tpl/opensuse_dovecot2.conf.master | 3 +- interface/web/admin/server_config_edit.php | 5 +- interface/web/mail/form/mail_user.tform.php | 6 +-- interface/web/mail/lib/lang/ar_mail_user.lng | 3 ++ interface/web/mail/lib/lang/bg_mail_user.lng | 3 ++ interface/web/mail/lib/lang/br_mail_user.lng | 3 ++ interface/web/mail/lib/lang/ca_mail_user.lng | 3 ++ interface/web/mail/lib/lang/cz_mail_user.lng | 3 ++ interface/web/mail/lib/lang/de_mail_user.lng | 3 ++ interface/web/mail/lib/lang/dk_mail_user.lng | 3 ++ interface/web/mail/lib/lang/el_mail_user.lng | 3 ++ interface/web/mail/lib/lang/en_mail_user.lng | 5 +- interface/web/mail/lib/lang/es_mail_user.lng | 3 ++ interface/web/mail/lib/lang/fi_mail_user.lng | 3 ++ interface/web/mail/lib/lang/fr_mail_user.lng | 3 ++ interface/web/mail/lib/lang/hr_mail_user.lng | 3 ++ interface/web/mail/lib/lang/hu_mail_user.lng | 3 ++ interface/web/mail/lib/lang/id_mail_user.lng | 3 ++ interface/web/mail/lib/lang/it_mail_user.lng | 3 ++ interface/web/mail/lib/lang/ja_mail_user.lng | 3 ++ interface/web/mail/lib/lang/nl_mail_user.lng | 3 ++ interface/web/mail/lib/lang/pl_mail_user.lng | 3 ++ interface/web/mail/lib/lang/pt_mail_user.lng | 3 ++ interface/web/mail/lib/lang/ro_mail_user.lng | 3 ++ interface/web/mail/lib/lang/ru_mail_user.lng | 3 ++ interface/web/mail/lib/lang/se_mail_user.lng | 3 ++ interface/web/mail/lib/lang/sk_mail_user.lng | 3 ++ interface/web/mail/lib/lang/tr_mail_user.lng | 3 ++ .../templates/mail_user_mailfilter_edit.htm | 5 +- remoting_client/API-docs/mail_user_add.html | 2 +- .../API-docs/mail_user_update.html | 2 +- server/conf/sieve_filter.master | 9 ++++ server/conf/sieve_filter_1.2.master | 9 ++++ .../maildeliver_plugin.inc.php | 51 ++++++++++++------- .../plugins-available/maildrop_plugin.inc.php | 2 +- 44 files changed, 162 insertions(+), 37 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 1aaf51cd2a..abe2a8a1a1 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -46,4 +46,7 @@ ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumtext NULL DEFAULT NULL; -ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; \ No newline at end of file +ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; + +-- add move to junk before/after option, default to after +ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'a'; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 3f6f04ace7..bacf075baa 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1046,7 +1046,7 @@ CREATE TABLE `mail_user` ( `autoresponder_end_date` datetime NULL default NULL, `autoresponder_subject` varchar(255) NOT NULL default 'Out of office reply', `autoresponder_text` mediumtext NULL, - `move_junk` enum('n','y') NOT NULL default 'n', + `move_junk` enum('y','a','n') NOT NULL default 'a', `purge_trash_days` INT NOT NULL DEFAULT '0', `purge_junk_days` INT NOT NULL DEFAULT '0', `custom_mailfilter` mediumtext, diff --git a/install/tpl/debian6_dovecot.conf.master b/install/tpl/debian6_dovecot.conf.master index a112712690..cf9e85f3b3 100644 --- a/install/tpl/debian6_dovecot.conf.master +++ b/install/tpl/debian6_dovecot.conf.master @@ -60,7 +60,8 @@ plugin { # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index a1810ab509..ead02a68c7 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -29,7 +29,8 @@ plugin { # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/debian_dovecot.conf.master b/install/tpl/debian_dovecot.conf.master index f91959a1f5..2bba3fa985 100644 --- a/install/tpl/debian_dovecot.conf.master +++ b/install/tpl/debian_dovecot.conf.master @@ -1145,7 +1145,8 @@ plugin { # and they're not deleted automatically (use a cronjob or something). #lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/ - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index 88d6a1b924..c71f683e96 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -28,7 +28,8 @@ plugin { # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/fedora_dovecot.conf.master b/install/tpl/fedora_dovecot.conf.master index e687954986..405a723a55 100644 --- a/install/tpl/fedora_dovecot.conf.master +++ b/install/tpl/fedora_dovecot.conf.master @@ -1306,7 +1306,8 @@ plugin { # ManageSieve this is where the uploaded scripts are stored. sieve_dir=~/sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 9ec150ce49..312654732c 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -26,7 +26,8 @@ plugin { # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/opensuse_dovecot.conf.master b/install/tpl/opensuse_dovecot.conf.master index 1eacf4c3a3..a6ed0ab71f 100644 --- a/install/tpl/opensuse_dovecot.conf.master +++ b/install/tpl/opensuse_dovecot.conf.master @@ -1280,7 +1280,8 @@ plugin { # ManageSieve this is where the uploaded scripts are stored. sieve_dir=~/sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index 070590181b..da716c6dfc 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -25,7 +25,8 @@ plugin { # no longer needed, as 'sieve' is in userdb extra fields: sieve=/var/vmail/%d/%n/.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig.sieve + sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/interface/web/admin/server_config_edit.php b/interface/web/admin/server_config_edit.php index cca5d702d3..5214d14037 100644 --- a/interface/web/admin/server_config_edit.php +++ b/interface/web/admin/server_config_edit.php @@ -192,10 +192,11 @@ class page_action extends tform_actions { $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); $mail_user['autoresponder'] = 'y'; $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); - } elseif($mail_user['move_junk'] == 'y') { + } elseif($mail_user['move_junk'] != 'n') { + $save = $mail_user['move_junk']; $mail_user['move_junk'] = 'n'; $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); - $mail_user['move_junk'] = 'y'; + $mail_user['move_junk'] = $save; $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); } else { $app->db->datalogUpdate('mail_user', $mail_user, 'mailuser_id', $mail_user["mailuser_id"], true); diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 8fb6c4a692..0bef9d979f 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -402,9 +402,9 @@ if ($global_config['mail']['mailbox_show_mail_filter_tab'] === 'y') { //################################# 'move_junk' => array ( 'datatype' => 'VARCHAR', - 'formtype' => 'CHECKBOX', - 'default' => 'n', - 'value' => array(0 => 'n', 1 => 'y') + 'formtype' => 'SELECT', + 'default' => 'a', + 'value' => array('y' => 'move_junk_y_txt', 'a' => 'move_junk_a_txt', 'n' => 'move_junk_n_txt'), ), 'purge_trash_days' => array ( 'datatype' => 'VARCHAR', diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index 9d4828b557..702725959d 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -31,6 +31,9 @@ $wb['disablepop3_txt'] = 'Disable POP3'; $wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.'; $wb['quota_error_value'] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Realname'; $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 1b9595da42..49be467e91 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -31,6 +31,9 @@ $wb['autoresponder_start_date_ispast'] = 'Датата на старта нем $wb['autoresponder_end_date_txt'] = 'Край на'; $wb['autoresponder_end_date_isgreater'] = 'датата на края неможе да бъде преди датата за старт.'; $wb['move_junk_txt'] = 'Премести СПАМ пощата в Директорията Боклуци'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Реално име '; $wb['name_optional_txt'] = '(По желание)'; $wb['autoresponder_active'] = 'Разреши автоматичен отговор'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 2abe1931f6..8f02122ade 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -36,6 +36,9 @@ $wb['disablepop3_txt'] = 'Desabilitar POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Já existe um alias ou encaminhamento para este endereço de e-mail.'; $wb['quota_error_value'] = 'Valor da cota é inválido. Valores permitidos são: 0 para ilimitado ou números > 1.'; $wb['move_junk_txt'] = 'Mover e-mails marcados como spam para o diretório junk.'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Nome'; $wb['name_optional_txt'] = '(Opcional)'; $wb['autoresponder_active'] = 'Habilitar auto-resposta'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 08c9bc78ec..259c357671 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -30,6 +30,9 @@ $wb['autoresponder_end_date_txt'] = 'Terminer le'; $wb['autoresponder_end_date_isgreater'] = 'La date de fin doit être saisie et doit être ultérieure à la date de début.'; $wb['quota_error_value'] = 'Valeur de quota invalide. Les valeurs de quota autorisées sont : 0 pour illimité ou nombres > 1'; $wb['move_junk_txt'] = 'Déplacer le spam vers le dossier Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Nom véritable'; $wb['name_optional_txt'] = '(Optionnel)'; $wb['autoresponder_active'] = 'Activer le répondeur automatique'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index fb09f0c0a0..72ebc26a4b 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -30,6 +30,9 @@ $wb['disablepop3_txt'] = 'Zakázat POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Alias nebo přesměrování s touto adresou již existuje.'; $wb['quota_error_value'] = 'Chybná hodnota kvóty. Povolené hodnoty jsou: 0 pro neomezeno nebo čísla > 1'; $wb['move_junk_txt'] = 'Přesunout e-maily detekované jako spam do adresáře Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Skutečné jméno'; $wb['name_optional_txt'] = '(volitelné)'; $wb['autoresponder_active'] = 'Povolit automatický odpovídač'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index e653fbe288..79834d9a5c 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -34,6 +34,9 @@ $wb['autoresponder_start_date_ispast'] = 'Startdatum kann nicht in der Vergangen $wb['autoresponder_end_date_txt'] = 'Endet am'; $wb['autoresponder_end_date_isgreater'] = 'Enddatum muss angegeben werden und muss später als das Startdatum sein.'; $wb['move_junk_txt'] = 'Spam E-Mails in das Junk Verzeichnis verschieben'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Name'; $wb['name_optional_txt'] = '(optional)'; $wb['autoresponder_active'] = 'Autoresponder aktivieren'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index 34bf076359..cf29a97137 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -33,6 +33,9 @@ $wb['disablepop3_txt'] = 'Deaktiver POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Der er allerede et alias eller forward for denne e-mail adresse.'; $wb['quota_error_value'] = 'Ugyldig kvote værdi. Tilladte værdier er: 0 for ubegrænset eller tal > 1'; $wb['move_junk_txt'] = 'Flyt Spam E-mails til Junk mappe.'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Navn'; $wb['name_optional_txt'] = '(Valgfri)'; $wb['autoresponder_active'] = 'Aktiver autosvarer'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index 76c266d591..0f424c0099 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -31,6 +31,9 @@ $wb['disablepop3_txt'] = 'Απενεργοποίηση POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Υπάρχει ήδη ένα ψευδωνύμο ή μία προώθηση με αυτή τη διεύθυνση email.'; $wb['quota_error_value'] = 'Μη έγκυρη τιμή ορίου χώρου. Επιτρεπόμενες τιμές είναι: 0 για απεριόριστο ή αριθμοί > 1'; $wb['move_junk_txt'] = 'Μετακίνηση των Spam Emails στο φάκελο Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Πραγματικό Όνομα'; $wb['name_optional_txt'] = '(Προαιρετικό)'; $wb['autoresponder_active'] = 'Ενεργοποίηση αυτόματης απάντησης'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 69ac0a00a9..7b98e593c8 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -35,7 +35,10 @@ $wb["disableimap_txt"] = 'Disable IMAP'; $wb["disablepop3_txt"] = 'Disable POP3'; $wb["duplicate_alias_or_forward_txt"] = 'There is already an alias or forward with this email address.'; $wb["quota_error_value"] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; -$wb["move_junk_txt"] = 'Move Spam Emails to Junk directory.'; +$wb["move_junk_txt"] = 'Move Spam Emails to Junk folder.'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb["name_txt"] = 'Name'; $wb["name_optional_txt"] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index be329c304a..676dd45c22 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -40,6 +40,9 @@ $wb['login_txt'] = 'Iniciar Sesión'; $wb['maildir_txt'] = 'Dirección de correo'; $wb['monthly_backup_txt'] = 'Mensualmente'; $wb['move_junk_txt'] = 'Mover correo basura (spam) a la carpeta Basura (Junk).'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_optional_txt'] = '(Opcional)'; $wb['name_txt'] = 'Nombre'; $wb['no_backup_txt'] = 'Sin copia de seguridad'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 45ea1d9b8b..97bddeddc7 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -31,6 +31,9 @@ $wb['autoresponder_start_date_ispast'] = 'Aloituspäivä ei voi olla menneisyyde $wb['autoresponder_end_date_txt'] = 'Lopetuspäivä'; $wb['autoresponder_end_date_isgreater'] = 'Lopetuspäivän pitää olla myöhempi kuin aloituspäivä.'; $wb['move_junk_txt'] = 'Siirrä roskapostit Junk-kansioon'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Oikea nimi'; $wb['name_optional_txt'] = '(Valinnainen)'; $wb['autoresponder_active'] = 'Ota lomavastaaja käyttöön'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index 8df58233a3..4871865ae8 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -30,6 +30,9 @@ $wb['autoresponder_end_date_txt'] = 'Terminer le'; $wb['autoresponder_end_date_isgreater'] = 'La date de fin doit être saisie et doit être ultérieure à la date de début.'; $wb['quota_error_value'] = 'Valeur de quota invalide. Les valeurs de quota autorisées sont : 0 pour illimité ou nombres > 1'; $wb['move_junk_txt'] = 'Déplacer le spam vers le dossier Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Nom véritable'; $wb['name_optional_txt'] = '(Optionnel)'; $wb['autoresponder_active'] = 'Activer le répondeur automatique'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 170aaa6b61..34c41a827e 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -31,6 +31,9 @@ $wb['disablepop3_txt'] = 'Disable POP3'; $wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forward with this email address.'; $wb['quota_error_value'] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Realname'; $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 65962cd21c..58a4416cb2 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; $wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Név'; $wb['name_optional_txt'] = '(Opcionális)'; $wb['autoresponder_active'] = 'Automatikus válasz engedélyezése'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index 3bedbd9b93..87be369635 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -32,6 +32,9 @@ $wb['disablepop3_txt'] = 'Nonaktifkan POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Sudah ada alias atau forward untuk alamat email ini.'; $wb['quota_error_value'] = 'Nilai kuota tidak valid. Nilai yang diperbolehkan adalah: 0 untuk tak terbatas atau angka > 1'; $wb['move_junk_txt'] = 'Pindahkan Email Spam ke direktori Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Nama Lengkap'; $wb['name_optional_txt'] = '(Opsional)'; $wb['autoresponder_active'] = 'Aktifkan Penjawab Otomatis'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index a1a0f8cfd5..6dffeddb91 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -31,6 +31,9 @@ $wb['autoresponder_start_date_ispast'] = 'La data di avvio no può essere anterg $wb['autoresponder_end_date_txt'] = 'Termina il'; $wb['autoresponder_end_date_isgreater'] = 'La data termine deve essere impostata e successiva al giorno di inizio.'; $wb['move_junk_txt'] = 'Sposta Email di Spam nella cartella di spam Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Nome vero'; $wb['name_optional_txt'] = '(Opzionale)'; $wb['autoresponder_active'] = 'Abilita autorisponditore'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index b58b9d13dd..1b36502b74 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; $wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Realname'; $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 9a644a129b..37e8c8638b 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -31,6 +31,9 @@ $wb['disablepop3_txt'] = 'Uitschakelen POP3'; $wb['duplicate_alias_or_forward_txt'] = 'Er is al een alias of forward met dir e-mailadres.'; $wb['quota_error_value'] = 'Ongeldige quota waarde. Toegestane waarden zijn: 0 = ongelimiteerd of nummerieke waarde > 1'; $wb['move_junk_txt'] = 'Verplaats SPAM e-mails naar junk folder'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Echte naam'; $wb['name_optional_txt'] = '(Optioneel)'; $wb['autoresponder_active'] = 'Inschakelen autobeantwoorden'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 593f83531e..889700cddd 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'Data uruchomienia nie może być w prz $wb['autoresponder_end_date_txt'] = 'Zakończ do'; $wb['autoresponder_end_date_isgreater'] = 'Data zakończenia musi być późniejsza od daty rozpoczęcia'; $wb['move_junk_txt'] = 'Przenoś SPAM do folderu Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Nazwa rzeczywista'; $wb['name_optional_txt'] = '(Opcjonalnie)'; $wb['autoresponder_active'] = 'Uruchom autorespondera'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index 0b7ffe3d37..6c715d52e2 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'A data de ínicio não pode estar no p $wb['autoresponder_end_date_txt'] = 'Termino:'; $wb['autoresponder_end_date_isgreater'] = 'A data de início deve ser menor que a data de termino.'; $wb['move_junk_txt'] = 'Mover Spam para a pasta JUNK'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Realname'; $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index 97dfdafd88..ee1b6b980c 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later tha $wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.'; $wb['quota_error_value'] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Realname'; $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index 07bab6fd4f..6935ecd8e2 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'Дата запуска не може $wb['autoresponder_end_date_txt'] = 'Останавливать'; $wb['autoresponder_end_date_isgreater'] = 'Дата окончания должна быть позже даты запуска.'; $wb['move_junk_txt'] = 'Перемещать спам в каталог Junk'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Реальное имя'; $wb['name_optional_txt'] = '(Опционально)'; $wb['autoresponder_active'] = 'Включить автоответчик'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index da0282e118..22c5b0fe45 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'Startdatum kan inte vara i det förflu $wb['autoresponder_end_date_txt'] = 'Sluta den'; $wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; $wb['move_junk_txt'] = 'FLytta spamepost till spammappen'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Riktigt namn'; $wb['name_optional_txt'] = '(Frivilligt)'; $wb['autoresponder_active'] = 'Aktivera autosvaret'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index d9a68404ae..258e8f6128 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -32,6 +32,9 @@ $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; $wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Realname'; $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 9e964e5e8a..a1ed0128f3 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -36,6 +36,9 @@ $wb['disablepop3_txt'] = 'POP3 Kullanılmasın'; $wb['duplicate_alias_or_forward_txt'] = 'Bu e-posta adresi zaten takma ya da yönlendirilmiş.'; $wb['quota_error_value'] = 'Kota değeri geçersiz. Değer sınırsız için 0 ya da 1 değerinden büyük olmalı'; $wb['move_junk_txt'] = 'Önemsiz İletiler Junk Klasörüne Taşınsın'; +$wb["move_junk_y_txt"] = 'Move first, before custom filters.'; +$wb["move_junk_a_txt"] = 'Move last, after custom filters.'; +$wb["move_junk_n_txt"] = 'Do not move Spam Emails to Junk folder.'; $wb['name_txt'] = 'Ad'; $wb['name_optional_txt'] = '(İsteğe bağlı)'; $wb['autoresponder_active'] = 'Otoyanıtlayıcı kullanılsın'; diff --git a/interface/web/mail/templates/mail_user_mailfilter_edit.htm b/interface/web/mail/templates/mail_user_mailfilter_edit.htm index 4c7058292e..8d14eb4ee6 100644 --- a/interface/web/mail/templates/mail_user_mailfilter_edit.htm +++ b/interface/web/mail/templates/mail_user_mailfilter_edit.htm @@ -1,6 +1,9 @@
    -
    {tmpl_var name='move_junk'}
    +
    +
    diff --git a/remoting_client/API-docs/mail_user_add.html b/remoting_client/API-docs/mail_user_add.html index a893e24e3f..dab2835057 100644 --- a/remoting_client/API-docs/mail_user_add.html +++ b/remoting_client/API-docs/mail_user_add.html @@ -38,7 +38,7 @@

    autoresponder_end_date  (datetime)

    autoresponder_text  (mediumtext)

    autoresponder_subject  (varchar(255))

    -

    move_junk  (enum('n','y'))

    +

    move_junk  (enum('y','a','n'))

    custom_mailfilter  (mediumtext)

    postfix  (enum('n','y'))

    access  (enum('n','y'))

    diff --git a/remoting_client/API-docs/mail_user_update.html b/remoting_client/API-docs/mail_user_update.html index 8cb900fb40..d30b932393 100644 --- a/remoting_client/API-docs/mail_user_update.html +++ b/remoting_client/API-docs/mail_user_update.html @@ -36,7 +36,7 @@

    autoresponder_start_date  (datetime)

    autoresponder_end_date  (datetime)

    autoresponder_text  (mediumtext)

    -

    move_junk  (enum('n','y'))

    +

    move_junk  (enum('y','a','n'))

    custom_mailfilter  (mediumtext)

    postfix  (enum('n','y'))

    access  (enum('n','y'))

    diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index f72cd11d1f..6b83c26394 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -23,6 +23,15 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", keep; + +# Move spam to spam folder +if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { + fileinto "Junk"; + # Stop here so that we do not reply on spams + stop; +} + + ################################################################# # Autoreply diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master index edd4060b9f..3a8695b1a6 100644 --- a/server/conf/sieve_filter_1.2.master +++ b/server/conf/sieve_filter_1.2.master @@ -23,6 +23,15 @@ redirect ""; keep; + +# Move spam to spam folder +if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { + fileinto "Junk"; + # Stop here so that we do not reply on spams + stop; +} + + ################################################################# # Autoreply diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 9c9939655c..05ee88e777 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -100,14 +100,18 @@ class maildeliver_plugin { $sieve_file = $data["new"]["maildir"].'/.sieve'; $sieve_file_svbin = $data["new"]["maildir"].'/.sieve.svbin'; $old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; - $sieve_file_isp = $data["new"]["maildir"].'/.ispconfig.sieve'; - $sieve_file_isp_svbin = $data["new"]["maildir"].'/.ispconfig.svbin'; + $sieve_file_isp_before = $data["new"]["maildir"].'/.ispconfig-before.sieve'; + $sieve_file_isp_before_svbin = $data["new"]["maildir"].'/.ispconfig-before.svbin'; + $sieve_file_isp_after = $data["new"]["maildir"].'/.ispconfig-after.sieve'; + $sieve_file_isp_after_svbin = $data["new"]["maildir"].'/.ispconfig-after.svbin'; if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); // cleanup .sieve file if it is now a broken link if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin) or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN); - if(is_file($sieve_file_isp)) unlink($sieve_file_isp) or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN); - if(is_file($sieve_file_isp_svbin)) unlink($sieve_file_isp_svbin) or $app->log("Unable to delete file: $sieve_file_isp_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before)) unlink($sieve_file_isp_before) or $app->log("Unable to delete file: $sieve_file_isp_before", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before_svbin)) unlink($sieve_file_isp_before_svbin) or $app->log("Unable to delete file: $sieve_file_isp_before_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after)) unlink($sieve_file_isp_after) or $app->log("Unable to delete file: $sieve_file_isp_after", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after_svbin)) unlink($sieve_file_isp_after_svbin) or $app->log("Unable to delete file: $sieve_file_isp_after_svbin", LOGLEVEL_WARN); $app->load('tpl'); //* Select sieve filter file for dovecot version @@ -224,15 +228,24 @@ class maildeliver_plugin { $app->system->mkdirpath($data["new"]["maildir"].'/sieve/', 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); } - file_put_contents($sieve_file_isp, $tpl->grab()) or $app->log("Unable to write sieve filter file", LOGLEVEL_WARN); - if ( is_file($sieve_file_isp) ) { - $app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false); - $app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false); - - $app->system->exec_safe("sievec ?", "$sieve_file_isp"); - if ( is_file($sieve_file_isp_svbin) ) { - $app->system->chown($sieve_file_isp_svbin,$mail_config['mailuser_name'],false); - $app->system->chgrp($sieve_file_isp_svbin,$mail_config['mailuser_group'],false); + if ($data["new"]["move_junk"] == "y") { + $sieve_file_isp = $sieve_file_isp_before; + $sieve_file_isp_svbin = $sieve_file_isp_before_svbin; + } elseif ($data["new"]["move_junk"] == "a") { + $sieve_file_isp = $sieve_file_isp_after; + $sieve_file_isp_svbin = $sieve_file_isp_after_svbin; + } + if (isset($sieve_file_isp)) { + file_put_contents($sieve_file_isp, $tpl->grab()) or $app->log("Unable to write sieve filter file", LOGLEVEL_WARN); + if ( is_file($sieve_file_isp) ) { + $app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false); + $app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false); + + $app->system->exec_safe("sievec ?", "$sieve_file_isp"); + if ( is_file($sieve_file_isp_svbin) ) { + $app->system->chown($sieve_file_isp_svbin,$mail_config['mailuser_name'],false); + $app->system->chgrp($sieve_file_isp_svbin,$mail_config['mailuser_group'],false); + } } } @@ -247,14 +260,18 @@ class maildeliver_plugin { $sieve_file = $data["old"]["maildir"].'/.sieve'; $sieve_file_svbin = $data["old"]["maildir"].'/.sieve.svbin'; $old_sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve'; - $sieve_file_isp = $data["old"]["maildir"].'/.ispconfig.sieve'; - $sieve_file_isp_svbin = $data["old"]["maildir"].'/.ispconfig.svbin'; + $sieve_file_isp_before = $data["old"]["maildir"].'/.ispconfig-before.sieve'; + $sieve_file_isp_before_svbin = $data["old"]["maildir"].'/.ispconfig-before.svbin'; + $sieve_file_isp_after = $data["old"]["maildir"].'/.ispconfig-after.sieve'; + $sieve_file_isp_after_svbin = $data["old"]["maildir"].'/.ispconfig-after.svbin'; if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); // cleanup .sieve file if it is now a broken link if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); if(is_file($sieve_file_svbin)) unlink($sieve_file_svbin) or $app->log("Unable to delete file: $sieve_file_svbin", LOGLEVEL_WARN); - if(is_file($sieve_file_isp)) unlink($sieve_file_isp) or $app->log("Unable to delete file: $sieve_file_isp", LOGLEVEL_WARN); - if(is_file($sieve_file_isp_svbin)) unlink($sieve_file_isp_svbin) or $app->log("Unable to delete file: $sieve_file_isp_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before)) unlink($sieve_file_isp_before) or $app->log("Unable to delete file: $sieve_file_isp_before", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_before_svbin)) unlink($sieve_file_isp_before_svbin) or $app->log("Unable to delete file: $sieve_file_isp_before_svbin", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after)) unlink($sieve_file_isp_after) or $app->log("Unable to delete file: $sieve_file_isp_after", LOGLEVEL_WARN); + if(is_file($sieve_file_isp_after_svbin)) unlink($sieve_file_isp_after_svbin) or $app->log("Unable to delete file: $sieve_file_isp_after_svbin", LOGLEVEL_WARN); } diff --git a/server/plugins-available/maildrop_plugin.inc.php b/server/plugins-available/maildrop_plugin.inc.php index 2fefa26cfc..93bd29f338 100644 --- a/server/plugins-available/maildrop_plugin.inc.php +++ b/server/plugins-available/maildrop_plugin.inc.php @@ -204,7 +204,7 @@ class maildrop_plugin { $app->log("Added CC address ".$data["new"]["cc"].' to mailfilter file.', LOGLEVEL_DEBUG); } - if($data["new"]["move_junk"] == 'y') { + if($data["new"]["move_junk"] != 'n') { if(file_exists($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')) { $mailfilter_content .= file_get_contents($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')."\n"; } else { -- GitLab From 74196ba1859f955242b8d2fd120744a8ccdcc251 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 22 Jul 2020 12:52:42 -0600 Subject: [PATCH 0341/1368] always write before/after sieve scripts, and autoresponder dates optional --- .../sql/incremental/upd_dev_collection.sql | 2 +- install/sql/ispconfig3.sql | 2 +- .../classes/validate_autoresponder.inc.php | 20 +- interface/web/mail/form/mail_user.tform.php | 6 +- interface/web/mail/lib/lang/ar_mail_user.lng | 3 +- interface/web/mail/lib/lang/bg_mail_user.lng | 1 - interface/web/mail/lib/lang/br_mail_user.lng | 1 - interface/web/mail/lib/lang/ca_mail_user.lng | 1 - interface/web/mail/lib/lang/cz_mail_user.lng | 1 - interface/web/mail/lib/lang/de_mail_user.lng | 1 - interface/web/mail/lib/lang/dk_mail_user.lng | 1 - interface/web/mail/lib/lang/el_mail_user.lng | 1 - interface/web/mail/lib/lang/en_mail_user.lng | 3 +- interface/web/mail/lib/lang/es_mail_user.lng | 1 - interface/web/mail/lib/lang/fi_mail_user.lng | 1 - interface/web/mail/lib/lang/fr_mail_user.lng | 1 - interface/web/mail/lib/lang/hr_mail_user.lng | 3 +- interface/web/mail/lib/lang/hu_mail_user.lng | 3 +- interface/web/mail/lib/lang/id_mail_user.lng | 1 - interface/web/mail/lib/lang/it_mail_user.lng | 1 - interface/web/mail/lib/lang/ja_mail_user.lng | 3 +- interface/web/mail/lib/lang/nl_mail_user.lng | 1 - interface/web/mail/lib/lang/pl_mail_user.lng | 1 - interface/web/mail/lib/lang/pt_mail_user.lng | 1 - interface/web/mail/lib/lang/ro_mail_user.lng | 3 +- interface/web/mail/lib/lang/ru_mail_user.lng | 1 - interface/web/mail/lib/lang/se_mail_user.lng | 3 +- interface/web/mail/lib/lang/sk_mail_user.lng | 3 +- interface/web/mail/lib/lang/tr_mail_user.lng | 1 - server/conf/sieve_filter.master | 43 +++- server/conf/sieve_filter_1.2.master | 23 ++- .../maildeliver_plugin.inc.php | 193 +++++++++--------- .../plugins-available/maildrop_plugin.inc.php | 5 +- 33 files changed, 162 insertions(+), 173 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index abe2a8a1a1..2eb2594e88 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -49,4 +49,4 @@ ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumte ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; -- add move to junk before/after option, default to after -ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'a'; +ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y'; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index bacf075baa..9c11a68914 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1046,7 +1046,7 @@ CREATE TABLE `mail_user` ( `autoresponder_end_date` datetime NULL default NULL, `autoresponder_subject` varchar(255) NOT NULL default 'Out of office reply', `autoresponder_text` mediumtext NULL, - `move_junk` enum('y','a','n') NOT NULL default 'a', + `move_junk` enum('y','a','n') NOT NULL default 'y', `purge_trash_days` INT NOT NULL DEFAULT '0', `purge_junk_days` INT NOT NULL DEFAULT '0', `custom_mailfilter` mediumtext, diff --git a/interface/lib/classes/validate_autoresponder.inc.php b/interface/lib/classes/validate_autoresponder.inc.php index 25db68bdd9..48ee377883 100755 --- a/interface/lib/classes/validate_autoresponder.inc.php +++ b/interface/lib/classes/validate_autoresponder.inc.php @@ -31,25 +31,11 @@ include_once 'validate_datetime.inc.php'; class validate_autoresponder extends validate_datetime { - function start_date($field_name, $field_value, $validator) - { - global $app; - - // save field value for later use in end_date() - $this->start_date = $field_value; - - if($_POST['autoresponder'] == 'y' && $field_value == '') { - // we need a start date when autoresponder is on - return $app->tform->lng($validator['errmsg']).'
    '; - } - } - function end_date($field_name, $field_value, $validator) { global $app; - $start_date = $this->start_date; - //$start_date = $app->tform_actions->dataRecord['autoresponder_start_date']; + $start_date = $app->tform_actions->dataRecord['autoresponder_start_date']; // Parse date $datetimeformat = (isset($app->remoting_lib) ? $app->remoting_lib->datetimeformat : $app->tform->datetimeformat); @@ -60,8 +46,8 @@ class validate_autoresponder extends validate_datetime $start_date_tstamp = mktime($start_date_array['hour'], $start_date_array['minute'], $start_date_array['second'], $start_date_array['month'], $start_date_array['day'], $start_date_array['year']); $end_date_tstamp = mktime($end_date_array['hour'], $end_date_array['minute'], $end_date_array['second'], $end_date_array['month'], $end_date_array['day'], $end_date_array['year']); - // End date has to be > start date - if($end_date_tstamp <= $start_date_tstamp && ($start_date || $field_value)) { + // If both are set, end date has to be > start date + if($start_date && $field_value && $end_date_tstamp <= $start_date_tstamp) { return $app->tform->lng($validator['errmsg']).'
    '; } } diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 0bef9d979f..48c1e7dd96 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -364,10 +364,6 @@ if ($global_config['mail']['mailbox_show_autoresponder_tab'] === 'y') { 0 => array ( 'type' => 'ISDATETIME', 'allowempty' => 'y', 'errmsg'=> 'autoresponder_start_date_is_no_date'), - 1 => array ( 'type' => 'CUSTOM', - 'class' => 'validate_autoresponder', - 'function' => 'start_date', - 'errmsg'=> 'autoresponder_start_date_is_required'), ) ), 'autoresponder_end_date' => array ( @@ -403,7 +399,7 @@ if ($global_config['mail']['mailbox_show_mail_filter_tab'] === 'y') { 'move_junk' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', - 'default' => 'a', + 'default' => 'y', 'value' => array('y' => 'move_junk_y_txt', 'a' => 'move_junk_a_txt', 'n' => 'move_junk_n_txt'), ), 'purge_trash_days' => array ( diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index 702725959d..04f5946cee 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -11,7 +11,7 @@ $wb['autoresponder_txt'] = 'Active'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; $wb['error_no_pwd'] = 'Password is empty.'; $wb['quota_error_isint'] = 'Mailbox size must be a number.'; @@ -60,7 +60,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 49be467e91..af427fa5e3 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -54,7 +54,6 @@ $wb['password_match_txt'] = 'The passwords do match.'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['backup_interval_txt'] = 'Backup interval'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 8f02122ade..e0ef4a373e 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -14,7 +14,6 @@ $wb['autoresponder_start_date_txt'] = 'Iniciar em'; $wb['autoresponder_start_date_ispast'] = 'O campo "Iniciar em" não pode ser menor que a data atual.'; $wb['autoresponder_end_date_txt'] = 'Terminar em'; $wb['autoresponder_end_date_isgreater'] = 'O campo "Terminar em" deve ser configurado e não pode ser menor ou igual a data atual.'; -$wb['autoresponder_start_date_is_required'] = 'Data iniciar deve ser configurado quando a opção de auto-resposta estiver habilitada.'; $wb['no_domain_perm'] = 'Você não tem permissão para este domínio.'; $wb['error_no_pwd'] = 'A senha está em branco.'; $wb['quota_error_isint'] = 'O tamanho da conta de e-mail deve ser um número.'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 259c357671..9e8fae6fb6 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -53,7 +53,6 @@ $wb['password_match_txt'] = 'Les mots de passe correspondent.'; $wb['disablesmtp_txt'] = 'Désactiver SMTP (envoi)'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Séparer chaque adresses par une virgule)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index 72ebc26a4b..73149f757b 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -53,7 +53,6 @@ $wb['password_match_txt'] = 'Hesla se shodují.'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Při posílání kopií na více e-mailových adres, oddělte čárkami.)'; $wb['disablesmtp_txt'] = 'Zakázat SMTP (pouze odesílání)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['greylisting_txt'] = 'Povolit greylisting'; $wb['sender_cc_txt'] = 'Odeslat odchozí kopii na'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index 79834d9a5c..43b907d5b0 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -60,7 +60,6 @@ $wb['daily_backup_txt'] = 'taeglich'; $wb['weekly_backup_txt'] = 'woechentlich'; $wb['monthly_backup_txt'] = 'monatlich'; $wb['cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; -$wb['autoresponder_start_date_is_required'] = 'Startdatum muss angegeben werden.'; $wb['sender_cc_txt'] = 'Kopie ausgehender Emails senden an (BCC)'; $wb['sender_cc_error_isemail'] = '-Kopie ausgehender Emails senden an- Feld enthält keine gültige Emailadresse'; $wb['sender_cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index cf29a97137..68272beaaa 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -53,7 +53,6 @@ $wb['password_mismatch_txt'] = 'Adgangskoderne stemmer ikke overens.'; $wb['password_match_txt'] = 'Adgangskoderne stemmer overens.'; $wb['email_error_isascii'] = 'Undlad venligst at bruge specielle Unicode-tegn for din adgangskode Dette kan føre til problemer med din mail-klient.'; $wb['cc_note_txt'] = '(Adskil flere e-mail adresser med kommaer)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['password_click_to_set_txt'] = 'Click to set'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index 0f424c0099..84aa6fce6c 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -54,7 +54,6 @@ $wb['password_match_txt'] = 'The passwords do match.'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['backup_interval_txt'] = 'Backup interval'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index 7b98e593c8..3b5ee34397 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -13,8 +13,7 @@ $wb["autoresponder_txt"] = 'Active'; $wb["autoresponder_start_date_txt"] = 'Start on'; $wb["autoresponder_start_date_ispast"] = 'Start date cannot be in the past.'; $wb["autoresponder_end_date_txt"] = 'End by'; -$wb["autoresponder_end_date_isgreater"] = 'End date must be set and be later than start date.'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; +$wb["autoresponder_end_date_isgreater"] = 'End date must be later than start date.'; $wb["no_domain_perm"] = 'You have no permission for this domain.'; $wb["error_no_pwd"] = 'Password is empty.'; $wb["quota_error_isint"] = 'Mailbox size must be a number.'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index 676dd45c22..c8ea29d72c 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -4,7 +4,6 @@ $wb['active_txt'] = 'Habilitado'; $wb['autoresponder_active'] = 'Activar auto respuesta'; $wb['autoresponder_end_date_isgreater'] = 'Debe indicar la fecha de finalización y esta debe ser mayor a la de inicio.'; $wb['autoresponder_end_date_txt'] = 'Finaliza el'; -$wb['autoresponder_start_date_is_required'] = 'Cuando se activa la auto respuesta se debe definir una fecha de inicio.'; $wb['autoresponder_start_date_ispast'] = 'La fecha de inicio no puede estar en el pasado.'; $wb['autoresponder_start_date_txt'] = 'Comienza el'; $wb['autoresponder_subject'] = 'Estoy fuera de la oficina'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index 97bddeddc7..2416e3dfe9 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -60,7 +60,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index 4871865ae8..e3b130fe4a 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -53,7 +53,6 @@ $wb['password_match_txt'] = 'Les mots de passe correspondent.'; $wb['disablesmtp_txt'] = 'Désactiver SMTP (envoi)'; $wb['email_error_isascii'] = 'Merci de ne pas utiliser de caractères spéciaux Unicode dans votre mot de passe. Ceci pourrait engendrer des problèmes avec votre client mail.'; $wb['cc_note_txt'] = '(Séparer les adresses e-mail multiples par des virgules)'; -$wb['autoresponder_start_date_is_required'] = 'Une date de démarrage doit être renseignée quand le répondeur automatique est activé.'; $wb['greylisting_txt'] = 'Activer le greylisting'; $wb['sender_cc_txt'] = 'Envoyer une copie des mails sortants à'; $wb['sender_cc_error_isemail'] = 'Le champ -Envoyer une copie des mails sortants à- no contiens pas une adresse e-mail valide'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 34c41a827e..c75fc8c771 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -10,7 +10,7 @@ $wb['autoresponder_text_txt'] = 'Text'; $wb['autoresponder_txt'] = 'Aktivno'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; $wb['error_no_pwd'] = 'Password is empty.'; $wb['quota_error_isint'] = 'Mailbox size must be a number.'; @@ -57,7 +57,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['generate_password_txt'] = 'Generate Password'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 58a4416cb2..00361fc79c 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -30,7 +30,7 @@ $wb['quota_error_value'] = 'Invalid quota value. Allowed values are: 0 for unlim $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; $wb["move_junk_y_txt"] = 'Move first, before custom filters.'; $wb["move_junk_a_txt"] = 'Move last, after custom filters.'; @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index 87be369635..123eb7fd21 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index 6dffeddb91..49b5a43f0c 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -54,7 +54,6 @@ $wb['password_match_txt'] = 'Le passwords coincidono.'; $wb['email_error_isascii'] = 'Non utilizzare caratteri speciali unicode per la password. Potresti avere problemi con il tuo client di psota.'; $wb['cc_note_txt'] = '(Separa indirizzi email multipli con la virgola)'; $wb['disablesmtp_txt'] = 'Disabilita SMTP (trasmissione)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index 1b36502b74..1b6195e5fe 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -30,7 +30,7 @@ $wb['quota_error_value'] = '容量の値が不正です。 無制限にする場 $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; $wb["move_junk_y_txt"] = 'Move first, before custom filters.'; $wb["move_junk_a_txt"] = 'Move last, after custom filters.'; @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 37e8c8638b..5b39e2ad75 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -60,7 +60,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Meerdere e-mail adressen scheiden met een komma)'; $wb['disablesmtp_txt'] = 'Uitschakelen SMTP (versturen)'; -$wb['autoresponder_start_date_is_required'] = 'Een startdatun is vereist voor het inschakelen van Autobeantwoorden.'; $wb['sender_cc_txt'] = 'Stuur uitgaande kopie aan'; $wb['sender_cc_error_isemail'] = 'Het \\"Stuur uitgaande kopie aan\\" veld bevat geen geldig e-mail adres'; $wb['sender_cc_note_txt'] = '(Meerdere e-mail adressen scheiden met een komma)'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 889700cddd..4a410a6b5c 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index 6c715d52e2..05e8cfce89 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index ee1b6b980c..d03849c760 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -28,7 +28,7 @@ $wb['disablepop3_txt'] = 'Blocheaza POP3'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['duplicate_alias_or_forward_txt'] = 'There is already an alias or forwrd with this email address.'; $wb['quota_error_value'] = 'Invalid quota value. Allowed values are: 0 for unlimited or numbers > 1'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index 6935ecd8e2..3944d3304b 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Ежемесячно'; $wb['email_error_isascii'] = 'Пожалуйста, не используйте специальные символы Юникода для вашего пароля. Это может привести к проблемам с вашим почтовым клиентом.'; $wb['cc_note_txt'] = '(Разделите несколько адресов электронной почты запятыми)'; $wb['disablesmtp_txt'] = 'Отключить SMTP (отправка)'; -$wb['autoresponder_start_date_is_required'] = 'Дата начала должна быть установлена когда автоответчик включен.'; $wb['sender_cc_txt'] = 'Отправка исходящей копии на'; $wb['sender_cc_error_isemail'] = 'Поле -Отправка исходящей копии на- не содержит действительный адрес электронной почты'; $wb['sender_cc_note_txt'] = '(Разделите несколько адресов электронной почты запятыми)'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index 22c5b0fe45..2b856c094a 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -30,7 +30,7 @@ $wb['quota_error_value'] = 'Invalid quota value. Allowed values are: 0 for unlim $wb['autoresponder_start_date_txt'] = 'Starta den'; $wb['autoresponder_start_date_ispast'] = 'Startdatum kan inte vara i det förflutna.'; $wb['autoresponder_end_date_txt'] = 'Sluta den'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['move_junk_txt'] = 'FLytta spamepost till spammappen'; $wb["move_junk_y_txt"] = 'Move first, before custom filters.'; $wb["move_junk_a_txt"] = 'Move last, after custom filters.'; @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index 258e8f6128..c44ea9ab6e 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -30,7 +30,7 @@ $wb['quota_error_value'] = 'Neplatná hodnota kvóty. Povolené hodnoty sú: 0 p $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_ispast'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['move_junk_txt'] = 'Move Spam Emails to Junk directory'; $wb["move_junk_y_txt"] = 'Move first, before custom filters.'; $wb["move_junk_a_txt"] = 'Move last, after custom filters.'; @@ -61,7 +61,6 @@ $wb['monthly_backup_txt'] = 'Monthly'; $wb['email_error_isascii'] = 'Please do not use special unicode characters for your password. This could lead to problems with your mail client.'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; $wb['disablesmtp_txt'] = 'Disable SMTP (sending)'; -$wb['autoresponder_start_date_is_required'] = 'Start date must be set when Autoresponder is enabled.'; $wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['sender_cc_note_txt'] = '(Separate multiple email addresses with commas)'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index a1ed0128f3..790e44c014 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -14,7 +14,6 @@ $wb['autoresponder_start_date_txt'] = 'Başlangıç'; $wb['autoresponder_start_date_ispast'] = 'Başlangıç zamanı geçmişte olamaz.'; $wb['autoresponder_end_date_txt'] = 'Bitiş'; $wb['autoresponder_end_date_isgreater'] = 'Bitiş zamanı başlangıç zamanından sonra olmalıdır.'; -$wb['autoresponder_start_date_is_required'] = 'Otoyanıtlayıcı kullanıldığında başlangıç tarihi belirtilmelidir.'; $wb['no_domain_perm'] = 'Bu etki alanı için izniniz yok.'; $wb['error_no_pwd'] = 'Parola boş olamaz.'; $wb['quota_error_isint'] = 'E-posta kutusunun boyutu bir sayı olmalıdır.'; diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index 6b83c26394..c5b33e4ba3 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -1,14 +1,9 @@ + # This sieve script is generated by ISPConfig, any changes made will be overwritten. # You can create and activate a per-user sieve script (manually or via managesieve), -# which will execute before this. -require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; +# which will execute after this. - -# Send a copy of email to - -redirect ""; - - +require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; # Move spam to spam folder @@ -19,9 +14,20 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", } + +# Send a copy of email to + +redirect ""; + + + -keep; + + +# This sieve script is generated by ISPConfig, any changes made will be overwritten. +# You can create and activate a per-user sieve script (manually or via managesieve), +# which will execute before this. # Move spam to spam folder @@ -39,13 +45,28 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", # Move spam to spam folder if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - fileinto "Junk"; # Stop here so that we do not reply on spams stop; } + + +if currentdate :value "ge" "iso8601" "" { + + +if currentdate :value "le" "iso8601" "" { + + vacation :days 1 :subject "" - # :addresses ["test@test.int", "till@test.int"] ""; + + +} + + +} + + + diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master index 3a8695b1a6..c5b33e4ba3 100644 --- a/server/conf/sieve_filter_1.2.master +++ b/server/conf/sieve_filter_1.2.master @@ -1,6 +1,8 @@ + # This sieve script is generated by ISPConfig, any changes made will be overwritten. # You can create and activate a per-user sieve script (manually or via managesieve), -# which will execute before this. +# which will execute after this. + require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; @@ -21,7 +23,11 @@ redirect ""; -keep; + + +# This sieve script is generated by ISPConfig, any changes made will be overwritten. +# You can create and activate a per-user sieve script (manually or via managesieve), +# which will execute before this. # Move spam to spam folder @@ -43,8 +49,11 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", stop; } - -if allof(currentdate :value "ge" "iso8601" "", currentdate :value "le" "iso8601" "") { + +if currentdate :value "ge" "iso8601" "" { + + +if currentdate :value "le" "iso8601" "" { vacation :days 1 @@ -52,8 +61,12 @@ vacation :days 1 ""; - + +} + + } + diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 05ee88e777..5b4c5671e4 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -127,116 +127,111 @@ class maildeliver_plugin { } unset($tmp); - //* Create new filter file based on template - $tpl = new tpl(); - $tpl->newTemplate($filter_file_template); - - // cc Field - $tmp_mails_arr = explode(',',$data["new"]["cc"]); - $tmp_addresses_arr = array(); - foreach($tmp_mails_arr as $address) { - if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address)); - } + foreach ( array('before', 'after') as $sieve_script ) { + //* Create new filter file based on template + $tpl = new tpl(); + $tpl->newTemplate($filter_file_template); + + // cc Field + $tmp_mails_arr = explode(',',$data["new"]["cc"]); + $tmp_addresses_arr = array(); + foreach($tmp_mails_arr as $address) { + if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address)); + } - $tpl->setVar('cc', $data["new"]["cc"]); - $tpl->setLoop('ccloop', $tmp_addresses_arr); - - // Custom filters - if($data["new"]["custom_mailfilter"] == 'NULL') $data["new"]["custom_mailfilter"] = ''; - $tpl->setVar('custom_mailfilter', str_replace("\r\n","\n",$data["new"]["custom_mailfilter"])); - - // Move junk - $tpl->setVar('move_junk', $data["new"]["move_junk"]); - - // Check autoresponder dates - if((!$data['new']['autoresponder_start_date'] || $data["new"]["autoresponder_start_date"] == '0000-00-00 00:00:00') && (!$data['new']['autoresponder_end_date'] || $data["new"]["autoresponder_end_date"] == '0000-00-00 00:00:00')) { - $tpl->setVar('autoresponder_date_limit', 0); - } else { - $tpl->setVar('autoresponder_date_limit', 1); - } - - - // Set autoresponder start date - $data["new"]["autoresponder_start_date"] = str_replace(" ", "T", $data["new"]["autoresponder_start_date"]); - $tpl->setVar('start_date', $data["new"]["autoresponder_start_date"]); - - // Set autoresponder end date - $data["new"]["autoresponder_end_date"] = str_replace(" ", "T", $data["new"]["autoresponder_end_date"]); - $tpl->setVar('end_date', $data["new"]["autoresponder_end_date"]); - - // Autoresponder - $tpl->setVar('autoresponder', $data["new"]["autoresponder"]); - - // Autoresponder Subject - $data["new"]["autoresponder_subject"] = str_replace("\"", "'", $data["new"]["autoresponder_subject"]); - $tpl->setVar('autoresponder_subject', $data["new"]["autoresponder_subject"]); - - // Autoresponder Text - $data["new"]["autoresponder_text"] = str_replace("\"", "'", $data["new"]["autoresponder_text"]); - $tpl->setVar('autoresponder_text', $data["new"]["autoresponder_text"]); + $tpl->setVar('cc', $data["new"]["cc"]); + $tpl->setLoop('ccloop', $tmp_addresses_arr); + + // Custom filters + if($data["new"]["custom_mailfilter"] == 'NULL') $data["new"]["custom_mailfilter"] = ''; + $tpl->setVar('custom_mailfilter', str_replace("\r\n","\n",$data["new"]["custom_mailfilter"])); + + // Move junk + $tpl->setVar('move_junk', $data["new"]["move_junk"]); + + // Set autoresponder start date + $data["new"]["autoresponder_start_date"] = str_replace(" ", "T", $data["new"]["autoresponder_start_date"]); + $tpl->setVar('start_date', $data["new"]["autoresponder_start_date"]); + + // Set autoresponder end date + $data["new"]["autoresponder_end_date"] = str_replace(" ", "T", $data["new"]["autoresponder_end_date"]); + $tpl->setVar('end_date', $data["new"]["autoresponder_end_date"]); + + // Autoresponder + $tpl->setVar('autoresponder', $data["new"]["autoresponder"]); + + // Autoresponder Subject + $data["new"]["autoresponder_subject"] = str_replace("\"", "'", $data["new"]["autoresponder_subject"]); + $tpl->setVar('autoresponder_subject', $data["new"]["autoresponder_subject"]); + + // Autoresponder Text + $data["new"]["autoresponder_text"] = str_replace("\"", "'", $data["new"]["autoresponder_text"]); + $tpl->setVar('autoresponder_text', $data["new"]["autoresponder_text"]); + + if (! defined($address_str)) { + //* Set alias addresses for autoresponder + $sql = "SELECT * FROM mail_forwarding WHERE type = 'alias' AND destination = ?"; + $records = $app->db->queryAllRecords($sql, $data["new"]["email"]); + + $addresses = array(); + $addresses[] = $data["new"]["email"]; + if(is_array($records) && count($records) > 0) { + foreach($records as $rec) { + $addresses[] = $rec['source']; + } + } - //* Set alias addresses for autoresponder - $sql = "SELECT * FROM mail_forwarding WHERE type = 'alias' AND destination = ?"; - $records = $app->db->queryAllRecords($sql, $data["new"]["email"]); + $app->log("Found " . count($addresses) . " addresses.", LOGLEVEL_DEBUG); + + $alias_addresses = array(); + + $email_parts = explode('@', $data["new"]["email"]); + $sql = "SELECT * FROM mail_forwarding WHERE type = 'aliasdomain' AND destination = ?"; + $records = $app->db->queryAllRecords($sql, '@'.$email_parts[1]); + if(is_array($records) && count($records) > 0) { + $app->log("Found " . count($records) . " records (aliasdomains).", LOGLEVEL_DEBUG); + foreach($records as $rec) { + $aliasdomain = substr($rec['source'], 1); + foreach($addresses as $email) { + $email_parts = explode('@', $email); + $alias_addresses[] = $email_parts[0].'@'.$aliasdomain; + } + } + } - $addresses = array(); - $addresses[] = $data["new"]["email"]; - if(is_array($records) && count($records) > 0) { - foreach($records as $rec) { - $addresses[] = $rec['source']; - } - } + $app->log("Found " . count($addresses) . " addresses at all.", LOGLEVEL_DEBUG); - $app->log("Found " . count($addresses) . " addresses.", LOGLEVEL_DEBUG); + $addresses = array_unique(array_merge($addresses, $alias_addresses)); - $alias_addresses = array(); + $app->log("Found " . count($addresses) . " unique addresses at all.", LOGLEVEL_DEBUG); - $email_parts = explode('@', $data["new"]["email"]); - $sql = "SELECT * FROM mail_forwarding WHERE type = 'aliasdomain' AND destination = ?"; - $records = $app->db->queryAllRecords($sql, '@'.$email_parts[1]); - if(is_array($records) && count($records) > 0) { - $app->log("Found " . count($records) . " records (aliasdomains).", LOGLEVEL_DEBUG); - foreach($records as $rec) { - $aliasdomain = substr($rec['source'], 1); - foreach($addresses as $email) { - $email_parts = explode('@', $email); - $alias_addresses[] = $email_parts[0].'@'.$aliasdomain; + $address_str = ''; + if(is_array($addresses) && count($addresses) > 0) { + $address_str .= ':addresses ['; + foreach($addresses as $rec) { + $address_str .= '"'.$rec.'",'; + } + $address_str = substr($address_str, 0, -1); + $address_str .= ']'; } } - } - $app->log("Found " . count($addresses) . " addresses at all.", LOGLEVEL_DEBUG); + $tpl->setVar('addresses', $address_str); - $addresses = array_unique(array_merge($addresses, $alias_addresses)); - - $app->log("Found " . count($addresses) . " unique addresses at all.", LOGLEVEL_DEBUG); - - $address_str = ''; - if(is_array($addresses) && count($addresses) > 0) { - $address_str .= ':addresses ['; - foreach($addresses as $rec) { - $address_str .= '"'.$rec.'",'; + if ( ! is_dir($data["new"]["maildir"].'/sieve/') ) { + $app->system->mkdirpath($data["new"]["maildir"].'/sieve/', 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); } - $address_str = substr($address_str, 0, -1); - $address_str .= ']'; - } + $tpl->setVar('sieve_script', $sieve_script); + if ($sieve_script == 'before') { + $sieve_file_isp = $sieve_file_isp_before; + $sieve_file_isp_svbin = $sieve_file_isp_before_svbin; + } elseif ($sieve_script == 'after') { + $sieve_file_isp = $sieve_file_isp_after; + $sieve_file_isp_svbin = $sieve_file_isp_after_svbin; + } - $tpl->setVar('addresses', $address_str); - - if ( ! is_dir($data["new"]["maildir"].'/sieve/') ) { - $app->system->mkdirpath($data["new"]["maildir"].'/sieve/', 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); - } - - if ($data["new"]["move_junk"] == "y") { - $sieve_file_isp = $sieve_file_isp_before; - $sieve_file_isp_svbin = $sieve_file_isp_before_svbin; - } elseif ($data["new"]["move_junk"] == "a") { - $sieve_file_isp = $sieve_file_isp_after; - $sieve_file_isp_svbin = $sieve_file_isp_after_svbin; - } - if (isset($sieve_file_isp)) { - file_put_contents($sieve_file_isp, $tpl->grab()) or $app->log("Unable to write sieve filter file", LOGLEVEL_WARN); + file_put_contents($sieve_file_isp, $tpl->grab()) or $app->log("Unable to write sieve filter file " . $sieve_file_isp, LOGLEVEL_WARN); if ( is_file($sieve_file_isp) ) { $app->system->chown($sieve_file_isp,$mail_config['mailuser_name'],false); $app->system->chgrp($sieve_file_isp,$mail_config['mailuser_group'],false); @@ -247,10 +242,10 @@ class maildeliver_plugin { $app->system->chgrp($sieve_file_isp_svbin,$mail_config['mailuser_group'],false); } } - } - unset($tpl); + unset($tpl); + } } } diff --git a/server/plugins-available/maildrop_plugin.inc.php b/server/plugins-available/maildrop_plugin.inc.php index 93bd29f338..00777a1662 100644 --- a/server/plugins-available/maildrop_plugin.inc.php +++ b/server/plugins-available/maildrop_plugin.inc.php @@ -146,9 +146,12 @@ class maildrop_plugin { if ($data['new']['autoresponder_start_date'] && $data["new"]["autoresponder_start_date"] != '0000-00-00 00:00:00') { // Dates have been set $tpl = str_replace('{start_date}', strtotime($data["new"]["autoresponder_start_date"]), $tpl); - $tpl = str_replace('{end_date}', strtotime($data["new"]["autoresponder_end_date"]), $tpl); } else { $tpl = str_replace('{start_date}', -7200, $tpl); + } + if ($data['new']['autoresponder_end_date'] && $data["new"]["autoresponder_end_date"] != '0000-00-00 00:00:00') { // Dates have been set + $tpl = str_replace('{end_date}', strtotime($data["new"]["autoresponder_end_date"]), $tpl); + } else { $tpl = str_replace('{end_date}', 2147464800, $tpl); } -- GitLab From 62af6f1446d6576a1dc0ea6cfedfc18a66937a6a Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 22 Jul 2020 16:17:44 -0600 Subject: [PATCH 0342/1368] no need for multiple, identical sieve filter templates --- server/conf/sieve_filter_1.2.master | 72 ------------------- .../maildeliver_plugin.inc.php | 15 +--- 2 files changed, 1 insertion(+), 86 deletions(-) delete mode 100644 server/conf/sieve_filter_1.2.master diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master deleted file mode 100644 index c5b33e4ba3..0000000000 --- a/server/conf/sieve_filter_1.2.master +++ /dev/null @@ -1,72 +0,0 @@ - -# This sieve script is generated by ISPConfig, any changes made will be overwritten. -# You can create and activate a per-user sieve script (manually or via managesieve), -# which will execute after this. - -require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; - - -# Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - fileinto "Junk"; - # Stop here so that we do not reply on spams - stop; -} - - - -# Send a copy of email to - -redirect ""; - - - - - - - -# This sieve script is generated by ISPConfig, any changes made will be overwritten. -# You can create and activate a per-user sieve script (manually or via managesieve), -# which will execute before this. - - -# Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - fileinto "Junk"; - # Stop here so that we do not reply on spams - stop; -} - - - -################################################################# -# Autoreply -################################################################# - -# Move spam to spam folder -if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { - # Stop here so that we do not reply on spams - stop; -} - - -if currentdate :value "ge" "iso8601" "" { - - -if currentdate :value "le" "iso8601" "" { - - -vacation :days 1 - :subject "" - - ""; - - -} - - -} - - - - diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 5b4c5671e4..99220d5ffa 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -114,23 +114,10 @@ class maildeliver_plugin { if(is_file($sieve_file_isp_after_svbin)) unlink($sieve_file_isp_after_svbin) or $app->log("Unable to delete file: $sieve_file_isp_after_svbin", LOGLEVEL_WARN); $app->load('tpl'); - //* Select sieve filter file for dovecot version - exec('dovecot --version', $tmp); - if(substr($tmp[0], 0, 3) == '1.0') { - $filter_file_template = "sieve_filter.master"; - } elseif(substr($tmp[0], 0, 3) == '1.2') { - $filter_file_template = "sieve_filter_1.2.master"; - } elseif(substr($tmp[0], 0, 1) == '2') { - $filter_file_template = "sieve_filter_1.2.master"; - } else { - $filter_file_template = "sieve_filter.master"; - } - unset($tmp); - foreach ( array('before', 'after') as $sieve_script ) { //* Create new filter file based on template $tpl = new tpl(); - $tpl->newTemplate($filter_file_template); + $tpl->newTemplate("sieve_filter.master"); // cc Field $tmp_mails_arr = explode(',',$data["new"]["cc"]); -- GitLab From e55e8dc2d6fc1b9937bc1703de8d1da47e9ccf97 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 24 Jul 2020 12:25:51 -0600 Subject: [PATCH 0343/1368] rename .ispconfig-after.sieve to .ispconfig.sieve --- install/tpl/debian6_dovecot.conf.master | 2 +- install/tpl/debian6_dovecot2.conf.master | 2 +- install/tpl/debian_dovecot.conf.master | 2 +- install/tpl/debian_dovecot2.conf.master | 2 +- install/tpl/fedora_dovecot.conf.master | 2 +- install/tpl/fedora_dovecot2.conf.master | 2 +- install/tpl/opensuse_dovecot.conf.master | 2 +- install/tpl/opensuse_dovecot2.conf.master | 2 +- server/plugins-available/maildeliver_plugin.inc.php | 12 +++++++----- 9 files changed, 15 insertions(+), 13 deletions(-) diff --git a/install/tpl/debian6_dovecot.conf.master b/install/tpl/debian6_dovecot.conf.master index cf9e85f3b3..f1df2e241e 100644 --- a/install/tpl/debian6_dovecot.conf.master +++ b/install/tpl/debian6_dovecot.conf.master @@ -61,7 +61,7 @@ plugin { sieve=/var/vmail/%d/%n/.sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index ead02a68c7..80709cfe36 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -30,7 +30,7 @@ plugin { sieve=/var/vmail/%d/%n/.sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/debian_dovecot.conf.master b/install/tpl/debian_dovecot.conf.master index 2bba3fa985..4109498cea 100644 --- a/install/tpl/debian_dovecot.conf.master +++ b/install/tpl/debian_dovecot.conf.master @@ -1146,7 +1146,7 @@ plugin { #lazy_expunge = .EXPUNGED/ .DELETED/ .DELETED/.EXPUNGED/ sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index c71f683e96..a292591372 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -29,7 +29,7 @@ plugin { sieve=/var/vmail/%d/%n/.sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/fedora_dovecot.conf.master b/install/tpl/fedora_dovecot.conf.master index 405a723a55..0bd4f7ca6d 100644 --- a/install/tpl/fedora_dovecot.conf.master +++ b/install/tpl/fedora_dovecot.conf.master @@ -1307,7 +1307,7 @@ plugin { sieve_dir=~/sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/fedora_dovecot2.conf.master b/install/tpl/fedora_dovecot2.conf.master index 312654732c..2acd757fbd 100644 --- a/install/tpl/fedora_dovecot2.conf.master +++ b/install/tpl/fedora_dovecot2.conf.master @@ -27,7 +27,7 @@ plugin { sieve=/var/vmail/%d/%n/.sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/opensuse_dovecot.conf.master b/install/tpl/opensuse_dovecot.conf.master index a6ed0ab71f..4a4d5e319c 100644 --- a/install/tpl/opensuse_dovecot.conf.master +++ b/install/tpl/opensuse_dovecot.conf.master @@ -1281,7 +1281,7 @@ plugin { sieve_dir=~/sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/install/tpl/opensuse_dovecot2.conf.master b/install/tpl/opensuse_dovecot2.conf.master index da716c6dfc..62c9939819 100644 --- a/install/tpl/opensuse_dovecot2.conf.master +++ b/install/tpl/opensuse_dovecot2.conf.master @@ -26,7 +26,7 @@ plugin { sieve=/var/vmail/%d/%n/.sieve sieve_before=/var/vmail/%d/%n/.ispconfig-before.sieve - sieve_after=/var/vmail/%d/%n/.ispconfig-after.sieve + sieve_after=/var/vmail/%d/%n/.ispconfig.sieve sieve_max_script_size = 2M sieve_max_actions = 100 sieve_max_redirects = 25 diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 99220d5ffa..130d0a7f18 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -102,8 +102,9 @@ class maildeliver_plugin { $old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; $sieve_file_isp_before = $data["new"]["maildir"].'/.ispconfig-before.sieve'; $sieve_file_isp_before_svbin = $data["new"]["maildir"].'/.ispconfig-before.svbin'; - $sieve_file_isp_after = $data["new"]["maildir"].'/.ispconfig-after.sieve'; - $sieve_file_isp_after_svbin = $data["new"]["maildir"].'/.ispconfig-after.svbin'; + $sieve_file_isp_after = $data["new"]["maildir"].'/.ispconfig.sieve'; + $sieve_file_isp_after_svbin = $data["new"]["maildir"].'/.ispconfig.svbin'; + if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); // cleanup .sieve file if it is now a broken link if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); @@ -241,11 +242,12 @@ class maildeliver_plugin { $sieve_file = $data["old"]["maildir"].'/.sieve'; $sieve_file_svbin = $data["old"]["maildir"].'/.sieve.svbin'; - $old_sieve_file_isp = $data["old"]["maildir"].'/sieve/ispconfig.sieve'; + $old_sieve_file_isp = $data["new"]["maildir"].'/sieve/ispconfig.sieve'; $sieve_file_isp_before = $data["old"]["maildir"].'/.ispconfig-before.sieve'; $sieve_file_isp_before_svbin = $data["old"]["maildir"].'/.ispconfig-before.svbin'; - $sieve_file_isp_after = $data["old"]["maildir"].'/.ispconfig-after.sieve'; - $sieve_file_isp_after_svbin = $data["old"]["maildir"].'/.ispconfig-after.svbin'; + $sieve_file_isp_after = $data["old"]["maildir"].'/.ispconfig.sieve'; + $sieve_file_isp_after_svbin = $data["old"]["maildir"].'/.ispconfig.svbin'; + if(is_file($old_sieve_file_isp)) unlink($old_sieve_file_isp) or $app->log("Unable to delete file: $old_sieve_file_isp", LOGLEVEL_WARN); // cleanup .sieve file if it is now a broken link if(is_link($sieve_file) && !file_exists($sieve_file)) unlink($sieve_file) or $app->log("Unable to delete file: $sieve_file", LOGLEVEL_WARN); -- GitLab From bd155b39fec86c2115f5555a023fce807e6d15f4 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 24 Jul 2020 23:30:15 +0200 Subject: [PATCH 0344/1368] Set DirectoryIndex and unset CSP for /stats --- server/plugins-available/apache2_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 26f2948256..174228eb48 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1841,7 +1841,7 @@ class apache2_plugin { if($data['new']['stats_type'] != '') { 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"; + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user\nDirectoryIndex index.php\nHeader unset Content-Security-Policy"; $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); -- GitLab From ca9fab3dc848d58cbada6a0ce84a3268cb9c34cd Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 24 Jul 2020 15:47:44 -0600 Subject: [PATCH 0345/1368] outgoing_bcc regex matches more mail_forwarding.destination addrs --- install/tpl/mysql-virtual_outgoing_bcc.cf.master | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/tpl/mysql-virtual_outgoing_bcc.cf.master b/install/tpl/mysql-virtual_outgoing_bcc.cf.master index eafd098a3f..19b235fcf5 100644 --- a/install/tpl/mysql-virtual_outgoing_bcc.cf.master +++ b/install/tpl/mysql-virtual_outgoing_bcc.cf.master @@ -8,9 +8,9 @@ query = SELECT sender_cc FROM ( UNION SELECT SUBSTRING_INDEX(u.sender_cc, ',', 1) AS sender_cc FROM mail_user u, mail_forwarding f - WHERE f.destination REGEXP CONCAT( '(^|\\n)[[:blank:]]*,?[[:blank:]]*', + WHERE f.destination REGEXP CONCAT( '((^|\\n)[[:blank:]]*,?|[[:alnum:]][[:blank:]]*,)[[:blank:]]*', REPLACE( REPLACE(u.email, '+', '\\+'), '.', '\\.' ), - '[[:blank:]]*,?[[:blank:]]*(\\r?\\n|$)' ) + '[[:blank:]]*(,[[:blank:]]*[[:alnum:]]|,?[[:blank:]]*(\\r?\\n|$))' ) AND u.disablesmtp = 'n' AND u.sender_cc != '' AND u.server_id = {server_id} AND f.source = '%s' AND f.allow_send_as = 'y' AND f.active = 'y' AND f.server_id = {server_id} ) table1 WHERE sender_cc != '' LIMIT 1 -- GitLab From b63fa47694fe3a0f4b002b7d426c12862c82bf50 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 25 Jul 2020 19:28:06 +0200 Subject: [PATCH 0346/1368] Set DirectoryIndex --- server/plugins-available/apache2_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 174228eb48..0153b2597d 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1841,7 +1841,7 @@ class apache2_plugin { if($data['new']['stats_type'] != '') { 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\nDirectoryIndex index.php\nHeader unset Content-Security-Policy"; + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user\nDirectoryIndex index.html index.htm index.php\nHeader unset Content-Security-Policy"; $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); -- GitLab From 5bbacaa1367637fe86716432c29d48facb76084d Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 25 Jul 2020 19:35:26 +0200 Subject: [PATCH 0347/1368] Set DirectoryIndex - index.html and index.php --- server/plugins-available/apache2_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 0153b2597d..ea85c51a2b 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1841,7 +1841,7 @@ class apache2_plugin { if($data['new']['stats_type'] != '') { 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\nDirectoryIndex index.html index.htm index.php\nHeader unset Content-Security-Policy"; + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user\nDirectoryIndex index.html index.php\nHeader unset Content-Security-Policy"; $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); -- GitLab From 61eac82c2b579b94eb1152ce52285dc681a99214 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 25 Jul 2020 19:42:28 +0200 Subject: [PATCH 0348/1368] Add CSP for /stats --- server/conf/nginx_vhost.conf.master | 1 + 1 file changed, 1 insertion(+) diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index ce245787a5..3fc50cc108 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -168,6 +168,7 @@ server { index index.html index.php; auth_basic "Members Only"; auth_basic_user_file ; + add_header Content-Security-Policy "default-src * 'self' 'unsafe-inline';"; } location ^~ /awstats-icon { -- GitLab From ea7a3207063f002c37f435b601ddda47e1a5c879 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 7 Feb 2020 16:02:23 +0100 Subject: [PATCH 0349/1368] Draft info section to site Edit form to show alias/sub domains --- interface/web/sites/templates/web_vhost_domain_edit.htm | 9 ++++++++- interface/web/sites/web_vhost_domain_edit.php | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index e39b889d4c..af55ac96e3 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -9,7 +9,14 @@ {tmpl_hook name="begin_form"} - + + + Children: +
      +
    • {tmpl_var name='type'}: {tmpl_var name='domain'}
    • +
    +
    +
    diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 41b40784c0..f8eb709972 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -960,6 +960,10 @@ class page_action extends tform_actions { function onShowEdit() { global $app; if($app->tform->checkPerm($this->id, 'riud')) $app->tform->formDef['tabs']['domain']['readonly'] = false; + $sql = "SELECT domain, type FROM web_domain WHERE (type='alias' OR type='subdomain') AND parent_domain_id = ?"; + $subs = $app->db->queryAllRecords($sql, $this->id); + $app->tpl->setLoop('web_aliasdomains_info', $subs); + parent::onShowEdit(); } -- GitLab From 18198f68d5b45f11728943c284cd46dd6843b367 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sun, 26 Jul 2020 20:16:50 +0200 Subject: [PATCH 0350/1368] Add link --- interface/web/sites/templates/web_vhost_domain_edit.htm | 6 ++++-- interface/web/sites/web_vhost_domain_edit.php | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index af55ac96e3..8dec8d8e05 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -9,11 +9,13 @@ {tmpl_hook name="begin_form"} - + Children:
    diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index f8eb709972..31985b7992 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -960,7 +960,7 @@ class page_action extends tform_actions { function onShowEdit() { global $app; if($app->tform->checkPerm($this->id, 'riud')) $app->tform->formDef['tabs']['domain']['readonly'] = false; - $sql = "SELECT domain, type FROM web_domain WHERE (type='alias' OR type='subdomain') AND parent_domain_id = ?"; + $sql = "SELECT domain_id, domain, type FROM web_domain WHERE (type='alias' OR type='subdomain') AND parent_domain_id = ?"; $subs = $app->db->queryAllRecords($sql, $this->id); $app->tpl->setLoop('web_aliasdomains_info', $subs); -- GitLab From 867ef2b483bdeb5e852ec7e9885becb3780978e5 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sun, 26 Jul 2020 20:19:14 +0200 Subject: [PATCH 0351/1368] translation --- interface/web/sites/lib/lang/en_web_vhost_domain.lng | 1 + interface/web/sites/templates/web_vhost_domain_edit.htm | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 497fcd1993..b400f7ac3a 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -158,6 +158,7 @@ $wb['https_port_error_regex'] = 'HTTPS Port invalid.'; $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; +$wb['dependent_domains_txt'] = 'Dependent domains'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index 8dec8d8e05..9a622b01f0 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -11,7 +11,7 @@ {tmpl_hook name="begin_form"} - Children: + {tmpl_var name='dependent_domains_txt'}:
    • {tmpl_var name='type'}: {tmpl_var name='domain'}
    • -- GitLab From a7f5427abc187217edf8d73627e99663fc5d60c2 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sun, 26 Jul 2020 21:27:07 +0200 Subject: [PATCH 0352/1368] Fix type context --- interface/web/sites/templates/web_vhost_domain_edit.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index 9a622b01f0..e6f05d29b1 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -14,7 +14,7 @@ {tmpl_var name='dependent_domains_txt'}:
      -- GitLab From d3c8533b94592bb36c6b2fa2e7375c2e612caaaf Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Mon, 27 Jul 2020 12:24:52 +0200 Subject: [PATCH 0353/1368] backported GoAccess code --- .../web/sites/form/web_vhost_domain.tform.php | 2 +- server/conf/goaccess_index.php.master | 73 ++++++ .../lib/classes/cron.d/150-goaccess.inc.php | 212 ++++++++++++++++++ .../plugins-available/apache2_plugin.inc.php | 67 ++++++ 4 files changed, 353 insertions(+), 1 deletion(-) create mode 100644 server/conf/goaccess_index.php.master create mode 100644 server/lib/classes/cron.d/150-goaccess.inc.php diff --git a/interface/web/sites/form/web_vhost_domain.tform.php b/interface/web/sites/form/web_vhost_domain.tform.php index 7da71281cf..aa02dfe96c 100644 --- a/interface/web/sites/form/web_vhost_domain.tform.php +++ b/interface/web/sites/form/web_vhost_domain.tform.php @@ -629,7 +629,7 @@ $form["tabs"]['stats'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => 'awstats', - 'value' => array('webalizer' => 'Webalizer', 'awstats' => 'AWStats', '' => 'None') + 'value' => array('awstats' => 'AWStats', 'goaccess' => 'GoAccess', 'webalizer' => 'Webalizer','' => 'None') ), //################################# // END Datatable fields diff --git a/server/conf/goaccess_index.php.master b/server/conf/goaccess_index.php.master new file mode 100644 index 0000000000..d0a8bf3c84 --- /dev/null +++ b/server/conf/goaccess_index.php.master @@ -0,0 +1,73 @@ +function load_content(url){var iframe = document.getElementById(\"content\");iframe.src = url;}\n"; + +if ($handle = opendir('.')) +{ + while(false !== ($file = readdir($handle))) + { + if (substr($file,0,1) != "." && is_dir($file)) + { + $orderkey = substr($file,0,4).substr($file,5,2); + if (substr($file,5,2) < 10 ) + { + $orderkey = substr($file,0,4)."0".substr($file,5,2); + } + $goaprev[$orderkey] = $file; + } + } + + $month = date("n"); + $year = date("Y"); + + if (date("d") == 1) + { + $month = date("m")-1; + if (date("m") == 1) + { + $year = date("Y")-1; + $month = "12"; + } + } + + $current = $year.$month; + if ( $month < 10 ) { + $current = $year."0".$month; + } + $goaprev[$current] = $year."-".$month; + + closedir($handle); +} + +arsort($goaprev); + +$options = ""; +foreach ($goaprev as $key => $value) +{ + + if(file_exists($value.'/awsindex.html') && file_exists($value.'/goaindex.html')) { + $goaccessindex = 'goaindex.html'; + } elseif(file_exists($value.'/awsindex.html') && !file_exists($value.'/goaindex.html')) { + $goaccessindex = 'awsindex.html'; + } else { + $goaccessindex = 'goaindex.html'; + } + + if($key == $current) $options .= "\n"; + else $options .= "\n"; + +} +$goaccessindex = 'goaindex.html'; + +$html = "\n\n\nStats\n"; +$html .= "\n\n\n"; +$html .= $script; +$html .= "
      {$yearmonth_text}\n"; +$html .= "\n
      \n\n"; +$html .= ""; +echo $html; +?> diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php new file mode 100644 index 0000000000..fe9e565f5f --- /dev/null +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -0,0 +1,212 @@ +db->queryAllRecords($sql, $conf['server_id']); + + $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); + + $goaccess_conf_dir = '/etc/'; + $goaccess_conf_main = $goaccess_conf_dir . 'goaccess.conf'; + + if(!file_exists($goaccess_conf_main) || !isset($goaccess_conf_main)) + { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in ".$goaccess_conf_dir.".", LOGLEVEL_WARN); + } + + /* Check wether the goaccess binary is in path */ + system('type goaccess', $retval); + if ($retval === 0) { + + foreach($records as $rec) { + $yesterday = date('Ymd', strtotime("-1 day", time())); + + $log_folder = 'log'; + + if($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') { + $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']); + $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $rec['domain']); + if($subdomain_host == '') $subdomain_host = 'web'.$rec['domain_id']; + $log_folder .= '/' . $subdomain_host; + unset($tmp); + } + + $logfile = escapeshellcmd($rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'); + + if(!@is_file($logfile)) { + $logfile = escapeshellcmd($rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log.gz'); + if(!@is_file($logfile)) { + continue; + } + } + + $web_folder = (($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') ? $rec['web_folder'] : 'web'); + $domain = escapeshellcmd($rec['domain']); + $statsdir = escapeshellcmd($rec['document_root'].'/'.$web_folder.'/stats'); + $goaccess_conf = escapeshellcmd($rec['document_root'].'/log/goaccess.conf'); + + /* + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originally, with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + */ + + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); + } elseif(!file_exists($goaccess_conf)) { + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + */ + copy($goaccess_conf_main, $goaccess_conf); + file_put_contents($goaccess_conf, preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", file_get_contents($goaccess_conf))); + } + + /* Update the primary domain name in the title, it could occasionally change */ + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $goaccess_content = file_get_contents($goaccess_conf); + file_put_contents($goaccess_conf, preg_replace('/^(#)?html-report-title(.*)?/m', "html-report-title $domain", file_get_contents($goaccess_conf))); + } + + + + if(!@is_dir($statsdir)) mkdir($statsdir); + $username = escapeshellcmd($rec['system_user']); + $groupname = escapeshellcmd($rec['system_group']); + $docroot = $rec['document_root']; + + $goa_db_dir = $docroot.'/'.$web_folder.'/stats/.db/'; + $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; + if(!@is_dir($goa_db_dir)) mkdir($goa_db_dir); + + if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + + + chown($statsdir, $username); + chgrp($statsdir, $groupname); + + $goamonth = date("n"); + $goayear = date("Y"); + + if (date("d") == 1) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } + } + + + if (date("d") == 2) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } + + $statsdirold = $statsdir."/".$goayear."-".$goamonth."/"; + + if(!is_dir($statsdirold)) { + mkdir($statsdirold); + } + + rename($goa_db_dir, $statsdirold.'db'); + mkdir($goa_db_dir); + + $files = scandir($statsdir); + foreach ($files as $file) { + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + } + } + + $app->system->exec_safe("goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $logfile, $goaccess_conf, $goa_db_dir, $output_html); + + if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } else { + copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } + } + + $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); + + + if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); + chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); + } + + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + + } + } else { + $app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_WARN); + } + + parent::onRunJob(); + } + + /* this function is optional if it contains no custom code */ + public function onAfterRun() { + global $app; + + parent::onAfterRun(); + } + +} + +?> diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 26f2948256..1bebab55f4 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1863,6 +1863,12 @@ class apache2_plugin { $this->awstats_update($data, $web_config); } + //* Create GoAccess configuration + if($data['new']['stats_type'] == 'goaccess' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) { + $this->goaccess_update($data, $web_config); + } + + //* Remove Stats-Folder when Statistics set to none if($data['new']['stats_type'] == '' && ($data['new']['type'] == 'vhost' || $data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias')) { $app->file->removeDirectory($data['new']['document_root'].'/web/stats'); @@ -2973,6 +2979,67 @@ class apache2_plugin { } } + //* Update the GoAccess configuration file + private function goaccess_update ($data, $web_config) { + global $app; + + $web_folder = $data['new']['web_folder']; + if($data['new']['type'] == 'vhost') $web_folder = 'web'; + + $goaccess_conf_dir = '/etc/'; + $goaccess_conf_main = $goaccess_conf_dir.'goaccess.conf'; + + if(!is_dir($data['new']['document_root']."/" . $web_folder . "/stats/")) mkdir($data['new']['document_root']."/" . $web_folder . "/stats/.db"); + $goaccess_conf = escapeshellcmd($data['new']['document_root'].'/log/goaccess.conf'); + + + /* + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + */ + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); + } elseif(!file_exists($goaccess_conf)) { + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + */ + copy($goaccess_conf_main, $goaccess_conf); + file_put_contents($goaccess_conf, preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", file_get_contents($goaccess_conf))); + } + + if(file_exists($goaccess_conf)) { + $domain = escapeshellcmd($data['new']['domain']); + file_put_contents($goaccess_conf, preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", file_get_contents($goaccess_conf))); + } + + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $app->log('Created GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } else { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in ".$goaccess_conf_dir.".", LOGLEVEL_WARN); + } + + if(is_file($data['new']['document_root']."/" . $web_folder . "/stats/index.html")) $app->system->unlink($data['new']['document_root']."/" . $web_folder . "/stats/index.html"); + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } else { + $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } + } + + //* Delete the GoAccess configuration file + private function goaccess_delete ($data, $web_config) { + global $app; + + $goaccess_conf = escapeshellcmd($data['new']['document_root'].'/log/goaccess.conf'); + + if ( @is_file($goaccess_conf) ) { + $app->system->unlink($goaccess_conf); + $app->log('Removed GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } + } + + //* Delete the awstats configuration file private function awstats_delete ($data, $web_config) { global $app; -- GitLab From fa064a7cab3f1c02a8e0bb4805c97f742ae7d8bb Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Mon, 27 Jul 2020 12:27:13 +0200 Subject: [PATCH 0354/1368] missed nginx_plugin code in previous commit --- server/plugins-available/nginx_plugin.inc.php | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index ad6fc5f07b..d02811ad93 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -2532,6 +2532,71 @@ class nginx_plugin { //$app->services->restartServiceDelayed('httpd','reload'); } + + + //* Update the GoAccess configuration file + private function goaccess_update ($data, $web_config) { + global $app; + + $web_folder = $data['new']['web_folder']; + if($data['new']['type'] == 'vhost') $web_folder = 'web'; + + $goaccess_conf_dir = '/etc/'; + $goaccess_conf_main = $goaccess_conf_dir.'goaccess.conf'; + + if(!is_dir($data['new']['document_root']."/" . $web_folder . "/stats/")) mkdir($data['new']['document_root']."/" . $web_folder . "/stats/.db"); + $goaccess_conf = escapeshellcmd($data['new']['document_root'].'/log/goaccess.conf'); + + + /* + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + */ + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); + } elseif(!file_exists($goaccess_conf)) { + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + */ + copy($goaccess_conf_main, $goaccess_conf); + file_put_contents($goaccess_conf, preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", file_get_contents($goaccess_conf))); + } + + if(file_exists($goaccess_conf)) { + $domain = escapeshellcmd($data['new']['domain']); + file_put_contents($goaccess_conf, preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", file_get_contents($goaccess_conf))); + } + + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $app->log('Created GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } else { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in ".$goaccess_conf_dir.".", LOGLEVEL_WARN); + } + + if(is_file($data['new']['document_root']."/" . $web_folder . "/stats/index.html")) $app->system->unlink($data['new']['document_root']."/" . $web_folder . "/stats/index.html"); + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + $app->system->copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } else { + $app->system->copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $data['new']['document_root']."/" . $web_folder . "/stats/index.php"); + } + } + + //* Delete the GoAccess configuration file + private function goaccess_delete ($data, $web_config) { + global $app; + + $goaccess_conf = escapeshellcmd($data['new']['document_root'].'/log/goaccess.conf'); + + if ( @is_file($goaccess_conf) ) { + $app->system->unlink($goaccess_conf); + $app->log('Removed GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); + } + } + + + + //* Update the awstats configuration file private function awstats_update ($data, $web_config) { global $app; -- GitLab From 49779a62a20fb5a2293de771040b041431f9f82f Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 27 Jul 2020 12:48:43 +0200 Subject: [PATCH 0355/1368] Combine user and interface settings (#5626) --- .../web/tools/form/user_settings.tform.php | 78 +++++++++++++++ .../web/tools/lib/lang/ar_usersettings.lng | 3 + .../web/tools/lib/lang/bg_usersettings.lng | 3 + .../web/tools/lib/lang/br_usersettings.lng | 3 + .../web/tools/lib/lang/ca_usersettings.lng | 3 + .../web/tools/lib/lang/cz_usersettings.lng | 3 + .../web/tools/lib/lang/de_usersettings.lng | 3 + .../web/tools/lib/lang/dk_usersettings.lng | 3 + .../web/tools/lib/lang/el_usersettings.lng | 2 + .../web/tools/lib/lang/en_usersettings.lng | 7 ++ .../web/tools/lib/lang/es_usersettings.lng | 3 + .../web/tools/lib/lang/fi_usersettings.lng | 3 + .../web/tools/lib/lang/fr_usersettings.lng | 3 + .../web/tools/lib/lang/hr_usersettings.lng | 3 + .../web/tools/lib/lang/hu_usersettings.lng | 3 + .../web/tools/lib/lang/id_usersettings.lng | 3 + .../web/tools/lib/lang/it_usersettings.lng | 3 + .../web/tools/lib/lang/ja_usersettings.lng | 3 + .../web/tools/lib/lang/nl_usersettings.lng | 3 + .../web/tools/lib/lang/pl_usersettings.lng | 3 + .../web/tools/lib/lang/pt_usersettings.lng | 3 + .../web/tools/lib/lang/ro_usersettings.lng | 3 + .../web/tools/lib/lang/ru_usersettings.lng | 5 + .../web/tools/lib/lang/se_usersettings.lng | 3 + .../web/tools/lib/lang/sk_usersettings.lng | 3 + .../web/tools/lib/lang/tr_usersettings.lng | 3 + interface/web/tools/lib/module.conf.php | 23 +---- .../web/tools/templates/user_settings.htm | 99 +++++++++++-------- interface/web/tools/user_settings.php | 34 ++++++- 29 files changed, 249 insertions(+), 65 deletions(-) diff --git a/interface/web/tools/form/user_settings.tform.php b/interface/web/tools/form/user_settings.tform.php index 7daa1a7b84..a696d75339 100644 --- a/interface/web/tools/form/user_settings.tform.php +++ b/interface/web/tools/form/user_settings.tform.php @@ -92,6 +92,46 @@ while ($file = @readdir($handle)) { } } } +//* Pick out modules +//* TODO: limit to activated modules of the user +$modules_list = array(); +if($_SESSION["s"]["user"]["typ"] == 'admin') { + $handle = @opendir(ISPC_WEB_PATH); + while ($file = @readdir($handle)) { + if ($file != '.' && $file != '..') { + if(@is_dir(ISPC_WEB_PATH."/$file")) { + if(is_file(ISPC_WEB_PATH."/$file/lib/module.conf.php") and $file != 'login' && $file != 'designer' && $file != 'mailuser') { + $modules_list[$file] = $file; + } + } + } + } +} else { + $tmp = $app->db->queryOneRecord("SELECT * FROM sys_user where username = ?", $_SESSION["s"]["user"]['username']); + $modules = $tmp['modules']; + //$modules = $conf['interface_modules_enabled']; + if($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { + $modules .= ',client'; + } + $tmp = explode(',', $modules); + foreach($tmp as $m) { + $modules_list[$m] = $m; + } +} + +//* Load themes +$themes_list = array(); +$handle = @opendir(ISPC_THEMES_PATH); +while ($file = @readdir($handle)) { + if (substr($file, 0, 1) != '.') { + if(@is_dir(ISPC_THEMES_PATH."/$file")) { + if(!file_exists(ISPC_THEMES_PATH."/$file/ispconfig_version") || (@file_exists(ISPC_THEMES_PATH."/$file/ispconfig_version") && trim(@file_get_contents(ISPC_THEMES_PATH."/$file/ispconfig_version")) == ISPC_APP_VERSION)) { + $themes_list[$file] = $file; + } + } + } +} + $form['tabs']['users'] = array ( 'title' => 'Settings', @@ -141,6 +181,44 @@ $form['tabs']['users'] = array ( 'maxlength' => '2', 'rows' => '', 'cols' => '' + ), + 'startmodule' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'startmodule_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-z0-9\_]{0,64}$/', + 'errmsg'=> 'startmodule_regex'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => '', + 'value' => $modules_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' + ), + 'app_theme' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'SELECT', + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'app_theme_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^[a-z0-9\_]{0,64}$/', + 'errmsg'=> 'app_theme_regex'), + ), + 'regex' => '', + 'errmsg' => '', + 'default' => 'default', + 'value' => $themes_list, + 'separator' => '', + 'width' => '30', + 'maxlength' => '255', + 'rows' => '', + 'cols' => '' ) //################################# // ENDE Datenbankfelder diff --git a/interface/web/tools/lib/lang/ar_usersettings.lng b/interface/web/tools/lib/lang/ar_usersettings.lng index 4ac506ab77..c05b94e76e 100644 --- a/interface/web/tools/lib/lang/ar_usersettings.lng +++ b/interface/web/tools/lib/lang/ar_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/bg_usersettings.lng b/interface/web/tools/lib/lang/bg_usersettings.lng index 838053f563..c30dcf3701 100644 --- a/interface/web/tools/lib/lang/bg_usersettings.lng +++ b/interface/web/tools/lib/lang/bg_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/br_usersettings.lng b/interface/web/tools/lib/lang/br_usersettings.lng index cb3ae2dc4f..e254e81a4f 100644 --- a/interface/web/tools/lib/lang/br_usersettings.lng +++ b/interface/web/tools/lib/lang/br_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Gerar Senha'; $wb['repeat_password_txt'] = 'Repetir Senha'; $wb['password_mismatch_txt'] = 'As senhas não coincidem.'; $wb['password_match_txt'] = 'As senhas coincidem.'; +$wb['language_txt'] = 'Idioma'; +$wb['startmodule_txt'] = 'Módulo Inicial'; +$wb['app_theme_txt'] = 'Tema'; ?> diff --git a/interface/web/tools/lib/lang/ca_usersettings.lng b/interface/web/tools/lib/lang/ca_usersettings.lng index fa40272aa0..4705660b9e 100644 --- a/interface/web/tools/lib/lang/ca_usersettings.lng +++ b/interface/web/tools/lib/lang/ca_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Générer mot de passe'; $wb['repeat_password_txt'] = 'Retaper le mot de passe'; $wb['password_mismatch_txt'] = 'Les mots de passe ne correspondent pas.'; $wb['password_match_txt'] = 'Les mots de passe correspondent.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Page d\'accueil'; +$wb['app_theme_txt'] = 'Interface'; ?> diff --git a/interface/web/tools/lib/lang/cz_usersettings.lng b/interface/web/tools/lib/lang/cz_usersettings.lng index ab76b2261d..f447299e08 100644 --- a/interface/web/tools/lib/lang/cz_usersettings.lng +++ b/interface/web/tools/lib/lang/cz_usersettings.lng @@ -9,4 +9,7 @@ $wb['repeat_password_txt'] = 'Opakujte heslo'; $wb['password_mismatch_txt'] = 'Hesla se neshodují.'; $wb['password_match_txt'] = 'Hesla se shodují.'; $wb['password_txt'] = 'Heslo'; +$wb['language_txt'] = 'Jazyk'; +$wb['startmodule_txt'] = 'Výchozí modul po přihlášení'; +$wb['app_theme_txt'] = 'Výchozí grafické téma'; ?> diff --git a/interface/web/tools/lib/lang/de_usersettings.lng b/interface/web/tools/lib/lang/de_usersettings.lng index c643d38ff4..dd5fefffae 100644 --- a/interface/web/tools/lib/lang/de_usersettings.lng +++ b/interface/web/tools/lib/lang/de_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Passwort erzeugen'; $wb['repeat_password_txt'] = 'Passwort wiederholen'; $wb['password_mismatch_txt'] = 'Die Passwörter stimmen nicht überein.'; $wb['password_match_txt'] = 'Die Passwörter stimmen überein.'; +$wb['language_txt'] = 'Sprache'; +$wb['startmodule_txt'] = 'Startmodul'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/dk_usersettings.lng b/interface/web/tools/lib/lang/dk_usersettings.lng index 9398f2626a..341d9db757 100644 --- a/interface/web/tools/lib/lang/dk_usersettings.lng +++ b/interface/web/tools/lib/lang/dk_usersettings.lng @@ -9,4 +9,7 @@ $wb['repeat_password_txt'] = 'Gentage Adgangskode'; $wb['password_mismatch_txt'] = 'Adgangskoderne stemmer ikke overens.'; $wb['password_match_txt'] = 'Adgangskoderne stemmer overens.'; $wb['password_txt'] = 'Password'; +$wb['language_txt'] = 'Sprog'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/el_usersettings.lng b/interface/web/tools/lib/lang/el_usersettings.lng index 57e8bcb17a..68ddcd657c 100644 --- a/interface/web/tools/lib/lang/el_usersettings.lng +++ b/interface/web/tools/lib/lang/el_usersettings.lng @@ -9,4 +9,6 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/en_usersettings.lng b/interface/web/tools/lib/lang/en_usersettings.lng index 79c7437cb1..601ae420ff 100644 --- a/interface/web/tools/lib/lang/en_usersettings.lng +++ b/interface/web/tools/lib/lang/en_usersettings.lng @@ -9,4 +9,11 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb["language_txt"] = 'Language'; +$wb["startmodule_txt"] = 'Startmodule'; +$wb["app_theme_txt"] = 'Design'; +$wb['startmodule_empty'] = 'Startmodule empty.'; +$wb['startmodule_regex'] = 'Invalid chars in Startmodule.'; +$wb['app_theme_empty'] = 'App theme empty.'; +$wb['app_theme_regex'] = 'Invalid chars in App theme.'; ?> diff --git a/interface/web/tools/lib/lang/es_usersettings.lng b/interface/web/tools/lib/lang/es_usersettings.lng index 9b2de57bfb..43a181a11c 100644 --- a/interface/web/tools/lib/lang/es_usersettings.lng +++ b/interface/web/tools/lib/lang/es_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generar contraseña'; $wb['repeat_password_txt'] = 'Repetir contraseña'; $wb['password_mismatch_txt'] = 'Las contraseñas no coinciden.'; $wb['password_match_txt'] = 'Las contraseñas coinciden.'; +$wb['language_txt'] = 'Idioma'; +$wb['startmodule_txt'] = 'Módulo de inicio'; +$wb['app_theme_txt'] = 'Diseño'; ?> diff --git a/interface/web/tools/lib/lang/fi_usersettings.lng b/interface/web/tools/lib/lang/fi_usersettings.lng index 8267c8117a..91d7173953 100644 --- a/interface/web/tools/lib/lang/fi_usersettings.lng +++ b/interface/web/tools/lib/lang/fi_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/fr_usersettings.lng b/interface/web/tools/lib/lang/fr_usersettings.lng index bafccd3b97..b398e76e35 100644 --- a/interface/web/tools/lib/lang/fr_usersettings.lng +++ b/interface/web/tools/lib/lang/fr_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Générer un mot de passe'; $wb['repeat_password_txt'] = 'Répéter le mot de passe'; $wb['password_mismatch_txt'] = 'Les mots de passe ne correspondent pas.'; $wb['password_match_txt'] = 'Les mots de passe correspondent.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/hr_usersettings.lng b/interface/web/tools/lib/lang/hr_usersettings.lng index 50759d4883..b707cce4da 100644 --- a/interface/web/tools/lib/lang/hr_usersettings.lng +++ b/interface/web/tools/lib/lang/hr_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generiraj šifru'; $wb['repeat_password_txt'] = 'Ponovi šifru'; $wb['password_mismatch_txt'] = 'Šifre nisu identične.'; $wb['password_match_txt'] = 'Šifre su identične.'; +$wb['language_txt'] = 'Jezik'; +$wb['startmodule_txt'] = 'Početna stranica'; +$wb['app_theme_txt'] = 'Tema'; ?> diff --git a/interface/web/tools/lib/lang/hu_usersettings.lng b/interface/web/tools/lib/lang/hu_usersettings.lng index 49aa75537f..2a89acf5b5 100644 --- a/interface/web/tools/lib/lang/hu_usersettings.lng +++ b/interface/web/tools/lib/lang/hu_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/id_usersettings.lng b/interface/web/tools/lib/lang/id_usersettings.lng index 7b1bc225ca..760cfe75f2 100644 --- a/interface/web/tools/lib/lang/id_usersettings.lng +++ b/interface/web/tools/lib/lang/id_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/it_usersettings.lng b/interface/web/tools/lib/lang/it_usersettings.lng index e75e8d28d2..a1ad8eba87 100644 --- a/interface/web/tools/lib/lang/it_usersettings.lng +++ b/interface/web/tools/lib/lang/it_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/ja_usersettings.lng b/interface/web/tools/lib/lang/ja_usersettings.lng index 443a451054..291aa94537 100644 --- a/interface/web/tools/lib/lang/ja_usersettings.lng +++ b/interface/web/tools/lib/lang/ja_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/nl_usersettings.lng b/interface/web/tools/lib/lang/nl_usersettings.lng index 0a95f7ffa9..909df9dbec 100644 --- a/interface/web/tools/lib/lang/nl_usersettings.lng +++ b/interface/web/tools/lib/lang/nl_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Taal'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/pl_usersettings.lng b/interface/web/tools/lib/lang/pl_usersettings.lng index 45081f681b..64396df240 100644 --- a/interface/web/tools/lib/lang/pl_usersettings.lng +++ b/interface/web/tools/lib/lang/pl_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Wygeneruj hasło'; $wb['repeat_password_txt'] = 'Powtórz hasło'; $wb['password_mismatch_txt'] = 'Hasła się nie zgadzają'; $wb['password_match_txt'] = 'Hasła się zgadzają'; +$wb['language_txt'] = 'Język'; +$wb['startmodule_txt'] = 'Moduł startowy'; +$wb['app_theme_txt'] = 'Temat'; ?> diff --git a/interface/web/tools/lib/lang/pt_usersettings.lng b/interface/web/tools/lib/lang/pt_usersettings.lng index 81fd824d30..4925a3f728 100644 --- a/interface/web/tools/lib/lang/pt_usersettings.lng +++ b/interface/web/tools/lib/lang/pt_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/ro_usersettings.lng b/interface/web/tools/lib/lang/ro_usersettings.lng index fae890fab6..8c43550f33 100644 --- a/interface/web/tools/lib/lang/ro_usersettings.lng +++ b/interface/web/tools/lib/lang/ro_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/ru_usersettings.lng b/interface/web/tools/lib/lang/ru_usersettings.lng index 609b69fdb0..ffa3f3bf03 100644 --- a/interface/web/tools/lib/lang/ru_usersettings.lng +++ b/interface/web/tools/lib/lang/ru_usersettings.lng @@ -9,4 +9,9 @@ $wb['generate_password_txt'] = 'Создать пароль'; $wb['repeat_password_txt'] = 'Повторить пароль'; $wb['password_mismatch_txt'] = 'Пароли не совпадают.'; $wb['password_match_txt'] = 'Эти пароли совпадают.'; +$wb['interface_head_txt'] = 'Настройки интерфейса'; +$wb['interface_desc_txt'] = 'Измените свой интерфейс'; +$wb['language_txt'] = 'Язык'; +$wb['startmodule_txt'] = 'Стартовый модуль'; +$wb['app_theme_txt'] = 'Тема'; ?> diff --git a/interface/web/tools/lib/lang/se_usersettings.lng b/interface/web/tools/lib/lang/se_usersettings.lng index 4461fff496..f6de2dc4ee 100644 --- a/interface/web/tools/lib/lang/se_usersettings.lng +++ b/interface/web/tools/lib/lang/se_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generera lösenord'; $wb['repeat_password_txt'] = 'Upprepa lösenord'; $wb['password_mismatch_txt'] = 'Lösenorden matchar inte'; $wb['password_match_txt'] = 'Lösenorden matchar'; +$wb['language_txt'] = 'Språk'; +$wb['startmodule_txt'] = 'Startmodul'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/sk_usersettings.lng b/interface/web/tools/lib/lang/sk_usersettings.lng index 4c8bcb900e..e00f5e664b 100644 --- a/interface/web/tools/lib/lang/sk_usersettings.lng +++ b/interface/web/tools/lib/lang/sk_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Generate Password'; $wb['repeat_password_txt'] = 'Repeat Password'; $wb['password_mismatch_txt'] = 'The passwords do not match.'; $wb['password_match_txt'] = 'The passwords do match.'; +$wb['language_txt'] = 'Language'; +$wb['startmodule_txt'] = 'Startmodule'; +$wb['app_theme_txt'] = 'Design'; ?> diff --git a/interface/web/tools/lib/lang/tr_usersettings.lng b/interface/web/tools/lib/lang/tr_usersettings.lng index fa2eff63d7..a1fd7c56d4 100644 --- a/interface/web/tools/lib/lang/tr_usersettings.lng +++ b/interface/web/tools/lib/lang/tr_usersettings.lng @@ -9,4 +9,7 @@ $wb['generate_password_txt'] = 'Parola Üret'; $wb['repeat_password_txt'] = 'Parola Onayı'; $wb['password_mismatch_txt'] = 'Parola ile onayı aynı değil.'; $wb['password_match_txt'] = 'Parola ile onayı aynı.'; +$wb['language_txt'] = 'Dil'; +$wb['startmodule_txt'] = 'Başlangıç modülü'; +$wb['app_theme_txt'] = 'Tasarım'; ?> diff --git a/interface/web/tools/lib/module.conf.php b/interface/web/tools/lib/module.conf.php index 617ab0b6cd..5911cdbebf 100644 --- a/interface/web/tools/lib/module.conf.php +++ b/interface/web/tools/lib/module.conf.php @@ -5,7 +5,7 @@ global $conf; $module['name'] = 'tools'; $module['title'] = 'top_menu_tools'; $module['template'] = 'module.tpl.htm'; -$module['startpage'] = 'tools/index.php'; +$module['startpage'] = 'tools/user_settings.php'; $module['tab_width'] = '60'; $module['order'] = '80'; @@ -13,7 +13,7 @@ $module['order'] = '80'; //**** Change User password $items = array(); -$items[] = array( 'title' => 'Password and Language', +$items[] = array( 'title' => 'User Settings', 'target' => 'content', 'link' => 'tools/user_settings.php', 'html_id' => 'user_settings'); @@ -24,23 +24,4 @@ $module['nav'][] = array( 'title' => 'User Settings', 'items' => $items); unset($items); - -//**** Change interface settings + load settings page of the activated theme -$items = array(); - -$items[] = array( 'title' => 'Interface', - 'target' => 'content', - 'link' => 'tools/interface_settings.php', - 'html_id' => 'interface_settings'); - -if(file_exists(ISPC_WEB_PATH.'/tools/lib/interface.d/tpl_' . $_SESSION['s']['user']['app_theme'] . '.menu.php')) include_once ISPC_WEB_PATH.'/tools/lib/interface.d/tpl_' . $_SESSION['s']['user']['app_theme'] . '.menu.php'; - -$module['nav'][] = array( 'title' => 'Interface', - 'open' => 1, - 'items' => $items); - -unset($items); - - - ?> diff --git a/interface/web/tools/templates/user_settings.htm b/interface/web/tools/templates/user_settings.htm index 4fa1c9de34..a620f419c5 100644 --- a/interface/web/tools/templates/user_settings.htm +++ b/interface/web/tools/templates/user_settings.htm @@ -1,41 +1,58 @@ -
      - -
      -
      - - - - -
      -
      -
      -
      - -
      -
      -   -
      -
      -
      - -
      -
      -
      - - -
      -
      -
      - -
      -
      - - - - -
      - - -
      +
      + +
      +
      + + + + +
      +
      +
      +
      + +
      +
      +   +
      +
      +
      + +
      +
      +
      +
      + + +
      +
      +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      + + +
      +
      diff --git a/interface/web/tools/user_settings.php b/interface/web/tools/user_settings.php index 5c3876fb86..03c0b6a7e2 100644 --- a/interface/web/tools/user_settings.php +++ b/interface/web/tools/user_settings.php @@ -86,22 +86,50 @@ class page_action extends tform_actions { if($_POST['passwort'] != $_POST['repeat_password']) { $app->tform->errorMessage = $app->tform->lng('password_mismatch'); } - + $language = $app->functions->check_language($_POST['language']); $_SESSION['s']['user']['language'] = $language; $_SESSION['s']['language'] = $language; } - + function onAfterUpdate() { global $app; - + if($_POST['passwort'] != '') { $tmp_user = $app->db->queryOneRecord("SELECT passwort FROM sys_user WHERE userid = ?", $_SESSION['s']['user']['userid']); $_SESSION['s']['user']['passwort'] = $tmp_user['passwort']; unset($tmp_user); } + $this->updateSessionTheme(); + + if($this->_theme_changed == true) { + // not the best way, but it works + header('Content-Type: text/html'); + print ''; + exit; + } } + var $_theme_changed = false; + function updateSessionTheme() { + global $app, $conf; + + if($this->dataRecord['app_theme'] != 'default') { + $tmp_path = ISPC_THEMES_PATH."/".$this->dataRecord['app_theme']; + if(!@is_dir($tmp_path) || (@file_exists($tmp_path."/ispconfig_version") && trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION)) { + // fall back to default theme if this one is not compatible with current ispc version + $this->dataRecord['app_theme'] = 'default'; + } + } + if($this->dataRecord['app_theme'] != $_SESSION['s']['user']['theme']) $this->_theme_changed = true; + $_SESSION['s']['theme'] = $this->dataRecord['app_theme']; + $_SESSION['s']['user']['theme'] = $_SESSION['s']['theme']; + $_SESSION['s']['user']['app_theme'] = $_SESSION['s']['theme']; + } + + function onAfterInsert() { + $this->onAfterUpdate(); + } } -- GitLab From 94ba1c2be5a325783be3b432282ab03c1a13c85f Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 27 Jul 2020 12:57:09 +0200 Subject: [PATCH 0356/1368] Remove old interface settings files (#5626) --- .../tools/form/interface_settings.tform.php | 189 ------------------ interface/web/tools/interface_settings.php | 139 ------------- interface/web/tools/lib/lang/ar_interface.lng | 7 - interface/web/tools/lib/lang/bg_interface.lng | 7 - interface/web/tools/lib/lang/br_interface.lng | 7 - interface/web/tools/lib/lang/ca_interface.lng | 7 - interface/web/tools/lib/lang/cz_interface.lng | 7 - interface/web/tools/lib/lang/de_interface.lng | 7 - interface/web/tools/lib/lang/dk_interface.lng | 7 - interface/web/tools/lib/lang/el_interface.lng | 7 - interface/web/tools/lib/lang/en_interface.lng | 11 - interface/web/tools/lib/lang/es_interface.lng | 7 - interface/web/tools/lib/lang/fi_interface.lng | 7 - interface/web/tools/lib/lang/fr_interface.lng | 7 - interface/web/tools/lib/lang/hr_interface.lng | 7 - interface/web/tools/lib/lang/hu_interface.lng | 7 - interface/web/tools/lib/lang/id_interface.lng | 7 - interface/web/tools/lib/lang/it_interface.lng | 7 - interface/web/tools/lib/lang/ja_interface.lng | 7 - interface/web/tools/lib/lang/nl_interface.lng | 7 - interface/web/tools/lib/lang/pl_interface.lng | 7 - interface/web/tools/lib/lang/pt_interface.lng | 7 - interface/web/tools/lib/lang/ro_interface.lng | 7 - interface/web/tools/lib/lang/ru_interface.lng | 7 - interface/web/tools/lib/lang/se_interface.lng | 7 - interface/web/tools/lib/lang/sk_interface.lng | 7 - interface/web/tools/lib/lang/tr_interface.lng | 7 - .../tools/templates/interface_settings.htm | 22 -- 28 files changed, 529 deletions(-) delete mode 100644 interface/web/tools/form/interface_settings.tform.php delete mode 100644 interface/web/tools/interface_settings.php delete mode 100644 interface/web/tools/lib/lang/ar_interface.lng delete mode 100644 interface/web/tools/lib/lang/bg_interface.lng delete mode 100644 interface/web/tools/lib/lang/br_interface.lng delete mode 100644 interface/web/tools/lib/lang/ca_interface.lng delete mode 100644 interface/web/tools/lib/lang/cz_interface.lng delete mode 100644 interface/web/tools/lib/lang/de_interface.lng delete mode 100644 interface/web/tools/lib/lang/dk_interface.lng delete mode 100644 interface/web/tools/lib/lang/el_interface.lng delete mode 100644 interface/web/tools/lib/lang/en_interface.lng delete mode 100644 interface/web/tools/lib/lang/es_interface.lng delete mode 100644 interface/web/tools/lib/lang/fi_interface.lng delete mode 100644 interface/web/tools/lib/lang/fr_interface.lng delete mode 100644 interface/web/tools/lib/lang/hr_interface.lng delete mode 100644 interface/web/tools/lib/lang/hu_interface.lng delete mode 100644 interface/web/tools/lib/lang/id_interface.lng delete mode 100644 interface/web/tools/lib/lang/it_interface.lng delete mode 100644 interface/web/tools/lib/lang/ja_interface.lng delete mode 100644 interface/web/tools/lib/lang/nl_interface.lng delete mode 100644 interface/web/tools/lib/lang/pl_interface.lng delete mode 100644 interface/web/tools/lib/lang/pt_interface.lng delete mode 100644 interface/web/tools/lib/lang/ro_interface.lng delete mode 100644 interface/web/tools/lib/lang/ru_interface.lng delete mode 100644 interface/web/tools/lib/lang/se_interface.lng delete mode 100644 interface/web/tools/lib/lang/sk_interface.lng delete mode 100644 interface/web/tools/lib/lang/tr_interface.lng delete mode 100644 interface/web/tools/templates/interface_settings.htm diff --git a/interface/web/tools/form/interface_settings.tform.php b/interface/web/tools/form/interface_settings.tform.php deleted file mode 100644 index 05eaba9416..0000000000 --- a/interface/web/tools/form/interface_settings.tform.php +++ /dev/null @@ -1,189 +0,0 @@ - 0 id must match with id of current user -$form['auth_preset']['userid'] = 0; -//* 0 = default groupid of the user, > 0 id must match with groupid of current user -$form['auth_preset']['groupid'] = 0; - -//** Permissions are: r = read, i = insert, u = update, d = delete -$form['auth_preset']['perm_user'] = 'riud'; -$form['auth_preset']['perm_group'] = 'riud'; -$form['auth_preset']['perm_other'] = ''; - -//* Pick out modules -//* TODO: limit to activated modules of the user -$modules_list = array(); -if($_SESSION["s"]["user"]["typ"] == 'admin') { - $handle = @opendir(ISPC_WEB_PATH); - while ($file = @readdir($handle)) { - if ($file != '.' && $file != '..') { - if(@is_dir(ISPC_WEB_PATH."/$file")) { - if(is_file(ISPC_WEB_PATH."/$file/lib/module.conf.php") and $file != 'login' && $file != 'designer' && $file != 'mailuser') { - $modules_list[$file] = $file; - } - } - } - } -} else { - $tmp = $app->db->queryOneRecord("SELECT * FROM sys_user where username = ?", $_SESSION["s"]["user"]['username']); - $modules = $tmp['modules']; - //$modules = $conf['interface_modules_enabled']; - if($_SESSION["s"]["user"]["typ"] != 'admin' && $app->auth->has_clients($_SESSION['s']['user']['userid'])) { - $modules .= ',client'; - } - $tmp = explode(',', $modules); - foreach($tmp as $m) { - $modules_list[$m] = $m; - } -} - -//* Languages -$language_list = array(); -$handle = @opendir(ISPC_ROOT_PATH.'/lib/lang'); -while ($file = @readdir($handle)) { - if ($file != '.' && $file != '..') { - if(@is_file(ISPC_ROOT_PATH.'/lib/lang/'.$file) and substr($file, -4, 4) == '.lng') { - $tmp = substr($file, 0, 2); - $language_list[$tmp] = $tmp; - } - } -} - -//* Load themes -$themes_list = array(); -$handle = @opendir(ISPC_THEMES_PATH); -while ($file = @readdir($handle)) { - if (substr($file, 0, 1) != '.') { - if(@is_dir(ISPC_THEMES_PATH."/$file")) { - if(!file_exists(ISPC_THEMES_PATH."/$file/ispconfig_version") || (@file_exists(ISPC_THEMES_PATH."/$file/ispconfig_version") && trim(@file_get_contents(ISPC_THEMES_PATH."/$file/ispconfig_version")) == ISPC_APP_VERSION)) { - $themes_list[$file] = $file; - } - } - } -} - -$form['tabs']['main'] = array ( - 'title' => 'Settings', - 'width' => 80, - 'template' => 'templates/interface_settings.htm', - 'fields' => array ( - //################################# - // Beginn Datenbankfelder - //################################# - 'startmodule' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'SELECT', - 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', - 'errmsg'=> 'startmodule_empty'), - 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-z0-9\_]{0,64}$/', - 'errmsg'=> 'startmodule_regex'), - ), - 'regex' => '', - 'errmsg' => '', - 'default' => '', - 'value' => $modules_list, - 'separator' => '', - 'width' => '30', - 'maxlength' => '255', - 'rows' => '', - 'cols' => '' - ), - 'app_theme' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'SELECT', - 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', - 'errmsg'=> 'app_theme_empty'), - 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-z0-9\_]{0,64}$/', - 'errmsg'=> 'app_theme_regex'), - ), - 'regex' => '', - 'errmsg' => '', - 'default' => 'default', - 'value' => $themes_list, - 'separator' => '', - 'width' => '30', - 'maxlength' => '255', - 'rows' => '', - 'cols' => '' - ) - //################################# - // ENDE Datenbankfelder - //################################# - ) -); - - -?> diff --git a/interface/web/tools/interface_settings.php b/interface/web/tools/interface_settings.php deleted file mode 100644 index b14b637375..0000000000 --- a/interface/web/tools/interface_settings.php +++ /dev/null @@ -1,139 +0,0 @@ -auth->check_module_permissions('tools'); - -// Loading classes -$app->uses('tpl,tform,tform_actions'); -$app->load('tform_actions'); - -class page_action extends tform_actions { - var $_theme_changed = false; - - function onLoad() { - global $app, $conf, $tform_def_file; - - // Loading template classes and initialize template - if(!is_object($app->tpl)) $app->uses('tpl'); - if(!is_object($app->tform)) $app->uses('tform'); - - $app->tpl->newTemplate("tabbed_form.tpl.htm"); - - // Load table definition from file - $app->tform->loadFormDef($tform_def_file); - - // Importing ID - $this->id = $_SESSION['s']['user']['userid']; - $_POST['id'] = $_SESSION['s']['user']['userid']; - - if(count($_POST) > 1) { - $this->dataRecord = $_POST; - $this->onSubmit(); - } else { - $this->onShow(); - } - } - - function onBeforeInsert() { - global $app, $conf; - - if(!in_array($this->dataRecord['startmodule'], $this->dataRecord['modules'])) { - $app->tform->errorMessage .= $app->tform->wordbook['startmodule_err']; - } - } - - function onInsert() { - die('No inserts allowed.'); - } - - function onBeforeUpdate() { - global $app, $conf; - - if($conf['demo_mode'] == true && $this->id <= 3) $app->tform->errorMessage .= 'This function is disabled in demo mode.'; - - if(@is_array($this->dataRecord['modules']) && !in_array($this->dataRecord['startmodule'], $this->dataRecord['modules'])) { - $app->tform->errorMessage .= $app->tform->wordbook['startmodule_err']; - } - } - - function updateSessionTheme() { - global $app, $conf; - - if($this->dataRecord['app_theme'] != 'default') { - $tmp_path = ISPC_THEMES_PATH."/".$this->dataRecord['app_theme']; - if(!@is_dir($tmp_path) || (@file_exists($tmp_path."/ispconfig_version") && trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION)) { - // fall back to default theme if this one is not compatible with current ispc version - $this->dataRecord['app_theme'] = 'default'; - } - } - if($this->dataRecord['app_theme'] != $_SESSION['s']['user']['theme']) $this->_theme_changed = true; - $_SESSION['s']['theme'] = $this->dataRecord['app_theme']; - $_SESSION['s']['user']['theme'] = $_SESSION['s']['theme']; - $_SESSION['s']['user']['app_theme'] = $_SESSION['s']['theme']; - } - - function onAfterInsert() { - $this->onAfterUpdate(); - } - - function onAfterUpdate() { - - $this->updateSessionTheme(); - - if($this->_theme_changed == true) { - // not the best way, but it works - header('Content-Type: text/html'); - print ''; - exit; - } - //else parent::onShow(); - } - - -} - -$page = new page_action; -$page->onLoad(); - -?> diff --git a/interface/web/tools/lib/lang/ar_interface.lng b/interface/web/tools/lib/lang/ar_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/ar_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/bg_interface.lng b/interface/web/tools/lib/lang/bg_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/bg_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/br_interface.lng b/interface/web/tools/lib/lang/br_interface.lng deleted file mode 100644 index 95677c4b59..0000000000 --- a/interface/web/tools/lib/lang/br_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/ca_interface.lng b/interface/web/tools/lib/lang/ca_interface.lng deleted file mode 100644 index b252103fd9..0000000000 --- a/interface/web/tools/lib/lang/ca_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/cz_interface.lng b/interface/web/tools/lib/lang/cz_interface.lng deleted file mode 100644 index 507b7c3cbe..0000000000 --- a/interface/web/tools/lib/lang/cz_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/de_interface.lng b/interface/web/tools/lib/lang/de_interface.lng deleted file mode 100644 index 2af008f763..0000000000 --- a/interface/web/tools/lib/lang/de_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/dk_interface.lng b/interface/web/tools/lib/lang/dk_interface.lng deleted file mode 100644 index cc17dd2f5c..0000000000 --- a/interface/web/tools/lib/lang/dk_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/el_interface.lng b/interface/web/tools/lib/lang/el_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/el_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/en_interface.lng b/interface/web/tools/lib/lang/en_interface.lng deleted file mode 100644 index 7cb0e2d8bc..0000000000 --- a/interface/web/tools/lib/lang/en_interface.lng +++ /dev/null @@ -1,11 +0,0 @@ - \ No newline at end of file diff --git a/interface/web/tools/lib/lang/es_interface.lng b/interface/web/tools/lib/lang/es_interface.lng deleted file mode 100644 index 87b94e4c4a..0000000000 --- a/interface/web/tools/lib/lang/es_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/fi_interface.lng b/interface/web/tools/lib/lang/fi_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/fi_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/fr_interface.lng b/interface/web/tools/lib/lang/fr_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/fr_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/hr_interface.lng b/interface/web/tools/lib/lang/hr_interface.lng deleted file mode 100644 index 5cc9815a10..0000000000 --- a/interface/web/tools/lib/lang/hr_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/hu_interface.lng b/interface/web/tools/lib/lang/hu_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/hu_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/id_interface.lng b/interface/web/tools/lib/lang/id_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/id_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/it_interface.lng b/interface/web/tools/lib/lang/it_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/it_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/ja_interface.lng b/interface/web/tools/lib/lang/ja_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/ja_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/nl_interface.lng b/interface/web/tools/lib/lang/nl_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/nl_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/pl_interface.lng b/interface/web/tools/lib/lang/pl_interface.lng deleted file mode 100644 index 0256fab376..0000000000 --- a/interface/web/tools/lib/lang/pl_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/pt_interface.lng b/interface/web/tools/lib/lang/pt_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/pt_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/ro_interface.lng b/interface/web/tools/lib/lang/ro_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/ro_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/ru_interface.lng b/interface/web/tools/lib/lang/ru_interface.lng deleted file mode 100644 index 91644d5c2b..0000000000 --- a/interface/web/tools/lib/lang/ru_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/se_interface.lng b/interface/web/tools/lib/lang/se_interface.lng deleted file mode 100644 index 9a66f59e00..0000000000 --- a/interface/web/tools/lib/lang/se_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/sk_interface.lng b/interface/web/tools/lib/lang/sk_interface.lng deleted file mode 100644 index aab4fc89ff..0000000000 --- a/interface/web/tools/lib/lang/sk_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/lib/lang/tr_interface.lng b/interface/web/tools/lib/lang/tr_interface.lng deleted file mode 100644 index 2384c71107..0000000000 --- a/interface/web/tools/lib/lang/tr_interface.lng +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/interface/web/tools/templates/interface_settings.htm b/interface/web/tools/templates/interface_settings.htm deleted file mode 100644 index 6767287206..0000000000 --- a/interface/web/tools/templates/interface_settings.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      - -
      -
      - -
      - -
      -
      - - - - -
      - - -
      -- GitLab From c094c6020c143a721d8c6e6200fd87622ac7223d Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 27 Jul 2020 13:10:06 +0200 Subject: [PATCH 0357/1368] Add variables for DB size (#4475) --- interface/web/monitor/lib/lang/ar.lng | 2 ++ interface/web/monitor/lib/lang/bg.lng | 2 ++ interface/web/monitor/lib/lang/br.lng | 2 ++ interface/web/monitor/lib/lang/ca.lng | 2 ++ interface/web/monitor/lib/lang/cz.lng | 2 ++ interface/web/monitor/lib/lang/de.lng | 2 ++ interface/web/monitor/lib/lang/dk.lng | 2 ++ interface/web/monitor/lib/lang/el.lng | 2 ++ interface/web/monitor/lib/lang/en.lng | 2 ++ interface/web/monitor/lib/lang/es.lng | 2 ++ interface/web/monitor/lib/lang/fi.lng | 2 ++ interface/web/monitor/lib/lang/fr.lng | 2 ++ interface/web/monitor/lib/lang/hr.lng | 2 ++ interface/web/monitor/lib/lang/hu.lng | 2 ++ interface/web/monitor/lib/lang/id.lng | 2 ++ interface/web/monitor/lib/lang/it.lng | 2 ++ interface/web/monitor/lib/lang/ja.lng | 2 ++ interface/web/monitor/lib/lang/nl.lng | 2 ++ interface/web/monitor/lib/lang/pl.lng | 2 ++ interface/web/monitor/lib/lang/pt.lng | 2 ++ interface/web/monitor/lib/lang/ro.lng | 2 ++ interface/web/monitor/lib/lang/ru.lng | 2 ++ interface/web/monitor/lib/lang/se.lng | 2 ++ interface/web/monitor/lib/lang/sk.lng | 2 ++ interface/web/monitor/lib/lang/tr.lng | 2 ++ 25 files changed, 50 insertions(+) diff --git a/interface/web/monitor/lib/lang/ar.lng b/interface/web/monitor/lib/lang/ar.lng index 9d54ea1f5d..6a63ea9ab5 100644 --- a/interface/web/monitor/lib/lang/ar.lng +++ b/interface/web/monitor/lib/lang/ar.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/bg.lng b/interface/web/monitor/lib/lang/bg.lng index a8b7f491ac..ec28969581 100644 --- a/interface/web/monitor/lib/lang/bg.lng +++ b/interface/web/monitor/lib/lang/bg.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/br.lng b/interface/web/monitor/lib/lang/br.lng index 172891cfd9..781dd1e7e1 100644 --- a/interface/web/monitor/lib/lang/br.lng +++ b/interface/web/monitor/lib/lang/br.lng @@ -163,4 +163,6 @@ $wb['no_permissions_to_view_monit_txt'] = 'Você não tem permissão para acessa $wb['Show Munin'] = 'Exibir Munin'; $wb['no_munin_url_defined_txt'] = 'Nenhuma URL do Munin definida.'; $wb['no_permissions_to_view_munin_txt'] = 'Você não tem permissão para acessar o Munin.'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/ca.lng b/interface/web/monitor/lib/lang/ca.lng index b57b255a74..ebceac3467 100644 --- a/interface/web/monitor/lib/lang/ca.lng +++ b/interface/web/monitor/lib/lang/ca.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Domain'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/cz.lng b/interface/web/monitor/lib/lang/cz.lng index be2d9eadbb..604fbd5ceb 100644 --- a/interface/web/monitor/lib/lang/cz.lng +++ b/interface/web/monitor/lib/lang/cz.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Doména'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Zobrazit historii datového logu'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/de.lng b/interface/web/monitor/lib/lang/de.lng index f8fabe7990..63cb5b9848 100644 --- a/interface/web/monitor/lib/lang/de.lng +++ b/interface/web/monitor/lib/lang/de.lng @@ -162,4 +162,6 @@ $wb['monitor_database_name_txt'] = 'Database'; $wb['monitor_database_size_txt'] = 'Size'; $wb['monitor_database_client_txt'] = 'Client'; $wb['monitor_database_domain_txt'] = 'Domain'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/dk.lng b/interface/web/monitor/lib/lang/dk.lng index 4c7bfab1e7..0a7f8bc19e 100644 --- a/interface/web/monitor/lib/lang/dk.lng +++ b/interface/web/monitor/lib/lang/dk.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Domain'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/el.lng b/interface/web/monitor/lib/lang/el.lng index 245c80c666..1d783f3da7 100644 --- a/interface/web/monitor/lib/lang/el.lng +++ b/interface/web/monitor/lib/lang/el.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Domain'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/en.lng b/interface/web/monitor/lib/lang/en.lng index 194bbc5030..f507f54229 100644 --- a/interface/web/monitor/lib/lang/en.lng +++ b/interface/web/monitor/lib/lang/en.lng @@ -162,4 +162,6 @@ $wb['no_permissions_to_view_monit_txt'] = 'You are not allowed to access Monit.' $wb['Show Munin'] = 'Show Munin'; $wb['no_munin_url_defined_txt'] = 'No Munin URL defined.'; $wb['no_permissions_to_view_munin_txt'] = 'You are not allowed to access Munin.'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/es.lng b/interface/web/monitor/lib/lang/es.lng index f4acb3c45c..56ce9a4222 100644 --- a/interface/web/monitor/lib/lang/es.lng +++ b/interface/web/monitor/lib/lang/es.lng @@ -162,4 +162,6 @@ $wb['System load 5 minutes'] = 'Carga del sistema hace 5 minutos'; $wb['System State (All Servers)'] = 'Estado de los sistemas'; $wb['Users online'] = 'Usuarios en línea'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/fi.lng b/interface/web/monitor/lib/lang/fi.lng index 911aae9bd1..f825f6e20b 100644 --- a/interface/web/monitor/lib/lang/fi.lng +++ b/interface/web/monitor/lib/lang/fi.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/fr.lng b/interface/web/monitor/lib/lang/fr.lng index c08fe74948..8bf754cb9b 100644 --- a/interface/web/monitor/lib/lang/fr.lng +++ b/interface/web/monitor/lib/lang/fr.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Domain'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/hr.lng b/interface/web/monitor/lib/lang/hr.lng index 17899ff3f0..4c8037604a 100644 --- a/interface/web/monitor/lib/lang/hr.lng +++ b/interface/web/monitor/lib/lang/hr.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Domain'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/hu.lng b/interface/web/monitor/lib/lang/hu.lng index 9a5c41654f..e9ac7009f0 100644 --- a/interface/web/monitor/lib/lang/hu.lng +++ b/interface/web/monitor/lib/lang/hu.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/id.lng b/interface/web/monitor/lib/lang/id.lng index 4cdbf5d8ba..8a1bba91d8 100644 --- a/interface/web/monitor/lib/lang/id.lng +++ b/interface/web/monitor/lib/lang/id.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/it.lng b/interface/web/monitor/lib/lang/it.lng index e6feadf01f..675f27494b 100644 --- a/interface/web/monitor/lib/lang/it.lng +++ b/interface/web/monitor/lib/lang/it.lng @@ -162,4 +162,6 @@ $wb['monitor_database_domain_txt'] = 'Domain'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/ja.lng b/interface/web/monitor/lib/lang/ja.lng index cccd678cb7..3ea8fb1dfd 100644 --- a/interface/web/monitor/lib/lang/ja.lng +++ b/interface/web/monitor/lib/lang/ja.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/nl.lng b/interface/web/monitor/lib/lang/nl.lng index a534b9afb3..bef9eb80a2 100644 --- a/interface/web/monitor/lib/lang/nl.lng +++ b/interface/web/monitor/lib/lang/nl.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/pl.lng b/interface/web/monitor/lib/lang/pl.lng index a8e1b3e53c..6900d31b92 100644 --- a/interface/web/monitor/lib/lang/pl.lng +++ b/interface/web/monitor/lib/lang/pl.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/pt.lng b/interface/web/monitor/lib/lang/pt.lng index 7930febda2..f48c41e9fe 100644 --- a/interface/web/monitor/lib/lang/pt.lng +++ b/interface/web/monitor/lib/lang/pt.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/ro.lng b/interface/web/monitor/lib/lang/ro.lng index 96a2ce10e6..2a2423927f 100644 --- a/interface/web/monitor/lib/lang/ro.lng +++ b/interface/web/monitor/lib/lang/ro.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/ru.lng b/interface/web/monitor/lib/lang/ru.lng index 823174b716..c256c2faaf 100644 --- a/interface/web/monitor/lib/lang/ru.lng +++ b/interface/web/monitor/lib/lang/ru.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Показать журнал MongoDB'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-сервер:'; $wb['monitor_title_mongodb_txt'] = 'Журнал MongoDB'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/se.lng b/interface/web/monitor/lib/lang/se.lng index 78dd5ed1be..54b504c9bb 100644 --- a/interface/web/monitor/lib/lang/se.lng +++ b/interface/web/monitor/lib/lang/se.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/sk.lng b/interface/web/monitor/lib/lang/sk.lng index 36af834eaf..59af606856 100644 --- a/interface/web/monitor/lib/lang/sk.lng +++ b/interface/web/monitor/lib/lang/sk.lng @@ -162,4 +162,6 @@ $wb['Show MongoDB-Log'] = 'Show MongoDB-Log'; $wb['monitor_services_mongodb_txt'] = 'MongoDB-Server:'; $wb['monitor_title_mongodb_txt'] = 'MongoDB Log'; $wb['Show Data Log History'] = 'Show Data Log History'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> diff --git a/interface/web/monitor/lib/lang/tr.lng b/interface/web/monitor/lib/lang/tr.lng index 20a9e8e140..836f38ce97 100644 --- a/interface/web/monitor/lib/lang/tr.lng +++ b/interface/web/monitor/lib/lang/tr.lng @@ -161,4 +161,6 @@ $wb['no_permissions_to_view_monit_txt'] = 'Monit erişimi izniniz yok.'; $wb['Show Munin'] = 'Munin Durumu'; $wb['no_munin_url_defined_txt'] = 'Munin adresi belirtilmemiş.'; $wb['no_permissions_to_view_munin_txt'] = 'Munin erişimi izniniz yok.'; +$wb['Database size'] = 'Database size'; +$wb['Show MySQL Database size'] = 'Show MySQL Database size'; ?> -- GitLab From 069df76376bbed29ca11fff32450891882ef7664 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Mon, 27 Jul 2020 13:34:56 +0200 Subject: [PATCH 0358/1368] Adjust rendering to textarea --- .../web/sites/lib/lang/en_web_vhost_domain.lng | 2 +- .../sites/templates/web_vhost_domain_edit.htm | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index b400f7ac3a..d49e2b2d1a 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -158,7 +158,7 @@ $wb['https_port_error_regex'] = 'HTTPS Port invalid.'; $wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; $wb['log_retention_txt'] = 'Logfiles retention time'; $wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; -$wb['dependent_domains_txt'] = 'Dependent domains'; +$wb['dependent_domains_txt'] = 'Dependent sub- / aliasdomains'; $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; diff --git a/interface/web/sites/templates/web_vhost_domain_edit.htm b/interface/web/sites/templates/web_vhost_domain_edit.htm index e6f05d29b1..c79bbe658f 100644 --- a/interface/web/sites/templates/web_vhost_domain_edit.htm +++ b/interface/web/sites/templates/web_vhost_domain_edit.htm @@ -10,15 +10,6 @@ {tmpl_hook name="begin_form"} - - {tmpl_var name='dependent_domains_txt'}: - -
      -
      @@ -93,6 +84,14 @@
      + +
      + +
      + +
      +
      +
      -- GitLab From 6b4966d677338ac4ff6adb7c0a124c09f9878edb Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Mon, 27 Jul 2020 16:19:52 +0200 Subject: [PATCH 0359/1368] fixed GoAccess config detection --- .../lib/classes/cron.d/150-goaccess.inc.php | 66 ++++++++++++------- .../plugins-available/apache2_plugin.inc.php | 17 ++++- server/plugins-available/nginx_plugin.inc.php | 18 ++++- 3 files changed, 71 insertions(+), 30 deletions(-) diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index fe9e565f5f..87c9642b4e 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -2,6 +2,7 @@ /* Copyright (c) 2013, Marius Cramer, pixcept KG +Copyright (c) 2020, Michael Seevogel All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -59,17 +60,25 @@ class cronjob_goaccess extends cronjob { $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - $goaccess_conf_dir = '/etc/'; - $goaccess_conf_main = $goaccess_conf_dir . 'goaccess.conf'; + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR); + } + } + } - if(!file_exists($goaccess_conf_main) || !isset($goaccess_conf_main)) - { - $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in ".$goaccess_conf_dir.".", LOGLEVEL_WARN); - } /* Check wether the goaccess binary is in path */ - system('type goaccess', $retval); - if ($retval === 0) { + system("type goaccess 2>&1>/dev/null", $retval); + if ($retval === 0) { foreach($records as $rec) { $yesterday = date('Ymd', strtotime("-1 day", time())); @@ -121,7 +130,6 @@ class cronjob_goaccess extends cronjob { } - if(!@is_dir($statsdir)) mkdir($statsdir); $username = escapeshellcmd($rec['system_user']); $groupname = escapeshellcmd($rec['system_group']); @@ -171,30 +179,38 @@ class cronjob_goaccess extends cronjob { if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") copy("$statsdir"."/"."$file", "$statsdirold"."$file"); } } - - $app->system->exec_safe("goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $logfile, $goaccess_conf, $goa_db_dir, $output_html); - - if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { - if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { - copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); - } else { - copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + + + $output = shell_exec('goaccess --help'); + + if(preg_match('/keep-db-files/', $output)) { + $app->system->exec_safe("goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $logfile, $goaccess_conf, $goa_db_dir, $output_html); + + if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } else { + copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } } - } - $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); - + $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); + if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); + chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); + } + + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); - if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { - chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); - chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); + } else { + $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support!", LOGLEVEL_ERROR); } - $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + unset($output); } } else { - $app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_WARN); + $app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR); } parent::onRunJob(); diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 1bebab55f4..aecab199cd 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -2986,8 +2986,21 @@ class apache2_plugin { $web_folder = $data['new']['web_folder']; if($data['new']['type'] == 'vhost') $web_folder = 'web'; - $goaccess_conf_dir = '/etc/'; - $goaccess_conf_main = $goaccess_conf_dir.'goaccess.conf'; + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR); + } + } + } + if(!is_dir($data['new']['document_root']."/" . $web_folder . "/stats/")) mkdir($data['new']['document_root']."/" . $web_folder . "/stats/.db"); $goaccess_conf = escapeshellcmd($data['new']['document_root'].'/log/goaccess.conf'); diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index d02811ad93..3c59011cbb 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -2541,13 +2541,25 @@ class nginx_plugin { $web_folder = $data['new']['web_folder']; if($data['new']['type'] == 'vhost') $web_folder = 'web'; - $goaccess_conf_dir = '/etc/'; - $goaccess_conf_main = $goaccess_conf_dir.'goaccess.conf'; + $goaccess_conf_locs = array('/etc/goaccess.conf', '/etc/goaccess/goaccess.conf'); + $count = 0; + + foreach($goaccess_conf_locs as $goa_loc) { + if(is_file($goa_loc) && (filesize($goa_loc) > 0)) { + $goaccess_conf_main = $goa_loc; + break; + } else { + $count++; + if($count == 2) { + $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_ERROR); + } + } + } + if(!is_dir($data['new']['document_root']."/" . $web_folder . "/stats/")) mkdir($data['new']['document_root']."/" . $web_folder . "/stats/.db"); $goaccess_conf = escapeshellcmd($data['new']['document_root'].'/log/goaccess.conf'); - /* In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. -- GitLab From 2ea8f75e23acaf533364194bc8ea0b06c9518dc8 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 27 Jul 2020 16:40:31 +0200 Subject: [PATCH 0360/1368] Fixed #5662 installer (gentoo) $dovecot_version empty --- install/dist/lib/gentoo.lib.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php index a39c346376..324fe06e9a 100644 --- a/install/dist/lib/gentoo.lib.php +++ b/install/dist/lib/gentoo.lib.php @@ -338,6 +338,11 @@ class installer extends installer_base replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0); } + //* Get the dovecot version + exec('dovecot --version', $tmp); + $dovecot_version = $tmp[0]; + unset($tmp); + //* dovecot-sql.conf $configfile = $config_dir.'/dovecot-sql.conf'; $content = $this->get_template_file('debian_dovecot-sql.conf', true, true); -- GitLab From c5c1c9aa9dba54522b560f6c3ea15fa6d496a434 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 27 Jul 2020 16:54:05 +0200 Subject: [PATCH 0361/1368] Fixed #5614 Fix home initialization for Jailkit --- server/plugins-available/shelluser_base_plugin.inc.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/server/plugins-available/shelluser_base_plugin.inc.php b/server/plugins-available/shelluser_base_plugin.inc.php index 69d96a961e..4be97961ff 100755 --- a/server/plugins-available/shelluser_base_plugin.inc.php +++ b/server/plugins-available/shelluser_base_plugin.inc.php @@ -107,11 +107,7 @@ class shelluser_base_plugin { $app->system->web_folder_protection($web['document_root'], false); //* Home directory of the new shell user - if($data['new']['chroot'] == 'jailkit') { - $homedir = $data['new']['dir']; - } else { - $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; - } + $homedir = $data['new']['dir'].'/home/'.$data['new']['username']; // Create home base directory if it does not exist if(!is_dir($data['new']['dir'].'/home')){ -- GitLab From 2bbebeb3e5eddcccc784cab29097f9c56452c9ea Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 27 Jul 2020 17:02:48 +0200 Subject: [PATCH 0362/1368] Fixed #5593 Data too long for column 'id_rsa' at row 1 --- install/sql/incremental/upd_dev_collection.sql | 3 +++ install/sql/ispconfig3.sql | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index a48996916a..9eefff3630 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -59,3 +59,6 @@ ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext -- add move to junk before/after option, default to after ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y'; + +-- Change id_rsa column to TEXT format +ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 9c11a68914..fae07c8036 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -253,7 +253,7 @@ CREATE TABLE `client` ( `canceled` enum('n','y') NOT NULL DEFAULT 'n', `can_use_api` enum('n','y') NOT NULL DEFAULT 'n', `tmp_data` mediumblob, - `id_rsa` varchar(2000) NOT NULL DEFAULT '', + `id_rsa` text NOT NULL DEFAULT '', `ssh_rsa` varchar(600) NOT NULL DEFAULT '', `customer_no_template` varchar(255) DEFAULT 'R[CLIENTID]C[CUSTOMER_NO]', `customer_no_start` int(11) NOT NULL DEFAULT '1', -- GitLab From c868adc12267ae628b04740370c8a6dd25639d64 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 27 Jul 2020 17:08:55 +0200 Subject: [PATCH 0363/1368] Fixed #5578 --- server/plugins-available/shelluser_base_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/shelluser_base_plugin.inc.php b/server/plugins-available/shelluser_base_plugin.inc.php index 4be97961ff..e3276755be 100755 --- a/server/plugins-available/shelluser_base_plugin.inc.php +++ b/server/plugins-available/shelluser_base_plugin.inc.php @@ -96,7 +96,7 @@ class shelluser_base_plugin { return false; } - if($data['new']['active'] != 'y') $data['new']['shell'] = '/bin/false'; + if($data['new']['active'] != 'y' || $data['new']['chroot'] == "jailkit") $data['new']['shell'] = '/bin/false'; if($app->system->is_user($data['new']['puser'])) { -- GitLab From 80603de2860c939dde7974df9c3cfd32d2caf4bd Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 27 Jul 2020 17:36:53 +0200 Subject: [PATCH 0364/1368] Fixes #3696 Add -Indexes for /var/www directory in Apache --- install/tpl/apache_ispconfig.conf.master | 4 ++++ server/conf/apache_ispconfig.conf.master | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master index 84eec5c554..ff744741ff 100644 --- a/install/tpl/apache_ispconfig.conf.master +++ b/install/tpl/apache_ispconfig.conf.master @@ -35,6 +35,10 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m + + Options -Indexes + + AllowOverride None diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master index e30ccd6d3b..040de23625 100644 --- a/server/conf/apache_ispconfig.conf.master +++ b/server/conf/apache_ispconfig.conf.master @@ -35,6 +35,10 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m + + Options -Indexes + + AllowOverride None -- GitLab From 1536e8b48f26f87a010d8848fff66e492f989aeb Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 9 Jul 2020 13:59:14 -0600 Subject: [PATCH 0365/1368] mail_forwardings alias/forward/catchall, aliasdomains in virtual_alias_{maps,domains} --- install/dist/lib/fedora.lib.php | 3 +++ install/dist/lib/opensuse.lib.php | 3 +++ install/lib/installer_base.lib.php | 3 +++ install/tpl/debian_postfix.conf.master | 4 ++-- install/tpl/fedora_postfix.conf.master | 4 ++-- install/tpl/gentoo_postfix.conf.master | 4 ++-- .../tpl/mysql-virtual_alias_domains.cf.master | 6 +++++ install/tpl/mysql-virtual_domains.cf.master | 3 ++- .../tpl/mysql-virtual_forwardings.cf.master | 24 +++++-------------- install/tpl/opensuse_postfix.conf.master | 4 ++-- 10 files changed, 31 insertions(+), 27 deletions(-) create mode 100644 install/tpl/mysql-virtual_alias_domains.cf.master diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php index 4a7c9cfbfe..05fea64519 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -63,6 +63,9 @@ class installer_dist extends installer_base { //* mysql-virtual_forwardings.cf $this->process_postfix_config('mysql-virtual_forwardings.cf'); + //* mysql-virtual_alias_domains.cf + $this->process_postfix_config('mysql-virtual_alias_domains.cf'); + //* mysql-virtual_mailboxes.cf $this->process_postfix_config('mysql-virtual_mailboxes.cf'); diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index 60fb0511fd..574b38100d 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -63,6 +63,9 @@ class installer_dist extends installer_base { //* mysql-virtual_forwardings.cf $this->process_postfix_config('mysql-virtual_forwardings.cf'); + //* mysql-virtual_alias_domains.cf + $this->process_postfix_config('mysql-virtual_alias_domains.cf'); + //* mysql-virtual_mailboxes.cf $this->process_postfix_config('mysql-virtual_mailboxes.cf'); diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 81b1257db0..0476c92330 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -960,6 +960,9 @@ class installer_base { //* mysql-virtual_forwardings.cf $this->process_postfix_config('mysql-virtual_forwardings.cf'); + //* mysql-virtual_alias_domains.cf + $this->process_postfix_config('mysql-virtual_alias_domains.cf'); + //* mysql-virtual_mailboxes.cf $this->process_postfix_config('mysql-virtual_mailboxes.cf'); diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 1c739a5c7e..c1a5baa71d 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -1,7 +1,7 @@ alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases alias_database = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases -virtual_alias_domains = -virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf +virtual_alias_domains = proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf +virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf virtual_mailbox_base = {vmail_mailbox_base} diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index d504c6ed56..5b53b9a45f 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -1,5 +1,5 @@ -virtual_alias_domains = -virtual_alias_maps = hash:/etc/mailman/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf +virtual_alias_domains = proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf +virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf virtual_mailbox_base = {vmail_mailbox_base} diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index cad2b97c3c..a326051d5e 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -1,5 +1,5 @@ -virtual_alias_domains = -virtual_alias_maps = proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf +virtual_alias_domains = proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf +virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf virtual_mailbox_base = {vmail_mailbox_base} diff --git a/install/tpl/mysql-virtual_alias_domains.cf.master b/install/tpl/mysql-virtual_alias_domains.cf.master new file mode 100644 index 0000000000..e55fd8ea8d --- /dev/null +++ b/install/tpl/mysql-virtual_alias_domains.cf.master @@ -0,0 +1,6 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT destination FROM mail_forwarding + WHERE source = '@%d' AND type = 'aliasdomain' AND active = 'y' AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_domains.cf.master b/install/tpl/mysql-virtual_domains.cf.master index 0d1793a95a..11ccb046ef 100644 --- a/install/tpl/mysql-virtual_domains.cf.master +++ b/install/tpl/mysql-virtual_domains.cf.master @@ -2,4 +2,5 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select domain from mail_domain where domain = '%s' and active = 'y' and server_id = {server_id} +query = SELECT domain FROM mail_domain WHERE domain = '%s' AND active = 'y' AND server_id = {server_id} + AND NOT EXISTS (SELECT source FROM mail_forwarding WHERE source = '@%s' AND type = 'aliasdomain' AND active = 'y' AND server_id = {server_id}) diff --git a/install/tpl/mysql-virtual_forwardings.cf.master b/install/tpl/mysql-virtual_forwardings.cf.master index 04a94ee634..9ab6f3e860 100644 --- a/install/tpl/mysql-virtual_forwardings.cf.master +++ b/install/tpl/mysql-virtual_forwardings.cf.master @@ -2,22 +2,10 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT u.email as target FROM mail_forwarding as s - INNER JOIN mail_user as u ON (u.email = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) - WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND u.disabledeliver = 'n' AND s.server_id = {server_id} +query = SELECT s.destination AS target FROM mail_forwarding AS s + WHERE s.source = '%s' AND s.type IN ('alias', 'forward') AND s.active = 'y' AND s.server_id = {server_id} UNION - SELECT s.destination as target FROM mail_forwarding as s - WHERE s.source = '%s' AND s.type IN ('alias', 'forward') and s.active = 'y' AND s.server_id = {server_id} - UNION - SELECT s.destination as target FROM mail_forwarding as s - INNER JOIN mail_forwarding as f ON (f.source = CONCAT('%u@', SUBSTRING_INDEX(s.destination,'@',-1))) - WHERE s.source = '@%d' AND s.type = 'aliasdomain' AND s.active = 'y' AND f.active = 'y' AND s.server_id = {server_id} - UNION - SELECT s.destination as target FROM mail_forwarding as s - LEFT JOIN mail_user as uu ON (uu.email = '%s' AND uu.disabledeliver = 'n') - LEFT JOIN mail_forwarding as uf ON (uf.source = '%s' AND uf.type IN ('alias', 'forward') AND uf.active = 'y') - WHERE s.source = '@%d' AND s.type IN ('catchall') and s.active = 'y' AND uu.mailuser_id IS NULL AND uf.forwarding_id IS NULL AND s.server_id = {server_id} - UNION - SELECT s.destination as target FROM mail_forwarding as s - INNER JOIN mail_forwarding as t ON (t.source = s.destination AND t.type = 'catchall') - WHERE s.source = '@%d' AND s.type = 'aliasdomain' and s.active = 'y' AND t.active = 'y' AND s.server_id = {server_id} + SELECT s.destination AS target FROM mail_forwarding AS s + WHERE s.source = '@%d' AND s.type = 'catchall' AND s.active = 'y' AND s.server_id = {server_id} + AND NOT EXISTS (SELECT email FROM mail_user WHERE email = '%s' AND server_id = {server_id}) + AND NOT EXISTS (SELECT source FROM mail_forwarding WHERE source = '%s' AND active = 'y' AND server_id = {server_id}) diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index c59d46fa97..ea4375b6ac 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -1,7 +1,7 @@ alias_maps = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases alias_database = hash:/etc/aliases, hash:/var/lib/mailman/data/aliases -virtual_alias_domains = -virtual_alias_maps = hash:/etc/mailman/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf +virtual_alias_domains = proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf +virtual_alias_maps = hash:/var/lib/mailman/data/virtual-mailman, proxy:mysql:{config_dir}/mysql-virtual_forwardings.cf, proxy:mysql:{config_dir}/mysql-virtual_alias_domains.cf, proxy:mysql:{config_dir}/mysql-virtual_email2email.cf virtual_mailbox_domains = proxy:mysql:{config_dir}/mysql-virtual_domains.cf virtual_mailbox_maps = proxy:mysql:{config_dir}/mysql-virtual_mailboxes.cf virtual_mailbox_base = {vmail_mailbox_base} -- GitLab From 015a175f9fbee0399ec31cfc7e2dae7943495c67 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 14 Jul 2020 13:43:43 -0600 Subject: [PATCH 0366/1368] use reject_unverified_recipient with lmtp --- install/dist/lib/fedora.lib.php | 3 ++ install/dist/lib/opensuse.lib.php | 3 ++ install/lib/installer_base.lib.php | 42 +++++++++++++-- install/tpl/debian_postfix.conf.master | 6 ++- install/tpl/fedora_postfix.conf.master | 6 ++- install/tpl/gentoo_postfix.conf.master | 6 ++- install/tpl/mysql-verify_recipients.cf.master | 5 ++ install/tpl/opensuse_postfix.conf.master | 6 ++- .../postfix_server_plugin.inc.php | 53 ++++++++++++++----- 9 files changed, 105 insertions(+), 25 deletions(-) create mode 100644 install/tpl/mysql-verify_recipients.cf.master diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php index 05fea64519..9ffc7d0ef4 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -105,6 +105,9 @@ class installer_dist extends installer_base { //* mysql-virtual_uids.cf $this->process_postfix_config('mysql-virtual_uids.cf'); + //* mysql-virtual_alias_domains.cf + $this->process_postfix_config('mysql-verify_recipients.cf'); + //* postfix-dkim $filename='tag_as_originating.re'; $full_file_name=$config_dir.'/'.$filename; diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index 574b38100d..15ab5b6e91 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -102,6 +102,9 @@ class installer_dist extends installer_base { //* mysql-virtual_uids.cf $this->process_postfix_config('mysql-virtual_uids.cf'); + //* mysql-virtual_alias_domains.cf + $this->process_postfix_config('mysql-verify_recipients.cf'); + //* postfix-dkim $filename='tag_as_originating.re'; $full_file_name=$config_dir.'/'.$filename; diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 0476c92330..c02a33eebb 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1002,6 +1002,9 @@ class installer_base { //* mysql-virtual_uids.cf $this->process_postfix_config('mysql-virtual_uids.cf'); + //* mysql-virtual_alias_domains.cf + $this->process_postfix_config('mysql-verify_recipients.cf'); + // test if lmtp if available $configure_lmtp = $this->get_postfix_service('lmtp','unix'); @@ -1340,6 +1343,8 @@ class installer_base { } $config_dir = $conf['postfix']['config_dir']; + $postfix_version = `postconf -d mail_version 2>/dev/null`; + $postfix_version = preg_replace( '/mail_version\s*=\s*(.*)\s*/', '$1', $postfix_version ); //* Configure master.cf and add a line for deliver if(!$this->get_postfix_service('dovecot', 'unix')) { @@ -1351,7 +1356,7 @@ class installer_base { chmod($config_dir.'/master.cf~2', 0400); } //* Configure master.cf and add a line for deliver - $content = rf($conf["postfix"]["config_dir"].'/master.cf'); + $content = rf($config_dir.'/master.cf'); $deliver_content = 'dovecot unix - n n - - pipe'."\n".' flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}'."\n"; af($config_dir.'/master.cf', $deliver_content); unset($content); @@ -1368,7 +1373,31 @@ class installer_base { ); // Make a backup copy of the main.cf file - copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~3'); + copy($config_dir.'/main.cf', $config_dir.'/main.cf~3'); + + $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + $new_options = array(); + foreach ($options as $value) { + if (($value = trim($value)) == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } + $new_options[] = $value; + } + if ($configure_lmtp) { + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'reject_unlisted_recipient') { + array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${config_dir}/mysql-verify_recipients.cf")); + break; + } + } + # postfix < 3.3 needs this when using reject_unverified_recipient: + if(version_compare($postfix_version, 3.3, '<')) { + $postconf_commands[] = "enable_original_recipient = yes"; + } + } + #exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); + $postconf_commands[] = "smtpd_recipient_restrictions = ".implode(", ", $new_options); // Executing the postconf commands foreach($postconf_commands as $cmd) { @@ -1608,12 +1637,15 @@ class installer_base { exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, permit_mynetworks, permit_sasl_authenticated'"); + + $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); $new_options = array(); - $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $value) { - if (!preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { - $new_options[] = $value; + if (($value = trim($value)) == '') continue; + if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { + continue; } + $new_options[] = $value; } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index c1a5baa71d..d3df3ab568 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -15,7 +15,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert @@ -24,7 +24,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf -proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps +proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $smtpd_recipient_restrictions smtpd_helo_required = yes smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re @@ -44,3 +44,5 @@ smtpd_tls_protocols = !SSLv2,!SSLv3 smtp_tls_protocols = !SSLv2,!SSLv3 smtpd_tls_exclude_ciphers = RC4, aNULL smtp_tls_exclude_ciphers = RC4, aNULL +# needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): +enable_original_recipient = yes diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index 5b53b9a45f..e6f43b01e8 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -11,7 +11,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert @@ -20,7 +20,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf -proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps +proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $smtpd_recipient_restrictions smtpd_helo_required = yes smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re @@ -40,3 +40,5 @@ smtpd_tls_protocols = !SSLv2,!SSLv3 smtp_tls_protocols = !SSLv2,!SSLv3 smtpd_tls_exclude_ciphers = RC4, aNULL smtp_tls_exclude_ciphers = RC4, aNULL +# needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): +enable_original_recipient = yes diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index a326051d5e..0f6ee7301b 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -10,7 +10,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert @@ -19,7 +19,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf -proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps +proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $smtpd_recipient_restrictions smtpd_helo_required = yes smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re @@ -39,3 +39,5 @@ smtpd_tls_protocols = !SSLv2,!SSLv3 smtp_tls_protocols = !SSLv2,!SSLv3 smtpd_tls_exclude_ciphers = RC4, aNULL smtp_tls_exclude_ciphers = RC4, aNULL +# needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): +enable_original_recipient = yes diff --git a/install/tpl/mysql-verify_recipients.cf.master b/install/tpl/mysql-verify_recipients.cf.master new file mode 100644 index 0000000000..2b433491d8 --- /dev/null +++ b/install/tpl/mysql-verify_recipients.cf.master @@ -0,0 +1,5 @@ +user = {mysql_server_ispconfig_user} +password = {mysql_server_ispconfig_password} +dbname = {mysql_server_database} +hosts = {mysql_server_ip} +query = SELECT 'reject_unverified_recipient' FROM mail_domain WHERE domain = '%s' AND active = 'y' AND server_id = {server_id} diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index ea4375b6ac..d29c3d1b05 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -13,7 +13,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination, check_recipient_access mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert @@ -22,7 +22,7 @@ transport_maps = hash:/var/lib/mailman/data/transport-mailman, proxy:mysql:{conf relay_domains = mysql:{config_dir}/mysql-virtual_relaydomains.cf relay_recipient_maps = mysql:{config_dir}/mysql-virtual_relayrecipientmaps.cf smtpd_sender_login_maps = proxy:mysql:{config_dir}/mysql-virtual_sender_login_maps.cf -proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps +proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $sender_bcc_maps $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $smtpd_sender_login_maps $smtpd_recipient_restrictions smtpd_helo_required = yes smtpd_helo_restrictions = permit_sasl_authenticated, permit_mynetworks, check_helo_access regexp:{config_dir}/helo_access, reject_non_fqdn_helo_hostname, reject_invalid_helo_hostname, reject_unknown_helo_hostname, check_helo_access regexp:{config_dir}/blacklist_helo smtpd_sender_restrictions = check_sender_access regexp:{config_dir}/tag_as_originating.re {reject_slm}, permit_mynetworks, permit_sasl_authenticated, check_sender_access mysql:{config_dir}/mysql-virtual_sender.cf, check_sender_access regexp:{config_dir}/tag_as_foreign.re @@ -42,3 +42,5 @@ smtpd_tls_protocols = !SSLv2,!SSLv3 smtp_tls_protocols = !SSLv2,!SSLv3 smtpd_tls_exclude_ciphers = RC4, aNULL smtp_tls_exclude_ciphers = RC4, aNULL +# needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): +enable_original_recipient = yes diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index 80db1c102a..757ee5e72f 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -33,9 +33,6 @@ class postfix_server_plugin { var $plugin_name = 'postfix_server_plugin'; var $class_name = 'postfix_server_plugin'; - - var $postfix_config_dir = '/etc/postfix'; - //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. function onInstall() { @@ -79,8 +76,13 @@ class postfix_server_plugin { $old_ini_data = $app->ini_parser->parse_ini_string($data['old']['config']); $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); + // Get postfix version + exec('postconf -d mail_version 2>&1', $out); + $postfix_version = preg_replace('/.*=\s*/', '', $out[0]); + unset($out); + copy('/etc/postfix/main.cf', '/etc/postfix/main.cf~'); - + if ($mail_config['relayhost'].$mail_config['relayhost_user'].$mail_config['relayhost_password'] != $old_ini_data['mail']['relayhost'].$old_ini_data['mail']['relayhost_user'].$old_ini_data['mail']['relayhost_password']) { $content = file_exists('/etc/postfix/sasl_passwd') ? file_get_contents('/etc/postfix/sasl_passwd') : ''; $content = preg_replace('/^'.preg_quote($old_ini_data['email']['relayhost']).'\s+[^\n]*(:?\n|)/m','',$content); @@ -112,17 +114,18 @@ class postfix_server_plugin { if($rbl_hosts != ''){ $rbl_hosts = explode(",", $rbl_hosts); } - $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); $new_options = array(); foreach ($options as $key => $value) { + if (($value = trim($value)) == '') continue; if (!preg_match('/reject_rbl_client/', $value)) { $new_options[] = $value; } else { if(is_array($rbl_hosts) && !empty($rbl_hosts) && !$rbl_updated){ $rbl_updated = true; - foreach ($rbl_hosts as $key => $value) { - $value = trim($value); - if($value != '') $new_options[] = "reject_rbl_client ".$value; + foreach ($rbl_hosts as $key2 => $value2) { + $value2 = trim($value2); + if($value2 != '') $new_options[] = "reject_rbl_client ".$value2; } } } @@ -190,6 +193,30 @@ class postfix_server_plugin { } } + $postfix_config_dir = $conf['postfix']['config_dir']; + $new_options = array(); + $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + foreach ($options as $key => $value) { + if (($value = trim($value)) == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } + $new_options[] = $value; + } + if (defined($configure_lmtp) && $configure_lmtp) { + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'reject_unlisted_recipient') { + array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${postfix_config_dir}/mysql-verify_recipients.cf")); + break; + } + } + # postfix < 3.3 needs this when using reject_unverified_recipient: + if(version_compare($postfix_version, 3.3, '<')) { + exec("postconf -e 'enable_original_recipient = yes'"); + } + } + exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); + if($mail_config['content_filter'] != $old_ini_data['mail']['content_filter']) { if($mail_config['content_filter'] == 'rspamd'){ exec("postconf -X 'receive_override_options'"); @@ -204,11 +231,13 @@ class postfix_server_plugin { exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, permit_mynetworks, permit_sasl_authenticated'"); $new_options = array(); - $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $key => $value) { - if (!preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { - $new_options[] = $value; + if (($value = trim($value)) == '') continue; + if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { + continue; } + $new_options[] = $value; } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); @@ -235,7 +264,7 @@ class postfix_server_plugin { exec("postconf -e 'receive_override_options = no_address_mappings'"); exec("postconf -e 'content_filter = " . ($configure_lmtp ? "lmtp" : "amavis" ) . ":[127.0.0.1]:10024'"); - exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, permit_sasl_authenticated, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); + exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, check_sender_access regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, permit_sasl_authenticated, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); } } -- GitLab From c0651edf42b4cd461fa4b4cc3423d51ca1fcac66 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 15 Jul 2020 10:55:29 -0600 Subject: [PATCH 0367/1368] fix issues from MR 1053 review --- install/lib/installer_base.lib.php | 28 +++++++++++-------- .../postfix_server_plugin.inc.php | 23 ++++++++------- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index c02a33eebb..265dd8c583 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -876,8 +876,8 @@ class installer_base { $postfix_service = @($out[0]=='')?false:true; } else { //* fallback - Postfix < 2.9 $content = rf($conf['postfix']['config_dir'].'/master.cf'); - $regex = "/^((?!#)".$service.".*".$type.".*)$/m"; - $postfix_service = @(preg_match($regex, $content))?true:false; + $quoted_regex = "^((?!#)".preg_quote($service, '/').".*".preg_quote($type, '/').".*)$"; + $postfix_service = @(preg_match("/$quoted_regex/m", $content))?true:false; } return $postfix_service; @@ -915,10 +915,11 @@ class installer_base { while ( !feof( $cf ) ) { $line = fgets( $cf ); + $quoted_regex = '^'.preg_quote($service, '/').'\s+'.preg_quote($type, '/'); if ( $reading_service ) { # regex matches a new service or "empty" (whitespace) line if ( preg_match( '/^([^\s#]+.*|\s*)$/', $line ) && - ! preg_match( '/^'.$service.'\s+'.$type.'/', $line ) ) { + ! preg_match( "/$quoted_regex/", $line ) ) { $out .= $line; $reading_service = false; } @@ -926,7 +927,7 @@ class installer_base { # $skipped_lines .= $line; # regex matches definition matching service to be removed - } else if ( preg_match( '/^'.$service.'\s+'.$type.'/', $line ) ) { + } else if ( preg_match( "/$quoted_regex/", $line ) ) { $reading_service = true; # $skipped_lines .= $line; @@ -1157,13 +1158,13 @@ class installer_base { if(is_file('/var/run/courier/authdaemon/')) caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command); //* Check maildrop service in posfix master.cf - $regex = "/^maildrop unix.*pipe flags=DRhu user=vmail argv=\\/usr\\/bin\\/maildrop -d ".$cf['vmail_username']." \\$\{extension} \\$\{recipient} \\$\{user} \\$\{nexthop} \\$\{sender}/"; + $quoted_regex = '^maildrop unix.*pipe flags=DRhu user=vmail '.preg_quote('argv=/usr/bin/maildrop -d '.$cf['vmail_username'].' ${extension} ${recipient} ${user} ${nexthop} ${sender}', '/'); $configfile = $config_dir.'/master.cf'; if($this->get_postfix_service('maildrop', 'unix')) { exec ("postconf -M maildrop.unix 2> /dev/null", $out, $ret); - $change_maildrop_flags = @(preg_match($regex, $out[0]) && $out[0] !='')?false:true; + $change_maildrop_flags = @(preg_match("/$quoted_regex/", $out[0]) && $out[0] !='')?false:true; } else { - $change_maildrop_flags = @(preg_match($regex, $configfile))?false:true; + $change_maildrop_flags = @(preg_match("/$quoted_regex/", $configfile))?false:true; } if ($change_maildrop_flags) { //* Change maildrop service in posfix master.cf @@ -1343,6 +1344,7 @@ class installer_base { } $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '/'); $postfix_version = `postconf -d mail_version 2>/dev/null`; $postfix_version = preg_replace( '/mail_version\s*=\s*(.*)\s*/', '$1', $postfix_version ); @@ -1375,11 +1377,12 @@ class installer_base { // Make a backup copy of the main.cf file copy($config_dir.'/main.cf', $config_dir.'/main.cf~3'); - $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); $new_options = array(); foreach ($options as $value) { - if (($value = trim($value)) == '') continue; - if (preg_match("|check_recipient_access\s+proxy:mysql:${config_dir}/mysql-verify_recipients.cf|", $value)) { + $value = trim($value); + if ($value == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) { continue; } $new_options[] = $value; @@ -1638,10 +1641,11 @@ class installer_base { exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, permit_mynetworks, permit_sasl_authenticated'"); - $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); $new_options = array(); foreach ($options as $value) { - if (($value = trim($value)) == '') continue; + $value = trim($value); + if ($value == '') continue; if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { continue; } diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index 757ee5e72f..5a0b222a24 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -85,7 +85,7 @@ class postfix_server_plugin { if ($mail_config['relayhost'].$mail_config['relayhost_user'].$mail_config['relayhost_password'] != $old_ini_data['mail']['relayhost'].$old_ini_data['mail']['relayhost_user'].$old_ini_data['mail']['relayhost_password']) { $content = file_exists('/etc/postfix/sasl_passwd') ? file_get_contents('/etc/postfix/sasl_passwd') : ''; - $content = preg_replace('/^'.preg_quote($old_ini_data['email']['relayhost']).'\s+[^\n]*(:?\n|)/m','',$content); + $content = preg_replace('/^'.preg_quote($old_ini_data['email']['relayhost'], '/').'\s+[^\n]*(:?\n|)/m','',$content); if (!empty($mail_config['relayhost_user']) || !empty($mail_config['relayhost_password'])) { $content .= "\n".$mail_config['relayhost'].' '.$mail_config['relayhost_user'].':'.$mail_config['relayhost_password']; @@ -114,10 +114,11 @@ class postfix_server_plugin { if($rbl_hosts != ''){ $rbl_hosts = explode(",", $rbl_hosts); } - $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); $new_options = array(); foreach ($options as $key => $value) { - if (($value = trim($value)) == '') continue; + $value = trim($value); + if ($value == '') continue; if (!preg_match('/reject_rbl_client/', $value)) { $new_options[] = $value; } else { @@ -142,7 +143,7 @@ class postfix_server_plugin { } if($mail_config['reject_sender_login_mismatch'] != $old_ini_data['mail']['reject_sender_login_mismatch']) { - $options = explode(", ", exec("postconf -h smtpd_sender_restrictions")); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_sender_restrictions")); $new_options = array(); foreach ($options as $key => $value) { if (!preg_match('/reject_authenticated_sender_login_mismatch/', $value)) { @@ -193,12 +194,13 @@ class postfix_server_plugin { } } - $postfix_config_dir = $conf['postfix']['config_dir']; + $quoted_postfix_config_dir = preg_quote($conf['postfix']['config_dir'], '|'); $new_options = array(); - $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $key => $value) { - if (($value = trim($value)) == '') continue; - if (preg_match("|check_recipient_access\s+proxy:mysql:${postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { + $value = trim($value); + if ($value == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { continue; } $new_options[] = $value; @@ -231,9 +233,10 @@ class postfix_server_plugin { exec("postconf -e 'smtpd_sender_restrictions = check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, permit_mynetworks, permit_sasl_authenticated'"); $new_options = array(); - $options = explode(",", exec("postconf -h smtpd_recipient_restrictions")); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $key => $value) { - if (($value = trim($value)) == '') continue; + $value = trim($value); + if ($value == '') continue; if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { continue; } -- GitLab From 67452af5eb9c395f5d403396983d9226a6ef020e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 23 Jul 2020 12:25:20 -0600 Subject: [PATCH 0368/1368] remove reject_unlisted_recipient --- install/tpl/debian_postfix.conf.master | 2 +- install/tpl/fedora_postfix.conf.master | 2 +- install/tpl/gentoo_postfix.conf.master | 2 +- install/tpl/opensuse_postfix.conf.master | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index d3df3ab568..169826747d 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -15,7 +15,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index e6f43b01e8..1c78e858be 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -11,7 +11,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index 0f6ee7301b..84d404d15b 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -10,7 +10,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index d29c3d1b05..f2d2a4403b 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -13,7 +13,7 @@ broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_restriction_classes = greylisting greylisting = check_policy_service inet:127.0.0.1:10023 -smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, reject_unlisted_recipient, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status +smtpd_recipient_restrictions = permit_mynetworks, reject_unknown_recipient_domain, check_recipient_access proxy:mysql:{config_dir}/mysql-verify_recipients.cf, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unauth_destination, check_recipient_access proxy:mysql:{config_dir}/mysql-virtual_recipient.cf{rbl_list}{greylisting}, check_policy_service unix:private/quota-status smtpd_use_tls = yes smtpd_tls_security_level = may smtpd_tls_cert_file = {config_dir}/smtpd.cert -- GitLab From 7d9d0c61928d93a91049dbff76f032f3ce864452 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 27 Jul 2020 23:42:10 +0200 Subject: [PATCH 0369/1368] #1804 Option to disable welcome messages --- install/tpl/system.ini.master | 1 + server/plugins-available/mail_plugin.inc.php | 41 +++++++++++-------- .../plugins-available/mailman_plugin.inc.php | 15 ++++--- 3 files changed, 33 insertions(+), 24 deletions(-) diff --git a/install/tpl/system.ini.master b/install/tpl/system.ini.master index 873b0e7372..81f6bba553 100644 --- a/install/tpl/system.ini.master +++ b/install/tpl/system.ini.master @@ -16,6 +16,7 @@ webmail_url=/webmail dkim_path=/var/lib/amavis/dkim smtp_enabled=y smtp_host=localhost +enable_welcome_mail=y [monitor] diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php index 4d5ac826d3..6c8737cfe0 100644 --- a/server/plugins-available/mail_plugin.inc.php +++ b/server/plugins-available/mail_plugin.inc.php @@ -135,7 +135,7 @@ class mail_plugin { $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Trash'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Junk'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Drafts'", $data["new"]["email"]); - + $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? INBOX'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Sent'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Trash'", $data["new"]["email"]); @@ -149,26 +149,26 @@ class mail_plugin { $app->log('Created Directory: '.$maildomain_path, LOGLEVEL_DEBUG); $maildomain_path .= '/Maildir'; } - + //* When the mail user dir exists but it is not a valid maildir, move it to corrupted maildir folder if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { if(!is_dir($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'])) $app->system->mkdirpath($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'], 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); $app->system->exec_safe("su -c ? vmail", "mv -f " . $data['new']['maildir']." ".$mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id']); $app->log('Moved invalid maildir to corrupted Maildirs folder: '.$data['new']['maildir'], LOGLEVEL_WARN); } - + //* Create the maildir, if it doesn not exist, set permissions, set quota. if(!empty($maildomain_path) && !is_dir($maildomain_path)) { - + $app->system->maildirmake($maildomain_path, $user, '', $group); - + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. if($mail_config['pop3_imap_daemon'] != 'dovecot') { if(is_dir($maildomain_path)) $app->system->exec_safe("su -c ? ?", "maildirmake -q ".$data['new']['quota']."S ".$maildomain_path, $user); // Avoid maildirmake quota bug, see debian bug #214911 $app->log('Created Maildir: '."su -c 'maildirmake -q ".$data['new']['quota']."S ".$maildomain_path."' ".$user, LOGLEVEL_DEBUG); } } - + if(!is_dir($data['new']['maildir'].'/.Sent')) { $app->system->maildirmake($maildomain_path, $user, 'Sent', $group); } @@ -181,11 +181,11 @@ class mail_plugin { if(!is_dir($data['new']['maildir'].'/.Junk')) { $app->system->maildirmake($maildomain_path, $user, 'Junk', $group); } - + // Set permissions now recursive $app->system->exec_safe('chown -R ?:? ?', $user, $group, $data['new']['maildir']); $app->log('Set ownership on '.$data['new']['maildir'], LOGLEVEL_DEBUG); - + //* Set the maildir quota if(is_dir($data['new']['maildir'].'/new') && $mail_config['pop3_imap_daemon'] != 'dovecot') { if($data['new']['quota'] > 0) { @@ -194,6 +194,11 @@ class mail_plugin { } } } + + $global_config = $app->getconf->get_global_config('mail'); + if($global_config['enable_welcome_mail'] == 'n') { + return; + } //* Send the welcome email message $tmp = explode('@', $data["new"]["email"]); @@ -261,7 +266,7 @@ class mail_plugin { // Maildir-Format must not be changed on this way !! $data['new']['maildir_format'] = $data['old']['maildir_format']; - + $maildomain_path = $data['new']['maildir']; $tmp_basepath = $data['new']['maildir']; $tmp_basepath_parts = explode('/', $tmp_basepath); @@ -315,7 +320,7 @@ class mail_plugin { $app->system->exec_safe('mv -f ? ?'. $data['old']['maildir'], $data['new']['maildir']); $app->log('Moved Maildir from: '.$data['old']['maildir'].' to '.$data['new']['maildir'], LOGLEVEL_DEBUG); } - + //* Create the maildir, if it doesn not exist, set permissions, set quota. if(!is_dir($data['new']['maildir'].'/mdbox')) { $app->system->exec_safe("su -c 'doveadm mailbox create -u ? INBOX'", $data["new"]["email"]); @@ -323,7 +328,7 @@ class mail_plugin { $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Trash'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Junk'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox create -u ? Drafts'", $data["new"]["email"]); - + $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? INBOX'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Sent'", $data["new"]["email"]); $app->system->exec_safe("su -c 'doveadm mailbox subscribe -u ? Trash'", $data["new"]["email"]); @@ -338,18 +343,18 @@ class mail_plugin { $app->log('Created Directory: '.$base_path, LOGLEVEL_DEBUG); $maildomain_path .= '/Maildir'; } - + //* When the mail user dir exists but it is not a valid maildir, move it to corrupted maildir folder if(!empty($maildomain_path) && is_dir($maildomain_path) && !is_dir($maildomain_path.'/new') && !is_dir($maildomain_path.'/cur')) { if(!is_dir($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'])) $app->system->mkdirpath($mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'], 0700, $mail_config['mailuser_name'], $mail_config['mailuser_group']); $app->system->exec_safe("su -c ? ?", "mv -f ".$data['new']['maildir']." ".$mail_config['homedir_path'].'/corrupted/'.$data['new']['mailuser_id'], 'vmail'); $app->log('Moved invalid maildir to corrupted Maildirs folder: '.$data['new']['maildir'], LOGLEVEL_WARN); } - + //* Create the maildir, if it doesn not exist, set permissions, set quota. if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { $app->system->maildirmake($maildomain_path, $user, '', $group); - + //* This is to fix the maildrop quota not being rebuilt after the quota is changed. if($mail_config['pop3_imap_daemon'] != 'dovecot') { if($data['new']['quota'] > 0) { @@ -361,7 +366,7 @@ class mail_plugin { } } } - + if(!is_dir($data['new']['maildir'].'/.Sent')) { $app->system->maildirmake($maildomain_path, $user, 'Sent', $group); } @@ -374,11 +379,11 @@ class mail_plugin { if(!is_dir($data['new']['maildir'].'/.Junk')) { $app->system->maildirmake($maildomain_path, $user, 'Junk', $group); } - + // Set permissions now recursive $app->system->exec_safe('chown -R ?:? ?', $user, $group, $data['new']['maildir']); $app->log('Set ownership on '.$data['new']['maildir'], LOGLEVEL_DEBUG); - + // Move mailbox, if domain has changed and delete old mailbox if($data['new']['maildir'] != $data['old']['maildir'] && is_dir($data['old']['maildir'])) { if(is_dir($data['new']['maildir'])) { @@ -470,7 +475,7 @@ class mail_plugin { } else { $app->log('Possible security violation when deleting the mail domain mailfilter directory: '.$old_maildomain_path, LOGLEVEL_ERROR); } - + //* Delete the mail-backups $server_config = $app->getconf->get_server_config($conf['server_id'], 'server'); $backup_dir = $server_config['backup_dir']; diff --git a/server/plugins-available/mailman_plugin.inc.php b/server/plugins-available/mailman_plugin.inc.php index e6251aedf1..da033b80cc 100644 --- a/server/plugins-available/mailman_plugin.inc.php +++ b/server/plugins-available/mailman_plugin.inc.php @@ -71,9 +71,12 @@ class mailman_plugin { function insert($event_name, $data) { global $app, $conf; + $global_config = $app->getconf->get_global_config('mail'); + $opt_quiet = ($global_config['enable_welcome_mail'] == 'n') ? "-q" : ""; + $this->update_config(); - $pid = $app->system->exec_safe("nohup /usr/lib/mailman/bin/newlist -u ? -e ? ? ? ? >/dev/null 2>&1 & echo $!;", $data["new"]["domain"], $data["new"]["domain"], $data["new"]["listname"], $data["new"]["email"], $data["new"]["password"]); + $pid = $app->system->exec_safe("nohup /usr/lib/mailman/bin/newlist ? -u ? -e ? ? ? ? >/dev/null 2>&1 & echo $!;", $opt_quiet, $data["new"]["domain"], $data["new"]["domain"], $data["new"]["listname"], $data["new"]["email"], $data["new"]["password"]); // wait for /usr/lib/mailman/bin/newlist-call $running = true; do { @@ -87,9 +90,9 @@ class mailman_plugin { } if(is_file('/var/lib/mailman/data/virtual-mailman')) exec('postmap /var/lib/mailman/data/virtual-mailman'); if(is_file('/var/lib/mailman/data/transport-mailman')) exec('postmap /var/lib/mailman/data/transport-mailman'); - + exec('nohup '.$conf['init_scripts'] . '/' . 'mailman reload >/dev/null 2>&1 &'); - + // Fix list URL $app->system->exec_safe('/usr/sbin/withlist -l -r fix_url ?', $data["new"]["listname"]); @@ -100,7 +103,7 @@ class mailman_plugin { // The purpose of this plugin is to rewrite the main.cf file function update($event_name, $data) { global $app, $conf; - + $this->update_config(); if($data["new"]["password"] != $data["old"]["password"] && $data["new"]["password"] != '') { @@ -108,7 +111,7 @@ class mailman_plugin { exec('nohup '.$conf['init_scripts'] . '/' . 'mailman reload >/dev/null 2>&1 &'); $app->db->query("UPDATE mail_mailinglist SET password = '' WHERE mailinglist_id = ?", $data["new"]['mailinglist_id']); } - + if(is_file('/var/lib/mailman/data/virtual-mailman')) exec('postmap /var/lib/mailman/data/virtual-mailman'); if(is_file('/var/lib/mailman/data/transport-mailman')) exec('postmap /var/lib/mailman/data/transport-mailman'); } @@ -121,7 +124,7 @@ class mailman_plugin { $app->system->exec_safe("nohup /usr/lib/mailman/bin/rmlist -a ? >/dev/null 2>&1 &", $data["old"]["listname"]); exec('nohup '.$conf['init_scripts'] . '/' . 'mailman reload >/dev/null 2>&1 &'); - + if(is_file('/var/lib/mailman/data/virtual-mailman')) exec('postmap /var/lib/mailman/data/virtual-mailman'); if(is_file('/var/lib/mailman/data/transport-mailman')) exec('postmap /var/lib/mailman/data/transport-mailman'); -- GitLab From ebcbdbbe1b34aa3375a19d1f806c0139bd35396e Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 28 Jul 2020 10:18:13 +0200 Subject: [PATCH 0370/1368] Send welcome email only if it's enabled (#1804) --- server/plugins-available/mail_plugin.inc.php | 113 +++++++++---------- 1 file changed, 55 insertions(+), 58 deletions(-) diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php index 6c8737cfe0..c584b68215 100644 --- a/server/plugins-available/mail_plugin.inc.php +++ b/server/plugins-available/mail_plugin.inc.php @@ -194,67 +194,64 @@ class mail_plugin { } } } - - $global_config = $app->getconf->get_global_config('mail'); - if($global_config['enable_welcome_mail'] == 'n') { - return; - } - - //* Send the welcome email message - $tmp = explode('@', $data["new"]["email"]); - $domain = $tmp[1]; - unset($tmp); - $html = false; - if(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.html')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.html'); - $html = true; - } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.html')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.html'); - $html = true; - } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.txt')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.txt'); - } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.txt')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.txt'); - } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_en.txt')) { - $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_en.txt'); - } elseif(file_exists($conf['rootpath'].'/conf/mail/welcome_email_'.$conf['language'].'.txt')) { - $lines = file($conf['rootpath'].'/conf/mail/welcome_email_'.$conf['language'].'.txt'); - } else { - $lines = file($conf['rootpath'].'/conf/mail/welcome_email_en.txt'); - } - //* Get from address - $parts = explode(':', trim($lines[0])); - unset($parts[0]); - $welcome_mail_from = implode(':', $parts); - unset($lines[0]); - - //* Get subject - $parts = explode(':', trim($lines[1])); - unset($parts[0]); - $welcome_mail_subject = implode(':', $parts); - unset($lines[1]); - - //* Get message - $welcome_mail_message = trim(implode($lines)); - unset($tmp); - - $mailHeaders = "MIME-Version: 1.0" . "\n"; - if($html) { - $mailHeaders .= "Content-Type: text/html; charset=utf-8" . "\n"; - $mailHeaders .= "Content-Transfer-Encoding: quoted-printable" . "\n"; - } else { - $mailHeaders .= "Content-Type: text/plain; charset=utf-8" . "\n"; - $mailHeaders .= "Content-Transfer-Encoding: 8bit" . "\n"; - } - $mailHeaders .= "From: $welcome_mail_from" . "\n"; - $mailHeaders .= "Reply-To: $welcome_mail_from" . "\n"; - $mailTarget = $data["new"]["email"]; - $mailSubject = "=?utf-8?B?".base64_encode($welcome_mail_subject)."?="; + $global_config = $app->getconf->get_global_config('mail'); + if($global_config['enable_welcome_mail'] == 'y') { + //* Send the welcome email message + $tmp = explode('@', $data["new"]["email"]); + $domain = $tmp[1]; + unset($tmp); + $html = false; + if(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.html')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.html'); + $html = true; + } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.html')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.html'); + $html = true; + } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.txt')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$domain.'.txt'); + } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.txt')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_'.$conf['language'].'.txt'); + } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/welcome_email_en.txt')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/welcome_email_en.txt'); + } elseif(file_exists($conf['rootpath'].'/conf/mail/welcome_email_'.$conf['language'].'.txt')) { + $lines = file($conf['rootpath'].'/conf/mail/welcome_email_'.$conf['language'].'.txt'); + } else { + $lines = file($conf['rootpath'].'/conf/mail/welcome_email_en.txt'); + } - //* Send the welcome email only on the "master" mail server to avoid duplicate emails - if($conf['mirror_server_id'] == 0) mail($mailTarget, $mailSubject, $welcome_mail_message, $mailHeaders); + //* Get from address + $parts = explode(':', trim($lines[0])); + unset($parts[0]); + $welcome_mail_from = implode(':', $parts); + unset($lines[0]); + + //* Get subject + $parts = explode(':', trim($lines[1])); + unset($parts[0]); + $welcome_mail_subject = implode(':', $parts); + unset($lines[1]); + + //* Get message + $welcome_mail_message = trim(implode($lines)); + unset($tmp); + + $mailHeaders = "MIME-Version: 1.0" . "\n"; + if($html) { + $mailHeaders .= "Content-Type: text/html; charset=utf-8" . "\n"; + $mailHeaders .= "Content-Transfer-Encoding: quoted-printable" . "\n"; + } else { + $mailHeaders .= "Content-Type: text/plain; charset=utf-8" . "\n"; + $mailHeaders .= "Content-Transfer-Encoding: 8bit" . "\n"; + } + $mailHeaders .= "From: $welcome_mail_from" . "\n"; + $mailHeaders .= "Reply-To: $welcome_mail_from" . "\n"; + $mailTarget = $data["new"]["email"]; + $mailSubject = "=?utf-8?B?".base64_encode($welcome_mail_subject)."?="; + //* Send the welcome email only on the "master" mail server to avoid duplicate emails + if($conf['mirror_server_id'] == 0) mail($mailTarget, $mailSubject, $welcome_mail_message, $mailHeaders); + } } function user_update($event_name, $data) { -- GitLab From e39688e4c9a684e90df312d576786077462cdaba Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 28 Jul 2020 13:28:07 +0200 Subject: [PATCH 0371/1368] Hide APS by default (First step to #5676) --- install/tpl/system.ini.master | 1 + interface/web/sites/lib/module.conf.php | 58 +++++++++++++------------ 2 files changed, 32 insertions(+), 27 deletions(-) diff --git a/install/tpl/system.ini.master b/install/tpl/system.ini.master index 81f6bba553..d6dfa18f47 100644 --- a/install/tpl/system.ini.master +++ b/install/tpl/system.ini.master @@ -35,6 +35,7 @@ client_username_web_check_disabled=n backups_include_into_web_quota=n reseller_can_use_options=n web_php_options=no,fast-cgi,mod,php-fpm +show_aps_menu=n [tools] diff --git a/interface/web/sites/lib/module.conf.php b/interface/web/sites/lib/module.conf.php index a9aefad967..775a704873 100644 --- a/interface/web/sites/lib/module.conf.php +++ b/interface/web/sites/lib/module.conf.php @@ -157,33 +157,37 @@ if($app->auth->get_client_limit($userid, 'shell_user') != 0 or $app->auth->get_c } // APS menu -if($app->auth->get_client_limit($userid, 'aps') != 0) -{ - $items = array(); - - $items[] = array( 'title' => 'Available packages', - 'target' => 'content', - 'link' => 'sites/aps_availablepackages_list.php', - 'html_id' => 'aps_availablepackages_list'); - - $items[] = array( 'title' => 'Installed packages', - 'target' => 'content', - 'link' => 'sites/aps_installedpackages_list.php', - 'html_id' => 'aps_installedpackages_list'); - - - // Second menu group, available only for admins - if($_SESSION['s']['user']['typ'] == 'admin') - { - $items[] = array( 'title' => 'Update Packagelist', - 'target' => 'content', - 'link' => 'sites/aps_update_packagelist.php', - 'html_id' => 'aps_packagedetails_show'); - } - - $module['nav'][] = array( 'title' => 'APS Installer', - 'open' => 1, - 'items' => $items); +if($app->auth->get_client_limit($userid, 'aps') != 0) { + // read web config + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['show_aps_menu'] == 'y') { + $items = array(); + + $items[] = array( 'title' => 'Available packages', + 'target' => 'content', + 'link' => 'sites/aps_availablepackages_list.php', + 'html_id' => 'aps_availablepackages_list'); + + $items[] = array( 'title' => 'Installed packages', + 'target' => 'content', + 'link' => 'sites/aps_installedpackages_list.php', + 'html_id' => 'aps_installedpackages_list'); + + + // Second menu group, available only for admins + if($_SESSION['s']['user']['typ'] == 'admin') + { + $items[] = array( 'title' => 'Update Packagelist', + 'target' => 'content', + 'link' => 'sites/aps_update_packagelist.php', + 'html_id' => 'aps_packagedetails_show'); + } + + $module['nav'][] = array( 'title' => 'APS Installer', + 'open' => 1, + 'items' => $items); + } } // Statistics menu -- GitLab From 6aa06901f3bd4491333d5fa1ec16e26ac1bc621c Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Tue, 28 Jul 2020 14:07:05 +0200 Subject: [PATCH 0372/1368] update affected websites when a directive snippet was updated (Implements #5632) --- .../sql/incremental/upd_dev_collection.sql | 3 ++ install/sql/ispconfig3.sql | 1 + .../web/admin/directive_snippets_edit.php | 34 +++++++++++++++++-- .../admin/form/directive_snippets.tform.php | 6 ++++ .../admin/lib/lang/ar_directive_snippets.lng | 1 + .../admin/lib/lang/bg_directive_snippets.lng | 1 + .../admin/lib/lang/br_directive_snippets.lng | 1 + .../admin/lib/lang/ca_directive_snippets.lng | 1 + .../admin/lib/lang/cz_directive_snippets.lng | 1 + .../admin/lib/lang/de_directive_snippets.lng | 1 + .../admin/lib/lang/dk_directive_snippets.lng | 1 + .../admin/lib/lang/el_directive_snippets.lng | 1 + .../admin/lib/lang/en_directive_snippets.lng | 1 + .../admin/lib/lang/es_directive_snippets.lng | 1 + .../admin/lib/lang/fi_directive_snippets.lng | 1 + .../admin/lib/lang/fr_directive_snippets.lng | 1 + .../admin/lib/lang/hr_directive_snippets.lng | 1 + .../admin/lib/lang/hu_directive_snippets.lng | 1 + .../admin/lib/lang/id_directive_snippets.lng | 1 + .../admin/lib/lang/it_directive_snippets.lng | 1 + .../admin/lib/lang/ja_directive_snippets.lng | 1 + .../admin/lib/lang/nl_directive_snippets.lng | 1 + .../admin/lib/lang/pl_directive_snippets.lng | 1 + .../admin/lib/lang/pt_directive_snippets.lng | 1 + .../admin/lib/lang/ro_directive_snippets.lng | 1 + .../admin/lib/lang/ru_directive_snippets.lng | 1 + .../admin/lib/lang/se_directive_snippets.lng | 1 + .../admin/lib/lang/sk_directive_snippets.lng | 1 + .../admin/lib/lang/tr_directive_snippets.lng | 1 + .../templates/directive_snippets_edit.htm | 5 ++- server/mods-available/web_module.inc.php | 13 +++++-- .../plugins-available/apache2_plugin.inc.php | 28 +++++++++++++++ server/plugins-available/nginx_plugin.inc.php | 29 ++++++++++++++++ 33 files changed, 139 insertions(+), 5 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 9eefff3630..1deb605028 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -62,3 +62,6 @@ ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y -- Change id_rsa column to TEXT format ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; + +ALTER TABLE `directive_snippets` ADD `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n' ; + diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index fae07c8036..cac7ad0f08 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -470,6 +470,7 @@ CREATE TABLE IF NOT EXISTS `directive_snippets` ( `required_php_snippets` varchar(255) NOT NULL DEFAULT '', `active` enum('n','y') NOT NULL DEFAULT 'y', `master_directive_snippets_id` int(11) unsigned NOT NULL DEFAULT '0', + `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n', PRIMARY KEY (`directive_snippets_id`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/interface/web/admin/directive_snippets_edit.php b/interface/web/admin/directive_snippets_edit.php index b12da0a79b..af700213a4 100644 --- a/interface/web/admin/directive_snippets_edit.php +++ b/interface/web/admin/directive_snippets_edit.php @@ -75,22 +75,52 @@ class page_action extends tform_actions { $app->tpl->setVar("snippet", $this->dataRecord['snippet'], true); } } + $app->tpl->setVar("is_master", $is_master); + + if($this->dataRecord['managed_snippet_id'] > 0) { + } parent::onShowEnd(); } function onSubmit() { global $app, $conf; - + if($this->id > 0){ $record = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ?", $this->id); if($record['master_directive_snippets_id'] > 0){ unset($app->tform->formDef["tabs"]['directive_snippets']['fields']['name'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['type'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['snippet'], $app->tform->formDef["tabs"]['directive_snippets']['fields']['required_php_snippets']); } + + if(isset($this->dataRecord['update_sites'])) { + parent::onSubmit(); + } else { + $app->db->query('UPDATE directive_snippets SET name = ?, type = ?, snippet = ?, customer_viewable = ?, required_php_snippets = ?, active = ? WHERE directive_snippets_id = ?', $this->dataRecord['name'], $this->dataRecord['type'], $this->dataRecord['snippet'], $this->dataRecord['customer_viewable'], implode(',', $this->dataRecord['required_php_snippets']), $this->dataRecord['active'], $this->id); + + if($_REQUEST["next_tab"] == '') { + $list_name = $_SESSION["s"]["form"]["return_to"]; + if($list_name != '' && $_SESSION["s"]["list"][$list_name]["parent_name"] != $app->tform->formDef["name"]) { + $redirect = "Location: ".$_SESSION["s"]["list"][$list_name]["parent_script"]."?id=".$_SESSION["s"]["list"][$list_name]["parent_id"]."&next_tab=".$_SESSION["s"]["list"][$list_name]["parent_tab"]; + $_SESSION["s"]["form"]["return_to"] = ''; + session_write_close(); + header($redirect); + } elseif (isset($_SESSION["s"]["form"]["return_to_url"]) && $_SESSION["s"]["form"]["return_to_url"] != '') { + $redirect = $_SESSION["s"]["form"]["return_to_url"]; + $_SESSION["s"]["form"]["return_to_url"] = ''; + session_write_close(); + header("Location: ".$redirect); + exit; + } else { + header("Location: ".$app->tform->formDef['list_default']); + } + exit; + } + } + unset($record); } - + parent::onSubmit(); } diff --git a/interface/web/admin/form/directive_snippets.tform.php b/interface/web/admin/form/directive_snippets.tform.php index bd9466c310..bf7f2b7fe5 100644 --- a/interface/web/admin/form/directive_snippets.tform.php +++ b/interface/web/admin/form/directive_snippets.tform.php @@ -110,6 +110,12 @@ $form["tabs"]['directive_snippets'] = array ( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'update_sites' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), 'required_php_snippets' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOXARRAY', diff --git a/interface/web/admin/lib/lang/ar_directive_snippets.lng b/interface/web/admin/lib/lang/ar_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/ar_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ar_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/bg_directive_snippets.lng b/interface/web/admin/lib/lang/bg_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/bg_directive_snippets.lng +++ b/interface/web/admin/lib/lang/bg_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/br_directive_snippets.lng b/interface/web/admin/lib/lang/br_directive_snippets.lng index 43c46c69b9..bc94b85b7d 100644 --- a/interface/web/admin/lib/lang/br_directive_snippets.lng +++ b/interface/web/admin/lib/lang/br_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Já existe uma diretiva com este $wb['variables_txt'] = 'Variáveis'; $wb['customer_viewable_txt'] = 'Visualização personalizada'; $wb['required_php_snippets_txt'] = 'Trecho de código exige php'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ca_directive_snippets.lng b/interface/web/admin/lib/lang/ca_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/ca_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ca_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/cz_directive_snippets.lng b/interface/web/admin/lib/lang/cz_directive_snippets.lng index 1fd316583b..26d17f64b3 100644 --- a/interface/web/admin/lib/lang/cz_directive_snippets.lng +++ b/interface/web/admin/lib/lang/cz_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Proměnné'; $wb['customer_viewable_txt'] = 'Dostupná volba pro klienta'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/de_directive_snippets.lng b/interface/web/admin/lib/lang/de_directive_snippets.lng index 9e369f4b51..dbe3aaf8bd 100644 --- a/interface/web/admin/lib/lang/de_directive_snippets.lng +++ b/interface/web/admin/lib/lang/de_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Es existiert schon ein Direktiven $wb['variables_txt'] = 'Variablen'; $wb['customer_viewable_txt'] = 'Sichtbar für Kunden'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/dk_directive_snippets.lng b/interface/web/admin/lib/lang/dk_directive_snippets.lng index 7b43dcd40b..1b158e5c80 100644 --- a/interface/web/admin/lib/lang/dk_directive_snippets.lng +++ b/interface/web/admin/lib/lang/dk_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Der er allerede et direktiv uddra $wb['variables_txt'] = 'Variabler'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/el_directive_snippets.lng b/interface/web/admin/lib/lang/el_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/el_directive_snippets.lng +++ b/interface/web/admin/lib/lang/el_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/en_directive_snippets.lng b/interface/web/admin/lib/lang/en_directive_snippets.lng index 8e8a63afe1..da164a5318 100644 --- a/interface/web/admin/lib/lang/en_directive_snippets.lng +++ b/interface/web/admin/lib/lang/en_directive_snippets.lng @@ -9,4 +9,5 @@ $wb["directive_snippets_name_error_unique"] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> \ No newline at end of file diff --git a/interface/web/admin/lib/lang/es_directive_snippets.lng b/interface/web/admin/lib/lang/es_directive_snippets.lng index 8e2a927079..a5bb21b494 100644 --- a/interface/web/admin/lib/lang/es_directive_snippets.lng +++ b/interface/web/admin/lib/lang/es_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['snippet_txt'] = 'Fragmento'; $wb['type_txt'] = 'Tipo'; $wb['variables_txt'] = 'Variables'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/fi_directive_snippets.lng b/interface/web/admin/lib/lang/fi_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/fi_directive_snippets.lng +++ b/interface/web/admin/lib/lang/fi_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/fr_directive_snippets.lng b/interface/web/admin/lib/lang/fr_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/fr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/fr_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/hr_directive_snippets.lng b/interface/web/admin/lib/lang/hr_directive_snippets.lng index 077896577d..5709d6075d 100644 --- a/interface/web/admin/lib/lang/hr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/hr_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Već postoji direktiva sa tim ime $wb['variables_txt'] = 'Varijable'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/hu_directive_snippets.lng b/interface/web/admin/lib/lang/hu_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/hu_directive_snippets.lng +++ b/interface/web/admin/lib/lang/hu_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/id_directive_snippets.lng b/interface/web/admin/lib/lang/id_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/id_directive_snippets.lng +++ b/interface/web/admin/lib/lang/id_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/it_directive_snippets.lng b/interface/web/admin/lib/lang/it_directive_snippets.lng index 5598aacecc..e9a473f92e 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Esiste già una direttiva snippet $wb['variables_txt'] = 'Variabili'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ja_directive_snippets.lng b/interface/web/admin/lib/lang/ja_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/ja_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ja_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/nl_directive_snippets.lng b/interface/web/admin/lib/lang/nl_directive_snippets.lng index a4f610634e..d216622c6f 100644 --- a/interface/web/admin/lib/lang/nl_directive_snippets.lng +++ b/interface/web/admin/lib/lang/nl_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Er is al een Directive Snippet me $wb['variables_txt'] = 'Variabelen'; $wb['customer_viewable_txt'] = 'Zichtbaar voor klanten'; $wb['required_php_snippets_txt'] = 'Vereiste PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/pl_directive_snippets.lng b/interface/web/admin/lib/lang/pl_directive_snippets.lng index 4902bf3282..abef1e28fa 100644 --- a/interface/web/admin/lib/lang/pl_directive_snippets.lng +++ b/interface/web/admin/lib/lang/pl_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Istnieje już zestaw dyrektyw o p $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/pt_directive_snippets.lng b/interface/web/admin/lib/lang/pt_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/pt_directive_snippets.lng +++ b/interface/web/admin/lib/lang/pt_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ro_directive_snippets.lng b/interface/web/admin/lib/lang/ro_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/ro_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ro_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ru_directive_snippets.lng b/interface/web/admin/lib/lang/ru_directive_snippets.lng index cfa09a02fc..120a962d7f 100644 --- a/interface/web/admin/lib/lang/ru_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ru_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Уже есть заготовк $wb['variables_txt'] = 'Переменные:'; $wb['customer_viewable_txt'] = 'Видимый клиентам'; $wb['required_php_snippets_txt'] = 'Обязательная PHP-заготовка'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/se_directive_snippets.lng b/interface/web/admin/lib/lang/se_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/se_directive_snippets.lng +++ b/interface/web/admin/lib/lang/se_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/sk_directive_snippets.lng b/interface/web/admin/lib/lang/sk_directive_snippets.lng index 0616afad8b..071d6f4fed 100644 --- a/interface/web/admin/lib/lang/sk_directive_snippets.lng +++ b/interface/web/admin/lib/lang/sk_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'There is already a directive snip $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; $wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/tr_directive_snippets.lng b/interface/web/admin/lib/lang/tr_directive_snippets.lng index 448d453672..4c1cebea4e 100644 --- a/interface/web/admin/lib/lang/tr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/tr_directive_snippets.lng @@ -9,4 +9,5 @@ $wb['directive_snippets_name_error_unique'] = 'Aynı adlı bir yönerge kod par $wb['variables_txt'] = 'Değişkenler'; $wb['customer_viewable_txt'] = 'Müşteri görebilir'; $wb['required_php_snippets_txt'] = 'Gerekli PHP Parçası'; +$wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/templates/directive_snippets_edit.htm b/interface/web/admin/templates/directive_snippets_edit.htm index ee4d2ab3cd..4506cafd63 100644 --- a/interface/web/admin/templates/directive_snippets_edit.htm +++ b/interface/web/admin/templates/directive_snippets_edit.htm @@ -36,7 +36,10 @@ {tmpl_var name='active'}
    - +
    + +
    {tmpl_var name='update_sites'}
    +
    diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php index 02f31510c2..609e9212dc 100644 --- a/server/mods-available/web_module.inc.php +++ b/server/mods-available/web_module.inc.php @@ -32,7 +32,8 @@ class web_module { var $module_name = 'web_module'; var $class_name = 'web_module'; - var $actions_available = array( 'web_domain_insert', + var $actions_available = array( + 'web_domain_insert', 'web_domain_update', 'web_domain_delete', 'ftp_user_insert', @@ -64,7 +65,9 @@ class web_module { 'aps_package_delete', 'aps_setting_insert', 'aps_setting_update', - 'aps_setting_delete'); + 'aps_setting_delete', + 'directive_snippets_update' + ); //* This function is called during ispconfig installation to determine // if a symlink shall be created for this plugin. @@ -114,6 +117,7 @@ class web_module { $app->modules->registerTableHook('aps_instances_settings', 'web_module', 'process'); $app->modules->registerTableHook('aps_packages', 'web_module', 'process'); $app->modules->registerTableHook('aps_settings', 'web_module', 'process'); + $app->modules->registerTableHook('directive_snippets', 'web_module', 'process'); // Register service $app->services->registerService('httpd', 'web_module', 'restartHttpd'); @@ -185,6 +189,11 @@ class web_module { if($action == 'u') $app->plugins->raiseEvent('aps_setting_update', $data); if($action == 'd') $app->plugins->raiseEvent('aps_setting_delete', $data); break; + case 'directive_snippets': + if($action == 'i') $app->plugins->raiseEvent('directive_snippets_insert', $data); + if($action == 'u') $app->plugins->raiseEvent('directive_snippets_update', $data); + if($action == 'd') $app->plugins->raiseEvent('directive_snippets_delete', $data); + break; } // end switch } // end function diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 4553208638..3ef5e21467 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -93,6 +93,34 @@ class apache2_plugin { $app->plugins->registerEvent('ftp_user_delete', $this->plugin_name, 'ftp_user_delete'); $app->plugins->registerAction('php_ini_changed', $this->plugin_name, 'php_ini_changed'); + + $app->plugins->registerEvent('directive_snippets_update', $this->plugin_name, 'directive_snippets'); + } + + function directive_snippets($event_name, $data) { + global $app, $conf; + + $snippet = $data['new']; + if($snippet['active'] == 'y' && $snippet['update_sites'] == 'y') { + if($snippet['type'] == 'php') { + $rlike = $snippet['directive_snippets_id'].'|,'.$snippet['directive_snippets_id'].'|'.$snippet['directive_snippets_id'].','; + $affected_snippets = $app->db->queryAllRecords('SELECT directive_snippets_id FROM directive_snippets WHERE required_php_snippets RLIKE(?) AND type = ?', $rlike, 'apache'); + if(is_array($affected_snippets) && !empty($affected_snippets)) { + foreach($affected_snippets as $snippet) $sql_in[] = $snippet['directive_snippets_id']; + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id IN('.implode(',', $sql_in).')', $conf['server_id']); + } + } + if($snippet['type'] == 'apache') $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id = ?', $conf['server_id'], $snippet['directive_snippets_id']); + + if(is_array($affected_sites) && !empty($affected_sites)) { + foreach($affected_sites as $site) { + $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $site['domain_id']); + $new_data['old'] = $website; + $new_data['new'] = $website; + $this->update('web_domain_update', $new_data); + } + } + } } private function get_master_php_ini_content($web_data) { diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 4116c18676..85661b97ce 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -88,6 +88,35 @@ class nginx_plugin { $app->plugins->registerEvent('web_folder_update', $this->plugin_name, 'web_folder_update'); $app->plugins->registerEvent('web_folder_delete', $this->plugin_name, 'web_folder_delete'); + + $app->plugins->registerEvent('directive_snippets_update', $this->plugin_name, 'directive_snippets'); + } + + function directive_snippets($event_name, $data) { + global $app, $conf; + + $snippet = $data['new']; + + if($snippet['active'] == 'y' && $snippet['update_sites'] == 'y') { + if($snippet['type'] == 'php') { + $rlike = $snippet['directive_snippets_id'].'|,'.$snippet['directive_snippets_id'].'|'.$snippet['directive_snippets_id'].','; + $affected_snippets = $app->db->queryAllRecords('SELECT directive_snippets_id FROM directive_snippets WHERE required_php_snippets RLIKE(?) AND type = ?', $rlike, 'nginx'); + if(is_array($affected_snippets) && !empty($affected_snippets)) { + foreach($affected_snippets as $snippet) $sql_in[] = $snippet['directive_snippets_id']; + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id IN('.implode(',', $sql_in).')', $conf['server_id']); + } + } + if($snippet['type'] == 'nginx') $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id = ?', $conf['server_id'], $snippet['directive_snippets_id']); + + if(is_array($affected_sites) && !empty($affected_sites)) { + foreach($affected_sites as $site) { + $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $site['domain_id']); + $new_data['old'] = $website; + $new_data['new'] = $website; + $this->update('web_domain_update', $new_data); + } + } + } } // Handle the creation of SSL certificates -- GitLab From 2bb522c8c7d281d044084b504668dac24ab5d8ca Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Wed, 29 Jul 2020 07:53:52 +0200 Subject: [PATCH 0373/1368] Update directive_snippets_edit.php --- interface/web/admin/directive_snippets_edit.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/interface/web/admin/directive_snippets_edit.php b/interface/web/admin/directive_snippets_edit.php index af700213a4..e22a7cf42a 100644 --- a/interface/web/admin/directive_snippets_edit.php +++ b/interface/web/admin/directive_snippets_edit.php @@ -77,9 +77,6 @@ class page_action extends tform_actions { } $app->tpl->setVar("is_master", $is_master); - - if($this->dataRecord['managed_snippet_id'] > 0) { - } parent::onShowEnd(); } -- GitLab From 5fb3abafa99f79f0e5052981ab7bb9a49790288c Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Wed, 29 Jul 2020 07:54:48 +0200 Subject: [PATCH 0374/1368] Apply 1 suggestion(s) to 1 file(s) --- server/plugins-available/nginx_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 85661b97ce..f31c378c0f 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -103,7 +103,7 @@ class nginx_plugin { $affected_snippets = $app->db->queryAllRecords('SELECT directive_snippets_id FROM directive_snippets WHERE required_php_snippets RLIKE(?) AND type = ?', $rlike, 'nginx'); if(is_array($affected_snippets) && !empty($affected_snippets)) { foreach($affected_snippets as $snippet) $sql_in[] = $snippet['directive_snippets_id']; - $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id IN('.implode(',', $sql_in).')', $conf['server_id']); + $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id IN ?', $conf['server_id'], $sql_in); } } if($snippet['type'] == 'nginx') $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id = ?', $conf['server_id'], $snippet['directive_snippets_id']); -- GitLab From 4c2cca6dfbf9810f344206ad0ef7503bc95a450d Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Wed, 29 Jul 2020 07:56:57 +0200 Subject: [PATCH 0375/1368] Update apache2_plugin.inc.php --- server/plugins-available/apache2_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 3ef5e21467..584f313e80 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -107,7 +107,7 @@ class apache2_plugin { $affected_snippets = $app->db->queryAllRecords('SELECT directive_snippets_id FROM directive_snippets WHERE required_php_snippets RLIKE(?) AND type = ?', $rlike, 'apache'); if(is_array($affected_snippets) && !empty($affected_snippets)) { foreach($affected_snippets as $snippet) $sql_in[] = $snippet['directive_snippets_id']; - $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id IN('.implode(',', $sql_in).')', $conf['server_id']); + $$affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id IN ?', $conf['server_id'], $sql_in); } } if($snippet['type'] == 'apache') $affected_sites = $app->db->queryAllRecords('SELECT domain_id FROM web_domain WHERE server_id = ? AND directive_snippets_id = ?', $conf['server_id'], $snippet['directive_snippets_id']); -- GitLab From cf865a976be5a079b3269b4e41e34b32ff2fca45 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 29 Jul 2020 08:58:48 +0200 Subject: [PATCH 0376/1368] - added missing server_php_ini column --- install/sql/ispconfig3.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index fae07c8036..c35d55331a 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2081,6 +2081,7 @@ CREATE TABLE `web_domain` ( `folder_directive_snippets` text, `log_retention` int(11) NOT NULL DEFAULT '10', `proxy_protocol` enum('n','y') NOT NULL default 'n', + `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (`domain_id`), UNIQUE KEY `serverdomain` ( `server_id` , `ip_address`, `domain` ) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- GitLab From 3d2b249be9d847b3dcdaf40c4c177bc32dab5f0a Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 29 Jul 2020 12:26:30 +0200 Subject: [PATCH 0377/1368] Fix typo --- server/scripts/ispconfig_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php index 2c77607b65..95652ce747 100644 --- a/server/scripts/ispconfig_update.php +++ b/server/scripts/ispconfig_update.php @@ -86,7 +86,7 @@ echo " _____ ___________ _____ __ _ |___/ "; echo "\n".str_repeat('-', 80)."\n"; echo "\n\n>> Update \n\n"; -echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Update all slave server, before you update master server.\n\n"; +echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Update all slave servers, before you update master server.\n\n"; $method = simple_query('Select update method', array('stable', 'git-stable', 'git-master'), 'stable'); -- GitLab From ba75baa71a7f096cbb0691fff02790d20e6654bf Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 29 Jul 2020 12:28:31 +0200 Subject: [PATCH 0378/1368] Use stable-3.2 branch for git-stable --- server/scripts/update_from_dev_stable.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/scripts/update_from_dev_stable.sh b/server/scripts/update_from_dev_stable.sh index a5dc10605b..693d76fa3b 100644 --- a/server/scripts/update_from_dev_stable.sh +++ b/server/scripts/update_from_dev_stable.sh @@ -10,7 +10,7 @@ exit 1 } -wget -O ispconfig3-dev.tar.gz "https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.1" +wget -O ispconfig3-dev.tar.gz "https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.2" tar xzf ispconfig3-dev.tar.gz echo -n "Latest git version: " -- GitLab From 9f1809cfee90f33a8c24e8e6fbd26a05ea6a7aaa Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 29 Jul 2020 12:30:43 +0200 Subject: [PATCH 0379/1368] Use stable-3.2 branch --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5c251c0e28..01c6f115de 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # ISPConfig - Hosting Control Panel Nightly (master): [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/master/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/master) -Stable branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/stable-3.1/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/stable-3.1) +Stable branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/stable-3.2/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/stable-3.2) - Manage multiple servers from one control panel @@ -11,4 +11,4 @@ Stable branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig - Virtualization (OpenVZ) - Administrator, reseller and client login - Configuration mirroring and clusters -- Open Source software (BSD license) \ No newline at end of file +- Open Source software (BSD license) -- GitLab From 2ece9ca0cee51d82193d9fb5b269434b8168cb79 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Wed, 29 Jul 2020 12:39:07 +0200 Subject: [PATCH 0380/1368] clean up in 150-goaccess.inc.php --- .../lib/classes/cron.d/150-goaccess.inc.php | 186 +++++++++--------- 1 file changed, 95 insertions(+), 91 deletions(-) diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 87c9642b4e..7c70486317 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -80,133 +80,137 @@ class cronjob_goaccess extends cronjob { system("type goaccess 2>&1>/dev/null", $retval); if ($retval === 0) { - foreach($records as $rec) { - $yesterday = date('Ymd', strtotime("-1 day", time())); + foreach($records as $rec) { + $yesterday = date('Ymd', strtotime("-1 day", time())); - $log_folder = 'log'; + $log_folder = 'log'; - if($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') { - $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']); - $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $rec['domain']); - if($subdomain_host == '') $subdomain_host = 'web'.$rec['domain_id']; - $log_folder .= '/' . $subdomain_host; - unset($tmp); - } + if($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') { + $tmp = $app->db->queryOneRecord('SELECT `domain` FROM web_domain WHERE domain_id = ?', $rec['parent_domain_id']); + $subdomain_host = preg_replace('/^(.*)\.' . preg_quote($tmp['domain'], '/') . '$/', '$1', $rec['domain']); + if($subdomain_host == '') $subdomain_host = 'web'.$rec['domain_id']; + $log_folder .= '/' . $subdomain_host; + unset($tmp); + } - $logfile = escapeshellcmd($rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'); + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log'; - if(!@is_file($logfile)) { - $logfile = escapeshellcmd($rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log.gz'); if(!@is_file($logfile)) { - continue; + $logfile = $rec['document_root'].'/' . $log_folder . '/'.$yesterday.'-access.log.gz'; + if(!@is_file($logfile)) { + continue; + } } - } - $web_folder = (($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') ? $rec['web_folder'] : 'web'); - $domain = escapeshellcmd($rec['domain']); - $statsdir = escapeshellcmd($rec['document_root'].'/'.$web_folder.'/stats'); - $goaccess_conf = escapeshellcmd($rec['document_root'].'/log/goaccess.conf'); + $web_folder = (($rec['type'] == 'vhostsubdomain' || $rec['type'] == 'vhostalias') ? $rec['web_folder'] : 'web'); + $domain = $rec['domain']; + $statsdir = $rec['document_root'].'/'.$web_folder.'/stats'; + $goaccess_conf = $rec['document_root'].'/log/goaccess.conf'; - /* - In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. - By default the originally, with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. - */ - - if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { - copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); - } elseif(!file_exists($goaccess_conf)) { /* - By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. - Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. + By default the originally, with GoAccess shipped goaccess.conf from /etc/ or /etc/goaccess will be used along with the log-format value COMBINED. */ - copy($goaccess_conf_main, $goaccess_conf); - file_put_contents($goaccess_conf, preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", file_get_contents($goaccess_conf))); - } - /* Update the primary domain name in the title, it could occasionally change */ - if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { - $goaccess_content = file_get_contents($goaccess_conf); - file_put_contents($goaccess_conf, preg_replace('/^(#)?html-report-title(.*)?/m', "html-report-title $domain", file_get_contents($goaccess_conf))); - } + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master") && (!file_exists($goaccess_conf))) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master", $goaccess_conf); + } elseif(!file_exists($goaccess_conf)) { + /* + By default the goaccess.conf should get copied by the webserver plugin but in case it wasn't, or it got deleted by accident we gonna copy it again to the destination dir. + Also there was no /usr/local/ispconfig/server/conf-custom/goaccess.conf.master, so we gonna use /etc/goaccess.conf as the base conf. + */ + copy($goaccess_conf_main, $goaccess_conf); + file_put_contents($goaccess_conf, preg_replace('/^(#)?log-format COMBINED/m', "log-format COMBINED", file_get_contents($goaccess_conf))); + } + + /* Update the primary domain name in the title, it could occasionally change */ + if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { + $goaccess_content = file_get_contents($goaccess_conf); + file_put_contents($goaccess_conf, preg_replace('/^(#)?html-report-title(.*)?/m', "html-report-title $domain", file_get_contents($goaccess_conf))); + unset($goaccess_content); + } - if(!@is_dir($statsdir)) mkdir($statsdir); - $username = escapeshellcmd($rec['system_user']); - $groupname = escapeshellcmd($rec['system_group']); - $docroot = $rec['document_root']; - $goa_db_dir = $docroot.'/'.$web_folder.'/stats/.db/'; - $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; - if(!@is_dir($goa_db_dir)) mkdir($goa_db_dir); + if(!@is_dir($statsdir)) mkdir($statsdir); + $username = $rec['system_user']; + $groupname = $rec['system_group']; + $docroot = $rec['document_root']; - if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); - symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + $goa_db_dir = $docroot.'/'.$web_folder.'/stats/.db/'; + $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; + if(!@is_dir($goa_db_dir)) mkdir($goa_db_dir); + + if(is_link('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log')) unlink('/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); + symlink($logfile, '/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log'); - chown($statsdir, $username); - chgrp($statsdir, $groupname); + chown($statsdir, $username); + chgrp($statsdir, $groupname); - $goamonth = date("n"); - $goayear = date("Y"); + $goamonth = date("n"); + $goayear = date("Y"); - if (date("d") == 1) { - $goamonth = date("m")-1; - if (date("m") == 1) { - $goayear = date("Y")-1; - $goamonth = "12"; + if (date("d") == 1) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } } - } - if (date("d") == 2) { - $goamonth = date("m")-1; - if (date("m") == 1) { - $goayear = date("Y")-1; - $goamonth = "12"; - } + if (date("d") == 2) { + $goamonth = date("m")-1; + if (date("m") == 1) { + $goayear = date("Y")-1; + $goamonth = "12"; + } - $statsdirold = $statsdir."/".$goayear."-".$goamonth."/"; + $statsdirold = $statsdir."/".$goayear."-".$goamonth."/"; - if(!is_dir($statsdirold)) { - mkdir($statsdirold); - } + if(!is_dir($statsdirold)) { + mkdir($statsdirold); + } - rename($goa_db_dir, $statsdirold.'db'); - mkdir($goa_db_dir); + // don't rotate db files per month + //rename($goa_db_dir, $statsdirold.'db'); + //mkdir($goa_db_dir); - $files = scandir($statsdir); - foreach ($files as $file) { - if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + $files = scandir($statsdir); + + foreach ($files as $file) { + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + } } - } - $output = shell_exec('goaccess --help'); + $output = shell_exec('goaccess --help'); - if(preg_match('/keep-db-files/', $output)) { - $app->system->exec_safe("goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $logfile, $goaccess_conf, $goa_db_dir, $output_html); + if(preg_match('/keep-db-files/', $output)) { + $app->system->exec_safe("goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $logfile, $goaccess_conf, $goa_db_dir, $output_html); - if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { - if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { - copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); - } else { - copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { + copy("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } else { + copy("/usr/local/ispconfig/server/conf/goaccess_index.php.master", $rec['document_root']."/".$web_folder."/stats/index.php"); + } } - } - $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); - if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { - chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); - chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); - } + $app->log('Created GoAccess statistics for ' . $domain, LOGLEVEL_DEBUG); + if(is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { + chown($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_user']); + chgrp($rec['document_root']."/".$web_folder."/stats/index.php", $rec['system_group']); + } - $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); + $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); - } else { - $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support!", LOGLEVEL_ERROR); - } + } else { + $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support!", LOGLEVEL_ERROR); + } - unset($output); + unset($output); } } else { -- GitLab From 81d93e4fcc0c7ede1b1b72c4c2a078fd43c2e73f Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Wed, 29 Jul 2020 13:26:28 +0200 Subject: [PATCH 0381/1368] added GoAccess index file compatiblity to awstats_index.php.master --- server/conf/awstats_index.php.master | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/server/conf/awstats_index.php.master b/server/conf/awstats_index.php.master index f7222c9687..b3e694ebbf 100644 --- a/server/conf/awstats_index.php.master +++ b/server/conf/awstats_index.php.master @@ -45,10 +45,21 @@ arsort($awprev); $options = ""; foreach ($awprev as $key => $value) { + + if(file_exists($value.'/awsindex.html') && file_exists($value.'/goaindex.html')) { + $awstatsindex = 'awsindex.html'; + } elseif(file_exists($value.'/awsindex.html') && !file_exists($value.'/goaindex.html')) { + $awstatsindex = 'awsindex.html'; + } else { + $awstatsindex = 'goaindex.html'; + } + if($key == $current) $options .= "\n"; else $options .= "\n"; } +$awstatsindex = 'awsindex.html'; + $html = "\n\n\nStats\n"; $html .= " -
    -

    Home

    -
    -ISPConfig 3 remote API documentation. -
    - - + + + + ISPCOnfig 3 remote API documentation + + + + + + + +
    +

    ISPConfig 3 Remote API Documentation

    +
    +

    Notes

    + +

    These notes are new for v3.2 and the content will change.
    + This is currently in FAQ format, because the topics seem to be Frequently Asked Questions.
    + Over time, notes will also be added to individual function pages.
    + If you would like to help with this process, please visit the forum, and add your comments to this thread + which has been created for this purpose.
    + Thank you for your patience and collaboration. +

    + +

    What do we do to get started with API calls?

    +
    +

    Create a "Remote" User in the ISPConfig UI. Check boxes there to assign permissions for + the kinds of queries that can be processed by that user.

    +

    Almost all API queries require a session_id. To get that, call the login function, sending the remote + username and password. The response will be a single value which will be used as your session ID for + a limited time period for all other requests.

    +

    Finishing with a logout request is recommended, but optional since the session IDs expire.

    +
    + +

    How do I get all records with a _get request?

    +
    Rather than using a single integer ID as a primary key selector (domain_id, group_id, + etc), use -1. Where the primary key for a _get request is a string, use an empty array ' [] '. Do not + use an empty string ' "" ', which is itself a valid string and will/should return an empty array result. +
    + +

    Are defaults used if we only send some of the defined parameters?

    +
    No, there are no default values except where explicitly noted. For example, in the + system_config_get function, the key element is optional because it is documented as defaulting to an + empty string. For all requests, except where documented otherwise, send all documented parameters.
    + +

    Examples are provided for SOAP, why not for REST?

    +
    The REST API supports all functions and can be exactly substituted for SOAP examples. + For all functions, the request and response parameters are the same for SOAP and REST.
    + +

    Are there examples for cURL? Python? C#? JavaScript? (anything else...)

    +
    The documentation details request and response parameters which can be passed using any + language or toolchain. The URL always includes the function name. Queries are always sent via POST. The + result is always in the same JSON format. Use Postman or another tool to generate code in your preferred + languages.
    + +

    I created a new record (domain, mail user, etc). Why isn't it showing in the UI?

    +
    If a parent ID is invalid, a transaction may be accepted, with a record created under a + different parent entity. +
    + +

    Why does a response show a successful result when there is no data?

    +
    Carefully check the names and values being sent. Invalid name/value pairs are ignored. A + request that does not include a valid request paramenter is requesting nothing, so the return value is + nothing. The query was successful, and returned no data.
    + +

    Why are parameters $session_id and others being ignored?

    +
    The documentation shows PHP function syntax. SOAP and REST parameters do not include the + leading $dollar-sign
    + +

    Key Concept:

    +
    Based on the above you may be thinking there is very little error checking with this + API. That is correct. As noted by Jesse Norell:
    "The api is largely just an interface to the + database tables, and will usually accept what you send, whether that's consistent/correct or not. It + can be a feature, eg. you can create a mail alias first before creating the mailbox to which it + forwards, but it does mean you have a lot more testing to do on your side because you can't just + rely on an error to be thrown if you send inconsistent data."
    +
    + +

    What is sys_userid and sys_groupid?

    +
    +

    These fields are referenced often in the developer forum and in code, usually with some confusion. + These internal database fields are used in SQL queries to determine parent/child client + relationships. The fields are not passed to API calls, with the exception of one function, + client_get_id which is a convenience function to return the client_id for a sys_userid. In the past + other functions included these keys in the request. Now, when a function request includes a + client_id, at query time a lookup is done to get the internal sys_userid for that client.

    +

    The sys_userid can identify the creator of a record. This may be the ID of the local/UI user or the + remote/API user that is logging in to create records. If a client record is created without a + reseller, both the sys_userid and the sys_groupid are the same user ID.

    +

    If a client record is created with a reseller, the meaning of the fields is completely different. The + sys_userid is not a logged-in user ID. It is a new ID that represents the client under the reseller. + The sys_groupid for a client under a reseller is (a foreign-key to) the sys_userid of the client + record for the reseller. In this scenario, the sys_groupid establishes a child-to-parent + relationship.

    +
    + +

    What domains are the 'domains_' functions operating on?

    +
    The 'domains_' functions update the 'domains' table, which is used by the domain limit + module. Clients and resellers are restricted to the domains in this table. To activate domain limits, go + to System > Interface > Main Config, then to the Domains tab. Logout/in. Then go to Sites, Add or Edit a + site, the "Domain" dropdown list uses this table.
    + +

    What will be here next?

    +
    Maybe something you write...
    + +
    +
    + + + + \ No newline at end of file -- GitLab From 2523240691f1eac72b03c41b1a3500c2c88b9c8c Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 19 Aug 2020 20:42:08 +0200 Subject: [PATCH 0472/1368] Update letsencrypt.inc.php --- server/lib/classes/letsencrypt.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 3923954e10..3ce63b48b4 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class letsencrypt { - /** + /** * Construct for this class * * @return system -- GitLab From e439437f6b2c325653bfaf7347a35018a89b489f Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 19 Aug 2020 21:36:15 +0200 Subject: [PATCH 0473/1368] Make allow-transfer globally configurable (#5485) --- install/tpl/named.conf.options.master | 9 +-- server/plugins-available/bind_plugin.inc.php | 72 ++++++++++---------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/install/tpl/named.conf.options.master b/install/tpl/named.conf.options.master index f13976ffd6..88c0e06493 100644 --- a/install/tpl/named.conf.options.master +++ b/install/tpl/named.conf.options.master @@ -5,9 +5,9 @@ options { // to talk to, you may need to fix the firewall to allow multiple // ports to talk. See http://www.kb.cert.org/vuls/id/800113 - // If your ISP provided one or more IP addresses for stable - // nameservers, you probably want to use them as forwarders. - // Uncomment the following block, and insert the addresses replacing + // If your ISP provided one or more IP addresses for stable + // nameservers, you probably want to use them as forwarders. + // Uncomment the following block, and insert the addresses replacing // the all-0's placeholder. // forwarders { @@ -21,8 +21,9 @@ options { dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; + + allow-transfer {none;}; auth-nxdomain no; # conform to RFC1035 listen-on-v6 { any; }; }; - diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php index e915f447ff..b152a8758d 100644 --- a/server/plugins-available/bind_plugin.inc.php +++ b/server/plugins-available/bind_plugin.inc.php @@ -85,17 +85,17 @@ class bind_plugin { //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - + $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$this->zone_file_prefix().$domain)) return false; - + //* Check Entropy if (file_get_contents('/proc/sys/kernel/random/entropy_avail') < 400) { $app->log('DNSSEC ERROR: We are low on entropy. Not generating new Keys for '.$domain.'. Please consider installing package haveged.', LOGLEVEL_WARN); echo "DNSSEC ERROR: We are low on entropy. Not generating new Keys for $domain. Please consider installing package haveged.\n"; return false; } - + //* Verify that we do not already have keys (overwriting-protection) if($data['old']['dnssec_algo'] == $data['new']['dnssec_algo']) { if (file_exists($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.')) { @@ -111,10 +111,10 @@ class bind_plugin { } } } - + // Get DNSSEC Algorithms $dnssec_algo = explode(',',$data['new']['dnssec_algo']); - + //* Create the Zone Signing and Key Signing Keys if(in_array('ECDSAP256SHA256',$dnssec_algo) && count(glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+013*.key')) == 0) { $app->system->exec_safe('cd ?; dnssec-keygen -3 -a ECDSAP256SHA256 -n ZONE ?; dnssec-keygen -f KSK -3 -a ECDSAP256SHA256 -n ZONE ?', $dns_config['bind_zonefiles_dir'], $domain, $domain); @@ -126,27 +126,27 @@ class bind_plugin { $this->soa_dnssec_sign($data); //Now sign the zone for the first time $data['new']['dnssec_initialized']='Y'; } - + function soa_dnssec_sign(&$data) { global $app, $conf; - + //* Load libraries $app->uses("getconf,tpl"); //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - + $filespre = $this->zone_file_prefix(); $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain)) return false; - + //* Get DNSSEC Algorithms $dnssec_algo = explode(',',$data['new']['dnssec_algo']); - + //* Get Zone file content $zonefile = file_get_contents($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain); $keycount=0; - + //* Include ECDSAP256SHA256 keys in zone if(in_array('ECDSAP256SHA256',$dnssec_algo)) { foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+013*.key') as $keyfile) { @@ -155,7 +155,7 @@ class bind_plugin { $keycount++; } } - + //* Include NSEC3RSASHA1 keys in zone if(in_array('NSEC3RSASHA1',$dnssec_algo)) { foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+007*.key') as $keyfile) { @@ -164,35 +164,35 @@ class bind_plugin { $keycount++; } } - + $keycount_wanted = count(explode(',',$data['new']['dnssec_algo']))*2; - + if ($keycount != $keycount_wanted) $app->log('DNSSEC Warning: There are more or less than 2 keyfiles for each algorithm for zone '.$domain.'. Found: '.$keycount. ' Expected: '.$keycount_wanted, LOGLEVEL_WARN); file_put_contents($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain, $zonefile); - + //* Sign the zone and set it valid for max. 16 days $app->system->exec_safe('cd ?; dnssec-signzone -A -e +1382400 -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N increment -o ? -t ?', $dns_config['bind_zonefiles_dir'], $domain, $filespre.$domain); - + //* Write Data back ino DB $dnssecdata = "DS-Records:\n".file_get_contents($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.'); $dnssecdata .= "\n------------------------------------\n\nDNSKEY-Records:\n"; - + if(in_array('ECDSAP256SHA256',$dnssec_algo)) { foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+013*.key') as $keyfile) { $dnssecdata .= file_get_contents($keyfile)."\n\n"; } } - + if(in_array('NSEC3RSASHA1',$dnssec_algo)) { foreach (glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+007*.key') as $keyfile) { $dnssecdata .= file_get_contents($keyfile)."\n\n"; } } - + if ($app->dbmaster !== $app->db) $app->dbmaster->query('UPDATE dns_soa SET dnssec_info=?, dnssec_initialized=\'Y\', dnssec_last_signed=? WHERE id=?', $dnssecdata, intval(time()), intval($data['new']['id'])); $app->db->query('UPDATE dns_soa SET dnssec_info=?, dnssec_initialized=\'Y\', dnssec_last_signed=? WHERE id=?', $dnssecdata, intval(time()), intval($data['new']['id'])); } - + function soa_dnssec_update(&$data, $new=false) { global $app, $conf; @@ -201,20 +201,20 @@ class bind_plugin { //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - + $filespre = $this->zone_file_prefix(); $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); if (!file_exists($dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain)) return false; - + //* Check for available entropy if (file_get_contents('/proc/sys/kernel/random/entropy_avail') < 200) { $app->log('DNSSEC ERROR: We are low on entropy. This could cause server script to fail. Please consider installing package haveged.', LOGLEVEL_ERR); echo "DNSSEC ERROR: We are low on entropy. This could cause server script to fail. Please consider installing package haveged.\n"; return false; } - + if (!$new && !file_exists($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.')) $this->soa_dnssec_create($data); - + $dbdata = $app->db->queryOneRecord('SELECT id,serial FROM dns_soa WHERE id=?', intval($data['new']['id'])); $app->system->exec_safe('cd ?; named-checkzone ? ? | egrep -ho \'[0-9]{10}\'', $dns_config['bind_zonefiles_dir'], $domain, $dns_config['bind_zonefiles_dir'].'/'.$filespre.$domain); $retState = $app->system->last_exec_retcode(); @@ -222,10 +222,10 @@ class bind_plugin { $app->log('DNSSEC Error: Error in Zonefile for '.$domain, LOGLEVEL_ERR); return false; } - + $this->soa_dnssec_sign($data); } - + function soa_dnssec_delete(&$data) { global $app, $conf; @@ -234,16 +234,16 @@ class bind_plugin { //* load the server configuration options $dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns'); - + $domain = substr($data['new']['origin'], 0, strlen($data['new']['origin'])-1); - + $key_files = glob($dns_config['bind_zonefiles_dir'].'/K'.$domain.'.+*'); foreach($key_files as $file) { unlink($file); } unlink($dns_config['bind_zonefiles_dir'].'/'.$this->zone_file_prefix().$domain.'.signed'); unlink($dns_config['bind_zonefiles_dir'].'/dsset-'.$domain.'.'); - + if ($app->dbmaster !== $app->db) $app->dbmaster->query('UPDATE dns_soa SET dnssec_info=\'\', dnssec_initialized=\'N\' WHERE id=?', intval($data['new']['id'])); $app->db->query('UPDATE dns_soa SET dnssec_info=\'\', dnssec_initialized=\'N\' WHERE id=?', intval($data['new']['id'])); } @@ -345,9 +345,9 @@ class bind_plugin { unset($records_out); unset($zone); } - + //* DNSSEC-Implementation - if($data['old']['origin'] != $data['new']['origin']) { + if($data['old']['origin'] != $data['new']['origin']) { if (@$data['old']['dnssec_initialized'] == 'Y' && strlen(@$data['old']['origin']) > 3) $this->soa_dnssec_delete($data); //delete old keys if ($data['new']['dnssec_wanted'] == 'Y') $this->soa_dnssec_create($data); } elseif($data['old']['dnssec_algo'] != $data['new']['dnssec_algo']) { @@ -362,7 +362,7 @@ class bind_plugin { $this->soa_dnssec_update($data); } // END DNSSEC - + //* rebuild the named.conf file if the origin has changed or when the origin is inserted. //if($this->action == 'insert' || $data['old']['origin'] != $data['new']['origin']) { $this->write_named_conf($data, $dns_config); @@ -376,7 +376,7 @@ class bind_plugin { if(is_file($filename.'.err')) unlink($filename.'.err'); if(is_file($filename.'.signed')) unlink($filename.'.signed'); } - + //* Restart bind nameserver if update_acl is not empty, otherwise reload it if($data['new']['update_acl'] != '') { $app->services->restartServiceDelayed('bind', 'restart'); @@ -407,7 +407,7 @@ class bind_plugin { //delete keys $app->system->exec_safe('/usr/local/ispconfig/server/scripts/dnssec-delete.sh ?', $data['old']['origin']); } - + //* Reload bind nameserver $app->services->restartServiceDelayed('bind', 'reload'); @@ -532,8 +532,6 @@ class bind_plugin { $options = ''; if(trim($tmp['xfer']) != '') { $options .= " allow-transfer {".str_replace(',', ';', $tmp['xfer']).";};\n"; - } else { - $options .= " allow-transfer {none;};\n"; } if(trim($tmp['also_notify']) != '') $options .= ' also-notify {'.str_replace(',', ';', $tmp['also_notify']).";};\n"; if(trim($tmp['update_acl']) != '') $options .= " allow-update {".str_replace(',', ';', $tmp['update_acl']).";};\n"; @@ -557,7 +555,7 @@ class bind_plugin { foreach($tmps_sec as $tmp) { // When you have more than one master, the serial number is used to determine which Master has the most current version of the zone by the - // slaves. The slaves actually ask for the SOA record from each Master when refreshing. + // slaves. The slaves actually ask for the SOA record from each Master when refreshing. $options = " masters {".str_replace(',', ';', $tmp['ns']).";};\n"; if(trim($tmp['xfer']) != '') { $options .= " allow-transfer {".str_replace(',', ';', $tmp['xfer']).";};\n"; -- GitLab From 2fccbbf13f6188d5d6b7a6128d5642809cb49133 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 20 Aug 2020 17:04:57 +0200 Subject: [PATCH 0474/1368] Update client_change_password.php --- remoting_client/examples/client_change_password.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/remoting_client/examples/client_change_password.php b/remoting_client/examples/client_change_password.php index 009d3ec1d9..9782cc9569 100644 --- a/remoting_client/examples/client_change_password.php +++ b/remoting_client/examples/client_change_password.php @@ -21,7 +21,7 @@ try { $success = $client->client_change_password($session_id, $client_id, $new_password); - if ($success = 1) + if ($success == 1) { echo "Password has been changed successfully"; } -- GitLab From 2d2e17b06e2fe683ba087402910b5383a6bec286 Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 20 Aug 2020 17:45:59 +0200 Subject: [PATCH 0475/1368] Add changes from !1024 for mailusers (#5697) --- interface/web/mailuser/lib/lang/ar_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/bg_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/br_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/ca_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/cz_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/de_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/dk_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/el_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/en_mail_user_spamfilter.lng | 4 ++-- interface/web/mailuser/lib/lang/es_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/fi_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/fr_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/hr_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/hu_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/id_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/ja_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/nl_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/pl_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/pt_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/ro_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/ru_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/se_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/sk_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/lib/lang/tr_mail_user_spamfilter.lng | 2 +- interface/web/mailuser/mail_user_spamfilter_edit.php | 4 ++-- 26 files changed, 28 insertions(+), 28 deletions(-) diff --git a/interface/web/mailuser/lib/lang/ar_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/ar_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/ar_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/ar_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/bg_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/bg_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/bg_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/bg_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/br_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/br_mail_user_spamfilter.lng index eb36922041..360d47d9cc 100644 --- a/interface/web/mailuser/lib/lang/br_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/br_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Filtros anti-spam'; $wb['spamfilter_txt'] = 'Filtro anti-spam'; $wb['email_txt'] = 'e-Mail'; -$wb['no_policy'] = '-desabilitado-'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Política'; ?> diff --git a/interface/web/mailuser/lib/lang/ca_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/ca_mail_user_spamfilter.lng index 2b29913e5f..00ed8174f4 100644 --- a/interface/web/mailuser/lib/lang/ca_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/ca_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Courriel'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/cz_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/cz_mail_user_spamfilter.lng index 2a53036be6..e6a50b96f8 100644 --- a/interface/web/mailuser/lib/lang/cz_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/cz_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamový filtr'; $wb['spamfilter_txt'] = 'Spamový filtr'; $wb['email_txt'] = 'E-mail'; -$wb['no_policy'] = '- nepovoleno -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Politika'; ?> diff --git a/interface/web/mailuser/lib/lang/de_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/de_mail_user_spamfilter.lng index 47ac53a006..d444899a8f 100644 --- a/interface/web/mailuser/lib/lang/de_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/de_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'E-Mail'; -$wb['no_policy'] = '- nicht aktiviert -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Richtlinie'; ?> diff --git a/interface/web/mailuser/lib/lang/dk_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/dk_mail_user_spamfilter.lng index f43190d492..fb05b7565c 100644 --- a/interface/web/mailuser/lib/lang/dk_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/dk_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'E-mail'; -$wb['no_policy'] = '- ikke aktiveret -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Politik'; ?> diff --git a/interface/web/mailuser/lib/lang/el_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/el_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/el_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/el_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/en_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/en_mail_user_spamfilter.lng index 8f95dd37a7..030e4fce59 100644 --- a/interface/web/mailuser/lib/lang/en_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/en_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb["mailbox_spamfilter_txt"] = 'Spamfilter'; $wb["spamfilter_txt"] = 'Spamfilter'; $wb["email_txt"] = 'Email'; -$wb["no_policy"] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb["policy_txt"] = 'Policy'; -?> \ No newline at end of file +?> diff --git a/interface/web/mailuser/lib/lang/es_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/es_mail_user_spamfilter.lng index 31d7ba7c74..2496d26f93 100644 --- a/interface/web/mailuser/lib/lang/es_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/es_mail_user_spamfilter.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/mailuser/lib/lang/fi_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/fi_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/fi_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/fi_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/fr_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/fr_mail_user_spamfilter.lng index f6bcd5d32d..1574f45f3f 100644 --- a/interface/web/mailuser/lib/lang/fr_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/fr_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Filtre anti-spam'; $wb['spamfilter_txt'] = 'Filtre anti-spam'; $wb['email_txt'] = 'E-mail'; -$wb['no_policy'] = '- non activé -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Stratégie'; ?> diff --git a/interface/web/mailuser/lib/lang/hr_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/hr_mail_user_spamfilter.lng index 7d7130e816..b2d208a098 100644 --- a/interface/web/mailuser/lib/lang/hr_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/hr_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spam filter'; $wb['spamfilter_txt'] = 'Spam filter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- isključeno -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Pravila'; ?> diff --git a/interface/web/mailuser/lib/lang/hu_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/hu_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/hu_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/hu_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/id_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/id_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/id_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/id_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng index 9d4c5496ea..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- non abilitato -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/ja_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/ja_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/ja_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/ja_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/nl_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/nl_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/nl_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/nl_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/pl_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/pl_mail_user_spamfilter.lng index b371f3ea75..5a530c0c5e 100644 --- a/interface/web/mailuser/lib/lang/pl_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/pl_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Ustawienia filtra spamu'; $wb['spamfilter_txt'] = 'Filtr spamu'; $wb['email_txt'] = 'E-mail'; -$wb['no_policy'] = '- nie włączony -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Polityka'; ?> diff --git a/interface/web/mailuser/lib/lang/pt_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/pt_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/pt_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/pt_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/ro_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/ro_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/ro_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/ro_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/ru_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/ru_mail_user_spamfilter.lng index a4b7a48b7f..1a168b7610 100644 --- a/interface/web/mailuser/lib/lang/ru_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/ru_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Спам-фильтр'; $wb['spamfilter_txt'] = 'СПАМ-фильтр'; $wb['email_txt'] = 'Адрес эл. почты'; -$wb['no_policy'] = '- Отсутствует -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Правило'; ?> diff --git a/interface/web/mailuser/lib/lang/se_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/se_mail_user_spamfilter.lng index 7ec5f2a7d8..8cc318e71c 100644 --- a/interface/web/mailuser/lib/lang/se_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/se_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Epost'; -$wb['no_policy'] = '- ej aktiverat -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/sk_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/sk_mail_user_spamfilter.lng index be4bad9050..fc355eb920 100644 --- a/interface/web/mailuser/lib/lang/sk_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/sk_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Spamfilter'; $wb['spamfilter_txt'] = 'Spamfilter'; $wb['email_txt'] = 'Email'; -$wb['no_policy'] = '- not enabled -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Policy'; ?> diff --git a/interface/web/mailuser/lib/lang/tr_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/tr_mail_user_spamfilter.lng index 3426385a2e..25bd43520a 100644 --- a/interface/web/mailuser/lib/lang/tr_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/tr_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Önemsiz İleti Süzgeci'; $wb['spamfilter_txt'] = 'Önemsiz ileti süzgeci'; $wb['email_txt'] = 'E-posta'; -$wb['no_policy'] = '- devre dışı -'; +$wb['inherit_policy'] = '- Inherit domain setting -'; $wb['policy_txt'] = 'Kural'; ?> diff --git a/interface/web/mailuser/mail_user_spamfilter_edit.php b/interface/web/mailuser/mail_user_spamfilter_edit.php index abbea21937..75649b5a70 100644 --- a/interface/web/mailuser/mail_user_spamfilter_edit.php +++ b/interface/web/mailuser/mail_user_spamfilter_edit.php @@ -52,7 +52,7 @@ class page_action extends tform_actions { function onShow() { global $app; - + $this->id = $app->functions->intval($_SESSION['s']['user']['mailuser_id']); parent::onShow(); @@ -118,7 +118,7 @@ class page_action extends tform_actions { $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $rec['email']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; + $policy_select = ""; if(is_array($policys)) { foreach( $policys as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; -- GitLab From a460495999657c69923e267a3bd7bdcf670abbda Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 20 Aug 2020 17:55:07 +0200 Subject: [PATCH 0476/1368] Add autoresponder changes from !1058 for mailusers (#5697) --- .../form/mail_user_autoresponder.tform.php | 16 ++++++++++------ .../lib/lang/ar_mail_user_autoresponder.lng | 2 +- .../lib/lang/bg_mail_user_autoresponder.lng | 2 +- .../lib/lang/br_mail_user_autoresponder.lng | 2 +- .../lib/lang/ca_mail_user_autoresponder.lng | 2 +- .../lib/lang/cz_mail_user_autoresponder.lng | 2 +- .../lib/lang/de_mail_user_autoresponder.lng | 2 +- .../lib/lang/dk_mail_user_autoresponder.lng | 2 +- .../lib/lang/el_mail_user_autoresponder.lng | 2 +- .../lib/lang/es_mail_user_autoresponder.lng | 2 +- .../lib/lang/fi_mail_user_autoresponder.lng | 2 +- .../lib/lang/hr_mail_user_autoresponder.lng | 2 +- .../lib/lang/hu_mail_user_autoresponder.lng | 2 +- .../lib/lang/id_mail_user_autoresponder.lng | 2 +- .../lib/lang/it_mail_user_autoresponder.lng | 2 +- .../lib/lang/ja_mail_user_autoresponder.lng | 2 +- .../lib/lang/pl_mail_user_autoresponder.lng | 2 +- .../lib/lang/pt_mail_user_autoresponder.lng | 2 +- .../lib/lang/ro_mail_user_autoresponder.lng | 2 +- .../lib/lang/ru_mail_user_autoresponder.lng | 2 +- .../lib/lang/sk_mail_user_autoresponder.lng | 2 +- .../lib/lang/tr_mail_user_autoresponder.lng | 2 +- 22 files changed, 31 insertions(+), 27 deletions(-) diff --git a/interface/web/mailuser/form/mail_user_autoresponder.tform.php b/interface/web/mailuser/form/mail_user_autoresponder.tform.php index e642534c13..fa4025b532 100644 --- a/interface/web/mailuser/form/mail_user_autoresponder.tform.php +++ b/interface/web/mailuser/form/mail_user_autoresponder.tform.php @@ -94,16 +94,20 @@ $form["tabs"]['autoresponder'] = array ( 'autoresponder_start_date' => array ( 'datatype' => 'DATETIME', 'formtype' => 'DATETIME', - 'validators'=> array ( 0 => array ( 'type' => 'CUSTOM', - 'class' => 'validate_autoresponder', - 'function' => 'start_date', - 'errmsg'=> 'autoresponder_start_date_isfuture'), - ), + 'validators'=> array ( + 0 => array ( 'type' => 'ISDATETIME', + 'allowempty' => 'y', + 'errmsg'=> 'autoresponder_start_date_is_no_date'), + ) ), 'autoresponder_end_date' => array ( 'datatype' => 'DATETIME', 'formtype' => 'DATETIME', - 'validators' => array ( 0 => array ( 'type' => 'CUSTOM', + 'validators'=> array ( + 0 => array ( 'type' => 'ISDATETIME', + 'allowempty' => 'y', + 'errmsg'=> 'autoresponder_end_date_is_no_date'), + 1 => array ( 'type' => 'CUSTOM', 'class' => 'validate_autoresponder', 'function' => 'end_date', 'errmsg'=> 'autoresponder_end_date_isgreater'), diff --git a/interface/web/mailuser/lib/lang/ar_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/ar_mail_user_autoresponder.lng index 9dcd0e5dd3..b913b5cfa1 100644 --- a/interface/web/mailuser/lib/lang/ar_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/ar_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Active'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['now_txt'] = 'Now'; $wb['autoresponder_subject_txt'] = 'Subject'; diff --git a/interface/web/mailuser/lib/lang/bg_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/bg_mail_user_autoresponder.lng index 9dcd0e5dd3..b913b5cfa1 100644 --- a/interface/web/mailuser/lib/lang/bg_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/bg_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Active'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['now_txt'] = 'Now'; $wb['autoresponder_subject_txt'] = 'Subject'; diff --git a/interface/web/mailuser/lib/lang/br_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/br_mail_user_autoresponder.lng index 9de387d798..3783bbcb73 100644 --- a/interface/web/mailuser/lib/lang/br_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/br_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Ativo'; $wb['autoresponder_start_date_txt'] = 'Iniciar em'; $wb['autoresponder_start_date_isfuture'] = 'O campo "Iniciar em" não pode ser menor que data atual.'; $wb['autoresponder_end_date_txt'] = 'Terminar em'; -$wb['autoresponder_end_date_isgreater'] = 'O campo "Terminar em" não pode ser menor que "Iniciar em".'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Habilitar auto-resposta'; $wb['now_txt'] = 'Agora'; $wb['autoresponder_subject_txt'] = 'Assunto'; diff --git a/interface/web/mailuser/lib/lang/ca_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/ca_mail_user_autoresponder.lng index 9dcd0e5dd3..b913b5cfa1 100644 --- a/interface/web/mailuser/lib/lang/ca_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/ca_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Active'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['now_txt'] = 'Now'; $wb['autoresponder_subject_txt'] = 'Subject'; diff --git a/interface/web/mailuser/lib/lang/cz_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/cz_mail_user_autoresponder.lng index ef3aeb42da..20134a87b5 100644 --- a/interface/web/mailuser/lib/lang/cz_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/cz_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Aktivní'; $wb['autoresponder_start_date_txt'] = 'Začít od'; $wb['autoresponder_start_date_isfuture'] = 'Datum zahájení nesmí být v minulosti.'; $wb['autoresponder_end_date_txt'] = 'Skončit'; -$wb['autoresponder_end_date_isgreater'] = 'Datum ukončení musí být nastaven a musí být pozdější než datum zahájení.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Povolit automatický odpovídač'; $wb['now_txt'] = 'Nyní'; $wb['autoresponder_subject_txt'] = 'Předmět e-mailu'; diff --git a/interface/web/mailuser/lib/lang/de_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/de_mail_user_autoresponder.lng index f8d4e46b12..af164c475d 100644 --- a/interface/web/mailuser/lib/lang/de_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/de_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Aktiv'; $wb['autoresponder_start_date_txt'] = 'Start am'; $wb['autoresponder_start_date_isfuture'] = 'Start Datum kann nicht in der Vergangenheit sein.'; $wb['autoresponder_end_date_txt'] = 'Ende am'; -$wb['autoresponder_end_date_isgreater'] = 'End Datum muss gesetzt werden und nach dem Start Datum sein.'; +$wb['autoresponder_end_date_isgreater'] = 'End Datum muss nach dem Start Datum sein.'; $wb['autoresponder_active'] = 'Autoresponder aktivieren'; $wb['now_txt'] = 'Jetzt'; $wb['autoresponder_subject_txt'] = 'Betreff'; diff --git a/interface/web/mailuser/lib/lang/dk_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/dk_mail_user_autoresponder.lng index 81bee87afb..e9cf7ba82a 100644 --- a/interface/web/mailuser/lib/lang/dk_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/dk_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Aktiv'; $wb['autoresponder_start_date_txt'] = 'Start d.'; $wb['autoresponder_start_date_isfuture'] = 'Start dato kan ikke være i fortid.'; $wb['autoresponder_end_date_txt'] = 'Slut d.'; -$wb['autoresponder_end_date_isgreater'] = 'Slut dato skal indtastes og være senere end start dato.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Aktiver autosvarer'; $wb['now_txt'] = 'Nu'; $wb['autoresponder_subject_txt'] = 'Emne'; diff --git a/interface/web/mailuser/lib/lang/el_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/el_mail_user_autoresponder.lng index 9dcd0e5dd3..b913b5cfa1 100644 --- a/interface/web/mailuser/lib/lang/el_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/el_mail_user_autoresponder.lng @@ -6,7 +6,7 @@ $wb['autoresponder_txt'] = 'Active'; $wb['autoresponder_start_date_txt'] = 'Start on'; $wb['autoresponder_start_date_isfuture'] = 'Start date cannot be in the past.'; $wb['autoresponder_end_date_txt'] = 'End by'; -$wb['autoresponder_end_date_isgreater'] = 'End date must be set and be later than start date.'; +$wb['autoresponder_end_date_isgreater'] = 'End date must be later than start date.'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['now_txt'] = 'Now'; $wb['autoresponder_subject_txt'] = 'Subject'; diff --git a/interface/web/mailuser/lib/lang/es_mail_user_autoresponder.lng b/interface/web/mailuser/lib/lang/es_mail_user_autoresponder.lng index 577951ea2b..04e55b28b9 100644 --- a/interface/web/mailuser/lib/lang/es_mail_user_autoresponder.lng +++ b/interface/web/mailuser/lib/lang/es_mail_user_autoresponder.lng @@ -1,6 +1,6 @@ Date: Thu, 20 Aug 2020 22:09:18 +0200 Subject: [PATCH 0477/1368] Put compression and encryption options in accordion panel (#5704) --- .../templates/web_vhost_domain_backup.htm | 179 ++++++++++-------- 1 file changed, 102 insertions(+), 77 deletions(-) diff --git a/interface/web/sites/templates/web_vhost_domain_backup.htm b/interface/web/sites/templates/web_vhost_domain_backup.htm index 0228ae76bb..19e23931d5 100644 --- a/interface/web/sites/templates/web_vhost_domain_backup.htm +++ b/interface/web/sites/templates/web_vhost_domain_backup.htm @@ -1,81 +1,106 @@ -
    -

    {tmpl_var name='configuration_error_txt'}

    -
    -
    {tmpl_var name='config_error_tstamp'} : 
    {tmpl_var name='config_error_msg'}
    -
    -
    +
    +

    {tmpl_var name='configuration_error_txt'}

    +
    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +
    -
    - -
    -
    -
    - -
    -
    -
    - -
     {tmpl_var name='backup_excludes_note_txt'} -
    - - {tmpl_var name='backup_compression_options_txt'} -
    - {tmpl_var name='backup_format_web_note_txt'} -
    - -
    - {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'} -
    -
    -
    - -
    - -
    -
    -
    - -
    - -
    -
    - - {tmpl_var name='backup_encryption_options_txt'} -
    - {tmpl_var name='backup_encryption_note_txt'} -
    -
    - -
    - {tmpl_var name="backup_encrypt"} -
    -
    -
    - -
    - -
    -
    - - {tmpl_var name='backup_records'} - - -
    - - -
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    +
     {tmpl_var name='backup_excludes_note_txt'} +
    +
    +
    + {tmpl_var name='backup_format_web_note_txt'} +
    + +
    + {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'} +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    + +
    +
    +
    + {tmpl_var name='backup_encryption_note_txt'} +
    +
    + +
    + {tmpl_var name="backup_encrypt"} +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +{tmpl_var name='backup_records'} + +
    +
    + + +
    +
    -- GitLab From 36393c2b60cd65e1a033dc498d3eb96b480166ea Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 14:38:53 +0200 Subject: [PATCH 0478/1368] Don't load dashboard on login page (#5564) --- .../default/assets/javascripts/ispconfig.js | 87 +++++++++---------- .../web/themes/default/templates/main.tpl.htm | 2 + 2 files changed, 44 insertions(+), 45 deletions(-) diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.js b/interface/web/themes/default/assets/javascripts/ispconfig.js index 70e3a903a6..e3a2bee368 100644 --- a/interface/web/themes/default/assets/javascripts/ispconfig.js +++ b/interface/web/themes/default/assets/javascripts/ispconfig.js @@ -9,30 +9,30 @@ var ISPConfig = { registeredHooks: new Array(), new_tpl_add_id: 0, dataLogTimer: 0, - + options: { useLoadIndicator: false, useComboBox: false }, - + setOption: function(key, value) { ISPConfig.options[key] = value; }, - + setOptions: function(opts) { $.extend(ISPConfig.options, opts); }, - + reportError: function(request) { - + }, - + registerHook: function(name, callback) { if(!ISPConfig.registeredHooks[name]) ISPConfig.registeredHooks[name] = new Array(); var newindex = ISPConfig.registeredHooks[name].length; ISPConfig.registeredHooks[name][newindex] = callback; }, - + callHook: function(name, params) { if(!ISPConfig.registeredHooks[name]) return; for(var i = 0; i < ISPConfig.registeredHooks[name].length; i++) { @@ -40,14 +40,14 @@ var ISPConfig = { callback(name, params); } }, - + resetFormChanged: function() { ISPConfig.pageFormChanged = false; }, showLoadIndicator: function() { document.body.style.cursor = 'wait'; - + if(ISPConfig.options.useLoadIndicator == true) { ISPConfig.requestsRunning += 1; @@ -96,7 +96,7 @@ var ISPConfig = { onAfterContentLoad: function(url, data) { if(!data) data = ''; else data = '&' + data; - + if(ISPConfig.options.useComboBox == true) { $('#pageContent').find("select:not(.chosen-select)").select2({ placeholder: '', @@ -119,7 +119,7 @@ var ISPConfig = { } }); } - + $('input[data-input-element="date"]').datetimepicker({ 'language': 'en', // TODO 'todayHighlight': true, @@ -144,18 +144,18 @@ var ISPConfig = { $(this).prop('readonly', true) .tooltip({title: "Click to set", placement: "left"}); }); - $('input[type="password"]').on('click focus', function() { + $('input[type="password"]').on('click focus', function() { $(this).prop('readonly', false); $(this).tooltip('destroy'); }); - + ISPConfig.callHook('onAfterContentLoad', {'url': url, 'data': data }); }, submitForm: function(formname, target, confirmation) { var successMessage = arguments[3]; if(!confirmation) confirmation = false; - + if(!confirmation || window.confirm(confirmation)) { var submitFormObj = $.ajax({ type: "POST", @@ -210,12 +210,12 @@ var ISPConfig = { if(errormsg){ msg = msg+'
    '+errormsg+'
    '; } - + var csrf_key = $response.find('input[name="_csrf_key"]').val(); var csrf_id = $response.find('input[name="_csrf_id"]').val(); - + msg = msg + ''; - + return msg; }; @@ -264,7 +264,7 @@ var ISPConfig = { } }); }, - + loadContent: function(pagename) { var params = arguments[1]; var pageContentObject2 = $.ajax({ @@ -350,7 +350,7 @@ var ISPConfig = { ISPConfig.reportError('Ajax Request was not successful. 114'); } }); - + ISPConfig.loadMenus(); ISPConfig.keepalive(); ISPConfig.dataLogNotification(); @@ -358,11 +358,11 @@ var ISPConfig = { try { $('form#pageForm').find('input[name="username"]').focus(); } catch (e) { - + } }, 1000); }, - + loadMenus: function() { var sideNavObject = $.ajax({ type: "GET", @@ -409,7 +409,7 @@ var ISPConfig = { console.log('tab change interrupted, request still running.'); return false; } - + document.pageForm.next_tab.value = tab; var idel = $('form#pageForm').find('[name="id"]'); @@ -487,7 +487,7 @@ var ISPConfig = { } }); }, - + keepalive: function() { var pageContentObject3 = $.ajax({ type: "GET", @@ -618,13 +618,13 @@ $(document).on('click', 'a[data-load-content],button[data-load-content]', functi console.log('preventing click because there is still a request running.'); return; } - + $page.on('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() { $page.stop(); }); $page.animate({scrollTop: 0}, 1000, function() { $page.off('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() { $page.stop(); }); }); - + var content_to_load = $(this).attr('data-load-content'); if(!content_to_load) return this; - + ISPConfig.loadContent(content_to_load); }); @@ -634,13 +634,13 @@ $(document).on('click', 'a[data-capp],button[data-capp]', function(e) { console.log('preventing click because there is still a request running.'); return; } - + $page.on('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() { $page.stop(); }); $page.animate({scrollTop: 0}, 1000, function() { $page.off('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() { $page.stop(); }); }); - + var content_to_load = $(this).attr('data-capp'); if(!content_to_load) return this; - + ISPConfig.capp(content_to_load); }); @@ -650,14 +650,14 @@ $(document).on('click', 'a[data-submit-form],button[data-submit-form]', function console.log('preventing click because there is still a request running.'); return; } - + $page.on('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() { $page.stop(); }); $page.animate({scrollTop: 0}, 1000, function() { $page.off('scroll mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() { $page.stop(); }); }); - + var $el = $(this); var act = $el.attr('data-form-action'); var form = $el.attr('data-submit-form'); - + if($el.attr('data-form-upload') == 'true') ISPConfig.submitUploadForm(form, act); else ISPConfig.submitForm(form, act); }); @@ -679,28 +679,28 @@ $(document).on('click', 'th[data-column]', function(e) { var $self = $(this); var column = $self.attr('data-column'); if(!column) return this; - + if($("#pageForm .table #Filter").length > 0 && $self.attr('data-sortable') != 'false') { var $el = $('#Filter'); var act = $el.attr('data-form-action'); var form = $el.attr('data-submit-form'); - + var dir = $self.attr('data-ordered'); - + var separator = '?'; if(act.indexOf("?") >= 0){ separator = '&'; } act = act + separator + 'orderby=' + column; ISPConfig.submitForm(form, act); - + $(document).ajaxComplete(function() { var $self = $('#pageForm .table th[data-column="' + column + '"]'); $self.parent().children('th[data-column]').removeAttr('data-ordered'); if(dir && dir == 'asc') $self.attr('data-ordered', 'desc'); else $self.attr('data-ordered', 'asc'); }); - + } }); @@ -765,25 +765,23 @@ $(document).on('ready', function () { }) } }); - + // Animierter Ladefortschritt $('.progress .progress-bar').css('width', function () { return $(this).attr('aria-valuenow') + '%'; }); - - ISPConfig.loadInitContent(); $('#searchform').submit(function(e) { e.preventDefault(); }); - + $("#pageForm").submit(function(e){ //Prevent form submit: e.preventDefault() in lists if ($("#pageForm .table #Filter").length > 0) { e.preventDefault(); } }); - + $.fn.setCursorPosition = function(pos) { var self = $(this).get(0); if(self.setSelectionRange) { @@ -799,11 +797,11 @@ $(document).on('ready', function () { range.select(); } }; - + $.fn.getCursorPosition = function() { var iCaretPos = 0; var self = $(this).get(0); - + if(typeof self.selectionStart === 'number') { iCaretPos = self.selectionDirection == 'backward' ? self.selectionStart : self.selectionEnd; } else if(document.selection) { @@ -815,4 +813,3 @@ $(document).on('ready', function () { return iCaretPos; }; }); - diff --git a/interface/web/themes/default/templates/main.tpl.htm b/interface/web/themes/default/templates/main.tpl.htm index 4dd587e339..39622548aa 100644 --- a/interface/web/themes/default/templates/main.tpl.htm +++ b/interface/web/themes/default/templates/main.tpl.htm @@ -153,6 +153,8 @@ resultBoxPosition: '' }); + ISPConfig.loadInitContent(); + }); //--> -- GitLab From 3b22a48633329eebb83156559dd0ef70db2f9b20 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 16:51:35 +0200 Subject: [PATCH 0479/1368] Remove backup note (#5705) --- interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/br_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/de_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/el_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/en_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/es_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/id_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/it_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/se_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 1 - interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 1 - interface/web/sites/templates/web_vhost_domain_backup.htm | 3 --- 26 files changed, 28 deletions(-) diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index bd8a953007..affc60d727 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index ee7df88617..e9066b1a4b 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index 0b06d75f63..bb92eb90f3 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -162,7 +162,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Cota de disco não pode ser configurada para $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index 5db89cc4b0..a8675bc432 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index d633a7fe0c..72c7f9fccd 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index c70aa44d7b..c2594315c2 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota kann nicht 0 sein.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index 5db89cc4b0..a8675bc432 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index b65ce8ae73..cc9a4adab1 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 93a50ef4d0..61687e5c0d 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -162,7 +162,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 3ee00027de..770c3d88fc 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index d6ed01f49a..faf342be8e 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index c276e054b9..58607171b5 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 95166e97de..466959278e 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index e11d420a28..b01313a9ea 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index f0938ebd03..0b5f1fa525 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index e0b9ae338f..a2b049c515 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index 8428717c27..bcaa7a9675 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index 29c9e99dd9..ec2c052836 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index 83098d3241..36d68e8fd0 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 313459a2f2..9321f35dd0 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index ad276d5b39..a374a653ef 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index 148f642fc1..d2cb80d437 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index a53e6ccd7c..476c65bd3e 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 22f8814aff..ff29bf9f2b 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -157,7 +157,6 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index f55182dffd..3340d69d6c 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -159,7 +159,6 @@ $wb['log_retention_txt'] = 'Günlük Dosyalarının Silinme Sıklığı'; $wb['log_retention_error_regex'] = 'Gün cinsinden günlük dosyalarının silinme sıklığı (En küçük: 0 - En büyük: 9999)'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_format_web_note_txt"] = 'In "default" mode ISPConfig has the following behaviour: if backup mode is set as web user, then "zip" format is used for web files, otherwise backup mode is set as root user and "tar (gzip)" format is used; database is compressed in "gzip" format. Only "tar" based formats and "rar" preserve file ownership and permissions of web files and guarantee correct restore.'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; diff --git a/interface/web/sites/templates/web_vhost_domain_backup.htm b/interface/web/sites/templates/web_vhost_domain_backup.htm index 19e23931d5..04a0480088 100644 --- a/interface/web/sites/templates/web_vhost_domain_backup.htm +++ b/interface/web/sites/templates/web_vhost_domain_backup.htm @@ -39,9 +39,6 @@
     {tmpl_var name='backup_excludes_note_txt'}
    -
    - {tmpl_var name='backup_format_web_note_txt'} -
    {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'} -- GitLab From d80d54ef52fb896b20c4b90ceac24f0bd35e7d3f Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 16:51:56 +0200 Subject: [PATCH 0480/1368] Shorten encryption note (#5705) --- interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/br_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/de_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/el_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/en_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/es_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/id_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/it_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/se_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index affc60d727..6720a122f3 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index e9066b1a4b..459dac6aea 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index bb92eb90f3..ebfb78cff1 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -164,7 +164,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index a8675bc432..e87c23dc3a 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index 72c7f9fccd..7786dc6a16 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index c2594315c2..97d7a0e26f 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index a8675bc432..e87c23dc3a 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index cc9a4adab1..b6454cb2b2 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 61687e5c0d..ba8e756f24 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -164,7 +164,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 770c3d88fc..dee461ac26 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index faf342be8e..a663d9659d 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 58607171b5..8969d2938f 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 466959278e..6824127943 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index b01313a9ea..687bd461fa 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 0b5f1fa525..5a5e7f307f 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index a2b049c515..7360e99941 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index bcaa7a9675..b37c38ad50 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index ec2c052836..fe4e17d6a3 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index 36d68e8fd0..cb14324b88 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 9321f35dd0..725da41fd8 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index a374a653ef..5d3250db07 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index d2cb80d437..d3e235edc8 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 476c65bd3e..852800f738 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index ff29bf9f2b..d14ec5dbae 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 3340d69d6c..d1aac3e3ca 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -161,7 +161,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure). If any other format is used then encryption can't be applied and encryption settings are ignored. You can safely change the password at anytime: the \"Restore\" button will still work for old backups encrypted with a previous password. You don't need to type a password to restore backups using the \"Restore\" button. Password is required when you extract the archives manually. Please, don't forget your password, because it's impossible to restore it."; +$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; -- GitLab From 1e40f729b4de8f6b8fd93742471de4c6d4cb6990 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 17:46:15 +0200 Subject: [PATCH 0481/1368] Shorten the error for missing formats (#5705) --- interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/br_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/de_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/el_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/en_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/es_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/id_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/it_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/se_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index 6720a122f3..51415faee1 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index 459dac6aea..efb27cd1ed 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index ebfb78cff1..d8742fb29d 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -162,7 +162,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Cota de disco não pode ser configurada para $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index e87c23dc3a..2709493cf3 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index 7786dc6a16..14dc676816 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index 97d7a0e26f..6e616e92f7 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota kann nicht 0 sein.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index e87c23dc3a..2709493cf3 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index b6454cb2b2..9ddb57a725 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index ba8e756f24..725b41abce 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -162,7 +162,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index dee461ac26..dea41064b4 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index a663d9659d..eacc56b133 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 8969d2938f..234add6073 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 6824127943..fe1fa259a1 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index 687bd461fa..65917938e8 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 5a5e7f307f..f7f66fa50f 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 7360e99941..8c654b0eab 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index b37c38ad50..586e48f26d 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index fe4e17d6a3..11d4e0e600 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index cb14324b88..20d34f8d44 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 725da41fd8..bf4da568ae 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 5d3250db07..b3d1ede84c 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index d3e235edc8..063eef786c 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 852800f738..3608f7df56 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index d14ec5dbae..9e36294448 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index d1aac3e3ca..b4df556425 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb['log_retention_txt'] = 'Günlük Dosyalarının Silinme Sıklığı'; $wb['log_retention_error_regex'] = 'Gün cinsinden günlük dosyalarının silinme sıklığı (En küçük: 0 - En büyük: 9999)'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'Note: some utils are missing in the system that may prevent you from using some compression formats. Please, install the following utils to avoid possible backup problems: '; +$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; -- GitLab From a0479236f56df779317737d25f68fa236fd5a24f Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 18:11:56 +0200 Subject: [PATCH 0482/1368] Put warning in alert box (#5705) --- interface/web/sites/templates/web_vhost_domain_backup.htm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/web/sites/templates/web_vhost_domain_backup.htm b/interface/web/sites/templates/web_vhost_domain_backup.htm index 04a0480088..41ea775b9f 100644 --- a/interface/web/sites/templates/web_vhost_domain_backup.htm +++ b/interface/web/sites/templates/web_vhost_domain_backup.htm @@ -40,7 +40,8 @@
    -
    +
    +
    {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'}
    -- GitLab From ecd9c89f14254875595af9cd8d93ddffc3ece570 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 18:14:26 +0200 Subject: [PATCH 0483/1368] Fix syntax error (!1117) --- interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/br_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/de_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/el_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/en_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/es_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/id_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/it_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/se_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index 51415faee1..8cb5f88d63 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index efb27cd1ed..df891cebd6 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index d8742fb29d..c41e93d9e5 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -162,7 +162,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Cota de disco não pode ser configurada para $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index 2709493cf3..3ea85d4bb5 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index 14dc676816..e2a5eded73 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index 6e616e92f7..21363f4be6 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota kann nicht 0 sein.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index 2709493cf3..3ea85d4bb5 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index 9ddb57a725..8b59b0069e 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 725b41abce..67ac074d94 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -162,7 +162,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index dea41064b4..1722712ed6 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index eacc56b133..a0303e6044 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 234add6073..02144d5777 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index fe1fa259a1..5cfa32946f 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index 65917938e8..dd5b12d15f 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index f7f66fa50f..4f52582bbc 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 8c654b0eab..b8d2b17157 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index 586e48f26d..7e9ed2c4cc 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index 11d4e0e600..832427bc0e 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index 20d34f8d44..9a91cab1a4 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index bf4da568ae..da352d07ad 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index b3d1ede84c..9609c9211b 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index 063eef786c..0c7952cf68 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 3608f7df56..b97e798a4e 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 9e36294448..905d83cb91 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -157,7 +157,7 @@ $wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; $wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index b4df556425..46bf1f725f 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb['log_retention_txt'] = 'Günlük Dosyalarının Silinme Sıklığı'; $wb['log_retention_error_regex'] = 'Gün cinsinden günlük dosyalarının silinme sıklığı (En küçük: 0 - En büyük: 9999)'; $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; -$wb["backup_missing_utils_txt"] = 'The following formats can't be used because they are not installed on the webserver: '; +$wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; $wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; -- GitLab From ed0ad41c46cfb222986bedaecf1da4fb2298192f Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 18:45:27 +0200 Subject: [PATCH 0484/1368] Change textual mistake (#5705) --- interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/br_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/de_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/el_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/en_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/es_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/id_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/it_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/se_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index 8cb5f88d63..b9255033ac 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index df891cebd6..400536f04a 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index c41e93d9e5..d84361578b 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -164,7 +164,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index 3ea85d4bb5..62b0cb2bf1 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index e2a5eded73..a08ba79d99 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index 21363f4be6..6c0b1ce95d 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index 3ea85d4bb5..62b0cb2bf1 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index 8b59b0069e..2c826415e2 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 67ac074d94..60f93a72a3 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -164,7 +164,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index 1722712ed6..dddc397a4b 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index a0303e6044..382cfd656a 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 02144d5777..4e7dce7c72 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index 5cfa32946f..d8a405eb10 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index dd5b12d15f..f58cfca323 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 4f52582bbc..0425f0b7e4 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index b8d2b17157..cd5ac76ca2 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index 7e9ed2c4cc..bba7e91da1 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index 832427bc0e..ad9725238a 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index 9a91cab1a4..118195c00e 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index da352d07ad..1793efca38 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 9609c9211b..6cbd785ea3 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index 0c7952cf68..bf8604e64a 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index b97e798a4e..2e59ffc425 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 905d83cb91..42105486bc 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 46bf1f725f..16b886c924 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -161,7 +161,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is available only for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; -- GitLab From 02f82b31d132e6138b269320f5a88677a630f270 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 21 Aug 2020 19:41:15 +0200 Subject: [PATCH 0485/1368] Fix visual issue with the encryption note (#5705) --- interface/web/sites/templates/web_vhost_domain_backup.htm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/sites/templates/web_vhost_domain_backup.htm b/interface/web/sites/templates/web_vhost_domain_backup.htm index 41ea775b9f..d9d8d1ce91 100644 --- a/interface/web/sites/templates/web_vhost_domain_backup.htm +++ b/interface/web/sites/templates/web_vhost_domain_backup.htm @@ -72,7 +72,7 @@
    -
    +
    {tmpl_var name='backup_encryption_note_txt'}
    -- GitLab From 20148d62f00065ee14622f71cafdf9d9a9d6b984 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Sat, 22 Aug 2020 14:47:33 +0200 Subject: [PATCH 0486/1368] delete the stat generator config files only when changed --- server/plugins-available/apache2_plugin.inc.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 2ad4d7533b..f11476b402 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1926,18 +1926,18 @@ class apache2_plugin { } //* Remove the AWstats configuration file - if($data['old']['stats_type'] == 'awstats') { + if($data['old']['stats_type'] == 'awstats' && $data['new']['stats_type'] != 'awstats') { $this->awstats_delete($data, $web_config); } //* Remove the GoAccess configuration file - if($data['old']['stats_type'] == 'goaccess') { + if($data['old']['stats_type'] == 'goaccess' && $data['new']['stats_type'] != 'goaccess') { $this->goaccess_delete($data, $web_config); } //* Remove the Webalizer configuration file - if($data['old']['stats_type'] == 'webalizer') { - $this->webalizer_delete($data, $web_config); + if($data['old']['stats_type'] == 'webalizer' && $data['new']['stats_type'] != 'webalizer') { + $this->webalizer_delete($data, $web_config); } $this->php_fpm_pool_update($data, $web_config, $pool_dir, $pool_name, $socket_dir, $web_folder); -- GitLab From 03b6cc5700e51a98c55e2451ade012f3446d96a0 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Sat, 22 Aug 2020 14:50:51 +0200 Subject: [PATCH 0487/1368] also update the nginx plugin --- server/plugins-available/nginx_plugin.inc.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 9888c7e209..4b20a03391 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1940,18 +1940,18 @@ class nginx_plugin { } //* Remove the AWstats configuration file - if($data['old']['stats_type'] == 'awstats') { - $this->awstats_delete($data, $web_config); + if($data['old']['stats_type'] == 'awstats' && $data['new']['stats_type'] != 'awstats') { + $this->awstats_delete($data, $web_config); } //* Remove the GoAccess configuration file - if($data['old']['stats_type'] == 'goaccess') { + if($data['old']['stats_type'] == 'goaccess' && $data['new']['stats_type'] != 'goaccess') { $this->goaccess_delete($data, $web_config); } //* Remove the Webalizer configuration file - if($data['old']['stats_type'] == 'webalizer') { - $this->webalizer_delete($data, $web_config); + if($data['old']['stats_type'] == 'webalizer' && $data['new']['stats_type'] != 'webalizer') { + $this->webalizer_delete($data, $web_config); } //* Remove Stats-Folder when Statistics set to none -- GitLab From 428fd4f5f995e81017ce6166371fcb0f6e074e0a Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 22 Aug 2020 18:28:03 +0200 Subject: [PATCH 0488/1368] Shorten encryption note (#5705) --- interface/web/sites/lib/lang/ar_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/bg_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/br_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ca_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/cz_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/de_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/dk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/el_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/en_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/es_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fi_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/fr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hr_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/hu_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/id_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/it_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ja_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/nl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pl_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/pt_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ro_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/ru_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/se_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/sk_web_vhost_domain.lng | 2 +- interface/web/sites/lib/lang/tr_web_vhost_domain.lng | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng index b9255033ac..93bc26badc 100644 --- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng index 400536f04a..384c6de545 100644 --- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/br_web_vhost_domain.lng b/interface/web/sites/lib/lang/br_web_vhost_domain.lng index d84361578b..acd10622fe 100644 --- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng @@ -164,7 +164,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng index 62b0cb2bf1..f1b755827d 100644 --- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng index a08ba79d99..88b3cb3e5a 100644 --- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/de_web_vhost_domain.lng b/interface/web/sites/lib/lang/de_web_vhost_domain.lng index 6c0b1ce95d..4fab600084 100644 --- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng index 62b0cb2bf1..f1b755827d 100644 --- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/el_web_vhost_domain.lng b/interface/web/sites/lib/lang/el_web_vhost_domain.lng index 2c826415e2..15d51f3a5a 100644 --- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/en_web_vhost_domain.lng b/interface/web/sites/lib/lang/en_web_vhost_domain.lng index 60f93a72a3..b31f157718 100644 --- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng @@ -164,7 +164,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/es_web_vhost_domain.lng b/interface/web/sites/lib/lang/es_web_vhost_domain.lng index dddc397a4b..f49636a9ad 100644 --- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng index 382cfd656a..e85b33e9cc 100644 --- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng index 4e7dce7c72..30963cd01c 100644 --- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng index d8a405eb10..5ef073a093 100644 --- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng index f58cfca323..92f6a0d8b7 100644 --- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/id_web_vhost_domain.lng b/interface/web/sites/lib/lang/id_web_vhost_domain.lng index 0425f0b7e4..765081669f 100644 --- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index cd5ac76ca2..40a2e5117b 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng index bba7e91da1..fefa3b277e 100644 --- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng index ad9725238a..34f43d1e67 100644 --- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng index 118195c00e..faa5dd0e62 100644 --- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng index 1793efca38..d5e554463c 100644 --- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng index 6cbd785ea3..7906eb8f99 100644 --- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng index bf8604e64a..afb9d72fab 100644 --- a/interface/web/sites/lib/lang/ru_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/ru_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/se_web_vhost_domain.lng b/interface/web/sites/lib/lang/se_web_vhost_domain.lng index 2e59ffc425..91c126b69a 100644 --- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng index 42105486bc..d61f814f57 100644 --- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng @@ -159,7 +159,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; diff --git a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng index 16b886c924..6b81451fdd 100644 --- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng @@ -161,7 +161,7 @@ $wb["backup_format_web_txt"] = 'Backup format for web files'; $wb["backup_format_db_txt"] = 'Backup format for database'; $wb["backup_missing_utils_txt"] = 'The following formats can not be used because they are not installed on the webserver: '; $wb["backup_compression_options_txt"] = 'Compression options'; -$wb["backup_encryption_note_txt"] = "Encryption is only available for the following backup formats: \"7z\", \"RAR\", \"zip\" (not secure)."; +$wb["backup_encryption_note_txt"] = "Encryption is only available for 7z, RAR, and zip (not secure)."; $wb["backup_encryption_options_txt"] = 'Encryption options'; $wb["backup_enable_encryption_txt"] = 'Enable encryption'; $wb["backup_password_txt"] = 'Password'; -- GitLab From 80d24764e976c766f659feef3daf5c9bb6977a47 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 24 Aug 2020 15:34:49 -0600 Subject: [PATCH 0489/1368] don't use -k (hardlinks) with jailkit tools --- server/lib/classes/system.inc.php | 4 ++-- server/scripts/create_jailkit_chroot.sh | 2 +- server/scripts/create_jailkit_programs.sh | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index e0699a7f82..ba86d1f115 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -2227,7 +2227,7 @@ class system{ $program_args .= ' ' . escapeshellarg($prog); } - $cmd = 'jk_cp -k ?' . $program_args; + $cmd = 'jk_cp -j ?' . $program_args; $this->exec_safe($cmd, $home_dir); return true; @@ -2250,7 +2250,7 @@ class system{ } // Initialize the chroot into the specified directory with the specified applications - $cmd = 'jk_init -f -k -c /etc/jailkit/jk_init.ini -j ?' . $app_args; + $cmd = 'jk_init -f -c /etc/jailkit/jk_init.ini -j ?' . $app_args; $this->exec_safe($cmd, $home_dir); // Create the temp directory diff --git a/server/scripts/create_jailkit_chroot.sh b/server/scripts/create_jailkit_chroot.sh index cc39b6e4cf..dc0f948735 100755 --- a/server/scripts/create_jailkit_chroot.sh +++ b/server/scripts/create_jailkit_chroot.sh @@ -21,7 +21,7 @@ CHROOT_APP_SECTIONS=$2 chown root:root $CHROOT_HOMEDIR ## Initialize the chroot into the specified directory with the specified applications -jk_init -f -k -c /etc/jailkit/jk_init.ini -j $CHROOT_HOMEDIR $CHROOT_APP_SECTIONS +jk_init -f -c /etc/jailkit/jk_init.ini -j $CHROOT_HOMEDIR $CHROOT_APP_SECTIONS ## Create the temp directory if [ ! -d "$CHROOT_HOMEDIR/tmp" ] diff --git a/server/scripts/create_jailkit_programs.sh b/server/scripts/create_jailkit_programs.sh index 11641f2c1f..62ea1b2dc9 100755 --- a/server/scripts/create_jailkit_programs.sh +++ b/server/scripts/create_jailkit_programs.sh @@ -17,4 +17,4 @@ fi CHROOT_HOMEDIR=$1 CHROOT_APP_PROGRAMS=$2 -jk_cp -k $CHROOT_HOMEDIR $CHROOT_APP_PROGRAMS +jk_cp -j $CHROOT_HOMEDIR $CHROOT_APP_PROGRAMS -- GitLab From f7b6e1769393e4171590cb9507f953c9b3df0053 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 25 Aug 2020 11:55:40 +0200 Subject: [PATCH 0490/1368] Excluded directories field not in the compression panel --- .../sites/templates/web_vhost_domain_backup.htm | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/web/sites/templates/web_vhost_domain_backup.htm b/interface/web/sites/templates/web_vhost_domain_backup.htm index d9d8d1ce91..222ae1e3c3 100644 --- a/interface/web/sites/templates/web_vhost_domain_backup.htm +++ b/interface/web/sites/templates/web_vhost_domain_backup.htm @@ -23,6 +23,13 @@
    +
    + +
    +
     {tmpl_var name='backup_excludes_note_txt'} +
    +
    +
    -
    - -
    -
     {tmpl_var name='backup_excludes_note_txt'} -
    -
    -
    {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'}
    -- GitLab From 4a42c7a1187e2423058bfc0826e3f771fe3be2c3 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 25 Aug 2020 12:22:55 +0200 Subject: [PATCH 0491/1368] Show ok/error message in alert style --- interface/web/sites/templates/web_backup_list.htm | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/interface/web/sites/templates/web_backup_list.htm b/interface/web/sites/templates/web_backup_list.htm index 95c51d0c15..47c08d4413 100644 --- a/interface/web/sites/templates/web_backup_list.htm +++ b/interface/web/sites/templates/web_backup_list.htm @@ -3,13 +3,15 @@ -

    +

    +

    -
    -

    -

    -
    +

    +
    +

    +

    +

    @@ -57,5 +59,5 @@
    - +
    -- GitLab From 1decafcb9eb4e61c6b750b6665ba0262bcd03f30 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 25 Aug 2020 23:30:44 +0200 Subject: [PATCH 0492/1368] Use formatBytes for MemUsage (#3651) --- interface/lib/classes/tools_monitor.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/tools_monitor.inc.php b/interface/lib/classes/tools_monitor.inc.php index 9bf4e861de..435ee220a8 100644 --- a/interface/lib/classes/tools_monitor.inc.php +++ b/interface/lib/classes/tools_monitor.inc.php @@ -184,10 +184,10 @@ class tools_monitor { foreach($data as $key => $value) { if ($key != '') { - $memory = number_format($value / 1048576); + $memory = $app->functions->formatBytes($value); $html .= ' ' . $key . ': - ' . $memory . ' MB + ' . $memory . ' '; } } -- GitLab From b187d95f7723d5c897dcfa37658e13214fec3f41 Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 26 Aug 2020 12:37:03 +0200 Subject: [PATCH 0493/1368] Add changes from !1119 for mailusers --- interface/web/mailuser/form/mail_user_filter.tform.php | 2 +- interface/web/mailuser/lib/lang/ar_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/bg_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/br_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/ca_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/cz_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/de_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/dk_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/el_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/en_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/es_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/fi_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/fr_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/hr_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/hu_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/id_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/it_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/ja_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/nl_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/pl_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/pt_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/ro_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/ru_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/se_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/sk_mail_user_filter.lng | 1 + interface/web/mailuser/lib/lang/tr_mail_user_filter.lng | 1 + 26 files changed, 26 insertions(+), 1 deletion(-) diff --git a/interface/web/mailuser/form/mail_user_filter.tform.php b/interface/web/mailuser/form/mail_user_filter.tform.php index 395b9b83f2..0f454fa6f7 100644 --- a/interface/web/mailuser/form/mail_user_filter.tform.php +++ b/interface/web/mailuser/form/mail_user_filter.tform.php @@ -95,7 +95,7 @@ $form["tabs"]['filter'] = array ( 'formtype' => 'SELECT', 'default' => '', //'value' => array('contains'=>'contains_txt','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') - 'value' => array('contains'=>'contains_txt', 'is' => 'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'localpart' => 'localpart_txt', 'domain' => 'domain_txt') + 'value' => array('contains'=>'contains_txt', 'is'=>'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'regex'=>'regex_txt', 'localpart'=>'localpart_txt', 'domain'=>'domain_txt') ), 'searchterm' => array ( 'datatype' => 'VARCHAR', diff --git a/interface/web/mailuser/lib/lang/ar_mail_user_filter.lng b/interface/web/mailuser/lib/lang/ar_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/ar_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/ar_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/bg_mail_user_filter.lng b/interface/web/mailuser/lib/lang/bg_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/bg_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/bg_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/br_mail_user_filter.lng b/interface/web/mailuser/lib/lang/br_mail_user_filter.lng index ebd4d36628..88a7271391 100644 --- a/interface/web/mailuser/lib/lang/br_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/br_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'é'; $wb['begins_with_txt'] = 'Iniciando com'; $wb['ends_with_txt'] = 'Finalizando com'; $wb['move_to_txt'] = 'Mover para'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Remover'; $wb['header_txt'] = 'Header'; $wb['size_over_txt'] = 'Email size over (KB)'; diff --git a/interface/web/mailuser/lib/lang/ca_mail_user_filter.lng b/interface/web/mailuser/lib/lang/ca_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/ca_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/ca_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/cz_mail_user_filter.lng b/interface/web/mailuser/lib/lang/cz_mail_user_filter.lng index 95903569bf..010427341e 100644 --- a/interface/web/mailuser/lib/lang/cz_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/cz_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'Je'; $wb['begins_with_txt'] = 'Začíná na'; $wb['ends_with_txt'] = 'Končí na'; $wb['move_to_txt'] = 'Přesunout do'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Smazat'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/de_mail_user_filter.lng b/interface/web/mailuser/lib/lang/de_mail_user_filter.lng index dbd1803954..5c7d5c20d0 100644 --- a/interface/web/mailuser/lib/lang/de_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/de_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Ist'; $wb['begins_with_txt'] = 'Startet mit'; $wb['ends_with_txt'] = 'Endet mit'; $wb['move_to_txt'] = 'Verschieben nach'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Löschen'; $wb['header_txt'] = 'Header'; $wb['size_over_txt'] = 'Email size over (KB)'; diff --git a/interface/web/mailuser/lib/lang/dk_mail_user_filter.lng b/interface/web/mailuser/lib/lang/dk_mail_user_filter.lng index f911747a49..e2325c6902 100644 --- a/interface/web/mailuser/lib/lang/dk_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/dk_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Er'; $wb['begins_with_txt'] = 'Begynder med'; $wb['ends_with_txt'] = 'Slutter med'; $wb['move_to_txt'] = 'Flyt til'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Slet'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/el_mail_user_filter.lng b/interface/web/mailuser/lib/lang/el_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/el_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/el_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/en_mail_user_filter.lng b/interface/web/mailuser/lib/lang/en_mail_user_filter.lng index 9d5125c169..fb587d4380 100644 --- a/interface/web/mailuser/lib/lang/en_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/en_mail_user_filter.lng @@ -18,6 +18,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['header_txt'] = 'Header'; $wb['size_over_txt'] = 'Email size over (KB)'; diff --git a/interface/web/mailuser/lib/lang/es_mail_user_filter.lng b/interface/web/mailuser/lib/lang/es_mail_user_filter.lng index 4ec6877cfc..3485ea4601 100644 --- a/interface/web/mailuser/lib/lang/es_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/es_mail_user_filter.lng @@ -3,6 +3,7 @@ $wb['action_txt'] = 'Acción'; $wb['active_txt'] = 'Habilitado'; $wb['begins_with_txt'] = 'Comienza con'; $wb['contains_txt'] = 'Contiene'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Borrar'; $wb['ends_with_txt'] = 'Termina con'; $wb['from_txt'] = 'De'; diff --git a/interface/web/mailuser/lib/lang/fi_mail_user_filter.lng b/interface/web/mailuser/lib/lang/fi_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/fi_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/fi_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/fr_mail_user_filter.lng b/interface/web/mailuser/lib/lang/fr_mail_user_filter.lng index b6f2c193b4..d2b513b155 100644 --- a/interface/web/mailuser/lib/lang/fr_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/fr_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'est'; $wb['begins_with_txt'] = 'Commence par'; $wb['ends_with_txt'] = 'Fini par'; $wb['move_to_txt'] = 'Déplacer vers'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Supprimer'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/hr_mail_user_filter.lng b/interface/web/mailuser/lib/lang/hr_mail_user_filter.lng index f87ed828a4..dfb58bd3d2 100644 --- a/interface/web/mailuser/lib/lang/hr_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/hr_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'je'; $wb['begins_with_txt'] = 'Počinje sa'; $wb['ends_with_txt'] = 'Završava sa'; $wb['move_to_txt'] = 'Prebaci u '; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Obriši'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/hu_mail_user_filter.lng b/interface/web/mailuser/lib/lang/hu_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/hu_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/hu_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/id_mail_user_filter.lng b/interface/web/mailuser/lib/lang/id_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/id_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/id_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/it_mail_user_filter.lng b/interface/web/mailuser/lib/lang/it_mail_user_filter.lng index b47458fdbe..a0b9e360c2 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'è'; $wb['begins_with_txt'] = 'Inizia con'; $wb['ends_with_txt'] = 'Termina con'; $wb['move_to_txt'] = 'Sposta in'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Elimina'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/ja_mail_user_filter.lng b/interface/web/mailuser/lib/lang/ja_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/ja_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/ja_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/nl_mail_user_filter.lng b/interface/web/mailuser/lib/lang/nl_mail_user_filter.lng index ba318014ab..91dfd85373 100644 --- a/interface/web/mailuser/lib/lang/nl_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/nl_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = "Is"; $wb['begins_with_txt'] = "Begint met"; $wb['ends_with_txt'] = "Endigt in"; $wb['move_to_txt'] = "Verplaatsen naar"; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = "Verwijderen"; $wb['mailbox_filter_txt'] = "Mailbox filter"; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/pl_mail_user_filter.lng b/interface/web/mailuser/lib/lang/pl_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/pl_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/pl_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/pt_mail_user_filter.lng b/interface/web/mailuser/lib/lang/pt_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/pt_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/pt_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/ro_mail_user_filter.lng b/interface/web/mailuser/lib/lang/ro_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/ro_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/ro_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/ru_mail_user_filter.lng b/interface/web/mailuser/lib/lang/ru_mail_user_filter.lng index 1f2dc5ded1..590763ed43 100644 --- a/interface/web/mailuser/lib/lang/ru_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/ru_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'Равно'; $wb['begins_with_txt'] = 'Начинается с'; $wb['ends_with_txt'] = 'Заканчивается на'; $wb['move_to_txt'] = 'Переместить в'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Удалить'; $wb['mailbox_filter_txt'] = 'Фильтр почтового ящика'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/se_mail_user_filter.lng b/interface/web/mailuser/lib/lang/se_mail_user_filter.lng index 590239681e..4f7e093d77 100644 --- a/interface/web/mailuser/lib/lang/se_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/se_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'Är'; $wb['begins_with_txt'] = 'Börjar med'; $wb['ends_with_txt'] = 'Slutar med'; $wb['move_to_txt'] = 'Flytta till'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Radera'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/sk_mail_user_filter.lng b/interface/web/mailuser/lib/lang/sk_mail_user_filter.lng index a5fdf679cf..0df6e0b75b 100644 --- a/interface/web/mailuser/lib/lang/sk_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/sk_mail_user_filter.lng @@ -17,6 +17,7 @@ $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; $wb['move_to_txt'] = 'Move to'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['mailbox_filter_txt'] = 'Mailbox filter'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mailuser/lib/lang/tr_mail_user_filter.lng b/interface/web/mailuser/lib/lang/tr_mail_user_filter.lng index 0eb00905dc..b59a4afbab 100644 --- a/interface/web/mailuser/lib/lang/tr_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/tr_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['is_txt'] = 'Şununla aynı'; $wb['begins_with_txt'] = 'Şununla başlayan'; $wb['ends_with_txt'] = 'Şununla biten'; $wb['move_to_txt'] = 'Şuraya taşı'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Sil'; $wb['mailbox_filter_txt'] = 'E-posta kutusu süzgeci'; $wb['header_txt'] = 'Header'; -- GitLab From 1d9c2e7f43066368ae8b577859594ae06275f6ea Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 27 Aug 2020 12:55:39 +0200 Subject: [PATCH 0494/1368] Apply 1 suggestion(s) to 1 file(s) --- security/apache_directives.blacklist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/security/apache_directives.blacklist b/security/apache_directives.blacklist index cb53cc7c4d..1c6d41f210 100644 --- a/security/apache_directives.blacklist +++ b/security/apache_directives.blacklist @@ -1,4 +1,4 @@ /^\s*(LoadModule|LoadFile|Include|IncludeOptional)(\s+|[\\\\])/mi /^\s*(SuexecUserGroup|suPHP_UserGroup|suPHP_PHPPath|suPHP_ConfigPath)(\s+|[\\\\])/mi /^\s*(FCGIWrapper|FastCgiExternalServer)(\s+|[\\\\])/mi -/^\s*(CustomLog|ErrorLog)/mi +/^\s*(CustomLog|ErrorLog)(\s+|[\\\\])/mi -- GitLab From 2bb678cc1e503e0654fd10746bc926984a6c250c Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 27 Aug 2020 13:14:25 +0200 Subject: [PATCH 0495/1368] - remove dropped column fastcgi_php_version from installer sql file --- install/sql/ispconfig3.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 0d76fb8c08..6b8d8101cb 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2070,7 +2070,6 @@ CREATE TABLE `web_domain` ( `backup_excludes` mediumtext, `active` enum('n','y') NOT NULL default 'y', `traffic_quota_lock` enum('n','y') NOT NULL default 'n', - `fastcgi_php_version` varchar(255) DEFAULT NULL, `proxy_directives` mediumtext, `last_quota_notification` date NULL default NULL, `rewrite_rules` mediumtext, -- GitLab From 57ca2d7110bfbdb375e07b20792de9303e95bb1e Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 28 Aug 2020 15:37:26 +0200 Subject: [PATCH 0496/1368] small adjustments and some clean up of the GoAccess code --- server/lib/classes/cron.d/150-goaccess.inc.php | 9 ++------- server/plugins-available/apache2_plugin.inc.php | 4 ++-- server/plugins-available/nginx_plugin.inc.php | 2 +- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 8f397c819a..8b7e257c10 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -144,7 +144,7 @@ class cronjob_goaccess extends cronjob { if(!@is_dir($statsdir)) $app->system->mkdirpath($statsdir, 0755, $username, $groupname); - $goa_db_dir = $docroot.'/'.$web_folder.'/stats/.db/'; + $goa_db_dir = $docroot.'/log/goaccess_db'; $output_html = $docroot.'/'.$web_folder.'/stats/goaindex.html'; if(!@is_dir($goa_db_dir)) $app->system->mkdirpath($goa_db_dir); @@ -177,11 +177,6 @@ class cronjob_goaccess extends cronjob { $app->system->mkdirpath($statsdirold, 0755, $username, $groupname); } - // don't rotate db files per month - //rename($goa_db_dir, $statsdirold.'db'); - //mkdir($goa_db_dir); - - $files = scandir($statsdir); foreach ($files as $file) { @@ -204,7 +199,7 @@ class cronjob_goaccess extends cronjob { * For versions prior 1.4 you need GoAccess with btree support compiled! */ - $cust_lang = $conf['language']."_".strtoupper($conf['language']); + $cust_lang = $conf['language']."_".strtoupper($conf['language'])."UTF-8"; if(version_compare($goaccess_version,1.4) >= 0) { $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index f11476b402..4a88c0d874 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -3079,8 +3079,8 @@ class apache2_plugin { } } - if(!is_dir($data['new']['document_root']."/" . $web_folder . "/stats/.db")) $app->system->mkdirpath($data['new']['document_root'] . "/" . $web_folder . "/stats/.db"); - $goaccess_conf = $data['new']['document_root'].'/log/goaccess.conf'; + if(!is_dir($data['new']['document_root'] . "/log/goaccess_db")) $app->system->mkdirpath($data['new']['document_root'] . "/log/goaccess_db"); + $goaccess_conf = $data['new']['document_root'].'/log/goaccess.conf'; /* In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 4b20a03391..f2626b83ba 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -2604,7 +2604,7 @@ class nginx_plugin { } } - if(!is_dir($data['new']['document_root']."/" . $web_folder . "/stats/.db")) $app->system->mkdirpath($data['new']['document_root'] . "/" . $web_folder . "/stats/.db"); + if(!is_dir($data['new']['document_root'] . "/log/goaccess_db")) $app->system->mkdirpath($data['new']['document_root'] . "/log/goaccess_db"); $goaccess_conf = $data['new']['document_root'].'/log/goaccess.conf'; /* -- GitLab From 81444a91108ee0b8c6f83156a4b09643646c1bdc Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 28 Aug 2020 16:14:12 +0200 Subject: [PATCH 0497/1368] updating the website title by the cronjob shouldn't be necessary as it should get updated by the server plugin --- server/lib/classes/cron.d/150-goaccess.inc.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 8b7e257c10..255d646b0b 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -130,14 +130,6 @@ class cronjob_goaccess extends cronjob { unset($content); } - /* Update the primary domain name in the title, it could occasionally change */ - if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { - $content = $app->system->file_get_contents($goaccess_conf, true); - $content = preg_replace('/^(#)?html-report-title(.*)/m', "html-report-title $domain", $content); - $app->system->file_put_contents($goaccess_conf, $content, true); - unset($content); - } - $username = $rec['system_user']; $groupname = $rec['system_group']; $docroot = $rec['document_root']; -- GitLab From 461f4febbfc1c3263ac28dd94388def50ee29632 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 30 Aug 2020 23:52:17 +0200 Subject: [PATCH 0498/1368] Add SSL support for ISPConfig Apps (#5435) --- install/lib/installer_base.lib.php | 20 ++++++++--- install/tpl/apache_apps.vhost.master | 52 +++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 6 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index fc27da8df3..11163806ab 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -745,7 +745,7 @@ class installer_base { copy($full_file_name, $config_dir.$configfile.'~'); chmod($config_dir.$configfile.'~',0600); } - + //* Replace variables in config file template $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master'); $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content); @@ -754,13 +754,13 @@ class installer_base { $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content); $content = str_replace('{server_id}', $conf['server_id'], $content); wf($full_file_name, $content); - + //* Changing mode and group of the new created config file caselog('chmod u=rw,g=r,o= '.escapeshellarg($full_file_name).' &> /dev/null', __FILE__, __LINE__, 'chmod on '.$full_file_name, 'chmod on '.$full_file_name.' failed'); caselog('chgrp '.escapeshellarg($postfix_group).' '.escapeshellarg($full_file_name).' &> /dev/null', __FILE__, __LINE__, 'chgrp on '.$full_file_name, 'chgrp on '.$full_file_name.' failed'); - + } public function configure_jailkit() { @@ -1097,7 +1097,7 @@ class installer_base { } unset($server_ini_array); - + $myhostname = str_replace('.','\.',$conf['hostname']); $postconf_placeholders = array('{config_dir}' => $config_dir, @@ -1680,7 +1680,7 @@ class installer_base { public function configure_rspamd() { global $conf; - + //* These postconf commands will be executed on installation and update $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); @@ -2503,6 +2503,16 @@ class installer_base { $tpl->setVar('apps_vhost_dir',$conf['web']['website_basedir'].'/apps'); $tpl->setVar('apps_vhost_basedir',$conf['web']['website_basedir']); $tpl->setVar('apps_vhost_servername',$apps_vhost_servername); + if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) { + $tpl->setVar('ssl_comment',''); + } else { + $tpl->setVar('ssl_comment','#'); + } + if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key') && is_file($install_dir.'/interface/ssl/ispserver.bundle')) { + $tpl->setVar('ssl_bundle_comment',''); + } else { + $tpl->setVar('ssl_bundle_comment','#'); + } $tpl->setVar('apache_version',getapacheversion()); if($this->is_update == true) { $tpl->setVar('logging',get_logging_state()); diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 14f0f10da2..ebd7cd6958 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -1,4 +1,3 @@ - ###################################################### # This virtual host contains the configuration # for the ISPConfig apps vhost @@ -15,6 +14,57 @@ SetHandler None + # SSL Configuration + SSLEngine On + + SSLProtocol All -SSLv3 -TLSv1 -TLSv1.1 + + SSLProtocol All -SSLv2 -SSLv3 + + SSLCertificateFile /usr/local/ispconfig/interface/ssl/ispserver.crt + SSLCertificateKeyFile /usr/local/ispconfig/interface/ssl/ispserver.key + SSLCACertificateFile /usr/local/ispconfig/interface/ssl/ispserver.bundle + + SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 + SSLHonorCipherOrder On + + SSLCompression Off + + + SSLSessionTickets Off + + + + # ISPConfig 3.1 currently requires unsafe-line for both scripts and styles, as well as unsafe-eval + Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'" + Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'; upgrade-insecure-requests" + Header set X-Content-Type-Options: nosniff + Header set X-Frame-Options: SAMEORIGIN + Header set X-XSS-Protection: "1; mode=block" + Header always edit Set-Cookie (.*) "$1; HTTPOnly" + Header always edit Set-Cookie (.*) "$1; Secure" + = 2.4.7> + Header setifempty Strict-Transport-Security "max-age=15768000" + + + Header set Strict-Transport-Security "max-age=15768000" + + RequestHeader unset Proxy early + + + + SSLUseStapling On + SSLStaplingResponderTimeout 5 + SSLStaplingReturnResponderErrors Off + + + + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + + RequestHeader unset Proxy early -- GitLab From 4f4f07ceef7bf2c874747ecce6ab33cac31cc196 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 31 Aug 2020 00:33:11 +0200 Subject: [PATCH 0499/1368] Add SSL support for ISPConfig Apps (#5435) - also in conf folder --- server/conf/apache_apps.vhost.master | 60 ++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index fe73487fa0..ebd7cd6958 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -1,4 +1,3 @@ - ###################################################### # This virtual host contains the configuration # for the ISPConfig apps vhost @@ -15,6 +14,57 @@ SetHandler None + # SSL Configuration + SSLEngine On + + SSLProtocol All -SSLv3 -TLSv1 -TLSv1.1 + + SSLProtocol All -SSLv2 -SSLv3 + + SSLCertificateFile /usr/local/ispconfig/interface/ssl/ispserver.crt + SSLCertificateKeyFile /usr/local/ispconfig/interface/ssl/ispserver.key + SSLCACertificateFile /usr/local/ispconfig/interface/ssl/ispserver.bundle + + SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 + SSLHonorCipherOrder On + + SSLCompression Off + + + SSLSessionTickets Off + + + + # ISPConfig 3.1 currently requires unsafe-line for both scripts and styles, as well as unsafe-eval + Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'" + Header set Content-Security-Policy "default-src 'self' 'unsafe-inline' 'unsafe-eval'; img-src 'self' data:; object-src 'none'; upgrade-insecure-requests" + Header set X-Content-Type-Options: nosniff + Header set X-Frame-Options: SAMEORIGIN + Header set X-XSS-Protection: "1; mode=block" + Header always edit Set-Cookie (.*) "$1; HTTPOnly" + Header always edit Set-Cookie (.*) "$1; Secure" + = 2.4.7> + Header setifempty Strict-Transport-Security "max-age=15768000" + + + Header set Strict-Transport-Security "max-age=15768000" + + RequestHeader unset Proxy early + + + + SSLUseStapling On + SSLStaplingResponderTimeout 5 + SSLStaplingReturnResponderErrors Off + + + + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + + RequestHeader unset Proxy early @@ -55,9 +105,9 @@ Options +Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo - - SetHandler fcgid-script - + + SetHandler fcgid-script + FCGIWrapper {tmpl_var name='apps_vhost_basedir'}/php-fcgi-scripts/apps/.php-fcgi-starter .php Require all granted @@ -78,4 +128,6 @@ RewriteRule ^/rspamd/(.*) http://127.0.0.1:11334/$1 [P] {/tmpl_if} + + -- GitLab From 9f0e4d321be2efcb731d2ce818ae3f012b638f26 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 31 Aug 2020 13:31:22 +0200 Subject: [PATCH 0500/1368] Fixed syntax error in apps vhost --- install/tpl/apache_apps.vhost.master | 1 - server/conf/apache_apps.vhost.master | 1 - 2 files changed, 2 deletions(-) diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index ebd7cd6958..f65f47df90 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -57,7 +57,6 @@ SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors Off - diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index ebd7cd6958..f65f47df90 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -57,7 +57,6 @@ SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors Off - -- GitLab From a2f1f43ad68d17c6b441a80de5eecb65a9c148e9 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 31 Aug 2020 13:44:04 +0200 Subject: [PATCH 0501/1368] Fixed #5714 Can't change client of website in git-stable --- .../lib/plugins/sites_web_vhost_domain_plugin.inc.php | 8 ++++---- interface/web/sites/web_vhost_domain_edit.php | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php b/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php index 0099b2002b..71d68e3fb2 100644 --- a/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php +++ b/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php @@ -52,13 +52,13 @@ class sites_web_vhost_domain_plugin { if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($page_form->dataRecord["client_group_id"])) { $client_group_id = $app->functions->intval($page_form->dataRecord["client_group_id"]); $app->uses('getconf'); - $global_config = $app->getconf->get_global_config('sites'); - if($global_config['client_protection'] == 'y') { - $app->db->query("UPDATE web_domain SET sys_groupid = ?, sys_perm_group = 'ru' WHERE domain_id = ?", $client_group_id, $this->id); + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['client_protection'] == 'y') { + $app->db->query("UPDATE web_domain SET sys_groupid = ?, sys_perm_group = 'ru' WHERE domain_id = ?", $client_group_id, $page_form->id); } else { $sysuser = $app->db->queryOneRecord('SELECT userid FROM sys_user WHERE default_group = ?',$client_group_id); $sysuser_id = (is_array($sysuser) && isset($sysuser['userid']) && $sysuser['userid'] > 0)?$sysuser['userid']:1; - $app->db->query("UPDATE web_domain SET sys_userid = ?, sys_groupid = ?, sys_perm_group = 'riud' WHERE domain_id = ?", $sysuser_id, $client_group_id, $this->id); + $app->db->query("UPDATE web_domain SET sys_userid = ?, sys_groupid = ?, sys_perm_group = 'riud' WHERE domain_id = ?", $sysuser_id, $client_group_id, $page_form->id); } } if($app->auth->has_clients($_SESSION['s']['user']['userid']) && isset($page_form->dataRecord["client_group_id"])) { diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index 9f05b0337b..b6f2ac5fa8 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -1382,11 +1382,11 @@ class page_action extends tform_actions { // make sure that the record belongs to the client group and not the admin group when admin inserts it // also make sure that the user can not delete domain created by a admin if client protection is enabled if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($this->dataRecord["client_group_id"])) { - $client_group_id = $app->functions->intval($this->dataRecord["client_group_id"]); - $app->uses('getconf'); - $global_config = $app->getconf->get_global_config('sites'); - if($global_config['client_protection'] == 'y') { - $app->db->query("UPDATE web_domain SET sys_groupid = ?, sys_perm_group = 'ru' WHERE domain_id = ?", $client_group_id, $this->id); + $client_group_id = $app->functions->intval($this->dataRecord["client_group_id"]); + $app->uses('getconf'); + $global_config = $app->getconf->get_global_config('sites'); + if($global_config['client_protection'] == 'y') { + $app->db->query("UPDATE web_domain SET sys_groupid = ?, sys_perm_group = 'ru' WHERE domain_id = ?", $client_group_id, $this->id); } else { $sysuser = $app->db->queryOneRecord('SELECT userid FROM sys_user WHERE default_group = ?',$client_group_id); $sysuser_id = (is_array($sysuser) && isset($sysuser['userid']) && $sysuser['userid'] > 0)?$sysuser['userid']:1; -- GitLab From 9c6c1817e5ff9e58d2fecc8b39f168cfc9132383 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 31 Aug 2020 14:17:34 +0200 Subject: [PATCH 0502/1368] Fixes #5706 Database backup settings not in sync with parent website --- interface/lib/classes/sites_database_plugin.inc.php | 4 ++-- interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/lib/classes/sites_database_plugin.inc.php b/interface/lib/classes/sites_database_plugin.inc.php index faf3fa30f7..68421d6083 100644 --- a/interface/lib/classes/sites_database_plugin.inc.php +++ b/interface/lib/classes/sites_database_plugin.inc.php @@ -49,8 +49,8 @@ class sites_database_plugin { $backup_format_db = $web['backup_format_db']; $backup_copies = $app->functions->intval($web['backup_copies']); - $sql = "UPDATE web_database SET sys_groupid = ?, backup_interval = ?, backup_copies = ?, backup_format_web = ?, backup_format_db = ? WHERE database_id = ?"; - $app->db->query($sql, $sys_groupid, $backup_interval, $backup_copies, $backup_format_web, $backup_format_db, $form_page->id); + $sql = "UPDATE web_database SET sys_groupid = ?, backup_interval = ?, backup_copies = ? WHERE database_id = ?"; + $app->db->query($sql, $sys_groupid, $backup_interval, $backup_copies, $form_page->id); } } diff --git a/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php b/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php index 71d68e3fb2..56dc825fd4 100644 --- a/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php +++ b/interface/lib/plugins/sites_web_vhost_domain_plugin.inc.php @@ -265,7 +265,7 @@ class sites_web_vhost_domain_plugin { $backup_format_db = $page_form->dataRecord['backup_format_db']; $records = $app->db->queryAllRecords("SELECT database_id FROM web_database WHERE parent_domain_id = ".$page_form->id); foreach($records as $rec) { - $app->db->datalogUpdate('web_database', array("backup_interval" => $backup_interval, "backup_copies" => $backup_copies, "backup_format_web" => $backup_format_web, "backup_format_db" => $backup_format_db), 'database_id', $rec['database_id']); + $app->db->datalogUpdate('web_database', array("backup_interval" => $backup_interval, "backup_copies" => $backup_copies), 'database_id', $rec['database_id']); } unset($records); unset($rec); -- GitLab From 64055d9ac0d13908a76be5e0991b914a9be0f47d Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Mon, 31 Aug 2020 17:11:31 +0200 Subject: [PATCH 0503/1368] try to get utf-8 working --- server/conf/goaccess_index.php.master | 2 + .../lib/classes/cron.d/150-goaccess.inc.php | 56 ++++++++++++++++--- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/server/conf/goaccess_index.php.master b/server/conf/goaccess_index.php.master index d0a8bf3c84..07a2c0292d 100644 --- a/server/conf/goaccess_index.php.master +++ b/server/conf/goaccess_index.php.master @@ -1,4 +1,5 @@ function load_content(url){var iframe = document.getElementById(\"content\");iframe.src = url;}\n"; @@ -60,6 +61,7 @@ foreach ($goaprev as $key => $value) $goaccessindex = 'goaindex.html'; $html = "\n\n\nStats\n"; +$html .= "\n"; $html .= "\n\n\n"; diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 255d646b0b..75e5952759 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -56,7 +56,7 @@ class cronjob_goaccess extends cronjob { // Create goaccess statistics //###################################################################################################### - $sql = "SELECT domain_id, domain, document_root, web_folder, type, system_user, system_group, parent_domain_id FROM web_domain WHERE (type = 'vhost' or type = 'vhostsubdomain' or type = 'vhostalias') and stats_type = 'goaccess' AND server_id = ?"; + $sql = "SELECT domain_id, sys_groupid, domain, document_root, web_folder, type, system_user, system_group, parent_domain_id FROM web_domain WHERE (type = 'vhost' or type = 'vhostsubdomain' or type = 'vhostalias') and stats_type = 'goaccess' AND server_id = ?"; $records = $app->db->queryAllRecords($sql, $conf['server_id']); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); @@ -187,12 +187,49 @@ class cronjob_goaccess extends cronjob { /* - * GoAccess removed with 1.4 btree support and supports from this version on only "In-Memory with On-Disk Persitance Storage". - * For versions prior 1.4 you need GoAccess with btree support compiled! + * GoAccess removed with 1.4 B+Tree support and supports from this version on only "In-Memory with On-Disk Persistance Storage". + * For versions prior 1.4 you need GoAccess with B+Tree support compiled! */ - - $cust_lang = $conf['language']."_".strtoupper($conf['language'])."UTF-8"; + + $sql_user = "SELECT client_id FROM sys_group WHERE groupid = ?"; + $rec_user = $app->db->queryOneRecord($sql_user, $rec['sys_groupid']); + $lang_query = "SELECT country,language FROM client WHERE client_id = ?"; + $lang_user = $app->db->queryOneRecord($lang_query, $rec_user['client_id']); + $cust_lang = $lang_user['language']."_".strtoupper($lang_user['language']).".UTF-8"; + + switch($lang_user['language']) + { + case 'en': + $cust_lang = 'en_UK.UTF-8'; + break; + case 'br': + $cust_lang = 'pt_BR.UTF-8'; + break; + case 'ca': + $cust_lang = 'en_CA.UTF-8'; + break; + case 'ja': + $cust_lang = 'ja_JP.UTF-8'; + break; + case 'ar': + $cust_lang = 'es_AR.UTF-8'; + break; + case 'el': + $cust_lang = 'el_GR.UTF-8'; + break; + case 'se': + $cust_lang = 'sv_SE.UTF-8'; + break; + case 'dk': + $cust_lang = 'da_DK.UTF-8'; + break; + case 'cz': + $cust_lang = 'cs_CZ.UTF-8'; + break; + } + + echo $cust_lang ."\n\n"; if(version_compare($goaccess_version,1.4) >= 0) { $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); } else { @@ -201,11 +238,16 @@ class cronjob_goaccess extends cronjob { if($match[0] == "keep-db-files") { $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --load-from-disk --keep-db-files --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); } else { - $app->log("Stats not generated. The GoAccess binary was not compiled with btree support. Please recompile/reinstall GoAccess with btree support, or install GoAccess version >= 1.4!", LOGLEVEL_ERROR); + $app->log("Stats couldn't be generated. The GoAccess binary wasn't compiled with B+Tree support. Please recompile/reinstall GoAccess with B+Tree support, or install GoAccess version >= 1.4! (recommended)", LOGLEVEL_ERROR); } unset($output); } + unset($cust_lang); + unset($sql_user); + unset($rec_user); + unset($lang_query); + unset($lang_user); if(!is_file($rec['document_root']."/".$web_folder."/stats/index.php")) { if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { @@ -224,7 +266,7 @@ class cronjob_goaccess extends cronjob { $app->system->exec_safe('chown -R ?:? ?', $username, $groupname, $statsdir); } } else { - $app->log("Stats not generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR); + $app->log("Stats couldn't be generated. The GoAccess binary couldn't be found. Make sure that GoAccess is installed and that it is in \$PATH", LOGLEVEL_ERROR); } } -- GitLab From 92eeb89a51f431d2268c2342fc5a909a94e76ec0 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 31 Aug 2020 17:16:51 +0200 Subject: [PATCH 0504/1368] Fixes #5635 Reseller limits are not correctly enforced when using templates --- .../sql/incremental/upd_dev_collection.sql | 4 ++ install/sql/ispconfig3.sql | 4 +- interface/lib/classes/tform_base.inc.php | 61 +++++++++++++------ interface/web/client/form/client.tform.php | 21 ++++++- .../web/client/form/client_template.tform.php | 21 ++++++- 5 files changed, 89 insertions(+), 22 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 1c4bd539d9..1b4b2c0f4f 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -44,3 +44,7 @@ ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; -- was missing in incremental, inserted for fixing older installations ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; + +-- Fix issue #5635 +ALTER TABLE `client_template` CHANGE `ssh_chroot` `ssh_chroot` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `client_template` CHANGE `web_php_options` `web_php_options` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index cdf85d7443..05b5c93841 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -330,7 +330,7 @@ CREATE TABLE `client_template` ( `limit_web_ip` text, `limit_web_domain` int(11) NOT NULL default '-1', `limit_web_quota` int(11) NOT NULL default '-1', - `web_php_options` varchar(255) NOT NULL DEFAULT 'no', + `web_php_options` varchar(255) NOT NULL DEFAULT '', `limit_cgi` enum('n','y') NOT NULL DEFAULT 'n', `limit_ssi` enum('n','y') NOT NULL DEFAULT 'n', `limit_perl` enum('n','y') NOT NULL DEFAULT 'n', @@ -345,7 +345,7 @@ CREATE TABLE `client_template` ( `limit_web_aliasdomain` int(11) NOT NULL default '-1', `limit_ftp_user` int(11) NOT NULL default '-1', `limit_shell_user` int(11) NOT NULL default '0', - `ssh_chroot` varchar(255) NOT NULL DEFAULT 'no', + `ssh_chroot` varchar(255) NOT NULL DEFAULT '', `limit_webdav_user` int(11) NOT NULL default '0', `limit_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y', `limit_directive_snippets` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'n', diff --git a/interface/lib/classes/tform_base.inc.php b/interface/lib/classes/tform_base.inc.php index bd9f70a626..cbbb83ee9c 100644 --- a/interface/lib/classes/tform_base.inc.php +++ b/interface/lib/classes/tform_base.inc.php @@ -336,11 +336,11 @@ class tform_base { } //* If the parameter 'valuelimit' is set - function applyValueLimit($limit, $values, $current_value = '') { + function applyValueLimit($formtype, $limit, $values, $current_value = '') { global $app; - // we mas have multiple limits, therefore we explode by ; first + // we may have multiple limits, therefore we explode by ; first // Example: "system:sites:web_php_options;client:web_php_options" $limits = explode(';',$limit); @@ -399,18 +399,31 @@ class tform_base { $tmp_key = $limit_parts[2]; $allowed = $allowed = explode(',',$tmp_conf[$tmp_key]); } + + if($formtype == 'CHECKBOX') { + if(strstr($limit,'force_')) { + // Force the checkbox field to be ticked and enabled + if($allowed[0] == $values[1]) { + $values = 'on'; + } + } else { + // Force the checkbox field to be unchecked and disabled + if($allowed[0] == $values[0]) { + $values = 'off'; + } + } + } else { + // add the current value to the allowed array + $allowed[] = $current_value; - // add the current value to the allowed array - $allowed[] = $current_value; - - // remove all values that are not allowed - $values_new = array(); - foreach($values as $key => $val) { - if(in_array($key, $allowed)) $values_new[$key] = $val; + // remove all values that are not allowed + $values_new = array(); + foreach($values as $key => $val) { + if(in_array($key, $allowed)) $values_new[$key] = $val; + } + $values = $values_new; } - $values = $values_new; - } return $values; @@ -479,7 +492,7 @@ class tform_base { // If a limitation for the values is set if(isset($field['valuelimit']) && is_array($field["value"])) { - $field["value"] = $this->applyValueLimit($field['valuelimit'], $field["value"], $val); + $field["value"] = $this->applyValueLimit($field['formtype'], $field['valuelimit'], $field["value"], $val); } switch ($field['formtype']) { @@ -521,8 +534,14 @@ class tform_base { break; case 'CHECKBOX': - $checked = ($val == $field['value'][1])?' CHECKED':''; - $new_record[$key] = "\r\n"; + if($field["value"] == 'off') { + $new_record[$key] = "\r\n"; + } elseif ($field["value"] == 'on') { + $new_record[$key] = "\r\n"; + } else { + $checked = ($val == $field['value'][1])?' CHECKED':''; + $new_record[$key] = "\r\n"; + } break; case 'CHECKBOXARRAY': @@ -614,7 +633,7 @@ class tform_base { // If a limitation for the values is set if(isset($field['valuelimit']) && is_array($field["value"])) { - $field["value"] = $this->applyValueLimit($field['valuelimit'], $field["value"], $field['default']); + $field["value"] = $this->applyValueLimit($field['formtype'], $field['valuelimit'], $field["value"], $field['default']); } switch ($field['formtype']) { @@ -651,9 +670,15 @@ class tform_base { break; case 'CHECKBOX': - // $checked = (empty($field["default"]))?'':' CHECKED'; - $checked = ($field["default"] == $field['value'][1])?' CHECKED':''; - $new_record[$key] = "\r\n"; + if($field["value"] == 'off') { + $new_record[$key] = "\r\n"; + } elseif ($field["value"] == 'on') { + $new_record[$key] = "\r\n"; + } else { + // $checked = (empty($field["default"]))?'':' CHECKED'; + $checked = ($field["default"] == $field['value'][1])?' CHECKED':''; + $new_record[$key] = "\r\n"; + } break; case 'CHECKBOXARRAY': diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index 17b9e623b6..c6e0a93dc0 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -985,42 +985,49 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_muc', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_anon' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_anon', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_vjud' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_vjud', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_proxy' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_proxy', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_status' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_status', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_pastebin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_pastebin', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_httparchive' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_httparchive', 'value' => array(0 => 'n', 1 => 'y') ), 'default_webserver' => array ( @@ -1087,67 +1094,77 @@ $form["tabs"]['limits'] = array ( ), 'default' => '', 'separator' => ',', - 'valuelimit' => 'system:sites:web_php_options', + 'valuelimit' => 'system:sites:web_php_options;client:web_php_options', 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM') ), 'limit_cgi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_cgi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_perl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_perl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ruby' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ruby', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_python' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_python', 'value' => array(0 => 'n', 1 => 'y') ), 'force_suexec' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:force_suexec', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_hterror' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_hterror', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_wildcard' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_wildcard', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl_letsencrypt' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl_letsencrypt', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_web_aliasdomain' => array ( @@ -1235,12 +1252,14 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:limit_backup', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_directive_snippets' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_directive_snippets', 'value' => array(0 => 'n', 1 => 'y') ), 'default_dnsserver' => array ( diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php index 1da5cdafcd..6dcd4a6738 100644 --- a/interface/web/client/form/client_template.tform.php +++ b/interface/web/client/form/client_template.tform.php @@ -401,42 +401,49 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_muc', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_anon' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_anon', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_vjud' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_vjud', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_proxy' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_proxy', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_status' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_status', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_pastebin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_pastebin', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_xmpp_httparchive' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_xmpp_httparchive', 'value' => array(0 => 'n', 1 => 'y') ),/* 'default_webserver' => array ( @@ -495,67 +502,77 @@ $form["tabs"]['limits'] = array ( 'formtype' => 'CHECKBOXARRAY', 'default' => '', 'separator' => ',', - 'valuelimit' => 'system:sites:web_php_options', + 'valuelimit' => 'system:sites:web_php_options;client:web_php_options', 'value' => array('no' => 'Disabled', 'fast-cgi' => 'Fast-CGI', 'cgi' => 'CGI', 'mod' => 'Mod-PHP', 'suphp' => 'SuPHP', 'php-fpm' => 'PHP-FPM', 'hhvm' => 'HHVM') ), 'limit_cgi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_cgi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssi' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssi', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_perl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_perl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ruby' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ruby', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_python' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_python', 'value' => array(0 => 'n', 1 => 'y') ), 'force_suexec' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:force_suexec', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_hterror' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_hterror', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_wildcard' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_wildcard', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_ssl_letsencrypt' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_ssl_letsencrypt', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_web_aliasdomain' => array ( @@ -646,12 +663,14 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', + 'valuelimit' => 'client:limit_backup', 'value' => array(0 => 'n', 1 => 'y') ), 'limit_directive_snippets' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'n', + 'valuelimit' => 'client:limit_directive_snippets', 'value' => array(0 => 'n', 1 => 'y') ),/* 'default_dnsserver' => array ( -- GitLab From 023f15ba372c0c7d9d40a5b0d9ec0c139951a775 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 31 Aug 2020 20:34:10 +0200 Subject: [PATCH 0505/1368] Remove monitor key field (#3844) --- .../web/admin/form/system_config.tform.php | 6 - .../templates/system_config_misc_edit.htm | 429 +++++++++--------- 2 files changed, 227 insertions(+), 208 deletions(-) diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index 0e29902c33..d998c46015 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -595,12 +595,6 @@ $form["tabs"]['misc'] = array ( 'default' => 'http://www.ispconfig.org/atom', 'value' => '' ), - 'monitor_key' => array ( - 'datatype' => 'VARCHAR', - 'formtype' => 'TEXT', - 'default' => '', - 'value' => '' - ), 'tab_change_discard' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/templates/system_config_misc_edit.htm b/interface/web/admin/templates/system_config_misc_edit.htm index 31fafdc545..356d2e1b25 100644 --- a/interface/web/admin/templates/system_config_misc_edit.htm +++ b/interface/web/admin/templates/system_config_misc_edit.htm @@ -1,204 +1,229 @@ - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
    -
    - -
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
    -
    - -
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
    -
    - -
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
    -
    - -
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
    -
    - -
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} -
    -
    - -
    - {tmpl_var name='tab_change_discard'} -
    -
    -
    - -
    - {tmpl_var name='tab_change_warning'}
    {tmpl_var name='tab_change_warning_note_txt'} -
    -
    -
    - -
    - {tmpl_var name='use_loadindicator'}
    {tmpl_var name='f5_to_reload_js_txt'} -
    -
    -
    - -
    - {tmpl_var name='use_combobox'}
    {tmpl_var name='f5_to_reload_js_txt'} -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - {tmpl_var name='session_allow_endless'} -
    -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    - {tmpl_var name='maintenance_mode'} -
    -
    -
    - -
    - -
    -
    - - -

    -
    - -

    -
    - - -
    - - -
    + +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    + +
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
    +
    +
    + +
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
    +
    +
    + +
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
    +
    +
    + +
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
    +
    +
    + +
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
    +
    +
    + +
    {tmpl_var name='available_dashlets_note_txt'} {tmpl_var name="available_dashlets_txt"} +
    +
    +
    + +
    + {tmpl_var name='tab_change_discard'} +
    +
    +
    + +
    + {tmpl_var name='tab_change_warning'}
    {tmpl_var name='tab_change_warning_note_txt'} +
    +
    +
    + +
    + {tmpl_var name='use_loadindicator'}
    {tmpl_var name='f5_to_reload_js_txt'} +
    +
    +
    + +
    + {tmpl_var name='use_combobox'}
    {tmpl_var name='f5_to_reload_js_txt'} +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    + {tmpl_var name='session_allow_endless'} +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    + +
    + {tmpl_var name='maintenance_mode'} +
    +
    +
    + +
    + +
    +
    + +
    +

    + +

    +
    +
    + +
    +

    + +

    +
      + +
    +
    +
    + +
    +
    + + +
    +
    + function delCustomLogo() { + var id = jQuery('input[name="id"]').val(); + + jQuery.getJSON('admin/ajax_get_json.php'+ '?' + Math.round(new Date().getTime()), {'id': id, 'type': "delcustomlogo"}, function(data) { + //console.log(data); + $('#used_logo').html(defaultLogo); + $('#logo').css({ "background": "url("+data.data+") no-repeat", "width": data.width, "height": data.height }); + }); + } + + // Variable to store your files + var files; + // Add events + $('input[type="file"]').on('change', prepareUpload); + $('#start_upload').on('click', uploadFiles); + + // Grab the files and set them to our variable + function prepareUpload(event){ + files = event.target.files; + } + + // Catch the form submit and upload the files + function uploadFiles(event){ + event.stopPropagation(); // Stop stuff happening + event.preventDefault(); // Totally stop stuff happening + + var id = jQuery('input[name="id"]').val(); + + // Create a formdata object and add the files + var data = new FormData(); + $.each(files, function(key, value){ + data.append(key, value); + }); + + $.ajax({ + url: 'admin/ajax_get_json.php?id='+id+'&type=uploadfile', + type: 'POST', + data: data, + cache: false, + dataType: 'json', + processData: false, // Don't process the files + contentType: false, // Set content type to false as jQuery will tell the server its a query string request + success: function(data, textStatus, jqXHR){ + if(typeof data.error === 'undefined'){ + // Success so call function to process the form + //console.log(data); + $('#used_logo').html('  '); + $('#logo').css({ "background": "url("+data.data+") no-repeat", "width": data.width, "height": data.height }); + } else { + // Handle errors here + //console.log(data); + } + }, + error: function(jqXHR, textStatus, errorThrown){ + // Handle errors here + //console.log(data); + } + }); + } + + --> -- GitLab From 95fdcb66faa48cd326eef93347dd62f636d98ea1 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 31 Aug 2020 22:24:20 +0200 Subject: [PATCH 0506/1368] Add domain variable for directive snippets (#3375 and #5166) --- .../templates/directive_snippets_edit.htm | 20 +- .../templates/web_vhost_domain_advanced.htm | 390 +++++++++--------- .../plugins-available/apache2_plugin.inc.php | 7 +- server/plugins-available/nginx_plugin.inc.php | 5 +- 4 files changed, 216 insertions(+), 206 deletions(-) diff --git a/interface/web/admin/templates/directive_snippets_edit.htm b/interface/web/admin/templates/directive_snippets_edit.htm index 4506cafd63..b01e7e255c 100644 --- a/interface/web/admin/templates/directive_snippets_edit.htm +++ b/interface/web/admin/templates/directive_snippets_edit.htm @@ -11,8 +11,8 @@
    {tmpl_var name='snippet'}
    -   Nginx {tmpl_var name='variables_txt'}: {DOCROOT}, {FASTCGIPASS}, {PHPFALLBACKFASTCGIPASS}
    -   Apache {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT}
    +   Nginx {tmpl_var name='variables_txt'}: {DOCROOT}, {DOMAIN}, {FASTCGIPASS}, {PHPFALLBACKFASTCGIPASS}
    +   Apache {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT}, {DOMAIN}
      PHP {tmpl_var name='variables_txt'}: {WEBROOT}
    @@ -38,23 +38,23 @@
    -
    {tmpl_var name='update_sites'}
    -
    - +
    {tmpl_var name='update_sites'}
    +
    + - +
    diff --git a/interface/web/sites/templates/web_vhost_domain_advanced.htm b/interface/web/sites/templates/web_vhost_domain_advanced.htm index f1df422bad..e878a06fbb 100644 --- a/interface/web/sites/templates/web_vhost_domain_advanced.htm +++ b/interface/web/sites/templates/web_vhost_domain_advanced.htm @@ -1,198 +1,206 @@ -
    -

    {tmpl_var name='configuration_error_txt'}

    -
    -
    {tmpl_var name='config_error_tstamp'} : 
    {tmpl_var name='config_error_msg'}
    -
    -
    +
    +

    {tmpl_var name='configuration_error_txt'}

    +
    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    + +
    +
       {tmpl_var name='system_user'}
    +
    + +
    +
    + +
    +
       {tmpl_var name='system_group'}
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    + {tmpl_var name='proxy_protocol'} +
    +
    +
    +
    + +
    + {tmpl_var name='php_fpm_use_socket'} +
    +
    +
    + +
    + {tmpl_var name='php_fpm_chroot'} +
    +
    +
    + +
    +
    +
    +
    + {tmpl_var name='pm_ondemand_hint_txt'} +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
     s +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    + +
    + {tmpl_var name="available_php_directive_snippets_txt"}

     {tmpl_var name="php_directive_snippets_txt"} +
    +
    +
    + +
    + {tmpl_var name="available_apache_directive_snippets_txt"}

     {tmpl_var name="apache_directive_snippets_txt"}
    ----
     {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT}, {DOMAIN} +
    +
    +
    + +
    + {tmpl_var name="available_nginx_directive_snippets_txt"}

     {tmpl_var name="nginx_directive_snippets_txt"}
    ----
     {tmpl_var name='variables_txt'}: {DOCROOT}, {DOCROOT_CLIENT}, {DOMAIN}, {FASTCGIPASS}, {PHPFALLBACKFASTCGIPASS} +
    +
    +
    + +
    + {tmpl_var name="available_proxy_directive_snippets_txt"}

     {tmpl_var name="proxy_directive_snippets_txt"} +
    +
    + +
    +
    + + +
    +
    + diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index f11476b402..ade1841a2b 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1243,7 +1243,8 @@ class apache2_plugin { $vhost_data['apache_directives'] = str_replace("\r", "\n", $vhost_data['apache_directives']); $trans = array( '{DOCROOT}' => $vhost_data['web_document_root_www'], - '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'] + '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'], + '{DOMAIN}' => $vhost_data['domain'] ); $vhost_data['apache_directives'] = strtr($vhost_data['apache_directives'], $trans); @@ -3084,7 +3085,7 @@ class apache2_plugin { /* In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. - By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. */ if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master")) { @@ -3116,7 +3117,7 @@ class apache2_plugin { if(is_file($goaccess_conf) && (filesize($goaccess_conf) > 0)) { $app->log('Created GoAccess config file: '.$goaccess_conf, LOGLEVEL_DEBUG); - } + } if(is_file($data['new']['document_root']."/" . $web_folder . "/stats/index.html")) $app->system->unlink($data['new']['document_root']."/" . $web_folder . "/stats/index.html"); if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess_index.php.master")) { diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 4b20a03391..e152f6e3be 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -1298,6 +1298,7 @@ class nginx_plugin { $trans = array( '{DOCROOT}' => $vhost_data['web_document_root_www'], '{DOCROOT_CLIENT}' => $vhost_data['web_document_root'], + '{DOMAIN}' => $vhost_data['domain'], '{FASTCGIPASS}' => 'fastcgi_pass '.($data['new']['php_fpm_use_socket'] == 'y'? 'unix:'.$fpm_socket : '127.0.0.1:'.$vhost_data['fpm_port']).';' ); foreach($nginx_directive_lines as $nginx_directive_line){ @@ -2597,7 +2598,7 @@ class nginx_plugin { $goaccess_conf_main = $goa_loc; break; } else { - $count++; + $count++; if($count == 2) { $app->log("No GoAccess base config found. Make sure that GoAccess is installed and that the goaccess.conf does exist in /etc or /etc/goaccess", LOGLEVEL_WARN); } @@ -2609,7 +2610,7 @@ class nginx_plugin { /* In case that you use a different log format, you should use a custom goaccess.conf which you'll have to put into /usr/local/ispconfig/server/conf-custom/. - By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. + By default the originaly with GoAccess shipped goaccess.conf from /etc/ will be used along with the log-format value COMBINED. */ if(file_exists("/usr/local/ispconfig/server/conf-custom/goaccess.conf.master")) { -- GitLab From 3682b5f00333ff21740069bc6032c9570354a28e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 21 Aug 2020 16:04:32 -0600 Subject: [PATCH 0507/1368] allow matching regex in custom mail filter --- .../plugins/mail_user_filter_plugin.inc.php | 49 ++++++++++++++----- .../web/mail/form/mail_user_filter.tform.php | 3 +- .../web/mail/lib/lang/ar_mail_user_filter.lng | 1 + .../web/mail/lib/lang/bg_mail_user_filter.lng | 1 + .../web/mail/lib/lang/br_mail_user_filter.lng | 1 + .../web/mail/lib/lang/ca_mail_user_filter.lng | 1 + .../web/mail/lib/lang/cz_mail_user_filter.lng | 1 + .../web/mail/lib/lang/de_mail_user_filter.lng | 1 + .../web/mail/lib/lang/dk_mail_user_filter.lng | 1 + .../web/mail/lib/lang/el_mail_user_filter.lng | 1 + .../web/mail/lib/lang/en_mail_user_filter.lng | 1 + .../web/mail/lib/lang/es_mail_user_filter.lng | 1 + .../web/mail/lib/lang/fi_mail_user_filter.lng | 1 + .../web/mail/lib/lang/fr_mail_user_filter.lng | 1 + .../web/mail/lib/lang/hr_mail_user_filter.lng | 1 + .../web/mail/lib/lang/hu_mail_user_filter.lng | 1 + .../web/mail/lib/lang/id_mail_user_filter.lng | 1 + .../web/mail/lib/lang/it_mail_user_filter.lng | 1 + .../web/mail/lib/lang/ja_mail_user_filter.lng | 1 + .../web/mail/lib/lang/nl_mail_user_filter.lng | 1 + .../web/mail/lib/lang/pl_mail_user_filter.lng | 1 + .../web/mail/lib/lang/pt_mail_user_filter.lng | 1 + .../web/mail/lib/lang/ro_mail_user_filter.lng | 1 + .../web/mail/lib/lang/ru_mail_user_filter.lng | 1 + .../web/mail/lib/lang/se_mail_user_filter.lng | 1 + .../web/mail/lib/lang/sk_mail_user_filter.lng | 1 + .../web/mail/lib/lang/tr_mail_user_filter.lng | 1 + security/ids.whitelist | 5 +- 28 files changed, 67 insertions(+), 15 deletions(-) diff --git a/interface/lib/plugins/mail_user_filter_plugin.inc.php b/interface/lib/plugins/mail_user_filter_plugin.inc.php index ccf58b853c..4c6d8235c7 100644 --- a/interface/lib/plugins/mail_user_filter_plugin.inc.php +++ b/interface/lib/plugins/mail_user_filter_plugin.inc.php @@ -162,23 +162,48 @@ class mail_user_filter_plugin { $content .= 'if header :regex ["'.strtolower($page_form->dataRecord["source"]).'"] ["'; - $searchterm = preg_quote($page_form->dataRecord["searchterm"]); - $searchterm = str_replace( - array( - '"', - '\\[', - '\\]' - ), - array( - '\\"', - '\\\\[', - '\\\\]' - ), $searchterm); + # special chars in sieve regex must be escaped with double-backslash + if($page_form->dataRecord["op"] == 'regex') { + # if providing a regex, special chars must already be quoted as intended; + # we will simply try to check for an obviously unquoted double-quote and handle that. + $patterns = array( '/([^\\\\]{2})"/', '/([^\\\\])\\\\"/' ); + $replace = array( '${1}\\\\\\\\"', '${1}\\\\\\\\"' ); + $searchterm = preg_replace( $patterns, $replace, $page_form->dataRecord["searchterm"] ); + } else { + $sieve_regex_escape = array( + '\\' => '\\\\\\', + '+' => '\\\\+', + '*' => '\\\\*', + '?' => '\\\\?', + '[' => '\\\\[', + '^' => '\\\\^', + ']' => '\\\\]', + '$' => '\\\\$', + '(' => '\\\\(', + ')' => '\\\\)', + '{' => '\\\\{', + '}' => '\\\\}', + '|' => '\\\\|', + '.' => '\\\\.', + # these (from preg_quote) should not be needed + #'=' => '\\\\=', + #'!' => '\\\\!', + #'<' => '\\\\<', + #'>' => '\\\\>', + #':' => '\\\\:', + #'-' => '\\\\-', + #'#' => '\\\\#', + ); + $searchterm = strtr( $page_form->dataRecord["searchterm"], $sieve_regex_escape ); + + } if($page_form->dataRecord["op"] == 'contains') { $content .= ".*".$searchterm; } elseif ($page_form->dataRecord["op"] == 'is') { $content .= "^".$searchterm."$"; + } elseif ($page_form->dataRecord["op"] == 'regex') { + $content .= $searchterm; } elseif ($page_form->dataRecord["op"] == 'begins') { $content .= "^".$searchterm.""; } elseif ($page_form->dataRecord["op"] == 'ends') { diff --git a/interface/web/mail/form/mail_user_filter.tform.php b/interface/web/mail/form/mail_user_filter.tform.php index b1370ecaa1..0b10799163 100644 --- a/interface/web/mail/form/mail_user_filter.tform.php +++ b/interface/web/mail/form/mail_user_filter.tform.php @@ -94,8 +94,7 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - //'value' => array('contains'=>'contains_txt','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') - 'value' => array('contains'=>'contains_txt', 'is' => 'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'localpart' => 'localpart_txt', 'domain' => 'domain_txt') + 'value' => array('contains'=>'contains_txt', 'is'=>'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'regex'=>'regex_txt', 'localpart'=>'localpart_txt', 'domain'=>'domain_txt') ), 'searchterm' => array ( 'datatype' => 'VARCHAR', diff --git a/interface/web/mail/lib/lang/ar_mail_user_filter.lng b/interface/web/mail/lib/lang/ar_mail_user_filter.lng index 9a15472e88..bed377b2f6 100644 --- a/interface/web/mail/lib/lang/ar_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/ar_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/bg_mail_user_filter.lng b/interface/web/mail/lib/lang/bg_mail_user_filter.lng index 6929752c5a..ed7d137db0 100644 --- a/interface/web/mail/lib/lang/bg_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/bg_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Описание'; $wb['is_txt'] = 'е'; $wb['begins_with_txt'] = 'Начало с'; $wb['ends_with_txt'] = 'Край с'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Изтрий'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/br_mail_user_filter.lng b/interface/web/mail/lib/lang/br_mail_user_filter.lng index 226b7e2722..560858c713 100644 --- a/interface/web/mail/lib/lang/br_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/br_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contêm'; $wb['is_txt'] = 'é'; $wb['begins_with_txt'] = 'Iniciando com'; $wb['ends_with_txt'] = 'Terminando com'; +$wb['regex_txt'] = 'Matches Regex'; $wb['move_stop_txt'] = 'Mover para'; $wb['delete_txt'] = 'Remover'; $wb['header_txt'] = 'Cabeçalho'; diff --git a/interface/web/mail/lib/lang/ca_mail_user_filter.lng b/interface/web/mail/lib/lang/ca_mail_user_filter.lng index 8744b2ab79..3aaa7f1665 100644 --- a/interface/web/mail/lib/lang/ca_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/ca_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contient'; $wb['is_txt'] = 'Est'; $wb['begins_with_txt'] = 'Commence par'; $wb['ends_with_txt'] = 'Fini par'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Supprimer'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/cz_mail_user_filter.lng b/interface/web/mail/lib/lang/cz_mail_user_filter.lng index 3f5357f735..3d56a9b839 100644 --- a/interface/web/mail/lib/lang/cz_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/cz_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Obsahuje'; $wb['is_txt'] = 'Je'; $wb['begins_with_txt'] = 'Začíná na'; $wb['ends_with_txt'] = 'Končí na'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Smazat'; $wb['move_stop_txt'] = 'Přesunout'; $wb['header_txt'] = 'Hlavička'; diff --git a/interface/web/mail/lib/lang/de_mail_user_filter.lng b/interface/web/mail/lib/lang/de_mail_user_filter.lng index 345b9c4fbb..579a867e98 100644 --- a/interface/web/mail/lib/lang/de_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/de_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Enthält'; $wb['is_txt'] = 'Ist'; $wb['begins_with_txt'] = 'Beginnt mit'; $wb['ends_with_txt'] = 'Endet mit'; +$wb['regex_txt'] = 'Matches Regex'; $wb['move_stop_txt'] = 'Verschieben nach'; $wb['delete_txt'] = 'Löschen'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/dk_mail_user_filter.lng b/interface/web/mail/lib/lang/dk_mail_user_filter.lng index ef8be2a0c9..8da1a24201 100644 --- a/interface/web/mail/lib/lang/dk_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/dk_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Indeholder'; $wb['is_txt'] = 'Er'; $wb['begins_with_txt'] = 'Begynder med'; $wb['ends_with_txt'] = 'Slutter med'; +$wb['regex_txt'] = 'Matches Regex'; $wb['move_stop_txt'] = 'Flyt til'; $wb['delete_txt'] = 'Slet'; $wb['header_txt'] = 'Hoved'; diff --git a/interface/web/mail/lib/lang/el_mail_user_filter.lng b/interface/web/mail/lib/lang/el_mail_user_filter.lng index 72710a9f7e..c3c232362e 100644 --- a/interface/web/mail/lib/lang/el_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/el_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Περιλαμβάνει'; $wb['is_txt'] = 'είναι'; $wb['begins_with_txt'] = 'Ξεκινά με'; $wb['ends_with_txt'] = 'Τελειώνει σε'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Διαγραφή'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/en_mail_user_filter.lng b/interface/web/mail/lib/lang/en_mail_user_filter.lng index 462ee6d936..7db2df5a72 100644 --- a/interface/web/mail/lib/lang/en_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/en_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['move_stop_txt'] = 'Move to'; $wb['delete_txt'] = 'Delete'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/es_mail_user_filter.lng b/interface/web/mail/lib/lang/es_mail_user_filter.lng index ed221d5cb3..4e50fbceff 100644 --- a/interface/web/mail/lib/lang/es_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/es_mail_user_filter.lng @@ -6,6 +6,7 @@ $wb['contains_txt'] = 'Contiene'; $wb['delete_txt'] = 'Borrar'; $wb['domain_txt'] = 'Domain'; $wb['ends_with_txt'] = 'Termina con'; +$wb['regex_txt'] = 'Matches Regex'; $wb['from_txt'] = 'De'; $wb['header_txt'] = 'Cabecera'; $wb['is_txt'] = 'Es'; diff --git a/interface/web/mail/lib/lang/fi_mail_user_filter.lng b/interface/web/mail/lib/lang/fi_mail_user_filter.lng index 1238dc86fd..5315bc6f1e 100644 --- a/interface/web/mail/lib/lang/fi_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/fi_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/fr_mail_user_filter.lng b/interface/web/mail/lib/lang/fr_mail_user_filter.lng index b5cacf2e98..324d6f3c78 100644 --- a/interface/web/mail/lib/lang/fr_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/fr_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contient'; $wb['is_txt'] = 'Est'; $wb['begins_with_txt'] = 'Commence par'; $wb['ends_with_txt'] = 'Fini par'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Supprimer'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/hr_mail_user_filter.lng b/interface/web/mail/lib/lang/hr_mail_user_filter.lng index 33fd0106a8..55e46fab91 100644 --- a/interface/web/mail/lib/lang/hr_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/hr_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Sadrži'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Počinje sa'; $wb['ends_with_txt'] = 'Završava sa'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Obriši'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/hu_mail_user_filter.lng b/interface/web/mail/lib/lang/hu_mail_user_filter.lng index a3db584920..8b39c062a6 100644 --- a/interface/web/mail/lib/lang/hu_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/hu_mail_user_filter.lng @@ -14,6 +14,7 @@ $wb['contains_txt'] = 'Tartalmazza'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['target_error_regex'] = 'The target may only contain these characters: a-z, 0-9, -, ., _, and {space}'; $wb['limit_mailfilter_txt'] = 'The max. number of mailfilters is reached.'; $wb['delete_txt'] = 'Delete'; diff --git a/interface/web/mail/lib/lang/id_mail_user_filter.lng b/interface/web/mail/lib/lang/id_mail_user_filter.lng index 93f45979f3..2a8ec29b45 100644 --- a/interface/web/mail/lib/lang/id_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/id_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/it_mail_user_filter.lng b/interface/web/mail/lib/lang/it_mail_user_filter.lng index 827f906345..131b7ff6b5 100644 --- a/interface/web/mail/lib/lang/it_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/it_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contiene'; $wb['is_txt'] = 'è'; $wb['begins_with_txt'] = 'Inizia con'; $wb['ends_with_txt'] = 'Termina con'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Elimina'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/ja_mail_user_filter.lng b/interface/web/mail/lib/lang/ja_mail_user_filter.lng index 8ee3801cc8..7354c40265 100644 --- a/interface/web/mail/lib/lang/ja_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/ja_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/nl_mail_user_filter.lng b/interface/web/mail/lib/lang/nl_mail_user_filter.lng index 050d64aaf9..99dd91b58c 100644 --- a/interface/web/mail/lib/lang/nl_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/nl_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Bevat'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begint met'; $wb['ends_with_txt'] = 'Eindigt in'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Verwijderen'; $wb['move_stop_txt'] = 'Verplaatsen naar'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/pl_mail_user_filter.lng b/interface/web/mail/lib/lang/pl_mail_user_filter.lng index d0bc6d6a28..6c86f3e52a 100644 --- a/interface/web/mail/lib/lang/pl_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/pl_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Zawiera'; $wb['is_txt'] = 'Jest'; $wb['begins_with_txt'] = 'Zaczyna się od'; $wb['ends_with_txt'] = 'Kończy się na'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Usuń'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/pt_mail_user_filter.lng b/interface/web/mail/lib/lang/pt_mail_user_filter.lng index 906c27ecd2..41235591a7 100644 --- a/interface/web/mail/lib/lang/pt_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/pt_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/ro_mail_user_filter.lng b/interface/web/mail/lib/lang/ro_mail_user_filter.lng index 22435d9e91..3ca08e982a 100644 --- a/interface/web/mail/lib/lang/ro_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/ro_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/ru_mail_user_filter.lng b/interface/web/mail/lib/lang/ru_mail_user_filter.lng index 78fac01aee..07e767c245 100644 --- a/interface/web/mail/lib/lang/ru_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/ru_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Содержит'; $wb['is_txt'] = 'Равно'; $wb['begins_with_txt'] = 'Начинается с'; $wb['ends_with_txt'] = 'Заканчивается на'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Удалить'; $wb['move_stop_txt'] = 'Переместить в'; $wb['header_txt'] = 'Заголовок'; diff --git a/interface/web/mail/lib/lang/se_mail_user_filter.lng b/interface/web/mail/lib/lang/se_mail_user_filter.lng index 9830059195..f8c2a61546 100644 --- a/interface/web/mail/lib/lang/se_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/se_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Innehåller'; $wb['is_txt'] = 'Är'; $wb['begins_with_txt'] = 'Börjar med'; $wb['ends_with_txt'] = 'Slutar med'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Radera'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/sk_mail_user_filter.lng b/interface/web/mail/lib/lang/sk_mail_user_filter.lng index 7546cd6afa..966161ed3f 100644 --- a/interface/web/mail/lib/lang/sk_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/sk_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Contains'; $wb['is_txt'] = 'Is'; $wb['begins_with_txt'] = 'Begins with'; $wb['ends_with_txt'] = 'Ends with'; +$wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Delete'; $wb['move_stop_txt'] = 'Move to'; $wb['header_txt'] = 'Header'; diff --git a/interface/web/mail/lib/lang/tr_mail_user_filter.lng b/interface/web/mail/lib/lang/tr_mail_user_filter.lng index 6d4e0b8868..816174445b 100644 --- a/interface/web/mail/lib/lang/tr_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/tr_mail_user_filter.lng @@ -16,6 +16,7 @@ $wb['contains_txt'] = 'Şunu içeren'; $wb['is_txt'] = 'Şununla aynı'; $wb['begins_with_txt'] = 'Şununla başlayan'; $wb['ends_with_txt'] = 'Şununla biten'; +$wb['regex_txt'] = 'Matches Regex'; $wb['move_stop_txt'] = 'Şuraya taşı'; $wb['delete_txt'] = 'Sil'; $wb['header_txt'] = 'Başlık'; diff --git a/security/ids.whitelist b/security/ids.whitelist index 6a953f45cf..ab7ee504a3 100644 --- a/security/ids.whitelist +++ b/security/ids.whitelist @@ -55,4 +55,7 @@ user:/login/index.php:POST.password user:/mail/mail_domain_edit.php:POST.dkim_private user:/mail/mail_domain_edit.php:POST.dkim_public user:/mail/mail_domain_edit.php:POST.dns_record -user:/sites/web_vhost_domain_edit.php:POST.fastcgi_php_version \ No newline at end of file +user:/sites/web_vhost_domain_edit.php:POST.fastcgi_php_version +admin:/mail/mail_user_filter_edit.php:POST.searchterm +user:/mail/mail_user_filter_edit.php:POST.searchterm +admin:/mail/mail_user_edit.php:POST.custom_mailfilter -- GitLab From 478726a48cbb1e07746dead3d8699f094797eb6e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 25 Aug 2020 16:28:18 -0600 Subject: [PATCH 0508/1368] sieve filter: allow 'Header' source for domain/localpart address tests --- .../plugins/mail_user_filter_plugin.inc.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/interface/lib/plugins/mail_user_filter_plugin.inc.php b/interface/lib/plugins/mail_user_filter_plugin.inc.php index 4c6d8235c7..45c32179f6 100644 --- a/interface/lib/plugins/mail_user_filter_plugin.inc.php +++ b/interface/lib/plugins/mail_user_filter_plugin.inc.php @@ -137,8 +137,14 @@ class mail_user_filter_plugin { $content = ''; $content .= '### BEGIN FILTER_ID:'.$page_form->id."\n"; - //$content .= 'require ["fileinto", "regex", "vacation"];'."\n"; - + if($page_form->dataRecord["source"] == 'Header') { + $parts = explode(':',trim($page_form->dataRecord["searchterm"])); + $page_form->dataRecord["source"] = trim($parts[0]); + unset($parts[0]); + $page_form->dataRecord["searchterm"] = trim(implode(':',$parts)); + unset($parts); + } + if($page_form->dataRecord["op"] == 'domain') { $content .= 'if address :domain :is "'.strtolower($page_form->dataRecord["source"]).'" "'.$page_form->dataRecord["searchterm"].'" {'."\n"; } elseif ($page_form->dataRecord["op"] == 'localpart') { @@ -152,15 +158,7 @@ class mail_user_filter_plugin { $content .= 'if size :over '.intval($page_form->dataRecord["searchterm"]).$unit.' {'."\n"; } else { - if($page_form->dataRecord["source"] == 'Header') { - $parts = explode(':',trim($page_form->dataRecord["searchterm"])); - $page_form->dataRecord["source"] = trim($parts[0]); - unset($parts[0]); - $page_form->dataRecord["searchterm"] = trim(implode(':',$parts)); - unset($parts); - } - - $content .= 'if header :regex ["'.strtolower($page_form->dataRecord["source"]).'"] ["'; + $content .= 'if header :regex "'.strtolower($page_form->dataRecord["source"]).'" ["'; # special chars in sieve regex must be escaped with double-backslash if($page_form->dataRecord["op"] == 'regex') { -- GitLab From a1391774335b2d6e21e6ad277bbba8b8e3200e72 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Tue, 1 Sep 2020 11:19:10 +0200 Subject: [PATCH 0509/1368] fixed utf8 by adding appropriate files directive to htaccess --- server/conf/goaccess_index.php.master | 3 +-- server/lib/classes/cron.d/150-goaccess.inc.php | 10 ++++------ server/plugins-available/apache2_plugin.inc.php | 2 +- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/server/conf/goaccess_index.php.master b/server/conf/goaccess_index.php.master index 07a2c0292d..ecb91c7a9c 100644 --- a/server/conf/goaccess_index.php.master +++ b/server/conf/goaccess_index.php.master @@ -1,5 +1,4 @@ function load_content(url){var iframe = document.getElementById(\"content\");iframe.src = url;}\n"; @@ -61,7 +60,7 @@ foreach ($goaprev as $key => $value) $goaccessindex = 'goaindex.html'; $html = "\n\n\nStats\n"; -$html .= "\n"; +$html .= "\n"; $html .= "\n\n\n"; diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 75e5952759..c0ef85f9a6 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -191,8 +191,7 @@ class cronjob_goaccess extends cronjob { * For versions prior 1.4 you need GoAccess with B+Tree support compiled! */ - - $sql_user = "SELECT client_id FROM sys_group WHERE groupid = ?"; + $sql_user = "SELECT client_id FROM sys_group WHERE groupid = ?"; $rec_user = $app->db->queryOneRecord($sql_user, $rec['sys_groupid']); $lang_query = "SELECT country,language FROM client WHERE client_id = ?"; $lang_user = $app->db->queryOneRecord($lang_query, $rec_user['client_id']); @@ -204,16 +203,16 @@ class cronjob_goaccess extends cronjob { $cust_lang = 'en_UK.UTF-8'; break; case 'br': - $cust_lang = 'pt_BR.UTF-8'; + $cust_lang = 'pt_PT.UTF-8'; break; case 'ca': - $cust_lang = 'en_CA.UTF-8'; + $cust_lang = 'en_US.UTF-8'; break; case 'ja': $cust_lang = 'ja_JP.UTF-8'; break; case 'ar': - $cust_lang = 'es_AR.UTF-8'; + $cust_lang = 'es_ES.UTF-8'; break; case 'el': $cust_lang = 'el_GR.UTF-8'; @@ -229,7 +228,6 @@ class cronjob_goaccess extends cronjob { break; } - echo $cust_lang ."\n\n"; if(version_compare($goaccess_version,1.4) >= 0) { $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); } else { diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 4a88c0d874..70976a6500 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1893,7 +1893,7 @@ class apache2_plugin { if($data['new']['stats_type'] != '') { 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\nDirectoryIndex index.html index.php\nHeader unset Content-Security-Policy"; + $ht_file = "AuthType Basic\nAuthName \"Members Only\"\nAuthUserFile ".$data['new']['document_root']."/web/stats/.htpasswd_stats\nrequire valid-user\nDirectoryIndex index.html index.php\nHeader unset Content-Security-Policy\n\nAddDefaultCharset UTF-8\n\n"; $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); -- GitLab From 2ceb6ebc025915dcc1849edddab81a4c0c82cde0 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Tue, 1 Sep 2020 14:19:19 +0200 Subject: [PATCH 0510/1368] relocated comment --- server/lib/classes/cron.d/150-goaccess.inc.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index c0ef85f9a6..7bdbbeb03b 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -186,11 +186,6 @@ class cronjob_goaccess extends cronjob { } - /* - * GoAccess removed with 1.4 B+Tree support and supports from this version on only "In-Memory with On-Disk Persistance Storage". - * For versions prior 1.4 you need GoAccess with B+Tree support compiled! - */ - $sql_user = "SELECT client_id FROM sys_group WHERE groupid = ?"; $rec_user = $app->db->queryOneRecord($sql_user, $rec['sys_groupid']); $lang_query = "SELECT country,language FROM client WHERE client_id = ?"; @@ -228,6 +223,12 @@ class cronjob_goaccess extends cronjob { break; } + + /* + * GoAccess removed with 1.4 B+Tree support and supports from this version on only "In-Memory with On-Disk Persistance Storage". + * For versions prior 1.4 you need GoAccess with B+Tree support compiled! + */ + if(version_compare($goaccess_version,1.4) >= 0) { $app->system->exec_safe("LANG=? goaccess -f ? --config-file ? --restore --persist --db-path=? --output=?", $cust_lang, $logfile, $goaccess_conf, $goa_db_dir, $output_html); } else { -- GitLab From 6c096ff545771eb949cf48eff05104d11bfe9dfe Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 1 Sep 2020 18:10:14 +0200 Subject: [PATCH 0511/1368] Implements #5718 Disable symlinks in Nginx vhosts --- server/conf/nginx_vhost.conf.master | 1 + 1 file changed, 1 insertion(+) diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index 3fc50cc108..c7e36de39e 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -34,6 +34,7 @@ server { server_name ; root ; + disable_symlinks if_not_owner; -- GitLab From d12a7064ea342fa8de768d764b32aa7cda302873 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 31 Aug 2020 14:32:41 -0600 Subject: [PATCH 0512/1368] changes from review feedback --- interface/lib/plugins/mail_user_filter_plugin.inc.php | 3 +-- security/ids.whitelist | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/interface/lib/plugins/mail_user_filter_plugin.inc.php b/interface/lib/plugins/mail_user_filter_plugin.inc.php index 45c32179f6..4f24042b30 100644 --- a/interface/lib/plugins/mail_user_filter_plugin.inc.php +++ b/interface/lib/plugins/mail_user_filter_plugin.inc.php @@ -139,8 +139,7 @@ class mail_user_filter_plugin { if($page_form->dataRecord["source"] == 'Header') { $parts = explode(':',trim($page_form->dataRecord["searchterm"])); - $page_form->dataRecord["source"] = trim($parts[0]); - unset($parts[0]); + $page_form->dataRecord["source"] = trim(array_shift($parts)); $page_form->dataRecord["searchterm"] = trim(implode(':',$parts)); unset($parts); } diff --git a/security/ids.whitelist b/security/ids.whitelist index ab7ee504a3..d9b0ba70b5 100644 --- a/security/ids.whitelist +++ b/security/ids.whitelist @@ -55,7 +55,6 @@ user:/login/index.php:POST.password user:/mail/mail_domain_edit.php:POST.dkim_private user:/mail/mail_domain_edit.php:POST.dkim_public user:/mail/mail_domain_edit.php:POST.dns_record -user:/sites/web_vhost_domain_edit.php:POST.fastcgi_php_version admin:/mail/mail_user_filter_edit.php:POST.searchterm user:/mail/mail_user_filter_edit.php:POST.searchterm admin:/mail/mail_user_edit.php:POST.custom_mailfilter -- GitLab From a28d7f1effcef3a2e2a05f25ff9060ed601cb7ff Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 1 Sep 2020 20:25:51 +0200 Subject: [PATCH 0513/1368] Fix #5719 --- install/tpl/apache_apps.vhost.master | 14 ++++++-------- server/conf/apache_apps.vhost.master | 14 ++++++-------- .../plugins-available/apps_vhost_plugin.inc.php | 15 +++++++++++++-- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index f65f47df90..8d6df71b7d 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -58,12 +58,6 @@ SSLStaplingReturnResponderErrors Off - - - SSLStaplingCache shmcb:/var/run/ocsp(128000) - - - RequestHeader unset Proxy early @@ -127,6 +121,10 @@ RewriteRule ^/rspamd/(.*) http://127.0.0.1:11334/$1 [P] {/tmpl_if} - - + + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master index f65f47df90..8d6df71b7d 100644 --- a/server/conf/apache_apps.vhost.master +++ b/server/conf/apache_apps.vhost.master @@ -58,12 +58,6 @@ SSLStaplingReturnResponderErrors Off - - - SSLStaplingCache shmcb:/var/run/ocsp(128000) - - - RequestHeader unset Proxy early @@ -127,6 +121,10 @@ RewriteRule ^/rspamd/(.*) http://127.0.0.1:11334/$1 [P] {/tmpl_if} - - + + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index 7fb5503802..58f39ea03a 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -106,7 +106,7 @@ class apps_vhost_plugin { $vhost_port_listen = '#'; } $tpl->setVar('vhost_port_listen', $vhost_port_listen); - + $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); if($mail_config['content_filter'] == 'rspamd'){ $use_rspamd = true; @@ -127,6 +127,17 @@ class apps_vhost_plugin { $content = str_replace('{apps_vhost_basedir}', $web_config['website_basedir'], $content); $content = str_replace('{vhost_port_listen}', $vhost_port_listen, $content); /* end of backwards compatibility section */ + /* Check if SSL should be enabled: */ + if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) { + $tpl->setVar('ssl_comment',''); + } else { + $tpl->setVar('ssl_comment','#'); + } + if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key') && is_file($install_dir.'/interface/ssl/ispserver.bundle')) { + $tpl->setVar('ssl_bundle_comment',''); + } else { + $tpl->setVar('ssl_bundle_comment','#'); + } $app->system->file_put_contents("$vhost_conf_dir/apps.vhost", $content); @@ -194,7 +205,7 @@ class apps_vhost_plugin { } $content = str_replace('{use_tcp}', $use_tcp, $content); $content = str_replace('{use_socket}', $use_socket, $content); - + $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); if($mail_config['content_filter'] == 'rspamd'){ $use_rspamd = ''; -- GitLab From e4e7ed27ad9df5f1b8a361ff37fab8501cfc82f7 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 1 Sep 2020 20:54:21 +0200 Subject: [PATCH 0514/1368] Use the correct path to search for the SSL cert (#5719) --- .../apps_vhost_plugin.inc.php | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index 58f39ea03a..a8797c62af 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -107,6 +107,18 @@ class apps_vhost_plugin { } $tpl->setVar('vhost_port_listen', $vhost_port_listen); + /* Check if SSL should be enabled: */ + if(is_file('/usr/local/ispconfig/interface/ssl/ispserver.crt') && is_file('/usr/local/ispconfig/interface/ssl/ispserver.key')) { + $tpl->setVar('ssl_comment',''); + } else { + $tpl->setVar('ssl_comment','#'); + } + if(is_file('/usr/local/ispconfig/interface/ssl/ispserver.crt') && is_file('/usr/local/ispconfig/interface/ssl/ispserver.key') && is_file('/usr/local/ispconfig/interface/ssl/ispserver.bundle')) { + $tpl->setVar('ssl_bundle_comment',''); + } else { + $tpl->setVar('ssl_bundle_comment','#'); + } + $mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail'); if($mail_config['content_filter'] == 'rspamd'){ $use_rspamd = true; @@ -127,17 +139,6 @@ class apps_vhost_plugin { $content = str_replace('{apps_vhost_basedir}', $web_config['website_basedir'], $content); $content = str_replace('{vhost_port_listen}', $vhost_port_listen, $content); /* end of backwards compatibility section */ - /* Check if SSL should be enabled: */ - if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) { - $tpl->setVar('ssl_comment',''); - } else { - $tpl->setVar('ssl_comment','#'); - } - if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key') && is_file($install_dir.'/interface/ssl/ispserver.bundle')) { - $tpl->setVar('ssl_bundle_comment',''); - } else { - $tpl->setVar('ssl_bundle_comment','#'); - } $app->system->file_put_contents("$vhost_conf_dir/apps.vhost", $content); -- GitLab From b74eaeeb2ea10f81547e5b55d1023086bd13486d Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 3 Sep 2020 09:29:14 +0200 Subject: [PATCH 0515/1368] Improved #5718 --- server/conf/nginx_vhost.conf.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index c7e36de39e..e00a892fec 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -34,7 +34,7 @@ server { server_name ; root ; - disable_symlinks if_not_owner; + disable_symlinks if_not_owner from=$document_root; -- GitLab From 2747ab0906b03760ce73abed28bef87e2ba3a3cd Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 3 Sep 2020 11:04:41 +0200 Subject: [PATCH 0516/1368] Move all settings outside of the vhost to .conf (!1125) --- install/tpl/apache_apps.vhost.master | 6 ------ install/tpl/apache_ispconfig.conf.master | 25 ++++++++++++++++++++++ install/tpl/apache_ispconfig.vhost.master | 26 ----------------------- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 8d6df71b7d..b07bb03f41 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -122,9 +122,3 @@ {/tmpl_if} - - - - SSLStaplingCache shmcb:/var/run/ocsp(128000) - - diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master index ff744741ff..688283f50e 100644 --- a/install/tpl/apache_ispconfig.conf.master +++ b/install/tpl/apache_ispconfig.conf.master @@ -146,3 +146,28 @@ NameVirtualHost *:443 NameVirtualHost {tmpl_var name="ip_address"}:{tmpl_var name="port"} + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + + + + AllowOverride None + + Require all denied + + Order Deny,Allow + Deny from all + + + + + AllowOverride None + + Require all denied + + Order Deny,Allow + Deny from all + + diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index f90876170b..cc177f5c48 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -111,29 +111,3 @@ NameVirtualHost *: SSLStaplingReturnResponderErrors Off - - - - SSLStaplingCache shmcb:/var/run/ocsp(128000) - - - - - AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - - - - - AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - - -- GitLab From b1b6e6062b515c3e8d83933b2da07db6a3e0eca9 Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 3 Sep 2020 15:36:12 +0200 Subject: [PATCH 0517/1368] Remove ISPConfig monitor app code (#3844) --- install/tpl/system.ini.master | 1 - .../web/admin/lib/lang/ar_system_config.lng | 1 - .../web/admin/lib/lang/bg_system_config.lng | 1 - .../web/admin/lib/lang/br_system_config.lng | 1 - .../web/admin/lib/lang/ca_system_config.lng | 1 - .../web/admin/lib/lang/cz_system_config.lng | 1 - .../web/admin/lib/lang/de_system_config.lng | 1 - .../web/admin/lib/lang/dk_system_config.lng | 1 - .../web/admin/lib/lang/el_system_config.lng | 1 - .../web/admin/lib/lang/es_system_config.lng | 1 - .../web/admin/lib/lang/fi_system_config.lng | 1 - .../web/admin/lib/lang/fr_system_config.lng | 1 - .../web/admin/lib/lang/hr_system_config.lng | 1 - .../web/admin/lib/lang/hu_system_config.lng | 1 - .../web/admin/lib/lang/id_system_config.lng | 1 - .../web/admin/lib/lang/it_system_config.lng | 1 - .../web/admin/lib/lang/ja_system_config.lng | 1 - .../web/admin/lib/lang/nl_system_config.lng | 1 - .../web/admin/lib/lang/pl_system_config.lng | 1 - .../web/admin/lib/lang/pt_system_config.lng | 1 - .../web/admin/lib/lang/ro_system_config.lng | 1 - .../web/admin/lib/lang/ru_system_config.lng | 1 - .../web/admin/lib/lang/se_system_config.lng | 1 - .../web/admin/lib/lang/sk_system_config.lng | 1 - .../web/admin/lib/lang/tr_system_config.lng | 1 - interface/web/remote/monitor.php | 64 ------------------- 26 files changed, 89 deletions(-) delete mode 100644 interface/web/remote/monitor.php diff --git a/install/tpl/system.ini.master b/install/tpl/system.ini.master index ec6573d7b1..c42966a01c 100644 --- a/install/tpl/system.ini.master +++ b/install/tpl/system.ini.master @@ -52,7 +52,6 @@ custom_login_link= dashboard_atom_url_admin=https://www.ispconfig.org/atom dashboard_atom_url_reseller=https://www.ispconfig.org/atom dashboard_atom_url_client=https://www.ispconfig.org/atom -monitor_key= tab_change_discard=n tab_change_warning=n use_loadindicator=y diff --git a/interface/web/admin/lib/lang/ar_system_config.lng b/interface/web/admin/lib/lang/ar_system_config.lng index 495da61225..6715b22bfc 100644 --- a/interface/web/admin/lib/lang/ar_system_config.lng +++ b/interface/web/admin/lib/lang/ar_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/bg_system_config.lng b/interface/web/admin/lib/lang/bg_system_config.lng index 25ad5d2cc5..5511eb4a5a 100644 --- a/interface/web/admin/lib/lang/bg_system_config.lng +++ b/interface/web/admin/lib/lang/bg_system_config.lng @@ -19,7 +19,6 @@ $wb['new_domain_txt'] = 'HTML to create a new domain'; $wb['webdavuser_prefix_txt'] = 'Webdav user prefix'; $wb['webdavuser_prefix_error_regex'] = 'Неразрешени символи в името на webdav префикса.'; $wb['webftp_url_txt'] = 'WebFTP URL'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['dashboard_atom_url_admin_txt'] = 'Dashboard atom feed URL (admin)'; $wb['dashboard_atom_url_reseller_txt'] = 'Dashboard atom feed URL (reseller)'; $wb['dashboard_atom_url_client_txt'] = 'Dashboard atom feed URL (client)'; diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng index a680265116..a3748d5c44 100644 --- a/interface/web/admin/lib/lang/br_system_config.lng +++ b/interface/web/admin/lib/lang/br_system_config.lng @@ -38,7 +38,6 @@ $wb['use_domain_module_hint'] = 'Se você usar este módulo, os clientes podem s $wb['new_domain_txt'] = 'Código HTML para criar um novo domínio'; $wb['webftp_url_txt'] = 'URL do FTPweb'; $wb['admin_mail_txt'] = 'Administrador(es) de e-mails'; -$wb['monitor_key_txt'] = 'Palavras reservadas a monitorar'; $wb['admin_name_txt'] = 'Nome do administrador'; $wb['maintenance_mode_txt'] = 'Modo manutenção'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/ca_system_config.lng b/interface/web/admin/lib/lang/ca_system_config.lng index f40012120f..81c2241c59 100644 --- a/interface/web/admin/lib/lang/ca_system_config.lng +++ b/interface/web/admin/lib/lang/ca_system_config.lng @@ -38,7 +38,6 @@ $wb['use_domain_module_hint'] = 'If you use the domain limits, your customers ca $wb['new_domain_txt'] = 'HTML to create a new domain'; $wb['webftp_url_txt'] = 'WebFTP URL'; $wb['admin_mail_txt'] = 'Administrator\'s e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrator\'s name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/cz_system_config.lng b/interface/web/admin/lib/lang/cz_system_config.lng index b7a7515403..45ddabf38d 100644 --- a/interface/web/admin/lib/lang/cz_system_config.lng +++ b/interface/web/admin/lib/lang/cz_system_config.lng @@ -28,7 +28,6 @@ $wb['admin_name_txt'] = 'Jméno Administrátora'; $wb['enable_custom_login_txt'] = 'Povolit vlastní přihlašovací jméno u e-mailové schránky'; $wb['mailmailinglist_link_txt'] = 'Ikonový odkaz na aplikaci E-mailových konferencí seznamu e-mailových konferencí'; $wb['mailmailinglist_url_txt'] = 'E-mailové konference URL'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['maintenance_mode_txt'] = 'Režim údržby'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; $wb['maintenance_mode_exclude_ips_error_isip'] = 'One or more invalid IP addresses in maintenance mode exclude list. Must be a list of comma-separated IPv4 and/or IPv6 addresses.'; diff --git a/interface/web/admin/lib/lang/de_system_config.lng b/interface/web/admin/lib/lang/de_system_config.lng index 58575617ad..082c6fb3a1 100644 --- a/interface/web/admin/lib/lang/de_system_config.lng +++ b/interface/web/admin/lib/lang/de_system_config.lng @@ -35,7 +35,6 @@ $wb['enable_custom_login_txt'] = 'Abweichenden Login Namen erlauben'; $wb['mailmailinglist_link_txt'] = 'Link zur Mailingliste in der Mailinglisten Übersicht'; $wb['mailmailinglist_url_txt'] = 'Mailinglisten URL'; $wb['admin_mail_txt'] = 'Administrator E-Mail'; -$wb['monitor_key_txt'] = 'ISPConfig Monitor App Passwort'; $wb['admin_name_txt'] = 'Name des Administrators'; $wb['maintenance_mode_txt'] = 'Wartungsmodus'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/dk_system_config.lng b/interface/web/admin/lib/lang/dk_system_config.lng index 6801b566c9..ed6837aaf0 100644 --- a/interface/web/admin/lib/lang/dk_system_config.lng +++ b/interface/web/admin/lib/lang/dk_system_config.lng @@ -33,7 +33,6 @@ $wb['use_domain_module_hint'] = 'Hvis du bruger domæne grænser, kan dine kunde $wb['new_domain_txt'] = 'HTML for at oprette et nyt domæne'; $wb['webftp_url_txt'] = 'WebFTP URL'; $wb['admin_mail_txt'] = 'Administratorer e-mail'; -$wb['monitor_key_txt'] = 'Monitor nøgleord'; $wb['admin_name_txt'] = 'Administratorer navn'; $wb['maintenance_mode_txt'] = 'Vedligeholdelsestilstand'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/el_system_config.lng b/interface/web/admin/lib/lang/el_system_config.lng index f324e335b3..54f8c49712 100644 --- a/interface/web/admin/lib/lang/el_system_config.lng +++ b/interface/web/admin/lib/lang/el_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Αποδοχή προσαρμοσμένου $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'URL της Mailing list '; $wb['admin_mail_txt'] = 'e-mail Διαχειριστών'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Όνομα Administrator'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/es_system_config.lng b/interface/web/admin/lib/lang/es_system_config.lng index 4eeaa9abe9..fce27f40a3 100644 --- a/interface/web/admin/lib/lang/es_system_config.lng +++ b/interface/web/admin/lib/lang/es_system_config.lng @@ -45,7 +45,6 @@ $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; $wb['maintenance_mode_exclude_ips_error_isip'] = 'One or more invalid IP addresses in maintenance mode exclude list. Must be a list of comma-separated IPv4 and/or IPv6 addresses.'; $wb['min_password_length_txt'] = 'Longitud mínima de la contraseña'; $wb['min_password_strength_txt'] = 'Fortaleza mínima de la contraseña'; -$wb['monitor_key_txt'] = 'Palabra clave del Monitor'; $wb['new_domain_txt'] = 'HTML para la creación de nuevos dominios'; $wb['No'] = 'No'; $wb['phpmyadmin_url_error_regex'] = 'URL inválida a phpMyAdmin'; diff --git a/interface/web/admin/lib/lang/fi_system_config.lng b/interface/web/admin/lib/lang/fi_system_config.lng index 831eee9ff6..fbf2f67db1 100644 --- a/interface/web/admin/lib/lang/fi_system_config.lng +++ b/interface/web/admin/lib/lang/fi_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/fr_system_config.lng b/interface/web/admin/lib/lang/fr_system_config.lng index a5270b879f..56d1b239f5 100644 --- a/interface/web/admin/lib/lang/fr_system_config.lng +++ b/interface/web/admin/lib/lang/fr_system_config.lng @@ -27,7 +27,6 @@ $wb['use_domain_module_hint'] = 'Si vous utilisez ce module, vos utilisateurs pe $wb['new_domain_txt'] = 'HTML pour créer un nouveau domaine'; $wb['webftp_url_txt'] = 'URL du WebFTP'; $wb['admin_mail_txt'] = 'E-mail de l’administrateur'; -$wb['monitor_key_txt'] = 'Mot-clé du moniteur'; $wb['admin_name_txt'] = 'Nom des administrateurs'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/hr_system_config.lng b/interface/web/admin/lib/lang/hr_system_config.lng index 220ca7e90c..cd39670674 100644 --- a/interface/web/admin/lib/lang/hr_system_config.lng +++ b/interface/web/admin/lib/lang/hr_system_config.lng @@ -20,7 +20,6 @@ $wb['use_domain_module_txt'] = 'Koristi modul Domene za dodavanje novih domena'; $wb['use_domain_module_hint'] = 'Ukoliko koristite ovaj modul, vaši klijenti mogu izabrati samo domenu koju im je admin kreirao. Klijenti ne mogu slobodno mijenjati postavke domene. Morate se ponovno logirati nakon mijenjanja ove postavke da bi promjene bile vidljive.'; $wb['new_domain_txt'] = 'HTML za kreiranje nove domene'; $wb['webftp_url_txt'] = 'WebFTP URL'; -$wb['monitor_key_txt'] = 'Monitoriranje riječi'; $wb['dashboard_atom_url_admin_txt'] = 'RSS URL za početnu stranicu (admin)'; $wb['dashboard_atom_url_reseller_txt'] = 'RSS URL za početnu stranicu (reseller)'; $wb['dashboard_atom_url_client_txt'] = 'RSS URL za početnu stranicu (client)'; diff --git a/interface/web/admin/lib/lang/hu_system_config.lng b/interface/web/admin/lib/lang/hu_system_config.lng index 0069f31c07..c5484c67d1 100644 --- a/interface/web/admin/lib/lang/hu_system_config.lng +++ b/interface/web/admin/lib/lang/hu_system_config.lng @@ -28,7 +28,6 @@ $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; $wb['admin_name_txt'] = 'Administrators name'; $wb['enable_custom_login_txt'] = 'Allow custom login name'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; $wb['maintenance_mode_exclude_ips_error_isip'] = 'One or more invalid IP addresses in maintenance mode exclude list. Must be a list of comma-separated IPv4 and/or IPv6 addresses.'; diff --git a/interface/web/admin/lib/lang/id_system_config.lng b/interface/web/admin/lib/lang/id_system_config.lng index 539699da88..b0808f8835 100644 --- a/interface/web/admin/lib/lang/id_system_config.lng +++ b/interface/web/admin/lib/lang/id_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index 0c20959df2..98be8b9a0b 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -20,7 +20,6 @@ $wb['new_domain_txt'] = 'HTML to create a new domain'; $wb['webdavuser_prefix_txt'] = 'Webdav user prefix'; $wb['webdavuser_prefix_error_regex'] = 'Char not allowed in webdav user prefix.'; $wb['webftp_url_txt'] = 'WebFTP URL'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['dashboard_atom_url_admin_txt'] = 'Dashboard atom feed URL (admin)'; $wb['dashboard_atom_url_reseller_txt'] = 'Dashboard atom feed URL (reseller)'; $wb['dashboard_atom_url_client_txt'] = 'Dashboard atom feed URL (client)'; diff --git a/interface/web/admin/lib/lang/ja_system_config.lng b/interface/web/admin/lib/lang/ja_system_config.lng index f6b5c9e1a5..c629f7cf92 100644 --- a/interface/web/admin/lib/lang/ja_system_config.lng +++ b/interface/web/admin/lib/lang/ja_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/nl_system_config.lng b/interface/web/admin/lib/lang/nl_system_config.lng index 19eae464a3..88dce5ac51 100644 --- a/interface/web/admin/lib/lang/nl_system_config.lng +++ b/interface/web/admin/lib/lang/nl_system_config.lng @@ -30,7 +30,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/pl_system_config.lng b/interface/web/admin/lib/lang/pl_system_config.lng index f44853ccb2..184991d794 100644 --- a/interface/web/admin/lib/lang/pl_system_config.lng +++ b/interface/web/admin/lib/lang/pl_system_config.lng @@ -26,7 +26,6 @@ $wb['enable_custom_login_txt'] = 'Zezwalaj na dowolną nazwę loginu'; $wb['mailmailinglist_link_txt'] = 'Link do listy mailingowej na liście list mailingowych'; $wb['mailmailinglist_url_txt'] = 'URL listy mailingowej'; $wb['admin_mail_txt'] = 'E-Mail administratora'; -$wb['monitor_key_txt'] = 'Klucz monitora'; $wb['admin_name_txt'] = 'Nazwa administratora'; $wb['system_config_desc_txt'] = ''; $wb['smtp_missing_admin_mail_txt'] = 'Podaj nazwę administratora oraz adres email jeżeli chcesz użyć wysyłanie maili przez SMTP.'; diff --git a/interface/web/admin/lib/lang/pt_system_config.lng b/interface/web/admin/lib/lang/pt_system_config.lng index bbfedbf3a4..31b3163807 100644 --- a/interface/web/admin/lib/lang/pt_system_config.lng +++ b/interface/web/admin/lib/lang/pt_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/ro_system_config.lng b/interface/web/admin/lib/lang/ro_system_config.lng index a7756c737d..d6f6c6e683 100644 --- a/interface/web/admin/lib/lang/ro_system_config.lng +++ b/interface/web/admin/lib/lang/ro_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/ru_system_config.lng b/interface/web/admin/lib/lang/ru_system_config.lng index 37d9c263ab..4505ca2089 100644 --- a/interface/web/admin/lib/lang/ru_system_config.lng +++ b/interface/web/admin/lib/lang/ru_system_config.lng @@ -20,7 +20,6 @@ $wb['new_domain_txt'] = 'HTML текст, чтобы создать новый $wb['webdavuser_prefix_txt'] = 'Префикс пользователя WebDAV'; $wb['webdavuser_prefix_error_regex'] = 'Некорректный символ в префиксе пользователя WebDAV.'; $wb['webftp_url_txt'] = 'URL WebFTP'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['dashboard_atom_url_admin_txt'] = 'Dashboard atom feed URL (admin)'; $wb['dashboard_atom_url_reseller_txt'] = 'Dashboard atom feed URL (reseller)'; $wb['dashboard_atom_url_client_txt'] = 'Dashboard atom feed URL (client)'; diff --git a/interface/web/admin/lib/lang/se_system_config.lng b/interface/web/admin/lib/lang/se_system_config.lng index 6768bc4118..3d29084a09 100644 --- a/interface/web/admin/lib/lang/se_system_config.lng +++ b/interface/web/admin/lib/lang/se_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Tillåt valfritt inloggningsnamn'; $wb['mailmailinglist_link_txt'] = 'Länka till epostlista i listan över epostlistor'; $wb['mailmailinglist_url_txt'] = 'Adress till epostlista'; $wb['admin_mail_txt'] = 'Administratörens epostadress'; -$wb['monitor_key_txt'] = 'Bevakning nyckelord'; $wb['admin_name_txt'] = 'Administratörens namn'; $wb['maintenance_mode_txt'] = 'Underhållsläge'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/sk_system_config.lng b/interface/web/admin/lib/lang/sk_system_config.lng index 85a96bf5bf..54edd2de4a 100644 --- a/interface/web/admin/lib/lang/sk_system_config.lng +++ b/interface/web/admin/lib/lang/sk_system_config.lng @@ -27,7 +27,6 @@ $wb['enable_custom_login_txt'] = 'Allow custom login name'; $wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; $wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['monitor_key_txt'] = 'Monitor keyword'; $wb['admin_name_txt'] = 'Administrators name'; $wb['maintenance_mode_txt'] = 'Maintenance Mode'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/admin/lib/lang/tr_system_config.lng b/interface/web/admin/lib/lang/tr_system_config.lng index b4cb7c8d11..ad9c01bc58 100644 --- a/interface/web/admin/lib/lang/tr_system_config.lng +++ b/interface/web/admin/lib/lang/tr_system_config.lng @@ -38,7 +38,6 @@ $wb['use_domain_module_hint'] = 'Bu modül kullanıldığında, müşteriler yal $wb['new_domain_txt'] = 'Yeni etki alanı oluşturma HTML kodu'; $wb['webftp_url_txt'] = 'WebFTP Adresi'; $wb['admin_mail_txt'] = 'Yönetici E-posta Adresi'; -$wb['monitor_key_txt'] = 'İzlenecek Kelime'; $wb['admin_name_txt'] = 'Yönetici Adı'; $wb['maintenance_mode_txt'] = 'Bakım Kipi'; $wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; diff --git a/interface/web/remote/monitor.php b/interface/web/remote/monitor.php deleted file mode 100644 index 914a09382e..0000000000 --- a/interface/web/remote/monitor.php +++ /dev/null @@ -1,64 +0,0 @@ -error('This function is disabled in demo mode.'); - -header('Content-Type: application/json; charset=utf-8'); -header('Access-Control-Allow-Origin: *'); -header('Access-Control-Allow-Headers: X-Requested-With'); -header('Cache-Control: no-cache, must-revalidate'); // HTTP/1.1 -header('Expires: Sat, 26 Jul 1997 05:00:00 GMT'); // Date in the past - -$type = addslashes($_GET['type']); -$token = addslashes($_GET['token']); -$server_id = $app->functions->intval($_GET['server']); - -$app->uses('getconf'); -$interface_config = $app->getconf->get_global_config('misc'); -$secret = $interface_config['monitor_key']; - -$out = array(); - -if($token == '' or $secret == '' or $token != $secret) { - $out['state'] = 'syserror'; - $out['data'] = 'Password empty or incorrect.'; - $out['time'] = date('Y-m-d H:i'); -} else { - if($type == 'serverlist') { - $sql = 'SELECT server_id, server_name FROM server WHERE 1 ORDER BY server_id'; - $records = $app->db->queryAllRecords($sql); - foreach($records as $index => $rec) { - $rec = $app->db->queryOneRecord("SELECT * FROM monitor_data WHERE server_id = ? AND state NOT IN ('ok', 'no_state', 'info')", $rec['server_id']); - if($rec) $records[$index]['state'] = 'warn'; - else $records[$index]['state'] = 'ok'; - } - $out['state'] = 'ok'; - $out['data'] = $records; - $out['time'] = date('Y-m-d H:i', $rec['created']); - } else { - $rec = $app->db->queryOneRecord("SELECT * FROM monitor_data WHERE type = ? AND server_id = ?", $type, $server_id); - if(is_array($rec)) { - $out['state'] = $rec['state']; - $out['data'] = unserialize(stripslashes($rec['data'])); - if(is_array($out['data']) && sizeof($out['data']) > 0){ - foreach($out['data'] as $key => $val){ - if(!$val) $out['data'][$key] = " "; - } - } - $out['time'] = date('Y-m-d H:i', $rec['created']); - } else { - $out['state'] = 'syserror'; - $out['data'] = 'No monitor record found.'; - $out['time'] = date('Y-m-d H:i'); - } - $sql = 'SELECT server_id, server_name FROM server WHERE 1 ORDER BY server_id'; - $records = $app->db->queryAllRecords($sql); - $out['serverlist'] = $records; - } -} -$out['type'] = $type; -echo json_encode($out); -exit; -?> -- GitLab From c65fdb2a67f1ec1259c8307a3306a441e2884a63 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 3 Sep 2020 17:18:47 +0200 Subject: [PATCH 0518/1368] Improvement for #5635 --- interface/web/client/form/client.tform.php | 2 ++ interface/web/client/form/client_template.tform.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index c6e0a93dc0..523507b108 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -1445,6 +1445,7 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', + 'valuelimit' => 'client:limit_cron_type', 'value' => array('full' => 'Full Cron', 'chrooted' => 'Chrooted Cron', 'url' => 'URL Cron') ), 'limit_cron_frequency' => array ( @@ -1498,6 +1499,7 @@ $form["tabs"]['limits'] = array ( 'keyfield'=> 'template_id', 'valuefield'=> 'template_name' ), + 'valuelimit' => 'client:limit_openvz_vm_template_id', 'value' => array(0 => ' ') ), 'limit_aps' => array ( diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php index 6dcd4a6738..4a3405bbe5 100644 --- a/interface/web/client/form/client_template.tform.php +++ b/interface/web/client/form/client_template.tform.php @@ -849,6 +849,7 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', + 'valuelimit' => 'client:limit_cron_type', 'value' => array('full' => 'Full Cron', 'chrooted' => 'Chrooted Cron', 'url' => 'URL Cron') ), 'limit_cron_frequency' => array ( @@ -902,6 +903,7 @@ $form["tabs"]['limits'] = array ( 'keyfield'=> 'template_id', 'valuefield'=> 'template_name' ), + 'valuelimit' => 'client:limit_openvz_vm_template_id', 'value' => array(0 => ' ') ), 'limit_aps' => array ( -- GitLab From 89aab77789674b771acc52449ec314322e28f32b Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 3 Sep 2020 18:16:41 +0200 Subject: [PATCH 0519/1368] Change update note --- server/scripts/ispconfig_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php index 95652ce747..ab9ab1a9b0 100644 --- a/server/scripts/ispconfig_update.php +++ b/server/scripts/ispconfig_update.php @@ -86,7 +86,7 @@ echo " _____ ___________ _____ __ _ |___/ "; echo "\n".str_repeat('-', 80)."\n"; echo "\n\n>> Update \n\n"; -echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Update all slave servers, before you update master server.\n\n"; +echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Enable maintenance mode and update your master server first. Then update all slave servers, and disable maintenance mode when all servers are updated.\n\n"; $method = simple_query('Select update method', array('stable', 'git-stable', 'git-master'), 'stable'); -- GitLab From aa39c6aaa1a1a2b3fc5012427c044ade651ce5f5 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 18 Aug 2020 10:10:33 -0600 Subject: [PATCH 0520/1368] forward mail_user.cc in postfix --- install/tpl/mysql-virtual_email2email.cf.master | 4 +--- install/tpl/mysql-virtual_mailboxes.cf.master | 2 +- server/conf/sieve_filter.master | 7 ------- .../plugins-available/maildeliver_plugin.inc.php | 11 ----------- server/plugins-available/maildrop_plugin.inc.php | 15 ++------------- 5 files changed, 4 insertions(+), 35 deletions(-) diff --git a/install/tpl/mysql-virtual_email2email.cf.master b/install/tpl/mysql-virtual_email2email.cf.master index 17e1cdf0bf..1dc8ba1321 100644 --- a/install/tpl/mysql-virtual_email2email.cf.master +++ b/install/tpl/mysql-virtual_email2email.cf.master @@ -2,6 +2,4 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT email FROM mail_user WHERE email = '%s' AND postfix = 'y' AND disabledeliver = 'n' AND server_id = {server_id} - UNION - SELECT cc AS email FROM mail_user WHERE email = '%s' AND postfix = 'y' AND disabledeliver = 'y' AND server_id = {server_id} +query = SELECT cc AS email FROM mail_user WHERE cc != '' AND email = '%s' AND postfix = 'y' AND disabledeliver = 'y' AND server_id = {server_id} diff --git a/install/tpl/mysql-virtual_mailboxes.cf.master b/install/tpl/mysql-virtual_mailboxes.cf.master index 97825f9ffc..281bedb07b 100644 --- a/install/tpl/mysql-virtual_mailboxes.cf.master +++ b/install/tpl/mysql-virtual_mailboxes.cf.master @@ -2,4 +2,4 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') from mail_user where login = '%s' and postfix = 'y' and server_id = {server_id} +query = select CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') from mail_user where login = '%s' and postfix = 'y' and disabledeliver = 'n' and server_id = {server_id} diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index b5dedebf29..75459cd57b 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -14,13 +14,6 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", } - -# Send a copy of email to - -redirect ""; - - -
    diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 130d0a7f18..4465cf2090 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -92,7 +92,6 @@ class maildeliver_plugin { or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"] - or $data["old"]["cc"] != $data["new"]["cc"] ) { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); @@ -120,16 +119,6 @@ class maildeliver_plugin { $tpl = new tpl(); $tpl->newTemplate("sieve_filter.master"); - // cc Field - $tmp_mails_arr = explode(',',$data["new"]["cc"]); - $tmp_addresses_arr = array(); - foreach($tmp_mails_arr as $address) { - if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address)); - } - - $tpl->setVar('cc', $data["new"]["cc"]); - $tpl->setLoop('ccloop', $tmp_addresses_arr); - // Custom filters if($data["new"]["custom_mailfilter"] == 'NULL') $data["new"]["custom_mailfilter"] = ''; $tpl->setVar('custom_mailfilter', str_replace("\r\n","\n",$data["new"]["custom_mailfilter"])); diff --git a/server/plugins-available/maildrop_plugin.inc.php b/server/plugins-available/maildrop_plugin.inc.php index 00777a1662..3c0bd3af94 100644 --- a/server/plugins-available/maildrop_plugin.inc.php +++ b/server/plugins-available/maildrop_plugin.inc.php @@ -175,13 +175,11 @@ class maildrop_plugin { // Write the custom mailfilter script, if mailfilter recipe has changed if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] - or $data["old"]["move_junk"] != $data["new"]["move_junk"] - or $data["old"]["cc"] != $data["new"]["cc"]) { + or $data["old"]["move_junk"] != $data["new"]["move_junk"]) { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); if(trim($data["new"]["custom_mailfilter"]) != '' - or $data["new"]["move_junk"] != 'n' - or $data["new"]["cc"] != '') { + or $data["new"]["move_junk"] != 'n') { // Delete the old filter recipe $email_parts = explode("@", $data["old"]["email"]); @@ -198,15 +196,6 @@ class maildrop_plugin { $mailfilter_content = ''; - if($data["new"]["cc"] != '') { - $tmp_mails_arr = explode(',',$data["new"]["cc"]); - foreach($tmp_mails_arr as $address) { - if(trim($address) != '') $mailfilter_content .= "cc \"!".trim($address)."\"\n"; - } - //$mailfilter_content .= "cc \"!".$data["new"]["cc"]."\"\n"; - $app->log("Added CC address ".$data["new"]["cc"].' to mailfilter file.', LOGLEVEL_DEBUG); - } - if($data["new"]["move_junk"] != 'n') { if(file_exists($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')) { $mailfilter_content .= file_get_contents($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')."\n"; -- GitLab From 66aab00b0ad85121dd61a17bdc1c6827ffd3bf4e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 18 Aug 2020 15:27:08 -0600 Subject: [PATCH 0521/1368] add mailbox option to forward in lda vs postfix --- .../sql/incremental/upd_dev_collection.sql | 4 ++++ install/sql/ispconfig3.sql | 1 + .../tpl/mysql-virtual_email2email.cf.master | 2 +- interface/web/mail/form/mail_user.tform.php | 6 ++++++ interface/web/mail/lib/lang/ar_mail_user.lng | 2 ++ interface/web/mail/lib/lang/bg_mail_user.lng | 2 ++ interface/web/mail/lib/lang/br_mail_user.lng | 4 +++- interface/web/mail/lib/lang/ca_mail_user.lng | 2 ++ interface/web/mail/lib/lang/cz_mail_user.lng | 2 ++ interface/web/mail/lib/lang/de_mail_user.lng | 2 ++ interface/web/mail/lib/lang/dk_mail_user.lng | 2 ++ interface/web/mail/lib/lang/el_mail_user.lng | 2 ++ interface/web/mail/lib/lang/en_mail_user.lng | 4 +++- interface/web/mail/lib/lang/es_mail_user.lng | 4 +++- interface/web/mail/lib/lang/fi_mail_user.lng | 2 ++ interface/web/mail/lib/lang/fr_mail_user.lng | 2 ++ interface/web/mail/lib/lang/hr_mail_user.lng | 2 ++ interface/web/mail/lib/lang/hu_mail_user.lng | 2 ++ interface/web/mail/lib/lang/id_mail_user.lng | 2 ++ interface/web/mail/lib/lang/it_mail_user.lng | 2 ++ interface/web/mail/lib/lang/ja_mail_user.lng | 2 ++ interface/web/mail/lib/lang/nl_mail_user.lng | 2 ++ interface/web/mail/lib/lang/pl_mail_user.lng | 2 ++ interface/web/mail/lib/lang/pt_mail_user.lng | 2 ++ interface/web/mail/lib/lang/ro_mail_user.lng | 2 ++ interface/web/mail/lib/lang/ru_mail_user.lng | 2 ++ interface/web/mail/lib/lang/se_mail_user.lng | 2 ++ interface/web/mail/lib/lang/sk_mail_user.lng | 2 ++ interface/web/mail/lib/lang/tr_mail_user.lng | 4 +++- .../mail/templates/mail_user_mailbox_edit.htm | 6 ++++++ .../web/mailuser/form/mail_user_cc.tform.php | 8 ++++++- .../web/mailuser/lib/lang/ar_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/bg_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/br_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/ca_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/cz_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/de_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/dk_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/el_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/en_mail_user_cc.lng | 4 +++- .../web/mailuser/lib/lang/es_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/fi_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/fr_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/hr_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/hu_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/id_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/it_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/ja_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/nl_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/pl_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/pt_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/ro_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/ru_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/se_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/sk_mail_user_cc.lng | 2 ++ .../web/mailuser/lib/lang/tr_mail_user_cc.lng | 2 ++ .../mailuser/templates/mail_user_cc_edit.htm | 21 ++++++++++++------- server/conf/sieve_filter.master | 7 +++++++ .../maildeliver_plugin.inc.php | 14 +++++++++++++ .../plugins-available/maildrop_plugin.inc.php | 17 +++++++++++++-- 60 files changed, 179 insertions(+), 17 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index f6bd9982f7..eafda9c55f 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -76,3 +76,7 @@ ALTER TABLE `dns_soa` CHANGE `dnssec_algo` `dnssec_algo` SET('NSEC3RSASHA1','ECD ALTER TABLE `client_template` CHANGE `ssh_chroot` `ssh_chroot` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; ALTER TABLE `client_template` CHANGE `web_php_options` `web_php_options` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +-- add option to forward in lda, default to forward in mta except for existing forwards +ALTER TABLE `mail_user` ADD `forward_in_lda` enum('n','y') NOT NULL default 'n' AFTER `cc`; +UPDATE `mail_user` set `forward_in_lda` = 'y' where `cc` != ''; + diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 095a2d37de..5ab6671e2a 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1041,6 +1041,7 @@ CREATE TABLE `mail_user` ( `maildir_format` varchar(255) NOT NULL default 'maildir', `quota` bigint(20) NOT NULL default '-1', `cc` text NOT NULL default '', + `forward_in_lda` enum('n','y') NOT NULL default 'n', `sender_cc` varchar(255) NOT NULL default '', `homedir` varchar(255) NOT NULL default '', `autoresponder` enum('n','y') NOT NULL default 'n', diff --git a/install/tpl/mysql-virtual_email2email.cf.master b/install/tpl/mysql-virtual_email2email.cf.master index 1dc8ba1321..87553d5f9d 100644 --- a/install/tpl/mysql-virtual_email2email.cf.master +++ b/install/tpl/mysql-virtual_email2email.cf.master @@ -2,4 +2,4 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = SELECT cc AS email FROM mail_user WHERE cc != '' AND email = '%s' AND postfix = 'y' AND disabledeliver = 'y' AND server_id = {server_id} +query = SELECT cc AS email FROM mail_user WHERE email = '%s' AND cc != '' AND (forward_in_lda = 'n' OR disabledeliver = 'y') AND postfix = 'y' AND server_id = {server_id} diff --git a/interface/web/mail/form/mail_user.tform.php b/interface/web/mail/form/mail_user.tform.php index 67330f4658..85e310648b 100644 --- a/interface/web/mail/form/mail_user.tform.php +++ b/interface/web/mail/form/mail_user.tform.php @@ -189,6 +189,12 @@ $form["tabs"]['mailuser'] = array( 'width' => '30', 'maxlength' => '65535' ), + 'forward_in_lda' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'sender_cc' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', diff --git a/interface/web/mail/lib/lang/ar_mail_user.lng b/interface/web/mail/lib/lang/ar_mail_user.lng index 829de6a749..88b89d0fb4 100644 --- a/interface/web/mail/lib/lang/ar_mail_user.lng +++ b/interface/web/mail/lib/lang/ar_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/bg_mail_user.lng b/interface/web/mail/lib/lang/bg_mail_user.lng index 126ec603d2..bee86d8d31 100644 --- a/interface/web/mail/lib/lang/bg_mail_user.lng +++ b/interface/web/mail/lib/lang/bg_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(По желание)'; $wb['autoresponder_active'] = 'Разреши автоматичен отговор'; $wb['cc_txt'] = 'Изпрати копие до:'; $wb['cc_error_isemail'] = 'Полето с Изпрати копие до: не съдържа валиден емайл адрес'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Домейн'; $wb['now_txt'] = 'Сега'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/br_mail_user.lng b/interface/web/mail/lib/lang/br_mail_user.lng index 8e3edd6950..8d72534d6b 100644 --- a/interface/web/mail/lib/lang/br_mail_user.lng +++ b/interface/web/mail/lib/lang/br_mail_user.lng @@ -46,8 +46,10 @@ $wb['name_txt'] = 'Nome'; $wb['name_optional_txt'] = '(Opcional)'; $wb['autoresponder_active'] = 'Habilitar auto-resposta'; $wb['cc_txt'] = 'Enviar cópia para'; -$wb['sender_cc_txt'] = 'Enviar cópia oculta (BCC) para'; $wb['cc_error_isemail'] = 'O campo "Enviar cópia para" contém um endereço de e-mail inválido.'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; +$wb['sender_cc_txt'] = 'Enviar cópia oculta (BCC) para'; $wb['sender_cc_error_isemail'] = 'O campo "Enviar cópia oculta para" contém um endereço de e-mail inválido.'; $wb['domain_txt'] = 'Domínio'; $wb['now_txt'] = 'Agora'; diff --git a/interface/web/mail/lib/lang/ca_mail_user.lng b/interface/web/mail/lib/lang/ca_mail_user.lng index 7fd4263e97..a0afb01ee3 100644 --- a/interface/web/mail/lib/lang/ca_mail_user.lng +++ b/interface/web/mail/lib/lang/ca_mail_user.lng @@ -39,6 +39,8 @@ $wb['name_optional_txt'] = '(Optionnel)'; $wb['autoresponder_active'] = 'Activer le répondeur automatique'; $wb['cc_txt'] = 'Envoyer une copie à'; $wb['cc_error_isemail'] = 'Le champ Envoyer une copie ne contient pas une adresse courriel valide'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domaine'; $wb['now_txt'] = 'Maintenant'; $wb['login_error_unique'] = 'Ce nom d\'utilisateur est déjà pris.'; diff --git a/interface/web/mail/lib/lang/cz_mail_user.lng b/interface/web/mail/lib/lang/cz_mail_user.lng index 835f2918c1..0b5f73080c 100644 --- a/interface/web/mail/lib/lang/cz_mail_user.lng +++ b/interface/web/mail/lib/lang/cz_mail_user.lng @@ -39,6 +39,8 @@ $wb['name_optional_txt'] = '(volitelné)'; $wb['autoresponder_active'] = 'Povolit automatický odpovídač'; $wb['cc_txt'] = 'Odeslat příchozí kopii na'; $wb['cc_error_isemail'] = 'Adresa uvedená v poli zaslat kopii na je neplatná'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Doména'; $wb['now_txt'] = 'Nyní'; $wb['login_error_unique'] = 'Přihlášovací jméno je již obsazeno.'; diff --git a/interface/web/mail/lib/lang/de_mail_user.lng b/interface/web/mail/lib/lang/de_mail_user.lng index dbbf54d150..c99abe8e8d 100644 --- a/interface/web/mail/lib/lang/de_mail_user.lng +++ b/interface/web/mail/lib/lang/de_mail_user.lng @@ -46,6 +46,8 @@ $wb['name_optional_txt'] = '(optional)'; $wb['autoresponder_active'] = 'Autoresponder aktivieren'; $wb['cc_txt'] = 'Eingehende Mails in Kopie senden an'; $wb['cc_error_isemail'] = 'Das Feld "Kopie senden an" enthält keine gültige E-Mail Adresse'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['login_error_unique'] = 'Benutzername wird bereits verwendet.'; $wb['login_error_regex'] = 'Zulässige Zeichen sind A-Z, a-z, 0-9, ., _ und -.'; $wb['login_txt'] = 'Anmelden'; diff --git a/interface/web/mail/lib/lang/dk_mail_user.lng b/interface/web/mail/lib/lang/dk_mail_user.lng index 04196d6b29..36487cd836 100644 --- a/interface/web/mail/lib/lang/dk_mail_user.lng +++ b/interface/web/mail/lib/lang/dk_mail_user.lng @@ -45,6 +45,8 @@ $wb['name_optional_txt'] = '(Valgfri)'; $wb['autoresponder_active'] = 'Aktiver autosvarer'; $wb['cc_txt'] = 'Send kopi til'; $wb['cc_error_isemail'] = '-Send kopi til- felt indeholder ikke en gyldig e-mail adresse'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domæne'; $wb['now_txt'] = 'Nu'; $wb['login_error_unique'] = 'Log ind er allerede taget.'; diff --git a/interface/web/mail/lib/lang/el_mail_user.lng b/interface/web/mail/lib/lang/el_mail_user.lng index b273f6b814..9c53de9fe3 100644 --- a/interface/web/mail/lib/lang/el_mail_user.lng +++ b/interface/web/mail/lib/lang/el_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(Προαιρετικό)'; $wb['autoresponder_active'] = 'Ενεργοποίηση αυτόματης απάντησης'; $wb['cc_txt'] = 'Αποστολή αντιγράφου σε '; $wb['cc_error_isemail'] = 'Προς'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Τώρα'; $wb['login_error_unique'] = 'Το όνομα χρησιμοποιείται ήδη'; diff --git a/interface/web/mail/lib/lang/en_mail_user.lng b/interface/web/mail/lib/lang/en_mail_user.lng index ed6b6e3bd3..ead8a2a033 100644 --- a/interface/web/mail/lib/lang/en_mail_user.lng +++ b/interface/web/mail/lib/lang/en_mail_user.lng @@ -46,8 +46,10 @@ $wb["name_txt"] = 'Name'; $wb["name_optional_txt"] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; -$wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['cc_error_isemail'] = 'The -Send copy to- field does not contain a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; +$wb['sender_cc_txt'] = 'Send outgoing BCC to'; $wb['sender_cc_error_isemail'] = 'The -Send outgoing copy to- field does not contain a valid email address'; $wb['domain_txt'] = 'Domain'; $wb['now_txt']='Now'; diff --git a/interface/web/mail/lib/lang/es_mail_user.lng b/interface/web/mail/lib/lang/es_mail_user.lng index 6757df0854..00f9074c1c 100644 --- a/interface/web/mail/lib/lang/es_mail_user.lng +++ b/interface/web/mail/lib/lang/es_mail_user.lng @@ -12,9 +12,11 @@ $wb['autoresponder_text_txt'] = 'Texto'; $wb['autoresponder_txt'] = 'Habilitado'; $wb['backup_copies_txt'] = 'Número de copias de seguridad'; $wb['backup_interval_txt'] = 'Intervalo de copias de seguridad'; -$wb['cc_error_isemail'] = 'El campo -Enviar copia a- no contiene una dirección de correo válida.'; $wb['cc_note_txt'] = '(Separe múltiples cuentas de correo con comas)'; $wb['cc_txt'] = 'Enviar copia a'; +$wb['cc_error_isemail'] = 'El campo -Enviar copia a- no contiene una dirección de correo válida.'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['cryptpwd_txt'] = 'Contraseña'; $wb['custom_mailfilter_txt'] = 'Filtro de correo personalizado'; $wb['daily_backup_txt'] = 'Diariamente'; diff --git a/interface/web/mail/lib/lang/fi_mail_user.lng b/interface/web/mail/lib/lang/fi_mail_user.lng index ed3635c1ae..6f06d655c4 100644 --- a/interface/web/mail/lib/lang/fi_mail_user.lng +++ b/interface/web/mail/lib/lang/fi_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(Valinnainen)'; $wb['autoresponder_active'] = 'Ota lomavastaaja käyttöön'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/fr_mail_user.lng b/interface/web/mail/lib/lang/fr_mail_user.lng index cce8f0a8a1..8c5cb44fbd 100644 --- a/interface/web/mail/lib/lang/fr_mail_user.lng +++ b/interface/web/mail/lib/lang/fr_mail_user.lng @@ -39,6 +39,8 @@ $wb['name_optional_txt'] = '(Optionnel)'; $wb['autoresponder_active'] = 'Activer le répondeur automatique'; $wb['cc_txt'] = 'Envoyer une copie à'; $wb['cc_error_isemail'] = 'Le champ Envoyer une copie ne contient pas une adresse e-mail valide'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domaine'; $wb['now_txt'] = 'Maintenant'; $wb['login_error_unique'] = 'Ce nom d’utilisateur est déjà pris.'; diff --git a/interface/web/mail/lib/lang/hr_mail_user.lng b/interface/web/mail/lib/lang/hr_mail_user.lng index 0cb1b91849..0a7feb9c38 100644 --- a/interface/web/mail/lib/lang/hr_mail_user.lng +++ b/interface/web/mail/lib/lang/hr_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The -Send copy to- field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domena'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/hu_mail_user.lng b/interface/web/mail/lib/lang/hu_mail_user.lng index 610f40b4ba..09a0d7a8de 100644 --- a/interface/web/mail/lib/lang/hu_mail_user.lng +++ b/interface/web/mail/lib/lang/hu_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Opcionális)'; $wb['autoresponder_active'] = 'Automatikus válasz engedélyezése'; $wb['cc_txt'] = 'Másolat küldése'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/id_mail_user.lng b/interface/web/mail/lib/lang/id_mail_user.lng index e4daf311f3..9abd07d28b 100644 --- a/interface/web/mail/lib/lang/id_mail_user.lng +++ b/interface/web/mail/lib/lang/id_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Opsional)'; $wb['autoresponder_active'] = 'Aktifkan Penjawab Otomatis'; $wb['cc_txt'] = 'Kirim salinan ke'; $wb['cc_error_isemail'] = 'Kolom Kirim salinan ke tidak berisi alamat email yang valid'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index 34b523f551..0b38c32fcb 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(Opzionale)'; $wb['autoresponder_active'] = 'Abilita autorisponditore'; $wb['cc_txt'] = 'Trasmetti copia a'; $wb['cc_error_isemail'] = 'Il campo trasmetti copia a non contiene un indirizzo email valido'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Dominio'; $wb['now_txt'] = 'Ora'; $wb['login_error_unique'] = 'Questo Login è già occupato.'; diff --git a/interface/web/mail/lib/lang/ja_mail_user.lng b/interface/web/mail/lib/lang/ja_mail_user.lng index 7b6b48dca4..bb89671d9c 100644 --- a/interface/web/mail/lib/lang/ja_mail_user.lng +++ b/interface/web/mail/lib/lang/ja_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/nl_mail_user.lng b/interface/web/mail/lib/lang/nl_mail_user.lng index 83002f79aa..9e35762618 100644 --- a/interface/web/mail/lib/lang/nl_mail_user.lng +++ b/interface/web/mail/lib/lang/nl_mail_user.lng @@ -40,6 +40,8 @@ $wb['name_optional_txt'] = '(Optioneel)'; $wb['autoresponder_active'] = 'Inschakelen autobeantwoorden'; $wb['cc_txt'] = 'Stuur kopie naar'; $wb['cc_error_isemail'] = 'Het \\"Stuur kopie naar\\" veld bevat geen geldig e-mail adres'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Nu'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/pl_mail_user.lng b/interface/web/mail/lib/lang/pl_mail_user.lng index 15ddeca66f..44462af34c 100644 --- a/interface/web/mail/lib/lang/pl_mail_user.lng +++ b/interface/web/mail/lib/lang/pl_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Opcjonalnie)'; $wb['autoresponder_active'] = 'Uruchom autorespondera'; $wb['cc_txt'] = 'Wyślij kopię do'; $wb['cc_error_isemail'] = 'Pole wysyłania kopii nie zawiera poprawnego adresu e-mail'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domena'; $wb['now_txt'] = 'Teraz'; $wb['login_error_unique'] = 'Login jest już w użyciu.'; diff --git a/interface/web/mail/lib/lang/pt_mail_user.lng b/interface/web/mail/lib/lang/pt_mail_user.lng index 9f6227e268..e197f448c6 100644 --- a/interface/web/mail/lib/lang/pt_mail_user.lng +++ b/interface/web/mail/lib/lang/pt_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/ro_mail_user.lng b/interface/web/mail/lib/lang/ro_mail_user.lng index b358960525..85167e6b7c 100644 --- a/interface/web/mail/lib/lang/ro_mail_user.lng +++ b/interface/web/mail/lib/lang/ro_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/ru_mail_user.lng b/interface/web/mail/lib/lang/ru_mail_user.lng index a6f8a9fb7e..4fb2147ddb 100644 --- a/interface/web/mail/lib/lang/ru_mail_user.lng +++ b/interface/web/mail/lib/lang/ru_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Опционально)'; $wb['autoresponder_active'] = 'Включить автоответчик'; $wb['cc_txt'] = 'Отправить копию'; $wb['cc_error_isemail'] = 'Поле -Отправить копию- не содержит действительный адрес электронной почты'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Домен'; $wb['now_txt'] = 'Сейчас'; $wb['login_error_unique'] = 'Логин уже занят.'; diff --git a/interface/web/mail/lib/lang/se_mail_user.lng b/interface/web/mail/lib/lang/se_mail_user.lng index f528bb3ef4..270d3de346 100644 --- a/interface/web/mail/lib/lang/se_mail_user.lng +++ b/interface/web/mail/lib/lang/se_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Frivilligt)'; $wb['autoresponder_active'] = 'Aktivera autosvaret'; $wb['cc_txt'] = 'Skicka kopia till'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domän'; $wb['now_txt'] = 'Nu'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/sk_mail_user.lng b/interface/web/mail/lib/lang/sk_mail_user.lng index 207be53947..d12e8abe02 100644 --- a/interface/web/mail/lib/lang/sk_mail_user.lng +++ b/interface/web/mail/lib/lang/sk_mail_user.lng @@ -41,6 +41,8 @@ $wb['name_optional_txt'] = '(Optional)'; $wb['autoresponder_active'] = 'Enable the autoresponder'; $wb['cc_txt'] = 'Send copy to'; $wb['cc_error_isemail'] = 'The Send copy to field does not conatin a valid email address'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; $wb['domain_txt'] = 'Domain'; $wb['now_txt'] = 'Now'; $wb['login_error_unique'] = 'Login is already taken.'; diff --git a/interface/web/mail/lib/lang/tr_mail_user.lng b/interface/web/mail/lib/lang/tr_mail_user.lng index 203338047a..3ea2afe6ca 100644 --- a/interface/web/mail/lib/lang/tr_mail_user.lng +++ b/interface/web/mail/lib/lang/tr_mail_user.lng @@ -46,8 +46,10 @@ $wb['name_txt'] = 'Ad'; $wb['name_optional_txt'] = '(İsteğe bağlı)'; $wb['autoresponder_active'] = 'Otoyanıtlayıcı kullanılsın'; $wb['cc_txt'] = 'Kopyası şuraya gönderilsin'; -$wb['sender_cc_txt'] = 'Gidenin Gizli Kopyası Şuraya Gönderilsin'; $wb['cc_error_isemail'] = 'Kopyası şuraya gönderilsin alanına geçerli bir e-posta adresi yazılmalı'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; +$wb['sender_cc_txt'] = 'Gidenin Gizli Kopyası Şuraya Gönderilsin'; $wb['sender_cc_error_isemail'] = 'Gidenin gizli kopyası şuraya gönderilsin alanındaki e-posta adresi geçersiz'; $wb['domain_txt'] = 'Etki Alanı'; $wb['now_txt'] = 'Şimdi'; diff --git a/interface/web/mail/templates/mail_user_mailbox_edit.htm b/interface/web/mail/templates/mail_user_mailbox_edit.htm index c53bc85292..f41851963b 100644 --- a/interface/web/mail/templates/mail_user_mailbox_edit.htm +++ b/interface/web/mail/templates/mail_user_mailbox_edit.htm @@ -54,6 +54,12 @@
      {tmpl_var name='name_optional_txt'} {tmpl_var name='cc_note_txt'}
    +
    + + +
      {tmpl_var name='name_optional_txt'} {tmpl_var name='sender_cc_note_txt'} diff --git a/interface/web/mailuser/form/mail_user_cc.tform.php b/interface/web/mailuser/form/mail_user_cc.tform.php index 5f5e13a9d8..fb26892584 100644 --- a/interface/web/mailuser/form/mail_user_cc.tform.php +++ b/interface/web/mailuser/form/mail_user_cc.tform.php @@ -76,7 +76,13 @@ $form["tabs"]['mailuser'] = array ( 'default' => '', 'value' => '', 'width' => '30', - 'maxlength' => '255' + 'maxlength' => '65535' + ), + 'forward_in_lda' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') ), //################################# // END Datatable fields diff --git a/interface/web/mailuser/lib/lang/ar_mail_user_cc.lng b/interface/web/mailuser/lib/lang/ar_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/ar_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/ar_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/bg_mail_user_cc.lng b/interface/web/mailuser/lib/lang/bg_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/bg_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/bg_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/br_mail_user_cc.lng b/interface/web/mailuser/lib/lang/br_mail_user_cc.lng index 7a1e9a3d95..8008ed2618 100644 --- a/interface/web/mailuser/lib/lang/br_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/br_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Endereço de e-mail inválido no campo "Enviar cópia $wb['email_is_cc_error'] = 'Endereço de e-mail e "Enviar cópia para" não podem ser os mesmos.'; $wb['name_optional_txt'] = '(Opcional)'; $wb['cc_note_txt'] = '(separar múltiplos endereços de e-mail com vírgulas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/ca_mail_user_cc.lng b/interface/web/mailuser/lib/lang/ca_mail_user_cc.lng index 90cc6622de..15c4c34307 100644 --- a/interface/web/mailuser/lib/lang/ca_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/ca_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Courriel invalide dans le champ - copie conforme -'; $wb['email_is_cc_error'] = 'Coipe conforme invalide.'; $wb['name_optional_txt'] = '(Optionnel)'; $wb['cc_note_txt'] = '(Séparer chaque adresses par une virgule)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/cz_mail_user_cc.lng b/interface/web/mailuser/lib/lang/cz_mail_user_cc.lng index 57ecd90b9a..1f94bd024d 100644 --- a/interface/web/mailuser/lib/lang/cz_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/cz_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Vyplněná e-mailová adresa neplatná'; $wb['email_is_cc_error'] = 'Vyplněná e-mailová adresa a poslat kopii na e-mail adresu, nemůžou být stejné.'; $wb['name_optional_txt'] = '(Volitelné)'; $wb['cc_note_txt'] = '(Při posílání kopií na více e-mailových adres, oddělte čárkami.)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/de_mail_user_cc.lng b/interface/web/mailuser/lib/lang/de_mail_user_cc.lng index e43d39c169..6810752d4d 100644 --- a/interface/web/mailuser/lib/lang/de_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/de_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'E-Mail Adresse ungültig im -Kopie senden an- Feld'; $wb['email_is_cc_error'] = 'E-Mail Adresse und '; $wb['name_optional_txt'] = '(optional)'; $wb['cc_note_txt'] = '(Mehrere E-Mail-Adressen mit Kommas trennen)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/dk_mail_user_cc.lng b/interface/web/mailuser/lib/lang/dk_mail_user_cc.lng index 8fafd94e5a..70052fdaeb 100644 --- a/interface/web/mailuser/lib/lang/dk_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/dk_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'E-mail adresse ugyldig i -Send kopi til- feltet'; $wb['email_is_cc_error'] = 'E-mail adresse og send kopi til adressen kan ikke være det samme.'; $wb['name_optional_txt'] = '(Valgfri)'; $wb['cc_note_txt'] = '(Adskil flere e-mail adresser med kommaer)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/el_mail_user_cc.lng b/interface/web/mailuser/lib/lang/el_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/el_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/el_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/en_mail_user_cc.lng b/interface/web/mailuser/lib/lang/en_mail_user_cc.lng index 3437d50d19..b9c1a20cac 100644 --- a/interface/web/mailuser/lib/lang/en_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/en_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb["cc_error_isemail"] = 'Email address invalid in -Send copy to- field'; $wb["email_is_cc_error"] = 'Email address and send copy to address can not be the same.'; $wb["name_optional_txt"] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; -?> \ No newline at end of file +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; +?> diff --git a/interface/web/mailuser/lib/lang/es_mail_user_cc.lng b/interface/web/mailuser/lib/lang/es_mail_user_cc.lng index aef29a0cdb..5b1c05a2aa 100644 --- a/interface/web/mailuser/lib/lang/es_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/es_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['email_is_cc_error'] = 'La dirección de correo y enviar copia a, no pueden $wb['email_txt'] = 'Correo'; $wb['mailbox_cc_txt'] = 'Enviar copia a direcciones de correo'; $wb['name_optional_txt'] = '(Opcional)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/fi_mail_user_cc.lng b/interface/web/mailuser/lib/lang/fi_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/fi_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/fi_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/fr_mail_user_cc.lng b/interface/web/mailuser/lib/lang/fr_mail_user_cc.lng index d29dacd830..a0139d0fec 100644 --- a/interface/web/mailuser/lib/lang/fr_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/fr_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Adresse e-mail invalide dans le champ - Envoyer une $wb['email_is_cc_error'] = 'L’adresse e-mail principale et l’addresse de copie ne peuvent pas être identiques.'; $wb['name_optional_txt'] = '(Optionel)'; $wb['cc_note_txt'] = '(Séparer les addresses e-mail multiples avec une virgule)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/hr_mail_user_cc.lng b/interface/web/mailuser/lib/lang/hr_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/hr_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/hr_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/hu_mail_user_cc.lng b/interface/web/mailuser/lib/lang/hu_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/hu_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/hu_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/id_mail_user_cc.lng b/interface/web/mailuser/lib/lang/id_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/id_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/id_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/it_mail_user_cc.lng b/interface/web/mailuser/lib/lang/it_mail_user_cc.lng index 01f22f5fc8..6ed79429fb 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/ja_mail_user_cc.lng b/interface/web/mailuser/lib/lang/ja_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/ja_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/ja_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/nl_mail_user_cc.lng b/interface/web/mailuser/lib/lang/nl_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/nl_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/nl_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/pl_mail_user_cc.lng b/interface/web/mailuser/lib/lang/pl_mail_user_cc.lng index b9a63d8d08..1ec4648925 100644 --- a/interface/web/mailuser/lib/lang/pl_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/pl_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Adres e-mail jest niepoprawny w polu -Wyślij kopię $wb['email_is_cc_error'] = 'Adres e-mail i adres do wysyłki kopii nie mogą być takie same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/pt_mail_user_cc.lng b/interface/web/mailuser/lib/lang/pt_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/pt_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/pt_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/ro_mail_user_cc.lng b/interface/web/mailuser/lib/lang/ro_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/ro_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/ro_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/ru_mail_user_cc.lng b/interface/web/mailuser/lib/lang/ru_mail_user_cc.lng index 7987b0106b..f551318c0b 100644 --- a/interface/web/mailuser/lib/lang/ru_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/ru_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Поле -Отправить копию- не сод $wb['email_is_cc_error'] = 'Адрес электронной почты и адрес для отправки копии не могут быть одинаковыми.'; $wb['name_optional_txt'] = '(Опционально)'; $wb['cc_note_txt'] = '(Разделите несколько адресов электронной почты запятыми)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/se_mail_user_cc.lng b/interface/web/mailuser/lib/lang/se_mail_user_cc.lng index b01ae1b1ab..4894ee856c 100644 --- a/interface/web/mailuser/lib/lang/se_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/se_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Epostadressen i -Skicka kopia till-fältet är ogilt $wb['email_is_cc_error'] = 'Epostadress och -Skicka kopia till- kan inte vara samma adress.'; $wb['name_optional_txt'] = '(Frivilligt)'; $wb['cc_note_txt'] = '(Separera flera epostadresser med kommatecken)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/sk_mail_user_cc.lng b/interface/web/mailuser/lib/lang/sk_mail_user_cc.lng index 81877884cc..4e7ef766e7 100644 --- a/interface/web/mailuser/lib/lang/sk_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/sk_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = 'Email address invalid in -Send copy to- field'; $wb['email_is_cc_error'] = 'Email address and send copy to address can not be the same.'; $wb['name_optional_txt'] = '(Optional)'; $wb['cc_note_txt'] = '(Separate multiple email addresses with commas)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/lib/lang/tr_mail_user_cc.lng b/interface/web/mailuser/lib/lang/tr_mail_user_cc.lng index 039ed70625..978779767c 100644 --- a/interface/web/mailuser/lib/lang/tr_mail_user_cc.lng +++ b/interface/web/mailuser/lib/lang/tr_mail_user_cc.lng @@ -6,4 +6,6 @@ $wb['cc_error_isemail'] = '-Şuraya kopya gönder- e-posta adresi geçersiz'; $wb['email_is_cc_error'] = 'E-posta adresi ile kopyanın gönderileceği adres aynı olamaz.'; $wb['name_optional_txt'] = '(İsteğe bağlı)'; $wb['cc_note_txt'] = '(Birden çok e-posta adresini virgül ile ayırarak yazın)'; +$wb['forward_in_lda_txt'] = 'Copy during delivery'; +$wb['tooltip_forward_in_lda_txt'] = 'Controls if mail copy is forwarded before or during delivery to mailbox.'; ?> diff --git a/interface/web/mailuser/templates/mail_user_cc_edit.htm b/interface/web/mailuser/templates/mail_user_cc_edit.htm index 914f74ae3f..7bf44e4cad 100644 --- a/interface/web/mailuser/templates/mail_user_cc_edit.htm +++ b/interface/web/mailuser/templates/mail_user_cc_edit.htm @@ -1,12 +1,17 @@ -
    - -
    {tmpl_var name='email'}
    +
    + +
    {tmpl_var name='email'}
    +
    +
    + +
      {tmpl_var name='name_optional_txt'} {tmpl_var name='cc_note_txt'} +
    +
    + + -
    - -
      {tmpl_var name='name_optional_txt'} {tmpl_var name='cc_note_txt'} -
    - +
    diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index 75459cd57b..b5dedebf29 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -14,6 +14,13 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", } + +# Send a copy of email to + +redirect ""; + + + diff --git a/server/plugins-available/maildeliver_plugin.inc.php b/server/plugins-available/maildeliver_plugin.inc.php index 4465cf2090..168063c1a2 100644 --- a/server/plugins-available/maildeliver_plugin.inc.php +++ b/server/plugins-available/maildeliver_plugin.inc.php @@ -92,6 +92,8 @@ class maildeliver_plugin { or (isset($data["new"]["email"]) and $data["old"]["email"] != $data["new"]["email"]) or $data["old"]["autoresponder_start_date"] != $data["new"]["autoresponder_start_date"] or $data["old"]["autoresponder_end_date"] != $data["new"]["autoresponder_end_date"] + or $data["old"]["cc"] != $data["new"]["cc"] + or $data["old"]["forward_in_lda"] != $data["new"]["forward_in_lda"] ) { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); @@ -119,6 +121,18 @@ class maildeliver_plugin { $tpl = new tpl(); $tpl->newTemplate("sieve_filter.master"); + // cc Field + if ($data["new"]["forward_in_lda"] == 'y' && $data["new"]["cc"] != '') { + $tmp_mails_arr = explode(',',$data["new"]["cc"]); + $tmp_addresses_arr = array(); + foreach($tmp_mails_arr as $address) { + if(trim($address) != '') $tmp_addresses_arr[] = array('address' => trim($address)); + } + + $tpl->setVar('cc', $data["new"]["cc"]); + $tpl->setLoop('ccloop', $tmp_addresses_arr); + } + // Custom filters if($data["new"]["custom_mailfilter"] == 'NULL') $data["new"]["custom_mailfilter"] = ''; $tpl->setVar('custom_mailfilter', str_replace("\r\n","\n",$data["new"]["custom_mailfilter"])); diff --git a/server/plugins-available/maildrop_plugin.inc.php b/server/plugins-available/maildrop_plugin.inc.php index 3c0bd3af94..e1b559b367 100644 --- a/server/plugins-available/maildrop_plugin.inc.php +++ b/server/plugins-available/maildrop_plugin.inc.php @@ -175,11 +175,15 @@ class maildrop_plugin { // Write the custom mailfilter script, if mailfilter recipe has changed if($data["old"]["custom_mailfilter"] != $data["new"]["custom_mailfilter"] - or $data["old"]["move_junk"] != $data["new"]["move_junk"]) { + or $data["old"]["move_junk"] != $data["new"]["move_junk"] + or $data["old"]["cc"] != $data["new"]["cc"] + or $data["old"]["forward_in_lda"] != $data["new"]["forward_in_lda"] + ) { $app->log("Mailfilter config has been changed", LOGLEVEL_DEBUG); if(trim($data["new"]["custom_mailfilter"]) != '' - or $data["new"]["move_junk"] != 'n') { + or $data["new"]["move_junk"] != 'n' + or $data["new"]["cc"] != '') { // Delete the old filter recipe $email_parts = explode("@", $data["old"]["email"]); @@ -196,6 +200,15 @@ class maildrop_plugin { $mailfilter_content = ''; + if ($data["new"]["forward_in_lda"] == 'y' && $data["new"]["cc"] != '') { + $tmp_mails_arr = explode(',',$data["new"]["cc"]); + foreach($tmp_mails_arr as $address) { + if(trim($address) != '') $mailfilter_content .= "cc \"!".trim($address)."\"\n"; + } + //$mailfilter_content .= "cc \"!".$data["new"]["cc"]."\"\n"; + $app->log("Added CC address ".$data["new"]["cc"].' to mailfilter file.', LOGLEVEL_DEBUG); + } + if($data["new"]["move_junk"] != 'n') { if(file_exists($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')) { $mailfilter_content .= file_get_contents($conf["rootpath"].'/conf-custom/mailfilter_move_junk.master')."\n"; -- GitLab From 552847e72510d06cf149b08c4e0117db3e441b4c Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 4 Sep 2020 11:50:00 +0200 Subject: [PATCH 0522/1368] implement system->move --- server/lib/classes/system.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index ba86d1f115..d2a2989012 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -934,6 +934,10 @@ class system{ return copy($file1, $file2); } + function move($file1, $file2) { + return rename($file1, $file2); + } + function touch($file, $allow_symlink = false){ global $app; if($allow_symlink == false && @file_exists($file) && $this->checkpath($file) == false) { -- GitLab From 5089e794550d5b261469a4f5f5cf20b1bfdde23c Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 4 Sep 2020 11:55:26 +0200 Subject: [PATCH 0523/1368] move the statistics files instead of copying them --- server/lib/classes/cron.d/150-goaccess.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 7bdbbeb03b..10e33d462c 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -172,7 +172,7 @@ class cronjob_goaccess extends cronjob { $files = scandir($statsdir); foreach ($files as $file) { - if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->move("$statsdir"."/"."$file", "$statsdirold"."$file"); } } -- GitLab From 57e3cd69199e8d42565164691d43fbb8e343ef6b Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 4 Sep 2020 12:01:16 +0200 Subject: [PATCH 0524/1368] use copy and unlink instead of rename. Might be universally the better option for all environments (i.e. NFS) --- server/lib/classes/system.inc.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index d2a2989012..0ed2ddf0f2 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -935,7 +935,10 @@ class system{ } function move($file1, $file2) { - return rename($file1, $file2); + return copy($file1, $file2); + if(file_exists($file1) || is_link($file1)) { + return unlink($file1); + } } function touch($file, $allow_symlink = false){ -- GitLab From 7a830e4978107119516fbbad43584535b5c7f824 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 4 Sep 2020 13:12:31 +0200 Subject: [PATCH 0525/1368] updated move code --- server/lib/classes/system.inc.php | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 0ed2ddf0f2..a8bed7b3b1 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -935,10 +935,18 @@ class system{ } function move($file1, $file2) { - return copy($file1, $file2); if(file_exists($file1) || is_link($file1)) { - return unlink($file1); - } + return copy($file1, $file2); + if(file_exists($file2) || is_link($file2)) { + return unlink($file1); + } else { + $app->log("move failed: couldn't move file/link " .$file1." to ".$file2, LOGLEVEL_DEBUG); + return false; + } + } else { + $app->log("move failed: " .$file1." doesn't exist.", LOGLEVEL_DEBUG); + return false; + } } function touch($file, $allow_symlink = false){ -- GitLab From 115ac27b3b4805849781311de44b33d7e162d357 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 4 Sep 2020 13:27:29 +0200 Subject: [PATCH 0526/1368] reworked move code --- server/lib/classes/system.inc.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index a8bed7b3b1..4b712670aa 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -936,15 +936,14 @@ class system{ function move($file1, $file2) { if(file_exists($file1) || is_link($file1)) { - return copy($file1, $file2); - if(file_exists($file2) || is_link($file2)) { + if(copy($file1, $file2)) { return unlink($file1); } else { $app->log("move failed: couldn't move file/link " .$file1." to ".$file2, LOGLEVEL_DEBUG); return false; } } else { - $app->log("move failed: " .$file1." doesn't exist.", LOGLEVEL_DEBUG); + $app->log("move failed: source " .$file1." doesn't exist.", LOGLEVEL_DEBUG); return false; } } -- GitLab From b2805e9df0c4afae1b6373b60ef17d3fe05ec3e0 Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Fri, 4 Sep 2020 15:36:51 +0200 Subject: [PATCH 0527/1368] Check CAA-Records with LE --- server/lib/classes/letsencrypt.inc.php | 37 +++++++++++++++++++++----- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 3ce63b48b4..5a4217d697 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -30,7 +30,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. class letsencrypt { - /** + /** * Construct for this class * * @return system @@ -373,13 +373,38 @@ class letsencrypt { if((isset($web_config['skip_le_check']) && $web_config['skip_le_check'] == 'y') || (isset($server_config['migration_mode']) && $server_config['migration_mode'] == 'y')) { $le_domains[] = $temp_domain; } else { - $le_hash_check = trim(@file_get_contents('http://' . $temp_domain . '/.well-known/acme-challenge/' . $le_rnd_file)); - if($le_hash_check == $le_rnd_hash) { - $le_domains[] = $temp_domain; - $app->log("Verified domain " . $temp_domain . " should be reachable for letsencrypt.", LOGLEVEL_DEBUG); + //check caa-record + $caa_check = false; + $caa_domain = $temp_domain; + $count = substr_count($caa_domain, '.'); + if($count === 2) { + if(strlen(explode('.', $caa_domain)[1]) > 3) { + $caa_domain = explode('.', $caa_domain, 2)[1]; + } + } else if($count > 2) { + $caa_domain = get_domain(explode('.', $caa_domain, 2)[1]); + } + $caa_records = @dns_get_record($caa_domain, DNS_CAA); // requieres PHP 7.0.16, 7.1.2 + if(is_array($caa_records) && !empty($caa_records)) { + foreach ($records as $record) { + if($record['value'] == 'letsencrypt.org') $caa_check = true; + } + } else { + $caa_check = true; + } + + if($caa_check === true) { + $le_hash_check = trim(@file_get_contents('http://' . $temp_domain . '/.well-known/acme-challenge/' . $le_rnd_file)); + if($le_hash_check == $le_rnd_hash) { + $le_domains[] = $temp_domain; + $app->log("Verified domain " . $temp_domain . " should be reachable for letsencrypt.", LOGLEVEL_DEBUG); + } else { + $app->log("Could not verify domain " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN); + } } else { - $app->log("Could not verify domain " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN); + $app->log("Incomplete CAA-Records for " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN); } + } } $temp_domains = $le_domains; -- GitLab From 12a21d4f576bce812e30d1eb495b49b3c8e4faf8 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Mon, 7 Sep 2020 11:44:04 +0200 Subject: [PATCH 0528/1368] commit current code --- server/lib/classes/system.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 4b712670aa..2c73a9198e 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -935,15 +935,15 @@ class system{ } function move($file1, $file2) { - if(file_exists($file1) || is_link($file1)) { + if(file_exists($file1) || is_link($file1) && is_dir(realpath(dirname($file2)))) { if(copy($file1, $file2)) { return unlink($file1); } else { - $app->log("move failed: couldn't move file/link " .$file1." to ".$file2, LOGLEVEL_DEBUG); + $app->log("move failed: couldn't move file/link " .$file1. " to " .$file2, LOGLEVEL_DEBUG); return false; } } else { - $app->log("move failed: source " .$file1." doesn't exist.", LOGLEVEL_DEBUG); + $app->log("move failed: source " .$file1. " doesn't exist.", LOGLEVEL_DEBUG); return false; } } -- GitLab From 8182d8ab00f1386ee5e388d1ffa4bb89c1982831 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 7 Sep 2020 16:44:51 +0200 Subject: [PATCH 0529/1368] #5418 Add suport for MySQL 8 --- install/lib/installer_base.lib.php | 36 ++++++-- install/lib/mysql.lib.php | 35 ++++++++ .../sql/incremental/upd_dev_collection.sql | 4 +- install/sql/ispconfig3.sql | 4 +- interface/lib/classes/db_mysql.inc.php | 70 ++++++++++++++++ interface/lib/classes/tform_base.inc.php | 6 +- server/lib/classes/db_mysql.inc.php | 69 ++++++++++++++++ .../mysql_clientdb_plugin.inc.php | 82 ++++++++++++++++--- 8 files changed, 278 insertions(+), 28 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 11163806ab..b1a7796d01 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -235,17 +235,26 @@ class installer_base { public function configure_database() { global $conf; - //* check sql-mode - /*$check_sql_mode = $this->db->queryOneRecord("SELECT @@sql_mode"); + //** Check for unwanted plugins + if ($this->db->getDatabaseType() == 'mysql' && $this->db->getDatabaseVersion(true) >= 8) { + // component approach since MySQL 8.0 + $unwanted_components = [ + 'file://component_validate_password', + ]; + $sql_components = $this->db->queryAllRecords("SELECT * FROM mysql.component where component_urn IN ?", $unwanted_components); + if(is_array($sql_components) && !empty($sql_components)) { + foreach ($sql_components as $component) { + $component_name = parse_url($component['component_urn'], PHP_URL_HOST); + echo "Login in to MySQL and disable '{$component_name}' with:\n\n UNINSTALL COMPONENT '{$component['component_urn']}';\n\n"; + } + die(); + } - if ($check_sql_mode['@@sql_mode'] != '' && $check_sql_mode['@@sql_mode'] != 'NO_ENGINE_SUBSTITUTION') { - echo "Wrong SQL-mode. You should use NO_ENGINE_SUBSTITUTION. Add\n\n"; - echo " sql-mode=\"NO_ENGINE_SUBSTITUTION\"\n\n"; - echo"to the mysqld-section in your mysql-config on this server and restart mysqld afterwards\n"; - die(); - }*/ + $unwanted_sql_plugins = ['']; + } else { + $unwanted_sql_plugins = array('validate_password'); + } - $unwanted_sql_plugins = array('validate_password'); $sql_plugins = $this->db->queryAllRecords("SELECT plugin_name FROM information_schema.plugins WHERE plugin_status='ACTIVE' AND plugin_name IN ?", $unwanted_sql_plugins); if(is_array($sql_plugins) && !empty($sql_plugins)) { foreach ($sql_plugins as $plugin) echo "Login in to MySQL and disable $plugin[plugin_name] with:\n\n UNINSTALL PLUGIN $plugin[plugin_name];"; @@ -308,6 +317,15 @@ class installer_base { if(!$this->db->query($query, $conf['mysql']['database'] . ".*", $conf['mysql']['ispconfig_user'], $from_host)) { $this->error('Unable to grant databse permissions to user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage); } + + // add correct administrative rights to IPSConfig user (SUPER is deprecated and unnecessarily powerful) + if ($this->db->getDatabaseType() == 'mysql' && $this->db->getDatabaseVersion(true) >= 8) { + // there might be more needed on replicated db environments, this was not tested + $query = 'GRANT SYSTEM_VARIABLES_ADMIN ON *.* TO ?@?'; + if(!$this->db->query($query, $conf['mysql']['ispconfig_user'], $from_host)) { + $this->error('Unable to grant administrative permissions to user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage); + } + } //* Set the database name in the DB library $this->db->setDBName($conf['mysql']['database']); diff --git a/install/lib/mysql.lib.php b/install/lib/mysql.lib.php index c24a454d04..1085ed0d5b 100644 --- a/install/lib/mysql.lib.php +++ b/install/lib/mysql.lib.php @@ -761,6 +761,41 @@ class db break; } } + + /** + * Get the database type (mariadb or mysql) + * + * @access public + * @return string 'mariadb' or string 'mysql' + */ + + public function getDatabaseType() { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } + + /** + * Get the database version + * + * @access public + * @param bool $major_version_only = true will return the major version only, e.g. 8 for MySQL 8 + * @return string version number + */ + + public function getDatabaseVersion($major_version_only = false) { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } } diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index f6bd9982f7..2f3d7568e8 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -37,7 +37,7 @@ ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; -- change cc and sender_cc column type -ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; -- remove SPDY option ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; @@ -62,7 +62,7 @@ ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y'; -- Change id_rsa column to TEXT format -ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE `directive_snippets` ADD `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n' ; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 095a2d37de..90c39c03a7 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -253,7 +253,7 @@ CREATE TABLE `client` ( `canceled` enum('n','y') NOT NULL DEFAULT 'n', `can_use_api` enum('n','y') NOT NULL DEFAULT 'n', `tmp_data` mediumblob, - `id_rsa` text NOT NULL DEFAULT '', + `id_rsa` text, `ssh_rsa` varchar(600) NOT NULL DEFAULT '', `customer_no_template` varchar(255) DEFAULT 'R[CLIENTID]C[CUSTOMER_NO]', `customer_no_start` int(11) NOT NULL DEFAULT '1', @@ -1040,7 +1040,7 @@ CREATE TABLE `mail_user` ( `maildir` varchar(255) NOT NULL default '', `maildir_format` varchar(255) NOT NULL default 'maildir', `quota` bigint(20) NOT NULL default '-1', - `cc` text NOT NULL default '', + `cc` text, `sender_cc` varchar(255) NOT NULL default '', `homedir` varchar(255) NOT NULL default '', `autoresponder` enum('n','y') NOT NULL default 'n', diff --git a/interface/lib/classes/db_mysql.inc.php b/interface/lib/classes/db_mysql.inc.php index 014feec8c3..feab66cd93 100644 --- a/interface/lib/classes/db_mysql.inc.php +++ b/interface/lib/classes/db_mysql.inc.php @@ -1106,6 +1106,76 @@ class db } } + /** + * Get the database type (mariadb or mysql) + * + * @access public + * @return string 'mariadb' or string 'mysql' + */ + + public function getDatabaseType() { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } + + /** + * Get the database version + * + * @access public + * @param bool $major_version_only = true will return the major version only, e.g. 8 for MySQL 8 + * @return string version number + */ + + public function getDatabaseVersion($major_version_only = false) { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } + + /** + * Get a mysql password hash + * + * @access public + * @param string cleartext password + * @return string Password hash + */ + + public function getPasswordHash($password) { + + $password_type = 'password'; + + /* Disabled until caching_sha2_password is implemented + if($this->getDatabaseType() == 'mysql' && $this->getDatabaseVersion(true) >= 8) { + // we are in MySQL 8 mode + $tmp = $this->queryOneRecord("show variables like 'default_authentication_plugin'"); + if($tmp['default_authentication_plugin'] == 'caching_sha2_password') { + $password_type = 'caching_sha2_password'; + } + } + */ + + if($password_type == 'caching_sha2_password') { + /* + caching_sha2_password hashing needs to be implemented, have not + found valid PHP implementation for the new password hash type. + */ + } else { + $password_hash = '*'.strtoupper(sha1(sha1($password, true))); + } + + return $password_hash; + } + + } /** diff --git a/interface/lib/classes/tform_base.inc.php b/interface/lib/classes/tform_base.inc.php index cbbb83ee9c..91a855872c 100644 --- a/interface/lib/classes/tform_base.inc.php +++ b/interface/lib/classes/tform_base.inc.php @@ -1358,8 +1358,7 @@ class tform_base { $record[$key] = $app->auth->crypt_password(stripslashes($record[$key]),'ISO-8859-1'); $sql_insert_val .= "'".$app->db->quote($record[$key])."', "; } elseif (isset($field['encryption']) && $field['encryption'] == 'MYSQL') { - $tmp = $app->db->queryOneRecord("SELECT PASSWORD(?) as `crypted`", stripslashes($record[$key])); - $record[$key] = $tmp['crypted']; + $record[$key] = $app->db->getPasswordHash($record[$key]); $sql_insert_val .= "'".$app->db->quote($record[$key])."', "; } else { $record[$key] = md5(stripslashes($record[$key])); @@ -1390,8 +1389,7 @@ class tform_base { $record[$key] = $app->auth->crypt_password(stripslashes($record[$key]),'ISO-8859-1'); $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', "; } elseif (isset($field['encryption']) && $field['encryption'] == 'MYSQL') { - $tmp = $app->db->queryOneRecord("SELECT PASSWORD(?) as `crypted`", stripslashes($record[$key])); - $record[$key] = $tmp['crypted']; + $record[$key] = $app->db->getPasswordHash($record[$key]); $sql_update .= "`$key` = '".$app->db->quote($record[$key])."', "; } else { $record[$key] = md5(stripslashes($record[$key])); diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php index 8c38123096..df38086ebe 100644 --- a/server/lib/classes/db_mysql.inc.php +++ b/server/lib/classes/db_mysql.inc.php @@ -1106,6 +1106,75 @@ class db } } + /** + * Get the database type (mariadb or mysql) + * + * @access public + * @return string 'mariadb' or string 'mysql' + */ + + public function getDatabaseType() { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } + + /** + * Get the database version + * + * @access public + * @param bool $major_version_only = true will return the major version only, e.g. 8 for MySQL 8 + * @return string version number + */ + + public function getDatabaseVersion($major_version_only = false) { + $tmp = $this->queryOneRecord('SELECT VERSION() as version'); + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } + + /** + * Get a mysql password hash + * + * @access public + * @param string cleartext password + * @return string Password hash + */ + + public function getPasswordHash($password) { + + $password_type = 'password'; + + /* Disabled until caching_sha2_password is implemented + if($this->getDatabaseType() == 'mysql' && $this->getDatabaseVersion(true) >= 8) { + // we are in MySQL 8 mode + $tmp = $this->queryOneRecord("show variables like 'default_authentication_plugin'"); + if($tmp['default_authentication_plugin'] == 'caching_sha2_password') { + $password_type = 'caching_sha2_password'; + } + } + */ + + if($password_type == 'caching_sha2_password') { + /* + caching_sha2_password hashing needs to be implemented, have not + found valid PHP implementation for the new password hash type. + */ + } else { + $password_hash = '*'.strtoupper(sha1(sha1($password, true))); + } + + return $password_hash; + } + } /** diff --git a/server/plugins-available/mysql_clientdb_plugin.inc.php b/server/plugins-available/mysql_clientdb_plugin.inc.php index e1fba6e180..f28e6006ce 100644 --- a/server/plugins-available/mysql_clientdb_plugin.inc.php +++ b/server/plugins-available/mysql_clientdb_plugin.inc.php @@ -101,12 +101,7 @@ class mysql_clientdb_plugin { $success = true; if(!preg_match('/\*[A-F0-9]{40}$/', $database_password)) { - $result = $link->query("SELECT PASSWORD('" . $link->escape_string($database_password) . "') as `crypted`"); - if($result) { - $row = $result->fetch_assoc(); - $database_password = $row['crypted']; - $result->free(); - } + $database_password = $app->db->getPasswordHash($password); } $app->log("Calling $action for $database_name with access $user_access_mode and hosts " . implode(', ', $host_list), LOGLEVEL_DEBUG); @@ -151,9 +146,32 @@ class mysql_clientdb_plugin { $success = true; } - if(!$link->query("GRANT " . $grants . " ON `".$database_name."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."'")) $success = false; - $app->log("GRANT " . $grants . " ON `".$database_name."`.* TO '".$link->escape_string($database_user)."'@'$db_host' IDENTIFIED BY PASSWORD '".$link->escape_string($database_password)."' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); - } elseif($action == 'REVOKE') { + // Create the user + $link->query("CREATE USER '".$link->escape_string($database_user)."'@'$db_host'"); + $app->log("CREATE USER '".$link->escape_string($database_user)."'@'$db_host'", LOGLEVEL_DEBUG); + + // set the password + // MySQL < 5.7 and MariadB 10 + if(!$link->query("UPDATE mysql.user SET `Password` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) { + if($this->getDatabaseType($link) == 'mysql' && $this->getDatabaseVersion($link, true) >= 8) { + // for MySQL >= 8, we set authentication plugin to old mode to ensure that older additional php versions can still connect to the database + if(!$link->query("UPDATE mysql.user SET `authentication_string` = '".$link->escape_string($database_password)."', `plugin` = 'mysql_native_password' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) $success = false; + } else { + // MySQL 5.7, the Password field has been renamed to authentication_string + if(!$link->query("UPDATE mysql.user SET `authentication_string` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) $success = false; + } + } + + if($success == true){ + $link->query("FLUSH PRIVILEGES"); + $app->log("PASSWORD SET FOR '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); + } + + // Set the grant + if(!$link->query("GRANT " . $grants . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; + $app->log("GRANT " . $grants . " ON `".$link->escape_string($database_name)."`.* TO '".$link->escape_string($database_user)."'@'$db_host' success? " . ($success ? 'yes' : 'no'), LOGLEVEL_DEBUG); + + } elseif($action == 'REVOKE') { if(!$link->query("REVOKE ALL PRIVILEGES ON `".$database_name."`.* FROM '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; } elseif($action == 'DROP') { if(!$link->query("DROP USER '".$link->escape_string($database_user)."'@'$db_host'")) $success = false; @@ -165,8 +183,13 @@ class mysql_clientdb_plugin { if(trim($database_password) != '') { // MySQL < 5.7 and MariadB 10 if(!$link->query("UPDATE mysql.user SET `Password` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) { - // MySQL 5.7, the Password field has been renamed to authentication_string - if(!$link->query("UPDATE mysql.user SET `authentication_string` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) $success = false; + if($this->getDatabaseType($link) == 'mysql' && $this->getDatabaseVersion($link, true) >= 8) { + // for MySQL >= 8, we set authentication plugin to old mode to ensure that older additional php versions can still connect to the database + if(!$link->query("UPDATE mysql.user SET `authentication_string` = '".$link->escape_string($database_password)."', `plugin` = 'mysql_native_password' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) $success = false; + } else { + // MySQL 5.7, the Password field has been renamed to authentication_string + if(!$link->query("UPDATE mysql.user SET `authentication_string` = '".$link->escape_string($database_password)."' WHERE `Host` = '".$db_host."' AND `User` = '".$link->escape_string($database_user)."'")) $success = false; + } } if($success == true) $link->query("FLUSH PRIVILEGES"); } @@ -772,6 +795,43 @@ class mysql_clientdb_plugin { $link->close(); } + + + + + function getDatabaseType($link) { + $result = $link->query('SELECT VERSION() as version'); + if($result) { + $tmp = $result->fetch_assoc(); + $result->free(); + + if(stristr($tmp['version'],'mariadb')) { + return 'mariadb'; + } else { + return 'mysql'; + } + } else { + return false; + } + } + + function getDatabaseVersion($link, $major_version_only = false) { + $result = $link->query('SELECT VERSION() as version'); + if($result) { + $tmp = $result->fetch_assoc(); + $result->free(); + + $version = explode('-', $tmp['version']); + if($major_version_only == true) { + $version_parts = explode('.', $version[0]); + return $version_parts[0]; + } else { + return $version[0]; + } + } else { + return false; + } + } } // end class -- GitLab From 75c40a24592c67b9e3e7fee857785521bef5c8c6 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 7 Sep 2020 20:08:23 +0200 Subject: [PATCH 0530/1368] Port from !528 (fix for error in !527) --- interface/web/sites/web_vhost_domain_edit.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php index b6f2ac5fa8..ab4a2c8165 100644 --- a/interface/web/sites/web_vhost_domain_edit.php +++ b/interface/web/sites/web_vhost_domain_edit.php @@ -1490,7 +1490,7 @@ class page_action extends tform_actions { $rec = $app->db->queryOneRecord("SELECT server_id from web_domain WHERE domain_id = ?", $this->id); if($rec['server_id'] != $this->dataRecord["server_id"]) { //* Add a error message and switch back to old server - $app->tform->errorMessage .= $app->lng('error_server_change_not_possible'); + $app->tform->errorMessage .= $app->tform->lng('error_server_change_not_possible'); $this->dataRecord["server_id"] = $rec['server_id']; } unset($rec); @@ -1501,17 +1501,17 @@ class page_action extends tform_actions { $rec = $app->db->queryOneRecord("SELECT sys_perm_group, domain, ip_address, ipv6_address from web_domain WHERE domain_id = ?", $this->id); if(isset($this->dataRecord["domain"]) && $rec['domain'] != $this->dataRecord["domain"] && !$app->tform->checkPerm($this->id, 'u')) { //* Add a error message and switch back to old server - $app->tform->errorMessage .= $app->lng('error_domain_change_forbidden'); + $app->tform->errorMessage .= $app->tform->lng('error_domain_change_forbidden'); $this->dataRecord["domain"] = $rec['domain']; } if(isset($this->dataRecord["ip_address"]) && $rec['ip_address'] != $this->dataRecord["ip_address"] && $rec['sys_perm_group'] != 'riud') { //* Add a error message and switch back to old server - $app->tform->errorMessage .= $app->lng('error_ipv4_change_forbidden'); + $app->tform->errorMessage .= $app->tform->lng('error_ipv4_change_forbidden'); $this->dataRecord["ip_address"] = $rec['ip_address']; } if(isset($this->dataRecord["ipv6_address"]) && $rec['ipv6_address'] != $this->dataRecord["ipv6_address"] && $rec['sys_perm_group'] != 'riud') { //* Add a error message and switch back to old server - $app->tform->errorMessage .= $app->lng('error_ipv6_change_forbidden'); + $app->tform->errorMessage .= $app->tform->lng('error_ipv6_change_forbidden'); $this->dataRecord["ipv6_address"] = $rec['ipv6_address']; } unset($rec); -- GitLab From be7a6cfb0175641b288bf58a44d432b6bb77a633 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Mon, 7 Sep 2020 21:00:23 +0200 Subject: [PATCH 0531/1368] Apply 1 suggestion(s) to 1 file(s) --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index b1a7796d01..0ebe0cbdd1 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -250,7 +250,7 @@ class installer_base { die(); } - $unwanted_sql_plugins = ['']; + $unwanted_sql_plugins = array(''); } else { $unwanted_sql_plugins = array('validate_password'); } -- GitLab From 6ea5e9e088822afcc974d2847d42eebd1e229c53 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Mon, 7 Sep 2020 21:06:06 +0200 Subject: [PATCH 0532/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 0ebe0cbdd1..70ce20c7c8 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -249,16 +249,13 @@ class installer_base { } die(); } - - $unwanted_sql_plugins = array(''); } else { $unwanted_sql_plugins = array('validate_password'); - } - - $sql_plugins = $this->db->queryAllRecords("SELECT plugin_name FROM information_schema.plugins WHERE plugin_status='ACTIVE' AND plugin_name IN ?", $unwanted_sql_plugins); - if(is_array($sql_plugins) && !empty($sql_plugins)) { - foreach ($sql_plugins as $plugin) echo "Login in to MySQL and disable $plugin[plugin_name] with:\n\n UNINSTALL PLUGIN $plugin[plugin_name];"; - die(); + $sql_plugins = $this->db->queryAllRecords("SELECT plugin_name FROM information_schema.plugins WHERE plugin_status='ACTIVE' AND plugin_name IN ?", $unwanted_sql_plugins); + if(is_array($sql_plugins) && !empty($sql_plugins)) { + foreach ($sql_plugins as $plugin) echo "Login in to MySQL and disable $plugin[plugin_name] with:\n\n UNINSTALL PLUGIN $plugin[plugin_name];"; + die(); + } } //** Create the database -- GitLab From c457ed66a8b2cd490f9b06256584e674837f1f4d Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 8 Sep 2020 12:22:49 +0200 Subject: [PATCH 0533/1368] Implements #5725 Installer: Check for required PHP modules --- install/install.php | 2 ++ install/lib/installer_base.lib.php | 12 ++++++++++++ install/update.php | 2 ++ 3 files changed, 16 insertions(+) diff --git a/install/install.php b/install/install.php index 9dff3facf2..a2e0ee454c 100644 --- a/install/install.php +++ b/install/install.php @@ -150,6 +150,8 @@ if (!$inst->get_php_version()) die('ISPConfig requieres PHP '.$inst->min_php."\n $retval=shell_exec("which which"); if (empty($retval)) die ("ISPConfig requieres which \n"); +$inst->check_prerequisites(); + swriteln($inst->lng(' Following will be a few questions for primary configuration so be careful.')); swriteln($inst->lng(' Default values are in [brackets] and can be accepted with .')); swriteln($inst->lng(' Tap in "quit" (without the quotes) to stop the installer.'."\n\n")); diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 70ce20c7c8..abbdf2828c 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -198,6 +198,18 @@ class installer_base { if (($conf['apache']['installed'] && is_file($conf['apache']["vhost_conf_enabled_dir"]."/000-ispconfig.vhost")) || ($conf['nginx']['installed'] && is_file($conf['nginx']["vhost_conf_enabled_dir"]."/000-ispconfig.vhost"))) $this->ispconfig_interface_installed = true; } + + //** Check prerequisites + public function check_prerequisites() { + $msg = ''; + + if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required.\n"; + if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n"; + if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n"; + if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is nmissing.\n"; + + if($msg != '') die($msg); + } public function force_configure_app($service, $enable_force=true) { $force = false; diff --git a/install/update.php b/install/update.php index 3b3cf969ef..bc7b0aa75f 100644 --- a/install/update.php +++ b/install/update.php @@ -188,6 +188,8 @@ $inst = new installer(); if (!$inst->get_php_version()) die('ISPConfig requieres PHP '.$inst->min_php."\n"); $inst->is_update = true; +$inst->check_prerequisites(); + echo "This application will update ISPConfig 3 on your server.\n\n"; //* Make a backup before we start the update -- GitLab From 58033134ff78188fd1690e025f3aa71eb19c06d2 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 8 Sep 2020 12:24:34 +0200 Subject: [PATCH 0534/1368] Fixed typo --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index abbdf2828c..deb96174fb 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -206,7 +206,7 @@ class installer_base { if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required.\n"; if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n"; if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n"; - if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is nmissing.\n"; + if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is missing.\n"; if($msg != '') die($msg); } -- GitLab From b7bb06550e565fb8d894172c416550a44ff23ef6 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 8 Sep 2020 12:27:11 +0200 Subject: [PATCH 0535/1368] Improved error message in php version check. --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index deb96174fb..be705b6c02 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -203,7 +203,7 @@ class installer_base { public function check_prerequisites() { $msg = ''; - if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required.\n"; + if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required. The currently used PHP version is ".phpversion().".\n"; if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n"; if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n"; if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is missing.\n"; -- GitLab From 2e50dfc10bc4e259127d8021824657e499386a4c Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 8 Sep 2020 12:45:23 +0200 Subject: [PATCH 0536/1368] Preparing for release 3.2: Moved update SQL to new file 89 and Dev collection SQL file emptied. --- install/sql/incremental/upd_0089.sql | 77 +++++++++++++++++ .../sql/incremental/upd_dev_collection.sql | 82 ------------------- 2 files changed, 77 insertions(+), 82 deletions(-) create mode 100644 install/sql/incremental/upd_0089.sql diff --git a/install/sql/incremental/upd_0089.sql b/install/sql/incremental/upd_0089.sql new file mode 100644 index 0000000000..08ae33e170 --- /dev/null +++ b/install/sql/incremental/upd_0089.sql @@ -0,0 +1,77 @@ +-- add new proxy_protocol column +ALTER TABLE `web_domain` + ADD COLUMN `proxy_protocol` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `log_retention`; + +-- backup format +ALTER TABLE `web_domain` ADD `backup_format_web` VARCHAR( 255 ) NOT NULL default 'default' AFTER `backup_copies`; +ALTER TABLE `web_domain` ADD `backup_format_db` VARCHAR( 255 ) NOT NULL default 'gzip' AFTER `backup_format_web`; +-- end of backup format + +-- backup encryption +ALTER TABLE `web_domain` ADD `backup_encrypt` enum('n','y') NOT NULL DEFAULT 'n' AFTER `backup_format_db`; +ALTER TABLE `web_domain` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `backup_encrypt`; +ALTER TABLE `web_backup` ADD `backup_format` VARCHAR( 64 ) NOT NULL DEFAULT '' AFTER `backup_mode`; +ALTER TABLE `web_backup` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `filesize`; +-- end of backup encryption + +-- rename Comodo to "Sectigo / Comodo CA" +UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'comodoca.com'; + +-- default php-fpm to ondemand mode +ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; + +ALTER TABLE `mail_user` + ADD `purge_trash_days` INT NOT NULL DEFAULT '0' AFTER `move_junk`, + ADD `purge_junk_days` INT NOT NULL DEFAULT '0' AFTER `purge_trash_days`; + +-- doveadm should be enabled for all mailboxes +UPDATE `mail_user` set `disabledoveadm` = 'n'; + +-- add disablequota-status for quota-status policy daemon +ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disabledoveadm`; + +-- add disableindexer-worker for solr search +ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disablequota-status`; + +-- add SSHFP and DNAME record +ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; + +-- change cc and sender_cc column type +ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; + +-- remove SPDY option +ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; + +-- was missing in incremental, inserted for fixing older installations +ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; + +ALTER TABLE `web_domain` ADD `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0; + +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fastcgi_binary, ':', p.php_fastcgi_ini_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; + +UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fpm_init_script, ':', p.php_fpm_ini_dir, ':', p.php_fpm_pool_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; + +ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumtext NULL DEFAULT NULL; +ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; + +-- add move to junk before/after option, default to after +ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y'; + +-- Change id_rsa column to TEXT format +ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; + +ALTER TABLE `directive_snippets` ADD `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n' ; + +-- Add DNSSEC Algorithm setting +ALTER TABLE `dns_soa` ADD `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') NULL DEFAULT NULL AFTER `dnssec_wanted`; +UPDATE `dns_soa` SET `dnssec_algo` = 'NSEC3RSASHA1' WHERE `dnssec_algo` IS NULL AND dnssec_initialized = 'Y'; +UPDATE `dns_soa` SET `dnssec_algo` = 'ECDSAP256SHA256' WHERE `dnssec_algo` IS NULL AND dnssec_initialized = 'N'; +ALTER TABLE `dns_soa` CHANGE `dnssec_algo` `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'ECDSAP256SHA256'; + +-- Fix issue #5635 +ALTER TABLE `client_template` CHANGE `ssh_chroot` `ssh_chroot` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; +ALTER TABLE `client_template` CHANGE `web_php_options` `web_php_options` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; + +-- add option to forward in lda, default to forward in mta except for existing forwards +ALTER TABLE `mail_user` ADD `forward_in_lda` enum('n','y') NOT NULL default 'n' AFTER `cc`; +UPDATE `mail_user` set `forward_in_lda` = 'y' where `cc` != ''; \ No newline at end of file diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e94a98eb7e..e69de29bb2 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -1,82 +0,0 @@ --- add new proxy_protocol column -ALTER TABLE `web_domain` - ADD COLUMN `proxy_protocol` ENUM('n','y') NOT NULL DEFAULT 'n' AFTER `log_retention`; - --- backup format -ALTER TABLE `web_domain` ADD `backup_format_web` VARCHAR( 255 ) NOT NULL default 'default' AFTER `backup_copies`; -ALTER TABLE `web_domain` ADD `backup_format_db` VARCHAR( 255 ) NOT NULL default 'gzip' AFTER `backup_format_web`; --- end of backup format - --- backup encryption -ALTER TABLE `web_domain` ADD `backup_encrypt` enum('n','y') NOT NULL DEFAULT 'n' AFTER `backup_format_db`; -ALTER TABLE `web_domain` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `backup_encrypt`; -ALTER TABLE `web_backup` ADD `backup_format` VARCHAR( 64 ) NOT NULL DEFAULT '' AFTER `backup_mode`; -ALTER TABLE `web_backup` ADD `backup_password` VARCHAR( 255 ) NOT NULL DEFAULT '' AFTER `filesize`; --- end of backup encryption - --- rename Comodo to "Sectigo / Comodo CA" -UPDATE `dns_ssl_ca` SET `ca_name` = 'Sectigo / Comodo CA' WHERE `ca_issue` = 'comodoca.com'; - --- default php-fpm to ondemand mode -ALTER TABLE `web_domain` ALTER pm SET DEFAULT 'ondemand'; - -ALTER TABLE `mail_user` - ADD `purge_trash_days` INT NOT NULL DEFAULT '0' AFTER `move_junk`, - ADD `purge_junk_days` INT NOT NULL DEFAULT '0' AFTER `purge_trash_days`; - --- doveadm should be enabled for all mailboxes -UPDATE `mail_user` set `disabledoveadm` = 'n'; - --- add disablequota-status for quota-status policy daemon -ALTER TABLE `mail_user` ADD `disablequota-status` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disabledoveadm`; - --- add disableindexer-worker for solr search -ALTER TABLE `mail_user` ADD `disableindexer-worker` ENUM('n','y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'n' AFTER `disablequota-status`; - --- add SSHFP and DNAME record -ALTER TABLE `dns_rr` CHANGE `type` `type` ENUM('A','AAAA','ALIAS','CNAME','DNAME','CAA','DS','HINFO','LOC','MX','NAPTR','NS','PTR','RP','SRV','SSHFP','TXT','TLSA','DNSKEY') NULL DEFAULT NULL AFTER `name`; - --- change cc and sender_cc column type -ALTER TABLE `mail_user` CHANGE `cc` `cc` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; - --- remove SPDY option -ALTER TABLE `web_domain` DROP COLUMN `enable_spdy`; - --- was missing in incremental, inserted for fixing older installations -ALTER TABLE `web_domain` ADD `folder_directive_snippets` TEXT NULL AFTER `https_port`; - - -ALTER TABLE `web_domain` ADD `server_php_id` INT(11) UNSIGNED NOT NULL DEFAULT 0; - -UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fastcgi_binary, ':', p.php_fastcgi_ini_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; - -UPDATE `web_domain` as w LEFT JOIN sys_group as g ON (g.groupid = w.sys_groupid) INNER JOIN `server_php` as p ON (w.fastcgi_php_version = CONCAT(p.name, ':', p.php_fpm_init_script, ':', p.php_fpm_ini_dir, ':', p.php_fpm_pool_dir) AND p.server_id IN (0, w.server_id) AND p.client_id IN (0, g.client_id)) SET w.server_php_id = p.server_php_id, w.fastcgi_php_version = '' WHERE 1; - --- we have to decide whether to delete the column or leave it there for investigating not-converted entries --- ALTER TABLE `web_domain` DROP COLUMN `fastcgi_php_version`; - -ALTER TABLE `web_domain` CHANGE `apache_directives` `apache_directives` mediumtext NULL DEFAULT NULL; -ALTER TABLE `web_domain` CHANGE `nginx_directives` `nginx_directives` mediumtext NULL DEFAULT NULL; - --- add move to junk before/after option, default to after -ALTER TABLE `mail_user` MODIFY `move_junk` enum('y','a','n') NOT NULL DEFAULT 'y'; - --- Change id_rsa column to TEXT format -ALTER TABLE `client` CHANGE `id_rsa` `id_rsa` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci; - -ALTER TABLE `directive_snippets` ADD `update_sites` ENUM('y','n') NOT NULL DEFAULT 'n' ; - --- Add DNSSEC Algorithm setting -ALTER TABLE `dns_soa` ADD `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') NULL DEFAULT NULL AFTER `dnssec_wanted`; -UPDATE `dns_soa` SET `dnssec_algo` = 'NSEC3RSASHA1' WHERE `dnssec_algo` IS NULL AND dnssec_initialized = 'Y'; -UPDATE `dns_soa` SET `dnssec_algo` = 'ECDSAP256SHA256' WHERE `dnssec_algo` IS NULL AND dnssec_initialized = 'N'; -ALTER TABLE `dns_soa` CHANGE `dnssec_algo` `dnssec_algo` SET('NSEC3RSASHA1','ECDSAP256SHA256') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'ECDSAP256SHA256'; - --- Fix issue #5635 -ALTER TABLE `client_template` CHANGE `ssh_chroot` `ssh_chroot` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; -ALTER TABLE `client_template` CHANGE `web_php_options` `web_php_options` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''; - --- add option to forward in lda, default to forward in mta except for existing forwards -ALTER TABLE `mail_user` ADD `forward_in_lda` enum('n','y') NOT NULL default 'n' AFTER `cc`; -UPDATE `mail_user` set `forward_in_lda` = 'y' where `cc` != ''; - -- GitLab From 2856951fba5db327c5710391ea24e231406127ae Mon Sep 17 00:00:00 2001 From: Hj Ahmad Rasyid Hj Ismail Date: Tue, 8 Sep 2020 13:14:09 +0200 Subject: [PATCH 0537/1368] Update installer_base.lib.php to get LE SSL certs for the server via certbot or acme.sh before openssl self-signed method upon new installation or existing update; and extend it to other available services (postfix, pure-ftpd-mysql), with additional dhparam pem file, if none exists. --- install/install.php | 6 + install/lib/installer_base.lib.php | 270 +++++++++++++++++++++-- install/uninstall.php | 3 + install/update.php | 6 + server/scripts/letsencrypt_post_hook.sh | 45 ++++ server/scripts/letsencrypt_pre_hook.sh | 46 ++++ server/scripts/letsencrypt_renew_hook.sh | 47 ++++ 7 files changed, 404 insertions(+), 19 deletions(-) create mode 100644 server/scripts/letsencrypt_post_hook.sh create mode 100644 server/scripts/letsencrypt_pre_hook.sh create mode 100644 server/scripts/letsencrypt_renew_hook.sh diff --git a/install/install.php b/install/install.php index 9dff3facf2..57d00269fd 100644 --- a/install/install.php +++ b/install/install.php @@ -574,6 +574,12 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon $inst->install_ispconfig_interface = false; } +// Create SSL certs for non-webserver(s)? +if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { + if(strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') + $inst->make_ispconfig_ssl_cert(); +} + $inst->install_ispconfig(); //* Configure DBServer diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 70ce20c7c8..ff0df827a0 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1,7 +1,7 @@ curl_request('https://ispconfig.org/remoteip.php', false); + $svr_ip6 = $this->curl_request('https://ispconfig.org/remoteip.php', true); + + if(function_exists('idn_to_ascii')) { + if(defined('IDNA_NONTRANSITIONAL_TO_ASCII') && defined('INTL_IDNA_VARIANT_UTS46') && constant('IDNA_NONTRANSITIONAL_TO_ASCII')) { + $hostname = idn_to_ascii($hostname, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46); + } else { + $hostname = idn_to_ascii($hostname); + } + } + $dns_ips = array(); + if (checkdnsrr($hostname, 'A')) { + $dnsa=dns_get_record($hostname, DNS_A); + if($dnsa) { + foreach ($dnsa as $rec) { + $dns_ips[] = $rec['ip']; + } + } + } + if (checkdnsrr($hostname, 'AAAA')) { + $dnsaaaa=dns_get_record($hostname, DNS_AAAA); + if($dnsaaaa) { + foreach ($dnsaaaa as $rec) { + $dns_ips[] = $rec['ip']; + } + } + } + + // Request for certs if no LE SSL folder for server fqdn exist + $le_live_dir = '/etc/letsencrypt/live/' . $hostname; + if (!@is_dir($le_live_dir) && ( + ($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)) + )) { + + // This script is needed earlier to check and open http port 80 or standalone might fail + // Make executable and temporary symlink latest letsencrypt pre, post and renew hook script before install + if(file_exists(dirname(getcwd()) . '/server/scripts/letsencrypt_pre_hook.sh')) { + symlink(dirname(getcwd()) . '/server/scripts/letsencrypt_pre_hook.sh', '/usr/local/bin/letsencrypt_pre_hook.sh'); + } + if(file_exists(dirname(getcwd()) . '/server/scripts/letsencrypt_post_hook.sh')) { + symlink(dirname(getcwd()) . '/server/scripts/letsencrypt_post_hook.sh', '/usr/local/bin/letsencrypt_post_hook.sh'); + } + if(file_exists(dirname(getcwd()) . '/server/scripts/letsencrypt_renew_hook.sh')) { + symlink(dirname(getcwd()) . '/server/scripts/letsencrypt_renew_hook.sh', '/usr/local/bin/letsencrypt_renew_hook.sh'); + } + chown('/usr/local/bin/letsencrypt_pre_hook.sh', 'root'); + chown('/usr/local/bin/letsencrypt_post_hook.sh', 'root'); + chown('/usr/local/bin/letsencrypt_renew_hook.sh', 'root'); + chmod('/usr/local/bin/letsencrypt_pre_hook.sh', 0700); + chmod('/usr/local/bin/letsencrypt_post_hook.sh', 0700); + chmod('/usr/local/bin/letsencrypt_renew_hook.sh', 0700); - $ssl_crt_file = $install_dir.'/interface/ssl/ispserver.crt'; - $ssl_csr_file = $install_dir.'/interface/ssl/ispserver.csr'; - $ssl_key_file = $install_dir.'/interface/ssl/ispserver.key'; + // Check http port 80 status as it cannot be determined at post hook stage + $port80_status=exec('true &>/dev/null &1', $ret, $val); + if(preg_match('/^(\S+|\w+)\s+(\d+(\.\d+)+)$/', $le_info, $matches)) { + $le_version = $matches[2]; + } + + // Define certbot commands + $acme_version = '--server https://acme-v0' . (($le_version >=0.22) ? '2' : '1') . '.api.letsencrypt.org/directory'; + $certonly = 'certonly --agree-tos --non-interactive --expand --rsa-key-size 4096'; + + // If this is a webserver + if($conf['nginx']['installed'] == true) + exec("$le_client $certonly $acme_version --nginx --email postmaster@$hostname $renew_hook"); + elseif($conf['apache']['installed'] == true) + exec("$le_client $certonly $acme_version --apache --email postmaster@$hostname $renew_hook"); + // Else, it is not webserver, so we use standalone + else + exec("$le_client $certonly $acme_version --standalone --email postmaster@$hostname -d $hostname $hook"); + } + } + } + + //* Define and check ISPConfig SSL folder */ + $ssl_dir = $conf['ispconfig_install_dir'].'/interface/ssl'; + if(!@is_dir($ssl_dir)) mkdir($ssl_dir, 0755, true); + + $ssl_crt_file = $ssl_dir.'/ispserver.crt'; + $ssl_csr_file = $ssl_dir.'/ispserver.csr'; + $ssl_key_file = $ssl_dir.'/ispserver.key'; + $ssl_pem_file = $ssl_dir.'/ispserver.pem'; + + $date = new DateTime(); + + // If the LE SSL certs for this hostname exists + if (is_dir($le_live_dir) && in_array($svr_ip, $dns_ips)) { + + // Backup existing ispserver ssl files + if (file_exists($ssl_crt_file)) rename($ssl_crt_file, $ssl_crt_file . '-' .$date->format('YmdHis') . '.bak'); + if (file_exists($ssl_key_file)) rename($ssl_key_file, $ssl_key_file . '-' .$date->format('YmdHis') . '.bak'); + if (file_exists($ssl_pem_file)) rename($ssl_pem_file, $ssl_pem_file . '-' .$date->format('YmdHis') . '.bak'); + + // Create symlink to LE fullchain and key for ISPConfig + symlink($le_live_dir.'/fullchain.pem', $ssl_crt_file); + symlink($le_live_dir.'/privkey.pem', $ssl_key_file); - $ssl_pw = substr(md5(mt_rand()), 0, 6); - exec("openssl genrsa -des3 -passout pass:$ssl_pw -out $ssl_key_file 4096"); - if(AUTOINSTALL){ - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -key $ssl_key_file -out $ssl_csr_file"); } else { - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file"); + + // We can still use the old self-signed method + $ssl_pw = substr(md5(mt_rand()), 0, 6); + exec("openssl genrsa -des3 -passout pass:$ssl_pw -out $ssl_key_file 4096"); + if(AUTOINSTALL){ + exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -key $ssl_key_file -out $ssl_csr_file"); + } else { + exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file"); + } + exec("openssl req -x509 -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -in $ssl_csr_file -out $ssl_crt_file -days 3650"); + exec("openssl rsa -passin pass:$ssl_pw -in $ssl_key_file -out $ssl_key_file.insecure"); + rename($ssl_key_file, $ssl_key_file.'.secure'); + rename($ssl_key_file.'.insecure', $ssl_key_file); } - exec("openssl req -x509 -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -in $ssl_csr_file -out $ssl_crt_file -days 3650"); - exec("openssl rsa -passin pass:$ssl_pw -in $ssl_key_file -out $ssl_key_file.insecure"); - rename($ssl_key_file, $ssl_key_file.'.secure'); - rename($ssl_key_file.'.insecure', $ssl_key_file); - exec('chown -R root:root /usr/local/ispconfig/interface/ssl'); + // Build ispserver.pem file and chmod it + exec("cat $ssl_key_file $ssl_crt_file > $ssl_pem_file; chmod 600 $ssl_pem_file"); + + // Extend LE SSL certs to postfix + if ($conf['postfix']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig LE SSL certs to postfix?', array('y', 'n'), 'y')) == 'y') { + + // Define folder, file(s) + $cf = $conf['postfix']; + $postfix_dir = $cf['config_dir']; + if(!is_dir($postfix_dir)) $this->error("The postfix configuration directory '$postfix_dir' does not exist."); + $smtpd_crt = $postfix_dir.'/smtpd.cert'; + $smtpd_key = $postfix_dir.'/smtpd.key'; + + // Backup existing postfix ssl files + if (file_exists($smtpd_crt)) rename($smtpd_crt, $smtpd_crt . '-' .$date->format('YmdHis') . '.bak'); + if (file_exists($smtpd_key)) rename($smtpd_key, $smtpd_key . '-' .$date->format('YmdHis') . '.bak'); + + // Create symlink to ISPConfig SSL files + symlink($ssl_crt_file, $smtpd_crt); + symlink($ssl_key_file, $smtpd_key); + } + + // Extend LE SSL certs to pureftpd + if ($conf['pureftpd']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig LE SSL certs to pureftpd? Creating dhparam file takes some times.', array('y', 'n'), 'y')) == 'y') { + + // Define folder, file(s) + $pureftpd_dir = '/etc/ssl/private'; + if(!is_dir($pureftpd_dir)) mkdir($pureftpd_dir, 0755, true); + $pureftpd_pem = $pureftpd_dir.'/pure-ftpd.pem'; + + // Backup existing pureftpd ssl files + if (file_exists($pureftpd_pem)) rename($pureftpd_pem, $pureftpd_pem . '-' .$date->format('YmdHis') . '.bak'); + + // Create symlink to ISPConfig SSL files + symlink($ssl_pem_file, $pureftpd_pem); + if (!file_exists("$pureftpd_dir/pure-ftpd-dhparams.pem")) + exec("cd $pureftpd_dir; openssl dhparam -out dhparam2048.pem 2048; ln -sf dhparam2048.pem pure-ftpd-dhparams.pem"); + } + + exec("chown -R root:root $ssl_dir"); } @@ -3122,6 +3342,20 @@ class installer_base { if(!is_link('/usr/local/bin/ispconfig_update_from_dev.sh')) symlink($install_dir.'/server/scripts/ispconfig_update.sh', '/usr/local/bin/ispconfig_update_from_dev.sh'); if(!is_link('/usr/local/bin/ispconfig_update.sh')) symlink($install_dir.'/server/scripts/ispconfig_update.sh', '/usr/local/bin/ispconfig_update.sh'); + // Make executable then unlink and symlink letsencrypt pre, post and renew hook scripts + chown($install_dir.'/server/scripts/letsencrypt_pre_hook.sh', 'root'); + chown($install_dir.'/server/scripts/letsencrypt_post_hook.sh', 'root'); + chown($install_dir.'/server/scripts/letsencrypt_renew_hook.sh', 'root'); + chmod($install_dir.'/server/scripts/letsencrypt_pre_hook.sh', 0700); + chmod($install_dir.'/server/scripts/letsencrypt_post_hook.sh', 0700); + chmod($install_dir.'/server/scripts/letsencrypt_renew_hook.sh', 0700); + if(is_link('/usr/local/bin/letsencrypt_pre_hook.sh')) unlink('/usr/local/bin/letsencrypt_pre_hook.sh'); + if(is_link('/usr/local/bin/letsencrypt_post_hook.sh')) unlink('/usr/local/bin/letsencrypt_post_hook.sh'); + if(is_link('/usr/local/bin/letsencrypt_renew_hook.sh')) unlink('/usr/local/bin/letsencrypt_renew_hook.sh'); + symlink($install_dir.'/server/scripts/letsencrypt_pre_hook.sh', '/usr/local/bin/letsencrypt_pre_hook.sh'); + symlink($install_dir.'/server/scripts/letsencrypt_post_hook.sh', '/usr/local/bin/letsencrypt_post_hook.sh'); + symlink($install_dir.'/server/scripts/letsencrypt_renew_hook.sh', '/usr/local/bin/letsencrypt_renew_hook.sh'); + //* Make the logs readable for the ispconfig user if(@is_file('/var/log/mail.log')) exec('chmod +r /var/log/mail.log'); if(@is_file('/var/log/mail.warn')) exec('chmod +r /var/log/mail.warn'); @@ -3462,5 +3696,3 @@ class installer_base { } } - -?> diff --git a/install/uninstall.php b/install/uninstall.php index fdac79d61e..37cbe05f86 100644 --- a/install/uninstall.php +++ b/install/uninstall.php @@ -88,6 +88,9 @@ if($do_uninstall == 'yes') { exec('rm -rf /usr/local/ispconfig'); // Delete various other files + @unlink("/usr/local/bin/letsencrypt_post_hook.sh"); + @unlink("/usr/local/bin/letsencrypt_pre_hook.sh"); + @unlink("/usr/local/bin/letsencrypt_renew_hook.sh"); @unlink("/usr/local/bin/ispconfig_update.sh"); @unlink("/usr/local/bin/ispconfig_update_from_svn.sh"); @unlink("/var/spool/mail/ispconfig"); diff --git a/install/update.php b/install/update.php index 3b3cf969ef..cfb3d454d5 100644 --- a/install/update.php +++ b/install/update.php @@ -534,6 +534,12 @@ if ($inst->install_ispconfig_interface) { } } +// Create SSL certs for non-webserver(s)? +if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { + if(strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') + $inst->make_ispconfig_ssl_cert(); +} + $inst->install_ispconfig(); // Cleanup diff --git a/server/scripts/letsencrypt_post_hook.sh b/server/scripts/letsencrypt_post_hook.sh new file mode 100644 index 0000000000..02653f79a1 --- /dev/null +++ b/server/scripts/letsencrypt_post_hook.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: LETSENCRYPT POST HOOK SCRIPT +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: LETSENCRYPT POST HOOK SCRIPT +# Description: To force close http port 80 if it is by default closed, to be used by letsencrypt client standlone command +### END INIT INFO + +## If you need a custom hook file, create a file with the same name in +## /usr/local/ispconfig/server/conf-custom/scripts/ +if [[ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_post_hook.sh" ]] ; then + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_post_hook.sh && exit 0 || exit 1; +fi + +# You can add support to other firewall + +# For RHEL, Centos or derivatives +if which yum &> /dev/null 2>&1 ; then + # Check if web server software is installed, start it if any + if [ rpm -q nginx ]; then service nginx start + elif [ rpm -q httpd ]; then service httpd start + # If using firewalld + elif [ rpm -q firewalld ] && [ `firewall-cmd --state` = running ]; then + firewall-cmd --zone=public --permanent --remove-service=http + firewall-cmd --reload + # If using UFW + else; if [ rpm -q ufw ]; then ufw --force enable && ufw deny http; fi + fi +# For Debian, Ubuntu or derivatives +elif apt-get -v >/dev/null 2>&1 ; then + # Check if web server software is installed, stop it if any + if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx start + elif [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 start + # If using UFW + else; if [ $(dpkg-query -W -f='${Status}' ufw 2>/dev/null | grep -c "ok installed") -eq 1 ]; then ufw --force enable && ufw deny http; fi + fi +# Try iptables as a final attempt +else + iptables -D INPUT -p tcp --dport 80 -j ACCEPT + service iptables save +fi \ No newline at end of file diff --git a/server/scripts/letsencrypt_pre_hook.sh b/server/scripts/letsencrypt_pre_hook.sh new file mode 100644 index 0000000000..56f246e803 --- /dev/null +++ b/server/scripts/letsencrypt_pre_hook.sh @@ -0,0 +1,46 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: LETSENCRYPT PRE HOOK SCRIPT +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: LETSENCRYPT PRE HOOK SCRIPT +# Description: To force open http port 80 to be used by letsencrypt client standlone command +### END INIT INFO + +## If you need a custom hook file, create a file with the same name in +## /usr/local/ispconfig/server/conf-custom/scripts/ +if [[ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_pre_hook.sh" ]] ; then + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_pre_hook.sh && exit 0 || exit 1 ; +fi + +# You can add support to other firewall + +# For RHEL, Centos or derivatives +if which yum &> /dev/null 2>&1 ; then + # Check if web server software is installed, stop it if any + if [ rpm -q nginx ]; then service nginx stop; fi + if [ rpm -q httpd ]; then service httpd stop; fi + # If using firewalld + if [ rpm -q firewalld ] && [ `firewall-cmd --state` = running ]; then + firewall-cmd --zone=public --permanent --add-service=http + firewall-cmd --reload + fi + # If using UFW + if [ rpm -q ufw ]; then ufw --force enable && ufw allow http; fi + +# For Debian, Ubuntu or derivatives +elif apt-get -v >/dev/null 2>&1 ; then + # Check if web server software is installed, stop it if any + if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx stop; fi + if [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 stop; fi + # If using UFW + if [ $(dpkg-query -W -f='${Status}' ufw 2>/dev/null | grep -c "ok installed") -eq 1 ]; then ufw --force enable && ufw allow http; fi + +# Try iptables as a final attempt +else + iptables -I INPUT -p tcp --dport 80 -j ACCEPT + service iptables save +fi diff --git a/server/scripts/letsencrypt_renew_hook.sh b/server/scripts/letsencrypt_renew_hook.sh new file mode 100644 index 0000000000..0a71f30d01 --- /dev/null +++ b/server/scripts/letsencrypt_renew_hook.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +### BEGIN INIT INFO +# Provides: LETSENCRYPT RENEW HOOK SCRIPT +# Required-Start: $local_fs $network +# Required-Stop: $local_fs +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: LETSENCRYPT RENEW HOOK SCRIPT +# Description: Taken from LE4ISPC code. To be used to update ispserver.pem automatically after ISPConfig LE SSL certs are renewed and to reload / restart important ISPConfig server services +### END INIT INFO + +## If you need a custom hook file, create a file with the same name in +## /usr/local/ispconfig/server/conf-custom/scripts/ +if [[ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh" ]] ; then + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh && exit 0 || exit 1; +fi + +lelive=/etc/letsencrypt/live/$(hostname -f); if [ -d "$lelive" ]; then + cd /usr/local/ispconfig/interface/ssl; ibak=ispserver.*.bak; ipem=ispserver.pem; icrt=ispserver.crt; ikey=ispserver.key + if ls $ibak 1> /dev/null 2>&1; then rm $ibak; fi + if [ -e "$ipem" ]; then mv $ipem $ipem-$(date +"%y%m%d%H%M%S").bak; cat $ikey $icrt > $ipem; chmod 600 $ipem; fi + pureftpdpem=/etc/ssl/private/pure-ftpd.pem; if [ -e "$pureftpdpem" ]; then chmod 600 $pureftpdpem; fi + # For Red Hat, Centos or derivatives + if which yum &> /dev/null 2>&1 ; then + if [ rpm -q pure-ftpd ]; then service pure-ftpd restart; fi + if [ rpm -q monit ]; then service monit restart; fi + if [ rpm -q postfix ]; then service postfix restart; fi + if [ rpm -q dovecot ]; then service dovecot restart; fi + if [ rpm -q mysql-server ]; then service mysqld restart; fi + if [ rpm -q mariadb-server ]; then service mariadb restart; fi + if [ rpm -q MariaDB-server ]; then service mysql restart; fi + if [ rpm -q nginx ]; then service nginx restart; fi + if [ rpm -q httpd ]; then service httpd restart; fi + # For Debian, Ubuntu or derivatives + elif apt-get -v >/dev/null 2>&1 ; then + if [ $(dpkg-query -W -f='${Status}' pure-ftpd-mysql 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service pure-ftpd-mysql restart; fi + if [ $(dpkg-query -W -f='${Status}' monit 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service monit restart; fi + if [ $(dpkg-query -W -f='${Status}' postfix 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service postfix restart; fi + if [ $(dpkg-query -W -f='${Status}' dovecot-imapd 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service dovecot restart; fi + if [ $(dpkg-query -W -f='${Status}' mysql 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service mysql restart; fi + if [ $(dpkg-query -W -f='${Status}' mariadb 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service mysql restart; fi + if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx restart; fi + if [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 restart; fi + else + fi +else echo `/bin/date` "Your Lets Encrypt SSL certs path for your ISPConfig server FQDN is missing.$line" >> /var/log/ispconfig/ispconfig.log; fi \ No newline at end of file -- GitLab From 82f6e7b12aae0c3311fedce7ecb1bd8d7db35661 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 8 Sep 2020 14:46:57 +0200 Subject: [PATCH 0538/1368] - update script rework --- server/scripts/ispconfig_update.php | 21 ++++------ server/scripts/update_from_dev.sh | 28 +------------ server/scripts/update_from_dev_stable.sh | 28 +------------ server/scripts/update_stable.sh | 53 +----------------------- 4 files changed, 13 insertions(+), 117 deletions(-) diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php index 2c77607b65..e71b501a7c 100644 --- a/server/scripts/ispconfig_update.php +++ b/server/scripts/ispconfig_update.php @@ -88,25 +88,18 @@ echo "\n".str_repeat('-', 80)."\n"; echo "\n\n>> Update \n\n"; echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Update all slave server, before you update master server.\n\n"; -$method = simple_query('Select update method', array('stable', 'git-stable', 'git-master'), 'stable'); +$method = simple_query('Select update method', array('stable', 'nightly', 'git-develop'), 'stable'); if($method == 'stable') { $new_version = @file_get_contents('https://www.ispconfig.org/downloads/ispconfig3_version.txt') or die('Unable to retrieve version file.'); $new_version = trim($new_version); - if(version_compare($new_version, ISPC_APP_VERSION, '>')) { - passthru('/usr/local/ispconfig/server/scripts/update_stable.sh'); - exit; - } else { + if(version_compare($new_version, ISPC_APP_VERSION, '<=') && !in_array('--force', $argv, true)) { echo "There are no updates available for ISPConfig ".ISPC_APP_VERSION."\n"; + echo "If you are sure you want to update to stable anyway, please use --force parameter\n"; + echo "DOWNGRADING MAY CAUSE ISSUES!\n"; + exit(1); } -} elseif ($method == 'git-stable') { - passthru('/usr/local/ispconfig/server/scripts/update_from_dev_stable.sh'); - exit; -} else { - passthru('/usr/local/ispconfig/server/scripts/update_from_dev.sh'); - exit; } - - -?> +passthru('/usr/local/ispconfig/server/scripts/update_runner.sh ' . escapeshellarg($method)); +exit; diff --git a/server/scripts/update_from_dev.sh b/server/scripts/update_from_dev.sh index 0be65986d6..430a1b5c7f 100755 --- a/server/scripts/update_from_dev.sh +++ b/server/scripts/update_from_dev.sh @@ -1,29 +1,5 @@ #!/bin/bash -{ - umask 0077 \ - && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ - && test -d "${tmpdir}" \ - && cd "${tmpdir}" -} || { - echo 'mktemp failed' - exit 1 -} +echo "This script is no longer used. Please use ispconfig_update.sh instead." ; -wget -O ispconfig3-dev.tar.gz "https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=master" -tar xzf ispconfig3-dev.tar.gz - -echo -n "Latest git version: " -ls -1d ispconfig3-master* -cd ispconfig3-master*/install - -php -q \ - -d disable_classes= \ - -d disable_functions= \ - -d open_basedir= \ - update.php - -cd /tmp -rm -rf "${tmpdir}" - -exit 0 +exit 1; diff --git a/server/scripts/update_from_dev_stable.sh b/server/scripts/update_from_dev_stable.sh index a5dc10605b..430a1b5c7f 100644 --- a/server/scripts/update_from_dev_stable.sh +++ b/server/scripts/update_from_dev_stable.sh @@ -1,29 +1,5 @@ #!/bin/bash -{ - umask 0077 \ - && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ - && test -d "${tmpdir}" \ - && cd "${tmpdir}" -} || { - echo 'mktemp failed' - exit 1 -} +echo "This script is no longer used. Please use ispconfig_update.sh instead." ; -wget -O ispconfig3-dev.tar.gz "https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=stable-3.1" -tar xzf ispconfig3-dev.tar.gz - -echo -n "Latest git version: " -ls -1d ispconfig3-stable* -cd ispconfig3-stable*/install - -php -q \ - -d disable_classes= \ - -d disable_functions= \ - -d open_basedir= \ - update.php - -cd /tmp -rm -rf "${tmpdir}" - -exit 0 +exit 1; diff --git a/server/scripts/update_stable.sh b/server/scripts/update_stable.sh index 854731077e..430a1b5c7f 100644 --- a/server/scripts/update_stable.sh +++ b/server/scripts/update_stable.sh @@ -1,54 +1,5 @@ #!/bin/bash -_UPD=1 +echo "This script is no longer used. Please use ispconfig_update.sh instead." ; -# padding handles script being overwritten during updates -# see https://git.ispconfig.org/ispconfig/ispconfig3/issues/4227 - -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## -################################################## - -{ -if [ -n "${_UPD}" ] -then - { - umask 0077 \ - && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ - && test -d "${tmpdir}" \ - && cd "${tmpdir}" - } || { - echo 'mktemp failed' - exit 1 - } - - wget https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz - if [ -f ISPConfig-3-stable.tar.gz ] - then - tar xvfz ISPConfig-3-stable.tar.gz - cd ispconfig3_install/install/ - php -q \ - -d disable_classes= \ - -d disable_functions= \ - -d open_basedir= \ - update.php - cd /tmp - rm -rf "${tmpdir}" - else - echo "Unable to download the update." - exit 1 - fi - -fi - -exit 0 -} +exit 1; -- GitLab From 63ae4071a96ce1556fbe34a158ff089a052e4af4 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 8 Sep 2020 15:16:53 +0200 Subject: [PATCH 0539/1368] Update README.md --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 01c6f115de..1ffa151993 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,6 @@ # ISPConfig - Hosting Control Panel -Nightly (master): [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/master/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/master) -Stable branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/stable-3.2/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/stable-3.2) +Development branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispconfig3/badges/develop/pipeline.svg)](https://git.ispconfig.org/ispconfig/ispconfig3/commits/develop) - Manage multiple servers from one control panel -- GitLab From 54d11f0f3e5b008dab20178ddf64f4b75fce9dd8 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 8 Sep 2020 15:50:47 +0200 Subject: [PATCH 0540/1368] - added missing runner file --- server/scripts/update_runner.sh | 74 +++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 server/scripts/update_runner.sh diff --git a/server/scripts/update_runner.sh b/server/scripts/update_runner.sh new file mode 100644 index 0000000000..5647272f3a --- /dev/null +++ b/server/scripts/update_runner.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +_UPD=1 + +# padding handles script being overwritten during updates +# see https://git.ispconfig.org/ispconfig/ispconfig3/issues/4227 + +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## +################################################## + +SOURCE=$1 +URL="" + +if [[ "$SOURCE" == "stable" ]] ; then + URL="https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz" +elif [[ "$SOURCE" == "nightly" ]] ; then + URL="https://www.ispconfig.org/downloads/ISPConfig-3-nightly.tar.gz" +elif [[ "$SOURCE" == "git-develop" ]] ; then + URL="https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=develop" +else + echo "Please choose an installation source (stable, nightly, git-develop)" + exit 1 +fi + +CURDIR=$PWD + +cd /tmp + +{ +if [ -n "${_UPD}" ] +then + { + umask 0077 \ + && tmpdir=`mktemp -dt "$(basename $0).XXXXXXXXXX"` \ + && test -d "${tmpdir}" \ + && cd "${tmpdir}" + } || { + echo 'mktemp failed' + exit 1 + } + + wget -O ISPConfig-3.tar.gz "${URL}" + if [ -f ISPConfig-3.tar.gz ] + then + tar xvzf ISPConfig-3.tar.gz --strip-components=1 + cd install/ + php -q \ + -d disable_classes= \ + -d disable_functions= \ + -d open_basedir= \ + update.php + cd /tmp + rm -rf "${tmpdir}" + else + echo "Unable to download the update." + cd "$CURDIR" + exit 1 + fi + +fi + +cd "$CURDIR" +exit 0 +} -- GitLab From a9718449e8721466b26142bb311cb0accc152922 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 17 Feb 2018 21:41:58 +0100 Subject: [PATCH 0541/1368] fix typo --- remoting_client/readme | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/remoting_client/readme b/remoting_client/readme index 1392888bc0..92af7f8240 100644 --- a/remoting_client/readme +++ b/remoting_client/readme @@ -3,8 +3,8 @@ - Remote API example files -------------------------------------------------------- -The examples folder contains a example script for every -Remote api function. The login details and URL for the +The examples folder contains an example script for every +remote api function. The login details and URL for the remote connection are defined in the file soap_config.php -------------------------------------------------------- -- GitLab From 2b67b4c720f5459754b6d90242b42de0ecc6089f Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 17 Feb 2018 21:40:41 +0100 Subject: [PATCH 0542/1368] Set a descriptive name for the return vanlue of mail_user_add(); --- interface/lib/classes/remote.d/mail.inc.php | 4 ++-- remoting_client/examples/mail_user_add.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php index eec5ff0718..c4582c634e 100644 --- a/interface/lib/classes/remote.d/mail.inc.php +++ b/interface/lib/classes/remote.d/mail.inc.php @@ -222,8 +222,8 @@ class remoting_mail extends remoting { if (!isset($params['gid'])) $params['gid'] = -1; if (!isset($params['maildir_format'])) $params['maildir_format'] = 'maildir'; - $affected_rows = $this->insertQuery('../mail/form/mail_user.tform.php', $client_id, $params); - return $affected_rows; + $mailuser_id = $this->insertQuery('../mail/form/mail_user.tform.php', $client_id, $params); + return $mailuser_id; } //* Update mail user diff --git a/remoting_client/examples/mail_user_add.php b/remoting_client/examples/mail_user_add.php index 80a7358cf9..2e9402a8e6 100644 --- a/remoting_client/examples/mail_user_add.php +++ b/remoting_client/examples/mail_user_add.php @@ -43,9 +43,9 @@ try { 'disablesmtp' => 'n' ); - $affected_rows = $client->mail_user_add($session_id, $client_id, $params); + $mailuser_id = $client->mail_user_add($session_id, $client_id, $params); - echo "New user: ".$affected_rows."
    "; + echo "New user: ".$mailuser_id."
    "; if($client->logout($session_id)) { echo 'Logged out.
    '; -- GitLab From 12e79e44e42c1bf136e6e87cb14fe184f4c15776 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 17 Feb 2018 21:42:12 +0100 Subject: [PATCH 0543/1368] correct index path --- remoting_client/readme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/remoting_client/readme b/remoting_client/readme index 92af7f8240..6e2ef10e6d 100644 --- a/remoting_client/readme +++ b/remoting_client/readme @@ -11,4 +11,4 @@ remote connection are defined in the file soap_config.php - Remote API documentation -------------------------------------------------------- -The startpage of the API documentation is main.html +The startpage of the API documentation is API-docs/index.html -- GitLab From 7b7e428903a726175191dda722a753d2f5b61e4a Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 9 Sep 2020 09:45:45 +0200 Subject: [PATCH 0544/1368] Fix typo (ported from !634) --- interface/web/admin/lib/lang/ar_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/bg_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/ca_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/cz_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/de_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/dk_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/el_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/en_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/es_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/fi_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/fr_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/hr_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/hu_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/id_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/it_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/ja_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/pl_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/pt_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/ro_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/se_directive_snippets.lng | 2 +- interface/web/admin/lib/lang/sk_directive_snippets.lng | 2 +- 21 files changed, 21 insertions(+), 21 deletions(-) diff --git a/interface/web/admin/lib/lang/ar_directive_snippets.lng b/interface/web/admin/lib/lang/ar_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/ar_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ar_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/bg_directive_snippets.lng b/interface/web/admin/lib/lang/bg_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/bg_directive_snippets.lng +++ b/interface/web/admin/lib/lang/bg_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ca_directive_snippets.lng b/interface/web/admin/lib/lang/ca_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/ca_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ca_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/cz_directive_snippets.lng b/interface/web/admin/lib/lang/cz_directive_snippets.lng index 26d17f64b3..d627dcebeb 100644 --- a/interface/web/admin/lib/lang/cz_directive_snippets.lng +++ b/interface/web/admin/lib/lang/cz_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Proměnné'; $wb['customer_viewable_txt'] = 'Dostupná volba pro klienta'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/de_directive_snippets.lng b/interface/web/admin/lib/lang/de_directive_snippets.lng index dbe3aaf8bd..0351f73df6 100644 --- a/interface/web/admin/lib/lang/de_directive_snippets.lng +++ b/interface/web/admin/lib/lang/de_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Bitte geben Sie einen Namen für den Sch $wb['directive_snippets_name_error_unique'] = 'Es existiert schon ein Direktiven-Schnipsel mit diesem Namen.'; $wb['variables_txt'] = 'Variablen'; $wb['customer_viewable_txt'] = 'Sichtbar für Kunden'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/dk_directive_snippets.lng b/interface/web/admin/lib/lang/dk_directive_snippets.lng index 1b158e5c80..154d83a48c 100644 --- a/interface/web/admin/lib/lang/dk_directive_snippets.lng +++ b/interface/web/admin/lib/lang/dk_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Angiv et navn til uddrag.'; $wb['directive_snippets_name_error_unique'] = 'Der er allerede et direktiv uddrag med dette navn.'; $wb['variables_txt'] = 'Variabler'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/el_directive_snippets.lng b/interface/web/admin/lib/lang/el_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/el_directive_snippets.lng +++ b/interface/web/admin/lib/lang/el_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/en_directive_snippets.lng b/interface/web/admin/lib/lang/en_directive_snippets.lng index da164a5318..7004caf2d6 100644 --- a/interface/web/admin/lib/lang/en_directive_snippets.lng +++ b/interface/web/admin/lib/lang/en_directive_snippets.lng @@ -8,6 +8,6 @@ $wb["directive_snippets_name_empty"] = 'Please specify a name for the snippet.'; $wb["directive_snippets_name_error_unique"] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> \ No newline at end of file diff --git a/interface/web/admin/lib/lang/es_directive_snippets.lng b/interface/web/admin/lib/lang/es_directive_snippets.lng index a5bb21b494..a637f5f6fe 100644 --- a/interface/web/admin/lib/lang/es_directive_snippets.lng +++ b/interface/web/admin/lib/lang/es_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['name_txt'] = 'Nombre del fragmento'; $wb['snippet_txt'] = 'Fragmento'; $wb['type_txt'] = 'Tipo'; $wb['variables_txt'] = 'Variables'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/fi_directive_snippets.lng b/interface/web/admin/lib/lang/fi_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/fi_directive_snippets.lng +++ b/interface/web/admin/lib/lang/fi_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/fr_directive_snippets.lng b/interface/web/admin/lib/lang/fr_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/fr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/fr_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/hr_directive_snippets.lng b/interface/web/admin/lib/lang/hr_directive_snippets.lng index 5709d6075d..0fe357d9fc 100644 --- a/interface/web/admin/lib/lang/hr_directive_snippets.lng +++ b/interface/web/admin/lib/lang/hr_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Molimo vas specificirajte naziv direktiv $wb['directive_snippets_name_error_unique'] = 'Već postoji direktiva sa tim imenom.'; $wb['variables_txt'] = 'Varijable'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/hu_directive_snippets.lng b/interface/web/admin/lib/lang/hu_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/hu_directive_snippets.lng +++ b/interface/web/admin/lib/lang/hu_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/id_directive_snippets.lng b/interface/web/admin/lib/lang/id_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/id_directive_snippets.lng +++ b/interface/web/admin/lib/lang/id_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/it_directive_snippets.lng b/interface/web/admin/lib/lang/it_directive_snippets.lng index e9a473f92e..8205305e36 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Indicare un nome per lo snippet.'; $wb['directive_snippets_name_error_unique'] = 'Esiste già una direttiva snippet con questo nome.'; $wb['variables_txt'] = 'Variabili'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ja_directive_snippets.lng b/interface/web/admin/lib/lang/ja_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/ja_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ja_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/pl_directive_snippets.lng b/interface/web/admin/lib/lang/pl_directive_snippets.lng index abef1e28fa..6c55460d5a 100644 --- a/interface/web/admin/lib/lang/pl_directive_snippets.lng +++ b/interface/web/admin/lib/lang/pl_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Wybierz nazwę dla zestawu dyrektyw'; $wb['directive_snippets_name_error_unique'] = 'Istnieje już zestaw dyrektyw o podanej nazwie'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/pt_directive_snippets.lng b/interface/web/admin/lib/lang/pt_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/pt_directive_snippets.lng +++ b/interface/web/admin/lib/lang/pt_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/ro_directive_snippets.lng b/interface/web/admin/lib/lang/ro_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/ro_directive_snippets.lng +++ b/interface/web/admin/lib/lang/ro_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/se_directive_snippets.lng b/interface/web/admin/lib/lang/se_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/se_directive_snippets.lng +++ b/interface/web/admin/lib/lang/se_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> diff --git a/interface/web/admin/lib/lang/sk_directive_snippets.lng b/interface/web/admin/lib/lang/sk_directive_snippets.lng index 071d6f4fed..6e7c1ac3c6 100644 --- a/interface/web/admin/lib/lang/sk_directive_snippets.lng +++ b/interface/web/admin/lib/lang/sk_directive_snippets.lng @@ -8,6 +8,6 @@ $wb['directive_snippets_name_empty'] = 'Please specify a name for the snippet.'; $wb['directive_snippets_name_error_unique'] = 'There is already a directive snippet with this name.'; $wb['variables_txt'] = 'Variables'; $wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Requiered PHP Snippet'; +$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; $wb['update_sites_txt'] = 'Update sites using this snippet'; ?> -- GitLab From 54dd36eb0fc627e7bdf98e36c1281e52318a7686 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Mon, 15 Oct 2018 14:56:35 +0200 Subject: [PATCH 0545/1368] Do not show db or site quota when the sites module is not active Cherry-picked from !825 after master change. --- interface/web/dashboard/dashlets/databasequota.php | 5 +++++ interface/web/dashboard/dashlets/quota.php | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/interface/web/dashboard/dashlets/databasequota.php b/interface/web/dashboard/dashlets/databasequota.php index d8c131702f..8c5c360c23 100644 --- a/interface/web/dashboard/dashlets/databasequota.php +++ b/interface/web/dashboard/dashlets/databasequota.php @@ -11,6 +11,11 @@ class dashlet_databasequota { return; } + $modules = $_SESSION['s']['user']['modules']; + if (!in_array($modules, 'sites')) { + return ''; + } + $tpl = new tpl; $tpl->newTemplate("dashlets/templates/databasequota.htm"); diff --git a/interface/web/dashboard/dashlets/quota.php b/interface/web/dashboard/dashlets/quota.php index 3fd5adbb85..8179e4ead5 100644 --- a/interface/web/dashboard/dashlets/quota.php +++ b/interface/web/dashboard/dashlets/quota.php @@ -11,6 +11,11 @@ class dashlet_quota { return; } + $modules = $_SESSION['s']['user']['modules']; + if (!in_array($modules, 'sites')) { + return ''; + } + $tpl = new tpl; $tpl->newTemplate("dashlets/templates/quota.htm"); -- GitLab From b0867b430049854c2194f6b1cecc4c0bfe3c669f Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 5 Oct 2018 16:16:42 +0200 Subject: [PATCH 0546/1368] My first translation update Cherry-picked from !826 after master change. --- interface/web/tools/lib/lang/nl_index.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/tools/lib/lang/nl_index.lng b/interface/web/tools/lib/lang/nl_index.lng index a3ef38f219..6c82e4db99 100644 --- a/interface/web/tools/lib/lang/nl_index.lng +++ b/interface/web/tools/lib/lang/nl_index.lng @@ -1,4 +1,4 @@ -- GitLab From a3471bc8fa49d734099cbf2ebfcc412560515227 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 26 Jan 2019 21:52:36 +0100 Subject: [PATCH 0547/1368] Create a util function to remove duplication Lost on master(!866) ... now on cherry-picked on !1132 --- interface/lib/classes/auth.inc.php | 30 +++++++++++++++++++ .../lib/classes/validate_password.inc.php | 6 ++-- interface/web/login/password_reset.php | 3 +- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/interface/lib/classes/auth.inc.php b/interface/lib/classes/auth.inc.php index 5daabd50b3..c117e53707 100644 --- a/interface/lib/classes/auth.inc.php +++ b/interface/lib/classes/auth.inc.php @@ -198,6 +198,36 @@ class auth { } + /** + * Get the minimum password length. + */ + public function get_min_password_length() { + global $app; + $server_config_array = $app->getconf->get_global_config(); + $min_password_length = 8; + if(isset($server_config_array['misc']['min_password_length'])) $min_password_length = $server_config_array['misc']['min_password_length']; + return $min_password_length; + } + + /** + * Get the minimum password strength. + */ + public function get_min_password_strength() { + global $app; + $server_config_array = $app->getconf->get_global_config(); + $min_password_strength = 0; + if(isset($server_config_array['misc']['min_password_strength'])) $min_password_strength = $server_config_array['misc']['min_password_strength'];; + return $min_password_strength; + } + + /** + * Generate a ranmdom password. + * + * @param int $minLength + * Minimum number of characters. + * @param boolean $special + * Include special characters, like # and ! + */ public function get_random_password($minLength = 8, $special = false) { if($minLength < 8) $minLength = 8; $maxLength = $minLength + 5; diff --git a/interface/lib/classes/validate_password.inc.php b/interface/lib/classes/validate_password.inc.php index a0f6de2e96..fc7b969843 100644 --- a/interface/lib/classes/validate_password.inc.php +++ b/interface/lib/classes/validate_password.inc.php @@ -111,10 +111,8 @@ class validate_password { $app->uses('ini_parser,getconf'); $server_config_array = $app->getconf->get_global_config(); - $min_password_strength = 0; - $min_password_length = 5; - if(isset($server_config_array['misc']['min_password_length'])) $min_password_length = $server_config_array['misc']['min_password_length']; - if(isset($server_config_array['misc']['min_password_strength'])) $min_password_strength = $server_config_array['misc']['min_password_strength']; + $min_password_length = $app->auth->get_min_password_length(); + $min_password_strength = $app->auth->get_min_password_strength(); if($min_password_strength > 0) { $lng_text = $app->lng('weak_password_txt'); diff --git a/interface/web/login/password_reset.php b/interface/web/login/password_reset.php index 0a15b0c52b..f14548dd91 100644 --- a/interface/web/login/password_reset.php +++ b/interface/web/login/password_reset.php @@ -126,8 +126,7 @@ if(isset($_POST['username']) && $_POST['username'] != '' && $_POST['email'] != ' } elseif ($continue) { if($client['client_id'] > 0) { $server_config_array = $app->getconf->get_global_config(); - $min_password_length = 8; - if(isset($server_config_array['misc']['min_password_length'])) $min_password_length = $server_config_array['misc']['min_password_length']; + $min_password_length = $app->auth->get_min_password_length(); $new_password = $app->auth->get_random_password($min_password_length, true); $new_password_encrypted = $app->auth->crypt_password($new_password); -- GitLab From e5d4f276279d5a81181b2e539efc9c3cbfd3a997 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 9 Sep 2020 12:16:47 +0200 Subject: [PATCH 0548/1368] - fixed variable typo from !1128 --- server/lib/classes/letsencrypt.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 5a4217d697..fb67e7c00d 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -386,7 +386,7 @@ class letsencrypt { } $caa_records = @dns_get_record($caa_domain, DNS_CAA); // requieres PHP 7.0.16, 7.1.2 if(is_array($caa_records) && !empty($caa_records)) { - foreach ($records as $record) { + foreach ($caa_records as $record) { if($record['value'] == 'letsencrypt.org') $caa_check = true; } } else { -- GitLab From 9a910404b384aa843d35e86254e715ced14c7751 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 9 Sep 2020 13:31:15 +0200 Subject: [PATCH 0549/1368] Apply 1 suggestion(s) to 1 file(s) --- interface/lib/classes/auth.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/auth.inc.php b/interface/lib/classes/auth.inc.php index c117e53707..d5dcfd1fe4 100644 --- a/interface/lib/classes/auth.inc.php +++ b/interface/lib/classes/auth.inc.php @@ -216,7 +216,7 @@ class auth { global $app; $server_config_array = $app->getconf->get_global_config(); $min_password_strength = 0; - if(isset($server_config_array['misc']['min_password_strength'])) $min_password_strength = $server_config_array['misc']['min_password_strength'];; + if(isset($server_config_array['misc']['min_password_strength'])) $min_password_strength = $server_config_array['misc']['min_password_strength']; return $min_password_strength; } -- GitLab From 0d4245619de2bc2bde9211f1dde75298702d2da6 Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 9 Sep 2020 14:05:34 +0200 Subject: [PATCH 0550/1368] Add french templates for conf/mail (Backport from !890) --- server/conf/mail/db_quota_notification_fr.txt | 13 +++++++++++++ server/conf/mail/db_quota_ok_notification_fr.txt | 13 +++++++++++++ server/conf/mail/mail_quota_notification_fr.txt | 14 ++++++++++++++ server/conf/mail/mail_quota_ok_notification_fr.txt | 14 ++++++++++++++ server/conf/mail/web_quota_notification_fr.txt | 14 ++++++++++++++ server/conf/mail/web_quota_ok_notification_fr.txt | 14 ++++++++++++++ server/conf/mail/web_traffic_notification_fr.txt | 8 ++++++++ server/conf/mail/welcome_email_fr.txt | 4 ++++ 8 files changed, 94 insertions(+) create mode 100644 server/conf/mail/db_quota_notification_fr.txt create mode 100644 server/conf/mail/db_quota_ok_notification_fr.txt create mode 100644 server/conf/mail/mail_quota_notification_fr.txt create mode 100644 server/conf/mail/mail_quota_ok_notification_fr.txt create mode 100644 server/conf/mail/web_quota_notification_fr.txt create mode 100644 server/conf/mail/web_quota_ok_notification_fr.txt create mode 100644 server/conf/mail/web_traffic_notification_fr.txt create mode 100644 server/conf/mail/welcome_email_fr.txt diff --git a/server/conf/mail/db_quota_notification_fr.txt b/server/conf/mail/db_quota_notification_fr.txt new file mode 100644 index 0000000000..c48a1a2a9a --- /dev/null +++ b/server/conf/mail/db_quota_notification_fr.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Notification de quota de base de données + +La base de données {database_name} a atteint ou est sur le point d'atteindre son quota maximum. + +Base de données : {database_name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/db_quota_ok_notification_fr.txt b/server/conf/mail/db_quota_ok_notification_fr.txt new file mode 100644 index 0000000000..573e9e9a0b --- /dev/null +++ b/server/conf/mail/db_quota_ok_notification_fr.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Quota de base de données ok + +La base de données {database_name} n'est plus à la limite de son quota. + +Base de données : {database_name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/mail_quota_notification_fr.txt b/server/conf/mail/mail_quota_notification_fr.txt new file mode 100644 index 0000000000..74d9188f83 --- /dev/null +++ b/server/conf/mail/mail_quota_notification_fr.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Notification de quota de votre compte email + +Le compte email {email} a atteint ou est sur le point d'atteindre son quota maximum. + +Compte email : {email} +Nom : {name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/mail_quota_ok_notification_fr.txt b/server/conf/mail/mail_quota_ok_notification_fr.txt new file mode 100644 index 0000000000..44ed789bd8 --- /dev/null +++ b/server/conf/mail/mail_quota_ok_notification_fr.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Quota de votre compte email ok + +Le compte email {email} n'est plus à la limite de son quota. + +Compte email : {email} +Nom : {name} +Espace utilisé : {used} +Quota : {quota} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/web_quota_notification_fr.txt b/server/conf/mail/web_quota_notification_fr.txt new file mode 100644 index 0000000000..b6869424f4 --- /dev/null +++ b/server/conf/mail/web_quota_notification_fr.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Notification de quota de votre espace web + +Le site web {domain} a atteint ou est sur le point d'atteindre son quota maximum. + +Domaine : {domain} +Espace utilisé : {used} +Limite souple : {soft} +Limite stricte : {hard} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/web_quota_ok_notification_fr.txt b/server/conf/mail/web_quota_ok_notification_fr.txt new file mode 100644 index 0000000000..ee6823de90 --- /dev/null +++ b/server/conf/mail/web_quota_ok_notification_fr.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Quota de votre espace web ok + +Le site web {domain} n'est plus à la limite de son quota. + +Domaine : {domain} +Espace utilisé : {used} +Limite souple : {soft} +Limite stricte : {hard} +Ratio d'utilisation : {ratio} diff --git a/server/conf/mail/web_traffic_notification_fr.txt b/server/conf/mail/web_traffic_notification_fr.txt new file mode 100644 index 0000000000..8318df424a --- /dev/null +++ b/server/conf/mail/web_traffic_notification_fr.txt @@ -0,0 +1,8 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Notification de trafic web dépassé - site désactivé + +Le site web {domain} a dépassé sa limite de trafic et a été désactivé. diff --git a/server/conf/mail/welcome_email_fr.txt b/server/conf/mail/welcome_email_fr.txt new file mode 100644 index 0000000000..beb2b30080 --- /dev/null +++ b/server/conf/mail/welcome_email_fr.txt @@ -0,0 +1,4 @@ +From: ISPConfig +Subject: Bienvenue dans votre nouvelle boîte aux lettres + +Votre nouveau compte email est désormais activé. Votre webmaster. -- GitLab From 9deb193d38df62de62a45b49615b09ab22bdc00a Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 9 Sep 2020 14:12:20 +0200 Subject: [PATCH 0551/1368] Add dutch quota notifications --- server/conf/mail/db_quota_notification_nl.txt | 13 +++++++++++++ server/conf/mail/db_quota_ok_notification_nl.txt | 13 +++++++++++++ server/conf/mail/mail_quota_notification_nl.txt | 14 ++++++++++++++ server/conf/mail/mail_quota_ok_notification_nl.txt | 14 ++++++++++++++ server/conf/mail/web_quota_notification_nl.txt | 14 ++++++++++++++ server/conf/mail/web_quota_ok_notification_nl.txt | 14 ++++++++++++++ server/conf/mail/web_traffic_notification_nl.txt | 8 ++++++++ 7 files changed, 90 insertions(+) create mode 100644 server/conf/mail/db_quota_notification_nl.txt create mode 100644 server/conf/mail/db_quota_ok_notification_nl.txt create mode 100644 server/conf/mail/mail_quota_notification_nl.txt create mode 100644 server/conf/mail/mail_quota_ok_notification_nl.txt create mode 100644 server/conf/mail/web_quota_notification_nl.txt create mode 100644 server/conf/mail/web_quota_ok_notification_nl.txt create mode 100644 server/conf/mail/web_traffic_notification_nl.txt diff --git a/server/conf/mail/db_quota_notification_nl.txt b/server/conf/mail/db_quota_notification_nl.txt new file mode 100644 index 0000000000..4706294f74 --- /dev/null +++ b/server/conf/mail/db_quota_notification_nl.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Database quota notificatie + +De database {database_name} heeft (bijna) het opslaglimiet bereikt. + +Database: {database_name} +Used space: {used} +Quota: {quota} +Usage ratio: {ratio} diff --git a/server/conf/mail/db_quota_ok_notification_nl.txt b/server/conf/mail/db_quota_ok_notification_nl.txt new file mode 100644 index 0000000000..b0babbd6ca --- /dev/null +++ b/server/conf/mail/db_quota_ok_notification_nl.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Database quota ok + +De database {database_name} heeft niet meer (bijna) het opslaglimiet bereikt. + +Database: {database_name} +Used space: {used} +Quota: {quota} +Usage ratio: {ratio} diff --git a/server/conf/mail/mail_quota_notification_nl.txt b/server/conf/mail/mail_quota_notification_nl.txt new file mode 100644 index 0000000000..3afafa2595 --- /dev/null +++ b/server/conf/mail/mail_quota_notification_nl.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Mailbox quota notification + +De mailbox {email} heeft (bijna) het opslaglimiet bereikt. + +Mailbox: {email} +Name: {name} +Used space: {used} +Quota: {quota} +Usage ratio: {ratio} diff --git a/server/conf/mail/mail_quota_ok_notification_nl.txt b/server/conf/mail/mail_quota_ok_notification_nl.txt new file mode 100644 index 0000000000..9a82a231e0 --- /dev/null +++ b/server/conf/mail/mail_quota_ok_notification_nl.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Mailbox quota ok + +De mailbox {email} is niet meer (bijna) vol. + +Mailbox: {email} +Name: {name} +Used space: {used} +Quota: {quota} +Usage ratio: {ratio} diff --git a/server/conf/mail/web_quota_notification_nl.txt b/server/conf/mail/web_quota_notification_nl.txt new file mode 100644 index 0000000000..740637660b --- /dev/null +++ b/server/conf/mail/web_quota_notification_nl.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Website quota notification + +De website {domain} heeft (bijna) het opslaglimiet bereikt. + +Domain: {domain} +Used space: {used} +Soft limit: {soft} +Hard limit: {hard} +Usage ratio: {ratio} diff --git a/server/conf/mail/web_quota_ok_notification_nl.txt b/server/conf/mail/web_quota_ok_notification_nl.txt new file mode 100644 index 0000000000..086f3c0f73 --- /dev/null +++ b/server/conf/mail/web_quota_ok_notification_nl.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Website quota ok + +De website {domain} is niet langer (bijna) buiten het opslaglimiet. + +Domain: {domain} +Used space: {used} +Soft limit: {soft} +Hard limit: {hard} +Usage ratio: {ratio} diff --git a/server/conf/mail/web_traffic_notification_nl.txt b/server/conf/mail/web_traffic_notification_nl.txt new file mode 100644 index 0000000000..89047b206b --- /dev/null +++ b/server/conf/mail/web_traffic_notification_nl.txt @@ -0,0 +1,8 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Webverkeerslimiet bereikt + +De website {domain} heeft het verkeerslimiet voor deze maand bereikt en is uitgeschakeld. -- GitLab From 29478d386d5ed46884d7e050131581dab2cb8a3c Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 9 Sep 2020 14:15:23 +0200 Subject: [PATCH 0552/1368] Add changes from install/tpl --- server/conf/apache_ispconfig.conf.master | 142 ++++++++++++++--------- 1 file changed, 84 insertions(+), 58 deletions(-) diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master index 040de23625..688283f50e 100644 --- a/server/conf/apache_ispconfig.conf.master +++ b/server/conf/apache_ispconfig.conf.master @@ -15,24 +15,24 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - + + Require all denied + + Order Deny,Allow + Deny from all + # Do not allow access to the root file system of the server for security reasons - Options -Indexes + Options -Indexes AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - + + Require all denied + + Order Deny,Allow + Deny from all + @@ -41,103 +41,103 @@ CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m AllowOverride None - - Require all denied - - Order Deny,Allow - Deny from all - + + Require all denied + + Order Deny,Allow + Deny from all + # Except of the following directories that contain website scripts - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + # Allow access to mailman on OpenSuSE - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + Options +FollowSymLinks - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + # allow path to awstats and alias for awstats icons - - Require all granted - + + Require all granted + Order allow,deny Allow from all - + Alias /awstats-icon "/usr/share/awstats/icon" Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-known/acme-challenge - - Require all granted - + + Require all granted + Order allow,deny Allow from all - - - AssignUserId - + + + AssignUserId www-data www-data + NameVirtualHost *:80 @@ -145,3 +145,29 @@ NameVirtualHost *:443 NameVirtualHost {tmpl_var name="ip_address"}:{tmpl_var name="port"} + + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + + + + AllowOverride None + + Require all denied + + Order Deny,Allow + Deny from all + + + + + AllowOverride None + + Require all denied + + Order Deny,Allow + Deny from all + + -- GitLab From 21a4b5944f2f4695e7c30284958678b272937ff1 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 19 Apr 2017 11:08:34 +0000 Subject: [PATCH 0553/1368] Merge branch 'master' into 'master' handle the server/plugins-enabled folder based on enabled/disbaled services See merge request !582 (cherry picked from commit 3e83d19985b1124702cd6a06c8e7486ade99798b) f22fd0ee handle the server/plugins-enabled folder based on enabled/disbaled services --- .../server_services_plugin.inc.php | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 server/plugins-available/server_services_plugin.inc.php diff --git a/server/plugins-available/server_services_plugin.inc.php b/server/plugins-available/server_services_plugin.inc.php new file mode 100644 index 0000000000..29710a7285 --- /dev/null +++ b/server/plugins-available/server_services_plugin.inc.php @@ -0,0 +1,155 @@ +plugins->registerEvent('server_insert', 'server_services_plugin', 'insert'); + $app->plugins->registerEvent('server_update', 'server_services_plugin', 'update'); + $app->plugins->registerEvent('server_delete', 'server_services_delete', 'delete'); + + } + + function insert($event_name, $data) { + + $this->update($event_name, $data); + + } + + function delete($event_name, $data) { + + $this->update($event_name, $data); + + } + + function update($event_name, $data) { + global $app, $conf; + + $app->uses('getconf'); + $old_services = array(); + $new_services = array(); + foreach($this->services as $service) { + $old_services[$service] = $data['old'][$service]; + $new_services[$service] = $data['new'][$service]; + } + $changed_services=array_diff_assoc($new_services,$old_services); + foreach($changed_services as $service => $value) { + switch($service) { + case 'mail_server': + $config = $app->getconf->get_server_config($conf['server_id'], 'mail'); + $plugins = @($config['pop3_imap_daemon'] == 'dovecot')?$this->dovecot_plugins:$this->courier_plugins; + $plugins = array_merge($plugins, $this->mail_plugins); + $this->change_state($plugins, $value, $config); + break; + case 'web_server': + $config = $app->getconf->get_server_config($conf['server_id'], 'web'); + $plugins = @($config['server_type'] == 'apache')?$this->apache_plugins:$this->nginx_plugins; + $plugins = array_merge($plugins, $this->web_plugins); + $this->change_state($plugins, $value, $config); + break; + case 'dns_server': + $config = $app->getconf->get_server_config($conf['server_id'], 'dns'); + $plugins = @(isset($config['bind_user']))?$this->bind_plugins:$this->powerdns_plugins; + $this->change_state($plugins, $value, $config); + break; + case 'db_server': + $this->change_state($this->db_plugins, $value, $config); + break; + case 'vserver_server': + $this->change_state($this->openvz_plugins, $value, $config); + break; + case 'xmpp_server': + $this->change_state($this->xmpp_plugins, $value, $config); + break; + } + } + + } + + function change_state($plugins, $value, $config) { + + $enabled_dir = '/usr/local/ispconfig/server/plugins-enabled/'; + $available_dir = '/usr/local/ispconfig/server/plugins-available/'; + + if($value == 0) { //* disable services + foreach($plugins as $plugin) { + if(is_link($enabled_dir.$plugin.'.inc.php')) { + unlink($enabled_dir.$plugin.'.inc.php'); + } + } + } + if ($value == 1) { //* enable services + foreach($plugins as $plugin) { + if(is_file($available_dir.$plugin.'.inc.php') && !is_link($enabled_dir.$plugin.'.inc.php')) { + symlink($available_dir.$plugin.'.inc.php', $enabled_dir.$plugin.'.inc.php'); + } + } + } + + } + +} // end class + + + +?> -- GitLab From c53649d357a40252fbf26655b6cc341818632307 Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 9 Sep 2020 15:17:36 +0200 Subject: [PATCH 0554/1368] Update login string (Backport from !654) --- interface/web/login/lib/lang/pl.lng | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/login/lib/lang/pl.lng b/interface/web/login/lib/lang/pl.lng index 2367ede54d..6f177dd29d 100644 --- a/interface/web/login/lib/lang/pl.lng +++ b/interface/web/login/lib/lang/pl.lng @@ -15,7 +15,7 @@ $wb['error_user_too_many_logins'] = 'Zbyt dużo niepoprawnych logowań. Prosimy $wb['username_txt'] = 'Nazwa użytkownika'; $wb['password_txt'] = 'Hasło'; $wb['login_button_txt'] = 'Zaloguj'; -$wb['login_txt'] = 'Login'; +$wb['login_txt'] = 'Zaloguj'; $wb['pw_lost_txt'] = 'Zapomniałem hasła'; $wb['pw_reset_txt'] = 'Reset hasła'; $wb['pw_button_txt'] = 'Prześlij hasło ponownie'; -- GitLab From 039db24f9a900b4b2c0141bfd5eb6d665dc19ed6 Mon Sep 17 00:00:00 2001 From: Robert Breithuber Date: Wed, 9 Sep 2020 17:59:52 +0200 Subject: [PATCH 0555/1368] makes the language configurable for each site, it reads the "Lang" parameter from awstats.DOMAIN.conf before it gets deleted and adds the parameter to the content before the new config file is written. the "-lang" parameter is removed from the awstats-command, so the global value for lang in awstats.conf.local or the value in awstats.DOMAIN.conf gets respected. Closes #3668 --- server/lib/classes/cron.d/150-awstats.inc.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/server/lib/classes/cron.d/150-awstats.inc.php b/server/lib/classes/cron.d/150-awstats.inc.php index 891919cb02..2edf0222f0 100644 --- a/server/lib/classes/cron.d/150-awstats.inc.php +++ b/server/lib/classes/cron.d/150-awstats.inc.php @@ -86,7 +86,14 @@ class cronjob_awstats extends cronjob { $awstats_conf_dir = $web_config['awstats_conf_dir']; $awstats_website_conf_file = $web_config['awstats_conf_dir'].'/awstats.'.$domain.'.conf'; - if(is_file($awstats_website_conf_file)) unlink($awstats_website_conf_file); + $existing_awstats_conf_array = array(); + if(is_file($awstats_website_conf_file)) { + $existing_awstats_conf = file($awstats_website_conf_file); + foreach ($existing_awstats_conf as $line) { + if(preg_match("/Lang=/",$line)) $existing_awstats_conf_array['Lang'] = implode('',parse_ini_string($line)); + } + unlink($awstats_website_conf_file); + } $sql = "SELECT domain FROM web_domain WHERE (type = 'alias' OR type = 'subdomain') AND parent_domain_id = ?"; $aliases = $app->db->queryAllRecords($sql, $rec['domain_id']); @@ -108,6 +115,8 @@ class cronjob_awstats extends cronjob { LogFile="/var/log/ispconfig/httpd/'.$domain.'/yesterday-access.log" SiteDomain="'.$domain.'" HostAliases="www.'.$domain.' localhost 127.0.0.1'.$aliasdomain.'"'; + if (array_key_exists('Lang',$existing_awstats_conf_array)) $awstats_conf_file_content .=' + Lang="'.$existing_awstats_conf_array['Lang'].'"'; if (isset($include_file)) { file_put_contents($awstats_website_conf_file, $awstats_conf_file_content); } else { @@ -134,7 +143,7 @@ class cronjob_awstats extends cronjob { } } - $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -lang=' . escapeshellarg($conf['language']) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl); + $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl) . '"; if (date("d") == 2) { $awmonth = date("m")-1; -- GitLab From 9bd65ce93757ccbb273b013abf8d1ba2d01a3e4b Mon Sep 17 00:00:00 2001 From: thom Date: Wed, 9 Sep 2020 20:56:34 +0200 Subject: [PATCH 0556/1368] Use user and group ispconfig for mpm_itk --- install/tpl/apache_ispconfig.conf.master | 2 +- server/conf/apache_ispconfig.conf.master | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install/tpl/apache_ispconfig.conf.master b/install/tpl/apache_ispconfig.conf.master index 688283f50e..8c2292d6a3 100644 --- a/install/tpl/apache_ispconfig.conf.master +++ b/install/tpl/apache_ispconfig.conf.master @@ -136,7 +136,7 @@ Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-know Allow from all - AssignUserId www-data www-data + AssignUserId ispconfig ispconfig diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master index 688283f50e..8c2292d6a3 100644 --- a/server/conf/apache_ispconfig.conf.master +++ b/server/conf/apache_ispconfig.conf.master @@ -136,7 +136,7 @@ Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-know Allow from all - AssignUserId www-data www-data + AssignUserId ispconfig ispconfig -- GitLab From 102a8bfcd55cf2b663e257bcd9a29d6516ba32ae Mon Sep 17 00:00:00 2001 From: Robert Breithuber Date: Wed, 9 Sep 2020 21:04:42 +0200 Subject: [PATCH 0557/1368] Update 150-awstats.inc.php --- server/lib/classes/cron.d/150-awstats.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/150-awstats.inc.php b/server/lib/classes/cron.d/150-awstats.inc.php index 2edf0222f0..cd981baf8a 100644 --- a/server/lib/classes/cron.d/150-awstats.inc.php +++ b/server/lib/classes/cron.d/150-awstats.inc.php @@ -143,7 +143,7 @@ class cronjob_awstats extends cronjob { } } - $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl) . '"; + $command = escapeshellcmd($awstats_buildstaticpages_pl) . ' -month=' . escapeshellarg($awmonth) . ' -year=' . escapeshellarg($awyear) . ' -update -config=' . escapeshellarg($domain) . ' -dir=' . escapeshellarg($statsdir) . ' -awstatsprog=' . escapeshellarg($awstats_pl); if (date("d") == 2) { $awmonth = date("m")-1; -- GitLab From 8cb465c7118e02358504f6350b723acedef86f84 Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 10 Sep 2020 11:50:17 +0200 Subject: [PATCH 0558/1368] Change date format (Ported from !621) --- interface/lib/lang/cz.lng | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/lib/lang/cz.lng b/interface/lib/lang/cz.lng index 058475169b..96df701ac7 100644 --- a/interface/lib/lang/cz.lng +++ b/interface/lib/lang/cz.lng @@ -1,9 +1,9 @@ 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +?> -- GitLab From ea591d477d281455b0dcc82a135d0ded7c0e4819 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 10 Sep 2020 12:37:26 +0200 Subject: [PATCH 0559/1368] Update ispconfig_update.php --- server/scripts/ispconfig_update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/scripts/ispconfig_update.php b/server/scripts/ispconfig_update.php index e0e75e529f..ed416b6efa 100644 --- a/server/scripts/ispconfig_update.php +++ b/server/scripts/ispconfig_update.php @@ -86,7 +86,7 @@ echo " _____ ___________ _____ __ _ |___/ "; echo "\n".str_repeat('-', 80)."\n"; echo "\n\n>> Update \n\n"; -echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: Enable maintenance mode and update your master server first. Then update all slave servers, and disable maintenance mode when all servers are updated.\n\n"; +echo "Please choose the update method. For production systems select 'stable'. \nWARNING: The update from GIT is only for development systems and may break your current setup. Do not use the GIT version on servers that host any live websites!\nNote: On Multiserver systems, enable maintenance mode and update your master server first. Then update all slave servers, and disable maintenance mode when all servers are updated.\n\n"; $method = simple_query('Select update method', array('stable', 'nightly', 'git-develop'), 'stable'); -- GitLab From f2b3943342a461b0091c6fd248dbc645e08d8428 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Thu, 10 Sep 2020 15:38:58 +0200 Subject: [PATCH 0560/1368] modified move function --- server/lib/classes/system.inc.php | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 2c73a9198e..cb0a812703 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -934,18 +934,12 @@ class system{ return copy($file1, $file2); } - function move($file1, $file2) { - if(file_exists($file1) || is_link($file1) && is_dir(realpath(dirname($file2)))) { - if(copy($file1, $file2)) { - return unlink($file1); - } else { - $app->log("move failed: couldn't move file/link " .$file1. " to " .$file2, LOGLEVEL_DEBUG); - return false; - } - } else { - $app->log("move failed: source " .$file1. " doesn't exist.", LOGLEVEL_DEBUG); - return false; + function move($file1, $file2) { + $result = $this->copy($file1, $file2); + if($result) { + $result &= $this->unlink($file1); } + return $result; } function touch($file, $allow_symlink = false){ -- GitLab From bd38e5d64e8b4a0c4bae55b8ea3138d0416ed80b Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Thu, 10 Sep 2020 15:53:36 +0200 Subject: [PATCH 0561/1368] use move instead of copy in stats cronjobs #5723 --- server/lib/classes/cron.d/150-awstats.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/150-awstats.inc.php b/server/lib/classes/cron.d/150-awstats.inc.php index 891919cb02..76015667d5 100644 --- a/server/lib/classes/cron.d/150-awstats.inc.php +++ b/server/lib/classes/cron.d/150-awstats.inc.php @@ -149,7 +149,7 @@ class cronjob_awstats extends cronjob { } $files = scandir($statsdir); foreach ($files as $file) { - if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") copy("$statsdir"."/"."$file", "$statsdirold"."$file"); + if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->move("$statsdir"."/"."$file", "$statsdirold"."$file"); } } -- GitLab From 2210bdea83de8da1467085f652501db8ec8ea8d9 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Thu, 10 Sep 2020 16:36:12 +0200 Subject: [PATCH 0562/1368] remove index.php from files array before moving any files --- server/lib/classes/cron.d/150-awstats.inc.php | 5 +++++ server/lib/classes/cron.d/150-goaccess.inc.php | 3 +++ 2 files changed, 8 insertions(+) diff --git a/server/lib/classes/cron.d/150-awstats.inc.php b/server/lib/classes/cron.d/150-awstats.inc.php index 76015667d5..7bead9e5df 100644 --- a/server/lib/classes/cron.d/150-awstats.inc.php +++ b/server/lib/classes/cron.d/150-awstats.inc.php @@ -148,6 +148,11 @@ class cronjob_awstats extends cronjob { mkdir($statsdirold); } $files = scandir($statsdir); + + if (($key = array_search('index.php', $files)) !== false) { + unset($files[$key]); + } + foreach ($files as $file) { if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->move("$statsdir"."/"."$file", "$statsdirold"."$file"); } diff --git a/server/lib/classes/cron.d/150-goaccess.inc.php b/server/lib/classes/cron.d/150-goaccess.inc.php index 10e33d462c..fa09ef4d75 100644 --- a/server/lib/classes/cron.d/150-goaccess.inc.php +++ b/server/lib/classes/cron.d/150-goaccess.inc.php @@ -170,6 +170,9 @@ class cronjob_goaccess extends cronjob { } $files = scandir($statsdir); + if (($key = array_search('index.php', $files)) !== false) { + unset($files[$key]); + } foreach ($files as $file) { if (substr($file, 0, 1) != "." && !is_dir("$statsdir"."/"."$file") && substr($file, 0, 1) != "w" && substr($file, 0, 1) != "i") $app->system->move("$statsdir"."/"."$file", "$statsdirold"."$file"); -- GitLab From 85f0039708dfc34bd368648b83d24e05ca93da9a Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 10 Sep 2020 16:57:53 +0200 Subject: [PATCH 0563/1368] Changed version number from 3.1dev to 3.2dev --- install/sql/ispconfig3.sql | 2 +- install/tpl/config.inc.php.master | 2 +- interface/lib/config.inc.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 08fa18c371..2901bb5af8 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -2582,7 +2582,7 @@ INSERT INTO `sys_user` (`userid`, `sys_userid`, `sys_groupid`, `sys_perm_user`, -- Dumping data for table `sys_config` -- -INSERT INTO sys_config VALUES ('db','db_version','3.1dev'); +INSERT INTO sys_config VALUES ('db','db_version','3.2dev'); INSERT INTO sys_config VALUES ('interface','session_timeout','0'); SET FOREIGN_KEY_CHECKS = 1; diff --git a/install/tpl/config.inc.php.master b/install/tpl/config.inc.php.master index 8cc70a598d..2c2e040a4b 100644 --- a/install/tpl/config.inc.php.master +++ b/install/tpl/config.inc.php.master @@ -55,7 +55,7 @@ $revision = str_replace(array('Revision:','$',' '), '', $svn_revision); //** Application define('ISPC_APP_TITLE', 'ISPConfig'); -define('ISPC_APP_VERSION', '3.1dev'); +define('ISPC_APP_VERSION', '3.2dev'); define('DEVSYSTEM', 0); diff --git a/interface/lib/config.inc.php b/interface/lib/config.inc.php index 3c534f3f21..dcaf2e5358 100644 --- a/interface/lib/config.inc.php +++ b/interface/lib/config.inc.php @@ -45,7 +45,7 @@ $revision = str_replace(array('Revision:', '$', ' '), '', $svn_revision); //** Application define('ISPC_APP_TITLE', 'ISPConfig'); -define('ISPC_APP_VERSION', '3.1dev'); +define('ISPC_APP_VERSION', '3.2dev'); define('DEVSYSTEM', 0); -- GitLab From 7fe2864dbf921b6aea191e6af90c3924c6899390 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 5 Nov 2018 14:57:26 +0000 Subject: [PATCH 0564/1368] Merge branch 'master' into 'master' Add website_symlink_plugin.inc.php See merge request ispconfig/ispconfig3!838 (cherry picked from commit ea9f8ef673ac835db11af4e4633849f3396bef93) 2cd49f48 Add website_symlink_plugin.inc.php f9626973 Update website_symlink_plugin.inc.php --- .../website_symlink_plugin.inc.php | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 server/plugins-available/website_symlink_plugin.inc.php diff --git a/server/plugins-available/website_symlink_plugin.inc.php b/server/plugins-available/website_symlink_plugin.inc.php new file mode 100644 index 0000000000..a17732c5e4 --- /dev/null +++ b/server/plugins-available/website_symlink_plugin.inc.php @@ -0,0 +1,80 @@ + ../../web + */ +class website_symlink_plugin { + + var $plugin_name = 'website_symlink_plugin'; + var $class_name = 'website_symlink_plugin'; + + public function onInstall() { + global $conf; + + // Enable the following code section to activate the plugin automatically at install time + /* + if ($conf['services']['web'] == true) { + return true; + } + */ + + return false; + } + + public function onLoad() { + global $app; + + $app->plugins->registerEvent('web_domain_insert', $this->plugin_name, 'createSymlinkForWebDomain'); + $app->plugins->registerEvent('web_domain_update', $this->plugin_name, 'createSymlinkForWebDomain'); + + $app->plugins->registerEvent('shell_user_insert', $this->plugin_name, 'createSymlinkForShellUser'); + $app->plugins->registerEvent('shell_user_update', $this->plugin_name, 'createSymlinkForShellUser'); + } + + public function createSymlinkForWebDomain($event_name, $data) { + $homeDirectories = glob(sprintf('%s/home', $data['new']['document_root']) . '/*', GLOB_ONLYDIR); + + foreach ($homeDirectories as $dir) { + $target = sprintf('%s/web', $data['new']['document_root']); + $link = sprintf('%s/website', $dir); + + $this->createSymlink($target, $link); + } + } + + public function createSymlinkForShellUser($event_name, $data) { + $target = sprintf('%s/web', $data['new']['dir']); + $link = sprintf('%s/home/%s/website', $data['new']['dir'], $data['new']['username']); + + $this->createSymlink($target, $link); + } + + private function createSymlink($target, $link) { + global $app; + + if (file_exists($link)) { + $app->log(sprintf('Not creating symlink because "%s" already exists', $link), LOGLEVEL_DEBUG); + + return; + } + + if ($app->system->create_relative_link($target, $link)) { + $app->log(sprintf('Created symlink from "%s" to "%s"', $link, $target), LOGLEVEL_DEBUG); + } else { + $app->log(sprintf('Failed to create symlink from "%s" to "%s"', $link, $target), LOGLEVEL_WARN); + } + } +} \ No newline at end of file -- GitLab From 682be6d148814787c393ec40e3f504fc3b1f3ebf Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Fri, 11 Sep 2020 08:16:29 +0200 Subject: [PATCH 0565/1368] update caa-check --- server/lib/classes/letsencrypt.inc.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index fb67e7c00d..77be94c105 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -373,6 +373,17 @@ class letsencrypt { if((isset($web_config['skip_le_check']) && $web_config['skip_le_check'] == 'y') || (isset($server_config['migration_mode']) && $server_config['migration_mode'] == 'y')) { $le_domains[] = $temp_domain; } else { + $le_hash_check = trim(@file_get_contents('http://' . $temp_domain . '/.well-known/acme-challenge/' . $le_rnd_file)); + if($le_hash_check == $le_rnd_hash) { + $le_domains[] = $temp_domain; + $app->log("Verified domain " . $temp_domain . " should be reachable for letsencrypt.", LOGLEVEL_DEBUG); + } else { + $app->log("Could not verify domain " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN); + } + } + } + if(!empty($le_domains)) { + foreach($le_domains as $idx=>$temp_domain) { //check caa-record $caa_check = false; $caa_domain = $temp_domain; @@ -393,20 +404,13 @@ class letsencrypt { $caa_check = true; } - if($caa_check === true) { - $le_hash_check = trim(@file_get_contents('http://' . $temp_domain . '/.well-known/acme-challenge/' . $le_rnd_file)); - if($le_hash_check == $le_rnd_hash) { - $le_domains[] = $temp_domain; - $app->log("Verified domain " . $temp_domain . " should be reachable for letsencrypt.", LOGLEVEL_DEBUG); - } else { - $app->log("Could not verify domain " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN); - } - } else { + if($caa_check === false) { $app->log("Incomplete CAA-Records for " . $temp_domain . ", so excluding it from letsencrypt request.", LOGLEVEL_WARN); + unset($le_domains[$idx]); } - } } + $temp_domains = $le_domains; unset($le_domains); @unlink('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/' . $le_rnd_file); -- GitLab From d5cc75397a19e762d66b8c08b6d1d60ac7d2ef00 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 11 Sep 2020 10:34:40 +0200 Subject: [PATCH 0566/1368] Remove LE from installer questions (#5729) --- install/lib/installer_base.lib.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 4d462e6d48..1573670a5d 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -198,16 +198,16 @@ class installer_base { if (($conf['apache']['installed'] && is_file($conf['apache']["vhost_conf_enabled_dir"]."/000-ispconfig.vhost")) || ($conf['nginx']['installed'] && is_file($conf['nginx']["vhost_conf_enabled_dir"]."/000-ispconfig.vhost"))) $this->ispconfig_interface_installed = true; } - + //** Check prerequisites public function check_prerequisites() { $msg = ''; - + if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required. The currently used PHP version is ".phpversion().".\n"; if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n"; if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n"; if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is missing.\n"; - + if($msg != '') die($msg); } @@ -326,7 +326,7 @@ class installer_base { if(!$this->db->query($query, $conf['mysql']['database'] . ".*", $conf['mysql']['ispconfig_user'], $from_host)) { $this->error('Unable to grant databse permissions to user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage); } - + // add correct administrative rights to IPSConfig user (SUPER is deprecated and unnecessarily powerful) if ($this->db->getDatabaseType() == 'mysql' && $this->db->getDatabaseVersion(true) >= 8) { // there might be more needed on replicated db environments, this was not tested @@ -2896,12 +2896,12 @@ class installer_base { exec("cat $ssl_key_file $ssl_crt_file > $ssl_pem_file; chmod 600 $ssl_pem_file"); // Extend LE SSL certs to postfix - if ($conf['postfix']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig LE SSL certs to postfix?', array('y', 'n'), 'y')) == 'y') { + if ($conf['postfix']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Postfix?', array('y', 'n'), 'y')) == 'y') { // Define folder, file(s) $cf = $conf['postfix']; $postfix_dir = $cf['config_dir']; - if(!is_dir($postfix_dir)) $this->error("The postfix configuration directory '$postfix_dir' does not exist."); + if(!is_dir($postfix_dir)) $this->error("The Postfix configuration directory '$postfix_dir' does not exist."); $smtpd_crt = $postfix_dir.'/smtpd.cert'; $smtpd_key = $postfix_dir.'/smtpd.key'; @@ -2915,7 +2915,7 @@ class installer_base { } // Extend LE SSL certs to pureftpd - if ($conf['pureftpd']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig LE SSL certs to pureftpd? Creating dhparam file takes some times.', array('y', 'n'), 'y')) == 'y') { + if ($conf['pureftpd']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Pure-FTPd? Creating dhparam file may take some time.', array('y', 'n'), 'y')) == 'y') { // Define folder, file(s) $pureftpd_dir = '/etc/ssl/private'; -- GitLab From 53d0e130910d58e8798b1da794742214c5b13509 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Fri, 11 Sep 2020 12:11:41 +0200 Subject: [PATCH 0567/1368] add a new line at the end of the die --- server/cron_debug.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/cron_debug.php b/server/cron_debug.php index de561577c8..568cfd6413 100644 --- a/server/cron_debug.php +++ b/server/cron_debug.php @@ -52,7 +52,7 @@ if(isset($cmd_opt['cronjob']) && is_file($path.'/'.$cmd_opt['cronjob'])) { // Cronjob that shell be run $cronjob_file = $cmd_opt['cronjob']; } else { - die('Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php'); + die('Usage example: php cron_debug.php --cronjob=100-mailbox_stats.inc.php'."\n"); } // Load and run the cronjob -- GitLab From 0f532ba6d81ee386f748afc82c7b943d07d2a1a0 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 12 Sep 2020 18:43:21 +0200 Subject: [PATCH 0568/1368] Fix indentation --- interface/web/dns/templates/dns_soa_edit.htm | 394 ++++++++++--------- 1 file changed, 208 insertions(+), 186 deletions(-) diff --git a/interface/web/dns/templates/dns_soa_edit.htm b/interface/web/dns/templates/dns_soa_edit.htm index e16faac1aa..24c9209ccc 100644 --- a/interface/web/dns/templates/dns_soa_edit.htm +++ b/interface/web/dns/templates/dns_soa_edit.htm @@ -1,195 +1,217 @@ -
    -

    {tmpl_var name='configuration_error_txt'}

    -
    {tmpl_var name='config_error_tstamp'} : 
    {tmpl_var name='config_error_msg'}
    +
    +

    {tmpl_var name='configuration_error_txt'}

    +
    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +
    + + +
    + + +
    +
    + + + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    + + + + +
    + + +
    +
    + + + +
    +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    +
    +
    + + +
    + +

    {tmpl_var name='eg_domain_tld'}

    +
    + +
    + +

    {tmpl_var name='eg_domain_tld'}

    +
    +
    +
    +
    + +
    + +

    {tmpl_var name='eg_ns1_domain_tld'}

    +
    +
    +
    + +
    + +

    {tmpl_var name='eg_webmaster_domain_tld'}

    +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    +
    + +
    +
     {tmpl_var name='seconds_txt'} +
    +
    + +
    +
    +
    + +
    +
    + +
    + +
    +
    - - -
    - - -
    - - - -
    -
    -
    - -
    - -
    -
    -
    - - - - -
    - - -
    - - - -
    -
    -
    -
    -
    - - -
    - -
    -
    -
    -
    -
    - - -
    - -

    {tmpl_var name='eg_domain_tld'}

    -
    - -
    - -

    {tmpl_var name='eg_domain_tld'}

    -
    -
    -
    -
    - -
    - -

    {tmpl_var name='eg_ns1_domain_tld'}

    -
    -
    -
    - -
    - -

    {tmpl_var name='eg_webmaster_domain_tld'}

    -
    -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
     {tmpl_var name='seconds_txt'} -
    -
    - -
    -
    - -
    - -
    - -
    -
    -
    - -
    -
    -
    - -
    - {tmpl_var name='active'} -
    -
    - +
    + +
    +
    +
    + +
    + {tmpl_var name='active'} +
    +
    -
    - -
    - {tmpl_var name='dnssec_wanted'}
    ({tmpl_var name='dnssec_wanted_info'}) -
    -
    -
    - -
    {tmpl_var name='dnssec_algo'}
    -
    -
    - -
    -
    +
    + +
    + {tmpl_var name='dnssec_wanted'}
    ({tmpl_var name='dnssec_wanted_info'}) +
    +
    +
    + +
    + {tmpl_var name='dnssec_algo'} +
    +
    +
    + +
    +
    - - - - -
    - - -
    + + +
    +
    + + +
    +
    -- GitLab From 10cb15a2d1cb31c5535e4987e5f4e84276adf132 Mon Sep 17 00:00:00 2001 From: thom Date: Sat, 12 Sep 2020 18:46:53 +0200 Subject: [PATCH 0569/1368] Set font-weight for inline labels --- interface/web/themes/default/assets/stylesheets/ispconfig.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index c255573e6c..8d679f2740 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -37,6 +37,10 @@ body { .control-label-plain:after { content: ""; } +.inlineLabel { + font-weight: 400; +} + .formbutton-default { padding: 6px 10px; border-bottom-style: solid; -- GitLab From c87a1c8ef550ccd7587587322c7554bbf8343993 Mon Sep 17 00:00:00 2001 From: Hj Ahmad Rasyid Hj Ismail Date: Sun, 13 Sep 2020 14:43:45 +0200 Subject: [PATCH 0570/1368] Update installer_base.lib.php to fix the missed svr_ip that should have been modified to include both ipv4 and ipv6 in the previous quick fix before 911 https://git.ispconfig.org/ispconfig/ispconfig3/-/merge_requests/911 proposal was merged. This caused failure to create LE SSL certs as reported in issue 5731 https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/5731. This commit is aimed to fixed the said issue. --- install/lib/installer_base.lib.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 1573670a5d..aea0a6469e 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2761,9 +2761,7 @@ class installer_base { // Request for certs if no LE SSL folder for server fqdn exist $le_live_dir = '/etc/letsencrypt/live/' . $hostname; - if (!@is_dir($le_live_dir) && ( - ($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)) - )) { + if (!@is_dir($le_live_dir) && (($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)))) { // This script is needed earlier to check and open http port 80 or standalone might fail // Make executable and temporary symlink latest letsencrypt pre, post and renew hook script before install @@ -2865,7 +2863,7 @@ class installer_base { $date = new DateTime(); // If the LE SSL certs for this hostname exists - if (is_dir($le_live_dir) && in_array($svr_ip, $dns_ips)) { + if (is_dir($le_live_dir) && (($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)))) { // Backup existing ispserver ssl files if (file_exists($ssl_crt_file)) rename($ssl_crt_file, $ssl_crt_file . '-' .$date->format('YmdHis') . '.bak'); -- GitLab From 97c77f0296af51622fd96731114a1469534d9b63 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 18:15:20 +0200 Subject: [PATCH 0571/1368] Fix typo --- install/install.php | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/install/install.php b/install/install.php index fc6f9e10c0..496ab3fdce 100644 --- a/install/install.php +++ b/install/install.php @@ -30,30 +30,30 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /* ISPConfig 3 installer. - + ------------------------------------------------------------------------------------- - Interactive install ------------------------------------------------------------------------------------- run: - + php install.php - + ------------------------------------------------------------------------------------- - Noninteractive (autoinstall) mode ------------------------------------------------------------------------------------- - + The autoinstall mode can read the installer questions from a .ini style file or from - a php config file. Examples for both file types are in the docs folder. + a php config file. Examples for both file types are in the docs folder. See autoinstall.ini.sample and autoinstall.conf_sample.php. - + run: - + php install.php --autoinstall=autoinstall.ini - + or - + php install.php --autoinstall=autoinstall.conf.php - + */ error_reporting(E_ALL|E_STRICT); @@ -146,9 +146,9 @@ include_once 'dist/conf/'.$dist['confid'].'.conf.php'; //** Installer Interface //**************************************************************************************************** $inst = new installer(); -if (!$inst->get_php_version()) die('ISPConfig requieres PHP '.$inst->min_php."\n"); +if (!$inst->get_php_version()) die('ISPConfig requires PHP '.$inst->min_php."\n"); $retval=shell_exec("which which"); -if (empty($retval)) die ("ISPConfig requieres which \n"); +if (empty($retval)) die ("ISPConfig requires which \n"); $inst->check_prerequisites(); @@ -204,17 +204,17 @@ if(!function_exists('mysqli_connect')) die('No PHP MySQLi functions available. P //** Get MySQL root credentials $finished = false; do { - $tmp_mysql_server_host = $inst->free_query('MySQL server hostname', $conf['mysql']['host'],'mysql_hostname'); + $tmp_mysql_server_host = $inst->free_query('MySQL server hostname', $conf['mysql']['host'],'mysql_hostname'); $tmp_mysql_server_port = $inst->free_query('MySQL server port', $conf['mysql']['port'],'mysql_port'); - $tmp_mysql_server_admin_user = $inst->free_query('MySQL root username', $conf['mysql']['admin_user'],'mysql_root_user'); - $tmp_mysql_server_admin_password = $inst->free_query('MySQL root password', $conf['mysql']['admin_password'],'mysql_root_password'); - $tmp_mysql_server_database = $inst->free_query('MySQL database to create', $conf['mysql']['database'],'mysql_database'); + $tmp_mysql_server_admin_user = $inst->free_query('MySQL root username', $conf['mysql']['admin_user'],'mysql_root_user'); + $tmp_mysql_server_admin_password = $inst->free_query('MySQL root password', $conf['mysql']['admin_password'],'mysql_root_password'); + $tmp_mysql_server_database = $inst->free_query('MySQL database to create', $conf['mysql']['database'],'mysql_database'); $tmp_mysql_server_charset = $inst->free_query('MySQL charset', $conf['mysql']['charset'],'mysql_charset'); - + if($install_mode == 'expert') { swriteln("The next two questions are about the internal ISPConfig database user and password.\nIt is recommended to accept the defaults which are 'ispconfig' as username and a random password.\nIf you use a different password, use only numbers and chars for the password.\n"); - - $conf['mysql']['ispconfig_user'] = $inst->free_query('ISPConfig mysql database username', $conf['mysql']['ispconfig_user'],'mysql_ispconfig_user'); + + $conf['mysql']['ispconfig_user'] = $inst->free_query('ISPConfig mysql database username', $conf['mysql']['ispconfig_user'],'mysql_ispconfig_user'); $conf['mysql']['ispconfig_password'] = $inst->free_query('ISPConfig mysql database password', $conf['mysql']['ispconfig_password'],'mysql_ispconfig_password'); } @@ -264,10 +264,10 @@ if($install_mode == 'expert' && strtolower($inst->simple_query('Shall this serve //** Get MySQL root credentials $finished = false; do { - $tmp_mysql_server_host = $inst->free_query('MySQL master server hostname', $conf['mysql']['master_host'],'mysql_master_hostname'); + $tmp_mysql_server_host = $inst->free_query('MySQL master server hostname', $conf['mysql']['master_host'],'mysql_master_hostname'); $tmp_mysql_server_port = $inst->free_query('MySQL master server port', $conf['mysql']['master_port'],'mysql_master_port'); - $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user'],'mysql_master_root_user'); - $tmp_mysql_server_admin_password = $inst->free_query('MySQL master server root password', $conf['mysql']['master_admin_password'],'mysql_master_root_password'); + $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user'],'mysql_master_root_user'); + $tmp_mysql_server_admin_password = $inst->free_query('MySQL master server root password', $conf['mysql']['master_admin_password'],'mysql_master_root_password'); $tmp_mysql_server_database = $inst->free_query('MySQL master server database name', $conf['mysql']['master_database'],'mysql_master_database'); //* Initialize the MySQL server connection @@ -567,7 +567,7 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon if($conf['nginx']['installed'] == true) $conf['nginx']['vhost_port'] = $ispconfig_vhost_port; unset($ispconfig_vhost_port); - if(strtolower($inst->simple_query('Do you want a secure (SSL) connection to the ISPConfig web interface', array('y', 'n'), 'y','ispconfig_use_ssl')) == 'y') { + if(strtolower($inst->simple_query('Do you want a secure (SSL) connection to the ISPConfig web interface', array('y', 'n'), 'y','ispconfig_use_ssl')) == 'y') { $inst->make_ispconfig_ssl_cert(); } $inst->install_ispconfig_interface = true; -- GitLab From 5bb835688ec1641819e92157c47d598bd99a0798 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 18:43:28 +0200 Subject: [PATCH 0572/1368] Fix typo (Ported from !449) --- interface/web/sites/lib/lang/dk_ftp_user.lng | 2 +- interface/web/sites/lib/lang/en_ftp_user.lng | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/sites/lib/lang/dk_ftp_user.lng b/interface/web/sites/lib/lang/dk_ftp_user.lng index a5943cdff7..2c08653e37 100644 --- a/interface/web/sites/lib/lang/dk_ftp_user.lng +++ b/interface/web/sites/lib/lang/dk_ftp_user.lng @@ -18,7 +18,7 @@ $wb['active_txt'] = 'Aktiv'; $wb['limit_ftp_user_txt'] = 'Max. antal of FTP brugere for din konto er nået.'; $wb['username_error_empty'] = 'Brugernavn er tomt.'; $wb['username_error_unique'] = 'Brugernavne skal være unikke.'; -$wb['username_error_regex'] = 'Brugernavne contains charachters that are not allowed.'; +$wb['username_error_regex'] = 'Brugernavne contains characters that are not allowed.'; $wb['quota_size_error_empty'] = 'Kvote er tomt.'; $wb['uid_error_empty'] = 'GID er tom.'; $wb['directory_error_empty'] = 'Mappe er tom.'; diff --git a/interface/web/sites/lib/lang/en_ftp_user.lng b/interface/web/sites/lib/lang/en_ftp_user.lng index 9d6a27fb68..2deefcb719 100644 --- a/interface/web/sites/lib/lang/en_ftp_user.lng +++ b/interface/web/sites/lib/lang/en_ftp_user.lng @@ -18,7 +18,7 @@ $wb["active_txt"] = 'Active'; $wb["limit_ftp_user_txt"] = 'The max. number of FTP users for your account is reached.'; $wb["username_error_empty"] = 'Username is empty.'; $wb["username_error_unique"] = 'The username must be unique.'; -$wb["username_error_regex"] = 'The username contains charachters that are not allowed.'; +$wb["username_error_regex"] = 'The username contains characters that are not allowed.'; $wb["quota_size_error_empty"] = 'Quota is empty.'; $wb["uid_error_empty"] = 'UID empty.'; $wb["uid_error_empty"] = 'GID empty.'; -- GitLab From 3d6a16b481e3b03f7684fb27e4f2bdfc023fd7b4 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 19:20:33 +0200 Subject: [PATCH 0573/1368] Remove unused string --- interface/web/dashboard/lib/lang/it.lng | 1 - 1 file changed, 1 deletion(-) diff --git a/interface/web/dashboard/lib/lang/it.lng b/interface/web/dashboard/lib/lang/it.lng index 6a22e7cf5e..db8858aafd 100644 --- a/interface/web/dashboard/lib/lang/it.lng +++ b/interface/web/dashboard/lib/lang/it.lng @@ -1,5 +1,4 @@ -- GitLab From eab17a67b2ccef460eb91c1644801fa94a986c98 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 19:43:08 +0200 Subject: [PATCH 0574/1368] Put IfModule in tmpl_if --- server/conf/vhost.conf.master | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 8cc87515b1..692257848c 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -76,8 +76,8 @@ ErrorDocument 503 /error/503.html - + SSLEngine on SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 # SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS @@ -88,17 +88,17 @@ SSLCertificateFile SSLCertificateKeyFile - SSLUseStapling on - SSLStaplingResponderTimeout 5 - SSLStaplingReturnResponderErrors off + SSLUseStapling on + SSLStaplingResponderTimeout 5 + SSLStaplingReturnResponderErrors off - - - SSLCertificateChainFile - - + + + SSLCertificateChainFile + + + - # Clear PHP settings of this website -- GitLab From d5c3a92bf5568d235ff2ac88a3bd11b7fdeb5cf2 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 20:54:59 +0200 Subject: [PATCH 0575/1368] Remove unused file (Backport from !549) --- interface/index.htm | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 interface/index.htm diff --git a/interface/index.htm b/interface/index.htm deleted file mode 100644 index 9e38208a2d..0000000000 --- a/interface/index.htm +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - -- GitLab From 9413504e5445ca82a98cb491276006b08351d342 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 20:59:44 +0200 Subject: [PATCH 0576/1368] Update copyright note --- LICENSE | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LICENSE b/LICENSE index 139b12fc1f..5b4fffa24b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2007-2016, Till Brehm, ISPConfig UG +Copyright (c) 2007-2020, Till Brehm, ISPConfig UG All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -22,4 +22,4 @@ BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -- GitLab From 5312a8a6589909859d3eefc8a2b5ad254519de07 Mon Sep 17 00:00:00 2001 From: thom Date: Sun, 13 Sep 2020 21:28:21 +0200 Subject: [PATCH 0577/1368] Go back to records tab on cancel (Backport from !572) --- interface/web/dns/templates/dns_a_edit.htm | 10 +++++----- interface/web/dns/templates/dns_aaaa_edit.htm | 2 +- interface/web/dns/templates/dns_alias_edit.htm | 2 +- interface/web/dns/templates/dns_caa_edit.htm | 2 +- interface/web/dns/templates/dns_cname_edit.htm | 2 +- interface/web/dns/templates/dns_dkim_edit.htm | 2 +- interface/web/dns/templates/dns_dmarc_edit.htm | 2 +- interface/web/dns/templates/dns_dname_edit.htm | 2 +- interface/web/dns/templates/dns_ds_edit.htm | 2 +- interface/web/dns/templates/dns_hinfo_edit.htm | 2 +- interface/web/dns/templates/dns_loc_edit.htm | 2 +- interface/web/dns/templates/dns_mx_edit.htm | 2 +- interface/web/dns/templates/dns_naptr_edit.htm | 2 +- interface/web/dns/templates/dns_ns_edit.htm | 2 +- interface/web/dns/templates/dns_ptr_edit.htm | 2 +- interface/web/dns/templates/dns_rp_edit.htm | 2 +- interface/web/dns/templates/dns_spf_edit.htm | 2 +- interface/web/dns/templates/dns_srv_edit.htm | 2 +- interface/web/dns/templates/dns_sshfp_edit.htm | 2 +- interface/web/dns/templates/dns_tlsa_edit.htm | 2 +- interface/web/dns/templates/dns_txt_edit.htm | 2 +- 21 files changed, 25 insertions(+), 25 deletions(-) diff --git a/interface/web/dns/templates/dns_a_edit.htm b/interface/web/dns/templates/dns_a_edit.htm index 907d84b0bc..0754bf9395 100644 --- a/interface/web/dns/templates/dns_a_edit.htm +++ b/interface/web/dns/templates/dns_a_edit.htm @@ -14,15 +14,15 @@ {tmpl_var name='active'}
    - - + + - +
    - +
    diff --git a/interface/web/dns/templates/dns_aaaa_edit.htm b/interface/web/dns/templates/dns_aaaa_edit.htm index 13ee0ccaab..d21d2bdd92 100644 --- a/interface/web/dns/templates/dns_aaaa_edit.htm +++ b/interface/web/dns/templates/dns_aaaa_edit.htm @@ -22,7 +22,7 @@
    - +
    -- GitLab From 09d0cd36abfddff3a478f19cb0aa378cc11b2b8e Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 21 Sep 2020 22:35:58 +0200 Subject: [PATCH 0717/1368] Show error(s) in ul without bullets (#5158) --- .../templates/system_config_misc_edit.htm | 16 +++++---- .../web/client/templates/client_message.htm | 13 +++++-- interface/web/dns/templates/dns_import.htm | 19 ++++++++--- interface/web/dns/templates/dns_wizard.htm | 21 ++++++++---- .../mail/templates/mail_user_backup_list.htm | 11 +++++- .../themes/default/templates/error.tpl.htm | 6 ++-- .../default/templates/tabbed_form.tpl.htm | 34 +++++++++++-------- .../web/tools/templates/dns_import_tupa.htm | 15 ++++++-- .../web/tools/templates/import_ispconfig.htm | 23 +++++++++---- .../web/tools/templates/import_plesk.htm | 19 ++++++++--- .../web/tools/templates/import_vpopmail.htm | 17 +++++++--- 11 files changed, 136 insertions(+), 58 deletions(-) diff --git a/interface/web/admin/templates/system_config_misc_edit.htm b/interface/web/admin/templates/system_config_misc_edit.htm index 356d2e1b25..ea8386c224 100644 --- a/interface/web/admin/templates/system_config_misc_edit.htm +++ b/interface/web/admin/templates/system_config_misc_edit.htm @@ -144,13 +144,15 @@
    -
    -

    - -

    -
      - -
    +
    +
    + +
    +
    +
      + +
    +
    diff --git a/interface/web/client/templates/client_message.htm b/interface/web/client/templates/client_message.htm index b546181fa7..d934d5f6d2 100644 --- a/interface/web/client/templates/client_message.htm +++ b/interface/web/client/templates/client_message.htm @@ -5,7 +5,16 @@

    -

    +
    +
    + +
    +
    +
      + +
    +
    +
    @@ -24,7 +33,7 @@
    {tmpl_var name='variables_txt'}: {tmpl_var name="message_variables"}
    {tmpl_var name='variables_description_txt'}
    - +
    diff --git a/interface/web/dns/templates/dns_import.htm b/interface/web/dns/templates/dns_import.htm index dafb9016a0..c461e01ed6 100644 --- a/interface/web/dns/templates/dns_import.htm +++ b/interface/web/dns/templates/dns_import.htm @@ -37,21 +37,30 @@
    -
    +
    - +

    -

    +
    +
    + +
    +
    +
      + +
    +
    +
    - + - +
    diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm index 2f4f24b4e0..daaac277eb 100644 --- a/interface/web/dns/templates/dns_wizard.htm +++ b/interface/web/dns/templates/dns_wizard.htm @@ -3,7 +3,16 @@
    -

    +
    +
    + +
    +
    +
      + +
    +
    +
    @@ -96,11 +105,11 @@
    - - - + + + - +
    @@ -118,7 +127,7 @@ fillSearchFieldWith: 'fill_text', searchFieldWatermark: '', resultBoxPosition: '' - }); + }); diff --git a/interface/web/sites/templates/web_vhost_domain_ssl.htm b/interface/web/sites/templates/web_vhost_domain_ssl.htm index d4ec6749e2..686b5e67fd 100644 --- a/interface/web/sites/templates/web_vhost_domain_ssl.htm +++ b/interface/web/sites/templates/web_vhost_domain_ssl.htm @@ -1,10 +1,13 @@ -
    -

    {tmpl_var name='configuration_error_txt'}

    -
    -
    {tmpl_var name='config_error_tstamp'} : 
    {tmpl_var name='config_error_msg'}
    -
    -
    +
    +

    + +

    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +

    +
    diff --git a/interface/web/sites/templates/web_vhost_domain_stats.htm b/interface/web/sites/templates/web_vhost_domain_stats.htm index 6ebf9a6613..153262987c 100644 --- a/interface/web/sites/templates/web_vhost_domain_stats.htm +++ b/interface/web/sites/templates/web_vhost_domain_stats.htm @@ -1,10 +1,13 @@ -
    -

    {tmpl_var name='configuration_error_txt'}

    -
    -
    {tmpl_var name='config_error_tstamp'} : 
    {tmpl_var name='config_error_msg'}
    -
    -
    +
    +

    + +

    +
    {tmpl_var name='config_error_tstamp'} : 
    +
    {tmpl_var name='config_error_msg'}
    +
    +

    +
    @@ -43,7 +46,7 @@ {tmpl_var name='stats_type'}
    - + -- GitLab From 202d03d9e6ea3e2f0c104111cbf885bb68e31ae9 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 22 Sep 2020 12:58:55 +0200 Subject: [PATCH 0729/1368] Enhance form styling --- .../web/admin/templates/language_add.htm | 46 +-- .../web/admin/templates/language_complete.htm | 51 ++-- .../web/admin/templates/language_export.htm | 51 ++-- .../web/admin/templates/language_import.htm | 79 +++-- .../templates/remote_action_ispcupdate.htm | 32 +- .../templates/remote_action_osupdate.htm | 47 +-- interface/web/dns/templates/dns_import.htm | 147 ++++++---- interface/web/dns/templates/dns_wizard.htm | 277 ++++++++++-------- .../web/tools/templates/import_ispconfig.htm | 11 +- 9 files changed, 425 insertions(+), 316 deletions(-) diff --git a/interface/web/admin/templates/language_add.htm b/interface/web/admin/templates/language_add.htm index 30dc4d153c..285f884ee3 100644 --- a/interface/web/admin/templates/language_add.htm +++ b/interface/web/admin/templates/language_add.htm @@ -1,24 +1,32 @@ -

    +

    + +

    +
    +
    +
    + +
    +
    +
    + +
    +

    {tmpl_var name='language_new_hint_txt'}

    +
    -
    - -
    -
    -
    - -

    {tmpl_var name='language_new_hint_txt'}

    -
    - + - - -
    - - -
    +
    +
    + + +
    +
    +
    diff --git a/interface/web/admin/templates/language_complete.htm b/interface/web/admin/templates/language_complete.htm index 53f42fc8fe..0da59e1177 100644 --- a/interface/web/admin/templates/language_complete.htm +++ b/interface/web/admin/templates/language_complete.htm @@ -1,30 +1,39 @@ -

    +
    +

    + +

    +
    + +
    + +
    +
    + +
    + +
    +
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    +
    +
    + +
    + +
    +
    -
    - - +
    + +
    -
    -
    +
    +
    diff --git a/interface/web/admin/templates/language_export.htm b/interface/web/admin/templates/language_export.htm index a115e6493a..bb9eb49164 100644 --- a/interface/web/admin/templates/language_export.htm +++ b/interface/web/admin/templates/language_export.htm @@ -1,24 +1,35 @@ -

    +

    + +

    +
    +
    +
    + +
    +
    + +
    +

    + +

    +
    +
    -
    - -
    -
    - - - -

    -
    - - - -
    - - -
    + + +
    +
    + + +
    +
    +
    +
    diff --git a/interface/web/admin/templates/language_import.htm b/interface/web/admin/templates/language_import.htm index 0761cc87ed..963da26a46 100644 --- a/interface/web/admin/templates/language_import.htm +++ b/interface/web/admin/templates/language_import.htm @@ -1,33 +1,54 @@ -

    +
    +
    +
    +

    + +

    +
    +
    + + +
    +
    + +
    +
    +
    + +
    +
    -
    - - -
    -
    - -
    -
    -
    - -
    -
    - - - -

    -
    - -

    -
    - - - -
    - - -
    + +
    +

    + +

    +
    +
    + +
    +

    + +

    +
      + +
    +
    +
    + + + +
    +
    + + +
    +
    +
    +
    diff --git a/interface/web/admin/templates/remote_action_ispcupdate.htm b/interface/web/admin/templates/remote_action_ispcupdate.htm index cbd2899bea..944ccb3ce1 100644 --- a/interface/web/admin/templates/remote_action_ispcupdate.htm +++ b/interface/web/admin/templates/remote_action_ispcupdate.htm @@ -6,14 +6,18 @@ --> -

    - -
    - -
    - -
    - -
    \ No newline at end of file +
    + +
    diff --git a/interface/web/admin/templates/remote_action_osupdate.htm b/interface/web/admin/templates/remote_action_osupdate.htm index 55629fc1e9..e32ae2c652 100644 --- a/interface/web/admin/templates/remote_action_osupdate.htm +++ b/interface/web/admin/templates/remote_action_osupdate.htm @@ -1,21 +1,34 @@ -

    +
    +
    +
    +

    + +

    +
    +
    + +
    +
    + +
    +

    + +

    +
    +
    -
    - -
    -
    - - - -

    -
    - -
    - -
    +
    +
    + +
    +
    +
    +
    diff --git a/interface/web/dns/templates/dns_import.htm b/interface/web/dns/templates/dns_import.htm index dafb9016a0..8944ce6c64 100644 --- a/interface/web/dns/templates/dns_import.htm +++ b/interface/web/dns/templates/dns_import.htm @@ -1,65 +1,88 @@ -

    +

    + +

    +
    +
    + +
    + +
    +
    +
    + +
    +
    + + + + +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    + +
    +
    + +
    +
    - -
    - -
    -
    -
    - -
    -
    - - - - -
    - -
    -
    -
    -
    -
    - - -
    - -
    -
    -
    -
    - -
    -
    - - -

    -
    - -

    -
    - - - -
    - - -
    - + +
    +

    + +

    +
    +
    + +
    +

    + +

    +
      + +
    +
    +
    + + + +
    +
    + + +
    +
    +
    +
    + diff --git a/interface/web/dns/templates/dns_wizard.htm b/interface/web/dns/templates/dns_wizard.htm index 2f4f24b4e0..a137f823ae 100644 --- a/interface/web/dns/templates/dns_wizard.htm +++ b/interface/web/dns/templates/dns_wizard.htm @@ -1,137 +1,158 @@ +
    +
    + +
    +

    + +

    +
      + +
    +
    +
    +
    + +
    +
    + +
    + +
    +
    + +
    + +
    +
    +
    + + + + +
    + +
    +
    +
    +
    + + +
    + +
    +
    +
    +
    + +
    + + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    - -

    -
    -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    -
    - - - - -
    - -
    -
    -
    -
    - - -
    - -
    -
    -
    -
    - -
    - - -
    - -
    -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - -
    - -
    -
    - - - - - -
    - - -
    + + +
    +
    + + +
    +
    +
    +
    diff --git a/interface/web/tools/templates/import_ispconfig.htm b/interface/web/tools/templates/import_ispconfig.htm index 9d845701f6..b71031e1f9 100644 --- a/interface/web/tools/templates/import_ispconfig.htm +++ b/interface/web/tools/templates/import_ispconfig.htm @@ -4,7 +4,6 @@

    -
    {tmpl_var name="legend_txt"}
    @@ -19,7 +18,7 @@
    - +
    @@ -66,17 +65,17 @@
    - +
    - +

    - + @@ -90,4 +89,4 @@
    -
    \ No newline at end of file +
    -- GitLab From 69c1d56fd2dece891c2d4291c1fc69084998e1dd Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 22 Sep 2020 11:25:07 -0600 Subject: [PATCH 0730/1368] consistent app vhost template for install/server --- install/tpl/apache_apps.vhost.master | 6 ++++++ install/tpl/nginx_apps.vhost.master | 4 ++-- server/conf/nginx_apps.vhost.master | 14 +++++++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index b07bb03f41..8d6df71b7d 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -122,3 +122,9 @@ {/tmpl_if} + + + + SSLStaplingCache shmcb:/var/run/ocsp(128000) + + diff --git a/install/tpl/nginx_apps.vhost.master b/install/tpl/nginx_apps.vhost.master index 2680b209a2..b8c1a8abd7 100644 --- a/install/tpl/nginx_apps.vhost.master +++ b/install/tpl/nginx_apps.vhost.master @@ -99,7 +99,7 @@ server { fastcgi_param REDIRECT_STATUS 200; # To access phpMyAdmin, the default user (like www-data on Debian/Ubuntu) must be used {use_tcp}fastcgi_pass 127.0.0.1:9000; - {use_socket}fastcgi_pass unix:/var/run/php5-fpm.sock; + {use_socket}fastcgi_pass unix:{fpm_socket}; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffer_size 128k; @@ -149,7 +149,7 @@ server { fastcgi_param REDIRECT_STATUS 200; # To access SquirrelMail, the default user (like www-data on Debian/Ubuntu) must be used {use_tcp}fastcgi_pass 127.0.0.1:9000; - {use_socket}fastcgi_pass unix:/var/run/php5-fpm.sock; + {use_socket}fastcgi_pass unix:{fpm_socket}; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_buffer_size 128k; diff --git a/server/conf/nginx_apps.vhost.master b/server/conf/nginx_apps.vhost.master index 0c82c4631e..b8c1a8abd7 100644 --- a/server/conf/nginx_apps.vhost.master +++ b/server/conf/nginx_apps.vhost.master @@ -1,5 +1,13 @@ server { - listen {apps_vhost_ip}{apps_vhost_port}; + listen {apps_vhost_port} {ssl_on}; + listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on; + + {ssl_comment}ssl_protocols TLSv1.2; + {ssl_comment}ssl_certificate /usr/local/ispconfig/interface/ssl/ispserver.crt; + {ssl_comment}ssl_certificate_key /usr/local/ispconfig/interface/ssl/ispserver.key; + + # redirect to https if accessed with http + {ssl_comment}error_page 497 https://$host:{vhost_port}$request_uri; server_name {apps_vhost_servername}; @@ -12,7 +20,7 @@ server { } # serve static files directly - location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ { + location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ { access_log off; } @@ -165,6 +173,7 @@ server { fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; + fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; @@ -223,5 +232,4 @@ server { {use_rspamd}alias /usr/share/rspamd/www/$1; {use_rspamd}} {use_rspamd}} - } -- GitLab From 7b94621d2c48922d343974cade8e9e89d30ded92 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 22 Sep 2020 11:58:46 -0600 Subject: [PATCH 0731/1368] check correct setting --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 95be196417..9ac5c788f0 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2553,7 +2553,7 @@ class installer_base { } // comment out the listen directive if port is 80 or 443 - if($conf['web']['apps_vhost_ip'] == 80 or $conf['web']['apps_vhost_ip'] == 443) { + if($conf['web']['apps_vhost_port'] == 80 or $conf['web']['apps_vhost_port'] == 443) { $tpl->setVar('vhost_port_listen','#'); } else { $tpl->setVar('vhost_port_listen',''); -- GitLab From dc524973e3128970ca8405884d8f61ab91a3a3f3 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 22 Sep 2020 16:47:34 -0600 Subject: [PATCH 0732/1368] forgot some brackets --- server/lib/classes/monitor_tools.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 43127acdc1..31e36836d5 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -561,7 +561,7 @@ class monitor_tools { } break; case 'log_letsencrypt': - $check_files = []; + $check_files = array(); if(file_exists($conf['ispconfig_log_dir'].'/acme.log')) { $check_files[] = $conf['ispconfig_log_dir'].'/acme.log'; } @@ -572,7 +572,7 @@ class monitor_tools { $check_files[] = '/usr/local/ispconfig/server/scripts/acme.sh.log'; } if(file_exists('/var/log/letsencrypt/letsencrypt.log')) { - $check_files = '/var/log/letsencrypt/letsencrypt.log'; + $check_files[] = '/var/log/letsencrypt/letsencrypt.log'; } $logfile = ''; $newest = 0; -- GitLab From d98e837fed8ebaf033b1519762af63b914921573 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 22 Sep 2020 17:13:18 -0600 Subject: [PATCH 0733/1368] handle jk_update 'ERROR: failed to remove deprecated ...' --- server/lib/classes/system.inc.php | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 738c3acadd..32afb9943c 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -2527,13 +2527,17 @@ else { $app->log("update_jailkit_chroot: NOT searching for hardlinks in $jail_di $cmd = 'jk_update --jail=?' . $jk_update_args . $skips; $this->exec_safe($cmd, $home_dir); $app->log('jk_update returned: '.print_r($this->_last_exec_out, true), LOGLEVEL_DEBUG); + # handle jk_update output foreach ($this->_last_exec_out as $line) { + # jk_update sample output: + # skip /var/www/clients/client1/web1/opt/ if (substr( $line, 0, 4 ) === "skip") { continue; } - if (preg_match('/^(WARNING|ERROR)/', $line, $matches)) { - $app->log("jk_update: $line", LOGLEVEL_DEBUG); - } elseif (preg_match('@^(?: [^ ]+){6}(.+)'.preg_quote($home_dir, '@').'$@', $line, $matches)) { + + # jk_update sample output: + # ERROR: failed to remove deprecated directory /var/www/clients/client1/web10/usr/lib/x86_64-linux-gnu/libGeoIP.so.1.6.9 + if (preg_match('@^(?:[^ ]+){6}(?:.+)('.preg_quote($home_dir, '@').'.+)@', $line, $matches)) { # remove deprecated files that jk_update failed to remove if (is_file($matches[1])) { $app->log("update_jailkit_chroot: removing deprecated file which jk_update failed to remove: ".$matches[1], LOGLEVEL_DEBUG); @@ -2541,11 +2545,19 @@ $app->log("update_jailkit_chroot: removing deprecated file which jk_update faile } elseif (is_dir($matches[1])) { $app->log("update_jailkit_chroot: removing deprecated directory which jk_update failed to remove: ".$matches[1], LOGLEVEL_DEBUG); $this->rmdir($matches[1], true); + } else { + # unhandled error + //$app->log("jk_update error for jail $home_dir: ".$matches[1], LOGLEVEL_DEBUG); + // at least for 3.2 beta, lets gather some of this info: + $app->log("jk_update error for jail $home_dir, feel free to pass to ispconfig developers: ".print_r( $matches, true), LOGLEVEL_DEBUG); } - # unhandled error - //$app->log("jk_update error for jail $home_dir: ".$matches[1], LOGLEVEL_DEBUG); - // at least for 3.2 beta, lets gather some of this info: - $app->log("jk_update error for jail $home_dir, feel free to pass to ispconfig developers: ".print_r( $matches, true), LOGLEVEL_DEBUG); + + # any other ERROR or WARNING + # sample so far: + # ERROR: /usr/bin/nano does not exist + # WARNING: section [whatever] does not exist in /etc/jailkit/jk_init.ini + } elseif (preg_match('/^(WARNING|ERROR)/', $line, $matches)) { + $app->log("jk_update: $line", LOGLEVEL_DEBUG); } } -- GitLab From 11e79088d97c2cd724079ede1bc95b4692dac97d Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 23 Sep 2020 12:25:03 +0200 Subject: [PATCH 0734/1368] Update nginx_apps.vhost.master --- server/conf/nginx_apps.vhost.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conf/nginx_apps.vhost.master b/server/conf/nginx_apps.vhost.master index b8c1a8abd7..b91d1a16c5 100644 --- a/server/conf/nginx_apps.vhost.master +++ b/server/conf/nginx_apps.vhost.master @@ -1,5 +1,5 @@ server { - listen {apps_vhost_port} {ssl_on}; + listen {apps_vhost_ip}{apps_vhost_port} {ssl_on}; listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on; {ssl_comment}ssl_protocols TLSv1.2; -- GitLab From 81743c06935e99bdbbd60f8861cf6daac64affec Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 23 Sep 2020 12:25:48 +0200 Subject: [PATCH 0735/1368] Update nginx_apps.vhost.master --- install/tpl/nginx_apps.vhost.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/nginx_apps.vhost.master b/install/tpl/nginx_apps.vhost.master index b8c1a8abd7..b91d1a16c5 100644 --- a/install/tpl/nginx_apps.vhost.master +++ b/install/tpl/nginx_apps.vhost.master @@ -1,5 +1,5 @@ server { - listen {apps_vhost_port} {ssl_on}; + listen {apps_vhost_ip}{apps_vhost_port} {ssl_on}; listen [::]:{apps_vhost_port} {ssl_on} ipv6only=on; {ssl_comment}ssl_protocols TLSv1.2; -- GitLab From 4e7b3650a28eb686c54b5d602aac593cdcc012c2 Mon Sep 17 00:00:00 2001 From: Branislav Viest Date: Wed, 23 Sep 2020 13:00:10 +0200 Subject: [PATCH 0736/1368] Custom PHP variables are not apply when configured in Directive Snippet PHP variables from Directive Snippets order fix in php.ini --- server/plugins-available/apache2_plugin.inc.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index c9ed6508e0..bef49172cd 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1247,13 +1247,14 @@ class apache2_plugin { } //* Create custom php.ini - if(trim($data['new']['custom_php_ini']) != '') { + # Because of custom default PHP directives from snippet + # php.ini custom values order os: 1. general settings 2. Directive Snippets settings 3. custom php.ini settings defined in domain settings + if(trim($data['new']['custom_php_ini']) != '' || $data['new']['directive_snippets_id'] > "0") { $has_custom_php_ini = true; $custom_sendmail_path = false; if(!is_dir($custom_php_ini_dir)) $app->system->mkdirpath($custom_php_ini_dir); $php_ini_content = $this->get_master_php_ini_content($data['new']); - $php_ini_content .= str_replace("\r", '', trim($data['new']['custom_php_ini'])); if(intval($data['new']['directive_snippets_id']) > 0){ $snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'apache' AND active = 'y' AND customer_viewable = 'y'", intval($data['new']['directive_snippets_id'])); @@ -1266,6 +1267,7 @@ class apache2_plugin { $php_snippet = $app->db->queryOneRecord("SELECT * FROM directive_snippets WHERE directive_snippets_id = ? AND type = 'php' AND active = 'y'", $required_php_snippet); $php_snippet['snippet'] = trim($php_snippet['snippet']); if($php_snippet['snippet'] != ''){ + $php_snippet['snippet'] = str_replace("\r", '', $php_snippet['snippet']); $php_ini_content .= "\n".$php_snippet['snippet']; } } @@ -1273,6 +1275,7 @@ class apache2_plugin { } } } + $php_ini_content .= "\n".str_replace("\r", '', trim($data['new']['custom_php_ini'])); $custom_sendmail_path = false; $line = strtok($php_ini_content, '\n'); -- GitLab From c8f04860c81e5163fd8795677ce43303e0fd34a9 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 23 Sep 2020 15:31:53 -0600 Subject: [PATCH 0737/1368] msyql-virtual_mailboxes.cf should use email, not login, field --- install/tpl/mysql-virtual_mailboxes.cf.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/mysql-virtual_mailboxes.cf.master b/install/tpl/mysql-virtual_mailboxes.cf.master index 281bedb07b..8b2677a196 100644 --- a/install/tpl/mysql-virtual_mailboxes.cf.master +++ b/install/tpl/mysql-virtual_mailboxes.cf.master @@ -2,4 +2,4 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') from mail_user where login = '%s' and postfix = 'y' and disabledeliver = 'n' and server_id = {server_id} +query = select CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') from mail_user where email = '%s' and postfix = 'y' and disabledeliver = 'n' and server_id = {server_id} -- GitLab From 3afa1042849c06e8a49d1bae160b921ca5a00814 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 23 Sep 2020 17:30:21 -0600 Subject: [PATCH 0738/1368] remove auth_verbose --- install/tpl/debian6_dovecot2.conf.master | 1 - install/tpl/debian_dovecot2.conf.master | 1 - install/tpl/fedora_dovecot2.conf.master | 1 - 3 files changed, 3 deletions(-) diff --git a/install/tpl/debian6_dovecot2.conf.master b/install/tpl/debian6_dovecot2.conf.master index 1080eeb559..53eff38642 100644 --- a/install/tpl/debian6_dovecot2.conf.master +++ b/install/tpl/debian6_dovecot2.conf.master @@ -11,7 +11,6 @@ ssl_protocols = !SSLv2 !SSLv3 !TLSv1 !TLSv1.1 ssl_min_protocol = TLSv1.2 ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 ssl_prefer_server_ciphers = no -auth_verbose = yes mail_max_userip_connections = 100 mail_plugins = quota passdb { diff --git a/install/tpl/debian_dovecot2.conf.master b/install/tpl/debian_dovecot2.conf.master index 60a1263e48..4b3186a4a1 100644 --- a/install/tpl/debian_dovecot2.conf.master +++ b/install/tpl/debian_dovecot2.conf.master @@ -10,7 +10,6 @@ ssl_key = Date: Thu, 24 Sep 2020 14:48:53 +0200 Subject: [PATCH 0739/1368] always create acme vhost config --- install/install.php | 11 ++++++++++- install/lib/installer_base.lib.php | 31 +++++++++++++++--------------- install/update.php | 8 ++++++++ 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/install/install.php b/install/install.php index 4437bd8fa3..ef8264169a 100644 --- a/install/install.php +++ b/install/install.php @@ -536,6 +536,14 @@ if($force) { $inst->configure_fail2ban(); } +// create acme vhost +if($conf['nginx']['installed'] == true) { + $inst->make_acme_vhost('nginx'); // we need this config file but we don't want nginx to be restarted at this point +} +if($conf['apache']['installed'] == true) { + $inst->make_acme_vhost('apache'); // we need this config file but we don't want apache to be restarted at this point +} + //** Configure ISPConfig :-) $install_ispconfig_interface_default = ($conf['mysql']['master_slave_setup'] == 'y')?'n':'y'; if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPConfig Web Interface', array('y', 'n'), $install_ispconfig_interface_default,'install_ispconfig_web_interface')) == 'y') { @@ -572,8 +580,9 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon // Create SSL certs for non-webserver(s)? if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { - if(strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') + if(strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') { $inst->make_ispconfig_ssl_cert(); + } } else { swriteln('Certificate exists. Not creating a new one.'); } diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 9ac5c788f0..efb161569d 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2721,9 +2721,15 @@ class installer_base { return $response; } - private function make_acme_vhost($server_name, $server = 'apache', $restart = true) { + private function make_acme_vhost($server = 'apache') { global $conf; + if($conf['hostname'] !== 'localhost' && $conf['hostname'] !== '') { + $server_name = $conf['hostname']; + } else { + $server_name = exec('hostname -f'); + } + $use_template = 'apache_acme.conf.master'; $use_symlink = '999-acme.conf'; $use_name = 'acme.conf'; @@ -2759,15 +2765,6 @@ class installer_base { if(!@is_link($vhost_conf_enabled_dir.'' . $use_symlink)) { symlink($vhost_conf_dir.'/' . $use_name, $vhost_conf_enabled_dir.'/' . $use_symlink); } - if($restart === true) { - if($conf[$server]['installed'] == true && $conf[$server]['init_script'] != '') { - if($this->is_update) { - system($this->getinitcommand($conf[$server]['init_script'], 'force-reload').' &> /dev/null || ' . $this->getinitcommand($conf[$server]['init_script'], 'restart').' &> /dev/null'); - } else { - system($this->getinitcommand($conf[$server]['init_script'], 'restart').' &> /dev/null'); - } - } - } } public function make_ispconfig_ssl_cert() { @@ -2893,15 +2890,22 @@ class installer_base { // first of all create the acme vhosts if not existing if($conf['nginx']['installed'] == true) { swriteln('Using nginx for certificate validation'); - $this->make_acme_vhost($hostname, 'nginx'); + $server = 'nginx'; } elseif($conf['apache']['installed'] == true) { swriteln('Using apache for certificate validation'); if($this->is_update == false && @is_link($vhost_conf_enabled_dir.'/000-ispconfig.conf')) { $restore_conf_symlink = true; unlink($vhost_conf_enabled_dir.'/000-ispconfig.conf'); } + $server = 'apache'; + } - $this->make_acme_vhost($hostname, 'apache'); + if($conf[$server]['installed'] == true && $conf[$server]['init_script'] != '') { + if($this->is_update) { + system($this->getinitcommand($conf[$server]['init_script'], 'force-reload').' &> /dev/null || ' . $this->getinitcommand($conf[$server]['init_script'], 'restart').' &> /dev/null'); + } else { + system($this->getinitcommand($conf[$server]['init_script'], 'restart').' &> /dev/null'); + } } $issued_successfully = false; @@ -2999,9 +3003,6 @@ class installer_base { } } } else { - if($conf['apache']['installed'] == true) { - $this->make_acme_vhost($hostname, 'apache', false); // we need this config file but we don't want apache to be restarted at this point - } if(($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips))) { // the directory already exists so we have to assume that it was created previously $issued_successfully = true; diff --git a/install/update.php b/install/update.php index 1b6331f7da..3107adbb62 100644 --- a/install/update.php +++ b/install/update.php @@ -519,6 +519,14 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel //** Configure ISPConfig swriteln('Updating ISPConfig'); +// create acme vhost +if($conf['nginx']['installed'] == true) { + $inst->make_acme_vhost('nginx'); // we need this config file but we don't want nginx to be restarted at this point +} +if($conf['apache']['installed'] == true) { + $inst->make_acme_vhost('apache'); // we need this config file but we don't want apache to be restarted at this point +} + if ($inst->install_ispconfig_interface) { //** Customise the port ISPConfig runs on $ispconfig_port_number = get_ispconfig_port_number(); -- GitLab From ebcab3571c5e7c1742cd68f4a603c7eac7c80129 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Sep 2020 14:59:28 +0200 Subject: [PATCH 0740/1368] - Do not try to issue a certificate a second time --- install/install.php | 5 ++++- install/lib/installer_base.lib.php | 10 ++++++++-- install/update.php | 5 ++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/install/install.php b/install/install.php index 4437bd8fa3..ee455dbca8 100644 --- a/install/install.php +++ b/install/install.php @@ -537,6 +537,7 @@ if($force) { } //** Configure ISPConfig :-) +$issue_tried = false; $install_ispconfig_interface_default = ($conf['mysql']['master_slave_setup'] == 'y')?'n':'y'; if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPConfig Web Interface', array('y', 'n'), $install_ispconfig_interface_default,'install_ispconfig_web_interface')) == 'y') { swriteln('Installing ISPConfig'); @@ -563,6 +564,7 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon if(strtolower($inst->simple_query('Do you want a secure (SSL) connection to the ISPConfig web interface', array('y', 'n'), 'y','ispconfig_use_ssl')) == 'y') { $inst->make_ispconfig_ssl_cert(); + $issue_tried = true; } $inst->install_ispconfig_interface = true; @@ -572,8 +574,9 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon // Create SSL certs for non-webserver(s)? if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { - if(strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') + if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') { $inst->make_ispconfig_ssl_cert(); + } } else { swriteln('Certificate exists. Not creating a new one.'); } diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 9ac5c788f0..f07eadff71 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2838,12 +2838,18 @@ class installer_base { } swriteln('Using certificate path ' . $acme_cert_dir); + $ip_address_match = false; if(!(($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)))) { swriteln('Server\'s public ip(s) (' . $svr_ip4 . ($svr_ip6 ? ', ' . $svr_ip6 : '') . ') not found in A/AAAA records for ' . $hostname . ': ' . implode(', ', $dns_ips)); + if(strtolower($inst->simple_query('Ignore DNS check and continue to request certificate?', array('y', 'n') , 'n','ignore_hostname_dns')) == 'y') { + $ip_address_match = true; + } + } else { + $ip_address_match = true; } - if ((!@is_dir($acme_cert_dir) || !@file_exists($check_acme_file) || !@file_exists($ssl_crt_file) || md5_file($check_acme_file) != md5_file($ssl_crt_file)) && (($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips)))) { + if ((!@is_dir($acme_cert_dir) || !@file_exists($check_acme_file) || !@file_exists($ssl_crt_file) || md5_file($check_acme_file) != md5_file($ssl_crt_file)) && $ip_address_match == true) { // This script is needed earlier to check and open http port 80 or standalone might fail // Make executable and temporary symlink latest letsencrypt pre, post and renew hook script before install @@ -3002,7 +3008,7 @@ class installer_base { if($conf['apache']['installed'] == true) { $this->make_acme_vhost($hostname, 'apache', false); // we need this config file but we don't want apache to be restarted at this point } - if(($svr_ip4 && in_array($svr_ip4, $dns_ips)) || ($svr_ip6 && in_array($svr_ip6, $dns_ips))) { + if($ip_address_match) { // the directory already exists so we have to assume that it was created previously $issued_successfully = true; } diff --git a/install/update.php b/install/update.php index 1b6331f7da..517f78cf4f 100644 --- a/install/update.php +++ b/install/update.php @@ -519,6 +519,7 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel //** Configure ISPConfig swriteln('Updating ISPConfig'); +$issue_tried = false; if ($inst->install_ispconfig_interface) { //** Customise the port ISPConfig runs on $ispconfig_port_number = get_ispconfig_port_number(); @@ -533,13 +534,15 @@ if ($inst->install_ispconfig_interface) { // $ispconfig_ssl_default = (is_ispconfig_ssl_enabled() == true)?'y':'n'; if(strtolower($inst->simple_query('Create new ISPConfig SSL certificate', array('yes', 'no'), 'no','create_new_ispconfig_ssl_cert')) == 'yes') { $inst->make_ispconfig_ssl_cert(); + $issue_tried = true; } } // Create SSL certs for non-webserver(s)? if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { - if(strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') + if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') { $inst->make_ispconfig_ssl_cert(); + } } else { swriteln('Certificate exists. Not creating a new one.'); } -- GitLab From d482b4e3239719aa54a29af6eeab1e9a77408dca Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 24 Sep 2020 16:22:03 +0200 Subject: [PATCH 0741/1368] Make DNSSEC available when value is null (#5571) --- server/plugins-available/powerdns_plugin.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/plugins-available/powerdns_plugin.inc.php b/server/plugins-available/powerdns_plugin.inc.php index 7ab23ec549..82240f106d 100644 --- a/server/plugins-available/powerdns_plugin.inc.php +++ b/server/plugins-available/powerdns_plugin.inc.php @@ -449,7 +449,7 @@ class powerdns_plugin { function notifySlave($data) { global $app; - + $pdns_control = $this->find_pdns_control(); if ( $pdns_control != false ) { $app->system->exec_safe($pdns_control . ' notify ?', rtrim($data["new"]["origin"],".")); @@ -458,7 +458,7 @@ class powerdns_plugin { function fetchFromMaster($data) { global $app; - + $pdns_control = $this->find_pdns_control(); if ( $pdns_control != false ) { $app->system->exec_safe($pdns_control . ' retrieve ?', rtrim($data["new"]["origin"],".")); @@ -502,7 +502,7 @@ class powerdns_plugin { } // If DNSSEC is wanted, enable it - if ($data['new']['dnssec_wanted'] === 'Y' && $data['old']['dnssec_wanted'] === 'N') { + if ($data['new']['dnssec_wanted'] === 'Y' && (is_null($data['old']['dnssec_wanted']) || $data['old']['dnssec_wanted'] === 'N')) { $this->soa_dnssec_create($data); } } -- GitLab From df38b81983c67044683f46ad66d4fdb81f1cb09d Mon Sep 17 00:00:00 2001 From: thom Date: Thu, 24 Sep 2020 16:25:55 +0200 Subject: [PATCH 0742/1368] Remove address_verify_sender_ttl (#5772) --- install/tpl/postfix_2-10.conf.master | 3 --- 1 file changed, 3 deletions(-) diff --git a/install/tpl/postfix_2-10.conf.master b/install/tpl/postfix_2-10.conf.master index d77f37e0a0..f9f28d89b8 100644 --- a/install/tpl/postfix_2-10.conf.master +++ b/install/tpl/postfix_2-10.conf.master @@ -1,5 +1,2 @@ # Postfix configuration for version 2.10 and up smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination - -# This is supported in version 2.9, but lets not create another conf file for it -address_verify_sender_ttl = 15686s -- GitLab From f55e6e1925b300eccfcf1f4aa3c5278c7fddf9ce Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Sep 2020 17:52:06 +0200 Subject: [PATCH 0743/1368] Invalid access scope for function --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 9aa48a7975..a096faadc9 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2721,7 +2721,7 @@ class installer_base { return $response; } - private function make_acme_vhost($server = 'apache') { + public function make_acme_vhost($server = 'apache') { global $conf; if($conf['hostname'] !== 'localhost' && $conf['hostname'] !== '') { -- GitLab From 9a00e6f043997c67763503011351ca3eb8aa9e84 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Sep 2020 17:56:18 +0200 Subject: [PATCH 0744/1368] Wrong path for cert on acme.sh check --- install/lib/installer_base.lib.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index a096faadc9..5d0a78cdf6 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2944,6 +2944,8 @@ class installer_base { rename($ssl_pem_file, $ssl_pem_file . '-' . $date->format('YmdHis') . '.bak'); } + $check_acme_file = $ssl_crt_file; + // Define LE certs name and path, then install them //$acme_cert = "--cert-file $acme_cert_dir/cert.pem"; $acme_key = "--key-file " . escapeshellarg($ssl_key_file); -- GitLab From 2ffbeb6996d606112ca977d06b15717870c478e1 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Sep 2020 18:34:11 +0200 Subject: [PATCH 0745/1368] Add missing require line for sieve --- server/conf/sieve_filter.master | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index b5dedebf29..51d8eeee14 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -29,6 +29,8 @@ redirect ""; # You can create and activate a per-user sieve script (manually or via managesieve), # which will execute before this. +require ["fileinto", "mailbox", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress", "copy", "reject"]; + # Move spam to spam folder if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", header :contains "subject" "*** SPAM ***", header :contains "subject" "***SPAM***") { -- GitLab From a056850e97413d3cfe1d4d72d90e1b76fa1e46cb Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Sep 2020 21:17:01 +0200 Subject: [PATCH 0746/1368] Revert "Merge branch '5772-sender-ttl' into 'develop'" This reverts merge request !1215 --- install/tpl/postfix_2-10.conf.master | 3 +++ 1 file changed, 3 insertions(+) diff --git a/install/tpl/postfix_2-10.conf.master b/install/tpl/postfix_2-10.conf.master index f9f28d89b8..d77f37e0a0 100644 --- a/install/tpl/postfix_2-10.conf.master +++ b/install/tpl/postfix_2-10.conf.master @@ -1,2 +1,5 @@ # Postfix configuration for version 2.10 and up smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination + +# This is supported in version 2.9, but lets not create another conf file for it +address_verify_sender_ttl = 15686s -- GitLab From 477009e7d2c3b245ef5ae9907b24fb0120976fc5 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 24 Sep 2020 15:06:54 -0600 Subject: [PATCH 0747/1368] clear negative address verify cache every 60s --- install/tpl/debian_postfix.conf.master | 2 ++ install/tpl/fedora_postfix.conf.master | 2 ++ install/tpl/gentoo_postfix.conf.master | 2 ++ install/tpl/opensuse_postfix.conf.master | 2 ++ 4 files changed, 8 insertions(+) diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 07128357e4..c5e04d5b3f 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -49,5 +49,7 @@ smtp_tls_exclude_ciphers = RC4, aNULL smtpd_tls_mandatory_ciphers = medium tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 tls_preempt_cipherlist = no +address_verify_negative_expire_time=60s +address_verify_cache_cleanup_interval=60s # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): enable_original_recipient = yes diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index a580f6a042..578890be44 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -45,5 +45,7 @@ smtp_tls_exclude_ciphers = RC4, aNULL smtpd_tls_mandatory_ciphers = medium tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 tls_preempt_cipherlist = no +address_verify_negative_expire_time=60s +address_verify_cache_cleanup_interval=60s # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): enable_original_recipient = yes diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index d0ed3d69f7..a18776944e 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -44,5 +44,7 @@ smtp_tls_exclude_ciphers = RC4, aNULL smtpd_tls_mandatory_ciphers = medium tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 tls_preempt_cipherlist = no +address_verify_negative_expire_time=60s +address_verify_cache_cleanup_interval=60s # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): enable_original_recipient = yes diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index 9065e9fa03..421c577c09 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -47,5 +47,7 @@ smtp_tls_exclude_ciphers = RC4, aNULL smtpd_tls_mandatory_ciphers = medium tls_medium_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384 tls_preempt_cipherlist = no +address_verify_negative_expire_time=60s +address_verify_cache_cleanup_interval=60s # needed for postfix < 3.3 when using reject_unverified_recipient (lmtp): enable_original_recipient = yes -- GitLab From 5f3b255243abc64c46a7bf30aa3cc6443704f275 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 25 Sep 2020 12:05:09 +0200 Subject: [PATCH 0748/1368] Changed min. required PHP version from PHP 5.3.3 to PHP 5.4 --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 91b3696598..839e212d94 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -35,7 +35,7 @@ class installer_base { var $db; public $install_ispconfig_interface = true; public $is_update = false; // true if it is an update, falsi if it is a new install - public $min_php = '5.3.3'; // minimal php-version for update / install + public $min_php = '5.4'; // minimal php-version for update / install protected $mailman_group = 'list'; -- GitLab From 2c88f738323476ccf530378ff406fec7e05d75a2 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 25 Sep 2020 15:59:33 +0200 Subject: [PATCH 0749/1368] Fix #5763 autoinstall.ini haven't option for new question --- docs/autoinstall_samples/autoinstall.conf_sample.php | 8 ++++++++ docs/autoinstall_samples/autoinstall.ini.sample | 8 ++++++++ install/install.php | 2 +- install/lib/installer_base.lib.php | 4 ++-- install/update.php | 2 +- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/autoinstall_samples/autoinstall.conf_sample.php b/docs/autoinstall_samples/autoinstall.conf_sample.php index b5f3a57730..904d65403c 100644 --- a/docs/autoinstall_samples/autoinstall.conf_sample.php +++ b/docs/autoinstall_samples/autoinstall.conf_sample.php @@ -13,6 +13,10 @@ $autoinstall['http_server'] = 'nginx'; // apache (default), nginx $autoinstall['ispconfig_port'] = '8080'; // default: 8080 $autoinstall['ispconfig_use_ssl'] = 'y'; // y (default), n $autoinstall['ispconfig_admin_password'] = 'admin'; // default: admin +$autoinstall['create_ssl_server_certs'] = 'y'; +$autoinstall['ignore_hostname_dns'] = 'n'; +$autoinstall['ispconfig_postfix_ssl_symlink'] = 'y'; +$autoinstall['ispconfig_pureftpd_ssl_symlink'] = 'y'; /* SSL Settings */ $autoinstall['ssl_cert_country'] = 'AU'; @@ -52,6 +56,10 @@ $autoupdate['reconfigure_services'] = 'yes'; // yes (default), no $autoupdate['ispconfig_port'] = '8080'; // default: 8080 $autoupdate['create_new_ispconfig_ssl_cert'] = 'no'; // no (default), yes $autoupdate['reconfigure_crontab'] = 'yes'; // yes (default), no +$autoupdate['create_ssl_server_certs'] = 'y'; +$autoupdate['ignore_hostname_dns'] = 'n'; +$autoupdate['ispconfig_postfix_ssl_symlink'] = 'y'; +$autoupdate['ispconfig_pureftpd_ssl_symlink'] = 'y'; /* These are for service-detection (defaulting to old behaviour where alle changes were automatically accepted) */ $autoupdate['svc_detect_change_mail_server'] = 'yes'; // yes (default), no diff --git a/docs/autoinstall_samples/autoinstall.ini.sample b/docs/autoinstall_samples/autoinstall.ini.sample index 74523ffbc3..bf47122074 100644 --- a/docs/autoinstall_samples/autoinstall.ini.sample +++ b/docs/autoinstall_samples/autoinstall.ini.sample @@ -12,6 +12,10 @@ http_server=apache ispconfig_port=8080 ispconfig_use_ssl=y ispconfig_admin_password=admin +create_ssl_server_certs=y +ignore_hostname_dns=n +ispconfig_postfix_ssl_symlink=y +ispconfig_pureftpd_ssl_symlink=y [ssl_cert] ssl_cert_country=AU @@ -51,6 +55,10 @@ reconfigure_services=yes ispconfig_port=8080 create_new_ispconfig_ssl_cert=no reconfigure_crontab=yes +create_ssl_server_certs=y +ignore_hostname_dns=n +ispconfig_postfix_ssl_symlink=y +ispconfig_pureftpd_ssl_symlink=y ; These are for service-detection (defaulting to old behaviour where alle changes were automatically accepted) svc_detect_change_mail_server=yes diff --git a/install/install.php b/install/install.php index cdf6806092..a894ed45b4 100644 --- a/install/install.php +++ b/install/install.php @@ -582,7 +582,7 @@ if($install_mode == 'standard' || strtolower($inst->simple_query('Install ISPCon // Create SSL certs for non-webserver(s)? if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { - if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') { + if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y','create_ssl_server_certs')) == 'y') { $inst->make_ispconfig_ssl_cert(); } } else { diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 5d0a78cdf6..c9daf9d600 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3043,7 +3043,7 @@ class installer_base { exec("cat $ssl_key_file $ssl_crt_file > $ssl_pem_file; chmod 600 $ssl_pem_file"); // Extend LE SSL certs to postfix - if ($conf['postfix']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Postfix?', array('y', 'n'), 'y')) == 'y') { + if ($conf['postfix']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Postfix?', array('y', 'n'), 'y','ispconfig_postfix_ssl_symlink')) == 'y') { // Define folder, file(s) $cf = $conf['postfix']; @@ -3062,7 +3062,7 @@ class installer_base { } // Extend LE SSL certs to pureftpd - if ($conf['pureftpd']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Pure-FTPd? Creating dhparam file may take some time.', array('y', 'n'), 'y')) == 'y') { + if ($conf['pureftpd']['installed'] == true && strtolower($this->simple_query('Symlink ISPConfig SSL certs to Pure-FTPd? Creating dhparam file may take some time.', array('y', 'n'), 'y','ispconfig_pureftpd_ssl_symlink')) == 'y') { // Define folder, file(s) $pureftpd_dir = '/etc/ssl/private'; diff --git a/install/update.php b/install/update.php index 75be8a46cc..94fca6b101 100644 --- a/install/update.php +++ b/install/update.php @@ -548,7 +548,7 @@ if ($inst->install_ispconfig_interface) { // Create SSL certs for non-webserver(s)? if(!file_exists('/usr/local/ispconfig/interface/ssl/ispserver.crt')) { - if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y')) == 'y') { + if(!$issue_tried && strtolower($inst->simple_query('Do you want to create SSL certs for your server?', array('y', 'n'), 'y','create_ssl_server_certs')) == 'y') { $inst->make_ispconfig_ssl_cert(); } } else { -- GitLab From 3a20b7014557a750d710237d3c80a220af997a6a Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 25 Sep 2020 09:54:01 -0600 Subject: [PATCH 0750/1368] sieve redirect reuires :copy to maintain implicit keep --- server/conf/sieve_filter.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master index 51d8eeee14..dd2dfb9647 100644 --- a/server/conf/sieve_filter.master +++ b/server/conf/sieve_filter.master @@ -17,7 +17,7 @@ if anyof (header :contains "X-Spam-Flag" "YES", header :contains "X-Spam" "Yes", # Send a copy of email to -redirect ""; +redirect :copy ""; -- GitLab From 315b4721da498939b9f2775f4d32d46b03d416d4 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 25 Sep 2020 19:27:13 +0200 Subject: [PATCH 0751/1368] Fixed dataLogTimer property not defined Removed minified js file as it is unused --- .../web/themes/default/assets/javascripts/ispconfig.js | 8 ++++---- .../themes/default/assets/javascripts/ispconfig.min.js | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 interface/web/themes/default/assets/javascripts/ispconfig.min.js diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.js b/interface/web/themes/default/assets/javascripts/ispconfig.js index ff6dc681dc..26cfb0a9e4 100644 --- a/interface/web/themes/default/assets/javascripts/ispconfig.js +++ b/interface/web/themes/default/assets/javascripts/ispconfig.js @@ -176,7 +176,7 @@ var ISPConfig = { ISPConfig.onAfterContentLoad(target, $('#'+formname).serialize()); ISPConfig.pageFormChanged = false; } - clearTimeout(dataLogTimer); + clearTimeout(ISPConfig.dataLogTimer); ISPConfig.dataLogNotification(); ISPConfig.hideLoadIndicator(); }, @@ -285,7 +285,7 @@ var ISPConfig = { ISPConfig.onAfterContentLoad(pagename, (params ? params : null)); ISPConfig.pageFormChanged = false; } - clearTimeout(dataLogTimer); // clear running dataLogTimer + clearTimeout(ISPConfig.dataLogTimer); // clear running dataLogTimer ISPConfig.dataLogNotification(); ISPConfig.hideLoadIndicator(); }, @@ -514,12 +514,12 @@ var ISPConfig = { $('.modal-body').html(dataLogItems.join("")); $('.notification_text').text(data['count']); $('.notification').css('display',''); - dataLogTimer = setTimeout( function() { ISPConfig.dataLogNotification(); }, 2000 ); + ISPConfig.dataLogTimer = setTimeout( function() { ISPConfig.dataLogNotification(); }, 2000 ); } else { $('.notification').css('display','none'); $('.modal-body').html(''); $('#datalogModal').modal('hide'); - dataLogTimer = setTimeout( function() { ISPConfig.dataLogNotification(); }, 5000 ); + ISPConfig.dataLogTimer = setTimeout( function() { ISPConfig.dataLogNotification(); }, 5000 ); } }, error: function() { diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.min.js b/interface/web/themes/default/assets/javascripts/ispconfig.min.js deleted file mode 100644 index e118b994b0..0000000000 --- a/interface/web/themes/default/assets/javascripts/ispconfig.min.js +++ /dev/null @@ -1 +0,0 @@ -var ISPConfig={pageFormChanged:!1,tabChangeWarningTxt:"",tabChangeDiscardTxt:"",tabChangeWarning:!1,tabChangeDiscard:!1,requestsRunning:0,indicatorCompleted:!1,registeredHooks:new Array,new_tpl_add_id:0,dataLogTimer:0,options:{useLoadIndicator:!1,useComboBox:!1},setOption:function(a,b){ISPConfig.options[a]=b},setOptions:function(a){$.extend(ISPConfig.options,a)},reportError:function(){},registerHook:function(a,b){ISPConfig.registeredHooks[a]||(ISPConfig.registeredHooks[a]=new Array);var c=ISPConfig.registeredHooks[a].length;ISPConfig.registeredHooks[a][c]=b},callHook:function(a,b){if(ISPConfig.registeredHooks[a])for(var c=0;c
    '),a.appendTo("body"));var b=$("#content");if(b.length<1)return;ISPConfig.indicatorCompleted=!1;var c=b.offset().left+150,d=b.offset().top+150;a.css({left:c,top:d}).fadeIn("fast",function(){ISPConfig.indicatorCompleted=!0,ISPConfig.requestsRunning<1&&$(this).fadeOut("fast",function(){$(this).hide()})})}},hideLoadIndicator:function(){document.body.style.cursor="",ISPConfig.requestsRunning-=1,ISPConfig.requestsRunning<1&&(ISPConfig.requestsRunning=0,1==ISPConfig.indicatorCompleted&&$("#ajaxloader").fadeOut("fast",function(){$("#ajaxloader").hide()}))},onAfterSideNavLoaded:function(){1==ISPConfig.options.useComboBox&&$("#sidebar").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:!0,allowClear:!0})},onAfterContentLoad:function(a,b){b=b?"&"+b:"",1==ISPConfig.options.useComboBox&&$("#pageContent").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:!0,allowClear:!0,formatResult:function(a){return a.id&&$(a.element).parent().hasClass("flags")?''+a.text+"":a.text},formatSelection:function(a){return a.id&&$(a.element).parent().hasClass("flags")?''+a.text+"":a.text}}).on("change",function(){$("#pageForm .table #Filter").length>0&&$("#pageForm .table #Filter").trigger("click")}),$('input[data-input-element="date"]').datetimepicker({language:"en",todayHighlight:!0,todayBtn:"linked",bootcssVer:3,fontAwesome:!0,autoclose:!0,minView:"month"}),$('input[data-input-element="datetime"]').datetimepicker({language:"en",todayHighlight:!0,todayBtn:"linked",bootcssVer:3,fontAwesome:!0,autoclose:!0}),$('[data-toggle="tooltip"]').tooltip({}),$('input[type="password"]').each(function(){$(this).prop("readonly",!0).tooltip({title:"Click to set",placement:"left"})}),$('input[type="password"]').on("click focus",function(){$(this).prop("readonly",!1),$(this).tooltip("destroy")}),ISPConfig.callHook("onAfterContentLoad",{url:a,data:b})},submitForm:function(a,b,c){var d=arguments[3];if(c||(c=!1),!c||window.confirm(c)){$.ajax({type:"POST",url:b,data:$("#"+a).serialize(),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(c,e,f){if(d&&alert(d),f.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=f.responseText.split(":");ISPConfig.loadContent(g[1])}else f.responseText.indexOf("LOGIN_REDIRECT:")>-1?document.location.href="./index.php":($("#pageContent").html(f.responseText),ISPConfig.onAfterContentLoad(b,$("#"+a).serialize()),ISPConfig.pageFormChanged=!1);clearTimeout(dataLogTimer),ISPConfig.dataLogNotification(),ISPConfig.hideLoadIndicator()},error:function(a){ISPConfig.hideLoadIndicator();a.responseText.split(":");ISPConfig.reportError("Ajax Request was not successful. 111")}})}},submitUploadForm:function(a,b){var c=function(a){var b,c=a.contentWindow.document.body.innerHTML;try{b=JSON.parse(c)}catch(d){b=c}var e=$("
    ").html(b),f="",g=e.find("#OKMsg").html();g&&(f='
    '+g+"
    ");var h=e.find("#errorMsg").html();h&&(f=f+'
    '+h+"
    ");var i=e.find('input[name="_csrf_key"]').val(),j=e.find('input[name="_csrf_id"]').val();return f=f+''},d="ajaxUploader-iframe-"+Math.round((new Date).getTime()/1e3);$("body").append('\n"; +$html .= "\n\n\n"; $html .= ""; echo $html; ?> -- GitLab From b9dc3b878c028153f4989ade169da202eea62251 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 2 Jun 2021 07:46:05 +0000 Subject: [PATCH 1194/1368] Update server/lib/classes/letsencrypt.inc.php --- server/lib/classes/letsencrypt.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 5f918f016d..ac805a6b67 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -80,7 +80,7 @@ class letsencrypt { } public function get_certbot_script() { - $letsencrypt = explode("\n", shell_exec('which letsencrypt certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot')); + $letsencrypt = explode("\n", shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt')); $letsencrypt = reset($letsencrypt); if(is_executable($letsencrypt)) { return $letsencrypt; -- GitLab From 7d4db1dab0aa00ab58a635b38e0f814ad7636027 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 3 Jun 2021 06:58:51 +0000 Subject: [PATCH 1195/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 622674267c..7856cc2f26 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2946,7 +2946,7 @@ class installer_base { } // Get the default LE client name and version - $le_client = explode("\n", shell_exec('which letsencrypt certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot')); + $le_client = explode("\n", shell_exec('which certbot /root/.local/share/letsencrypt/bin/letsencrypt /opt/eff.org/certbot/venv/bin/certbot letsencrypt')); $le_client = reset($le_client); // Check for Neilpang acme.sh as well -- GitLab From 86b801081bc42d1a485028a53de8f9b343d22728 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 3 Jun 2021 12:37:52 +0200 Subject: [PATCH 1196/1368] - do not use password protected ssl keys for self-signed --- .gitlab-ci.yml | 19 +++ install/lib/installer_base.lib.php | 12 +- interface/lib/classes/quota_lib.inc.php | 118 +++++++++--------- .../plugins-available/apache2_plugin.inc.php | 37 +----- 4 files changed, 87 insertions(+), 99 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f3bb140d1b..e1a4913454 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ stages: - syntax - syntax_diff - test + - build # ### Stage syntax @@ -63,3 +64,21 @@ test:install: - apt-get --yes install curl - curl --insecure https://127.0.0.1:8080/login/ - ps xaf + + +build:package: + stage: build + image: edbizarro/gitlab-ci-pipeline-php:7.2 + only: + refs: + - /^\d+\.\d+\.\d+$/ + except: + - branches + - merge_requests + - schedules + - pushes + script: + - echo "Building release." + + when: manual + allow_failure: false \ No newline at end of file diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 7856cc2f26..43d226aab5 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3147,17 +3147,11 @@ class installer_base { } // We can still use the old self-signed method - $ssl_pw = substr(md5(mt_rand()), 0, 6); - exec("openssl genrsa -des3 -passout pass:$ssl_pw -out $ssl_key_file 4096"); + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days 3650 -keyout ' . escapeshellarg($ssl_key_file) . ' -out ' . escapeshellarg($ssl_crt_file); if(AUTOINSTALL){ - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -key $ssl_key_file -out $ssl_csr_file"); - } else { - exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file"); + $openssl_cmd .= ' -subj ' . escapeshellarg('/C=' . $autoinstall['ssl_cert_country'] . '/ST=' . $autoinstall['ssl_cert_state'] . '/L=' . $autoinstall['ssl_cert_locality'] . '/O=' . $autoinstall['ssl_cert_organisation'] . '/OU=' . $autoinstall['ssl_cert_organisation_unit'] . '/CN=' . $autoinstall['ssl_cert_common_name']); } - exec("openssl req -x509 -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -in $ssl_csr_file -out $ssl_crt_file -days 3650"); - exec("openssl rsa -passin pass:$ssl_pw -in $ssl_key_file -out $ssl_key_file.insecure"); - rename($ssl_key_file, $ssl_key_file.'.secure'); - rename($ssl_key_file.'.insecure', $ssl_key_file); + exec($openssl_cmd); } // Build ispserver.pem file and chmod it diff --git a/interface/lib/classes/quota_lib.inc.php b/interface/lib/classes/quota_lib.inc.php index 3bae97f046..b02cdea994 100644 --- a/interface/lib/classes/quota_lib.inc.php +++ b/interface/lib/classes/quota_lib.inc.php @@ -2,8 +2,8 @@ class quota_lib { public function get_quota_data($clientid = null, $readable = true) { - global $app; - + global $app; + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'harddisk_quota' ORDER BY created DESC"); $monitor_data = array(); if(is_array($tmp_rec)) { @@ -12,10 +12,10 @@ class quota_lib { } } //print_r($monitor_data); - + // select all websites or websites belonging to client $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y' AND type = 'vhost'".(($clientid != null)?" AND sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)":'') . " ORDER BY domain", $clientid); - + //print_r($sites); if(is_array($sites) && !empty($sites)){ for($i=0;$i $sites[$i]['used'][1]){ $sites[$i]['used'] = $sites[$i]['used'][0]; @@ -35,13 +35,13 @@ class quota_lib { if (!is_numeric($sites[$i]['soft'])) $sites[$i]['soft']=$sites[$i]['soft'][1]; if (!is_numeric($sites[$i]['hard'])) $sites[$i]['hard']=$sites[$i]['hard'][1]; if (!is_numeric($sites[$i]['files'])) $sites[$i]['files']=$sites[$i]['files'][1]; - + $sites[$i]['used_raw'] = $sites[$i]['used']; $sites[$i]['soft_raw'] = $sites[$i]['soft']; $sites[$i]['hard_raw'] = $sites[$i]['hard']; $sites[$i]['files_raw'] = $sites[$i]['files']; $sites[$i]['used_percentage'] = ($sites[$i]['soft'] > 0 && $sites[$i]['used'] > 0 ? round($sites[$i]['used'] * 100 / $sites[$i]['soft']) : 0); - + if ($readable) { // colours $sites[$i]['display_colour'] = '#000000'; @@ -52,31 +52,31 @@ class quota_lib { } if($used_ratio >= 0.8) $sites[$i]['display_colour'] = '#fd934f'; if($used_ratio >= 1) $sites[$i]['display_colour'] = '#cc0000'; - + if($sites[$i]['used'] > 1024) { $sites[$i]['used'] = round($sites[$i]['used'] / 1024, 1).' MB'; } else { if ($sites[$i]['used'] != '') $sites[$i]['used'] .= ' KB'; } - + if($sites[$i]['soft'] > 1024) { $sites[$i]['soft'] = round($sites[$i]['soft'] / 1024, 1).' MB'; } else { $sites[$i]['soft'] .= ' KB'; } - + if($sites[$i]['hard'] > 1024) { $sites[$i]['hard'] = round($sites[$i]['hard'] / 1024, 1).' MB'; } else { $sites[$i]['hard'] .= ' KB'; } - + if($sites[$i]['soft'] == " KB") $sites[$i]['soft'] = $app->lng('unlimited_txt'); if($sites[$i]['hard'] == " KB") $sites[$i]['hard'] = $app->lng('unlimited_txt'); - + if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = $app->lng('unlimited_txt'); if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = $app->lng('unlimited_txt'); - + /* if(!strstr($sites[$i]['used'],'M') && !strstr($sites[$i]['used'],'K')) $sites[$i]['used'].= ' B'; if(!strstr($sites[$i]['soft'],'M') && !strstr($sites[$i]['soft'],'K')) $sites[$i]['soft'].= ' B'; @@ -86,35 +86,35 @@ class quota_lib { else { if (empty($sites[$i]['soft'])) $sites[$i]['soft'] = -1; if (empty($sites[$i]['hard'])) $sites[$i]['hard'] = -1; - + if($sites[$i]['soft'] == '0 B' || $sites[$i]['soft'] == '0 KB' || $sites[$i]['soft'] == '0') $sites[$i]['soft'] = -1; if($sites[$i]['hard'] == '0 B' || $sites[$i]['hard'] == '0 KB' || $sites[$i]['hard'] == '0') $sites[$i]['hard'] = -1; } } } - + return $sites; } - + public function get_trafficquota_data($clientid = null, $lastdays = 0) { global $app; - + $traffic_data = array(); - + // select vhosts (belonging to client) if($clientid != null){ $sql_where = " AND sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)"; } $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y' AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')".$sql_where, $clientid); - + $hostnames = array(); $traffic_data = array(); - + foreach ($sites as $site) { $hostnames[] = $site['domain']; $traffic_data[$site['domain']]['domain_id'] = $site['domain_id']; } - + // fetch all traffic-data of selected vhosts if (!empty($hostnames)) { $tmp_year = date('Y'); @@ -129,7 +129,7 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['this_year'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); $tmp_month = date('m', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); // Last Month @@ -137,14 +137,14 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_month'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); // Last Year $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(traffic_bytes) as t FROM web_traffic WHERE YEAR(traffic_date) = ? AND hostname IN ? GROUP BY hostname", $tmp_year, $hostnames); foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_year'] = $tmp_rec['t']; } - + if (is_int($lastdays) && ($lastdays > 0)) { // Last xx Days $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(traffic_bytes) as t FROM web_traffic WHERE (traffic_date >= DATE_SUB(NOW(), INTERVAL ? DAY)) AND hostname IN ? GROUP BY hostname", $lastdays, $hostnames); @@ -153,29 +153,29 @@ class quota_lib { } } } - + return $traffic_data; } public function get_ftptrafficquota_data($clientid = null, $lastdays = 0) { global $app; - + $traffic_data = array(); - + // select vhosts (belonging to client) if($clientid != null){ $sql_where = " AND sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)"; } $sites = $app->db->queryAllRecords("SELECT * FROM web_domain WHERE active = 'y' AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')".$sql_where, $clientid); - + $hostnames = array(); $traffic_data = array(); - + foreach ($sites as $site) { $hostnames[] = $site['domain']; $traffic_data[$site['domain']]['domain_id'] = $site['domain_id']; } - + // fetch all traffic-data of selected vhosts if (!empty($hostnames)) { $tmp_year = date('Y'); @@ -190,7 +190,7 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['this_year'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); $tmp_month = date('m', mktime(0, 0, 0, date("m")-1, date("d"), date("Y"))); // Last Month @@ -198,14 +198,14 @@ class quota_lib { foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_month'] = $tmp_rec['t']; } - + $tmp_year = date('Y', mktime(0, 0, 0, date("m"), date("d"), date("Y")-1)); // Last Year $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(in_bytes) AS ftp_in, SUM(out_bytes) AS ftp_out FROM ftp_traffic WHERE YEAR(traffic_date) = ? AND hostname IN ? GROUP BY hostname", $tmp_year, $hostnames); foreach ($tmp_recs as $tmp_rec) { $traffic_data[$tmp_rec['hostname']]['last_year'] = $tmp_rec['t']; } - + if (is_int($lastdays) && ($lastdays > 0)) { // Last xx Days $tmp_recs = $app->db->queryAllRecords("SELECT hostname, SUM(in_bytes) AS ftp_in, SUM(out_bytes) AS ftp_out FROM ftp_traffic WHERE (traffic_date >= DATE_SUB(NOW(), INTERVAL ? DAY)) AND hostname IN ? GROUP BY hostname", $lastdays, $hostnames); @@ -214,13 +214,13 @@ class quota_lib { } } } - + return $traffic_data; } - + public function get_mailquota_data($clientid = null, $readable = true) { global $app; - + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'email_quota' ORDER BY created DESC"); $monitor_data = array(); if(is_array($tmp_rec)) { @@ -235,25 +235,25 @@ class quota_lib { } } //print_r($monitor_data); - + // select all email accounts or email accounts belonging to client $emails = $app->db->queryAllRecords("SELECT * FROM mail_user".(($clientid != null)? " WHERE sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)" : '') . " ORDER BY email", $clientid); - + //print_r($emails); - if(is_array($emails) && !empty($emails)){ + if(is_array($emails) && !empty($emails)) { for($i=0;$ifunctions->htmlentities($emails[$i]['name']); $emails[$i]['used'] = isset($monitor_data[$email]['used']) ? $monitor_data[$email]['used'] : array(1 => 0); - + if (!is_numeric($emails[$i]['used'])) $emails[$i]['used']=$emails[$i]['used'][1]; - + $emails[$i]['quota_raw'] = $emails[$i]['quota']; $emails[$i]['used_raw'] = $emails[$i]['used']; $emails[$i]['used_percentage'] = ($emails[$i]['quota'] > 0 && $emails[$i]['used'] > 0 ? round($emails[$i]['used'] * 100 / $emails[$i]['quota']) : 0); - + if ($readable) { // colours $emails[$i]['display_colour'] = '#000000'; @@ -264,14 +264,14 @@ class quota_lib { } if($used_ratio >= 0.8) $emails[$i]['display_colour'] = '#fd934f'; if($used_ratio >= 1) $emails[$i]['display_colour'] = '#cc0000'; - + if($emails[$i]['quota'] == 0){ $emails[$i]['quota'] = $app->lng('unlimited_txt'); } else { $emails[$i]['quota'] = round($emails[$i]['quota'] / 1048576, 1).' MB'; } - - + + if($emails[$i]['used'] < 1544000) { $emails[$i]['used'] = round($emails[$i]['used'] / 1024, 1).' KB'; } else { @@ -280,13 +280,13 @@ class quota_lib { } } } - + return $emails; } - + public function get_databasequota_data($clientid = null, $readable = true) { global $app; - + $tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'database_size' ORDER BY created DESC"); $monitor_data = array(); if(is_array($tmp_rec)) { @@ -300,21 +300,21 @@ class quota_lib { } } //print_r($monitor_data); - + // select all databases belonging to client $databases = $app->db->queryAllRecords("SELECT * FROM web_database".(($clientid != null)? " WHERE sys_groupid = (SELECT default_group FROM sys_user WHERE client_id=?)" : '') . " ORDER BY database_name", $clientid); - + //print_r($databases); if(is_array($databases) && !empty($databases)){ for($i=0;$i 0) && ($databases[$i]['used'] > 0)) ? round($databases[$i]['used_raw'] * 100 / $databases[$i]['database_quota']) : 0; - + if ($readable) { // colours $databases[$i]['display_colour'] = '#000000'; @@ -325,14 +325,14 @@ class quota_lib { } if($used_ratio >= 0.8) $databases[$i]['display_colour'] = '#fd934f'; if($used_ratio >= 1) $databases[$i]['display_colour'] = '#cc0000'; - + if($databases[$i]['database_quota'] == 0){ $databases[$i]['database_quota'] = $app->lng('unlimited_txt'); } else { $databases[$i]['database_quota'] = $databases[$i]['database_quota'] . ' MB'; } - - + + if($databases[$i]['used'] < 1544000) { $databases[$i]['used'] = round($databases[$i]['used'] / 1024, 1).' KB'; } else { @@ -341,8 +341,8 @@ class quota_lib { } } } - + return $databases; } - + } diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 170f8b1b72..19f650d4b3 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -278,7 +278,6 @@ class apache2_plugin { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = ($data['new']['ssl_domain'] != '') ? $data['new']['ssl_domain'] : $data['new']['domain']; $key_file = $ssl_dir.'/'.$domain.'.key'; - $key_file2 = $ssl_dir.'/'.$domain.'.key.org'; $csr_file = $ssl_dir.'/'.$domain.'.csr'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; $bundle_file = $ssl_dir.'/'.$domain.'.bundle'; @@ -293,10 +292,6 @@ class apache2_plugin { $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'); @@ -346,44 +341,35 @@ class apache2_plugin { $ssl_ext_file = $ssl_dir.'/v3.ext'; $app->system->file_put_contents($ssl_ext_file, $ext_cnf); - $rand_file = $rand_file; - $key_file2 = $key_file2; - $openssl_cmd_key_file2 = $key_file2; - if(substr($domain, 0, 2) == '*.' && strpos($key_file2, '/ssl/\*.') !== false) $key_file2 = str_replace('/ssl/\*.', '/ssl/*.', $key_file2); // wildcard certificate - $key_file = $key_file; $openssl_cmd_key_file = $key_file; if(substr($domain, 0, 2) == '*.' && strpos($key_file, '/ssl/\*.') !== false) $key_file = str_replace('/ssl/\*.', '/ssl/*.', $key_file); // wildcard certificate $ssl_days = 3650; - $csr_file = $csr_file; $openssl_cmd_csr_file = $csr_file; if(substr($domain, 0, 2) == '*.' && strpos($csr_file, '/ssl/\*.') !== false) $csr_file = str_replace('/ssl/\*.', '/ssl/*.', $csr_file); // wildcard certificate $config_file = $ssl_cnf_file; - $crt_file = $crt_file; $openssl_cmd_crt_file = $crt_file; if(substr($domain, 0, 2) == '*.' && strpos($crt_file, '/ssl/\*.') !== false) $crt_file = str_replace('/ssl/\*.', '/ssl/*.', $crt_file); // wildcard certificate if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) { - - $app->system->exec_safe("openssl genrsa -des3 -rand ? -passout pass:? -out ? 2048", $rand_file, $ssl_password, $openssl_cmd_key_file2); - $app->system->exec_safe("openssl req -new -sha256 -passin pass:? -passout pass:? -key ? -out ? -days ? -config ?", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $ssl_days, $config_file); - $app->system->exec_safe("openssl rsa -passin pass:? -in ? -out ?", $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_key_file); + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days ? -keyout ? -out ? -config ?'; + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); if(file_exists($web_config['CA_path'].'/openssl.cnf')) { + $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); $app->system->exec_safe("openssl ca -batch -out ? -config ? -passin pass:? -in ? -extfile ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file, $ssl_ext_file); $app->log("Creating CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); if(filesize($crt_file) == 0 || !file_exists($crt_file)) { $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config " . $web_config['CA_path'] . "/openssl.cnf -passin pass:" . $web_config['CA_pass'] . " -in $openssl_cmd_csr_file -extfile $ssl_ext_file", LOGLEVEL_ERROR); } - }; + } if (@filesize($crt_file)==0 || !file_exists($crt_file)){ - $app->system->exec_safe("openssl req -x509 -passin pass:? -passout pass:? -key ? -in ? -out ? -days ? -config ? ", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $openssl_cmd_crt_file, $ssl_days, $config_file); + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); $app->log("Creating self-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); - }; + } } - $app->system->chmod($key_file2, 0400); $app->system->chmod($key_file, 0400); @$app->system->unlink($config_file); @$app->system->unlink($rand_file); @@ -445,10 +431,6 @@ class apache2_plugin { $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.'~'); @@ -1316,7 +1298,6 @@ class apache2_plugin { $tmp = $app->letsencrypt->get_website_certificate_paths($data); $domain = $tmp['domain']; $key_file = $tmp['key']; - $key_file2 = $tmp['key2']; $csr_file = $tmp['csr']; $crt_file = $tmp['crt']; $bundle_file = $tmp['bundle']; @@ -2094,17 +2075,12 @@ class apache2_plugin { $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'); //* Restore the ~ backup files if(is_file($key_file.'~')) $app->system->copy($key_file.'~', $key_file); - if(is_file($key_file2.'~')) $app->system->copy($key_file2.'~', $key_file2); if(is_file($crt_file.'~')) $app->system->copy($crt_file.'~', $crt_file); if(is_file($csr_file.'~')) $app->system->copy($csr_file.'~', $csr_file); if(is_file($bundle_file.'~')) $app->system->copy($bundle_file.'~', $bundle_file); @@ -2129,7 +2105,6 @@ class apache2_plugin { $this->ssl_certificate_changed = false; if(@is_file($key_file.'~')) $app->system->unlink($key_file.'~'); - if(@is_file($key_file2.'~')) $app->system->unlink($key_file2.'~'); if(@is_file($crt_file.'~')) $app->system->unlink($crt_file.'~'); if(@is_file($csr_file.'~')) $app->system->unlink($csr_file.'~'); if(@is_file($bundle_file.'~')) $app->system->unlink($bundle_file.'~'); -- GitLab From 66358f7d288988a9dc4e771e978a4906d459af96 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 4 Jun 2021 11:03:09 +0000 Subject: [PATCH 1197/1368] Change URI for git-develop download --- server/scripts/update_runner.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/scripts/update_runner.sh b/server/scripts/update_runner.sh index e432fc006a..f3eb684328 100644 --- a/server/scripts/update_runner.sh +++ b/server/scripts/update_runner.sh @@ -26,7 +26,7 @@ if [[ "$SOURCE" == "stable" ]] ; then elif [[ "$SOURCE" == "nightly" ]] ; then URL="https://www.ispconfig.org/downloads/ISPConfig-3-nightly.tar.gz" elif [[ "$SOURCE" == "git-develop" ]] ; then - URL="https://git.ispconfig.org/ispconfig/ispconfig3/repository/archive.tar.gz?ref=develop" + URL="https://git.ispconfig.org/ispconfig/ispconfig3/-/archive/develop/ispconfig3-develop.tar.gz" else echo "Please choose an installation source (stable, nightly, git-develop)" exit 1 -- GitLab From cabf6039d34cec43d166617ede7126a0bf053af9 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 8 Jun 2021 09:03:58 +0000 Subject: [PATCH 1198/1368] Update app.inc.php --- interface/lib/app.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php index 8617c34b21..ee4713cd98 100755 --- a/interface/lib/app.inc.php +++ b/interface/lib/app.inc.php @@ -126,6 +126,9 @@ class app { array($this->session, 'destroy'), array($this->session, 'gc')); + ini_set('session.cookie_httponly', true); + @ini_set('session.cookie_samesite', 'Lax'); + session_start(); //* Initialize session variables -- GitLab From 4946eca16ca6140cdb1d2ca668f902c254eb5d6f Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 8 Jun 2021 11:02:35 +0000 Subject: [PATCH 1199/1368] Update nginx_vhost.conf.master --- server/conf/nginx_vhost.conf.master | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master index 50c0cf5183..1c219f0cd4 100644 --- a/server/conf/nginx_vhost.conf.master +++ b/server/conf/nginx_vhost.conf.master @@ -355,11 +355,18 @@ server { listen []:; + + listen [::]:; + + - listen : ssl; + listen : ssl http2; - listen []: ssl; + listen []: ssl http2; + + + listen [::]: ssl http2; ssl_certificate ; ssl_certificate_key ; -- GitLab From e3bd768eda09e48cdf5d844c76daf0684b08aa6f Mon Sep 17 00:00:00 2001 From: Tommaso Perondi Date: Wed, 9 Jun 2021 11:16:37 +0200 Subject: [PATCH 1200/1368] FIX: - Query to get PHP-FPM socket directory now gets the correct directory --- server/plugins-available/apache2_plugin.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 19f650d4b3..f5437493cd 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1658,7 +1658,7 @@ class apache2_plugin { $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; - $custom_php_fpm_socket_dir = $tmp_php['custom_php_fpm_socket_dir']; + $custom_php_fpm_socket_dir = $tmp_php['php_fpm_socket_dir']; if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; } } @@ -1670,7 +1670,7 @@ class apache2_plugin { $custom_php_fpm_ini_dir = $tmp_php['php_fpm_ini_dir']; $custom_php_fpm_init_script = $tmp_php['php_fpm_init_script']; $custom_php_fpm_pool_dir = $tmp_php['php_fpm_pool_dir']; - $custom_php_fpm_socket_dir = $tmp_php['custom_php_fpm_socket_dir']; + $custom_php_fpm_socket_dir = $tmp_php['php_fpm_socket_dir']; if(substr($custom_php_fpm_ini_dir, -1) != '/') $custom_php_fpm_ini_dir .= '/'; } } -- GitLab From c3c9c984166f0ebb0b6b46dab52c7cbc0ce5ec6f Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 25 Jun 2021 10:12:43 +0000 Subject: [PATCH 1201/1368] Update 500-backup_mail.inc.php Disable quota and ACLS when doing a backup of mdbox mailboxes with dsnyc --- server/lib/classes/cron.d/500-backup_mail.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/500-backup_mail.inc.php b/server/lib/classes/cron.d/500-backup_mail.inc.php index f631f0043c..6a133fa839 100644 --- a/server/lib/classes/cron.d/500-backup_mail.inc.php +++ b/server/lib/classes/cron.d/500-backup_mail.inc.php @@ -126,7 +126,7 @@ class cronjob_backup_mail extends cronjob { if ($rec['maildir_format'] == 'mdbox') { if (empty($this->tmp_backup_dir)) $this->tmp_backup_dir = $rec['maildir']; // Create temporary backup-mailbox - $app->system->exec_safe("su -c ?", 'dsync backup -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup'); + $app->system->exec_safe("su -c ?", 'dsync backup -o plugin/acl= -o plugin/quota= -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup'); if($backup_mode == 'userzip') { $mail_backup_file.='.zip'; -- GitLab From 22e34a16a3317ef115d81ec03cc9565a1397c7e3 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 25 Jun 2021 10:46:36 -0600 Subject: [PATCH 1202/1368] custom letsencrypt renew hook --- server/scripts/letsencrypt_renew_hook.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/scripts/letsencrypt_renew_hook.sh b/server/scripts/letsencrypt_renew_hook.sh index 53fc31befd..63100ed650 100644 --- a/server/scripts/letsencrypt_renew_hook.sh +++ b/server/scripts/letsencrypt_renew_hook.sh @@ -12,8 +12,12 @@ ## If you need a custom hook file, create a file with the same name in ## /usr/local/ispconfig/server/conf-custom/scripts/ +## +## End the file with 'return 124' to signal that this script should not terminate. if [ -e "/usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh" ] ; then - . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh && exit 0 || exit 1; + . /usr/local/ispconfig/server/conf-custom/scripts/letsencrypt_renew_hook.sh + ret=$? + if [ $ret != 124 ]; then exit $ret; fi fi hostname=$(hostname -f) @@ -52,4 +56,4 @@ if [ -d "$lelive" ]; then if [ $(dpkg-query -W -f='${Status}' nginx 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service nginx restart; fi if [ $(dpkg-query -W -f='${Status}' apache2 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service apache2 restart; fi fi -else echo `/bin/date` "Your Lets Encrypt SSL certs path for your ISPConfig server FQDN is missing.$line" >> /var/log/ispconfig/ispconfig.log; fi \ No newline at end of file +else echo `/bin/date` "Your Lets Encrypt SSL certs path for your ISPConfig server FQDN is missing.$line" >> /var/log/ispconfig/ispconfig.log; fi -- GitLab From 679bae56dc798abfae2e5337e0c636da581c76c2 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 12 Jul 2021 07:40:40 +0000 Subject: [PATCH 1203/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 43d226aab5..9681d32e5e 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3002,13 +3002,13 @@ class installer_base { // Backup existing ispserver ssl files if(file_exists($ssl_crt_file) || is_link($ssl_crt_file)) { - rename($ssl_crt_file, $ssl_crt_file . '-temporary.bak'); + copy($ssl_crt_file, $ssl_crt_file . '-temporary.bak'); } if(file_exists($ssl_key_file) || is_link($ssl_key_file)) { - rename($ssl_key_file, $ssl_key_file . '-temporary.bak'); + copy($ssl_key_file, $ssl_key_file . '-temporary.bak'); } if(file_exists($ssl_pem_file) || is_link($ssl_pem_file)) { - rename($ssl_pem_file, $ssl_pem_file . '-temporary.bak'); + copy($ssl_pem_file, $ssl_pem_file . '-temporary.bak'); } // Attempt to use Neilpang acme.sh first, as it is now the preferred LE client -- GitLab From 679b2ec8952dbf302b9cec7acd102e8367d8db3c Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 13 Jul 2021 18:32:23 +0000 Subject: [PATCH 1204/1368] Update rspamd_antivirus.conf.master: don't skip virus scanning for text and image attachments. --- install/tpl/rspamd_antivirus.conf.master | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/install/tpl/rspamd_antivirus.conf.master b/install/tpl/rspamd_antivirus.conf.master index f88d81ac7c..aa3d2cc9f2 100644 --- a/install/tpl/rspamd_antivirus.conf.master +++ b/install/tpl/rspamd_antivirus.conf.master @@ -1,8 +1,11 @@ clamav { # If set force this action if any virus is found (default unset: no action is forced) #action = "reject"; - # if `true` only messages with non-image attachments will be checked (default true) + # Scan mime_parts separately - otherwise the complete mail will be transferred to AV Scanner scan_mime_parts = true; + # Scanning Text is suitable for some av scanner databases (e.g. Sanesecurity) + scan_text_mime = true; + scan_image_mime = true; # If `max_size` is set, messages > n bytes in size are not scanned #max_size = 20000000; # symbol to add (add it to metric if you want non-zero weight) @@ -25,6 +28,10 @@ clamav { # symbol_name = "pattern"; JUST_EICAR = "^Eicar-Test-Signature$"; } + patterns_fail { + # symbol_name = "pattern"; + CLAM_PROTOCOL_ERROR = '^unhandled response'; + } # `whitelist` points to a map of IP addresses. Mail from these addresses is not scanned. whitelist = "/etc/rspamd/antivirus.wl"; -} \ No newline at end of file +} -- GitLab From b8926ade07bc1d859c9a671bf96eb7061adbca99 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 15 Jul 2021 15:59:11 +0000 Subject: [PATCH 1205/1368] Update jk_init.ini.master - incorporate upstream (v2.22) changes and glob match some pathnames --- install/tpl/jk_init.ini.master | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 1060085e39..418488194f 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -6,11 +6,11 @@ [uidbasics] comment = common files for all jails that need user/group information -paths = /lib/libnsl.so.1, /lib64/libnsl.so.1, /lib/libnss*.so.2, /lib64/libnss*.so.2, /lib/i386-linux-gnu/libnsl.so.1, /lib/i386-linux-gnu/libnss*.so.2, /lib/x86_64-linux-gnu/libnsl.so.1, /lib/x86_64-linux-gnu/libnss*.so.2, /lib/arm-linux-gnueabihf/libnsl*.so.1, /lib/arm-linux-gnueabihf/libnss*.so.2, /lib/aarch64-linux-gnu/libnsl.so.1, /lib/aarch64-linux-gnu/libnss*.so.2, /etc/nsswitch.conf, /etc/ld.so.conf +paths = /lib*/libnsl.so.*, /lib*/libnss*.so.*, /lib/*/libnsl.so.*, /lib/*/libnss.so.*, /etc/nsswitch.conf, /etc/ld.so.conf [netbasics] comment = common files for all jails that need any internet connectivity -paths = /lib/libnss_dns.so.2, /lib64/libnss_dns.so.2, /lib/libnss_mdns*.so.2, /lib/i386-linux-gnu/libnss_dns.so.2, /lib/x86_64-linux-gnu/libnss_dns.so.2, /lib/arm-linux-gnueabihf/libnss_dns.so.2, /lib/aarch64-linux-gnu/libnss_dns.so.2, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs +paths = /lib*/libnss_dns.so.*, /lib*/libnss_mdns*.so.*, /lib/*/libnss_dns.so.*, /lib/*/libnss_mdns*.so.*, /etc/resolv.conf, /etc/host.conf, /etc/hosts, /etc/protocols, /etc/services, /etc/ssl/certs/, /usr/lib/ssl/certs [logbasics] comment = timezone information and log sockets @@ -35,22 +35,20 @@ devices = /dev/null [git] comment = Fast Version Control System -paths = /usr/bin/git*, /usr/lib/git-core, /usr/share/git-core, /usr/bin/pager +paths = /usr/bin/git*, /usr/lib/git-core, /usr/share/git-core, pager includesections = editors, perl, netbasics, basicshell, coreutils [scp] comment = ssh secure copy paths = scp includesections = netbasics, uidbasics -devices = /dev/urandom +devices = /dev/urandom, /dev/null [sftp] comment = ssh secure ftp paths = /usr/lib/sftp-server, /usr/libexec/openssh/sftp-server, /usr/lib/misc/sftp-server, /usr/libexec/sftp-server, /usr/lib/openssh/sftp-server includesections = netbasics, uidbasics devices = /dev/urandom, /dev/null -# on solaris -#paths = /usr/lib/ssh/sftp-server [ssh] comment = ssh secure shell @@ -74,6 +72,10 @@ users = root groups = root includesections = uidbasics +[interactiveshell] +comment = for ssh access to a full shell +includesections = uidbasics, basicshell, terminfo, editors, extendedshell + [midnightcommander] comment = Midnight Commander paths = mc, mcedit, mcview, /usr/share/mc @@ -226,11 +228,11 @@ comment = php version 7.4 paths = /usr/bin/php7.4, /usr/lib/php/7.4/, /usr/lib/php/20190902/, /usr/share/php/7.4/, /etc/php/7.4/cli/, /etc/php/7.4/mods-available/ includesections = php_common -[imagemagick] -comment = ImageMagick needed for php-imagemagick extension -paths = /usr/share/ImageMagick-*, /etc/ImageMagick-*, /usr/lib/i386-linux-gnu/ImageMagick-*, /usr/lib/x86_64-linux-gnu/ImageMagick-*, /usr/lib/arm-linux-gnueabihf/ImageMagick-*, /usr/lib/aarch64-linux-gnu/ImageMagick-* - [php8_0] comment = php version 8.0 paths = /usr/bin/php8.0, /usr/lib/php/8.0/, /usr/lib/php/20200930/, /usr/share/php/8.0/, /etc/php/8.0/cli/, /etc/php/8.0/mods-available/ includesections = php_common + +[imagemagick] +comment = ImageMagick needed for php-imagemagick extension +paths = /usr/share/ImageMagick-*, /etc/ImageMagick-*, /usr/lib/*/ImageMagick-* -- GitLab From 8a4596b20558f6006be8dbe28eb5d02dc0cb9b8b Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 15 Jul 2021 11:39:40 -0600 Subject: [PATCH 1206/1368] "ISPConfig v2 detected" message indicates possible fix --- install/install.php | 7 +++++- install/update.php | 6 ++++- server/lib/classes/system.inc.php | 38 ------------------------------- 3 files changed, 11 insertions(+), 40 deletions(-) diff --git a/install/install.php b/install/install.php index a5233744c8..6194e556a1 100644 --- a/install/install.php +++ b/install/install.php @@ -160,8 +160,13 @@ if(!is_writable(dirname(ISPC_LOG_FILE))){ die("ERROR: Cannot write to the ".dirname(ISPC_LOG_FILE)." directory. Are you root or sudo ?\n\n"); } +//** Check for ISPConfig 2.x versions if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) { - die('This software cannot be installed on a server wich runs ISPConfig 2.x.'); + if(is_dir('/home/admispconfig') { + die('This software cannot be installed on a server which runs ISPConfig 2.x.'); + } else { + die('This software cannot be installed on a server which runs ISPConfig 2.x; the presence of the /root/ispconfig/ directory may indicate an ISPConfig 2.x installation, otherwise you can remove or rename it to continue.'); + } } if(is_dir('/usr/local/ispconfig')) { diff --git a/install/update.php b/install/update.php index 0122f27678..d584c112cf 100644 --- a/install/update.php +++ b/install/update.php @@ -96,7 +96,11 @@ require_once 'lib/classes/tpl.inc.php'; //** Check for ISPConfig 2.x versions if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) { - die('This software cannot be installed on a server wich runs ISPConfig 2.x.'); + if(is_dir('/home/admispconfig') { + die('This software cannot be installed on a server which runs ISPConfig 2.x.'); + } else { + die('This software cannot be installed on a server which runs ISPConfig 2.x; the presence of the /root/ispconfig/ directory may indicate an ISPConfig 2.x installation, otherwise you can remove or rename it to continue.'); + } } // Patch is required to reapir latest amavis versions diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 5a99bbda20..9c202542e8 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1591,44 +1591,6 @@ class system{ - /** - * Scan the trash for virusses infection - * - */ - function make_trashscan(){ - global $app; - //trashscan erstellen - // Template Öffnen - $app->tpl->clear_all(); - $app->tpl->define( array(table => 'trashscan.master')); - - if(!isset($this->server_conf['virusadmin']) || trim($this->server_conf['virusadmin']) == '') $this->server_conf['virusadmin'] = 'admispconfig@localhost'; - if(substr($this->server_conf['virusadmin'], 0, 1) == '#'){ - $notify = 'no'; - } else { - $notify = 'yes'; - } - - // Variablen zuweisen - $app->tpl->assign( array(VIRUSADMIN => $this->server_conf['virusadmin'], - NOTIFICATION => $notify)); - - $app->tpl->parse(TABLE, table); - - $trashscan_text = $app->tpl->fetch(); - - $datei = '/home/admispconfig/ispconfig/tools/clamav/bin/trashscan'; - $app->file->wf($datei, $trashscan_text); - - chmod($datei, 0755); - chown($datei, 'admispconfig'); - chgrp($datei, 'admispconfig'); - } - - - - - /** * Get the current time * -- GitLab From 4096880fbdddd6404be57414393eef3358031113 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 15 Jul 2021 14:42:24 -0600 Subject: [PATCH 1207/1368] missing parenthesis --- install/install.php | 2 +- install/update.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/install/install.php b/install/install.php index 6194e556a1..b94c1c7f6f 100644 --- a/install/install.php +++ b/install/install.php @@ -162,7 +162,7 @@ if(!is_writable(dirname(ISPC_LOG_FILE))){ //** Check for ISPConfig 2.x versions if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) { - if(is_dir('/home/admispconfig') { + if(is_dir('/home/admispconfig')) { die('This software cannot be installed on a server which runs ISPConfig 2.x.'); } else { die('This software cannot be installed on a server which runs ISPConfig 2.x; the presence of the /root/ispconfig/ directory may indicate an ISPConfig 2.x installation, otherwise you can remove or rename it to continue.'); diff --git a/install/update.php b/install/update.php index d584c112cf..4639615801 100644 --- a/install/update.php +++ b/install/update.php @@ -96,7 +96,7 @@ require_once 'lib/classes/tpl.inc.php'; //** Check for ISPConfig 2.x versions if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) { - if(is_dir('/home/admispconfig') { + if(is_dir('/home/admispconfig')) { die('This software cannot be installed on a server which runs ISPConfig 2.x.'); } else { die('This software cannot be installed on a server which runs ISPConfig 2.x; the presence of the /root/ispconfig/ directory may indicate an ISPConfig 2.x installation, otherwise you can remove or rename it to continue.'); -- GitLab From 63368e9ead6a8405c58c5ad843aa9907ccb52985 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 15 Jul 2021 15:42:39 -0600 Subject: [PATCH 1208/1368] remove spamfilter_wblist entries when removing spamfilter_users --- interface/web/mail/mail_user_del.php | 9 +++++++- interface/web/mail/spamfilter_users_del.php | 23 ++++++++++++++++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/interface/web/mail/mail_user_del.php b/interface/web/mail/mail_user_del.php index dc92047331..1f19166ef7 100644 --- a/interface/web/mail/mail_user_del.php +++ b/interface/web/mail/mail_user_del.php @@ -55,6 +55,14 @@ class page_action extends tform_actions { global $app; $conf; $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + if (is_array($tmp_user) && isset($tmp_user['id'])) { + $tmp_wblists = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_user['id']); + if(is_array($tmp_wblists)) { + foreach($tmp_wblists as $tmp) { + $app->db->datalogDelete('spamfilter_wblist', 'wblist_id', $tmp['wblist_id']); + } + } + } $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); $tmp_filters = $app->db->queryAllRecords("SELECT filter_id FROM mail_user_filter WHERE mailuser_id = ?", $this->id); @@ -71,4 +79,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onDelete(); -?> diff --git a/interface/web/mail/spamfilter_users_del.php b/interface/web/mail/spamfilter_users_del.php index 0dc92935c1..a243803f9f 100644 --- a/interface/web/mail/spamfilter_users_del.php +++ b/interface/web/mail/spamfilter_users_del.php @@ -45,7 +45,24 @@ require_once '../../lib/app.inc.php'; //* Check permissions for module $app->auth->check_module_permissions('mail'); -$app->uses("tform_actions"); -$app->tform_actions->onDelete(); +$app->uses('tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onBeforeDelete() { + global $app; $conf; + + $tmp_wblists = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $this->id); + if(is_array($tmp_wblists)) { + foreach($tmp_wblists as $tmp) { + $app->db->datalogDelete('spamfilter_wblist', 'wblist_id', $tmp['wblist_id']); + } + } + } + +} + +$page = new page_action; +$page->onDelete(); -?> -- GitLab From 17a4b7d10083a194dd9f12f0f01d7fa59c38e9ea Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 3 Aug 2021 17:22:16 -0600 Subject: [PATCH 1209/1368] fix php warning in cron_plugin.php --- server/plugins-available/cron_plugin.inc.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/server/plugins-available/cron_plugin.inc.php b/server/plugins-available/cron_plugin.inc.php index 1d44a849aa..331e85f919 100644 --- a/server/plugins-available/cron_plugin.inc.php +++ b/server/plugins-available/cron_plugin.inc.php @@ -184,12 +184,14 @@ class cron_plugin { if(!$parent_domain) { $tmp = $app->db->queryOneRecord('SELECT * FROM sys_datalog WHERE dbtable = ? AND dbidx = ? AND `action` = ? ORDER BY `datalog_id` DESC', 'web_domain', 'domain_id:' . $data['old']['parent_domain_id'], 'd'); - $tmp = unserialize($tmp); - if($tmp && isset($tmp['old'])) { - $this->parent_domain = $tmp['old']; - } else { - $app->log("Parent domain not found", LOGLEVEL_WARN); - return 0; + if(is_array($tmp) && isset($tmp['data']) && strlen($tmp['data']) > 0) { + $tmp = unserialize($tmp['data']); + if($tmp && isset($tmp['old'])) { + $this->parent_domain = $tmp['old']; + } else { + $app->log("Parent domain not found", LOGLEVEL_WARN); + return 0; + } } } else { $this->parent_domain = $parent_domain; -- GitLab From 8e60423faab16c4e96659e8f24a374bbff633569 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 9 Aug 2021 15:44:10 -0600 Subject: [PATCH 1210/1368] create missing jailkit when enabling php --- .../plugins-available/apache2_plugin.inc.php | 29 ++++++---------- server/plugins-available/nginx_plugin.inc.php | 34 ++++++++----------- 2 files changed, 24 insertions(+), 39 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 19f650d4b3..76967c9935 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -533,7 +533,7 @@ class apache2_plugin { $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - //* Check if this is a chrooted setup + //* Check if apache is using a chrooted setup if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { $apache_chrooted = true; $app->log('Info: Apache is chrooted.', LOGLEVEL_DEBUG); @@ -547,7 +547,7 @@ class apache2_plugin { } if($app->system->is_allowed_user($data['new']['system_user'], $app->system->is_user($data['new']['system_user']), true) == false || $app->system->is_allowed_group($data['new']['system_group'], $app->system->is_group($data['new']['system_group']), true) == false) { - $app->log('Websites cannot be owned by the root user or group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); + $app->log('Problem with website user or group. Websites cannot be owned by root or an existing user/group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); return 0; } if(trim($data['new']['domain']) == '') { @@ -641,7 +641,7 @@ class apache2_plugin { $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 + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -674,9 +674,7 @@ class apache2_plugin { //* 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); $app->system->exec_safe('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 @@ -696,15 +694,6 @@ class apache2_plugin { if($apache_chrooted) $app->system->exec_safe('chroot ? ?', $web_config['website_basedir'], $command); //* Change the log mount - /* - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - */ - $fstab_line_old = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; if($web_config['network_filesystem'] == 'y') { @@ -719,8 +708,6 @@ class apache2_plugin { } - //print_r($data); - // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); @@ -772,8 +759,12 @@ class apache2_plugin { $update_hash = hash('md5', implode(' ', $last_updated)); $check_for_jailkit_updates=false; - // Create jailkit chroot when enabling php_fpm_chroot - if($data['new']['php_fpm_chroot'] == 'y' && $data['old']['php_fpm_chroot'] != 'y' && $data['new']['php'] != 'no') { + $create_jail_conditions= ($data['old']['php_fpm_chroot'] != 'y' || + ! is_dir($data['new']['document_root'].'/etc/jailkit') || + ($data['old']['php'] != $data['new']['php'] && $data['new']['php'] != 'no')); + + // Create jailkit chroot if needed and when enabling php_fpm_chroot + if($data['new']['php_fpm_chroot'] == 'y' && $create_jail_conditions && $data['new']['php'] != 'no') { $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $data['new']['domain_id']); $this->website = array_merge($website, $data['new'], array('new_jailkit_hash' => $update_hash)); $this->jailkit_config = $jailkit_config; @@ -875,7 +866,7 @@ class apache2_plugin { $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); - // remove the symlinks, if not exist + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 2a1ba6c13a..adf0ed0781 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -379,7 +379,7 @@ class nginx_plugin { $app->uses('getconf'); $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); - //* Check if this is a chrooted setup + //* Check if nginx is using a chrooted setup if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { $nginx_chrooted = true; $app->log('Info: nginx is chrooted.', LOGLEVEL_DEBUG); @@ -393,7 +393,7 @@ class nginx_plugin { } if($app->system->is_allowed_user($data['new']['system_user'], $app->system->is_user($data['new']['system_user']), true) == false || $app->system->is_allowed_group($data['new']['system_group'], $app->system->is_group($data['new']['system_group']), true) == false) { - $app->log('Websites cannot be owned by the root user or group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); + $app->log('Problem with website user or group. Websites cannot be owned by root or an existing user/group. User: '.$data['new']['system_user'].' Group: '.$data['new']['system_group'], LOGLEVEL_WARN); return 0; } if(trim($data['new']['domain']) == '') { @@ -500,7 +500,7 @@ class nginx_plugin { $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 + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -508,6 +508,9 @@ class nginx_plugin { } } + //* Remove protection of old folders + $app->system->web_folder_protection($data['old']['document_root'], false); + if($data["new"]["type"] != "vhostsubdomain" && $data["new"]["type"] != "vhostalias") { //* Move the site data $tmp_docroot = explode('/', $data['new']['document_root']); @@ -530,9 +533,7 @@ class nginx_plugin { //* 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); $app->system->exec_safe('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 @@ -552,15 +553,6 @@ class nginx_plugin { if($nginx_chrooted) $app->system->exec_safe('chroot ? ?', $web_config['website_basedir'], $command); //* Change the log mount - /* - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - $fstab_line = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind,nobootwait'; - $app->system->removeLine('/etc/fstab', $fstab_line); - */ - $fstab_line_old = '/var/log/ispconfig/httpd/'.$data['old']['domain'].' '.$data['old']['document_root'].'/'.$old_log_folder.' none bind'; if($web_config['network_filesystem'] == 'y') { @@ -575,8 +567,6 @@ class nginx_plugin { } - //print_r($data); - // Check if the directories are there and create them if necessary. $app->system->web_folder_protection($data['new']['document_root'], false); @@ -628,8 +618,12 @@ class nginx_plugin { $update_hash = hash('md5', implode(' ', $last_updated)); $check_for_jailkit_updates=false; - // Create jailkit chroot when enabling php_fpm_chroot - if($data['new']['php_fpm_chroot'] == 'y' && $data['old']['php_fpm_chroot'] != 'y' && $data['new']['php'] != 'no') { + $create_jail_conditions= ($data['old']['php_fpm_chroot'] != 'y' || + ! is_dir($data['new']['document_root'].'/etc/jailkit') || + ($data['old']['php'] != $data['new']['php'] && $data['new']['php'] != 'no')); + + // Create jailkit chroot if needed and when enabling php_fpm_chroot + if($data['new']['php_fpm_chroot'] == 'y' && $create_jail_conditions && $data['new']['php'] != 'no') { $website = $app->db->queryOneRecord('SELECT * FROM web_domain WHERE domain_id = ?', $data['new']['domain_id']); $this->website = array_merge($website, $data['new'], array('new_jailkit_hash' => $update_hash)); $this->jailkit_config = $jailkit_config; @@ -731,7 +725,7 @@ class nginx_plugin { $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); - // remove the symlinks, if not exist + // remove the old symlinks if they exist if(is_link($tmp_symlink)) { $app->system->exec_safe('rm -f ?', $tmp_symlink); $app->log('Removed symlink: rm -f '.$tmp_symlink, LOGLEVEL_DEBUG); @@ -2143,7 +2137,7 @@ class nginx_plugin { if($data['old']['type'] == 'vhost' || $data['old']['type'] == 'vhostsubdomain' || $data['old']['type'] == 'vhostalias') $app->system->web_folder_protection($data['old']['document_root'], false); - //* Check if this is a chrooted setup + //* Check if nginx is using a chrooted setup if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { $nginx_chrooted = true; } else { -- GitLab From 8418cc3aedf8b49bc99bac084e018cca7fbc72fb Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 9 Aug 2021 17:37:59 -0600 Subject: [PATCH 1211/1368] force jails to update every 2 weeks --- .../cron.d/600-jailkit_maintenance.inc.php | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php b/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php index 4ef5835e67..e38ee58210 100644 --- a/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php +++ b/server/lib/classes/cron.d/600-jailkit_maintenance.inc.php @@ -34,22 +34,6 @@ class cronjob_jailkit_maintenance extends cronjob { protected $_schedule = '*/5 * * * *'; protected $_run_at_new = true; - //private $_tools = null; - - /* this function is optional if it contains no custom code */ - public function onPrepare() { - global $app; - - parent::onPrepare(); - } - - /* this function is optional if it contains no custom code */ - public function onBeforeRun() { - global $app; - - return parent::onBeforeRun(); - } - public function onRunJob() { global $app, $conf; @@ -66,6 +50,18 @@ class cronjob_jailkit_maintenance extends cronjob { $options = array('allow_hardlink'); } + // force all jails to update every 2 weeks + if (! is_file('/usr/local/ispconfig/server/temp/jailkit_force_update.ts')) { + if(!@is_dir('/usr/local/ispconfig/server/temp')) { + $app->system->mkdirpath('/usr/local/ispconfig/server/temp'); + } + $app->system->touch('/usr/local/ispconfig/server/temp/jailkit_force_update.ts'); + } elseif ( time() - filemtime('/usr/local/ispconfig/server/temp/jailkit_force_update.ts') > 60 * 60 * 24 * 14 ) { + $update_hash = 'force_update'.time(); + $app->db->query("UPDATE web_domain SET last_jailkit_hash = ? WHERE type = 'vhost' AND server_id = ?", $update_hash, $conf['server_id']); + $app->system->touch('/usr/local/ispconfig/server/temp/jailkit_force_update.ts'); + } + // limit the number of jails we update at one time according to time of day $num_jails_to_update = (date('H') < 6) ? 25 : 3; @@ -111,12 +107,12 @@ class cronjob_jailkit_maintenance extends cronjob { sort($last_updated, SORT_STRING); $update_hash = hash('md5', implode(' ', $last_updated)); - if (is_file( $rec['document_root']."/bin/bash" )) { + if (substr($rec['last_jailkit_hash'], 0, strlen('force_update')) === 'force_update') { + $options[] = 'force'; + } elseif (is_file( $rec['document_root']."/bin/bash" )) { # test that /bin/bash functions in the jail -print "chroot --userspec ".$rec['system_user'].":".$rec['system_group']." ".$rec['document_root']." /bin/bash -c true 2>/dev/null\n"; $app->system->exec_safe("chroot --userspec ?:? ? /bin/bash -c true 2>/dev/null", $rec['system_user'], $rec['system_group'], $rec['document_root']); if ($app->system->last_exec_retcode()) { # return 0 means success -print "/bin/bash test failed, forcing update\n"; $options[] = 'force'; # bogus hash will not match, triggering an update $update_hash = 'force_update'.time(); @@ -147,10 +143,5 @@ print "/bin/bash test failed, forcing update\n"; parent::onRunJob(); } - /* this function is optional if it contains no custom code */ - public function onAfterRun() { - parent::onAfterRun(); - } - } -- GitLab From c4417ba5399a06402e4bff3c7237176919186772 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 12 Jul 2021 07:40:40 +0000 Subject: [PATCH 1212/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 7fa747eecd..da50c79808 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3003,13 +3003,13 @@ class installer_base { // Backup existing ispserver ssl files if(file_exists($ssl_crt_file) || is_link($ssl_crt_file)) { - rename($ssl_crt_file, $ssl_crt_file . '-temporary.bak'); + copy($ssl_crt_file, $ssl_crt_file . '-temporary.bak'); } if(file_exists($ssl_key_file) || is_link($ssl_key_file)) { - rename($ssl_key_file, $ssl_key_file . '-temporary.bak'); + copy($ssl_key_file, $ssl_key_file . '-temporary.bak'); } if(file_exists($ssl_pem_file) || is_link($ssl_pem_file)) { - rename($ssl_pem_file, $ssl_pem_file . '-temporary.bak'); + copy($ssl_pem_file, $ssl_pem_file . '-temporary.bak'); } // Attempt to use Neilpang acme.sh first, as it is now the preferred LE client -- GitLab From 6ed08cf68cc09368f805629f8367e69fda3d6d6f Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 15 Mar 2021 11:14:01 -0600 Subject: [PATCH 1213/1368] allow 1-char domain names --- interface/lib/classes/remote.d/dns.inc.php | 2 +- interface/web/admin/form/server_config.tform.php | 2 +- interface/web/client/form/domain.tform.php | 2 +- interface/web/dns/dns_wizard.php | 10 ++++++---- interface/web/dns/form/dns_slave.tform.php | 2 +- interface/web/dns/form/dns_soa.tform.php | 2 +- interface/web/mail/ajax_get_json.php | 2 +- interface/web/mail/form/mail_aliasdomain.tform.php | 2 +- interface/web/mail/form/mail_domain_catchall.tform.php | 2 +- interface/web/mail/form/mail_mailinglist.tform.php | 2 +- interface/web/mail/form/xmpp_domain.tform.php | 2 +- 11 files changed, 16 insertions(+), 14 deletions(-) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 463b474cd1..15f47db874 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -248,7 +248,7 @@ class remoting_dns extends remoting { return false; } - if(!preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,63}$/', $origin)){ + if(!preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $origin)){ throw new SoapFault('no_domain_found', 'Invalid domain name.'); return false; } diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index d5133f2a01..47a48a3c27 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -131,7 +131,7 @@ $form["tabs"]['server'] = array( 'validators' => array( 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'hostname_error_empty'), 1 => array ('type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'hostname_error_regex'), ), 'value' => '', diff --git a/interface/web/client/form/domain.tform.php b/interface/web/client/form/domain.tform.php index a3dc1aaac0..f521a55b2d 100644 --- a/interface/web/client/form/domain.tform.php +++ b/interface/web/client/form/domain.tform.php @@ -100,7 +100,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/dns/dns_wizard.php b/interface/web/dns/dns_wizard.php index bef4422ef3..90e2fef1c4 100644 --- a/interface/web/dns/dns_wizard.php +++ b/interface/web/dns/dns_wizard.php @@ -276,18 +276,20 @@ if($_POST['create'] == 1) { } + # fixme: this regex is pretty poor for domain validation if(isset($_POST['domain']) && $_POST['domain'] == '') $error .= $app->lng('error_domain_empty').'
    '; - elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'
    '; + elseif(isset($_POST['domain']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9\-]{2,63}$/', $_POST['domain'])) $error .= $app->lng('error_domain_regex').'
    '; if(isset($_POST['ip']) && $_POST['ip'] == '') $error .= $app->lng('error_ip_empty').'
    '; if(isset($_POST['ipv6']) && $_POST['ipv6'] == '') $error .= $app->lng('error_ipv6_empty').'
    '; + # fixme: this regex is pretty poor for hostname validation if(isset($_POST['ns1']) && $_POST['ns1'] == '') $error .= $app->lng('error_ns1_empty').'
    '; - elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
    '; + elseif(isset($_POST['ns1']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns1'])) $error .= $app->lng('error_ns1_regex').'
    '; if(isset($_POST['ns2']) && $_POST['ns2'] == '') $error .= $app->lng('error_ns2_empty').'
    '; - elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{2,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
    '; + elseif(isset($_POST['ns2']) && !preg_match('/^[\w\.\-]{1,64}\.[a-zA-Z0-9]{2,63}$/', $_POST['ns2'])) $error .= $app->lng('error_ns2_regex').'
    '; if(isset($_POST['email']) && $_POST['email'] == '') $error .= $app->lng('error_email_empty').'
    '; elseif(isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) === false) $error .= $app->lng('error_email_regex').'
    '; @@ -326,7 +328,7 @@ if($_POST['create'] == 1) { // $enable_dnssec = (($_POST['dnssec'] == 'Y') ? 'Y' : 'N'); // if(isset($_POST['dnssec'])) $vars['dnssec_wanted'] = 'Y'; if(isset($_POST['dnssec'])) $tpl_content = str_replace('[ZONE]', '[ZONE]'."\n".'dnssec_wanted=Y', $tpl_content); - if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $_POST['domain'])) { + if(isset($_POST['dkim']) && preg_match('/^[\w\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', $_POST['domain'])) { $sql = $app->db->queryOneRecord("SELECT dkim_public, dkim_selector FROM mail_domain WHERE domain = ? AND dkim = 'y' AND ".$app->tform->getAuthSQL('r'), $_POST['domain']); $public_key = $sql['dkim_public']; if ($public_key!='') { diff --git a/interface/web/dns/form/dns_slave.tform.php b/interface/web/dns/form/dns_slave.tform.php index 55e085861a..bf684f9868 100644 --- a/interface/web/dns/form/dns_slave.tform.php +++ b/interface/web/dns/form/dns_slave.tform.php @@ -96,7 +96,7 @@ $form["tabs"]['dns_slave'] = array ( 'errmsg'=> 'origin_error_unique'), */ 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', diff --git a/interface/web/dns/form/dns_soa.tform.php b/interface/web/dns/form/dns_soa.tform.php index fe71757788..b9e402f441 100644 --- a/interface/web/dns/form/dns_soa.tform.php +++ b/interface/web/dns/form/dns_soa.tform.php @@ -120,7 +120,7 @@ $form["tabs"]['dns_soa'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'origin_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[a-zA-Z0-9\.\-\/]{2,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', + 'regex' => '/^[a-zA-Z0-9\.\-\/]{1,255}\.[a-zA-Z0-9\-]{2,63}[\.]{0,1}$/', 'errmsg'=> 'origin_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/ajax_get_json.php b/interface/web/mail/ajax_get_json.php index dfc9dc220c..c40c3bf401 100644 --- a/interface/web/mail/ajax_get_json.php +++ b/interface/web/mail/ajax_get_json.php @@ -113,7 +113,7 @@ header('Content-type: application/json'); echo $json; function validate_domain($domain) { - $regex = '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/'; + $regex = '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/'; if ( preg_match($regex, $domain) === 1 ) return true; else return false; } diff --git a/interface/web/mail/form/mail_aliasdomain.tform.php b/interface/web/mail/form/mail_aliasdomain.tform.php index a0d1024989..c94e1a9311 100644 --- a/interface/web/mail/form/mail_aliasdomain.tform.php +++ b/interface/web/mail/form/mail_aliasdomain.tform.php @@ -86,7 +86,7 @@ $form["tabs"]['alias'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'source_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^\@[\w\.\-]{2,64}\.[a-zA-Z0-9\-]{2,20}$/', + 'regex' => '/^\@[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'source_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/mail_domain_catchall.tform.php b/interface/web/mail/form/mail_domain_catchall.tform.php index 95e10354cc..ac4631bedb 100644 --- a/interface/web/mail/form/mail_domain_catchall.tform.php +++ b/interface/web/mail/form/mail_domain_catchall.tform.php @@ -86,7 +86,7 @@ $form["tabs"]['catchall'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^\@[\w\.\-]{2,255}\.[a-zA-Z\-]{2,63}$/', + 'regex' => '/^\@[\w\.\-]{1,255}\.[a-zA-Z\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/mail_mailinglist.tform.php b/interface/web/mail/form/mail_mailinglist.tform.php index ba877f410c..295bd8d571 100644 --- a/interface/web/mail/form/mail_mailinglist.tform.php +++ b/interface/web/mail/form/mail_mailinglist.tform.php @@ -87,7 +87,7 @@ $form["tabs"]['mailinglist'] = array ( 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', 'errmsg'=> 'domain_error_empty'), 1 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z\-]{2,10}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z\-]{2,10}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', diff --git a/interface/web/mail/form/xmpp_domain.tform.php b/interface/web/mail/form/xmpp_domain.tform.php index c703b0bea3..28262923b9 100644 --- a/interface/web/mail/form/xmpp_domain.tform.php +++ b/interface/web/mail/form/xmpp_domain.tform.php @@ -103,7 +103,7 @@ $form["tabs"]['domain'] = array ( 1 => array ( 'type' => 'UNIQUE', 'errmsg'=> 'domain_error_unique'), 2 => array ( 'type' => 'REGEX', - 'regex' => '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,63}$/', + 'regex' => '/^[\w\.\-]{1,255}\.[a-zA-Z0-9\-]{2,63}$/', 'errmsg'=> 'domain_error_regex'), ), 'default' => '', -- GitLab From 7a58805fbcf9892e2c0888aa3853a02b641ee5ec Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 16 Jul 2021 15:39:48 -0600 Subject: [PATCH 1214/1368] send spamfilter_wblist_update events for change of spamfilter_users.email --- interface/web/mail/spamfilter_users_edit.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/interface/web/mail/spamfilter_users_edit.php b/interface/web/mail/spamfilter_users_edit.php index b8bc9316c5..98493173cc 100644 --- a/interface/web/mail/spamfilter_users_edit.php +++ b/interface/web/mail/spamfilter_users_edit.php @@ -90,7 +90,7 @@ class page_action extends tform_actions { $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $client = $app->db->queryOneRecord("SELECT limit_spamfilter_user FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - // Check if the user may add another mailbox. + // Check if the user may add another spamfilter user. if($this->id == 0 && $client["limit_spamfilter_user"] >= 0) { $tmp = $app->db->queryOneRecord("SELECT count(id) as number FROM spamfilter_users WHERE sys_groupid = ?", $client_group_id); if($tmp["number"] >= $client["limit_spamfilter_user"]) { @@ -103,10 +103,21 @@ class page_action extends tform_actions { parent::onSubmit(); } + + function onAfterUpdate() { + global $app, $conf; + + // If email changes fire spamfilter_wblist_update events so rspamd files are rewritten + if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $this->dataRecord['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $this->dataRecord['id']), 'wblist_id', $tmp['wblist_id']); + } + } + } + } $app->tform_actions = new page_action; $app->tform_actions->onLoad(); - -?> -- GitLab From d7f9f242e3b53c48a69a6c868bbba4ef6ebeeb24 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 16 Jul 2021 15:40:37 -0600 Subject: [PATCH 1215/1368] send spamfilter_{users,wblist}_update events when mail_user email changes --- interface/web/mail/mail_domain_edit.php | 74 +++++++++++++++++++------ interface/web/mail/mail_user_edit.php | 40 +++++++++++-- 2 files changed, 93 insertions(+), 21 deletions(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 67a724dbaf..a980aeef50 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -405,14 +405,48 @@ class page_action extends tform_actions { global $app, $conf; $domain = $app->functions->idn_encode($this->dataRecord["domain"]); + $old_domain = $app->functions->idn_encode($this->oldDataRecord["domain"]); // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); + + // If domain changes, update spamfilter_users + // and fire spamfilter_wblist_update events so rspamd files are rewritten + $skip_spamfilter_users_update = false; + if(isset($old_domain != $domain) { + $tmp_old = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $old_domain); + if($tmp_old['id'] > 0) { + $tmp_new = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_new['id'] > 0) { + // There is a spamfilter_users for both old and new domain, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_old['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $tmp_new['id']), 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_old['id']); + } else { + $update_data = array( + 'email' => '@' . $domain, + 'policy_id' => $policy_id, + ); + if($tmp_old['fullname'] == '@' . $old_domain) { + $update_data['fullname'] = '@' . $domain; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_old['id']); + $skip_spamfilter_users_update = true; + } + } + } + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); if($policy_id > 0) { if($tmp_user["id"] > 0) { // There is already a record that we will update - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + if(!$skip_spamfilter_users_update) { + $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + } } else { $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); // We create a new record @@ -435,20 +469,23 @@ class page_action extends tform_actions { } else { if($tmp_user["id"] > 0) { // There is already a record but the user shall have no policy, so we delete it +// fixme: this abandons any spamfilter_wblist entries tied to this spamfilter_users id +// https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); } } // endif spamfilter policy //** If the domain name or owner has been changed, change the domain and owner in all mailbox records - if($this->oldDataRecord['domain'] != $domain || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { + if($old_domain != $domain || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { $app->uses('getconf'); $mail_config = $app->getconf->get_server_config($this->dataRecord["server_id"], 'mail'); //* Update the mailboxes - $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $this->oldDataRecord['domain']); + $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $old_domain; $sys_groupid = $app->functions->intval((isset($this->dataRecord['client_group_id']))?$this->dataRecord['client_group_id']:$this->oldDataRecord['sys_groupid']); $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = ?", $sys_groupid); $client_user_id = $app->functions->intval(($tmp['userid'] > 0)?$tmp['userid']:1); if(is_array($mailusers)) { +// fixme: change spamfilter_users and fire wblist events foreach($mailusers as $rec) { // setting Maildir, Homedir, UID and GID $mail_parts = explode("@", $rec['email']); @@ -460,32 +497,38 @@ class page_action extends tform_actions { } //* Update the aliases - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $this->oldDataRecord['domain'], '%@' . $this->oldDataRecord['domain']); + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $old_domain, '%@' . $old_domain); if(is_array($forwardings)) { +// fixme: change spamfilter_users and fire wblist events for aliases/forwards foreach($forwardings as $rec) { - $destination = str_replace($this->oldDataRecord['domain'], $domain, $rec['destination']); - $source = str_replace($this->oldDataRecord['domain'], $domain, $rec['source']); + $destination = str_replace($old_domain, $domain, $rec['destination']); + $source = str_replace($old_domain, $domain, $rec['source']); $app->db->datalogUpdate('mail_forwarding', array("source" => $source, "destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'forwarding_id', $rec['forwarding_id']); } } //* Update the mailinglist - $app->db->query("UPDATE mail_mailinglist SET sys_userid = ?, sys_groupid = ? WHERE domain = ?", $client_user_id, $sys_groupid, $this->oldDataRecord['domain']); + $mailinglists = $app->db->queryAllRecords("SELECT * FROM mail_mailinglist WHERE domain = ?", $old_domain); + if(is_array($mailinglists)) { + foreach($mailinglists as $rec) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'domain' => $domain, + 'email' => str_replace($old_domain, $domain, $rec['email']), + ); + $app->db->datalogUpdate('mail_mailinglist', $update_data, 'mailinglist_id', $rec['mailinglist_id']); + } + } //* Update fetchmail accounts - $fetchmail = $app->db->queryAllRecords("SELECT * FROM mail_get WHERE destination like ?", '%@' . $this->oldDataRecord['domain']); + $fetchmail = $app->db->queryAllRecords("SELECT * FROM mail_get WHERE destination like ?", '%@' . $old_domain); if(is_array($fetchmail)) { foreach($fetchmail as $rec) { - $destination = str_replace($this->oldDataRecord['domain'], $domain, $rec['destination']); + $destination = str_replace($old_domain, $domain, $rec['destination']); $app->db->datalogUpdate('mail_get', array("destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailget_id', $rec['mailget_id']); } } - - //* Delete the old spamfilter record - $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $this->oldDataRecord["domain"]); - $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); - unset($tmp); - } // end if domain name changed //* update dns-record when the dkim record was changed @@ -559,4 +602,3 @@ class page_action extends tform_actions { $page = new page_action; $page->onLoad(); -?> diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 1dca1db848..e24ca17c8f 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -329,11 +329,42 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); + // Handle email change + $skip_spamfilter_users_update = false; + if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $this->oldDataRecord['email']); + if($tmp_olduser["id"] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $tmp_newuser['id']), 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $this->dataRecord['email'], + 'policy_id' => $policy_id, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($this->oldDataRecord["email"])) { + $update_data['fullname'] = $app->functions->idn_decode($this->dataRecord["email"]); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + } + } + } + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); if($policy_id > 0) { if($tmp_user["id"] > 0) { // There is already a record that we will update - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + if(!$skip_spamfilter_users_update) { + $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + } } else { // We create a new record $insert_data = array( @@ -351,9 +382,11 @@ class page_action extends tform_actions { ); $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } - }else { + } else { if($tmp_user["id"] > 0) { // There is already a record but the user shall have no policy, so we delete it +// fixme: don't delete or we abandon users' wblist entries +// https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); } } // endif spamfilter policy @@ -372,8 +405,6 @@ class page_action extends tform_actions { //** If the email address has been changed, change it in all aliases too if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { - //if($this->oldDataRecord['email'] != $this->dataRecord['email']) { - //* Update the aliases $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = ?", $this->oldDataRecord['email']); if(is_array($forwardings)) { @@ -401,4 +432,3 @@ class page_action extends tform_actions { $app->tform_actions = new page_action; $app->tform_actions->onLoad(); -?> -- GitLab From 7d3ec68f499d309d243b3a715f7e248adb543a0e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 16 Jul 2021 16:36:52 -0600 Subject: [PATCH 1216/1368] update spamfilter_users and spamfilter_wblist when domain changes --- interface/web/mail/mail_domain_edit.php | 133 +++++++++++++++++++++++- 1 file changed, 128 insertions(+), 5 deletions(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index a980aeef50..36185ead69 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -413,7 +413,7 @@ class page_action extends tform_actions { // If domain changes, update spamfilter_users // and fire spamfilter_wblist_update events so rspamd files are rewritten $skip_spamfilter_users_update = false; - if(isset($old_domain != $domain) { + if($old_domain != $domain) { $tmp_old = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $old_domain); if($tmp_old['id'] > 0) { $tmp_new = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $domain); @@ -480,29 +480,152 @@ class page_action extends tform_actions { $mail_config = $app->getconf->get_server_config($this->dataRecord["server_id"], 'mail'); //* Update the mailboxes - $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $old_domain; + $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $old_domain); $sys_groupid = $app->functions->intval((isset($this->dataRecord['client_group_id']))?$this->dataRecord['client_group_id']:$this->oldDataRecord['sys_groupid']); $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = ?", $sys_groupid); $client_user_id = $app->functions->intval(($tmp['userid'] > 0)?$tmp['userid']:1); if(is_array($mailusers)) { -// fixme: change spamfilter_users and fire wblist events foreach($mailusers as $rec) { // setting Maildir, Homedir, UID and GID $mail_parts = explode("@", $rec['email']); $maildir = str_replace("[domain]", $domain, $mail_config["maildir_path"]); $maildir = str_replace("[localpart]", $mail_parts[0], $maildir); $email = $mail_parts[0].'@'.$this->dataRecord['domain']; - $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); + // update spamfilter_users and spamfilter_wblist if email change + $skip_spamfilter_users_update = false; + if($email != $mail_parts[0].'@'.$this->oldDataRecord['domain']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $mail_parts[0].'@'.$this->oldDataRecord['domain']); + if($tmp_olduser['id'] > 0) { + + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $mail_parts[0].'@'.$this->dataRecord['domain']); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $mail_parts[0].'@'.$this->dataRecord['domain'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($mail_parts[0].'@'.$this->oldDataRecord['domain'])) { + $update_data['fullname'] = $app->functions->idn_decode($mail_parts[0].'@'.$this->dataRecord['domain']); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $mail_parts[0].'@'.$this->dataRecord['domain']); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + /* + } else { + # fixme: insert spamfilter_users with correct policy_id, + # pending https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 + */ + } + + $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); + } } } //* Update the aliases $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $old_domain, '%@' . $old_domain); if(is_array($forwardings)) { -// fixme: change spamfilter_users and fire wblist events for aliases/forwards foreach($forwardings as $rec) { $destination = str_replace($old_domain, $domain, $rec['destination']); $source = str_replace($old_domain, $domain, $rec['source']); + + // update spamfilter_users and spamfilter_wblist if email change + $skip_spamfilter_users_update = false; + if($source != $rec['source']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['source']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $source, + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['source'])) { + $update_data['fullname'] = $app->functions->idn_decode($source); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + /* + } else { + # fixme: insert spamfilter_users with correct policy_id, + # pending https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 + */ + } + + } + $app->db->datalogUpdate('mail_forwarding', array("source" => $source, "destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'forwarding_id', $rec['forwarding_id']); } } -- GitLab From 20c5d50dbfa094575347544bd39eb0db6d36e313 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 21 Jul 2021 12:34:36 -0600 Subject: [PATCH 1217/1368] update spamfilter_users and spamfilter_wblist when mail_user.email changes --- interface/web/mail/mail_user_edit.php | 99 ++++++++++++++++----------- 1 file changed, 59 insertions(+), 40 deletions(-) diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index e24ca17c8f..30c6d15000 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -327,43 +327,70 @@ class page_action extends tform_actions { $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = ? AND ".$app->tform->getAuthSQL('r'), $app->functions->idn_encode($_POST["email_domain"])); $app->db->query("UPDATE mail_user SET sys_groupid = ? WHERE mailuser_id = ?", $domain["sys_groupid"], $this->id); + } + + // Set the fields for dovecot + if(isset($this->dataRecord["email"])) { + $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; + $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; + + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); + } + + //** Handle email address change + if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); - // Handle email change + + //** Update spamfilter_users and spamfilter_wblist $skip_spamfilter_users_update = false; - if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { - $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $this->oldDataRecord['email']); - if($tmp_olduser["id"] > 0) { - $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); - if($tmp_newuser['id'] > 0) { - // There is a spamfilter_users for both old and new email, we'll update old wblist entries - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); - foreach ($tmp_wblist as $tmp) { - $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $tmp_newuser['id']), 'wblist_id', $tmp['wblist_id']); - } + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $this->oldDataRecord['email']); + if($tmp_olduser["id"] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $update_date = array('rid' => $tmp_newuser['id']); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } - // now delete old spamfilter_users entry - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); - } else { - $update_data = array( - 'email' => $this->dataRecord['email'], - 'policy_id' => $policy_id, - ); - if($tmp_olduser['fullname'] == $app->functions->idn_decode($this->oldDataRecord["email"])) { - $update_data['fullname'] = $app->functions->idn_decode($this->dataRecord["email"]); - } - $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); - $skip_spamfilter_users_update = true; + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $this->dataRecord['email'], + 'policy_id' => $policy_id, + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + if($tmp_olduser['fullname'] == $app->functions->idn_decode($this->oldDataRecord['email'])) { + $update_data['fullname'] = $app->functions->idn_decode($this->dataRecord['email']); } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; } } - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); if($policy_id > 0) { if($tmp_user["id"] > 0) { // There is already a record that we will update if(!$skip_spamfilter_users_update) { - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + $update_data = array( + 'policy_id' => $policy_id, + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); } } else { // We create a new record @@ -390,27 +417,19 @@ class page_action extends tform_actions { $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); } } // endif spamfilter policy - } - - // Set the fields for dovecot - if(isset($this->dataRecord["email"])) { - $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; - $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; - $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; - $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); - } - - //** If the email address has been changed, change it in all aliases too - if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { //* Update the aliases $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = ?", $this->oldDataRecord['email']); if(is_array($forwardings)) { foreach($forwardings as $rec) { $destination = $this->dataRecord['email']; - $app->db->datalogUpdate('mail_forwarding', array("destination" => $destination), 'forwarding_id', $rec['forwarding_id']); + $update_data = array( + 'destination' => $destination, + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + $app->db->datalogUpdate('mail_forwarding', $update_data, 'forwarding_id', $rec['forwarding_id']); } } -- GitLab From 9a335174422f6baf6e051608fc979e35ded30405 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 28 Jul 2021 17:40:25 -0600 Subject: [PATCH 1218/1368] always keep spamfilter_users entries: #6201 --- .../tpl/gentoo/amavisd-ispconfig.conf.master | 3 +- .../sql/incremental/upd_dev_collection.sql | 2 + install/sql/ispconfig3.sql | 2 +- install/tpl/amavisd_user_config.master | 3 +- install/tpl/fedora_amavisd_conf.master | 3 +- install/tpl/opensuse_amavisd_conf.master | 3 +- interface/lib/classes/remote.d/client.inc.php | 2 +- interface/lib/classes/remote.d/mail.inc.php | 4 +- .../plugins/mail_mail_domain_plugin.inc.php | 250 ++++++++++++++++-- interface/web/client/client_del.php | 6 +- .../web/mail/form/spamfilter_users.tform.php | 2 +- .../web/mail/lib/lang/ar_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/bg_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/br_spamfilter_users.lng | 1 + .../web/mail/lib/lang/ca_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/cz_spamfilter_users.lng | 1 + .../web/mail/lib/lang/de_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/dk_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/el_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/en_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/es_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/fi_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/fr_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/hr_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/hu_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/id_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/it_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/ja_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/nl_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/pl_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/pt_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/ro_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/ru_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/se_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/sk_spamfilter_users.lng | 2 +- .../web/mail/lib/lang/tr_spamfilter_users.lng | 2 +- interface/web/mail/mail_domain_del.php | 4 + interface/web/mail/mail_domain_edit.php | 177 +++++++------ interface/web/mail/mail_user_del.php | 2 + interface/web/mail/mail_user_edit.php | 177 ++++++------- .../web/mail/spamfilter_blacklist_edit.php | 2 +- interface/web/mail/spamfilter_policy_edit.php | 11 +- interface/web/mail/spamfilter_users_edit.php | 25 +- .../web/mail/spamfilter_whitelist_edit.php | 2 +- .../mailuser/mail_user_spamfilter_edit.php | 58 ++-- interface/web/tools/resync.php | 86 +++--- server/plugins-available/mail_plugin.inc.php | 2 +- .../plugins-available/rspamd_plugin.inc.php | 24 +- 48 files changed, 561 insertions(+), 337 deletions(-) diff --git a/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master b/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master index 7e42c8a362..c60b50e2fa 100644 --- a/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master +++ b/install/dist/tpl/gentoo/amavisd-ispconfig.conf.master @@ -51,7 +51,8 @@ use strict; $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e69de29bb2..2a9a9ffd09 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -0,0 +1,2 @@ +-- default spamfilter_users.policy_id to 0 +ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 006beb6b53..9ebb69090f 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1545,7 +1545,7 @@ CREATE TABLE `spamfilter_users` ( `sys_perm_other` varchar(5) NOT NULL DEFAULT '', `server_id` int(11) unsigned NOT NULL DEFAULT '0', `priority` tinyint(3) unsigned NOT NULL default '7', - `policy_id` int(11) unsigned NOT NULL default '1', + `policy_id` int(11) unsigned NOT NULL default '0', `email` varchar(255) NOT NULL DEFAULT '', `fullname` varchar(64) default NULL, `local` varchar(1) default NULL, diff --git a/install/tpl/amavisd_user_config.master b/install/tpl/amavisd_user_config.master index 344ea9a152..f764bb3acb 100644 --- a/install/tpl/amavisd_user_config.master +++ b/install/tpl/amavisd_user_config.master @@ -33,7 +33,8 @@ use strict; $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/tpl/fedora_amavisd_conf.master b/install/tpl/fedora_amavisd_conf.master index 9cf4b801bc..2435e6939e 100644 --- a/install/tpl/fedora_amavisd_conf.master +++ b/install/tpl/fedora_amavisd_conf.master @@ -751,7 +751,8 @@ $banned_filename_re = new_RE( $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/install/tpl/opensuse_amavisd_conf.master b/install/tpl/opensuse_amavisd_conf.master index 419eea237c..7310db9cbf 100644 --- a/install/tpl/opensuse_amavisd_conf.master +++ b/install/tpl/opensuse_amavisd_conf.master @@ -746,7 +746,8 @@ $banned_filename_re = new_RE( $sql_select_policy = 'SELECT *,spamfilter_users.id'. ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'. - ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC'; + ' WHERE spamfilter_users.email IN (%k) AND spamfilter_users.policy_id != 0'. + ' ORDER BY spamfilter_users.priority DESC'; $sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'. diff --git a/interface/lib/classes/remote.d/client.inc.php b/interface/lib/classes/remote.d/client.inc.php index 58dcc3119f..5af1592db9 100644 --- a/interface/lib/classes/remote.d/client.inc.php +++ b/interface/lib/classes/remote.d/client.inc.php @@ -413,7 +413,7 @@ class remoting_client extends remoting { $app->db->query("DELETE FROM sys_user WHERE client_id = ?", $client_id); //* Delete all records (sub-clients, mail, web, etc....) of this client. - $tables = 'cron,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_traffic,domain,mail_mailinglist,client'; + $tables = 'cron,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_traffic,domain,mail_mailinglist,client,spamfilter_wblist'; $tables_array = explode(',', $tables); $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { diff --git a/interface/lib/classes/remote.d/mail.inc.php b/interface/lib/classes/remote.d/mail.inc.php index c4582c634e..286d6f6c57 100644 --- a/interface/lib/classes/remote.d/mail.inc.php +++ b/interface/lib/classes/remote.d/mail.inc.php @@ -663,7 +663,7 @@ class remoting_mail extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } - //* biała lista e-mail + //* add spamfilter whitelist entry public function mail_spamfilter_whitelist_add($session_id, $client_id, $params) { if (!$this->checkPerm($session_id, 'mail_spamfilter_whitelist_add')) @@ -763,7 +763,7 @@ class remoting_mail extends remoting { return $app->remoting_lib->getDataRecord($primary_id); } - //* filtr spamu użytkowników e-mail + //* Add new spamfilter_users public function mail_spamfilter_user_add($session_id, $client_id, $params) { if (!$this->checkPerm($session_id, 'mail_spamfilter_user_add')) diff --git a/interface/lib/plugins/mail_mail_domain_plugin.inc.php b/interface/lib/plugins/mail_mail_domain_plugin.inc.php index 598fe74f09..4ff756f44f 100644 --- a/interface/lib/plugins/mail_mail_domain_plugin.inc.php +++ b/interface/lib/plugins/mail_mail_domain_plugin.inc.php @@ -13,9 +13,10 @@ class mail_mail_domain_plugin { /* This function is called when the plugin is loaded - */ + */ function onLoad() { global $app; + //Register for the events $app->plugin->registerEvent('mail:mail_domain:on_after_insert', 'mail_mail_domain_plugin', 'mail_mail_domain_edit'); $app->plugin->registerEvent('mail:mail_domain:on_after_update', 'mail_mail_domain_plugin', 'mail_mail_domain_edit'); @@ -23,13 +24,13 @@ class mail_mail_domain_plugin { /* Function to create the sites_web_domain rule and insert it into the custom rules - */ + */ function mail_mail_domain_edit($event_name, $page_form) { global $app, $conf; $domain = $app->functions->idn_encode($page_form->dataRecord['domain']); - // make sure that the record belongs to the client group and not the admin group when a dmin inserts it + // make sure that the record belongs to the client group and not the admin group when admin inserts it // also make sure that the user can not delete entry created by an admin if($_SESSION["s"]["user"]["typ"] == 'admin' && isset($page_form->dataRecord["client_group_id"])) { $client_group_id = $app->functions->intval($page_form->dataRecord["client_group_id"]); @@ -64,6 +65,8 @@ class mail_mail_domain_plugin { $app->uses('getconf'); $mail_config = $app->getconf->get_server_config($page_form->dataRecord["server_id"], 'mail'); + $old_domain = $app->functions->idn_encode($page_form->oldDataRecord['domain']); + //* Update the mailboxes $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", "%@" . $page_form->oldDataRecord['domain']); $sys_groupid = $app->functions->intval((isset($page_form->dataRecord['client_group_id']))?$page_form->dataRecord['client_group_id']:$page_form->oldDataRecord['sys_groupid']); @@ -76,25 +79,164 @@ class mail_mail_domain_plugin { $maildir = str_replace("[domain]", $domain, $mail_config["maildir_path"]); $maildir = str_replace("[localpart]", $mail_parts[0], $maildir); $email = $mail_parts[0].'@'.$domain; + + // update spamfilter_users and spamfilter_wblist if email change + $skip_spamfilter_users_update = false; + if($email != $rec['email']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['email']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $email, + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['email'])) { + $update_data['fullname'] = $app->functions->idn_decode($email); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $page_form->dataRecord["server_id"], + "priority" => 5, + "policy_id" => 0, + "email" => $email, + "fullname" => $app->functions->idn_decode($email), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + } + $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); + } } //* Update the aliases - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source LIKE ? OR destination LIKE ?", "%@" . $page_form->oldDataRecord['domain'], "%@" . $page_form->oldDataRecord['domain']); + $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source like ? OR destination like ?", '%@' . $old_domain, '%@' . $old_domain); if(is_array($forwardings)) { foreach($forwardings as $rec) { - $destination = str_replace($page_form->oldDataRecord['domain'], $domain, $rec['destination']); - $source = str_replace($page_form->oldDataRecord['domain'], $domain, $rec['source']); + $destination = str_replace($old_domain, $domain, $rec['destination']); + $source = str_replace($old_domain, $domain, $rec['source']); + + // update spamfilter_users and spamfilter_wblist if source email changes + $skip_spamfilter_users_update = false; + if(strpos($rec['source'],'@'.$old_domain) && $source != $rec['source']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['source']); + if($tmp_olduser['id'] > 0) { + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_newuser['id'] > 0) { + // There is a spamfilter_users for both old and new email, we'll update old wblist entries + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + foreach ($tmp_wblist as $tmp) { + $update_data = array( + 'rid' => $tmp_newuser['id'], + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + } else { + $update_data = array( + 'email' => $source, + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['source'])) { + $update_data['fullname'] = $app->functions->idn_decode($source); + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); + $skip_spamfilter_users_update = true; + + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + } + } + + + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } + + } + $app->db->datalogUpdate('mail_forwarding', array("source" => $source, "destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'forwarding_id', $rec['forwarding_id']); } } //* Update the mailinglist - $mailing_lists = $app->db->queryAllRecords("SELECT mailinglist_id FROM mail_mailinglist WHERE domain = ?", $page_form->oldDataRecord['domain']); - if(is_array($mailing_lists)) { - foreach($mailing_lists as $rec) { - $app->db->datalogUpdate('mail_mailinglist', array("sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailinglist_id', $rec['mailinglist_id']); + $mailinglists = $app->db->queryAllRecords("SELECT * FROM mail_mailinglist WHERE domain = ?", $old_domain); + if(is_array($mailinglists)) { + foreach($mailinglists as $rec) { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'domain' => $domain, + 'email' => str_replace($old_domain, $domain, $rec['email']), + ); + $app->db->datalogUpdate('mail_mailinglist', $update_data, 'mailinglist_id', $rec['mailinglist_id']); } } @@ -107,25 +249,81 @@ class mail_mail_domain_plugin { } } - if ($page_form->oldDataRecord["domain"] != $domain) { - //* Delete the old spamfilter record - $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", "@" . $page_form->oldDataRecord["domain"]); - $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); - unset($tmp); + // Spamfilter policy + $policy_id = $app->functions->intval($page_form->dataRecord["policy"]); + + // If domain changes, update spamfilter_users + // and fire spamfilter_wblist_update events so rspamd files are rewritten + if ($old_domain != $domain) { + $tmp_users = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email LIKE ?", '%@' . $old_domain); + if(is_array($tmp_users)) { + foreach ($tmp_users as $tmp_old) { + $tmp_new = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_new['id'] > 0) { + // There is a spamfilter_users for both old and new domain, we'll update old wblist entries + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'rid' => $tmp_new['id'], + ); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_old['id']); + foreach ($tmp_wblist as $tmp) { + $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); + } + + // now delete old spamfilter_users entry + $app->db->datalogDelete('spamfilter_users', 'id', $tmp_old['id']); + + /// and update the new + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_old['id']); + } else { + $update_data = array( + 'sys_userid' => $client_user_id, + 'sys_groupid' => $sys_groupid, + 'email' => '@' . $domain, + ); + if($tmp_old['fullname'] == '@' . $old_domain) { + $update_data['fullname'] = '@' . $domain; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_old['id']); + } + } + } } - $app->db->query("UPDATE spamfilter_users SET email=REPLACE(email, ?, ?), sys_userid = ?, sys_groupid = ? WHERE email LIKE ?", $page_form->oldDataRecord['domain'], $domain, $client_user_id, $sys_groupid, "%@" . $page_form->oldDataRecord['domain']); - } // end if domain name changed - - //* Force-update the aliases (required for spamfilter changes) - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source LIKE ? OR destination LIKE ?", "%@" . $domain, "%@" . $domain); - - if(is_array($forwardings)) { - foreach($forwardings as $rec) { - $app->db->datalogUpdate('mail_forwarding', array("source" => $rec['source']), 'forwarding_id', $rec['forwarding_id'],true); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); + if(isset($tmp_user['id']) && $tmp_user['id'] > 0) { + // There is already a record that we will update + if($policy_id != $tmp_user['policy_id']) { + $update_data = array( + 'policy_id' => $policy_id, + ); + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user["id"]); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $page_form->dataRecord["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => '@' . $domain, + "fullname" => '@' . $domain, + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } - } - + + } // end if domain name changed + } } diff --git a/interface/web/client/client_del.php b/interface/web/client/client_del.php index c018b7a27d..dadcae0bdf 100644 --- a/interface/web/client/client_del.php +++ b/interface/web/client/client_del.php @@ -69,7 +69,8 @@ class page_action extends tform_actions { 'mail_user' => 'email', 'mail_user_filter' => '', 'shell_user' => 'username', - 'spamfilter_users' => '', 'spamfilter_wblist' => '', + 'spamfilter_users' => '', + 'spamfilter_wblist' => '', 'support_message' => '', 'web_domain' => 'domain', 'web_folder' => 'path', @@ -208,6 +209,5 @@ class page_action extends tform_actions { } $page = new page_action; -$page->onDelete() +$page->onDelete(); -?> diff --git a/interface/web/mail/form/spamfilter_users.tform.php b/interface/web/mail/form/spamfilter_users.tform.php index 65f196b987..1388217b64 100644 --- a/interface/web/mail/form/spamfilter_users.tform.php +++ b/interface/web/mail/form/spamfilter_users.tform.php @@ -78,7 +78,7 @@ $form["tabs"]['users'] = array ( 'policy_id' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', - 'default' => '5', + 'default' => '', 'datasource' => array ( 'type' => 'SQL', 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', 'keyfield'=> 'id', diff --git a/interface/web/mail/lib/lang/ar_spamfilter_users.lng b/interface/web/mail/lib/lang/ar_spamfilter_users.lng index efe95b5c7f..05d0ca9bd6 100644 --- a/interface/web/mail/lib/lang/ar_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ar_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/bg_spamfilter_users.lng b/interface/web/mail/lib/lang/bg_spamfilter_users.lng index efe95b5c7f..05d0ca9bd6 100644 --- a/interface/web/mail/lib/lang/bg_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/bg_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/br_spamfilter_users.lng b/interface/web/mail/lib/lang/br_spamfilter_users.lng index d18fbc13a9..bdc989833e 100644 --- a/interface/web/mail/lib/lang/br_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/br_spamfilter_users.lng @@ -10,3 +10,4 @@ $wb['fullname_error_notempty'] = 'Nome está vazio.'; $wb['10 - highest'] = '10 - alta'; $wb['5 - medium'] = '5 - média'; $wb['1 - lowest'] = '1 - baixa'; +$wb['inherit_policy'] = '- Herdar configuração de domínio -'; diff --git a/interface/web/mail/lib/lang/ca_spamfilter_users.lng b/interface/web/mail/lib/lang/ca_spamfilter_users.lng index 9c7d5bbe7a..a54e84e608 100644 --- a/interface/web/mail/lib/lang/ca_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ca_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/cz_spamfilter_users.lng b/interface/web/mail/lib/lang/cz_spamfilter_users.lng index f2fff323f4..8c66a07144 100644 --- a/interface/web/mail/lib/lang/cz_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/cz_spamfilter_users.lng @@ -10,3 +10,4 @@ $wb['fullname_error_notempty'] = 'Jméno nesmí být prázdné.'; $wb['10 - highest'] = '10 - nejvyšší'; $wb['5 - medium'] = '5 - střední'; $wb['1 - lowest'] = '1 - nejnižší'; +$wb['inherit_policy'] = '- Zdědit nastavení od domény -'; diff --git a/interface/web/mail/lib/lang/de_spamfilter_users.lng b/interface/web/mail/lib/lang/de_spamfilter_users.lng index 9322c80466..d6b148cbe3 100644 --- a/interface/web/mail/lib/lang/de_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/de_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Der Name darf nicht leer sein.'; $wb['10 - highest'] = '10 - höchste'; $wb['5 - medium'] = '5 - normal'; $wb['1 - lowest'] = '1 - niedrigste'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/dk_spamfilter_users.lng b/interface/web/mail/lib/lang/dk_spamfilter_users.lng index 5b132bc774..b6d9a226d0 100644 --- a/interface/web/mail/lib/lang/dk_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/dk_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Navn må ikke være tomt.'; $wb['10 - highest'] = '10 - højeste'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - laveste'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/el_spamfilter_users.lng b/interface/web/mail/lib/lang/el_spamfilter_users.lng index b6da2d1e15..fc61aa818d 100644 --- a/interface/web/mail/lib/lang/el_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/el_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/en_spamfilter_users.lng b/interface/web/mail/lib/lang/en_spamfilter_users.lng index e43b315df6..05d0ca9bd6 100644 --- a/interface/web/mail/lib/lang/en_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/en_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> \ No newline at end of file +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/es_spamfilter_users.lng b/interface/web/mail/lib/lang/es_spamfilter_users.lng index c5a5a0f948..575c14a9f4 100644 --- a/interface/web/mail/lib/lang/es_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/es_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['local_txt'] = 'Local'; $wb['policy_id_txt'] = 'Directiva'; $wb['priority_txt'] = 'Prioridad'; $wb['server_id_txt'] = 'Servidor'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/fi_spamfilter_users.lng b/interface/web/mail/lib/lang/fi_spamfilter_users.lng index c4290efbf2..5c9570d6fb 100644 --- a/interface/web/mail/lib/lang/fi_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/fi_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/fr_spamfilter_users.lng b/interface/web/mail/lib/lang/fr_spamfilter_users.lng index e8936b0183..b87fe87ccb 100644 --- a/interface/web/mail/lib/lang/fr_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/fr_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/hr_spamfilter_users.lng b/interface/web/mail/lib/lang/hr_spamfilter_users.lng index 9969ef421d..9e78310d71 100644 --- a/interface/web/mail/lib/lang/hr_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/hr_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/hu_spamfilter_users.lng b/interface/web/mail/lib/lang/hu_spamfilter_users.lng index 573d696182..a5097ddbfd 100644 --- a/interface/web/mail/lib/lang/hu_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/hu_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/id_spamfilter_users.lng b/interface/web/mail/lib/lang/id_spamfilter_users.lng index f4549c5c46..4777d33581 100644 --- a/interface/web/mail/lib/lang/id_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/id_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_users.lng b/interface/web/mail/lib/lang/it_spamfilter_users.lng index cebb20324e..2f49b05a41 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be vuoto.'; $wb['10 - highest'] = '10 - elevata'; $wb['5 - medium'] = '5 - media'; $wb['1 - lowest'] = '1 - minima'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/ja_spamfilter_users.lng b/interface/web/mail/lib/lang/ja_spamfilter_users.lng index cd212e9418..5272d3f3e1 100644 --- a/interface/web/mail/lib/lang/ja_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ja_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/nl_spamfilter_users.lng b/interface/web/mail/lib/lang/nl_spamfilter_users.lng index 697e130b35..b9da8e7e4a 100644 --- a/interface/web/mail/lib/lang/nl_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/nl_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/pl_spamfilter_users.lng b/interface/web/mail/lib/lang/pl_spamfilter_users.lng index c46589b18d..5173099c27 100644 --- a/interface/web/mail/lib/lang/pl_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/pl_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/pt_spamfilter_users.lng b/interface/web/mail/lib/lang/pt_spamfilter_users.lng index 0ee8d37d50..adec31f8a1 100644 --- a/interface/web/mail/lib/lang/pt_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/pt_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/ro_spamfilter_users.lng b/interface/web/mail/lib/lang/ro_spamfilter_users.lng index c51b0b8182..bdc418c92c 100644 --- a/interface/web/mail/lib/lang/ro_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ro_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/ru_spamfilter_users.lng b/interface/web/mail/lib/lang/ru_spamfilter_users.lng index 8fcfff421b..238f3b7048 100644 --- a/interface/web/mail/lib/lang/ru_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/ru_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Имя не может быть пустым.' $wb['10 - highest'] = '10 - сильный'; $wb['5 - medium'] = '5 - средний'; $wb['1 - lowest'] = '1 - слабый'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/se_spamfilter_users.lng b/interface/web/mail/lib/lang/se_spamfilter_users.lng index ba3b60e273..ca3fac06c2 100644 --- a/interface/web/mail/lib/lang/se_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/se_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Fältet för namn kan inte vara tomt.'; $wb['10 - highest'] = '10 - högsta'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lägsta'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/sk_spamfilter_users.lng b/interface/web/mail/lib/lang/sk_spamfilter_users.lng index 89bc415672..dfd74a3291 100644 --- a/interface/web/mail/lib/lang/sk_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/sk_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'The name must not be empty.'; $wb['10 - highest'] = '10 - highest'; $wb['5 - medium'] = '5 - medium'; $wb['1 - lowest'] = '1 - lowest'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/lib/lang/tr_spamfilter_users.lng b/interface/web/mail/lib/lang/tr_spamfilter_users.lng index 33ef04c610..10144b8232 100644 --- a/interface/web/mail/lib/lang/tr_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/tr_spamfilter_users.lng @@ -10,4 +10,4 @@ $wb['fullname_error_notempty'] = 'Ad boş olamaz.'; $wb['10 - highest'] = '10 - en yüksek'; $wb['5 - medium'] = '5 - orta'; $wb['1 - lowest'] = '1 - en düşük'; -?> +$wb['inherit_policy'] = '- Inherit domain setting -'; diff --git a/interface/web/mail/mail_domain_del.php b/interface/web/mail/mail_domain_del.php index bce89695dc..e4c26399ef 100644 --- a/interface/web/mail/mail_domain_del.php +++ b/interface/web/mail/mail_domain_del.php @@ -80,6 +80,10 @@ class page_action extends tform_actions { // Delete all spamfilters that belong to this domain $records = $app->db->queryAllRecords("SELECT id FROM spamfilter_users WHERE email like ?", '%@' . $domain); foreach($records as $rec) { + $wblists = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $rec['id']); + foreach($wblists as $wblist) { + $app->db->datalogDelete('spamfilter_wblist', 'wblist_id', $wblist['wblist_id']); + } $app->db->datalogDelete('spamfilter_users', 'id', $rec['id']); } diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 36185ead69..48f6eb2e4d 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -190,19 +190,19 @@ class page_action extends tform_actions { $app->tpl->setVar("domain_module", 0); } - // Get the spamfilter policys for the user + // Get the spamfilter policies for the user $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", '@' . $this->dataRecord["domain"]); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r')." ORDER BY policy_name"; - $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; - if(is_array($policys)) { - foreach( $policys as $p) { + $policies = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policies)) { + foreach( $policies as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; $policy_select .= "\r\n"; } } $app->tpl->setVar("policy", $policy_select); - unset($policys); + unset($policies); unset($policy_select); unset($tmp_user); @@ -257,7 +257,7 @@ class page_action extends tform_actions { if (!empty($rec['dkim_public'])) $app->tpl->setVar('dns_record', $dns_record, true); parent::onShowEnd(); - } + } function onSubmit() { global $app, $conf; @@ -334,30 +334,30 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); - if($policy_id > 0) { - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); - if($tmp_user["id"] > 0) { - // There is already a record that we will update + $tmp_user = $app->db->queryOneRecord("SELECT id, policy_id FROM spamfilter_users WHERE email = ?", '@' . $domain); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if($policy_id != $tmp_user['policy_id']) { $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $tmp_domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $this->dataRecord["server_id"], - "priority" => 5, - "policy_id" => $policy_id, - "email" => '@' . $domain, - "fullname" => '@' . $domain, - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - unset($tmp_domain); } + } else { + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $tmp_domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => '@' . $domain, + "fullname" => '@' . $domain, + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); } // endif spamfilter policy //* create dns-record with dkim-values if the zone exists @@ -419,7 +419,7 @@ class page_action extends tform_actions { $tmp_new = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", '@' . $domain); if($tmp_new['id'] > 0) { // There is a spamfilter_users for both old and new domain, we'll update old wblist entries - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_old['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_old['id']); foreach ($tmp_wblist as $tmp) { $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $tmp_new['id']), 'wblist_id', $tmp['wblist_id']); } @@ -441,39 +441,31 @@ class page_action extends tform_actions { } $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); - if($policy_id > 0) { - if($tmp_user["id"] > 0) { - // There is already a record that we will update - if(!$skip_spamfilter_users_update) { - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } - } else { - $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $tmp_domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $this->dataRecord["server_id"], - "priority" => 5, - "policy_id" => $policy_id, - "email" => '@' . $domain, - "fullname" => '@' . $domain, - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - unset($tmp_domain); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if((! $skip_spamfilter_users_update) && ($policy_id != $tmp_user['policy_id'])) { + $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); } } else { - if($tmp_user["id"] > 0) { - // There is already a record but the user shall have no policy, so we delete it -// fixme: this abandons any spamfilter_wblist entries tied to this spamfilter_users id -// https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); - } + $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $tmp_domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => '@' . $domain, + "fullname" => '@' . $domain, + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + unset($tmp_domain); } // endif spamfilter policy + //** If the domain name or owner has been changed, change the domain and owner in all mailbox records if($old_domain != $domain || (isset($this->dataRecord['client_group_id']) && $this->oldDataRecord['sys_groupid'] != $this->dataRecord['client_group_id'])) { $app->uses('getconf'); @@ -493,14 +485,13 @@ class page_action extends tform_actions { $email = $mail_parts[0].'@'.$this->dataRecord['domain']; // update spamfilter_users and spamfilter_wblist if email change $skip_spamfilter_users_update = false; - if($email != $mail_parts[0].'@'.$this->oldDataRecord['domain']) { - $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $mail_parts[0].'@'.$this->oldDataRecord['domain']); + if($email != $rec['email']) { + $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['email']); if($tmp_olduser['id'] > 0) { - - $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $mail_parts[0].'@'.$this->dataRecord['domain']); + $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); if($tmp_newuser['id'] > 0) { // There is a spamfilter_users for both old and new email, we'll update old wblist entries - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); foreach ($tmp_wblist as $tmp) { $update_data = array( 'rid' => $tmp_newuser['id'], @@ -518,13 +509,13 @@ class page_action extends tform_actions { 'sys_userid' => $client_user_id, 'sys_groupid' => $sys_groupid, ); - if($tmp_olduser['fullname'] == $app->functions->idn_decode($mail_parts[0].'@'.$this->oldDataRecord['domain'])) { - $update_data['fullname'] = $app->functions->idn_decode($mail_parts[0].'@'.$this->dataRecord['domain']); + if($tmp_olduser['fullname'] == $app->functions->idn_decode($rec['email'])) { + $update_data['fullname'] = $app->functions->idn_decode($email); } $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); $skip_spamfilter_users_update = true; - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); $update_data = array( 'sys_userid' => $client_user_id, 'sys_groupid' => $sys_groupid, @@ -535,7 +526,7 @@ class page_action extends tform_actions { } } - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $mail_parts[0].'@'.$this->dataRecord['domain']); + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $email); if($tmp_user["id"] > 0) { // There is already a record that we will update if(!$skip_spamfilter_users_update) { @@ -545,11 +536,22 @@ class page_action extends tform_actions { ); $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); } - /* } else { - # fixme: insert spamfilter_users with correct policy_id, - # pending https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 - */ + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => 0, + "email" => $email, + "fullname" => $app->functions->idn_decode($email), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } $app->db->datalogUpdate('mail_user', array("maildir" => $maildir, "email" => $email, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailuser_id', $rec['mailuser_id']); @@ -564,15 +566,15 @@ class page_action extends tform_actions { $destination = str_replace($old_domain, $domain, $rec['destination']); $source = str_replace($old_domain, $domain, $rec['source']); - // update spamfilter_users and spamfilter_wblist if email change + // update spamfilter_users and spamfilter_wblist if source email changes $skip_spamfilter_users_update = false; - if($source != $rec['source']) { + if(strpos($rec['source'],'@'.$old_domain) && $source != $rec['source']) { $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $rec['source']); if($tmp_olduser['id'] > 0) { $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); if($tmp_newuser['id'] > 0) { // There is a spamfilter_users for both old and new email, we'll update old wblist entries - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); foreach ($tmp_wblist as $tmp) { $update_data = array( 'rid' => $tmp_newuser['id'], @@ -596,7 +598,7 @@ class page_action extends tform_actions { $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_olduser['id']); $skip_spamfilter_users_update = true; - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); $update_data = array( 'sys_userid' => $client_user_id, 'sys_groupid' => $sys_groupid, @@ -607,6 +609,7 @@ class page_action extends tform_actions { } } + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $source); if($tmp_user["id"] > 0) { // There is already a record that we will update @@ -618,9 +621,25 @@ class page_action extends tform_actions { $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); } /* + * should we insert spamfilter_users with policy_id = 0 for mail_forwardings? + * I think no (see https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201) + * } else { - # fixme: insert spamfilter_users with correct policy_id, - # pending https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 + // We create a new record + $insert_data = array( + "sys_userid" => $client_user_id, + "sys_groupid" => $sys_groupid, + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $this->dataRecord["server_id"], + "priority" => 5, + "policy_id" => 0, + "email" => $source, + "fullname" => $app->functions->idn_decode($source), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); */ } diff --git a/interface/web/mail/mail_user_del.php b/interface/web/mail/mail_user_del.php index 1f19166ef7..d301f50085 100644 --- a/interface/web/mail/mail_user_del.php +++ b/interface/web/mail/mail_user_del.php @@ -65,6 +65,8 @@ class page_action extends tform_actions { } $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); + // delete mail_forwardings with destination == email ? + $tmp_filters = $app->db->queryAllRecords("SELECT filter_id FROM mail_user_filter WHERE mailuser_id = ?", $this->id); if(is_array($tmp_filters)) { foreach($tmp_filters as $tmp) { diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index 30c6d15000..f13c5845a5 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -94,20 +94,20 @@ class page_action extends tform_actions { unset($domains); unset($domain_select); - // Get the spamfilter policys for the user + // Get the spamfilter policies for the user $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); if (isset($_POST['policy'])) $tmp_user['policy_id'] = intval($_POST['policy']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; - $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; - if(is_array($policys)) { - foreach( $policys as $p) { + $policies = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policies)) { + foreach( $policies as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; $policy_select .= "\r\n"; } } $app->tpl->setVar("policy", $policy_select); - unset($policys); + unset($policies); unset($policy_select); unset($tmp_user); @@ -281,42 +281,40 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); - if($policy_id > 0) { - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); - if($tmp_user["id"] > 0) { - // There is already a record that we will update + $tmp_user = $app->db->queryOneRecord("SELECT id, policy_id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if($policy_id != $tmp_user['policy_id']) { $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $domain["server_id"], - "priority" => 10, - "policy_id" => $policy_id, - "email" => $this->dataRecord["email"], - "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } - } // endif spamfilter policy + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $domain["server_id"], + "priority" => 5, + "policy_id" => $policy_id, + "email" => $this->dataRecord["email"], + "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } // Set the fields for dovecot - if(isset($this->dataRecord["email"])) { - $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; - $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; - $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; - $disabledeliver = ($this->dataRecord["disabledeliver"])?'y':'n'; - - $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); - } + $disableimap = ($this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = ($this->dataRecord["disablepop3"])?'y':'n'; + $disablesmtp = ($this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = ($this->dataRecord["disabledeliver"])?'y':'n'; + + $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $this->id); + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); } function onAfterUpdate() { @@ -326,43 +324,44 @@ class page_action extends tform_actions { if(isset($_POST["email_domain"])) { $domain = $app->db->queryOneRecord("SELECT sys_groupid, server_id FROM mail_domain WHERE domain = ? AND ".$app->tform->getAuthSQL('r'), $app->functions->idn_encode($_POST["email_domain"])); $app->db->query("UPDATE mail_user SET sys_groupid = ? WHERE mailuser_id = ?", $domain["sys_groupid"], $this->id); - } // Set the fields for dovecot - if(isset($this->dataRecord["email"])) { - $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; - $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; - $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; - $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; - - $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; - $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); - } + $disableimap = (isset($this->dataRecord["disableimap"]) && $this->dataRecord["disableimap"])?'y':'n'; + $disablepop3 = (isset($this->dataRecord["disablepop3"]) && $this->dataRecord["disablepop3"])?'y':'n'; + $disablesmtp = (isset($this->dataRecord["disablesmtp"]) && $this->dataRecord["disablesmtp"])?'y':'n'; + $disabledeliver = (isset($this->dataRecord["disabledeliver"]) && $this->dataRecord["disabledeliver"])?'y':'n'; + + $sql = "UPDATE mail_user SET disableimap = ?, disablesieve = ?, `disablesieve-filter` = ?, disablepop3 = ?, disablesmtp = ?, disabledeliver = ?, disablelda = ?, disablelmtp = ? WHERE mailuser_id = ?"; + $app->db->query($sql, $disableimap, $disableimap, $disableimap, $disablepop3, $disablesmtp, $disabledeliver, $disabledeliver, $disabledeliver, $this->id); + + // Spamfilter policy + $policy_id = $app->functions->intval($this->dataRecord["policy"]); + $skip_spamfilter_users_update = false; //** Handle email address change if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { - // Spamfilter policy - $policy_id = $app->functions->intval($this->dataRecord["policy"]); - //** Update spamfilter_users and spamfilter_wblist - $skip_spamfilter_users_update = false; $tmp_olduser = $app->db->queryOneRecord("SELECT id,fullname FROM spamfilter_users WHERE email = ?", $this->oldDataRecord['email']); if($tmp_olduser["id"] > 0) { $tmp_newuser = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); if($tmp_newuser['id'] > 0) { // There is a spamfilter_users for both old and new email, we'll update old wblist entries - $update_date = array('rid' => $tmp_newuser['id']); + $update_data = array( + 'rid' => $tmp_newuser['id'], + ); if (isset($domain['sys_groupid'])) { $update_data['sys_groupid'] = $domain['sys_groupid']; } - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $tmp_olduser['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $tmp_olduser['id']); foreach ($tmp_wblist as $tmp) { $app->db->datalogUpdate('spamfilter_wblist', $update_data, 'wblist_id', $tmp['wblist_id']); } // now delete old spamfilter_users entry $app->db->datalogDelete('spamfilter_users', 'id', $tmp_olduser['id']); + + // we update spamfilter_users for new id below } else { $update_data = array( 'email' => $this->dataRecord['email'], @@ -379,45 +378,6 @@ class page_action extends tform_actions { } } - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); - if($policy_id > 0) { - if($tmp_user["id"] > 0) { - // There is already a record that we will update - if(!$skip_spamfilter_users_update) { - $update_data = array( - 'policy_id' => $policy_id, - ); - if (isset($domain['sys_groupid'])) { - $update_data['sys_groupid'] = $domain['sys_groupid']; - } - $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); - } - } else { - // We create a new record - $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], - "sys_groupid" => $domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $domain["server_id"], - "priority" => 10, - "policy_id" => $policy_id, - "email" => $this->dataRecord["email"], - "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - } - } else { - if($tmp_user["id"] > 0) { - // There is already a record but the user shall have no policy, so we delete it -// fixme: don't delete or we abandon users' wblist entries -// https://git.ispconfig.org/ispconfig/ispconfig3/-/issues/6201 - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); - } - } // endif spamfilter policy - //* Update the aliases $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE destination = ?", $this->oldDataRecord['email']); if(is_array($forwardings)) { @@ -426,15 +386,42 @@ class page_action extends tform_actions { $update_data = array( 'destination' => $destination, ); - if (isset($domain['sys_groupid'])) { - $update_data['sys_groupid'] = $domain['sys_groupid']; - } $app->db->datalogUpdate('mail_forwarding', $update_data, 'forwarding_id', $rec['forwarding_id']); } } } // end if email addess changed + $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $this->dataRecord['email']); + if($tmp_user["id"] > 0) { + // There is already a record that we will update + if(!$skip_spamfilter_users_update) { + $update_data = array( + 'policy_id' => $policy_id, + ); + if (isset($domain['sys_groupid'])) { + $update_data['sys_groupid'] = $domain['sys_groupid']; + } + $app->db->datalogUpdate('spamfilter_users', $update_data, 'id', $tmp_user['id']); + } + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_groupid" => $domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $domain["server_id"], + "priority" => 7, + "policy_id" => $policy_id, + "email" => $this->dataRecord["email"], + "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); + } + //* Change backup options when user mail backup options have been changed if(isset($this->dataRecord['backup_interval']) && ($this->dataRecord['backup_interval'] != $this->oldDataRecord['backup_interval'] || $this->dataRecord['backup_copies'] != $this->oldDataRecord['backup_copies'])) { $backup_interval = $this->dataRecord['backup_interval']; diff --git a/interface/web/mail/spamfilter_blacklist_edit.php b/interface/web/mail/spamfilter_blacklist_edit.php index b76334b387..c304dafd2b 100644 --- a/interface/web/mail/spamfilter_blacklist_edit.php +++ b/interface/web/mail/spamfilter_blacklist_edit.php @@ -84,7 +84,7 @@ class page_action extends tform_actions { } } // end if user is not admin - // Select and set the server_id so it matches the server_id of the spa,filter_users record + // Select and set the server_id so it matches the server_id of the spamfilter_users record $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ?", $this->dataRecord["rid"]); $this->dataRecord["server_id"] = $tmp["server_id"]; unset($tmp); diff --git a/interface/web/mail/spamfilter_policy_edit.php b/interface/web/mail/spamfilter_policy_edit.php index 8b15f2fac6..e8dd7f7473 100644 --- a/interface/web/mail/spamfilter_policy_edit.php +++ b/interface/web/mail/spamfilter_policy_edit.php @@ -113,16 +113,9 @@ class page_action extends tform_actions { // check if this is an email domain if(substr($spamfilter_user['email'],0,1) == '@') { $domain = substr($spamfilter_user['email'],1); - $forwardings = $app->db->queryAllRecords("SELECT * FROM mail_forwarding WHERE source LIKE ? OR destination LIKE ?", "%@" . $domain, "%@" . $domain); - - // Force-update aliases and forwards - if(is_array($forwardings)) { - foreach($forwardings as $rec) { - $app->db->datalogUpdate('mail_forwarding', array("source" => $rec['source']), 'forwarding_id', $rec['forwarding_id'],true); - } - } - } + // Nothing special to do for a domain + } } } } diff --git a/interface/web/mail/spamfilter_users_edit.php b/interface/web/mail/spamfilter_users_edit.php index 98493173cc..c06e31fc72 100644 --- a/interface/web/mail/spamfilter_users_edit.php +++ b/interface/web/mail/spamfilter_users_edit.php @@ -65,6 +65,29 @@ class page_action extends tform_actions { parent::onShowNew(); } + function onShowEnd() { + global $app, $conf; + + // Get the spamfilter policies for the user + $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $this->dataRecord["email"]); + if (isset($_POST['policy_id'])) $tmp_user['policy_id'] = intval($_POST['policy_id']); + $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r') . " ORDER BY policy_name"; + $policies = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policies)) { + foreach( $policies as $p) { + $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; + $policy_select .= "\r\n"; + } + } + $app->tpl->setVar("policy_id", $policy_select); + unset($policies); + unset($policy_select); + unset($tmp_user); + + parent::onShowEnd(); + } + function onBeforeUpdate() { global $app, $conf; @@ -109,7 +132,7 @@ class page_action extends tform_actions { // If email changes fire spamfilter_wblist_update events so rspamd files are rewritten if(isset($this->dataRecord['email']) && $this->oldDataRecord['email'] != $this->dataRecord['email']) { - $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_users WHERE rid = ?", $this->dataRecord['id']); + $tmp_wblist = $app->db->queryAllRecords("SELECT wblist_id FROM spamfilter_wblist WHERE rid = ?", $this->dataRecord['id']); foreach ($tmp_wblist as $tmp) { $app->db->datalogUpdate('spamfilter_wblist', array('rid' => $this->dataRecord['id']), 'wblist_id', $tmp['wblist_id']); } diff --git a/interface/web/mail/spamfilter_whitelist_edit.php b/interface/web/mail/spamfilter_whitelist_edit.php index a404db0ef1..bc161e6e55 100644 --- a/interface/web/mail/spamfilter_whitelist_edit.php +++ b/interface/web/mail/spamfilter_whitelist_edit.php @@ -84,7 +84,7 @@ class page_action extends tform_actions { } } // end if user is not admin - // Select and set the server_id so it matches the server_id of the spa,filter_users record + // Select and set the server_id so it matches the server_id of the spamfilter_users record $tmp = $app->db->queryOneRecord("SELECT server_id FROM spamfilter_users WHERE id = ?", $this->dataRecord["rid"]); $this->dataRecord["server_id"] = $tmp["server_id"]; unset($tmp); diff --git a/interface/web/mailuser/mail_user_spamfilter_edit.php b/interface/web/mailuser/mail_user_spamfilter_edit.php index 8d1e70ba20..2c8759b795 100644 --- a/interface/web/mailuser/mail_user_spamfilter_edit.php +++ b/interface/web/mailuser/mail_user_spamfilter_edit.php @@ -79,32 +79,25 @@ class page_action extends tform_actions { // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", $rec["email"]); - if($policy_id > 0) { - if($tmp_user["id"] > 0) { - // There is already a record that we will update - $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); - } else { - // We create a new record - $insert_data = array( - "sys_userid" => $domain["sys_userid"], - "sys_groupid" => $domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', - "sys_perm_other" => '', - "server_id" => $domain["server_id"], - "priority" => 10, - "policy_id" => $policy_id, - "email" => $rec["email"], - "fullname" => $rec["email"], - "local" => 'Y' - ); - $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); - } - }else { - if($tmp_user["id"] > 0) { - // There is already a record but the user shall have no policy, so we delete it - $app->db->datalogDelete('spamfilter_users', 'id', $tmp_user["id"]); - } + if($tmp_user["id"] > 0) { + // There is already a record that we will update + $app->db->datalogUpdate('spamfilter_users', array("policy_id" => $policy_id), 'id', $tmp_user["id"]); + } else { + // We create a new record + $insert_data = array( + "sys_userid" => $domain["sys_userid"], + "sys_groupid" => $domain["sys_groupid"], + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', + "sys_perm_other" => '', + "server_id" => $domain["server_id"], + "priority" => 7, + "policy_id" => $policy_id, + "email" => $rec["email"], + "fullname" => $rec["email"], + "local" => 'Y' + ); + $app->db->datalogInsert('spamfilter_users', $insert_data, 'id'); } // endif spamfilter policy } @@ -114,26 +107,25 @@ class page_action extends tform_actions { $rec = $app->tform->getDataRecord($this->id); $app->tpl->setVar("email", $app->functions->idn_decode($rec['email']), true); - // Get the spamfilter policys for the user + // Get the spamfilter policies for the user $tmp_user = $app->db->queryOneRecord("SELECT policy_id FROM spamfilter_users WHERE email = ?", $rec['email']); $sql = "SELECT id, policy_name FROM spamfilter_policy WHERE ".$app->tform->getAuthSQL('r'); - $policys = $app->db->queryAllRecords($sql); - $policy_select = ""; - if(is_array($policys)) { - foreach( $policys as $p) { + $policies = $app->db->queryAllRecords($sql); + $policy_select = ""; + if(is_array($policies)) { + foreach( $policies as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; $policy_select .= "\r\n"; } } $app->tpl->setVar("policy", $policy_select); - unset($policys); + unset($policies); unset($policy_select); unset($tmp_user); parent::onShowEnd(); } - } $app->tform_actions = new page_action; diff --git a/interface/web/tools/resync.php b/interface/web/tools/resync.php index ec947421b7..0aa6677ac3 100644 --- a/interface/web/tools/resync.php +++ b/interface/web/tools/resync.php @@ -93,34 +93,34 @@ class page_action extends tform_actions { if($type == 'mail') { $server_data = array ( - 'mail_domain' => array ( - 'index_field' => 'domain_id', - 'server_type' => 'mail', + 'mail_domain' => array ( + 'index_field' => 'domain_id', + 'server_type' => 'mail', 'server_id' => $server_id, - ), + ), 'mail_get' => array ( 'index_field' => 'mailget_id', 'server_type' => 'mail', 'server_id' => $server_id, ), - 'mail_mailinglist' => array ( - 'index_field' => 'mailinglist_id', - 'server_type' => 'mail', + 'mail_mailinglist' => array ( + 'index_field' => 'mailinglist_id', + 'server_type' => 'mail', 'server_id' => $server_id, - ), - 'mail_user' => array ( - 'index_field' => 'mailuser_id', - 'server_type' => 'mail', + ), + 'mail_user' => array ( + 'index_field' => 'mailuser_id', + 'server_type' => 'mail', 'server_id' => $server_id, ), - 'mail_transport' => array ( - 'index_field' => 'transport_id', - 'server_type' => 'mail', + 'mail_transport' => array ( + 'index_field' => 'transport_id', + 'server_type' => 'mail', 'server_id' => $server_id, ), - 'mail_relay' => array ( - 'index_field' => 'relay_recipient_id', - 'server_type' => 'mail', + 'mail_relay' => array ( + 'index_field' => 'relay_recipient_id', + 'server_type' => 'mail', 'server_id' => $server_id, ), ); @@ -129,17 +129,17 @@ class page_action extends tform_actions { $server_data = array ( 'mail_access' => array ( 'index_field' => 'access_id', - 'server_type' => 'mail', + 'server_type' => 'mail', 'server_id' => $server_id, - ), + ), 'mail_content_filter' => array ( 'index_field' => 'content_filter_id', - 'server_type' => 'mail', - ), + 'server_type' => 'mail', + ), 'mail_user_filter' => array ( 'index_field' => 'filter_id', - 'server_type' => 'mail', - ), + 'server_type' => 'mail', + ), 'spamfilter_policy' => array ( 'index_field' => 'id', 'server_type' => 'mail', @@ -158,26 +158,26 @@ class page_action extends tform_actions { } if($type == 'web' ) { $server_data = array ( - 'web_domain' => array ( - 'index_field' => 'domain_id', - 'server_type' => 'web', + 'web_domain' => array ( + 'index_field' => 'domain_id', + 'server_type' => 'web', 'server_id' => $server_id, - ), - 'shell_user' => array ( - 'index_field' => 'shell_user_id', - 'server_type' => 'web', + ), + 'shell_user' => array ( + 'index_field' => 'shell_user_id', + 'server_type' => 'web', 'server_id' => $server_id, - ), - 'cron' => array ( - 'index_field' => 'id', - 'server_type' => 'cron', + ), + 'cron' => array ( + 'index_field' => 'id', + 'server_type' => 'cron', 'server_id' => $server_id, - ), - 'ftp_user' => array ( - 'index_field' => 'ftp_user_id', - 'server_type' => 'web', + ), + 'ftp_user' => array ( + 'index_field' => 'ftp_user_id', + 'server_type' => 'web', 'server_id' => $server_id, - ), + ), ); } if($type == 'dns' ) { @@ -191,11 +191,11 @@ class page_action extends tform_actions { } if($type == 'file' ) { $server_data = array ( - 'webdav_user' => array ( - 'index_field' => 'webdav_user_id', - 'server_type' => 'file', + 'webdav_user' => array ( + 'index_field' => 'webdav_user_id', + 'server_type' => 'file', 'server_id' => $server_id, - ), + ), ); } if($type == 'db' ) { diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php index 0d2e52c4fc..2baf07ec7d 100644 --- a/server/plugins-available/mail_plugin.inc.php +++ b/server/plugins-available/mail_plugin.inc.php @@ -364,7 +364,7 @@ class mail_plugin { $app->log('Moved invalid maildir to corrupted Maildirs folder: '.$data['new']['maildir'], LOGLEVEL_WARN); } - //* Create the maildir, if it doesn not exist, set permissions, set quota. + //* Create the maildir, if it does not exist, set permissions, set quota. if(!empty($maildomain_path) && !is_dir($maildomain_path.'/new')) { $app->system->maildirmake($maildomain_path, $user, '', $group); diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index 9d34ac8a36..112020deb7 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -243,17 +243,7 @@ class rspamd_plugin { $settings_file = $this->users_config_dir . str_replace('@', '_', $settings_name) . '.conf'; //$app->log('Settings file for rspamd is ' . $settings_file, LOGLEVEL_WARN); if($mode === 'delete') { - $delete_file = true; - if($type === 'spamfilter_user') { - $search_for_policy[] = $email_address; - $search_for_policy[] = substr($email_address, strpos($email_address, '@')); - - $policy = $app->db->queryOneRecord("SELECT p.* FROM spamfilter_users as u INNER JOIN spamfilter_policy as p ON (p.id = u.policy_id) WHERE u.server_id = ? AND u.email IN ? ORDER BY u.priority DESC", $conf['server_id'], $search_for_policy); - if($policy) { - $delete_file = false; - } - } - if($delete_file === true && is_file($settings_file)) { + if(is_file($settings_file)) { unlink($settings_file); } } else { @@ -265,7 +255,12 @@ class rspamd_plugin { // get policy for entry if($type === 'spamfilter_user') { - $policy = $app->db->queryOneRecord("SELECT * FROM spamfilter_policy WHERE id = ?", intval($data['new']['policy_id'])); + if (intval($data['new']['policy_id']) > 0) { + $policy = $app->db->queryOneRecord("SELECT * FROM spamfilter_policy WHERE id = ?", intval($data['new']['policy_id'])); + } else { + $domain = substr($data['new']['email'], strpos($data['new']['email'], '@')); + $policy = $app->db->queryOneRecord("SELECT p.* FROM spamfilter_users as u INNER JOIN spamfilter_policy as p ON (p.id = u.policy_id) WHERE u.server_id = ? AND u.email = ?", $conf['server_id'], $domain); + } $check = $app->db->queryOneRecord('SELECT `greylisting` FROM `mail_user` WHERE `server_id` = ? AND `email` = ? UNION SELECT `greylisting` FROM `mail_forwarding` WHERE `server_id` = ? AND `source` = ? ORDER BY (`greylisting` = ?) DESC', $conf['server_id'], $email_address, $conf['server_id'], $email_address, 'y'); if($check) { @@ -286,7 +281,7 @@ class rspamd_plugin { $app->system->mkdirpath($this->users_config_dir); } - if(!$this->isValidEmail($app->functions->idn_encode($email_address))) { + if((!$this->isValidEmail($app->functions->idn_encode($email_address))) || intval($data['new']['policy_id']) == 0) { if(is_file($settings_file)) { unlink($settings_file); } @@ -310,11 +305,13 @@ class rspamd_plugin { } else { $tpl->setVar('from_email', $app->functions->idn_encode($email_address)); } + // unneded? $spamfilter appears unused $spamfilter = $data[$use_data]; } else { $tpl->setVar('to_email', $app->functions->idn_encode($email_address)); // need to get matching spamfilter user if any + // unneded? $spamfilter appears unused $spamfilter = $app->db->queryOneRecord('SELECT * FROM spamfilter_users WHERE `email` = ?', $email_address); } @@ -399,6 +396,7 @@ class rspamd_plugin { } else { $record_id = intval($data['new']['wblist_id']); $wblist_file = $this->users_config_dir.'spamfilter_wblist_'.$record_id.'.conf'; + $tmp = $app->db->queryOneRecord("SELECT email FROM spamfilter_users WHERE id = ?", intval($data['new']['rid'])); if($tmp && !empty($tmp)) { $filter = array( -- GitLab From 06d5ca4782f2afa68a3fe24a22e0ac5ad9d46fd2 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 6 Aug 2021 16:42:41 -0600 Subject: [PATCH 1219/1368] add file_cleanup cronjob to catch abandoned rspamd config files --- .../classes/cron.d/600-file_cleanup.inc.php | 143 ++++++++++++++++++ server/lib/classes/cronjob.inc.php | 27 +++- 2 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 server/lib/classes/cron.d/600-file_cleanup.inc.php diff --git a/server/lib/classes/cron.d/600-file_cleanup.inc.php b/server/lib/classes/cron.d/600-file_cleanup.inc.php new file mode 100644 index 0000000000..b487a529b8 --- /dev/null +++ b/server/lib/classes/cron.d/600-file_cleanup.inc.php @@ -0,0 +1,143 @@ +db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $mail_access[$rec['id']] = $rec['id']; + } + } + + $spamfilter_wblist = array(); + $sql = "SELECT wblist_id as id FROM spamfilter_wblist WHERE active = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $spamfilter_wblist[$rec['id']] = $rec['id']; + } + } + + $spamfilter_users = array(); + $sql = "SELECT id FROM spamfilter_users WHERE policy_id != 0 AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $spamfilter_users[$rec['id']] = $rec['id']; + } + } + + $mail_user = array(); + $sql = "SELECT mailuser_id as id FROM mail_user WHERE postfix = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $mail_user[$rec['id']] = $rec['id']; + } + } + + $mail_forwarding = array(); + $sql = "SELECT forwarding_id as id FROM mail_forwarding WHERE active = 'y' AND server_id = ?"; + $records = $app->db->queryAllRecords($sql, $server_id); + if(is_array($records)) { + foreach($records as $rec){ + $mail_forwarding[$rec['id']] = $rec['id']; + } + } + + foreach (glob('/etc/rspamd/local.d/users/*.conf') as $file) { + if($handle = fopen($file, 'r')) { + if(($line = fgets($handle)) !== false) { + if(preg_match('/^((?:global|spamfilter)_wblist|ispc_(spamfilter_user|mail_user|mail_forwarding))[_-](\d+)\s/', $line, $matches)) { + switch($matches[1]) { + case 'global_wblist': + $remove = ! isset($mail_access[$matches[3]]); + break; + case 'spamfilter_wblist': + $remove = ! isset($spamfilter_wblist[$matches[3]]); + break; + case 'ispc_spamfilter_user': + $remove = ! isset($spamfilter_users[$matches[3]]); + break; + case 'ispc_mail_user': + $remove = ! isset($mail_user[$matches[3]]); + break; + case 'ispc_mail_forwarding': + $remove = ! isset($mail_forwarding[$matches[3]]); + break; + default: + $app->log("conf file has unhandled rule naming convention, ignoring: $file", LOGLEVEL_DEBUG); + $remove = false; + } + if($remove) { + $app->log("$matches[1] id $matches[3] not found, removing $file", LOGLEVEL_DEBUG); + unlink($file); + $this->restartServiceDelayed('rspamd', 'reload'); + } + } else { + $app->log("conf file has unknown rule naming convention, ignoring: $file", LOGLEVEL_DEBUG); + } + } + + fclose($handle); + } + } + } + + parent::onRunJob(); + } + +} + diff --git a/server/lib/classes/cronjob.inc.php b/server/lib/classes/cronjob.inc.php index 61d45749a8..6ea7559570 100644 --- a/server/lib/classes/cronjob.inc.php +++ b/server/lib/classes/cronjob.inc.php @@ -43,6 +43,9 @@ class cronjob { protected $_next_run = null; private $_running = false; + // services for delayed restart/reload + private $_delayed_restart_services = array(); + /** return schedule */ @@ -178,6 +181,12 @@ class cronjob { global $app, $conf; if($conf['log_priority'] <= LOGLEVEL_DEBUG) print "Called onAfterRun() for class " . get_class($this) . "\n"; + + if(is_array($this->_delayed_restart_services)) { + foreach ($this->_delayed_restart_services as $service => $mode) { + $this->restartService($service, $mode); + } + } } // child classes may NOT override this! @@ -188,6 +197,22 @@ class cronjob { $app->db->query("UPDATE `sys_cron` SET `running` = 0 WHERE `name` = ?", get_class($this)); } + // child classes may NOT override this! + protected function restartService($service, $mode='restart') { + global $app; + + $mode = ($mode == 'reload' ? 'reload' : 'restart'); + $app->system->exec_safe('service ? ?', $service, $mode); + } + + // child classes may NOT override this! + protected function restartServiceDelayed($service, $mode='restart') { + $mode = ($mode == 'reload' ? 'reload' : 'restart'); + + if (is_array($this->_delayed_restart_services)) { + $this->_delayed_restart_services[$service] = $mode; + } + } + } -?> -- GitLab From 0c4b8450db406dcae9bd7707e828a830524100d7 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 16 Aug 2021 15:31:19 -0600 Subject: [PATCH 1220/1368] MR review suggestions/fixes --- .../web/mail/form/spamfilter_users.tform.php | 2 +- interface/web/mail/mail_user_edit.php | 2 +- .../classes/cron.d/600-file_cleanup.inc.php | 10 +++++----- server/lib/classes/cronjob.inc.php | 19 +++++++++++++------ 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/interface/web/mail/form/spamfilter_users.tform.php b/interface/web/mail/form/spamfilter_users.tform.php index 1388217b64..1bb7b5f682 100644 --- a/interface/web/mail/form/spamfilter_users.tform.php +++ b/interface/web/mail/form/spamfilter_users.tform.php @@ -78,7 +78,7 @@ $form["tabs"]['users'] = array ( 'policy_id' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', - 'default' => '', + 'default' => '0', 'datasource' => array ( 'type' => 'SQL', 'querystring' => 'SELECT id,policy_name FROM spamfilter_policy WHERE {AUTHSQL} ORDER BY policy_name', 'keyfield'=> 'id', diff --git a/interface/web/mail/mail_user_edit.php b/interface/web/mail/mail_user_edit.php index f13c5845a5..d8730fa2eb 100644 --- a/interface/web/mail/mail_user_edit.php +++ b/interface/web/mail/mail_user_edit.php @@ -296,7 +296,7 @@ class page_action extends tform_actions { "sys_perm_group" => 'riud', "sys_perm_other" => '', "server_id" => $domain["server_id"], - "priority" => 5, + "priority" => 7, "policy_id" => $policy_id, "email" => $this->dataRecord["email"], "fullname" => $app->functions->idn_decode($this->dataRecord["email"]), diff --git a/server/lib/classes/cron.d/600-file_cleanup.inc.php b/server/lib/classes/cron.d/600-file_cleanup.inc.php index b487a529b8..765b091041 100644 --- a/server/lib/classes/cron.d/600-file_cleanup.inc.php +++ b/server/lib/classes/cron.d/600-file_cleanup.inc.php @@ -103,19 +103,19 @@ class cronjob_file_cleanup extends cronjob { if(preg_match('/^((?:global|spamfilter)_wblist|ispc_(spamfilter_user|mail_user|mail_forwarding))[_-](\d+)\s/', $line, $matches)) { switch($matches[1]) { case 'global_wblist': - $remove = ! isset($mail_access[$matches[3]]); + $remove = isset($mail_access[$matches[3]]) ? false : true; break; case 'spamfilter_wblist': - $remove = ! isset($spamfilter_wblist[$matches[3]]); + $remove = isset($spamfilter_wblist[$matches[3]]) ? false : true; break; case 'ispc_spamfilter_user': - $remove = ! isset($spamfilter_users[$matches[3]]); + $remove = isset($spamfilter_users[$matches[3]]) ? false : true; break; case 'ispc_mail_user': - $remove = ! isset($mail_user[$matches[3]]); + $remove = isset($mail_user[$matches[3]]) ? false : true; break; case 'ispc_mail_forwarding': - $remove = ! isset($mail_forwarding[$matches[3]]); + $remove = isset($mail_forwarding[$matches[3]]) ? false : true; break; default: $app->log("conf file has unhandled rule naming convention, ignoring: $file", LOGLEVEL_DEBUG); diff --git a/server/lib/classes/cronjob.inc.php b/server/lib/classes/cronjob.inc.php index 6ea7559570..df410042db 100644 --- a/server/lib/classes/cronjob.inc.php +++ b/server/lib/classes/cronjob.inc.php @@ -198,19 +198,26 @@ class cronjob { } // child classes may NOT override this! - protected function restartService($service, $mode='restart') { + protected function restartService($service, $action='restart') { global $app; - $mode = ($mode == 'reload' ? 'reload' : 'restart'); - $app->system->exec_safe('service ? ?', $service, $mode); + $app->uses('system'); + + $retval = array('output' => '', 'retval' => 0); + if($action == 'reload') { + exec($app->system->getinitcommand($service, 'reload').' 2>&1', $retval['output'], $retval['retval']); + } else { + exec($app->system->getinitcommand($service, 'restart').' 2>&1', $retval['output'], $retval['retval']); + } + return $retval; } // child classes may NOT override this! - protected function restartServiceDelayed($service, $mode='restart') { - $mode = ($mode == 'reload' ? 'reload' : 'restart'); + protected function restartServiceDelayed($service, $action='restart') { + $action = ($action == 'reload' ? 'reload' : 'restart'); if (is_array($this->_delayed_restart_services)) { - $this->_delayed_restart_services[$service] = $mode; + $this->_delayed_restart_services[$service] = $action; } } -- GitLab From 83bfd333c3eec4fba23a23c1f690774780fde229 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 17 Aug 2021 09:43:15 +0000 Subject: [PATCH 1221/1368] Deployment of packages on release --- .gitlab-ci.yml | 58 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e1a4913454..6eedb90374 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,6 +17,7 @@ syntax:lint: - schedules - web - merge_requests + - /^\d+\.\d+\.\d+$/ script: - echo "Syntax checking PHP files" @@ -32,6 +33,12 @@ syntax_diff:lint: - pushes - branches + except: + - schedules + - web + - merge_requests + - /^\d+\.\d+\.\d+$/ + script: - echo "Syntax checking PHP files" - bash ./.git-scripts/syntax.sh commit @@ -52,19 +59,22 @@ syntax_diff:lint: # - vendor/bin/phplint -test:install: - stage: test - image: jerob/docker-ispconfig - only: - - schedules - - web - script: - - $CI_PROJECT_DIR/helper_scripts/test_install_docker.sh - - apt-get update - - apt-get --yes install curl - - curl --insecure https://127.0.0.1:8080/login/ - - ps xaf - +#test:install: +# stage: test +# image: jerob/docker-ispconfig +# only: +# - schedules +# - web +# - /^\d+\.\d+\.\d+$/ +# +# script: +# - $CI_PROJECT_DIR/helper_scripts/test_install_docker.sh +# - apt-get update +# - apt-get --yes install curl +# - curl --insecure https://127.0.0.1:8080/login/ +# - ps xaf +# +# needs: ["syntax:lint"] build:package: stage: build @@ -72,13 +82,23 @@ build:package: only: refs: - /^\d+\.\d+\.\d+$/ - except: - - branches - - merge_requests - - schedules - - pushes + - web + script: - echo "Building release." + - if [[ "$VER" == "" ]] ; then VER="$CI_COMMIT_TAG" ; fi + - if [[ "$VER" == "" ]] ; then VER="3.2dev"$(date +%s) ; fi + - if [[ "$VER" != "" ]] ; then echo "Replacing 3.2dev by $VER" ; sed -i -r 's/3\.2dev/'${VER}'/g' install/tpl/config.inc.php.master install/sql/ispconfig3.sql ; fi + - RET=0 + - tar -cpzf ISPConfig-${VER}.tar.gz --exclude "ISPConfig-${VER}.tar.gz" --exclude ".git*" --exclude ".phplint.yml" --transform 's,^\./,ispconfig3_install/,' . || RET=$? + - if [[ $RET > 1 ]] ; then exit $RET ; fi + - echo "Listing tar contents for verification" + - tar -tvf ISPConfig-${VER}.tar.gz + - echo "Uploading file to download server" + - curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ + - if [[ "$VER" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then echo "Stable release ${VER}" ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ISPConfig-3-stable.tar.gz ; echo -n "${VER}" > ispconfig3_version.txt ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ispconfig3_version.txt ftp://${DEPLOY_FTP_SERVER}/web/ ; else echo "Dev release ${VER}" ; fi + - rm ISPConfig-${VER}.tar.gz + - echo "Download url is https://download.ispconfig.org/ISPConfig-${VER}.tar.gz" - when: manual + needs: ["syntax:lint"] allow_failure: false \ No newline at end of file -- GitLab From ba7d1e6842ba8a6bb16fb61af04f9ef7f45f68ef Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 17 Aug 2021 09:12:34 -0600 Subject: [PATCH 1222/1368] clamd@amavisd service name typo --- install/dist/conf/fedora9.conf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php index 19c9a4f625..23453ae48f 100644 --- a/install/dist/conf/fedora9.conf.php +++ b/install/dist/conf/fedora9.conf.php @@ -154,7 +154,7 @@ $conf['rspamd']['init_script'] = 'rspamd'; //* ClamAV $conf['clamav']['installed'] = false; // will be detected automatically during installation -$conf['clamav']['init_script'] = 'clamd.amavisd'; +$conf['clamav']['init_script'] = 'clamd@amavisd'; //* Pureftpd $conf['pureftpd']['installed'] = false; // will be detected automatically during installation -- GitLab From 0f7af6dff344b06b572f686844358c7ec03c087b Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 17 Aug 2021 16:05:38 -0600 Subject: [PATCH 1223/1368] enable validate_root in php.ini --- .../plugins-available/apache2_plugin.inc.php | 2 +- .../webserver_plugin.inc.php | 52 ++++++++++++++++--- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 19f650d4b3..b0f87c192b 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1178,7 +1178,7 @@ class apache2_plugin { $app->system->chgrp('/var/log/ispconfig/httpd/'.$data['new']['domain'].'/error.log', 'root'); } - //* Write the custom php.ini file, if custom_php_ini fieled is not empty + //* Write the custom php.ini file, if custom_php_ini field is not empty $custom_php_ini_dir = $web_config['website_basedir'].'/conf/'.$data['new']['system_user']; if($data['new']['type'] == 'vhostsubdomain' || $data['new']['type'] == 'vhostalias') $custom_php_ini_dir .= '_' . $web_folder; if(!is_dir($web_config['website_basedir'].'/conf')) $app->system->mkdir($web_config['website_basedir'].'/conf'); diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php index 0873826bde..b39ac65da8 100644 --- a/server/plugins-available/webserver_plugin.inc.php +++ b/server/plugins-available/webserver_plugin.inc.php @@ -37,8 +37,6 @@ class webserver_plugin { * This function is called during ispconfig installation to determine * if a symlink shall be created for this plugin. */ - - public function onInstall() { global $conf; @@ -92,10 +90,6 @@ class webserver_plugin { 'mode' => 'mod', 'php_version' => 0); // default; - $check_files[] = array('file' => $web_config['php_ini_path_cgi'], - 'mode' => '', // all but 'mod' and 'fast-cgi' - 'php_version' => 0); // default; - if($fastcgi_config["fastcgi_phpini_path"] && $fastcgi_config["fastcgi_phpini_path"] != $web_config['php_ini_path_cgi']) { $check_files[] = array('file' => $fastcgi_config["fastcgi_phpini_path"], 'mode' => 'fast-cgi', @@ -106,6 +100,16 @@ class webserver_plugin { 'php_version' => 0); // default; } + $check_files[] = array('file' => $web_config['php_fpm_ini_path'], + 'mode' => 'php-fpm', + 'php_version' => 0); // default; + + if(!array_search($web_config['php_ini_path_cgi'], array_column($check_files, 'file'))) { + $check_files[] = array('file' => $web_config['php_ini_path_cgi'], + 'mode' => '', // all but 'mod' and 'fast-cgi' + 'php_version' => 0); // default; + } + //** read additional php versions of this server $php_versions = $app->db->queryAllRecords('SELECT server_php_id, php_fastcgi_ini_dir, php_fpm_ini_dir FROM server_php WHERE server_id = ?', $conf['server_id']); @@ -114,7 +118,8 @@ class webserver_plugin { $check_files[] = array('file' => $php['php_fastcgi_ini_dir'] . '/php.ini', 'mode' => 'fast-cgi', 'php_version' => $php['server_php_id']); - } elseif($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { + } + if($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_fpm_ini_path']) { $check_files[] = array('file' => $php['php_fpm_ini_dir'] . '/php.ini', 'mode' => 'php-fpm', 'php_version' => $php['server_php_id']); @@ -134,6 +139,13 @@ class webserver_plugin { } if(!is_array($php_ini_md5)) $php_ini_md5 = array(); + // verify needed php file settings if that hasn't been done since 15 minutes + $now = time(); + $verify_php_ini=false; + if(!isset($php_ini_md5['last_verify_php_ini']) || ($now - intval($php_ini_md5['last_verify_php_ini']) > 15*60)) { + $verify_php_ini=true; + } + $processed = array(); foreach($check_files as $file) { $file_path = $file['file']; @@ -145,6 +157,11 @@ class webserver_plugin { if(in_array($ident, $processed) == true) continue; $processed[] = $ident; + //** check that needed php.ini settings/changes are made + if($verify_php_ini) { + $this->verify_php_ini($file); + } + //** check if md5sum of file changed $file_md5 = md5_file($file_path); if(array_key_exists($file_path, $php_ini_md5) == false || $php_ini_md5[$file_path] != $file_md5) { @@ -158,13 +175,32 @@ class webserver_plugin { $new_php_ini_md5[$file_path] = $file_md5; } + $new_php_ini_md5['last_verify_php_ini'] = time(); + //** write new md5 sums if something changed - if($php_ini_changed == true) $app->system->file_put_contents(SCRIPT_PATH . '/temp/php.ini.md5sum', base64_encode(serialize($new_php_ini_md5))); + if($php_ini_changed == true || $verify_php_ini == true) $app->system->file_put_contents(SCRIPT_PATH . '/temp/php.ini.md5sum', base64_encode(serialize($new_php_ini_md5))); unset($new_php_ini_md5); unset($php_ini_md5); unset($processed); } + /** + * The method checks/sets needed php.ini settings + */ + public function verify_php_ini($file) { + global $app; + + if(isset($file['file']) && is_file($file['file'])) { + $php_ini = $file['file']; + // ensure opcache.validate_root = 1 + $app->system->exec_safe('grep ^opcache.validate_root ?', $php_ini); + if($app->system->last_exec_retcode() != 0) { + $app->log('verify_php_ini(): php.ini '.$php_ini.' is missing validate_root', LOGLEVEL_DEBUG); + $sed_script='s/; *opcache\.validate_root *= *.+$/opcache.validate_root = 1/g'; + $app->system->exec_safe('sed -E -i ? ?', $sed_script, $php_ini); + } + } + } /* * Checks for changes to jailkit settings in server config and schedules affected jails to be updated. -- GitLab From 7faccfcb7e8d51522b76e0777cadd969e70f96c2 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 18 Aug 2021 09:15:52 -0600 Subject: [PATCH 1224/1368] call verify_php_ini from server_php_{insert,update} events --- server/mods-available/web_module.inc.php | 9 +++ .../webserver_plugin.inc.php | 61 ++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php index 12ad81ef9c..6019100ed7 100644 --- a/server/mods-available/web_module.inc.php +++ b/server/mods-available/web_module.inc.php @@ -54,6 +54,9 @@ class web_module { 'web_backup_insert', 'web_backup_update', 'web_backup_delete', + 'server_php_insert', + 'server_php_update', + 'server_php_delete', 'aps_instance_insert', 'aps_instance_update', 'aps_instance_delete', @@ -112,6 +115,7 @@ class web_module { $app->modules->registerTableHook('web_folder', 'web_module', 'process'); $app->modules->registerTableHook('web_folder_user', 'web_module', 'process'); $app->modules->registerTableHook('web_backup', 'web_module', 'process'); + $app->modules->registerTableHook('server_php', 'web_module', 'process'); $app->modules->registerTableHook('aps_instances', 'web_module', 'process'); $app->modules->registerTableHook('aps_instances_settings', 'web_module', 'process'); $app->modules->registerTableHook('aps_packages', 'web_module', 'process'); @@ -167,6 +171,11 @@ class web_module { if($action == 'u') $app->plugins->raiseEvent('web_backup_update', $data); if($action == 'd') $app->plugins->raiseEvent('web_backup_delete', $data); break; + case 'server_php': + if($action == 'i') $app->plugins->raiseEvent('server_php_insert', $data); + if($action == 'u') $app->plugins->raiseEvent('server_php_update', $data); + if($action == 'd') $app->plugins->raiseEvent('server_php_delete', $data); + break; case 'aps_instances': if($action == 'i') $app->plugins->raiseEvent('aps_instance_insert', $data); if($action == 'u') $app->plugins->raiseEvent('aps_instance_update', $data); diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php index b39ac65da8..7d307233d8 100644 --- a/server/plugins-available/webserver_plugin.inc.php +++ b/server/plugins-available/webserver_plugin.inc.php @@ -54,7 +54,11 @@ class webserver_plugin { global $app; $app->plugins->registerAction('server_plugins_loaded', $this->plugin_name, 'check_phpini_changes'); + $app->plugins->registerEvent('server_update', $this->plugin_name, 'server_update'); + + $app->plugins->registerEvent('server_php_insert', $this->plugin_name, 'server_php_update'); + $app->plugins->registerEvent('server_php_update', $this->plugin_name, 'server_php_update'); } /** @@ -184,6 +188,36 @@ class webserver_plugin { unset($processed); } + /** + * The method runs each php.ini file through verify_php_ini() + */ + function server_php_update($event_name, $data) { + global $app, $conf; + + if(isset($data['new']['php_fastcgi_ini_dir'])) { + $php_ini = $data['new']['php_fastcgi_ini_dir'] . '/php.ini'; + if(file_exists($php_ini)) { + $this->verify_php_ini(array('file' => $php_ini, + 'mode' => 'fast-cgi', + 'php_version' => $data['new']['server_php_id']) + ); + } else { + $app->log("Cannot verify php.ini, file not found: $php_ini", LOGLEVEL_WARN); + } + } + if(isset($data['new']['php_fpm_ini_dir'])) { + $php_ini = $data['new']['php_fpm_ini_dir'] . '/php.ini'; + if(file_exists($php_ini)) { + $this->verify_php_ini(array('file' => $php_ini, + 'mode' => 'php-fpm', + 'php_version' => $data['new']['server_php_id']) + ); + } else { + $app->log("Cannot verify php.ini, file not found: $php_ini", LOGLEVEL_WARN); + } + } + } + /** * The method checks/sets needed php.ini settings */ @@ -281,7 +315,32 @@ class webserver_plugin { } } } + + $check_files = array(); + if ($old['php_ini_path_apache'] != $new['php_ini_path_apache']) { + $check_files[] = array('file' => $new['php_ini_path_apache'], + 'mode' => 'mod', + 'php_version' => 0); + } + + if ($old['fastcgi_phpini_path'] != $new['fastcgi_phpini_path']) { + $check_files[] = array('file' => $new['fastcgi_phpini_path'], + 'mode' => 'fast-cgi', + 'php_version' => 0); + } + if ($old['php_ini_path_cgi'] != $new['php_ini_path_cgi']) { + $check_files[] = array('file' => $new['php_ini_path_cgi'], + 'mode' => 'fast-cgi', + 'php_version' => 0); + } + if ($old['php_fpm_ini_path'] != $new['php_fpm_ini_path']) { + $check_files[] = array('file' => $web_config['php_fpm_ini_path'], + 'mode' => 'php-fpm', + 'php_version' => 0); + } + foreach ($check_files as $file) { + $this->verify_php_ini($file); + } } } -?> -- GitLab From d78fc43c31c7352849eea020669ac35a8a41cd8e Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 19 Aug 2021 10:17:20 +0000 Subject: [PATCH 1225/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index ec94fd4acf..d1a17f642e 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2792,6 +2792,7 @@ class installer_base { $server_name = exec('hostname -f'); } + $reload_web_server = false; $use_template = 'apache_acme.conf.master'; $use_symlink = '999-acme.conf'; $use_name = 'acme.conf'; @@ -2823,10 +2824,18 @@ class installer_base { if(@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { unlink($vhost_conf_enabled_dir.'/' . $use_symlink); + $reload_web_server = true; } if(!@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { symlink($vhost_conf_dir.'/' . $use_name, $vhost_conf_enabled_dir.'/' . $use_symlink); } + + if($reload_web_server == true) { + if($conf['apache']['installed'] == true && $conf['apache']['init_script'] != '') system($this->getinitcommand($conf['apache']['init_script'], 'reload')); +//* Reload is enough for nginx + if($conf['nginx']['installed'] == true && $conf['nginx']['php_fpm_init_script'] != '') system($this->getinitcommand($conf['nginx']['php_fpm_init_script'], 'reload')); + } + } public function make_ispconfig_ssl_cert() { -- GitLab From cdf8f7ca6ab9d6b6575bce8f6d24ab7f7dbacebd Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 19 Aug 2021 13:14:21 +0000 Subject: [PATCH 1226/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index d1a17f642e..e072055521 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2792,7 +2792,6 @@ class installer_base { $server_name = exec('hostname -f'); } - $reload_web_server = false; $use_template = 'apache_acme.conf.master'; $use_symlink = '999-acme.conf'; $use_name = 'acme.conf'; @@ -2824,18 +2823,10 @@ class installer_base { if(@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { unlink($vhost_conf_enabled_dir.'/' . $use_symlink); - $reload_web_server = true; } if(!@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { symlink($vhost_conf_dir.'/' . $use_name, $vhost_conf_enabled_dir.'/' . $use_symlink); } - - if($reload_web_server == true) { - if($conf['apache']['installed'] == true && $conf['apache']['init_script'] != '') system($this->getinitcommand($conf['apache']['init_script'], 'reload')); -//* Reload is enough for nginx - if($conf['nginx']['installed'] == true && $conf['nginx']['php_fpm_init_script'] != '') system($this->getinitcommand($conf['nginx']['php_fpm_init_script'], 'reload')); - } - } public function make_ispconfig_ssl_cert() { @@ -3035,6 +3026,9 @@ class installer_base { # acme.sh does not set umask, resulting in incorrect permissions (ispconfig issue #6015) $old_umask = umask(0022); + // Switch from zerossl to letsencrypt CA + exec("$acme --set-default-ca --server letsencrypt"); + $out = null; $ret = null; if($conf['nginx']['installed'] == true || $conf['apache']['installed'] == true) { -- GitLab From bd55918d069ecc143f606153679bd18d1e87b5e2 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 19 Aug 2021 16:35:38 +0200 Subject: [PATCH 1227/1368] Add Debian 11 (Bullseye) to OS detection code in ISPConfig and update config for Debian testing (Sid) --- install/dist/conf/debian110.conf.php | 239 +++++++++++++++++++++++ install/dist/conf/debiantesting.conf.php | 16 +- install/lib/install.lib.php | 7 + server/lib/classes/monitor_tools.inc.php | 6 + 4 files changed, 260 insertions(+), 8 deletions(-) create mode 100644 install/dist/conf/debian110.conf.php diff --git a/install/dist/conf/debian110.conf.php b/install/dist/conf/debian110.conf.php new file mode 100644 index 0000000000..c60152df5c --- /dev/null +++ b/install/dist/conf/debian110.conf.php @@ -0,0 +1,239 @@ + diff --git a/install/dist/conf/debiantesting.conf.php b/install/dist/conf/debiantesting.conf.php index 6ea9112dff..cbc380fffb 100644 --- a/install/dist/conf/debiantesting.conf.php +++ b/install/dist/conf/debiantesting.conf.php @@ -32,7 +32,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. //* Main $conf['language'] = 'en'; -$conf['distname'] = 'debian100'; +$conf['distname'] = 'debian110'; $conf['hostname'] = 'server1.domain.tld'; // Full hostname $conf['ispconfig_install_dir'] = '/usr/local/ispconfig'; $conf['ispconfig_config_dir'] = '/usr/local/ispconfig'; @@ -83,8 +83,8 @@ $conf['apache']['version'] = '2.4'; $conf['apache']['vhost_conf_dir'] = '/etc/apache2/sites-available'; $conf['apache']['vhost_conf_enabled_dir'] = '/etc/apache2/sites-enabled'; $conf['apache']['vhost_port'] = '8080'; -$conf['apache']['php_ini_path_apache'] = '/etc/php/7.3/apache2/php.ini'; -$conf['apache']['php_ini_path_cgi'] = '/etc/php/7.3/cgi/php.ini'; +$conf['apache']['php_ini_path_apache'] = '/etc/php/7.4/apache2/php.ini'; +$conf['apache']['php_ini_path_cgi'] = '/etc/php/7.4/cgi/php.ini'; //* Website base settings $conf['web']['website_basedir'] = '/var/www'; @@ -99,7 +99,7 @@ $conf['web']['apps_vhost_user'] = 'ispapps'; $conf['web']['apps_vhost_group'] = 'ispapps'; //* Fastcgi -$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/7.3/cgi/'; +$conf['fastcgi']['fastcgi_phpini_path'] = '/etc/php/7.4/cgi/'; $conf['fastcgi']['fastcgi_starter_path'] = '/var/www/php-fcgi-scripts/[system_user]/'; $conf['fastcgi']['fastcgi_bin'] = '/usr/bin/php-cgi'; @@ -210,11 +210,11 @@ $conf['nginx']['vhost_conf_enabled_dir'] = '/etc/nginx/sites-enabled'; $conf['nginx']['init_script'] = 'nginx'; $conf['nginx']['vhost_port'] = '8080'; $conf['nginx']['cgi_socket'] = '/var/run/fcgiwrap.socket'; -$conf['nginx']['php_fpm_init_script'] = 'php7.3-fpm'; -$conf['nginx']['php_fpm_ini_path'] = '/etc/php/7.3/fpm/php.ini'; -$conf['nginx']['php_fpm_pool_dir'] = '/etc/php/7.3/fpm/pool.d'; +$conf['nginx']['php_fpm_init_script'] = 'php7.4-fpm'; +$conf['nginx']['php_fpm_ini_path'] = '/etc/php/7.4/fpm/php.ini'; +$conf['nginx']['php_fpm_pool_dir'] = '/etc/php/7.4/fpm/pool.d'; $conf['nginx']['php_fpm_start_port'] = 9010; -$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php7.3-fpm'; +$conf['nginx']['php_fpm_socket_dir'] = '/var/lib/php7.4-fpm'; //* OpenVZ $conf['openvz']['installed'] = false; diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 7a49939600..6ff32bb785 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -238,6 +238,13 @@ function get_distname() { $distid = 'debian60'; $distbaseid = 'debian'; swriteln("Operating System: Debian 10.0 (Buster) or compatible\n"); + } elseif(substr(trim(file_get_contents('/etc/debian_version')),0,2) == '11') { + $distname = 'Debian'; + $distver = 'Bullseye'; + $distconfid = 'debian110'; + $distid = 'debian60'; + $distbaseid = 'debian'; + swriteln("Operating System: Debian 11.0 (Bullseye) or compatible\n"); } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '/sid')) { $distname = 'Debian'; $distver = 'Testing'; diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 9d7a225745..42ed9146e4 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -221,6 +221,12 @@ class monitor_tools { $distconfid = 'debian100'; $distid = 'debian60'; $distbaseid = 'debian'; + } elseif(substr(trim(file_get_contents('/etc/debian_version')),0,2) == '11') { + $distname = 'Debian'; + $distver = 'Bullseye'; + $distconfid = 'debian110'; + $distid = 'debian60'; + $distbaseid = 'debian'; } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '/sid')) { $distname = 'Debian'; $distver = 'Testing'; -- GitLab From 00c5a217a9dc91c19356a87195f4d5896452d199 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 20 Aug 2021 11:32:45 +0200 Subject: [PATCH 1228/1368] - fixed missing CSR in interface on creating self-signed cert --- server/plugins-available/apache2_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index b0f87c192b..3b5b290f33 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -353,10 +353,10 @@ class apache2_plugin { if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) { $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days ? -keyout ? -out ? -config ?'; $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); + $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); if(file_exists($web_config['CA_path'].'/openssl.cnf')) { - $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); $app->system->exec_safe("openssl ca -batch -out ? -config ? -passin pass:? -in ? -extfile ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file, $ssl_ext_file); $app->log("Creating CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); if(filesize($crt_file) == 0 || !file_exists($crt_file)) { -- GitLab From 5f14605c125220dddc32973be21b761b808e964d Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 20 Aug 2021 11:39:14 +0200 Subject: [PATCH 1229/1368] - migrated apache2 code --- .../plugins-available/apache2_plugin.inc.php | 2 +- server/plugins-available/nginx_plugin.inc.php | 45 +++++-------------- 2 files changed, 12 insertions(+), 35 deletions(-) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index b0f87c192b..3b5b290f33 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -353,10 +353,10 @@ class apache2_plugin { if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) { $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days ? -keyout ? -out ? -config ?'; $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); + $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); if(file_exists($web_config['CA_path'].'/openssl.cnf')) { - $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); $app->system->exec_safe("openssl ca -batch -out ? -config ? -passin pass:? -in ? -extfile ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file, $ssl_ext_file); $app->log("Creating CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); if(filesize($crt_file) == 0 || !file_exists($crt_file)) { diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 2a1ba6c13a..ba80e7a135 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -112,7 +112,6 @@ class nginx_plugin { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = ($data['new']['ssl_domain'] != '') ? $data['new']['ssl_domain'] : $data['new']['domain']; $key_file = $ssl_dir.'/'.$domain.'.key'; - $key_file2 = $ssl_dir.'/'.$domain.'.key.org'; $csr_file = $ssl_dir.'/'.$domain.'.csr'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; @@ -126,10 +125,6 @@ class nginx_plugin { $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'); @@ -179,42 +174,35 @@ class nginx_plugin { $ssl_ext_file = $ssl_dir.'/v3.ext'; $app->system->file_put_contents($ssl_ext_file, $ext_cnf); - $rand_file = $rand_file; - $key_file2 = $key_file2; - $openssl_cmd_key_file2 = $key_file2; - if(substr($domain, 0, 2) == '*.' && strpos($key_file2, '/ssl/\*.') !== false) $key_file2 = str_replace('/ssl/\*.', '/ssl/*.', $key_file2); // wildcard certificate - $key_file = $key_file; $openssl_cmd_key_file = $key_file; if(substr($domain, 0, 2) == '*.' && strpos($key_file, '/ssl/\*.') !== false) $key_file = str_replace('/ssl/\*.', '/ssl/*.', $key_file); // wildcard certificate $ssl_days = 3650; - $csr_file = $csr_file; $openssl_cmd_csr_file = $csr_file; if(substr($domain, 0, 2) == '*.' && strpos($csr_file, '/ssl/\*.') !== false) $csr_file = str_replace('/ssl/\*.', '/ssl/*.', $csr_file); // wildcard certificate $config_file = $ssl_cnf_file; - $crt_file = $crt_file; $openssl_cmd_crt_file = $crt_file; if(substr($domain, 0, 2) == '*.' && strpos($crt_file, '/ssl/\*.') !== false) $crt_file = str_replace('/ssl/\*.', '/ssl/*.', $crt_file); // wildcard certificate if(is_file($ssl_cnf_file) && !is_link($ssl_cnf_file)) { - - $app->system->exec_safe("openssl genrsa -des3 -rand ? -passout pass:? -out ? 2048", $rand_file, $ssl_password, $openssl_cmd_key_file2); - $app->system->exec_safe("openssl req -new -sha256 -passin pass:? -passout pass:? -key ? -out ? -days ? -config ?", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $ssl_days, $config_file); - $app->system->exec_safe("openssl rsa -passin pass:? -in ? -out ?", $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_key_file); + $openssl_cmd = 'openssl req -nodes -newkey rsa:4096 -x509 -days ? -keyout ? -out ? -config ?'; + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); + $app->system->exec_safe("openssl req -new -sha256 -key ? -out ? -days ? -config ?", $openssl_cmd_key_file, $openssl_cmd_csr_file, $ssl_days, $config_file); if(file_exists($web_config['CA_path'].'/openssl.cnf')) { $app->system->exec_safe("openssl ca -batch -out ? -config ? -passin pass:? -in ? -extfile ?", $openssl_cmd_crt_file, $web_config['CA_path']."/openssl.cnf", $web_config['CA_pass'], $openssl_cmd_csr_file, $ssl_ext_file); $app->log("Creating CA-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); - if (filesize($crt_file)==0 || !file_exists($crt_file)) $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config ".$web_config['CA_path']."/openssl.cnf -passin pass:".$web_config['CA_pass']." -in $openssl_cmd_csr_file -extfile $ssl_ext_file", LOGLEVEL_ERROR); - }; + if(filesize($crt_file) == 0 || !file_exists($crt_file)) { + $app->log("CA-Certificate signing failed. openssl ca -out $openssl_cmd_crt_file -config " . $web_config['CA_path'] . "/openssl.cnf -passin pass:" . $web_config['CA_pass'] . " -in $openssl_cmd_csr_file -extfile $ssl_ext_file", LOGLEVEL_ERROR); + } + } if (@filesize($crt_file)==0 || !file_exists($crt_file)){ - $app->system->exec_safe("openssl req -x509 -passin pass:? -passout pass:? -key ? -in ? -out ? -days ? -config ?", $ssl_password, $ssl_password, $openssl_cmd_key_file2, $openssl_cmd_csr_file, $openssl_cmd_crt_file, $ssl_days, $config_file); + $app->system->exec_safe($openssl_cmd, $ssl_days, $openssl_cmd_key_file, $openssl_cmd_crt_file, $config_file); $app->log("Creating self-signed SSL Cert for: $domain", LOGLEVEL_DEBUG); - }; + } } - $app->system->chmod($key_file2, 0400); $app->system->chmod($key_file, 0400); @$app->system->unlink($config_file); @$app->system->unlink($rand_file); @@ -276,10 +264,7 @@ class nginx_plugin { $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.'~'); @@ -1377,7 +1362,6 @@ class nginx_plugin { $tmp = $app->letsencrypt->get_website_certificate_paths($data); $domain = $tmp['domain']; $key_file = $tmp['key']; - $key_file2 = $tmp['key2']; $csr_file = $tmp['csr']; $crt_file = $tmp['crt']; $bundle_file = $tmp['bundle']; @@ -2080,8 +2064,7 @@ class nginx_plugin { $ssl_dir = $data['new']['document_root'].'/ssl'; $domain = $data['new']['ssl_domain']; - $key_file = $ssl_dir.'/'.$domain.'.key.org'; - $key_file2 = $ssl_dir.'/'.$domain.'.key'; + $key_file = $ssl_dir.'/'.$domain.'.key'; $csr_file = $ssl_dir.'/'.$domain.'.csr'; $crt_file = $ssl_dir.'/'.$domain.'.crt'; //$bundle_file = $ssl_dir.'/'.$domain.'.bundle'; @@ -2091,17 +2074,12 @@ class nginx_plugin { $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'); //* Restore the ~ backup files if(is_file($key_file.'~')) $app->system->copy($key_file.'~', $key_file); - if(is_file($key_file2.'~')) $app->system->copy($key_file2.'~', $key_file2); if(is_file($crt_file.'~')) $app->system->copy($crt_file.'~', $crt_file); if(is_file($csr_file.'~')) $app->system->copy($csr_file.'~', $csr_file); //if(is_file($bundle_file.'~')) $app->system->copy($bundle_file.'~',$bundle_file); @@ -2121,7 +2099,6 @@ class nginx_plugin { $this->ssl_certificate_changed = false; if(@is_file($key_file.'~')) $app->system->unlink($key_file.'~'); - if(@is_file($key_file2.'~')) $app->system->unlink($key_file2.'~'); if(@is_file($crt_file.'~')) $app->system->unlink($crt_file.'~'); if(@is_file($csr_file.'~')) $app->system->unlink($csr_file.'~'); //if(@is_file($bundle_file.'~')) $app->system->unlink($bundle_file.'~'); -- GitLab From caede4c953779cdf3c0dab876c346eaec93a499b Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 20 Aug 2021 11:04:56 -0600 Subject: [PATCH 1230/1368] installer: remove dangling letsencrypt hook symlinks --- install/lib/installer_base.lib.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index e072055521..103abaef19 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2923,16 +2923,25 @@ class installer_base { // This script is needed earlier to check and open http port 80 or standalone might fail // Make executable and temporary symlink latest letsencrypt pre, post and renew hook script before install if(file_exists(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_pre_hook.sh') && !file_exists('/usr/local/bin/letsencrypt_pre_hook.sh')) { + if(is_link('/usr/local/bin/letsencrypt_pre_hook.sh')) { + unlink('/usr/local/bin/letsencrypt_pre_hook.sh'); + } symlink(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_pre_hook.sh', '/usr/local/bin/letsencrypt_pre_hook.sh'); chown('/usr/local/bin/letsencrypt_pre_hook.sh', 'root'); chmod('/usr/local/bin/letsencrypt_pre_hook.sh', 0700); } if(file_exists(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_post_hook.sh') && !file_exists('/usr/local/bin/letsencrypt_post_hook.sh')) { + if(is_link('/usr/local/bin/letsencrypt_post_hook.sh')) { + unlink('/usr/local/bin/letsencrypt_post_hook.sh'); + } symlink(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_post_hook.sh', '/usr/local/bin/letsencrypt_post_hook.sh'); chown('/usr/local/bin/letsencrypt_post_hook.sh', 'root'); chmod('/usr/local/bin/letsencrypt_post_hook.sh', 0700); } if(file_exists(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_renew_hook.sh') && !file_exists('/usr/local/bin/letsencrypt_renew_hook.sh')) { + if(is_link('/usr/local/bin/letsencrypt_renew_hook.sh')) { + unlink('/usr/local/bin/letsencrypt_renew_hook.sh'); + } symlink(ISPC_INSTALL_ROOT . '/server/scripts/letsencrypt_renew_hook.sh', '/usr/local/bin/letsencrypt_renew_hook.sh'); chown('/usr/local/bin/letsencrypt_renew_hook.sh', 'root'); chmod('/usr/local/bin/letsencrypt_renew_hook.sh', 0700); -- GitLab From b6698e0852bcba04839052e831c90ff3cedec817 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 19 Aug 2021 15:55:10 -0600 Subject: [PATCH 1231/1368] mail_forwarding source must be unique --- install/sql/incremental/upd_dev_collection.sql | 4 ++++ install/sql/ispconfig3.sql | 2 +- interface/web/mail/form/mail_alias.tform.php | 2 ++ interface/web/mail/form/mail_forward.tform.php | 2 ++ interface/web/mail/lib/lang/ar_mail_alias.lng | 1 - interface/web/mail/lib/lang/ar_mail_forward.lng | 2 +- interface/web/mail/lib/lang/bg_mail_alias.lng | 1 - interface/web/mail/lib/lang/bg_mail_forward.lng | 2 +- interface/web/mail/lib/lang/br_mail_forward.lng | 1 + interface/web/mail/lib/lang/ca_mail_alias.lng | 1 - interface/web/mail/lib/lang/ca_mail_forward.lng | 2 +- interface/web/mail/lib/lang/cz_mail_forward.lng | 1 + interface/web/mail/lib/lang/de_mail_alias.lng | 1 - interface/web/mail/lib/lang/de_mail_forward.lng | 2 +- interface/web/mail/lib/lang/dk_mail_alias.lng | 1 - interface/web/mail/lib/lang/dk_mail_forward.lng | 2 +- interface/web/mail/lib/lang/el_mail_alias.lng | 1 - interface/web/mail/lib/lang/el_mail_forward.lng | 2 +- interface/web/mail/lib/lang/en_mail_alias.lng | 1 - interface/web/mail/lib/lang/en_mail_forward.lng | 2 +- interface/web/mail/lib/lang/es_mail_alias.lng | 1 - interface/web/mail/lib/lang/es_mail_forward.lng | 2 +- interface/web/mail/lib/lang/fi_mail_alias.lng | 1 - interface/web/mail/lib/lang/fi_mail_forward.lng | 2 +- interface/web/mail/lib/lang/fr_mail_alias.lng | 1 - interface/web/mail/lib/lang/fr_mail_forward.lng | 2 +- interface/web/mail/lib/lang/hr_mail_alias.lng | 1 - interface/web/mail/lib/lang/hr_mail_forward.lng | 2 +- interface/web/mail/lib/lang/hu_mail_alias.lng | 1 - interface/web/mail/lib/lang/hu_mail_forward.lng | 2 +- interface/web/mail/lib/lang/id_mail_alias.lng | 1 - interface/web/mail/lib/lang/id_mail_forward.lng | 2 +- interface/web/mail/lib/lang/it_mail_alias.lng | 1 - interface/web/mail/lib/lang/it_mail_forward.lng | 2 +- interface/web/mail/lib/lang/ja_mail_alias.lng | 1 - interface/web/mail/lib/lang/ja_mail_forward.lng | 2 +- interface/web/mail/lib/lang/nl_mail_alias.lng | 1 - interface/web/mail/lib/lang/nl_mail_forward.lng | 2 +- interface/web/mail/lib/lang/pl_mail_alias.lng | 1 - interface/web/mail/lib/lang/pl_mail_forward.lng | 2 +- interface/web/mail/lib/lang/pt_mail_alias.lng | 1 - interface/web/mail/lib/lang/pt_mail_forward.lng | 2 +- interface/web/mail/lib/lang/ro_mail_alias.lng | 1 - interface/web/mail/lib/lang/ro_mail_forward.lng | 2 +- interface/web/mail/lib/lang/ru_mail_alias.lng | 1 - interface/web/mail/lib/lang/ru_mail_forward.lng | 2 +- interface/web/mail/lib/lang/se_mail_alias.lng | 1 - interface/web/mail/lib/lang/se_mail_forward.lng | 2 +- interface/web/mail/lib/lang/sk_mail_alias.lng | 1 - interface/web/mail/lib/lang/sk_mail_forward.lng | 2 +- interface/web/mail/lib/lang/tr_mail_alias.lng | 1 - interface/web/mail/lib/lang/tr_mail_forward.lng | 2 +- 52 files changed, 34 insertions(+), 47 deletions(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 2a9a9ffd09..75a6b01d93 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -1,2 +1,6 @@ -- default spamfilter_users.policy_id to 0 ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; + +-- mail_forwarding.source must be unique +ALTER TABLE `mail_forwarding` DROP KEY `server_id`; +ALTER TABLE `mail_forwarding` ADD UNIQUE KEY `server_id` (`server_id`, `source`); diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 9ebb69090f..709fa09c79 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -916,7 +916,7 @@ CREATE TABLE `mail_forwarding` ( `allow_send_as` ENUM('n','y') NOT NULL DEFAULT 'n', `greylisting` enum('n','y' ) NOT NULL DEFAULT 'n', PRIMARY KEY (`forwarding_id`), - KEY `server_id` (`server_id`,`source`), + UNIQUE KEY `server_id` (`server_id`, `source`), KEY `type` (`type`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/interface/web/mail/form/mail_alias.tform.php b/interface/web/mail/form/mail_alias.tform.php index 9434ba3eec..39b485c7a5 100644 --- a/interface/web/mail/form/mail_alias.tform.php +++ b/interface/web/mail/form/mail_alias.tform.php @@ -83,6 +83,8 @@ $form["tabs"]['alias'] = array ( ), 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'email_error_isemail'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), ), 'default' => '', 'value' => '', diff --git a/interface/web/mail/form/mail_forward.tform.php b/interface/web/mail/form/mail_forward.tform.php index 003e678455..db940f035e 100644 --- a/interface/web/mail/form/mail_forward.tform.php +++ b/interface/web/mail/form/mail_forward.tform.php @@ -83,6 +83,8 @@ $form["tabs"]['forward'] = array ( ), 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'email_error_isemail'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'email_error_unique'), ), 'default' => '', 'value' => '', diff --git a/interface/web/mail/lib/lang/ar_mail_alias.lng b/interface/web/mail/lib/lang/ar_mail_alias.lng index 32a6b85e4e..98921ce7ce 100644 --- a/interface/web/mail/lib/lang/ar_mail_alias.lng +++ b/interface/web/mail/lib/lang/ar_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ar_mail_forward.lng b/interface/web/mail/lib/lang/ar_mail_forward.lng index 3f9cfa956b..4291bd415c 100644 --- a/interface/web/mail/lib/lang/ar_mail_forward.lng +++ b/interface/web/mail/lib/lang/ar_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicate Emailaddress.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/bg_mail_alias.lng b/interface/web/mail/lib/lang/bg_mail_alias.lng index 32a6b85e4e..98921ce7ce 100644 --- a/interface/web/mail/lib/lang/bg_mail_alias.lng +++ b/interface/web/mail/lib/lang/bg_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/bg_mail_forward.lng b/interface/web/mail/lib/lang/bg_mail_forward.lng index b5c80dd89d..1e12ca1ece 100644 --- a/interface/web/mail/lib/lang/bg_mail_forward.lng +++ b/interface/web/mail/lib/lang/bg_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicate Emailaddress.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/br_mail_forward.lng b/interface/web/mail/lib/lang/br_mail_forward.lng index dd1eb9bb56..396262d787 100644 --- a/interface/web/mail/lib/lang/br_mail_forward.lng +++ b/interface/web/mail/lib/lang/br_mail_forward.lng @@ -9,6 +9,7 @@ $wb['source_txt'] = 'Endereço de email de origem'; $wb['destination_error_empty'] = 'O endereço de email de destino não pode ficar vazio.'; $wb['destination_error_isemail'] = 'O endereço de email de destino é inválido.'; $wb['email_error_isemail'] = 'Por favor informe um endereço de email válido.'; +$wb['email_error_unique'] = 'Endereço de email duplicado.'; $wb['send_as_txt'] = 'Enviar como'; $wb['send_as_exp'] = 'Permitir o destino enviar emails usando este endereço como origem (se o destino for interno)'; $wb['greylisting_txt'] = 'Habilitar greylist'; diff --git a/interface/web/mail/lib/lang/ca_mail_alias.lng b/interface/web/mail/lib/lang/ca_mail_alias.lng index a1c3eacb67..0b8d9b0e45 100644 --- a/interface/web/mail/lib/lang/ca_mail_alias.lng +++ b/interface/web/mail/lib/lang/ca_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/ca_mail_forward.lng b/interface/web/mail/lib/lang/ca_mail_forward.lng index 7b8feb1e8f..2f9d26288f 100644 --- a/interface/web/mail/lib/lang/ca_mail_forward.lng +++ b/interface/web/mail/lib/lang/ca_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source courriel'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Dupliquer l\'adresse courriel.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/cz_mail_forward.lng b/interface/web/mail/lib/lang/cz_mail_forward.lng index f1deae4081..1faa74c26c 100644 --- a/interface/web/mail/lib/lang/cz_mail_forward.lng +++ b/interface/web/mail/lib/lang/cz_mail_forward.lng @@ -9,6 +9,7 @@ $wb['source_txt'] = 'Zdrojový e-mail'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Zadejte prosím platnou e-mailovou adresu.'; +$wb['email_error_unique'] = 'Duplikování e-mailové adresy.'; $wb['send_as_txt'] = 'Odeslat jako'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Povolit greylisting'; diff --git a/interface/web/mail/lib/lang/de_mail_alias.lng b/interface/web/mail/lib/lang/de_mail_alias.lng index 4cdcd03a6f..7d8099fdca 100644 --- a/interface/web/mail/lib/lang/de_mail_alias.lng +++ b/interface/web/mail/lib/lang/de_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Senden als'; $wb['send_as_exp'] = 'Ziel erlauben, den Alias als Absender zu benutzen'; $wb['greylisting_txt'] = 'Aktiviere Greylisting'; -?> diff --git a/interface/web/mail/lib/lang/de_mail_forward.lng b/interface/web/mail/lib/lang/de_mail_forward.lng index 4825ef7811..4435ce707c 100644 --- a/interface/web/mail/lib/lang/de_mail_forward.lng +++ b/interface/web/mail/lib/lang/de_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Quell E-Mail Adresse'; $wb['destination_error_empty'] = 'Das Weiterleitungsziel darf nicht leer sein.'; $wb['destination_error_isemail'] = 'Das Weiterleitungsziel enthält mindestens eine ungültige E-Mail-Adresse.'; $wb['email_error_isemail'] = 'Bitte geben Sie eine gültige E-Mail Adresse an.'; +$wb['email_error_unique'] = 'Doppelte E-Mail Adresse.'; $wb['send_as_txt'] = 'Senden als'; $wb['send_as_exp'] = 'Ziel erlauben, die Adresse als Absender zu nutzen (Nur, falls das Ziel intern ist)'; $wb['greylisting_txt'] = 'Aktiviere greylisting'; -?> diff --git a/interface/web/mail/lib/lang/dk_mail_alias.lng b/interface/web/mail/lib/lang/dk_mail_alias.lng index 19b4112001..c0a66126f2 100644 --- a/interface/web/mail/lib/lang/dk_mail_alias.lng +++ b/interface/web/mail/lib/lang/dk_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/dk_mail_forward.lng b/interface/web/mail/lib/lang/dk_mail_forward.lng index ba47d8421d..55939b9deb 100644 --- a/interface/web/mail/lib/lang/dk_mail_forward.lng +++ b/interface/web/mail/lib/lang/dk_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Kilde E-mail'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Dupliker E-mailadresse.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/el_mail_alias.lng b/interface/web/mail/lib/lang/el_mail_alias.lng index 5663822ce0..bcbb3220c7 100644 --- a/interface/web/mail/lib/lang/el_mail_alias.lng +++ b/interface/web/mail/lib/lang/el_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/el_mail_forward.lng b/interface/web/mail/lib/lang/el_mail_forward.lng index 8893b2fa0f..2519aa39e8 100644 --- a/interface/web/mail/lib/lang/el_mail_forward.lng +++ b/interface/web/mail/lib/lang/el_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Διπλή διεύθυνση Email.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/en_mail_alias.lng b/interface/web/mail/lib/lang/en_mail_alias.lng index 439ab74a09..23c567125d 100644 --- a/interface/web/mail/lib/lang/en_mail_alias.lng +++ b/interface/web/mail/lib/lang/en_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/en_mail_forward.lng b/interface/web/mail/lib/lang/en_mail_forward.lng index c38e2bf4ff..6be6ab7e70 100644 --- a/interface/web/mail/lib/lang/en_mail_forward.lng +++ b/interface/web/mail/lib/lang/en_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source Email'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicate Emailaddress.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/es_mail_alias.lng b/interface/web/mail/lib/lang/es_mail_alias.lng index 18d1cb7347..7c0d7c7ccf 100644 --- a/interface/web/mail/lib/lang/es_mail_alias.lng +++ b/interface/web/mail/lib/lang/es_mail_alias.lng @@ -14,4 +14,3 @@ $wb['no_domain_perm'] = 'No tiene permisos para usar este dominio.'; $wb['send_as_exp'] = 'Permite al destinatario enviar correos usando este alias como origen'; $wb['send_as_txt'] = 'Enviar como'; $wb['source_txt'] = 'Alias'; -?> diff --git a/interface/web/mail/lib/lang/es_mail_forward.lng b/interface/web/mail/lib/lang/es_mail_forward.lng index 7ea99ea619..a295943f3c 100644 --- a/interface/web/mail/lib/lang/es_mail_forward.lng +++ b/interface/web/mail/lib/lang/es_mail_forward.lng @@ -6,10 +6,10 @@ $wb['duplicate_mailbox_txt'] = 'Ya existe un buzón con esta cuenta de correo.'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Por favor, introduzca una dirección de correo válida.'; +$wb['email_error_unique'] = 'Dirección de correo duplicada.'; $wb['email_txt'] = 'Correo'; $wb['greylisting_txt'] = 'Habilitar Lista Gris'; $wb['limit_mailforward_txt'] = 'Ha alcanzado el número máx. de reenvíos de correos permitidos para su cuenta.'; $wb['send_as_exp'] = 'Permitir al destino enviar correo usando esta dirección como origen (si el destino es interno)'; $wb['send_as_txt'] = 'Enviar como'; $wb['source_txt'] = 'Origen del correo'; -?> diff --git a/interface/web/mail/lib/lang/fi_mail_alias.lng b/interface/web/mail/lib/lang/fi_mail_alias.lng index 918db07761..20179dfdb6 100644 --- a/interface/web/mail/lib/lang/fi_mail_alias.lng +++ b/interface/web/mail/lib/lang/fi_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/fi_mail_forward.lng b/interface/web/mail/lib/lang/fi_mail_forward.lng index 80d34b5004..72b36cd082 100644 --- a/interface/web/mail/lib/lang/fi_mail_forward.lng +++ b/interface/web/mail/lib/lang/fi_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Tämä aliasosoite on jo olemassa'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/fr_mail_alias.lng b/interface/web/mail/lib/lang/fr_mail_alias.lng index 2baa476c65..b3868afc2c 100644 --- a/interface/web/mail/lib/lang/fr_mail_alias.lng +++ b/interface/web/mail/lib/lang/fr_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/fr_mail_forward.lng b/interface/web/mail/lib/lang/fr_mail_forward.lng index fd6d13c6bb..87caec79e0 100644 --- a/interface/web/mail/lib/lang/fr_mail_forward.lng +++ b/interface/web/mail/lib/lang/fr_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source Email'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Dupliquer l’adresse e-mail.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/hr_mail_alias.lng b/interface/web/mail/lib/lang/hr_mail_alias.lng index 180bcbeacd..152172a6b5 100644 --- a/interface/web/mail/lib/lang/hr_mail_alias.lng +++ b/interface/web/mail/lib/lang/hr_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/hr_mail_forward.lng b/interface/web/mail/lib/lang/hr_mail_forward.lng index 10abd5fe92..86430d19f7 100644 --- a/interface/web/mail/lib/lang/hr_mail_forward.lng +++ b/interface/web/mail/lib/lang/hr_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicirane email adrese.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/hu_mail_alias.lng b/interface/web/mail/lib/lang/hu_mail_alias.lng index 7fc9e7a1d3..f2b5fab45a 100644 --- a/interface/web/mail/lib/lang/hu_mail_alias.lng +++ b/interface/web/mail/lib/lang/hu_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/hu_mail_forward.lng b/interface/web/mail/lib/lang/hu_mail_forward.lng index c58ae29d31..936b9781ef 100644 --- a/interface/web/mail/lib/lang/hu_mail_forward.lng +++ b/interface/web/mail/lib/lang/hu_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Már létező email cím'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/id_mail_alias.lng b/interface/web/mail/lib/lang/id_mail_alias.lng index e0efdb1504..aae76432fd 100644 --- a/interface/web/mail/lib/lang/id_mail_alias.lng +++ b/interface/web/mail/lib/lang/id_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/id_mail_forward.lng b/interface/web/mail/lib/lang/id_mail_forward.lng index 5f0c788878..792070d920 100644 --- a/interface/web/mail/lib/lang/id_mail_forward.lng +++ b/interface/web/mail/lib/lang/id_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Alamat Email Ganda.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/it_mail_alias.lng b/interface/web/mail/lib/lang/it_mail_alias.lng index fea4fe0c12..eab82caf51 100644 --- a/interface/web/mail/lib/lang/it_mail_alias.lng +++ b/interface/web/mail/lib/lang/it_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/it_mail_forward.lng b/interface/web/mail/lib/lang/it_mail_forward.lng index 3b5210fba1..6c4690c750 100644 --- a/interface/web/mail/lib/lang/it_mail_forward.lng +++ b/interface/web/mail/lib/lang/it_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source Email'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Indirizzo email duplicato.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; -?> diff --git a/interface/web/mail/lib/lang/ja_mail_alias.lng b/interface/web/mail/lib/lang/ja_mail_alias.lng index c03bb825da..317a28337f 100644 --- a/interface/web/mail/lib/lang/ja_mail_alias.lng +++ b/interface/web/mail/lib/lang/ja_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ja_mail_forward.lng b/interface/web/mail/lib/lang/ja_mail_forward.lng index f849f7bf18..0d6b4312ef 100644 --- a/interface/web/mail/lib/lang/ja_mail_forward.lng +++ b/interface/web/mail/lib/lang/ja_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'メールアドレスが重複しています。'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/nl_mail_alias.lng b/interface/web/mail/lib/lang/nl_mail_alias.lng index d327afa90c..1ab52542ab 100644 --- a/interface/web/mail/lib/lang/nl_mail_alias.lng +++ b/interface/web/mail/lib/lang/nl_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/nl_mail_forward.lng b/interface/web/mail/lib/lang/nl_mail_forward.lng index 6bf586a0d2..33dadeef6b 100644 --- a/interface/web/mail/lib/lang/nl_mail_forward.lng +++ b/interface/web/mail/lib/lang/nl_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicaat E-mail adres.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/pl_mail_alias.lng b/interface/web/mail/lib/lang/pl_mail_alias.lng index 4833383342..6c49433b60 100644 --- a/interface/web/mail/lib/lang/pl_mail_alias.lng +++ b/interface/web/mail/lib/lang/pl_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/pl_mail_forward.lng b/interface/web/mail/lib/lang/pl_mail_forward.lng index ce79e10938..2c9c32adf7 100644 --- a/interface/web/mail/lib/lang/pl_mail_forward.lng +++ b/interface/web/mail/lib/lang/pl_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplikat adresów e-mail.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/pt_mail_alias.lng b/interface/web/mail/lib/lang/pt_mail_alias.lng index 91736e3020..afb7408eab 100644 --- a/interface/web/mail/lib/lang/pt_mail_alias.lng +++ b/interface/web/mail/lib/lang/pt_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/pt_mail_forward.lng b/interface/web/mail/lib/lang/pt_mail_forward.lng index db67461967..3f0dc04f7c 100644 --- a/interface/web/mail/lib/lang/pt_mail_forward.lng +++ b/interface/web/mail/lib/lang/pt_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Endereço de correio duplicado.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/ro_mail_alias.lng b/interface/web/mail/lib/lang/ro_mail_alias.lng index d5e8e0fb0f..65b9abbd52 100644 --- a/interface/web/mail/lib/lang/ro_mail_alias.lng +++ b/interface/web/mail/lib/lang/ro_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ro_mail_forward.lng b/interface/web/mail/lib/lang/ro_mail_forward.lng index 5e00bf0527..3103f26dc8 100644 --- a/interface/web/mail/lib/lang/ro_mail_forward.lng +++ b/interface/web/mail/lib/lang/ro_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicat Emailaddress.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/ru_mail_alias.lng b/interface/web/mail/lib/lang/ru_mail_alias.lng index e093ad9986..fd15ffbc91 100644 --- a/interface/web/mail/lib/lang/ru_mail_alias.lng +++ b/interface/web/mail/lib/lang/ru_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Алиас'; $wb['greylisting_txt'] = 'Включить серый список (Greylisting)'; $wb['send_as_txt'] = 'Отправить как'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/ru_mail_forward.lng b/interface/web/mail/lib/lang/ru_mail_forward.lng index 6eb11f4f91..0be6608b80 100644 --- a/interface/web/mail/lib/lang/ru_mail_forward.lng +++ b/interface/web/mail/lib/lang/ru_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Включить серый список (Greylisting) $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Некорректный почтовый адрес.'; +$wb['email_error_unique'] = 'Такая запись уже есть.'; $wb['send_as_txt'] = 'Отправить как'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/se_mail_alias.lng b/interface/web/mail/lib/lang/se_mail_alias.lng index 441e33eac2..5011c02a1f 100644 --- a/interface/web/mail/lib/lang/se_mail_alias.lng +++ b/interface/web/mail/lib/lang/se_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/se_mail_forward.lng b/interface/web/mail/lib/lang/se_mail_forward.lng index 7b0aa2bc16..4ac59fb99c 100644 --- a/interface/web/mail/lib/lang/se_mail_forward.lng +++ b/interface/web/mail/lib/lang/se_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Epostadressen finns redan.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/sk_mail_alias.lng b/interface/web/mail/lib/lang/sk_mail_alias.lng index 70b6b1c246..da89509e76 100644 --- a/interface/web/mail/lib/lang/sk_mail_alias.lng +++ b/interface/web/mail/lib/lang/sk_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Alias'; $wb['greylisting_txt'] = 'Enable greylisting'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -?> diff --git a/interface/web/mail/lib/lang/sk_mail_forward.lng b/interface/web/mail/lib/lang/sk_mail_forward.lng index 399971261a..7730600125 100644 --- a/interface/web/mail/lib/lang/sk_mail_forward.lng +++ b/interface/web/mail/lib/lang/sk_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['email_error_unique'] = 'Duplicitná email adresa.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -?> diff --git a/interface/web/mail/lib/lang/tr_mail_alias.lng b/interface/web/mail/lib/lang/tr_mail_alias.lng index ea440b2e63..f049c2b270 100644 --- a/interface/web/mail/lib/lang/tr_mail_alias.lng +++ b/interface/web/mail/lib/lang/tr_mail_alias.lng @@ -14,4 +14,3 @@ $wb['source_txt'] = 'Takma Ad'; $wb['send_as_txt'] = 'Gönderen'; $wb['send_as_exp'] = 'Hedef bu adresi kaynak olarak göstererek e-posta gönderebilsin'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; -?> diff --git a/interface/web/mail/lib/lang/tr_mail_forward.lng b/interface/web/mail/lib/lang/tr_mail_forward.lng index bdcd02a862..03624e56b6 100644 --- a/interface/web/mail/lib/lang/tr_mail_forward.lng +++ b/interface/web/mail/lib/lang/tr_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Kaynak E-posta'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Lütfen geçerli bir e-posta adresi yazın.'; +$wb['email_error_unique'] = 'Bu e-posta adresi zaten var'; $wb['send_as_txt'] = 'Gönderen'; $wb['send_as_exp'] = 'Hedef bu adresi kaynak olarak göstererek e-posta gönderebilsin (hedef iç kullanıcı ise)'; $wb['greylisting_txt'] = 'Gri Liste Kullanılsın'; -?> -- GitLab From 36a29359184f68a04093182912e41bced9c01581 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 23 Aug 2021 18:07:07 -0600 Subject: [PATCH 1232/1368] installer: remove duplicate mail_forwarding prior to adding unique key --- install/patches/upd_0094.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 install/patches/upd_0094.php diff --git a/install/patches/upd_0094.php b/install/patches/upd_0094.php new file mode 100644 index 0000000000..b9516e232e --- /dev/null +++ b/install/patches/upd_0094.php @@ -0,0 +1,14 @@ +db->query("DELETE FROM mail_forwarding WHERE forwarding_id IN (SELECT forwarding_id FROM (SELECT forwarding_id, COUNT(source) AS source_count FROM mail_forwarding GROUP BY source HAVING source_count > 1) as t1)"); + } + +} -- GitLab From 2fe1c421c4b76e04b5fc998bab61adcdd0258eee Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 26 Aug 2021 16:05:58 +0000 Subject: [PATCH 1233/1368] Missing asterisk for libnss*.so.* --- install/tpl/jk_init.ini.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 418488194f..2563c40b04 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -6,7 +6,7 @@ [uidbasics] comment = common files for all jails that need user/group information -paths = /lib*/libnsl.so.*, /lib*/libnss*.so.*, /lib/*/libnsl.so.*, /lib/*/libnss.so.*, /etc/nsswitch.conf, /etc/ld.so.conf +paths = /lib*/libnsl.so.*, /lib*/libnss*.so.*, /lib/*/libnsl.so.*, /lib/*/libnss*.so.*, /etc/nsswitch.conf, /etc/ld.so.conf [netbasics] comment = common files for all jails that need any internet connectivity -- GitLab From d66af1e34765c7d82963af1bc75fdb2446917432 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 2 Sep 2021 13:21:40 +0200 Subject: [PATCH 1234/1368] Add api functions for DNS type LOC, #6224 These were already listed in interface/web/dns/lib/remote.conf.php --- interface/lib/classes/remote.d/dns.inc.php | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 15f47db874..b5d4b3820c 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -513,6 +513,29 @@ class remoting_dns extends remoting { return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'HINFO'); } + + // ---------------------------------------------------------------------------------------------------------------- + + //* Get record details + public function dns_loc_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'LOC'); + } + + //* Add a record + public function dns_loc_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'LOC'); + } + + //* Update a record + public function dns_loc_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'LOC'); + } + + //* Delete a record + public function dns_loc_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'LOC'); + } + // ---------------------------------------------------------------------------------------------------------------- //* Get record details -- GitLab From 1466839a06fff7701442b030cee9702dc4618c79 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 3 Sep 2021 08:03:42 +0000 Subject: [PATCH 1235/1368] Update upd_0093.sql --- install/sql/incremental/upd_0093.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/install/sql/incremental/upd_0093.sql b/install/sql/incremental/upd_0093.sql index 71efb3085e..96c5307f0e 100644 --- a/install/sql/incremental/upd_0093.sql +++ b/install/sql/incremental/upd_0093.sql @@ -12,10 +12,10 @@ ALTER TABLE mail_domain ADD COLUMN `relay_host` varchar(255) NOT NULL default '' ADD COLUMN `relay_user` varchar(255) NOT NULL default '' AFTER `relay_host`, ADD COLUMN `relay_pass` varchar(255) NOT NULL default '' AFTER `relay_user`; -- Purge apps & addons installer (#5795) -DROP TABLE 'software_package'; -DROP TABLE 'software_repo'; -DROP TABLE 'software_update'; -DROP TABLE 'software_update_inst'; +DROP TABLE `software_package`; +DROP TABLE `software_repo`; +DROP TABLE `software_update`; +DROP TABLE `software_update_inst`; -- Brexit UPDATE `country` SET `eu` = 'n' WHERE `iso` = 'GB'; -- GitLab From caef217b5ec315a214e611bd05655f8b52f81687 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Fri, 3 Sep 2021 08:04:49 +0000 Subject: [PATCH 1236/1368] Update upd_dev_collection.sql --- install/sql/incremental/upd_dev_collection.sql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 75a6b01d93..c0d4bf04f6 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -4,3 +4,9 @@ ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; -- mail_forwarding.source must be unique ALTER TABLE `mail_forwarding` DROP KEY `server_id`; ALTER TABLE `mail_forwarding` ADD UNIQUE KEY `server_id` (`server_id`, `source`); + +-- Purge apps & addons installer (#5795) - second time due to syntax error in 0093 +DROP TABLE IF EXISTS `software_package`; +DROP TABLE IF EXISTS `software_repo`; +DROP TABLE IF EXISTS `software_update`; +DROP TABLE IF EXISTS `software_update_inst`; -- GitLab From e94ca9f3b9c474e91becb8e1769fe596a763e525 Mon Sep 17 00:00:00 2001 From: Ninos Date: Mon, 6 Sep 2021 15:16:55 +0200 Subject: [PATCH 1237/1368] Fixed: Rewrite proxy for ssl targets --- server/conf/vhost.conf.master | 3 +++ server/plugins-available/apache2_plugin.inc.php | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 5b5e1f059e..0b432f2bf4 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -517,6 +517,9 @@ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^
    + + SSLProxyEngine On + RewriteRule ^/(.*)$ $1 diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 2db717c92a..0965b79e3b 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1372,13 +1372,14 @@ class apache2_plugin { $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_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_target_ssl' => $rewrite_target_ssl, '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_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); break; @@ -1386,7 +1387,7 @@ class apache2_plugin { $rewrite_wildcard_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_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); break; @@ -1394,7 +1395,7 @@ class apache2_plugin { $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_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); } -- GitLab From 55699e73690870eb018bcd8b3ab8a06e394dafea Mon Sep 17 00:00:00 2001 From: Ninos Date: Mon, 6 Sep 2021 15:23:51 +0200 Subject: [PATCH 1238/1368] Fixed: Rewrite proxy for ssl targets --- server/plugins-available/apache2_plugin.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 0965b79e3b..b4164b8a27 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -1380,6 +1380,7 @@ class apache2_plugin { 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), + 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); break; @@ -1388,6 +1389,7 @@ class apache2_plugin { 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), + 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); break; @@ -1396,6 +1398,7 @@ class apache2_plugin { 'rewrite_type' => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']', 'rewrite_target' => $rewrite_target, 'rewrite_target_is_ssl' => ('https://' === substr($rewrite_target, 0, 8) ? 'y' : 'n'), + 'rewrite_target_ssl' => $rewrite_target_ssl, 'rewrite_is_url' => ($this->_is_url($rewrite_target) ? 'y' : 'n'), 'rewrite_add_path' => (substr($rewrite_target, -1) == '/' ? 'y' : 'n')); } -- GitLab From 456db4758bc74fc0186c6ac6d8e9c33a41c24145 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 7 Sep 2021 08:01:33 +0000 Subject: [PATCH 1239/1368] Fixed syntax --- interface/web/client/form/client.tform.php | 2 ++ interface/web/client/form/reseller.tform.php | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index ef3a01ec96..1f60ffe1b4 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -943,6 +943,8 @@ $form["tabs"]['limits'] = array ( 'formtype' => 'CHECKBOX', 'default' => 'y', 'valuelimit' => 'client:limit_mail_backup', + 'value' => array(0 => 'n', 1 => 'y') + ), 'limit_relayhost' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php index ec2a078533..d48dea6229 100644 --- a/interface/web/client/form/reseller.tform.php +++ b/interface/web/client/form/reseller.tform.php @@ -940,7 +940,8 @@ $form["tabs"]['limits'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', 'default' => 'y', - 'valuelimit' => 'client:limit_mail_backup', + 'value' => array(0 => 'n', 1 => 'y') + ), 'limit_relayhost' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', -- GitLab From 9745d5bdc81bcf680696db6c7ef3f34d0acce30c Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 27 Aug 2021 15:32:23 -0600 Subject: [PATCH 1240/1368] mail: transport domain must be unique per server --- install/patches/upd_0094.php | 5 +- .../sql/incremental/upd_dev_collection.sql | 4 ++ install/sql/ispconfig3.sql | 2 +- .../classes/validate_mail_transport.inc.php | 63 +++++++++++++++++++ .../web/mail/form/mail_transport.tform.php | 8 +++ interface/web/mail/lib/lang/ar_mail_alias.lng | 4 +- .../web/mail/lib/lang/ar_mail_forward.lng | 2 +- .../web/mail/lib/lang/ar_mail_transport.lng | 2 +- interface/web/mail/lib/lang/bg_mail_alias.lng | 4 +- .../web/mail/lib/lang/bg_mail_forward.lng | 2 +- .../web/mail/lib/lang/bg_mail_transport.lng | 2 +- .../web/mail/lib/lang/br_mail_transport.lng | 1 + .../web/mail/lib/lang/ca_mail_transport.lng | 2 +- .../web/mail/lib/lang/cz_mail_transport.lng | 1 + .../web/mail/lib/lang/de_mail_transport.lng | 2 +- .../web/mail/lib/lang/dk_mail_transport.lng | 2 +- .../web/mail/lib/lang/el_mail_transport.lng | 2 +- interface/web/mail/lib/lang/en_mail_alias.lng | 4 +- .../web/mail/lib/lang/en_mail_forward.lng | 2 +- .../web/mail/lib/lang/en_mail_transport.lng | 2 +- .../web/mail/lib/lang/es_mail_transport.lng | 2 +- .../web/mail/lib/lang/fi_mail_transport.lng | 2 +- .../web/mail/lib/lang/fr_mail_transport.lng | 2 +- .../web/mail/lib/lang/hr_mail_transport.lng | 2 +- .../web/mail/lib/lang/hu_mail_transport.lng | 2 +- .../web/mail/lib/lang/id_mail_transport.lng | 2 +- .../web/mail/lib/lang/it_mail_transport.lng | 2 +- .../web/mail/lib/lang/ja_mail_transport.lng | 2 +- .../web/mail/lib/lang/nl_mail_transport.lng | 2 +- .../web/mail/lib/lang/pl_mail_transport.lng | 2 +- .../web/mail/lib/lang/pt_mail_transport.lng | 2 +- interface/web/mail/lib/lang/ro_mail_alias.lng | 4 +- .../web/mail/lib/lang/ro_mail_forward.lng | 2 +- .../web/mail/lib/lang/ro_mail_transport.lng | 2 +- .../web/mail/lib/lang/ru_mail_transport.lng | 2 +- .../web/mail/lib/lang/se_mail_transport.lng | 2 +- .../web/mail/lib/lang/sk_mail_transport.lng | 2 +- .../web/mail/lib/lang/tr_mail_transport.lng | 2 +- 38 files changed, 117 insertions(+), 37 deletions(-) create mode 100644 interface/lib/classes/validate_mail_transport.inc.php diff --git a/install/patches/upd_0094.php b/install/patches/upd_0094.php index b9516e232e..5531e88fa9 100644 --- a/install/patches/upd_0094.php +++ b/install/patches/upd_0094.php @@ -8,7 +8,10 @@ class upd_0094 extends installer_patch_update { global $inst; // Remove any duplicate mail_forwardings prior to adding unique key - $inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id IN (SELECT forwarding_id FROM (SELECT forwarding_id, COUNT(source) AS source_count FROM mail_forwarding GROUP BY source HAVING source_count > 1) as t1)"); + $inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id NOT IN (SELECT MIN(forwarding_id) FROM mail_forwarding GROUP BY source)"); + + // Remove any duplicate mail_transports prior to adding unique key + $inst->db->query("DELETE FROM mail_transport WHERE transport_id NOT IN (SELECT MIN(transport_id) FROM mail_transport GROUP BY domain, server_id)"); } } diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 2400ca907a..72f0f03761 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -14,3 +14,7 @@ DROP TABLE IF EXISTS `software_package`; DROP TABLE IF EXISTS `software_repo`; DROP TABLE IF EXISTS `software_update`; DROP TABLE IF EXISTS `software_update_inst`; + +-- mail_transport.domain must be unique +ALTER TABLE `mail_transport` DROP KEY `server_id_2`; +ALTER TABLE `mail_transport` ADD UNIQUE KEY `server_id_2` (`server_id`, `domain`); diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index e37bef7f28..9112599453 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1023,7 +1023,7 @@ CREATE TABLE `mail_transport` ( `active` enum('n','y') NOT NULL DEFAULT 'n', PRIMARY KEY (`transport_id`), KEY `server_id` (`server_id`,`transport`), - KEY `server_id_2` (`server_id`,`domain`) + UNIQUE KEY `server_id_2` (`server_id`, `domain`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; -- -------------------------------------------------------- diff --git a/interface/lib/classes/validate_mail_transport.inc.php b/interface/lib/classes/validate_mail_transport.inc.php new file mode 100644 index 0000000000..eaf4b92a72 --- /dev/null +++ b/interface/lib/classes/validate_mail_transport.inc.php @@ -0,0 +1,63 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class validate_mail_transport { + + function get_error($errmsg) { + global $app; + + if(isset($app->tform->wordbook[$errmsg])) { + return $app->tform->wordbook[$errmsg]."
    \r\n"; + } else { + return $errmsg."
    \r\n"; + } + } + + /* Validator function for checking the 'domain' of a mail transport */ + function validate_domain($field_name, $field_value, $validator) { + global $app, $conf; + + if(empty($field_value) || $field_name != 'domain') return; + + if(isset($app->remoting_lib->primary_id)) { + $id = $app->remoting_lib->primary_id; + } else { + $id = $app->tform->primary_id; + } + + // mail_transport.domain (could also be an email address) must be unique per server + $sql = "SELECT transport_id, domain FROM mail_transport WHERE domain = ? AND server_id = ? AND transport_id != ?"; + $domain_check = $app->db->queryOneRecord($sql, $field_value, $conf['server_id'], $id); + + if($domain_check) return $this->get_error('domain_error_unique'); + } + +} diff --git a/interface/web/mail/form/mail_transport.tform.php b/interface/web/mail/form/mail_transport.tform.php index b40ad86e8a..deb83d629d 100644 --- a/interface/web/mail/form/mail_transport.tform.php +++ b/interface/web/mail/form/mail_transport.tform.php @@ -88,6 +88,14 @@ $form["tabs"]['transport'] = array ( 4 => array( 'event' => 'SAVE', 'type' => 'STRIPNL') ), + 'validators' => array( + 0 => array( + 'type' => 'CUSTOM', + 'class' => 'validate_mail_transport', + 'function' => 'validate_domain', + 'errmsg'=> 'domain_error_unique', + ) + ), 'default' => '', 'value' => '', 'width' => '30', diff --git a/interface/web/mail/lib/lang/ar_mail_alias.lng b/interface/web/mail/lib/lang/ar_mail_alias.lng index 98921ce7ce..fbfd79b501 100644 --- a/interface/web/mail/lib/lang/ar_mail_alias.lng +++ b/interface/web/mail/lib/lang/ar_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Email address is invalid.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.'; +$wb['destination_error_isemail'] = 'Destination Email Address is invalid.'; $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.'; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address'; $wb['domain_txt'] = 'Domain'; diff --git a/interface/web/mail/lib/lang/ar_mail_forward.lng b/interface/web/mail/lib/lang/ar_mail_forward.lng index 4291bd415c..29d0d91a57 100644 --- a/interface/web/mail/lib/lang/ar_mail_forward.lng +++ b/interface/web/mail/lib/lang/ar_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; diff --git a/interface/web/mail/lib/lang/ar_mail_transport.lng b/interface/web/mail/lib/lang/ar_mail_transport.lng index c249863469..16c33c0201 100644 --- a/interface/web/mail/lib/lang/ar_mail_transport.lng +++ b/interface/web/mail/lib/lang/ar_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sort by'; $wb['active_txt'] = 'Active'; $wb['limit_mailrouting_txt'] = 'The max. number of routes for your account is reached.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/bg_mail_alias.lng b/interface/web/mail/lib/lang/bg_mail_alias.lng index 98921ce7ce..fbfd79b501 100644 --- a/interface/web/mail/lib/lang/bg_mail_alias.lng +++ b/interface/web/mail/lib/lang/bg_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Email address is invalid.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.'; +$wb['destination_error_isemail'] = 'Destination Email Address is invalid.'; $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.'; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address'; $wb['domain_txt'] = 'Domain'; diff --git a/interface/web/mail/lib/lang/bg_mail_forward.lng b/interface/web/mail/lib/lang/bg_mail_forward.lng index 1e12ca1ece..10193da740 100644 --- a/interface/web/mail/lib/lang/bg_mail_forward.lng +++ b/interface/web/mail/lib/lang/bg_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; diff --git a/interface/web/mail/lib/lang/bg_mail_transport.lng b/interface/web/mail/lib/lang/bg_mail_transport.lng index 57394dc218..0f4a8db0b8 100644 --- a/interface/web/mail/lib/lang/bg_mail_transport.lng +++ b/interface/web/mail/lib/lang/bg_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Сортирай по'; $wb['active_txt'] = 'Активен'; $wb['limit_mailrouting_txt'] = 'The max. number of routes for your account is reached.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/br_mail_transport.lng b/interface/web/mail/lib/lang/br_mail_transport.lng index 3f87343dbc..afe35c1a7e 100644 --- a/interface/web/mail/lib/lang/br_mail_transport.lng +++ b/interface/web/mail/lib/lang/br_mail_transport.lng @@ -8,3 +8,4 @@ $wb['sort_order_txt'] = 'Ordenar por'; $wb['active_txt'] = 'Ativo'; $wb['limit_mailrouting_txt'] = 'O limite de rotas de email para esta conta foi alcançado.'; $wb['transport_txt'] = 'Transporte'; +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ca_mail_transport.lng b/interface/web/mail/lib/lang/ca_mail_transport.lng index f8a5536560..7b12c7d0eb 100644 --- a/interface/web/mail/lib/lang/ca_mail_transport.lng +++ b/interface/web/mail/lib/lang/ca_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Trier par'; $wb['active_txt'] = 'Actif'; $wb['limit_mailrouting_txt'] = 'Le nombre maximal de routes pour votre compte a été atteint.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/cz_mail_transport.lng b/interface/web/mail/lib/lang/cz_mail_transport.lng index 14c7dc2934..d2dfec591f 100644 --- a/interface/web/mail/lib/lang/cz_mail_transport.lng +++ b/interface/web/mail/lib/lang/cz_mail_transport.lng @@ -8,3 +8,4 @@ $wb['sort_order_txt'] = 'Třídit podle'; $wb['active_txt'] = 'Aktivní'; $wb['limit_mailrouting_txt'] = 'Byl dosažen maximální počet e-mail směrování pro Váš účet.'; $wb['transport_txt'] = 'Transport'; +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/de_mail_transport.lng b/interface/web/mail/lib/lang/de_mail_transport.lng index 873036f947..724882866f 100644 --- a/interface/web/mail/lib/lang/de_mail_transport.lng +++ b/interface/web/mail/lib/lang/de_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortiert nach'; $wb['active_txt'] = 'Aktiv'; $wb['limit_mailrouting_txt'] = 'Die maximale Anzahl an E-Mail Routen für Ihr Konto wurde erreicht.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/dk_mail_transport.lng b/interface/web/mail/lib/lang/dk_mail_transport.lng index df2131cde4..bb8a94f433 100644 --- a/interface/web/mail/lib/lang/dk_mail_transport.lng +++ b/interface/web/mail/lib/lang/dk_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sort by'; $wb['active_txt'] = 'Aktiv'; $wb['limit_mailrouting_txt'] = 'Max. antal af ruter for din konto er nået.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/el_mail_transport.lng b/interface/web/mail/lib/lang/el_mail_transport.lng index 1b1a5c7ab4..37eef348b6 100644 --- a/interface/web/mail/lib/lang/el_mail_transport.lng +++ b/interface/web/mail/lib/lang/el_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Ταξινόμηση κατά'; $wb['active_txt'] = 'Ενεργό'; $wb['limit_mailrouting_txt'] = 'Το μέγιστο πλήθος των δρομολογήσεων email για τον λογαριασμό σας, εξαντλήθηκε.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/en_mail_alias.lng b/interface/web/mail/lib/lang/en_mail_alias.lng index 23c567125d..84770e4c7e 100644 --- a/interface/web/mail/lib/lang/en_mail_alias.lng +++ b/interface/web/mail/lib/lang/en_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destination'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Email address is invalid.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['no_domain_perm'] = 'You have no permission for this domain.'; -$wb['destination_error_isemail'] = 'Destination Emailaddress is invalid.'; +$wb['destination_error_isemail'] = 'Destination Email Address is invalid.'; $wb['limit_mailalias_txt'] = 'The max. number of email aliases for your account is reached.'; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address.'; $wb['domain_txt'] = 'Domain'; diff --git a/interface/web/mail/lib/lang/en_mail_forward.lng b/interface/web/mail/lib/lang/en_mail_forward.lng index 6be6ab7e70..65b2b753d9 100644 --- a/interface/web/mail/lib/lang/en_mail_forward.lng +++ b/interface/web/mail/lib/lang/en_mail_forward.lng @@ -9,7 +9,7 @@ $wb['source_txt'] = 'Source Email'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['email_error_unique'] = 'Duplicate Emailaddress.'; +$wb['email_error_unique'] = 'Duplicate Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; $wb['greylisting_txt'] = 'Enable greylisting'; diff --git a/interface/web/mail/lib/lang/en_mail_transport.lng b/interface/web/mail/lib/lang/en_mail_transport.lng index a0b3dd808b..16c33c0201 100644 --- a/interface/web/mail/lib/lang/en_mail_transport.lng +++ b/interface/web/mail/lib/lang/en_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sort by'; $wb['active_txt'] = 'Active'; $wb['limit_mailrouting_txt'] = 'The max. number of routes for your account is reached.'; $wb['transport_txt'] = 'Transport'; -?> \ No newline at end of file +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/es_mail_transport.lng b/interface/web/mail/lib/lang/es_mail_transport.lng index b35ee39188..e0b3b4ad81 100644 --- a/interface/web/mail/lib/lang/es_mail_transport.lng +++ b/interface/web/mail/lib/lang/es_mail_transport.lng @@ -8,4 +8,4 @@ $wb['server_id_txt'] = 'Servidor'; $wb['sort_order_txt'] = 'Ordenar por'; $wb['transport_txt'] = 'Transporte'; $wb['type_txt'] = 'Tipo'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/fi_mail_transport.lng b/interface/web/mail/lib/lang/fi_mail_transport.lng index 01be49e44a..24675e457f 100644 --- a/interface/web/mail/lib/lang/fi_mail_transport.lng +++ b/interface/web/mail/lib/lang/fi_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Järjestä..'; $wb['active_txt'] = 'Käytössä'; $wb['limit_mailrouting_txt'] = 'Käyttäjätunnuksella on jo sallittu määrä sähköpostireitityksiä.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/fr_mail_transport.lng b/interface/web/mail/lib/lang/fr_mail_transport.lng index f8a5536560..7b12c7d0eb 100644 --- a/interface/web/mail/lib/lang/fr_mail_transport.lng +++ b/interface/web/mail/lib/lang/fr_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Trier par'; $wb['active_txt'] = 'Actif'; $wb['limit_mailrouting_txt'] = 'Le nombre maximal de routes pour votre compte a été atteint.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/hr_mail_transport.lng b/interface/web/mail/lib/lang/hr_mail_transport.lng index c27687f956..923ac09d52 100644 --- a/interface/web/mail/lib/lang/hr_mail_transport.lng +++ b/interface/web/mail/lib/lang/hr_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortiraj'; $wb['active_txt'] = 'Aktivno'; $wb['limit_mailrouting_txt'] = 'Iskorišten je maksimalan broj ruta.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/hu_mail_transport.lng b/interface/web/mail/lib/lang/hu_mail_transport.lng index 7ade063c2b..08e8300e2e 100644 --- a/interface/web/mail/lib/lang/hu_mail_transport.lng +++ b/interface/web/mail/lib/lang/hu_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Rendezés'; $wb['active_txt'] = 'Aktív'; $wb['limit_mailrouting_txt'] = 'Nincs több Email irányítás lehetőség.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/id_mail_transport.lng b/interface/web/mail/lib/lang/id_mail_transport.lng index 8ad3dacf2a..818f6f7280 100644 --- a/interface/web/mail/lib/lang/id_mail_transport.lng +++ b/interface/web/mail/lib/lang/id_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Urutkan berdasarkan'; $wb['active_txt'] = 'Aktif'; $wb['limit_mailrouting_txt'] = 'Jumlah maks rute untuk akun Anda telah tercapai.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/it_mail_transport.lng b/interface/web/mail/lib/lang/it_mail_transport.lng index 9273621ff1..fbd1a58087 100644 --- a/interface/web/mail/lib/lang/it_mail_transport.lng +++ b/interface/web/mail/lib/lang/it_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Ordina per'; $wb['active_txt'] = 'Attivo'; $wb['limit_mailrouting_txt'] = 'The max. number of routes raggiunto per il tuo account.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ja_mail_transport.lng b/interface/web/mail/lib/lang/ja_mail_transport.lng index a870dd118a..afccb01956 100644 --- a/interface/web/mail/lib/lang/ja_mail_transport.lng +++ b/interface/web/mail/lib/lang/ja_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = '優先度'; $wb['active_txt'] = '有効'; $wb['limit_mailrouting_txt'] = '最大数に達した為、これ以上配送経路を追加できません。'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/nl_mail_transport.lng b/interface/web/mail/lib/lang/nl_mail_transport.lng index 9e792e8762..d7ecc761e6 100644 --- a/interface/web/mail/lib/lang/nl_mail_transport.lng +++ b/interface/web/mail/lib/lang/nl_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Gesorteerd op'; $wb['active_txt'] = 'Actief'; $wb['limit_mailrouting_txt'] = 'Het max. aantal routes voor uw account is bereikt.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/pl_mail_transport.lng b/interface/web/mail/lib/lang/pl_mail_transport.lng index 514fc263a5..672a0c6455 100644 --- a/interface/web/mail/lib/lang/pl_mail_transport.lng +++ b/interface/web/mail/lib/lang/pl_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortuj według'; $wb['active_txt'] = 'Aktywny'; $wb['limit_mailrouting_txt'] = 'Maksymalna ilość ścieżek dla Twojego konta została przekroczona.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/pt_mail_transport.lng b/interface/web/mail/lib/lang/pt_mail_transport.lng index 3c676b8b4a..e41c129ac6 100644 --- a/interface/web/mail/lib/lang/pt_mail_transport.lng +++ b/interface/web/mail/lib/lang/pt_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Ordenar por'; $wb['active_txt'] = 'Activo'; $wb['limit_mailrouting_txt'] = 'O número máximo de rotas para a conta foi atingido.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ro_mail_alias.lng b/interface/web/mail/lib/lang/ro_mail_alias.lng index 65b9abbd52..389e96cb4c 100644 --- a/interface/web/mail/lib/lang/ro_mail_alias.lng +++ b/interface/web/mail/lib/lang/ro_mail_alias.lng @@ -3,9 +3,9 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destinatie'; $wb['active_txt'] = 'Active'; $wb['email_error_isemail'] = 'Adresa Email invlida'; -$wb['email_error_unique'] = 'Duplicat Emailaddress.'; +$wb['email_error_unique'] = 'Duplicat Email Address.'; $wb['no_domain_perm'] = 'NU aveti permisiunea pe acest Domain'; -$wb['destination_error_isemail'] = 'Destinatie Emailaddress invalida.'; +$wb['destination_error_isemail'] = 'Destinatie Email Address invalida.'; $wb['limit_mailalias_txt'] = 'Ati atins numarul maxim de alias-uri pentru contul dumneavoastra '; $wb['duplicate_mailbox_txt'] = 'There is already a mailbox with this email address'; $wb['domain_txt'] = 'Domain'; diff --git a/interface/web/mail/lib/lang/ro_mail_forward.lng b/interface/web/mail/lib/lang/ro_mail_forward.lng index 3103f26dc8..8d60b16de9 100644 --- a/interface/web/mail/lib/lang/ro_mail_forward.lng +++ b/interface/web/mail/lib/lang/ro_mail_forward.lng @@ -10,6 +10,6 @@ $wb['greylisting_txt'] = 'Enable greylisting'; $wb['destination_error_empty'] = 'The destination must not be empty.'; $wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; $wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['email_error_unique'] = 'Duplicat Emailaddress.'; +$wb['email_error_unique'] = 'Duplicat Email Address.'; $wb['send_as_txt'] = 'Send as'; $wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; diff --git a/interface/web/mail/lib/lang/ro_mail_transport.lng b/interface/web/mail/lib/lang/ro_mail_transport.lng index 85fd99ad54..736452a6c9 100644 --- a/interface/web/mail/lib/lang/ro_mail_transport.lng +++ b/interface/web/mail/lib/lang/ro_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortare pe '; $wb['active_txt'] = 'Active'; $wb['limit_mailrouting_txt'] = 'numarul maxim de rute pentru contul dumneavoastra a fost atins'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/ru_mail_transport.lng b/interface/web/mail/lib/lang/ru_mail_transport.lng index 05594256fd..2c6d758d9b 100644 --- a/interface/web/mail/lib/lang/ru_mail_transport.lng +++ b/interface/web/mail/lib/lang/ru_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Сортировать по'; $wb['active_txt'] = 'Активно'; $wb['limit_mailrouting_txt'] = 'Достигнуто макс. количество маршрутов для вашей учетной записи.'; $wb['transport_txt'] = 'Транспорт'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/se_mail_transport.lng b/interface/web/mail/lib/lang/se_mail_transport.lng index 70e26b78f9..73ac507b47 100644 --- a/interface/web/mail/lib/lang/se_mail_transport.lng +++ b/interface/web/mail/lib/lang/se_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sortera på'; $wb['active_txt'] = 'Aktiv'; $wb['limit_mailrouting_txt'] = 'Det maximala antalet epostrutter för ditt konto är uppnått.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/sk_mail_transport.lng b/interface/web/mail/lib/lang/sk_mail_transport.lng index b27c585b04..e35f9d77b2 100644 --- a/interface/web/mail/lib/lang/sk_mail_transport.lng +++ b/interface/web/mail/lib/lang/sk_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Triediť podľa'; $wb['active_txt'] = 'Aktívny'; $wb['limit_mailrouting_txt'] = 'Max. počet trás pre váš účet je dosiahnutý.'; $wb['transport_txt'] = 'Transport'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; diff --git a/interface/web/mail/lib/lang/tr_mail_transport.lng b/interface/web/mail/lib/lang/tr_mail_transport.lng index 0b41770392..bc318545a9 100644 --- a/interface/web/mail/lib/lang/tr_mail_transport.lng +++ b/interface/web/mail/lib/lang/tr_mail_transport.lng @@ -8,4 +8,4 @@ $wb['sort_order_txt'] = 'Sıralama'; $wb['active_txt'] = 'Etkin'; $wb['limit_mailrouting_txt'] = 'Hesabınıza ekleyebileceğiniz en fazla yöneltme sayısına ulaştınız.'; $wb['transport_txt'] = 'Aktarım'; -?> +$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; -- GitLab From f7a8707f5fa1ebc806c49a2e33dbc2ccc8456797 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 7 Sep 2021 13:41:27 -0600 Subject: [PATCH 1241/1368] rename upd_0094.php patch file to upd_dev_collection.php --- install/patches/{upd_0094.php => upd_dev_collection.php} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename install/patches/{upd_0094.php => upd_dev_collection.php} (100%) diff --git a/install/patches/upd_0094.php b/install/patches/upd_dev_collection.php similarity index 100% rename from install/patches/upd_0094.php rename to install/patches/upd_dev_collection.php -- GitLab From dc98d05dcba8abd691090550dc182fd3b8f1d673 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 7 Sep 2021 16:23:59 -0600 Subject: [PATCH 1242/1368] check server_id set in tform, not $conf --- interface/lib/classes/validate_mail_transport.inc.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/interface/lib/classes/validate_mail_transport.inc.php b/interface/lib/classes/validate_mail_transport.inc.php index eaf4b92a72..6b47d95303 100644 --- a/interface/lib/classes/validate_mail_transport.inc.php +++ b/interface/lib/classes/validate_mail_transport.inc.php @@ -45,8 +45,6 @@ class validate_mail_transport { function validate_domain($field_name, $field_value, $validator) { global $app, $conf; - if(empty($field_value) || $field_name != 'domain') return; - if(isset($app->remoting_lib->primary_id)) { $id = $app->remoting_lib->primary_id; } else { @@ -55,7 +53,7 @@ class validate_mail_transport { // mail_transport.domain (could also be an email address) must be unique per server $sql = "SELECT transport_id, domain FROM mail_transport WHERE domain = ? AND server_id = ? AND transport_id != ?"; - $domain_check = $app->db->queryOneRecord($sql, $field_value, $conf['server_id'], $id); + $domain_check = $app->db->queryOneRecord($sql, $field_value, $app->tform_actions->dataRecord['server_id'], $id); if($domain_check) return $this->get_error('domain_error_unique'); } -- GitLab From e7fe31a7951d796654cf03374538a2d2153fd5b1 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 8 Sep 2021 08:17:44 +0000 Subject: [PATCH 1243/1368] Revert unique forward --- install/patches/upd_0094.php | 3 ++- install/sql/incremental/upd_dev_collection.sql | 2 +- install/sql/ispconfig3.sql | 2 +- interface/web/mail/form/mail_alias.tform.php | 2 -- interface/web/mail/form/mail_forward.tform.php | 2 -- 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/install/patches/upd_0094.php b/install/patches/upd_0094.php index b9516e232e..bfb363b74f 100644 --- a/install/patches/upd_0094.php +++ b/install/patches/upd_0094.php @@ -2,7 +2,7 @@ if(!defined('INSTALLER_RUN')) die('Patch update file access violation.'); -class upd_0094 extends installer_patch_update { +/*class upd_0094 extends installer_patch_update { public function onBeforeSQL() { global $inst; @@ -12,3 +12,4 @@ class upd_0094 extends installer_patch_update { } } +*/ \ No newline at end of file diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 2400ca907a..4cd5f31dfb 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -7,7 +7,7 @@ ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; -- mail_forwarding.source must be unique ALTER TABLE `mail_forwarding` DROP KEY `server_id`; -ALTER TABLE `mail_forwarding` ADD UNIQUE KEY `server_id` (`server_id`, `source`); +ALTER TABLE `mail_forwarding` ADD KEY `server_id` (`server_id`, `source`); -- Purge apps & addons installer (#5795) - second time due to syntax error in 0093 DROP TABLE IF EXISTS `software_package`; diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index e37bef7f28..11ff65ed1b 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -918,7 +918,7 @@ CREATE TABLE `mail_forwarding` ( `allow_send_as` ENUM('n','y') NOT NULL DEFAULT 'n', `greylisting` enum('n','y' ) NOT NULL DEFAULT 'n', PRIMARY KEY (`forwarding_id`), - UNIQUE KEY `server_id` (`server_id`, `source`), + KEY `server_id` (`server_id`, `source`), KEY `type` (`type`) ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; diff --git a/interface/web/mail/form/mail_alias.tform.php b/interface/web/mail/form/mail_alias.tform.php index 39b485c7a5..9434ba3eec 100644 --- a/interface/web/mail/form/mail_alias.tform.php +++ b/interface/web/mail/form/mail_alias.tform.php @@ -83,8 +83,6 @@ $form["tabs"]['alias'] = array ( ), 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'email_error_isemail'), - 1 => array ( 'type' => 'UNIQUE', - 'errmsg'=> 'email_error_unique'), ), 'default' => '', 'value' => '', diff --git a/interface/web/mail/form/mail_forward.tform.php b/interface/web/mail/form/mail_forward.tform.php index db940f035e..003e678455 100644 --- a/interface/web/mail/form/mail_forward.tform.php +++ b/interface/web/mail/form/mail_forward.tform.php @@ -83,8 +83,6 @@ $form["tabs"]['forward'] = array ( ), 'validators' => array ( 0 => array ( 'type' => 'ISEMAIL', 'errmsg'=> 'email_error_isemail'), - 1 => array ( 'type' => 'UNIQUE', - 'errmsg'=> 'email_error_unique'), ), 'default' => '', 'value' => '', -- GitLab From a0cf4fae5acb124ab45aae7bb9fe58ae6dc899cd Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 8 Sep 2021 08:20:18 +0000 Subject: [PATCH 1244/1368] Update upd_0094.php --- install/patches/upd_0094.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/install/patches/upd_0094.php b/install/patches/upd_0094.php index bfb363b74f..e05f85b7bc 100644 --- a/install/patches/upd_0094.php +++ b/install/patches/upd_0094.php @@ -2,14 +2,13 @@ if(!defined('INSTALLER_RUN')) die('Patch update file access violation.'); -/*class upd_0094 extends installer_patch_update { +class upd_0094 extends installer_patch_update { public function onBeforeSQL() { global $inst; // Remove any duplicate mail_forwardings prior to adding unique key - $inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id IN (SELECT forwarding_id FROM (SELECT forwarding_id, COUNT(source) AS source_count FROM mail_forwarding GROUP BY source HAVING source_count > 1) as t1)"); + //$inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id IN (SELECT forwarding_id FROM (SELECT forwarding_id, COUNT(source) AS source_count FROM mail_forwarding GROUP BY source HAVING source_count > 1) as t1)"); } } -*/ \ No newline at end of file -- GitLab From 78b85af4b1fc799b0a96ee191e82e563750c4f85 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 8 Sep 2021 09:56:59 +0000 Subject: [PATCH 1245/1368] Apply 1 suggestion(s) to 1 file(s) --- install/sql/incremental/upd_dev_collection.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 72f0f03761..2206658555 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -7,7 +7,7 @@ ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; -- mail_forwarding.source must be unique ALTER TABLE `mail_forwarding` DROP KEY `server_id`; -ALTER TABLE `mail_forwarding` ADD UNIQUE KEY `server_id` (`server_id`, `source`); +ALTER TABLE `mail_forwarding` ADD KEY `server_id` (`server_id`, `source`); -- Purge apps & addons installer (#5795) - second time due to syntax error in 0093 DROP TABLE IF EXISTS `software_package`; -- GitLab From f8cd496afbe1ea03fbd8664da29ab928939eb417 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 8 Sep 2021 09:57:46 +0000 Subject: [PATCH 1246/1368] Apply 1 suggestion(s) to 1 file(s) --- install/patches/upd_dev_collection.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/patches/upd_dev_collection.php b/install/patches/upd_dev_collection.php index 5531e88fa9..304828931e 100644 --- a/install/patches/upd_dev_collection.php +++ b/install/patches/upd_dev_collection.php @@ -8,7 +8,7 @@ class upd_0094 extends installer_patch_update { global $inst; // Remove any duplicate mail_forwardings prior to adding unique key - $inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id NOT IN (SELECT MIN(forwarding_id) FROM mail_forwarding GROUP BY source)"); + //$inst->db->query("DELETE FROM mail_forwarding WHERE forwarding_id NOT IN (SELECT MIN(forwarding_id) FROM mail_forwarding GROUP BY source)"); // Remove any duplicate mail_transports prior to adding unique key $inst->db->query("DELETE FROM mail_transport WHERE transport_id NOT IN (SELECT MIN(transport_id) FROM mail_transport GROUP BY domain, server_id)"); -- GitLab From be46cb1959683ce3650beb4232d03fe0e8b101e4 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 8 Sep 2021 13:20:04 +0200 Subject: [PATCH 1247/1368] - pre-release update files --- helper_scripts/cert_check.sh | 66 +++++++++++++++++++ .../{upd_dev_collection.php => upd_0094.php} | 0 install/sql/incremental/upd_0094.sql | 20 ++++++ .../sql/incremental/upd_dev_collection.sql | 20 ------ 4 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 helper_scripts/cert_check.sh rename install/patches/{upd_dev_collection.php => upd_0094.php} (100%) create mode 100644 install/sql/incremental/upd_0094.sql diff --git a/helper_scripts/cert_check.sh b/helper_scripts/cert_check.sh new file mode 100644 index 0000000000..148ab59f7a --- /dev/null +++ b/helper_scripts/cert_check.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +chkdata() { + F=$1 + CRT=$2 + KEY=$3 + if [[ "$CRT" != "" && "$KEY" != "" ]] ; then + if [[ ! -f "$CRT" ]] ; then + echo "[WARN] CERTIFICATE FILE ${CRT} MISSING FOR ${F}" ; + else + echo -n "Checking ${CRT}" ; + CHK=$(openssl x509 -in "${CRT}" -text -noout >/dev/null 2>&1 ; echo $?); + if [[ $CHK -ne 0 ]] ; then + echo " FAILED!" ; + else + echo " OK" ; + fi + fi + if [[ ! -f "$KEY" ]] ; then + echo "[WARN] KEY FILE ${KEY} MISSING FOR ${F}" ; + else + echo -n "Checking ${KEY}" ; + CHK=$(openssl rsa -in "${KEY}" -check -noout >/dev/null 2>&1 ; echo $?); + if [[ $CHK -ne 0 ]] ; then + echo " FAILED!" ; + else + echo " OK" ; + fi + fi + + if [[ -f "$CRT" && -f "$KEY" ]] ; then + echo -n "Checking that key and certificate match"; + MDCRT=$(openssl x509 -noout -modulus -in "${CRT}" | openssl md5) ; + MDKEY=$(openssl rsa -noout -modulus -in "${KEY}" | openssl md5) ; + if [[ "$MDCRT" != "$MDKEY" ]] ; then + echo " FAILED!" ; + else + echo " OK" ; + fi + fi + echo "---" ; + elif [[ "$CRT" != "" || "$KEY" != "" ]] ; then + echo "[WARN] Check SSL config of ${F}"; + echo "---" ; + fi +} + +if [[ -d /etc/apache2/sites-enabled ]] ; then + echo "Checking enabled apache vhosts" ; + for FIL in /etc/apache2/sites-enabled/* ; do + CRT=$(grep 'SSLCertificateFile' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + KEY=$(grep 'SSLCertificateKeyFile' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + chkdata "$FIL" "$CRT" "$KEY" ; + done +fi + +if [[ -d /etc/nginx/sites-enabled ]] ; then + echo "Checking enabled nginx vhosts" ; + for FIL in /etc/nginx/sites-enabled/* ; do + CRT=$(grep 'ssl_certificate' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + CRT=${CRT%;} + KEY=$(grep 'ssl_certificate_key' "${FIL}" | grep -E -v '^[[:space:]]*#' | awk '{print $2}' | head -n 1) ; + KEY=${KEY%;} + chkdata "$FIL" "$CRT" "$KEY" ; + done +fi \ No newline at end of file diff --git a/install/patches/upd_dev_collection.php b/install/patches/upd_0094.php similarity index 100% rename from install/patches/upd_dev_collection.php rename to install/patches/upd_0094.php diff --git a/install/sql/incremental/upd_0094.sql b/install/sql/incremental/upd_0094.sql new file mode 100644 index 0000000000..2206658555 --- /dev/null +++ b/install/sql/incremental/upd_0094.sql @@ -0,0 +1,20 @@ +-- Add column for email backup limit (#5732) +ALTER TABLE `client_template` ADD `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y' AFTER `limit_spamfilter_policy`; +ALTER TABLE `client` ADD `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y' AFTER `limit_spamfilter_policy`; + +-- default spamfilter_users.policy_id to 0 +ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; + +-- mail_forwarding.source must be unique +ALTER TABLE `mail_forwarding` DROP KEY `server_id`; +ALTER TABLE `mail_forwarding` ADD KEY `server_id` (`server_id`, `source`); + +-- Purge apps & addons installer (#5795) - second time due to syntax error in 0093 +DROP TABLE IF EXISTS `software_package`; +DROP TABLE IF EXISTS `software_repo`; +DROP TABLE IF EXISTS `software_update`; +DROP TABLE IF EXISTS `software_update_inst`; + +-- mail_transport.domain must be unique +ALTER TABLE `mail_transport` DROP KEY `server_id_2`; +ALTER TABLE `mail_transport` ADD UNIQUE KEY `server_id_2` (`server_id`, `domain`); diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 2206658555..e69de29bb2 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -1,20 +0,0 @@ --- Add column for email backup limit (#5732) -ALTER TABLE `client_template` ADD `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y' AFTER `limit_spamfilter_policy`; -ALTER TABLE `client` ADD `limit_mail_backup` ENUM( 'n', 'y' ) NOT NULL DEFAULT 'y' AFTER `limit_spamfilter_policy`; - --- default spamfilter_users.policy_id to 0 -ALTER TABLE `spamfilter_users` ALTER `policy_id` SET DEFAULT 0; - --- mail_forwarding.source must be unique -ALTER TABLE `mail_forwarding` DROP KEY `server_id`; -ALTER TABLE `mail_forwarding` ADD KEY `server_id` (`server_id`, `source`); - --- Purge apps & addons installer (#5795) - second time due to syntax error in 0093 -DROP TABLE IF EXISTS `software_package`; -DROP TABLE IF EXISTS `software_repo`; -DROP TABLE IF EXISTS `software_update`; -DROP TABLE IF EXISTS `software_update_inst`; - --- mail_transport.domain must be unique -ALTER TABLE `mail_transport` DROP KEY `server_id_2`; -ALTER TABLE `mail_transport` ADD UNIQUE KEY `server_id_2` (`server_id`, `domain`); -- GitLab From ac7b645dd4108f0007be71e9ad33e56c3dd6d99f Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 9 Sep 2021 16:57:58 -0600 Subject: [PATCH 1248/1368] add array_column function if not exists --- server/plugins-available/webserver_plugin.inc.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php index 7d307233d8..bb884a6e2b 100644 --- a/server/plugins-available/webserver_plugin.inc.php +++ b/server/plugins-available/webserver_plugin.inc.php @@ -28,6 +28,13 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +/* compatibility for php < 5.5 (centos 7), remove when no longer needed */ +if(!function_exists("array_column")){ + function array_column($array,$column_name){ + return array_map(function($element) use($column_name){return $element[$column_name];}, $array); + } +} + class webserver_plugin { var $plugin_name = 'webserver_plugin'; -- GitLab From d72cc1665092384b75a4d5a87f00430eaae0bd7a Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 26 Aug 2021 17:22:17 -0600 Subject: [PATCH 1249/1368] mail: mail_relay_domain table for relay domains --- .../sql/incremental/upd_dev_collection.sql | 18 +++ install/sql/ispconfig3.sql | 21 +++ .../tpl/mysql-virtual_relaydomains.cf.master | 2 +- interface/lib/lang/ar.lng | 2 +- interface/lib/lang/bg.lng | 2 +- interface/lib/lang/br.lng | 1 + interface/lib/lang/ca.lng | 2 +- interface/lib/lang/cz.lng | 1 + interface/lib/lang/de.lng | 2 +- interface/lib/lang/dk.lng | 2 +- interface/lib/lang/el.lng | 2 +- interface/lib/lang/en.lng | 2 +- interface/lib/lang/es.lng | 2 +- interface/lib/lang/fi.lng | 2 +- interface/lib/lang/fr.lng | 2 +- interface/lib/lang/hr.lng | 2 +- interface/lib/lang/hu.lng | 2 +- interface/lib/lang/id.lng | 2 +- interface/lib/lang/it.lng | 2 +- interface/lib/lang/ja.lng | 2 +- interface/lib/lang/nl.lng | 2 +- interface/lib/lang/pl.lng | 2 +- interface/lib/lang/pt.lng | 2 +- interface/lib/lang/ro.lng | 2 +- interface/lib/lang/ru.lng | 2 +- interface/lib/lang/se.lng | 2 +- interface/lib/lang/sk.lng | 2 +- interface/lib/lang/tr.lng | 2 +- .../web/mail/form/mail_relay_domain.tform.php | 149 ++++++++++++++++++ .../mail/lib/lang/ar_mail_relay_domain.lng | 6 + .../lib/lang/ar_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/bg_mail_relay_domain.lng | 6 + .../lib/lang/bg_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/br_mail_relay_domain.lng | 6 + .../lib/lang/br_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/ca_mail_relay_domain.lng | 6 + .../lib/lang/ca_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/cz_mail_relay_domain.lng | 6 + .../lib/lang/cz_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/de_mail_relay_domain.lng | 6 + .../lib/lang/de_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/dk_mail_relay_domain.lng | 6 + .../lib/lang/dk_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/el_mail_relay_domain.lng | 6 + .../lib/lang/el_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/en_mail_relay_domain.lng | 6 + .../lib/lang/en_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/es_mail_relay_domain.lng | 6 + .../lib/lang/es_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/fi_mail_relay_domain.lng | 6 + .../lib/lang/fi_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/fr_mail_relay_domain.lng | 6 + .../lib/lang/fr_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/hr_mail_relay_domain.lng | 6 + .../lib/lang/hr_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/hu_mail_relay_domain.lng | 6 + .../lib/lang/hu_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/id_mail_relay_domain.lng | 6 + .../lib/lang/id_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/it_mail_relay_domain.lng | 6 + .../lib/lang/it_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/ja_mail_relay_domain.lng | 6 + .../lib/lang/ja_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/nl_mail_relay_domain.lng | 6 + .../lib/lang/nl_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/pl_mail_relay_domain.lng | 6 + .../lib/lang/pl_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/pt_mail_relay_domain.lng | 6 + .../lib/lang/pt_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/ro_mail_relay_domain.lng | 6 + .../lib/lang/ro_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/ru_mail_relay_domain.lng | 6 + .../lib/lang/ru_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/se_mail_relay_domain.lng | 6 + .../lib/lang/se_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/sk_mail_relay_domain.lng | 6 + .../lib/lang/sk_mail_relay_domain_list.lng | 7 + .../mail/lib/lang/tr_mail_relay_domain.lng | 6 + .../lib/lang/tr_mail_relay_domain_list.lng | 7 + interface/web/mail/lib/module.conf.php | 18 ++- .../web/mail/list/mail_relay_domain.list.php | 111 +++++++++++++ interface/web/mail/mail_relay_domain_del.php | 50 ++++++ interface/web/mail/mail_relay_domain_edit.php | 78 +++++++++ interface/web/mail/mail_relay_domain_list.php | 51 ++++++ .../mail/templates/mail_relay_domain_edit.htm | 26 +++ .../mail/templates/mail_relay_domain_list.htm | 68 ++++++++ 86 files changed, 938 insertions(+), 27 deletions(-) create mode 100644 interface/web/mail/form/mail_relay_domain.tform.php create mode 100644 interface/web/mail/lib/lang/ar_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/ar_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/bg_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/bg_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/br_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/br_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/ca_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/ca_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/cz_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/cz_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/de_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/de_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/dk_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/dk_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/el_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/el_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/en_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/en_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/es_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/es_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/fi_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/fi_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/fr_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/fr_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/hr_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/hr_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/hu_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/hu_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/id_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/id_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/it_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/it_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/ja_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/ja_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/nl_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/nl_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/pl_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/pl_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/pt_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/pt_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/ro_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/ro_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/ru_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/ru_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/se_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/se_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/sk_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/sk_mail_relay_domain_list.lng create mode 100644 interface/web/mail/lib/lang/tr_mail_relay_domain.lng create mode 100644 interface/web/mail/lib/lang/tr_mail_relay_domain_list.lng create mode 100644 interface/web/mail/list/mail_relay_domain.list.php create mode 100644 interface/web/mail/mail_relay_domain_del.php create mode 100644 interface/web/mail/mail_relay_domain_edit.php create mode 100644 interface/web/mail/mail_relay_domain_list.php create mode 100644 interface/web/mail/templates/mail_relay_domain_edit.htm create mode 100644 interface/web/mail/templates/mail_relay_domain_list.htm diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e69de29bb2..b7df9f50d1 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -0,0 +1,18 @@ +-- create mail_relay_domain and load with current domains from mail_transport table +CREATE TABLE IF NOT EXISTS `mail_relay_domain` ( + `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT, + `sys_userid` int(11) NOT NULL DEFAULT '0', + `sys_groupid` int(11) NOT NULL DEFAULT '0', + `sys_perm_user` varchar(5) DEFAULT NULL, + `sys_perm_group` varchar(5) DEFAULT NULL, + `sys_perm_other` varchar(5) DEFAULT NULL, + `server_id` int(11) NOT NULL DEFAULT '0', + `domain` varchar(255) DEFAULT NULL, + `access` varchar(255) NOT NULL DEFAULT 'OK', + `active` varchar(255) NOT NULL DEFAULT 'y', + PRIMARY KEY (`relay_domain_id`), + UNIQUE KEY `domain` (`domain`, `server_id`) + ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +INSERT INTO `mail_relay_domain` SELECT NULL, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `domain`, 'OK', `active` FROM `mail_transport` WHERE `domain` NOT LIKE '%@%' AND `domain` LIKE '%.%' GROUP BY `domain`, `server_id`; + diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 51106cc183..cab6dd7b90 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -970,6 +970,27 @@ CREATE TABLE `mail_mailinglist` ( -- -------------------------------------------------------- +-- +-- Table structure for Table `mail_relay_domain` +-- + +CREATE TABLE IF NOT EXISTS `mail_relay_domain` ( + `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT, + `sys_userid` int(11) NOT NULL DEFAULT '0', + `sys_groupid` int(11) NOT NULL DEFAULT '0', + `sys_perm_user` varchar(5) DEFAULT NULL, + `sys_perm_group` varchar(5) DEFAULT NULL, + `sys_perm_other` varchar(5) DEFAULT NULL, + `server_id` int(11) NOT NULL DEFAULT '0', + `domain` varchar(255) DEFAULT NULL, + `access` varchar(255) NOT NULL DEFAULT 'OK', + `active` varchar(255) NOT NULL DEFAULT 'y', + PRIMARY KEY (`relay_domain_id`), + UNIQUE KEY `domain` (`domain`, `server_id`) +) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +-- -------------------------------------------------------- + -- -- Table structure for Table `mail_relay_recipient` -- diff --git a/install/tpl/mysql-virtual_relaydomains.cf.master b/install/tpl/mysql-virtual_relaydomains.cf.master index 5ce2db6954..c27596d1e7 100644 --- a/install/tpl/mysql-virtual_relaydomains.cf.master +++ b/install/tpl/mysql-virtual_relaydomains.cf.master @@ -2,4 +2,4 @@ user = {mysql_server_ispconfig_user} password = {mysql_server_ispconfig_password} dbname = {mysql_server_database} hosts = {mysql_server_ip} -query = select domain from mail_transport where domain = '%s' and active = 'y' and server_id = {server_id} +query = select domain from mail_relay_domain where domain = '%s' and active = 'y' and server_id = {server_id} diff --git a/interface/lib/lang/ar.lng b/interface/lib/lang/ar.lng index 2763f8e82b..c2bc19a6b9 100644 --- a/interface/lib/lang/ar.lng +++ b/interface/lib/lang/ar.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/bg.lng b/interface/lib/lang/bg.lng index 94dfaa8ad1..e0a0bfcdab 100644 --- a/interface/lib/lang/bg.lng +++ b/interface/lib/lang/bg.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Изтрий XMPP потребител'; $wb['unlimited_txt'] = 'Неограничен'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/br.lng b/interface/lib/lang/br.lng index e47df8250d..7e78ddaf36 100644 --- a/interface/lib/lang/br.lng +++ b/interface/lib/lang/br.lng @@ -172,3 +172,4 @@ $wb['select_master_directive_snippet_txt'] = 'Diretiva mestre de trechos de cód $wb['unlimited_txt'] = 'Ilimitado'; $wb['server_id_0_error_txt'] = 'Por favor, selecione um servidor válido. O ID do servidor deve ser > 0.'; $wb['datalog_changes_close_txt'] = 'Fechar'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ca.lng b/interface/lib/lang/ca.lng index c57185fd10..308aba545b 100644 --- a/interface/lib/lang/ca.lng +++ b/interface/lib/lang/ca.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Illimité'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/cz.lng b/interface/lib/lang/cz.lng index 04ad86178c..84ce72a4c0 100644 --- a/interface/lib/lang/cz.lng +++ b/interface/lib/lang/cz.lng @@ -172,3 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Smazat XMPP uživatele'; $wb['unlimited_txt'] = 'Neomezený'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/de.lng b/interface/lib/lang/de.lng index 11a5e21a5d..38e9c2b40c 100644 --- a/interface/lib/lang/de.lng +++ b/interface/lib/lang/de.lng @@ -172,4 +172,4 @@ $wb['select_master_directive_snippet_txt'] = 'Master Direktiven Schnipsel'; $wb['unlimited_txt'] = 'unlimitiert'; $wb['server_id_0_error_txt'] = 'Bitte Server auswählen. Server ID muss > als 0 sein.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/dk.lng b/interface/lib/lang/dk.lng index 9d09f1dc8d..de52b0e704 100644 --- a/interface/lib/lang/dk.lng +++ b/interface/lib/lang/dk.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Ubegrænset'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/el.lng b/interface/lib/lang/el.lng index 31829d5f93..42d991401d 100644 --- a/interface/lib/lang/el.lng +++ b/interface/lib/lang/el.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Απεριόριστα'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/en.lng b/interface/lib/lang/en.lng index dbffc95b8c..57c8d1f79f 100644 --- a/interface/lib/lang/en.lng +++ b/interface/lib/lang/en.lng @@ -173,4 +173,4 @@ $wb['select_master_directive_snippet_txt'] = 'Master Directive Snippets'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/es.lng b/interface/lib/lang/es.lng index 3a421e7af5..2d120a2b97 100644 --- a/interface/lib/lang/es.lng +++ b/interface/lib/lang/es.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Borrar usuario XMPP'; $wb['unlimited_txt'] = 'Ilimitado'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Cerrar'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/fi.lng b/interface/lib/lang/fi.lng index f6648e88c6..7974914e0e 100644 --- a/interface/lib/lang/fi.lng +++ b/interface/lib/lang/fi.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/fr.lng b/interface/lib/lang/fr.lng index 15e8294e0c..b4bb837e7d 100644 --- a/interface/lib/lang/fr.lng +++ b/interface/lib/lang/fr.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Illimité'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/hr.lng b/interface/lib/lang/hr.lng index fdb09cbff5..bef42f1814 100644 --- a/interface/lib/lang/hr.lng +++ b/interface/lib/lang/hr.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'neograničeno'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/hu.lng b/interface/lib/lang/hu.lng index 8e65d4c974..e3913462fe 100644 --- a/interface/lib/lang/hu.lng +++ b/interface/lib/lang/hu.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Korlátlan'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/id.lng b/interface/lib/lang/id.lng index 693ca49015..aea01a0614 100644 --- a/interface/lib/lang/id.lng +++ b/interface/lib/lang/id.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Tak terbatas'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/it.lng b/interface/lib/lang/it.lng index 1333cc907f..ff08d6f633 100644 --- a/interface/lib/lang/it.lng +++ b/interface/lib/lang/it.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Elimina utente XMPP'; $wb['unlimited_txt'] = 'illimitati'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Chiudi'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ja.lng b/interface/lib/lang/ja.lng index 2d24f9a1f7..7235de393e 100644 --- a/interface/lib/lang/ja.lng +++ b/interface/lib/lang/ja.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/nl.lng b/interface/lib/lang/nl.lng index 3af436ca48..54e7045e61 100644 --- a/interface/lib/lang/nl.lng +++ b/interface/lib/lang/nl.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Ongelimiteerd'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Sluiten'; -?> +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/pl.lng b/interface/lib/lang/pl.lng index 4a1cd0384e..ccd3347324 100644 --- a/interface/lib/lang/pl.lng +++ b/interface/lib/lang/pl.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'nielimitowane'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/pt.lng b/interface/lib/lang/pt.lng index 86d4442c42..e2dc2f72ac 100644 --- a/interface/lib/lang/pt.lng +++ b/interface/lib/lang/pt.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ro.lng b/interface/lib/lang/ro.lng index 4f032832eb..6a9f596a0b 100644 --- a/interface/lib/lang/ro.lng +++ b/interface/lib/lang/ro.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/ru.lng b/interface/lib/lang/ru.lng index 2d18c9f628..dca0c7a53e 100644 --- a/interface/lib/lang/ru.lng +++ b/interface/lib/lang/ru.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Удалить пользователя XMP $wb['unlimited_txt'] = 'Безлимитный'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/se.lng b/interface/lib/lang/se.lng index 5e8b3c7123..2d3c38fd38 100644 --- a/interface/lib/lang/se.lng +++ b/interface/lib/lang/se.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Obegränsat'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/sk.lng b/interface/lib/lang/sk.lng index cab3ea1f8f..d8e06d1ab3 100644 --- a/interface/lib/lang/sk.lng +++ b/interface/lib/lang/sk.lng @@ -172,4 +172,4 @@ $wb['datalog_status_d_xmpp_user'] = 'Delete XMPP user'; $wb['unlimited_txt'] = 'Unlimited'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/lib/lang/tr.lng b/interface/lib/lang/tr.lng index 041c8d7103..ec5f1bfd93 100644 --- a/interface/lib/lang/tr.lng +++ b/interface/lib/lang/tr.lng @@ -173,4 +173,4 @@ $wb['select_master_directive_snippet_txt'] = 'Ana Komut Parçaları'; $wb['unlimited_txt'] = 'Sınırsız'; $wb['server_id_0_error_txt'] = 'Please select a valid Server. Server ID must be > 0.'; $wb['datalog_changes_close_txt'] = 'Close'; -?> \ No newline at end of file +$wb['non_admin_error'] = 'Requires administrator level permissions'; diff --git a/interface/web/mail/form/mail_relay_domain.tform.php b/interface/web/mail/form/mail_relay_domain.tform.php new file mode 100644 index 0000000000..2d02fa976c --- /dev/null +++ b/interface/web/mail/form/mail_relay_domain.tform.php @@ -0,0 +1,149 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* + Form Definition + + Tabledefinition + + Datatypes: + - INTEGER (Forces the input to Int) + - DOUBLE + - CURRENCY (Formats the values to currency notation) + - VARCHAR (no format check, maxlength: 255) + - TEXT (no format check) + - DATE (Dateformat, automatic conversion to timestamps) + + Formtype: + - TEXT (Textfield) + - TEXTAREA (Textarea) + - PASSWORD (Password textfield, input is not shown when edited) + - SELECT (Select option field) + - RADIO + - CHECKBOX + - CHECKBOXARRAY + - FILE + + VALUE: + - Wert oder Array + + Hint: + The ID field of the database table is not part of the datafield definition. + The ID field must be always auto incement (int or bigint). + + +*/ + +$form["title"] = "mail_relay_domain_title"; +$form["description"] = ""; +$form["name"] = "mail_relay_domain"; +$form["action"] = "mail_relay_domain_edit.php"; +$form["db_table"] = "mail_relay_domain"; +$form["db_table_idx"] = "relay_domain_id"; +$form["db_history"] = "yes"; +$form["tab_default"] = "relay_domain"; +$form["list_default"] = "mail_relay_domain_list.php"; +$form["auth"] = 'yes'; // yes / no + +$form["auth_preset"]["userid"] = 0; // 0 = id of the user, > 0 id must match with id of current user +$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user +$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete +$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete + +$form["tabs"]['relay_domain'] = array ( + 'title' => "tab_relay_domain_title", + 'width' => 100, + 'template' => "templates/mail_relay_domain_edit.htm", + 'fields' => array ( + //################################# + // Begin Datatable fields + //################################# + 'server_id' => array ( + 'datatype' => 'INTEGER', + 'formtype' => 'SELECT', + 'default' => '', + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE mail_server = 1 AND mirror_server_id = 0 AND {AUTHSQL} ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'value' => '' + ), + 'domain' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( 0 => array( 'event' => 'SAVE', + 'type' => 'IDNTOASCII'), + 1 => array( 'event' => 'SHOW', + 'type' => 'IDNTOUTF8'), + 2 => array( 'event' => 'SAVE', + 'type' => 'TOLOWER'), + 3 => array( 'event' => 'SAVE', + 'type' => 'STRIPNL'), + ), + 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', + 'errmsg'=> 'domain_error_empty'), + 1 => array ( 'type' => 'UNIQUE', + 'errmsg'=> 'domain_error_unique'), + 2 => array ( 'type' => 'ISDOMAIN', + 'errmsg'=> 'domain_error_regex'), + ), + 'default' => '', + 'value' => '', + 'width' => '30', + 'maxlength' => '255', + ), + 'access' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'filters' => array( + 0 => array( 'event' => 'SAVE', + 'type' => 'STRIPTAGS'), + 1 => array( 'event' => 'SAVE', + 'type' => 'STRIPNL') + ), + 'default' => 'OK', + 'value' => 'OK', + 'width' => '30', + 'maxlength' => '255' + ), + 'active' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n', 1 => 'y') + ), + //################################# + // END Datatable fields + //################################# + ) +); + diff --git a/interface/web/mail/lib/lang/ar_mail_relay_domain.lng b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng new file mode 100644 index 0000000000..1e45e58915 --- /dev/null +++ b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng @@ -0,0 +1,6 @@ +auth->is_admin()) 'target' => 'content', 'link' => 'mail/mail_blacklist_list.php', 'html_id' => 'mail_blacklist_list'); -} if($app->auth->get_client_limit($userid, 'mailrouting') != 0) { @@ -83,6 +82,8 @@ if($app->auth->get_client_limit($userid, 'mailrouting') != 0) 'html_id' => 'mail_transport_list'); } +} + if(count($items) && $app->system->has_service($userid, 'mail')) { $module['nav'][] = array( 'title' => 'Email Accounts', @@ -242,14 +243,25 @@ if($app->auth->is_admin()) 'html_id' => 'mail_content_filter_list'); + $items[] = array( 'title' => 'Email Routing', + 'target' => 'content', + 'link' => 'mail/mail_transport_list.php', + 'html_id' => 'mail_transport_list'); + + + $items[] = array( 'title' => 'Relay Domains', + 'target' => 'content', + 'link' => 'mail/mail_relay_domain_list.php', + 'html_id' => 'mail_relay_domain_list'); + + $items[] = array( 'title' => 'Relay Recipients', 'target' => 'content', 'link' => 'mail/mail_relay_recipient_list.php', 'html_id' => 'mail_relay_recipient_list'); - $module['nav'][] = array( 'title' => 'Global Filters', + $module['nav'][] = array( 'title' => 'Server Settings', 'open' => 1, 'items' => $items); } -?> diff --git a/interface/web/mail/list/mail_relay_domain.list.php b/interface/web/mail/list/mail_relay_domain.list.php new file mode 100644 index 0000000000..a6ff783482 --- /dev/null +++ b/interface/web/mail/list/mail_relay_domain.list.php @@ -0,0 +1,111 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +// Name of the list +$liste["name"] = "mail_relay_domain"; + +// Database table +$liste["table"] = "mail_relay_domain"; + +// Index index field of the database table +$liste["table_idx"] = "relay_domain_id"; + +// Search Field Prefix +$liste["search_prefix"] = "search_"; + +// Records per page +$liste["records_per_page"] = "15"; + +// Script File of the list +$liste["file"] = "mail_relay_domain_list.php"; + +// Script file of the edit form +$liste["edit_file"] = "mail_relay_domain_edit.php"; + +// Script File of the delete script +$liste["delete_file"] = "mail_relay_domain_del.php"; + +// Paging Template +$liste["paging_tpl"] = "templates/paging.tpl.htm"; + +// Enable auth +$liste["auth"] = "yes"; + + +/***************************************************** + * Search fields + *****************************************************/ + +/* + Datatypes: + - INTEGER + - DOUBLE + - CURRENCY + - VARCHAR + - TEXT + - DATE +*/ + + +$liste["item"][] = array( 'field' => "active", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "=", + 'prefix' => "", + 'suffix' => "", + 'width' => "", + 'value' => array('y' => $app->lng('yes_txt'), 'n' => $app->lng('no_txt'))); + + +$liste["item"][] = array( 'field' => "server_id", + 'datatype' => "VARCHAR", + 'formtype' => "SELECT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'datasource' => array ( 'type' => 'SQL', + 'querystring' => 'SELECT server_id,server_name FROM server WHERE {AUTHSQL} AND mirror_server_id = 0 ORDER BY server_name', + 'keyfield'=> 'server_id', + 'valuefield'=> 'server_name' + ), + 'width' => "", + 'value' => ""); + + +$liste["item"][] = array( 'field' => "domain", + 'datatype' => "VARCHAR", + 'formtype' => "TEXT", + 'op' => "like", + 'prefix' => "%", + 'suffix' => "%", + 'width' => "", + 'value' => ""); + diff --git a/interface/web/mail/mail_relay_domain_del.php b/interface/web/mail/mail_relay_domain_del.php new file mode 100644 index 0000000000..2981d1518d --- /dev/null +++ b/interface/web/mail/mail_relay_domain_del.php @@ -0,0 +1,50 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/****************************************** +* Begin Form configuration +******************************************/ + +$list_def_file = "list/mail_relay_domain.list.php"; +$tform_def_file = "form/mail_relay_domain.tform.php"; + +/****************************************** +* End Form configuration +******************************************/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +//* Check permissions for module +$app->auth->check_module_permissions('mail'); + +$app->uses("tform_actions"); +$app->tform_actions->onDelete(); + diff --git a/interface/web/mail/mail_relay_domain_edit.php b/interface/web/mail/mail_relay_domain_edit.php new file mode 100644 index 0000000000..131b6fe06a --- /dev/null +++ b/interface/web/mail/mail_relay_domain_edit.php @@ -0,0 +1,78 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +/****************************************** +* Begin Form configuration +******************************************/ + +$tform_def_file = "form/mail_relay_domain.tform.php"; + +/****************************************** +* End Form configuration +******************************************/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +//* Check permissions for module +$app->auth->check_module_permissions('mail'); + +//* Only administrators allowed +if(! $app->auth->is_admin()) { die( $app->lng("non_admin_error") ); } + +// Loading classes +$app->uses('tpl,tform,tform_actions'); +$app->load('tform_actions'); + +class page_action extends tform_actions { + + function onSubmit() { + global $app, $conf; + + //* make sure that the email domain is lowercase + if(isset($this->dataRecord["domain"])){ + $this->dataRecord["domain"] = $app->functions->idn_encode($this->dataRecord["domain"]); + $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); + } + + //* server_id must be > 0 + if(isset($this->dataRecord["server_id"]) && $this->dataRecord["server_id"] < 1) { + $app->tform->errorMessage .= $app->lng("server_id_0_error_txt"); + } + + parent::onSubmit(); + } + +} + +$app->tform_actions = new page_action; +$app->tform_actions->onLoad(); + diff --git a/interface/web/mail/mail_relay_domain_list.php b/interface/web/mail/mail_relay_domain_list.php new file mode 100644 index 0000000000..56812b7580 --- /dev/null +++ b/interface/web/mail/mail_relay_domain_list.php @@ -0,0 +1,51 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +/****************************************** +* Begin Form configuration +******************************************/ + +$list_def_file = "list/mail_relay_domain.list.php"; + +/****************************************** +* End Form configuration +******************************************/ + +//* Check permissions for module +$app->auth->check_module_permissions('mail'); + +$app->uses('listform_actions'); + +$app->listform_actions->onLoad(); + + diff --git a/interface/web/mail/templates/mail_relay_domain_edit.htm b/interface/web/mail/templates/mail_relay_domain_edit.htm new file mode 100644 index 0000000000..2d4d1f3041 --- /dev/null +++ b/interface/web/mail/templates/mail_relay_domain_edit.htm @@ -0,0 +1,26 @@ +
    + +
    + +
    +
    +
    + +
    +
    +
    + +
    + {tmpl_var name='active'} +
    +
    + + + + +
    + + +
    diff --git a/interface/web/mail/templates/mail_relay_domain_list.htm b/interface/web/mail/templates/mail_relay_domain_list.htm new file mode 100644 index 0000000000..4bc201a77b --- /dev/null +++ b/interface/web/mail/templates/mail_relay_domain_list.htm @@ -0,0 +1,68 @@ + + + +
    +
    +
    +
    + {tmpl_var name="datalog_changes_txt"} +
      + +
    • {tmpl_var name="text"}: {tmpl_var name="count"}
    • +
      +
    + {tmpl_var name="datalog_changes_end_txt"} +
    +

    +
    +
    +

    {tmpl_var name="toolsarea_head_txt"}

    + + + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {tmpl_var name='search_limit'}
    + +
    {tmpl_var name="active"}{tmpl_var name="server_id"}{tmpl_var name="domain"} + +
    {tmpl_var name='globalsearch_noresults_text_txt'}
    +
    + -- GitLab From 8ed9a0a4aa4ef44570d5e0b1382f800df30d1375 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 2 Sep 2021 11:09:19 -0600 Subject: [PATCH 1250/1368] mail: mail_relay_domain domain should be unique per server --- .../validate_mail_relay_domain.inc.php | 64 +++++++++++++++++++ .../web/mail/form/mail_relay_domain.tform.php | 12 ++-- .../mail/lib/lang/ar_mail_relay_domain.lng | 3 + .../mail/lib/lang/bg_mail_relay_domain.lng | 3 + .../mail/lib/lang/br_mail_relay_domain.lng | 3 + .../mail/lib/lang/ca_mail_relay_domain.lng | 3 + .../mail/lib/lang/cz_mail_relay_domain.lng | 3 + .../mail/lib/lang/de_mail_relay_domain.lng | 3 + .../mail/lib/lang/dk_mail_relay_domain.lng | 3 + .../mail/lib/lang/el_mail_relay_domain.lng | 3 + .../mail/lib/lang/en_mail_relay_domain.lng | 3 + .../mail/lib/lang/es_mail_relay_domain.lng | 3 + .../mail/lib/lang/fi_mail_relay_domain.lng | 3 + .../mail/lib/lang/fr_mail_relay_domain.lng | 3 + .../mail/lib/lang/hr_mail_relay_domain.lng | 3 + .../mail/lib/lang/hu_mail_relay_domain.lng | 3 + .../mail/lib/lang/id_mail_relay_domain.lng | 3 + .../mail/lib/lang/it_mail_relay_domain.lng | 3 + .../mail/lib/lang/ja_mail_relay_domain.lng | 3 + .../mail/lib/lang/nl_mail_relay_domain.lng | 3 + .../mail/lib/lang/pl_mail_relay_domain.lng | 3 + .../mail/lib/lang/pt_mail_relay_domain.lng | 3 + .../mail/lib/lang/ro_mail_relay_domain.lng | 3 + .../mail/lib/lang/ru_mail_relay_domain.lng | 3 + .../mail/lib/lang/se_mail_relay_domain.lng | 3 + .../mail/lib/lang/sk_mail_relay_domain.lng | 3 + .../mail/lib/lang/tr_mail_relay_domain.lng | 3 + 27 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 interface/lib/classes/validate_mail_relay_domain.inc.php diff --git a/interface/lib/classes/validate_mail_relay_domain.inc.php b/interface/lib/classes/validate_mail_relay_domain.inc.php new file mode 100644 index 0000000000..0d6beedefb --- /dev/null +++ b/interface/lib/classes/validate_mail_relay_domain.inc.php @@ -0,0 +1,64 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class validate_mail_relay_domain { + + function get_error($errmsg) { + global $app; + + if(isset($app->tform->wordbook[$errmsg])) { + return $app->tform->wordbook[$errmsg]."
    \r\n"; + } else { + return $errmsg."
    \r\n"; + } + } + + /* Validator function for checking the 'domain' of a mail relay domain */ + function validate_domain($field_name, $field_value, $validator) { + global $app, $conf; + + if(empty($field_value) || $field_name != 'domain') return; + + + if(isset($app->remoting_lib->primary_id)) { + $id = $app->remoting_lib->primary_id; + } else { + $id = $app->tform->primary_id; + } + + // mail_relay_domain.domain must be unique per server + $sql = "SELECT relay_domain_id, domain FROM mail_relay_domain WHERE domain = ? AND server_id = ? AND relay_domain_id != ?"; + $domain_check = $app->db->queryOneRecord($sql, $field_value, $conf['server_id'], $id); + + if($domain_check) return $this->get_error('domain_error_unique'); + } + +} diff --git a/interface/web/mail/form/mail_relay_domain.tform.php b/interface/web/mail/form/mail_relay_domain.tform.php index 2d02fa976c..4e2523309d 100644 --- a/interface/web/mail/form/mail_relay_domain.tform.php +++ b/interface/web/mail/form/mail_relay_domain.tform.php @@ -110,11 +110,13 @@ $form["tabs"]['relay_domain'] = array ( 'type' => 'STRIPNL'), ), 'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY', - 'errmsg'=> 'domain_error_empty'), - 1 => array ( 'type' => 'UNIQUE', - 'errmsg'=> 'domain_error_unique'), - 2 => array ( 'type' => 'ISDOMAIN', - 'errmsg'=> 'domain_error_regex'), + 'errmsg' => 'domain_error_empty'), + 1 => array ( 'type' => 'ISDOMAIN', + 'errmsg' => 'domain_error_regex'), + 2 => array ( 'type' => 'CUSTOM', + 'class' => 'validate_mail_relay_domain', + 'function' => 'validate_domain', + 'errmsg' => 'domain_error_unique'), ), 'default' => '', 'value' => '', diff --git a/interface/web/mail/lib/lang/ar_mail_relay_domain.lng b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng index 1e45e58915..e5296a9a9b 100644 --- a/interface/web/mail/lib/lang/ar_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/ar_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Active'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/bg_mail_relay_domain.lng b/interface/web/mail/lib/lang/bg_mail_relay_domain.lng index 74d6874b63..0da8a0a246 100644 --- a/interface/web/mail/lib/lang/bg_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/bg_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Сървър'; $wb['active_txt'] = 'Активен'; $wb['domain_txt'] = 'Домейн'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Полето с домейн е празно.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/br_mail_relay_domain.lng b/interface/web/mail/lib/lang/br_mail_relay_domain.lng index a25675ff17..b992e63aa2 100644 --- a/interface/web/mail/lib/lang/br_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/br_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Servidor'; $wb['active_txt'] = 'Ativo'; $wb['domain_txt'] = 'Domínio'; +$wb['domain_error_regex'] = 'O domínio é inválido.'; +$wb['domain_error_empty'] = 'O domínio está vazio.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ca_mail_relay_domain.lng b/interface/web/mail/lib/lang/ca_mail_relay_domain.lng index b3ca03b583..b6e9d8f2fb 100644 --- a/interface/web/mail/lib/lang/ca_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/ca_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Serveur'; $wb['active_txt'] = 'Actif'; $wb['domain_txt'] = 'Domaine'; +$wb['domain_error_regex'] = 'Nom de domaine invalide.'; +$wb['domain_error_empty'] = 'Le domain est vide.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/cz_mail_relay_domain.lng b/interface/web/mail/lib/lang/cz_mail_relay_domain.lng index 30d4ecc3d1..e5563fd535 100644 --- a/interface/web/mail/lib/lang/cz_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/cz_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Aktivní'; $wb['domain_txt'] = 'Doména'; +$wb['domain_error_regex'] = 'Neplatný název domény.'; +$wb['domain_error_empty'] = 'Doména je prázdná.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/de_mail_relay_domain.lng b/interface/web/mail/lib/lang/de_mail_relay_domain.lng index 0bfacb7916..6c0456a2c2 100644 --- a/interface/web/mail/lib/lang/de_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/de_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Aktiv'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Domain Name ist nicht gültig.'; +$wb['domain_error_empty'] = 'Domain ist leer.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/dk_mail_relay_domain.lng b/interface/web/mail/lib/lang/dk_mail_relay_domain.lng index 5248fa4b47..d993bcd4b1 100644 --- a/interface/web/mail/lib/lang/dk_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/dk_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Aktiv'; $wb['domain_txt'] = 'Domæne'; +$wb['domain_error_regex'] = 'Ugyldigt domæne name.'; +$wb['domain_error_empty'] = 'Domæne er tom.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/el_mail_relay_domain.lng b/interface/web/mail/lib/lang/el_mail_relay_domain.lng index 16ae95a41c..6f6d698afa 100644 --- a/interface/web/mail/lib/lang/el_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/el_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Ενεργό'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Το όνομα domain δεν είναι έγκυρο/'; +$wb['domain_error_empty'] = 'Το Domain είναι άδειο.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/en_mail_relay_domain.lng b/interface/web/mail/lib/lang/en_mail_relay_domain.lng index 1e45e58915..e5296a9a9b 100644 --- a/interface/web/mail/lib/lang/en_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/en_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Active'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/es_mail_relay_domain.lng b/interface/web/mail/lib/lang/es_mail_relay_domain.lng index 294fd56f32..848775dd2a 100644 --- a/interface/web/mail/lib/lang/es_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/es_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Servidor'; $wb['active_txt'] = 'Habilitado'; $wb['domain_txt'] = 'Dominio'; +$wb['domain_error_regex'] = 'Nombre de dominio inválido.'; +$wb['domain_error_empty'] = 'El dominio está vacío.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/fi_mail_relay_domain.lng b/interface/web/mail/lib/lang/fi_mail_relay_domain.lng index 1853d0a118..37afab76ce 100644 --- a/interface/web/mail/lib/lang/fi_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/fi_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Palvelin'; $wb['active_txt'] = 'Toiminnassa'; $wb['domain_txt'] = 'Postiverkkotunnus'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/fr_mail_relay_domain.lng b/interface/web/mail/lib/lang/fr_mail_relay_domain.lng index b3ca03b583..b6e9d8f2fb 100644 --- a/interface/web/mail/lib/lang/fr_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/fr_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Serveur'; $wb['active_txt'] = 'Actif'; $wb['domain_txt'] = 'Domaine'; +$wb['domain_error_regex'] = 'Nom de domaine invalide.'; +$wb['domain_error_empty'] = 'Le domain est vide.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/hr_mail_relay_domain.lng b/interface/web/mail/lib/lang/hr_mail_relay_domain.lng index c8712ed543..c0d40b147c 100644 --- a/interface/web/mail/lib/lang/hr_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/hr_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Aktivno'; $wb['domain_txt'] = 'Domena'; +$wb['domain_error_regex'] = 'Neispravan naziv domene.'; +$wb['domain_error_empty'] = 'Domena je prazna.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/hu_mail_relay_domain.lng b/interface/web/mail/lib/lang/hu_mail_relay_domain.lng index 5bb628f605..0ad225ad55 100644 --- a/interface/web/mail/lib/lang/hu_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/hu_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Szerver'; $wb['active_txt'] = 'Aktív'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/id_mail_relay_domain.lng b/interface/web/mail/lib/lang/id_mail_relay_domain.lng index 7406667d8e..042ebf0f62 100644 --- a/interface/web/mail/lib/lang/id_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/id_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Aktif'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/it_mail_relay_domain.lng b/interface/web/mail/lib/lang/it_mail_relay_domain.lng index e35e0e8b55..e5ea20d100 100644 --- a/interface/web/mail/lib/lang/it_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/it_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Attivo'; $wb['domain_txt'] = 'Dominio'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ja_mail_relay_domain.lng b/interface/web/mail/lib/lang/ja_mail_relay_domain.lng index 161d0c0e32..ea66b94551 100644 --- a/interface/web/mail/lib/lang/ja_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/ja_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Active'; $wb['domain_txt'] = 'ドメイン'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/nl_mail_relay_domain.lng b/interface/web/mail/lib/lang/nl_mail_relay_domain.lng index 5baeb6f9d0..e76ed68a5d 100644 --- a/interface/web/mail/lib/lang/nl_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/nl_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Actief'; $wb['domain_txt'] = 'Domein'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/pl_mail_relay_domain.lng b/interface/web/mail/lib/lang/pl_mail_relay_domain.lng index 145eb336cc..dc872f9242 100644 --- a/interface/web/mail/lib/lang/pl_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/pl_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Serwer'; $wb['active_txt'] = 'Aktywny'; $wb['domain_txt'] = 'Domena'; +$wb['domain_error_regex'] = 'Nieprawidłowa nazwa domeny.'; +$wb['domain_error_empty'] = 'Domena jest pusta.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/pt_mail_relay_domain.lng b/interface/web/mail/lib/lang/pt_mail_relay_domain.lng index f6879d78f6..a775995cde 100644 --- a/interface/web/mail/lib/lang/pt_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/pt_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Servidor'; $wb['active_txt'] = 'Activo'; $wb['domain_txt'] = 'Domínio'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ro_mail_relay_domain.lng b/interface/web/mail/lib/lang/ro_mail_relay_domain.lng index 1e45e58915..e5296a9a9b 100644 --- a/interface/web/mail/lib/lang/ro_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/ro_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Active'; $wb['domain_txt'] = 'Domain'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/ru_mail_relay_domain.lng b/interface/web/mail/lib/lang/ru_mail_relay_domain.lng index ec4c288c71..a80c439da8 100644 --- a/interface/web/mail/lib/lang/ru_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/ru_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Сервер'; $wb['active_txt'] = 'Активно'; $wb['domain_txt'] = 'Домен'; +$wb['domain_error_regex'] = 'Некорректное имя домена.'; +$wb['domain_error_empty'] = 'Домен пустой.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/se_mail_relay_domain.lng b/interface/web/mail/lib/lang/se_mail_relay_domain.lng index 4ce4c59de6..d1890449c4 100644 --- a/interface/web/mail/lib/lang/se_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/se_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Aktiv'; $wb['domain_txt'] = 'Domän'; +$wb['domain_error_regex'] = 'Ogiltigt domännamn.'; +$wb['domain_error_empty'] = 'Domänfältet är tomt.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/sk_mail_relay_domain.lng b/interface/web/mail/lib/lang/sk_mail_relay_domain.lng index dcdd0caaf5..f63a9fd663 100644 --- a/interface/web/mail/lib/lang/sk_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/sk_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Server'; $wb['active_txt'] = 'Active'; $wb['domain_txt'] = 'Doména'; +$wb['domain_error_regex'] = 'Invalid domain name.'; +$wb['domain_error_empty'] = 'Domain is empty.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; diff --git a/interface/web/mail/lib/lang/tr_mail_relay_domain.lng b/interface/web/mail/lib/lang/tr_mail_relay_domain.lng index a834eaaa6d..cd4b38cf2a 100644 --- a/interface/web/mail/lib/lang/tr_mail_relay_domain.lng +++ b/interface/web/mail/lib/lang/tr_mail_relay_domain.lng @@ -4,3 +4,6 @@ $wb['tab_relay_domain_title'] = 'Relay domain'; $wb['server_id_txt'] = 'Sunucu'; $wb['active_txt'] = 'Etkin'; $wb['domain_txt'] = 'Etki Alanı'; +$wb['domain_error_regex'] = 'Etki alanı geçersiz.'; +$wb['domain_error_empty'] = 'Etki alanı boş olamaz.'; +$wb['domain_error_unique'] = 'This Domain already exists as a mail relay domain on this server.'; -- GitLab From fa56dcdcacdd10150c1e0982cac9c149a07d6f50 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 7 Sep 2021 17:13:33 -0600 Subject: [PATCH 1251/1368] verify recipient addrs for amavis from downstream smtpd --- install/lib/installer_base.lib.php | 143 +++++++++++------- install/tpl/master_cf_amavis.master | 2 +- install/tpl/master_cf_amavis10025.master | 2 + install/tpl/master_cf_amavis10027.master | 6 +- .../validate_mail_relay_domain.inc.php | 5 +- .../postfix_server_plugin.inc.php | 108 +++++++------ 6 files changed, 157 insertions(+), 109 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 103abaef19..5e7a14a5cd 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1107,7 +1107,7 @@ class installer_base { $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); unset($server_ini_rec); - //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removeal after an update + //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removal after an update $rbl_list = ''; if (@isset($server_ini_array['mail']['realtime_blackhole_list']) && $server_ini_array['mail']['realtime_blackhole_list'] != '') { $rbl_hosts = explode(",", str_replace(" ", "", $server_ini_array['mail']['realtime_blackhole_list'])); @@ -1647,6 +1647,12 @@ class installer_base { public function configure_amavis() { global $conf; + //* These postconf commands will be executed on installation and update + $server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); + $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); + $mail_server = ($server_ini_rec['mail_server']) ? true : false; + unset($server_ini_rec); + // amavisd user config file $configfile = 'amavisd_user_config'; if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) copy($conf['amavis']['config_dir'].'/conf.d/50-user', $conf['amavis']['config_dir'].'/50-user~'); @@ -1660,63 +1666,85 @@ class installer_base { wf($conf['amavis']['config_dir'].'/conf.d/50-user', $content); chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); - // TODO: chmod and chown on the config file + $mail_config = $server_ini_array['mail']; + //* only change postfix config if amavisd is active filter + if($mail_server && $mail_config['content_filter'] === 'amavisd') { + // test if lmtp if available + $configure_lmtp = $this->get_postfix_service('lmtp','unix'); - // test if lmtp if available - $configure_lmtp = $this->get_postfix_service('lmtp','unix'); + // Adding the amavisd commands to the postfix configuration + $postconf_commands = array (); - // Adding the amavisd commands to the postfix configuration - // Add array for no error in foreach and maybe future options - $postconf_commands = array (); + // Check for amavisd -> pure webserver with postfix for mailing without antispam + if ($conf['amavis']['installed']) { + $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis'; + $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024"; + $postconf_commands[] = 'receive_override_options = no_address_mappings'; + $postconf_commands[] = 'address_verify_virtual_transport = smtp:[127.0.0.1]:10025'; + $postconf_commands[] = 'address_verify_transport_maps = static:smtp:[127.0.0.1]:10025'; + } - // Check for amavisd -> pure webserver with postfix for mailing without antispam - if ($conf['amavis']['installed']) { - $content_filter_service = ($configure_lmtp) ? 'lmtp' : 'amavis'; - $postconf_commands[] = "content_filter = ${content_filter_service}:[127.0.0.1]:10024"; - $postconf_commands[] = 'receive_override_options = no_address_mappings'; - } + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + $new_options = array(); + foreach ($options as $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } + $new_options[] = $value; + } + if ($configure_lmtp) { + for ($i = 0; isset($new_options[$i]); $i++) { + if ($new_options[$i] == 'reject_unlisted_recipient') { + array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${config_dir}/mysql-verify_recipients.cf")); + break; + } + } + # postfix < 3.3 needs this when using reject_unverified_recipient: + if(version_compare($postfix_version, 3.3, '<')) { + $postconf_commands[] = "enable_original_recipient = yes"; + } + } + $postconf_commands[] = "smtpd_recipient_restrictions = ".implode(", ", $new_options); - // Make a backup copy of the main.cf file - copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~2'); + // Make a backup copy of the main.cf file + copy($conf['postfix']['config_dir'].'/main.cf', $conf['postfix']['config_dir'].'/main.cf~2'); - // Executing the postconf commands - foreach($postconf_commands as $cmd) { - $command = "postconf -e '$cmd'"; - caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); - } + // Executing the postconf commands + foreach($postconf_commands as $cmd) { + $command = "postconf -e '$cmd'"; + caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); + } - $config_dir = $conf['postfix']['config_dir']; + $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists -// $add_amavis = !$this->get_postfix_service('amavis','unix'); -// $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); -// $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - //*TODO: check templates against existing postfix-services to make sure we use the template - - // Or just remove the old service definitions and add them again? - $add_amavis = $this->remove_postfix_service('amavis','unix'); - $add_amavis_10025 = $this->remove_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = $this->remove_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); + // Adding amavis-services to the master.cf file if the service does not already exists + // (just remove the old service definitions and add them again) + $add_amavis = $this->remove_postfix_service('amavis','unix'); + $add_amavis_10025 = $this->remove_postfix_service('127.0.0.1:10025','inet'); + $add_amavis_10027 = $this->remove_postfix_service('127.0.0.1:10027','inet'); + + if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { + //* backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + // adjust amavis-config + if($add_amavis) { + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + } + if ($add_amavis_10025) { + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + } + if ($add_amavis_10027) { + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); + } } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } } // Add the clamav user to the amavis group @@ -1746,14 +1774,18 @@ class installer_base { global $conf; //* These postconf commands will be executed on installation and update - $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); + $server_ini_rec = $this->db->queryOneRecord("SELECT mail_server, config FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . '.server', $conf['server_id']); $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config'])); + $mail_server = ($server_ini_rec['mail_server']) ? true : false; unset($server_ini_rec); $mail_config = $server_ini_array['mail']; - if($mail_config['content_filter'] === 'rspamd') { - exec("postconf -X 'receive_override_options'"); - exec("postconf -X 'content_filter'"); + //* only change postfix config if rspamd is active filter + if($mail_server && $mail_config['content_filter'] === 'rspamd') { + exec("postconf -X receive_override_options"); + exec("postconf -X content_filter"); + exec("postconf -X address_verify_virtual_transport"); + exec("postconf -X address_verify_transport_maps"); exec("postconf -e 'smtpd_milters = inet:localhost:11332'"); exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'"); @@ -1804,6 +1836,9 @@ class installer_base { if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { continue; } + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; + } $new_options[] = $value; } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); diff --git a/install/tpl/master_cf_amavis.master b/install/tpl/master_cf_amavis.master index 243f28a288..a565f1a1bb 100644 --- a/install/tpl/master_cf_amavis.master +++ b/install/tpl/master_cf_amavis.master @@ -2,5 +2,5 @@ amavis unix - - - - 2 smtp -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes - -o smtp_bind_address= + -o smtp_bind_address= diff --git a/install/tpl/master_cf_amavis10025.master b/install/tpl/master_cf_amavis10025.master index 6dee892264..68d4561494 100644 --- a/install/tpl/master_cf_amavis10025.master +++ b/install/tpl/master_cf_amavis10025.master @@ -14,4 +14,6 @@ -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes + -o address_verify_virtual_transport=$virtual_transport + -o address_verify_transport_maps=$transport_maps diff --git a/install/tpl/master_cf_amavis10027.master b/install/tpl/master_cf_amavis10027.master index 640902d52e..d3a07a8bce 100644 --- a/install/tpl/master_cf_amavis10027.master +++ b/install/tpl/master_cf_amavis10027.master @@ -13,7 +13,9 @@ -o strict_rfc821_envelopes=yes -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks -o smtp_send_xforward_command=yes - -o milter_default_action=accept - -o milter_macro_daemon_name=ORIGINATING -o disable_dns_lookups=yes + -o address_verify_virtual_transport=$virtual_transport + -o address_verify_transport_maps=$transport_maps + -o milter_default_action=accept + -o milter_macro_daemon_name=ORIGINATING diff --git a/interface/lib/classes/validate_mail_relay_domain.inc.php b/interface/lib/classes/validate_mail_relay_domain.inc.php index 0d6beedefb..44e13998a4 100644 --- a/interface/lib/classes/validate_mail_relay_domain.inc.php +++ b/interface/lib/classes/validate_mail_relay_domain.inc.php @@ -45,9 +45,6 @@ class validate_mail_relay_domain { function validate_domain($field_name, $field_value, $validator) { global $app, $conf; - if(empty($field_value) || $field_name != 'domain') return; - - if(isset($app->remoting_lib->primary_id)) { $id = $app->remoting_lib->primary_id; } else { @@ -56,7 +53,7 @@ class validate_mail_relay_domain { // mail_relay_domain.domain must be unique per server $sql = "SELECT relay_domain_id, domain FROM mail_relay_domain WHERE domain = ? AND server_id = ? AND relay_domain_id != ?"; - $domain_check = $app->db->queryOneRecord($sql, $field_value, $conf['server_id'], $id); + $domain_check = $app->db->queryOneRecord($sql, $field_value, $app->tform_actions->dataRecord['server_id'], $id); if($domain_check) return $this->get_error('domain_error_unique'); } diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index 8cdb95066b..9d94bf8982 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -72,6 +72,12 @@ class postfix_server_plugin { global $app, $conf; $postfix_restart = false; + // Plugin should only run on mail servers + if(! $data['new']['mail_server']) { + $app->log("postfix_server_plugin: plugin is enabled but this server is not configured as a mail server.", LOGLEVEL_WARN); + return false; + } + // get the config $app->uses("getconf,system"); $old_ini_data = $app->ini_parser->parse_ini_string($data['old']['config']); @@ -341,6 +347,10 @@ class postfix_server_plugin { for ($i = 0; isset($new_options[$i]); $i++) { if ($new_options[$i] == 'reject_unlisted_recipient') { array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf")); + + $app->system->exec_safe("postconf -e ?", 'address_verify_virtual_transport = smtp:[127.0.0.1]:10025'); + $app->system->exec_safe("postconf -e ?", 'address_verify_transport_maps = static:smtp:[127.0.0.1]:10025'); + break; } } @@ -351,62 +361,64 @@ class postfix_server_plugin { } exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - if($mail_config['content_filter'] != $old_ini_data['mail']['content_filter']) { - $rslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_sender_login_mismatch," : ""; - $raslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_authenticated_sender_login_mismatch," : ""; - - if($mail_config['content_filter'] == 'rspamd'){ - exec("postconf -X 'receive_override_options'"); - exec("postconf -X 'content_filter'"); + $rslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_sender_login_mismatch," : ""; + $raslm = ($mail_config['reject_sender_login_mismatch'] == 'y') ? "reject_authenticated_sender_login_mismatch," : ""; - exec("postconf -e 'smtpd_milters = inet:localhost:11332'"); - exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'"); - exec("postconf -e 'milter_protocol = 6'"); - exec("postconf -e 'milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}'"); - exec("postconf -e 'milter_default_action = accept'"); + if($mail_config['content_filter'] == 'rspamd'){ + exec("postconf -X 'receive_override_options'"); + exec("postconf -X 'content_filter'"); + exec("postconf -X address_verify_virtual_transport"); + exec("postconf -X address_verify_transport_maps"); - exec("postconf -e 'smtpd_sender_restrictions = ${raslm} permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender'"); + exec("postconf -e 'smtpd_milters = inet:localhost:11332'"); + exec("postconf -e 'non_smtpd_milters = inet:localhost:11332'"); + exec("postconf -e 'milter_protocol = 6'"); + exec("postconf -e 'milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}'"); + exec("postconf -e 'milter_default_action = accept'"); + exec("postconf -e 'smtpd_sender_restrictions = ${raslm} permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender'"); - $new_options = array(); - $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); - foreach ($options as $key => $value) { - $value = trim($value); - if ($value == '') continue; - if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { - continue; - } - $new_options[] = $value; - } - exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - - // get all domains that have dkim enabled - if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' ) { - $mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1); + $new_options = array(); + $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); + foreach ($options as $key => $value) { + $value = trim($value); + if ($value == '') continue; + if (preg_match('/check_policy_service\s+inet:127.0.0.1:10023/', $value)) { + continue; } - $dkim_domains = $app->db->queryAllRecords('SELECT `dkim_selector`, `domain` FROM `mail_domain` WHERE `dkim` = ? ORDER BY `domain` ASC', 'y'); - $fpp = fopen('/etc/rspamd/local.d/dkim_domains.map', 'w'); - $fps = fopen('/etc/rspamd/local.d/dkim_selectors.map', 'w'); - foreach($dkim_domains as $dkim_domain) { - fwrite($fpp, $dkim_domain['domain'] . ' ' . $mail_config['dkim_path'] . '/' . $dkim_domain['domain'] . '.private' . "\n"); - fwrite($fps, $dkim_domain['domain'] . ' ' . $dkim_domain['dkim_selector'] . "\n"); + if (preg_match("|check_recipient_access\s+proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf|", $value)) { + continue; } - fclose($fpp); - fclose($fps); - unset($dkim_domains); - } else { - exec("postconf -X 'smtpd_milters'"); - exec("postconf -X 'non_smtpd_milters'"); - exec("postconf -X 'milter_protocol'"); - exec("postconf -X 'milter_mail_macros'"); - exec("postconf -X 'milter_default_action'"); - - exec("postconf -e 'receive_override_options = no_address_mappings'"); - exec("postconf -e 'content_filter = " . ($configure_lmtp ? "lmtp" : "amavis" ) . ":[127.0.0.1]:10024'"); + $new_options[] = $value; + } + exec("postconf -e 'smtpd_recipient_restrictions = ".implode(", ", $new_options)."'"); - // fixme: should read this from conf templates - exec("postconf -e 'smtpd_sender_restrictions = ${raslm} check_sender_access regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); + // get all domains that have dkim enabled + if ( substr($mail_config['dkim_path'], strlen($mail_config['dkim_path'])-1) == '/' ) { + $mail_config['dkim_path'] = substr($mail_config['dkim_path'], 0, strlen($mail_config['dkim_path'])-1); + } + $dkim_domains = $app->db->queryAllRecords('SELECT `dkim_selector`, `domain` FROM `mail_domain` WHERE `dkim` = ? ORDER BY `domain` ASC', 'y'); + $fpp = fopen('/etc/rspamd/local.d/dkim_domains.map', 'w'); + $fps = fopen('/etc/rspamd/local.d/dkim_selectors.map', 'w'); + foreach($dkim_domains as $dkim_domain) { + fwrite($fpp, $dkim_domain['domain'] . ' ' . $mail_config['dkim_path'] . '/' . $dkim_domain['domain'] . '.private' . "\n"); + fwrite($fps, $dkim_domain['domain'] . ' ' . $dkim_domain['dkim_selector'] . "\n"); } + fclose($fpp); + fclose($fps); + unset($dkim_domains); + } else { + exec("postconf -X 'smtpd_milters'"); + exec("postconf -X 'non_smtpd_milters'"); + exec("postconf -X 'milter_protocol'"); + exec("postconf -X 'milter_mail_macros'"); + exec("postconf -X 'milter_default_action'"); + + exec("postconf -e 'receive_override_options = no_address_mappings'"); + exec("postconf -e 'content_filter = " . ($configure_lmtp ? "lmtp" : "amavis" ) . ":[127.0.0.1]:10024'"); + + // fixme: should read this from conf templates + exec("postconf -e 'smtpd_sender_restrictions = ${raslm} check_sender_access regexp:/etc/postfix/tag_as_originating.re, permit_mynetworks, check_sender_access proxy:mysql:/etc/postfix/mysql-virtual_sender.cf, ${rslm} permit_sasl_authenticated, reject_non_fqdn_sender, reject_unlisted_sender, check_sender_access regexp:/etc/postfix/tag_as_foreign.re'"); } if($mail_config['content_filter'] == 'rspamd' && ($mail_config['rspamd_password'] != $old_ini_data['mail']['rspamd_password'] || $mail_config['content_filter'] != $old_ini_data['mail']['content_filter'])) { -- GitLab From 2c2fa72c41fd31d986d205c14e90a60d96868656 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 21 Sep 2021 13:29:19 -0600 Subject: [PATCH 1252/1368] installer: missing variable assigments --- install/lib/installer_base.lib.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 5e7a14a5cd..b788fd7c63 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1666,6 +1666,9 @@ class installer_base { wf($conf['amavis']['config_dir'].'/conf.d/50-user', $content); chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); + $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '|'); + $mail_config = $server_ini_array['mail']; //* only change postfix config if amavisd is active filter if($mail_server && $mail_config['content_filter'] === 'amavisd') { @@ -1717,8 +1720,6 @@ class installer_base { caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); } - $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists // (just remove the old service definitions and add them again) $add_amavis = $this->remove_postfix_service('amavis','unix'); @@ -1779,6 +1780,9 @@ class installer_base { $mail_server = ($server_ini_rec['mail_server']) ? true : false; unset($server_ini_rec); + $config_dir = $conf['postfix']['config_dir']; + $quoted_config_dir = preg_quote($config_dir, '|'); + $mail_config = $server_ini_array['mail']; //* only change postfix config if rspamd is active filter if($mail_server && $mail_config['content_filter'] === 'rspamd') { -- GitLab From 4cd4868518fb413b3813fa6fc03f7d6e33878823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mu=C3=B1oz?= Date: Mon, 27 Sep 2021 23:48:19 +0000 Subject: [PATCH 1253/1368] Add support for borgbackup incremental backups --- .../lib/classes/plugin_backuplist.inc.php | 103 +- .../web/admin/form/server_config.tform.php | 2 +- .../web/admin/lib/lang/ar_server_config.lng | 2 + .../web/admin/lib/lang/bg_server_config.lng | 2 + .../web/admin/lib/lang/br_server_config.lng | 2 + .../web/admin/lib/lang/ca_server_config.lng | 2 + .../web/admin/lib/lang/cz_server_config.lng | 2 + .../web/admin/lib/lang/de_server_config.lng | 2 + .../web/admin/lib/lang/dk_server_config.lng | 2 + .../web/admin/lib/lang/el_server_config.lng | 2 + .../web/admin/lib/lang/en_server_config.lng | 2 + .../web/admin/lib/lang/es_server_config.lng | 2 + .../web/admin/lib/lang/fi_server_config.lng | 2 + .../web/admin/lib/lang/fr_server_config.lng | 2 + .../web/admin/lib/lang/hr_server_config.lng | 2 + .../web/admin/lib/lang/hu_server_config.lng | 2 + .../web/admin/lib/lang/id_server_config.lng | 2 + .../web/admin/lib/lang/it_server_config.lng | 2 + .../web/admin/lib/lang/ja_server_config.lng | 2 + .../web/admin/lib/lang/nl_server_config.lng | 2 + .../web/admin/lib/lang/pl_server_config.lng | 2 + .../web/admin/lib/lang/pt_server_config.lng | 2 + .../web/admin/lib/lang/ro_server_config.lng | 2 + .../web/admin/lib/lang/ru_server_config.lng | 2 + .../web/admin/lib/lang/se_server_config.lng | 2 + .../web/admin/lib/lang/sk_server_config.lng | 2 + .../web/admin/lib/lang/tr_server_config.lng | 2 + interface/web/admin/server_config_edit.php | 5 +- .../templates/server_config_server_edit.htm | 5 + .../web/sites/lib/lang/ar_web_backup_list.lng | 1 + .../web/sites/lib/lang/bg_web_backup_list.lng | 1 + .../web/sites/lib/lang/br_web_backup_list.lng | 1 + .../web/sites/lib/lang/ca_web_backup_list.lng | 1 + .../web/sites/lib/lang/cz_web_backup_list.lng | 1 + .../web/sites/lib/lang/de_web_backup_list.lng | 1 + .../web/sites/lib/lang/dk_web_backup_list.lng | 1 + .../web/sites/lib/lang/el_web_backup_list.lng | 1 + .../web/sites/lib/lang/en_web_backup_list.lng | 1 + .../web/sites/lib/lang/es_web_backup_list.lng | 1 + .../web/sites/lib/lang/fi_web_backup_list.lng | 1 + .../web/sites/lib/lang/fr_web_backup_list.lng | 1 + .../web/sites/lib/lang/hr_web_backup_list.lng | 1 + .../web/sites/lib/lang/hu_web_backup_list.lng | 1 + .../web/sites/lib/lang/id_web_backup_list.lng | 1 + .../web/sites/lib/lang/it_web_backup_list.lng | 1 + .../web/sites/lib/lang/ja_web_backup_list.lng | 1 + .../web/sites/lib/lang/nl_web_backup_list.lng | 1 + .../web/sites/lib/lang/pl_web_backup_list.lng | 1 + .../web/sites/lib/lang/pt_web_backup_list.lng | 1 + .../web/sites/lib/lang/ro_web_backup_list.lng | 1 + .../web/sites/lib/lang/ru_web_backup_list.lng | 1 + .../web/sites/lib/lang/se_web_backup_list.lng | 1 + .../web/sites/lib/lang/sk_web_backup_list.lng | 1 + .../web/sites/lib/lang/tr_web_backup_list.lng | 1 + server/lib/classes/backup.inc.php | 1243 +++++++++++++---- .../plugins-available/backup_plugin.inc.php | 18 +- 56 files changed, 1192 insertions(+), 259 deletions(-) diff --git a/interface/lib/classes/plugin_backuplist.inc.php b/interface/lib/classes/plugin_backuplist.inc.php index 0b98dc9ec0..6fff24f611 100644 --- a/interface/lib/classes/plugin_backuplist.inc.php +++ b/interface/lib/classes/plugin_backuplist.inc.php @@ -160,7 +160,7 @@ class plugin_backuplist extends plugin_base { //* Get the data $server_ids = array(); - $web = $app->db->queryOneRecord("SELECT server_id FROM web_domain WHERE domain_id = ?", $this->form->id); + $web = $app->db->queryOneRecord("SELECT server_id, backup_format_web, backup_format_db, backup_password, backup_encrypt FROM web_domain WHERE domain_id = ?", $this->form->id); $databases = $app->db->queryAllRecords("SELECT server_id FROM web_database WHERE parent_domain_id = ?", $this->form->id); if($app->functions->intval($web['server_id']) > 0) $server_ids[] = $app->functions->intval($web['server_id']); if(is_array($databases) && !empty($databases)){ @@ -181,8 +181,33 @@ class plugin_backuplist extends plugin_base { $rec["bgcolor"] = $bgcolor; $rec['date'] = date($app->lng('conf_format_datetime'), $rec['tstamp']); + $backup_format = $rec['backup_format']; - if (empty($backup_format)) { + $backup_mode = $rec['backup_mode']; + if ($backup_mode == 'borg') { + // Get backup format from domain config + switch ($rec['backup_type']) { + case 'mysql': + $backup_format = $web['backup_format_db']; + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat('rootgz', 'mysql'); + } + $rec['filename'] .= self::getBackupDbExtension($backup_format); + break; + case 'web': + $backup_format = $web['backup_format_web']; + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($backup_mode, 'web'); + } + $rec['filename'] .= self::getBackupWebExtension($backup_format); + break; + default: + $app->log('Unsupported backup type "' . $rec['backup_type'] . '" for backup id ' . $rec['backup_id'], LOGLEVEL_ERROR); + break; + } + $rec['backup_password'] = $web['backup_encrypt'] == 'y' ? trim($web['backup_password']) : ''; + + } elseif (empty($backup_format)) { //We have a backup from old version of ISPConfig switch ($rec['backup_type']) { case 'mysql': @@ -210,7 +235,13 @@ class plugin_backuplist extends plugin_base { if($rec['server_id'] != $web['server_id']) $rec['download_available'] = false; if($rec['filesize'] > 0){ - $rec['filesize'] = $app->functions->currency_format($rec['filesize']/(1024*1024), 'client').' MB'; + $rec['filesize'] = $app->functions->currency_format($rec['filesize']/(1024*1024), 'client').' MB'; + if($backup_mode == "borg") { + $rec['filesize'] = '*' + . $rec['filesize']; + } } $records_new[] = $rec; @@ -235,6 +266,72 @@ class plugin_backuplist extends plugin_base { return $listTpl->grab(); } + /** + * Returns file extension for specified backup format + * @param string $format backup format + * @return string|null + * @author Ramil Valitov + */ + protected static function getBackupDbExtension($format) + { + $prefix = '.sql'; + switch ($format) { + case 'gzip': + return $prefix . '.gz'; + case 'bzip2': + return $prefix . '.bz2'; + case 'xz': + return $prefix . '.xz'; + case 'zip': + case 'zip_bzip2': + return '.zip'; + case 'rar': + return '.rar'; + } + if (strpos($format, "7z_") === 0) { + return $prefix . '.7z'; + } + return null; + } + + /** + * Returns file extension for specified backup format + * @param string $format backup format + * @return string|null + * @author Ramil Valitov + */ + protected static function getBackupWebExtension($format) + { + switch ($format) { + case 'tar_gzip': + return '.tar.gz'; + case 'tar_bzip2': + return '.tar.bz2'; + case 'tar_xz': + return '.tar.xz'; + case 'zip': + case 'zip_bzip2': + return '.zip'; + case 'rar': + return '.rar'; + } + if (strpos($format, "tar_7z_") === 0) { + return '.tar.7z'; + } + return null; + } + protected static function getDefaultBackupFormat($backup_mode, $backup_type) + { + //We have a backup from old version of ISPConfig + switch ($backup_type) { + case 'mysql': + return 'gzip'; + case 'web': + return ($backup_mode == 'userzip') ? 'zip' : 'tar_gzip'; + } + return ""; + } + } ?> diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index d5133f2a01..9de923ac8c 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -207,7 +207,7 @@ $form["tabs"]['server'] = array( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => 'userzip', - 'value' => array('userzip' => 'backup_mode_userzip', 'rootgz' => 'backup_mode_rootgz'), + 'value' => array('userzip' => 'backup_mode_userzip', 'rootgz' => 'backup_mode_rootgz', 'borg' => 'backup_mode_borg_txt'), 'width' => '40', 'maxlength' => '255' ), diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index ac03605279..b5d43392c8 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index b9d6e648ce..398e15db8f 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -174,6 +174,8 @@ $wb['connect_userid_to_webid_start_txt'] = 'Start ID for userid/webid connect'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index ac551c588c..51828f2e15 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -114,6 +114,8 @@ $wb['fastcgi_config_syntax_txt'] = 'Sintaxe das configurações do FastCGI'; $wb['backup_mode_txt'] = 'Modo do backup'; $wb['backup_mode_userzip'] = 'Arquivos de backup com propriedade do usuário web e compactados como zip'; $wb['backup_mode_rootgz'] = 'Todos os arquivos no diretório web com proprietário root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Faça backup de todos os arquivos no diretório vhost e bancos de dados em repositórios incrementais'; +$wb['backup_missing_utils_txt'] = 'O seguinte modo de backup não pode ser usado porque as ferramentas necessárias não estão instaladas:'; $wb['tmpdir_path_error_empty'] = 'Caminho do diretório temporário está vazio.'; $wb['tmpdir_path_error_regex'] = 'Caminho do diretório temporário é inválido.'; $wb['backup_time_txt'] = 'Hora do backup'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 25ed761836..1e048dad50 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -113,6 +113,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI config syntax'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['server_type_txt'] = 'Server Type'; $wb['nginx_vhost_conf_dir_txt'] = 'Nginx Vhost config dir'; $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Nginx Vhost config enabled dir'; diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index 6da8dfc0bb..9fa2a8e1d0 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -162,6 +162,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Režim zálohování'; $wb['backup_mode_userzip'] = 'Zálohování všech souborů v adresáři web jako uživatel vlastnící web adresář do souboru zip'; $wb['backup_mode_rootgz'] = 'Zálohování všech souborů v adresáři web jako uživatel root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Zálohujte všechny soubory v adresáři vhost a databázích do přírůstkových úložišť'; +$wb['backup_missing_utils_txt'] = 'Následující režim zálohování nelze použít, protože nejsou nainstalovány požadované nástroje:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(jednotlivé RBL databáze oddělujte čárkou)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index d0b43059c4..4877141a50 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -190,6 +190,8 @@ $wb['awstats_settings_txt'] = 'AWStats Einstellungen'; $wb['backup_mode_txt'] = 'Backupmodus'; $wb['backup_mode_userzip'] = 'Backup Dateien gehören dem Web Benutzer (.zip Datei)'; $wb['backup_mode_rootgz'] = 'Backup aller Dateien des Webverzeichnisses als Root Benutzer'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Maak een back-up van alle bestanden in de vhost-directory en databases in incrementele repositories'; +$wb['backup_missing_utils_txt'] = 'De volgende back-upmodus kan niet worden gebruikt omdat de vereiste tools niet zijn geïnstalleerd:'; $wb['backup_time_txt'] = 'Backupzeit'; $wb['firewall_txt'] = 'Firewall'; $wb['mailbox_quota_stats_txt'] = 'E-Mailkonto Beschränkung Statistiken'; diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index b1ebcec391..cc923d1959 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -100,6 +100,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI config syntax'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup webfiler ejet af web-bruger som zip'; $wb['backup_mode_rootgz'] = 'Backup alle filer i web mappe som root-bruger'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Sikkerhedskopier alle filer i vhost -bibliotek og databaser til inkrementelle lagre'; +$wb['backup_missing_utils_txt'] = 'Følgende backup -tilstand kan ikke bruges, fordi de nødvendige værktøjer ikke er installeret:'; $wb['server_type_txt'] = 'Server Type'; $wb['nginx_vhost_conf_dir_txt'] = 'Nginx Vhost config dir'; $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Nginx Vhost config enabled dir'; diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index b147f15e5c..2bcda04116 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 4125b2648e..a908cffb80 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -120,6 +120,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI config syntax'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['tmpdir_path_error_empty'] = 'tmp-dir Path is empty.'; $wb['tmpdir_path_error_regex'] = 'Invalid tmp-dir path.'; $wb['backup_time_txt'] = 'Backup time'; diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index 67e77efac8..b8f59c9ab3 100644 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -36,6 +36,8 @@ $wb['backup_dir_is_mount_txt'] = 'El directorio de copias de seguridad está mon $wb['backup_dir_mount_cmd_txt'] = 'Comando de montaje, si el directorio de copias de seguridad no está montado'; $wb['backup_dir_txt'] = 'Directorio para respaldos'; $wb['backup_mode_rootgz'] = 'Respaldar todos los archivos en el directorio web siendo root el propietario'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Respaldar todos los archivos en el directorio vhost y las bases de datos en repositorios incrementales'; +$wb['backup_missing_utils_txt'] = 'El siguiente modo de respaldo no se puede utilizar porque las herramientas necesarias no están instaladas:'; $wb['backup_mode_txt'] = 'Modo de respaldo'; $wb['backup_mode_userzip'] = 'Respaldar archivos web siendo el usuario el propietario en formato zip'; $wb['bind_group_error_empty'] = 'El grupo para BIND está vacío.'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index dac02a14b7..591a6df75f 100644 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index 0599b8bbed..692f9ab5f5 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -164,6 +164,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL’s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index e0894ceb82..8baa83beea 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index 97774f9ecd..dde66a317c 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index 814e963f64..0349aad4ca 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index f9e30f3937..09529e278f 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -164,6 +164,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Modalità di Backup'; $wb['backup_mode_userzip'] = 'Backup files siti web come utente web in formato zip'; $wb['backup_mode_rootgz'] = 'Backup di tutti i files nella cartella sito come utente root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Lista Real-Time Blackhole'; $wb['realtime_blackhole_list_note_txt'] = '(Separare RBL con le virgole)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 52ac44a351..ca56575953 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index e9e412b609..dba658411c 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index f9d43d3bfd..01fbf234c6 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Tryb tworzenia kopii'; $wb['backup_mode_userzip'] = 'Pliki kopii z prawami użytkownika jako zip'; $wb['backup_mode_rootgz'] = 'Twórz kopie wszystkich plików w katalogu web jako root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Twórz kopię wszystkich plików z katalogu vhost i baz danych w repozytoriach przyrostowych'; +$wb['backup_missing_utils_txt'] = 'Nie można użyć następującego trybu kopii zapasowej, ponieważ wymagane narzędzia nie są zainstalowane:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(oddziel RBL-e przecinkami)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index 468413a1de..0f52c114dd 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index e20fb9ee9f..f81d0cbb56 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index 1799b075f4..c134698d80 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Заменители:'; $wb['backup_mode_txt'] = 'Режим резервного копирования'; $wb['backup_mode_userzip'] = 'Делать резервные копии web файлов принадлежащих ползователю web как архив ZIP'; $wb['backup_mode_rootgz'] = 'Делать резервные копии всех файлов в веб-каталог как корневой пользователь'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Делать резервные копии всех файлов в каталоге vhost и базах данных в инкрементные репозитории'; +$wb['backup_missing_utils_txt'] = 'Следующий режим резервного копирования нельзя использовать, поскольку не установлены необходимые инструменты:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Разделяйте RBL запятыми)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index fe3c2e9234..ada1562fee 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index bc7f9f514b..39948a1c12 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -176,6 +176,8 @@ $wb['website_autoalias_note_txt'] = 'Placeholders:'; $wb['backup_mode_txt'] = 'Backup mode'; $wb['backup_mode_userzip'] = 'Backup web files owned by web user as zip'; $wb['backup_mode_rootgz'] = 'Backup all files in web directory as root user'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Real-time Blackhole List'; $wb['realtime_blackhole_list_note_txt'] = '(Separate RBL\'s with commas)'; $wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index 0d0c84f2c7..be980a321b 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -114,6 +114,8 @@ $wb['fastcgi_config_syntax_txt'] = 'FastCGI Ayar Yazımı'; $wb['backup_mode_txt'] = 'Yedekleme Kipi'; $wb['backup_mode_userzip'] = 'Web kullanıcısına ait web dosyaları ZIP biçiminde yedeklensin'; $wb['backup_mode_rootgz'] = 'Web klasöründeki tüm dosyalar root kullanıcısı olarak yedeklensin'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Vhost dizinindeki ve veritabanlarındaki tüm dosyaları artımlı depolara yedekleyin'; +$wb['backup_missing_utils_txt'] = 'Gerekli araçlar kurulu olmadığı için aşağıdaki yedekleme modu kullanılamaz:'; $wb['tmpdir_path_error_empty'] = 'tmp klasörü yolu boş olamaz.'; $wb['tmpdir_path_error_regex'] = 'tmp klasörü yolu geçersiz.'; $wb['backup_time_txt'] = 'Yedekleme Zamanı'; diff --git a/interface/web/admin/server_config_edit.php b/interface/web/admin/server_config_edit.php index 1fd1921b84..29384ea941 100644 --- a/interface/web/admin/server_config_edit.php +++ b/interface/web/admin/server_config_edit.php @@ -63,7 +63,10 @@ class page_action extends tform_actions { unset($app->tform->formDef["tabs"]["fastcgi"]); unset($app->tform->formDef["tabs"]["vlogger"]); } - + //Check if borg is installed + if (!$app->system->is_installed('borg')) { + $app->tpl->setVar('missing_utils', 'BorgBackup'); + } parent::onShow(); } diff --git a/interface/web/admin/templates/server_config_server_edit.htm b/interface/web/admin/templates/server_config_server_edit.htm index 394bf55278..1898f2bc55 100644 --- a/interface/web/admin/templates/server_config_server_edit.htm +++ b/interface/web/admin/templates/server_config_server_edit.htm @@ -1,4 +1,9 @@

    {tmpl_var name='server_name'}

    + +
    + {tmpl_var name='backup_missing_utils_txt'} {tmpl_var name='missing_utils'} +
    +
    diff --git a/interface/web/sites/lib/lang/ar_web_backup_list.lng b/interface/web/sites/lib/lang/ar_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/ar_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ar_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/bg_web_backup_list.lng b/interface/web/sites/lib/lang/bg_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/bg_web_backup_list.lng +++ b/interface/web/sites/lib/lang/bg_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/br_web_backup_list.lng b/interface/web/sites/lib/lang/br_web_backup_list.lng index 77580e3cc6..f718769c44 100644 --- a/interface/web/sites/lib/lang/br_web_backup_list.lng +++ b/interface/web/sites/lib/lang/br_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Backup manual'; $wb['make_backup_web_txt'] = 'Criar backup dos arquivos Web'; $wb['make_backup_database_txt'] = 'Criar backup dos bancos de dados'; $wb['make_backup_confirm_txt'] = 'Você está prestes a iniciar um processo de backup manual. Os backups manuais contam para o número total de cópias de backup permitidas: portanto, se o limite for excedido, os backups mais antigos podem ser excluídos automaticamente. Continuar?'; +$wb['final_size_txt'] = 'O tamanho final do download pode variar dependendo do formato de compressão selecionado.'; $wb['yes_txt'] = 'Sim'; $wb['no_txt'] = 'Não'; $wb['backup_is_encrypted_txt'] = 'Criptografado'; diff --git a/interface/web/sites/lib/lang/ca_web_backup_list.lng b/interface/web/sites/lib/lang/ca_web_backup_list.lng index af33c31142..fbb0495a98 100644 --- a/interface/web/sites/lib/lang/ca_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ca_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/cz_web_backup_list.lng b/interface/web/sites/lib/lang/cz_web_backup_list.lng index e6f80dac09..d06d69fa2d 100644 --- a/interface/web/sites/lib/lang/cz_web_backup_list.lng +++ b/interface/web/sites/lib/lang/cz_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Ruční zálohování'; $wb['make_backup_web_txt'] = 'Vytvořit zálohu webových souborů'; $wb['make_backup_database_txt'] = 'Vytvořit zálohu databází'; $wb['make_backup_confirm_txt'] = 'Chystáte se zahájit proces ručního zálohování. Ruční zálohy se započítávají do celkového počtu povolených záložních kopií: proto pokud bude limit překročen, mohou být nejstarší zálohy automaticky odstraněny. Pokračovat ?'; +$wb['final_size_txt'] = 'Konečná velikost stahování se může lišit v závislosti na zvoleném kompresním formátu.'; $wb['yes_txt'] = 'Ano'; $wb['no_txt'] = 'Ne'; $wb['backup_is_encrypted_txt'] = 'Šifrované'; diff --git a/interface/web/sites/lib/lang/de_web_backup_list.lng b/interface/web/sites/lib/lang/de_web_backup_list.lng index 790156206a..11ebcd0645 100644 --- a/interface/web/sites/lib/lang/de_web_backup_list.lng +++ b/interface/web/sites/lib/lang/de_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/dk_web_backup_list.lng b/interface/web/sites/lib/lang/dk_web_backup_list.lng index ba5b7234f8..1529fa1a96 100644 --- a/interface/web/sites/lib/lang/dk_web_backup_list.lng +++ b/interface/web/sites/lib/lang/dk_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/el_web_backup_list.lng b/interface/web/sites/lib/lang/el_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/el_web_backup_list.lng +++ b/interface/web/sites/lib/lang/el_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/en_web_backup_list.lng b/interface/web/sites/lib/lang/en_web_backup_list.lng index f2cde7f216..571f3959b8 100644 --- a/interface/web/sites/lib/lang/en_web_backup_list.lng +++ b/interface/web/sites/lib/lang/en_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/es_web_backup_list.lng b/interface/web/sites/lib/lang/es_web_backup_list.lng index 61a7e83cb1..fb8a547202 100644 --- a/interface/web/sites/lib/lang/es_web_backup_list.lng +++ b/interface/web/sites/lib/lang/es_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/fi_web_backup_list.lng b/interface/web/sites/lib/lang/fi_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/fi_web_backup_list.lng +++ b/interface/web/sites/lib/lang/fi_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/fr_web_backup_list.lng b/interface/web/sites/lib/lang/fr_web_backup_list.lng index 1c3bd84662..49da9188a1 100644 --- a/interface/web/sites/lib/lang/fr_web_backup_list.lng +++ b/interface/web/sites/lib/lang/fr_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/hr_web_backup_list.lng b/interface/web/sites/lib/lang/hr_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/hr_web_backup_list.lng +++ b/interface/web/sites/lib/lang/hr_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/hu_web_backup_list.lng b/interface/web/sites/lib/lang/hu_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/hu_web_backup_list.lng +++ b/interface/web/sites/lib/lang/hu_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/id_web_backup_list.lng b/interface/web/sites/lib/lang/id_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/id_web_backup_list.lng +++ b/interface/web/sites/lib/lang/id_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/it_web_backup_list.lng b/interface/web/sites/lib/lang/it_web_backup_list.lng index 67cacff864..08f3b48e84 100644 --- a/interface/web/sites/lib/lang/it_web_backup_list.lng +++ b/interface/web/sites/lib/lang/it_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/ja_web_backup_list.lng b/interface/web/sites/lib/lang/ja_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/ja_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ja_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/nl_web_backup_list.lng b/interface/web/sites/lib/lang/nl_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/nl_web_backup_list.lng +++ b/interface/web/sites/lib/lang/nl_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/pl_web_backup_list.lng b/interface/web/sites/lib/lang/pl_web_backup_list.lng index dfdd53c25f..6185db50a3 100644 --- a/interface/web/sites/lib/lang/pl_web_backup_list.lng +++ b/interface/web/sites/lib/lang/pl_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/pt_web_backup_list.lng b/interface/web/sites/lib/lang/pt_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/pt_web_backup_list.lng +++ b/interface/web/sites/lib/lang/pt_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/ro_web_backup_list.lng b/interface/web/sites/lib/lang/ro_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/ro_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ro_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/ru_web_backup_list.lng b/interface/web/sites/lib/lang/ru_web_backup_list.lng index 2a92f2761b..3569ae7c09 100644 --- a/interface/web/sites/lib/lang/ru_web_backup_list.lng +++ b/interface/web/sites/lib/lang/ru_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/se_web_backup_list.lng b/interface/web/sites/lib/lang/se_web_backup_list.lng index 8e0167aa13..3f210ecc42 100644 --- a/interface/web/sites/lib/lang/se_web_backup_list.lng +++ b/interface/web/sites/lib/lang/se_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/sk_web_backup_list.lng b/interface/web/sites/lib/lang/sk_web_backup_list.lng index 8f0d3a7469..0f19d9339e 100644 --- a/interface/web/sites/lib/lang/sk_web_backup_list.lng +++ b/interface/web/sites/lib/lang/sk_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/interface/web/sites/lib/lang/tr_web_backup_list.lng b/interface/web/sites/lib/lang/tr_web_backup_list.lng index 51bca34f2e..c61a5ab018 100644 --- a/interface/web/sites/lib/lang/tr_web_backup_list.lng +++ b/interface/web/sites/lib/lang/tr_web_backup_list.lng @@ -30,6 +30,7 @@ $wb['manual_backup_title_txt'] = 'Manual backup'; $wb['make_backup_web_txt'] = 'Make backup of web files'; $wb['make_backup_database_txt'] = 'Make backup of databases'; $wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; +$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; $wb['yes_txt'] = 'Yes'; $wb['no_txt'] = 'No'; $wb['backup_is_encrypted_txt'] = 'Encrypted'; diff --git a/server/lib/classes/backup.inc.php b/server/lib/classes/backup.inc.php index 3cdf17d1fc..2b6d21e57e 100644 --- a/server/lib/classes/backup.inc.php +++ b/server/lib/classes/backup.inc.php @@ -32,6 +32,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * Class backup * All code that makes actual backup and restore of web files and database is here. * @author Ramil Valitov + * @author Jorge Muñoz (Repository addition) * @see backup::run_backup() to run a single backup * @see backup::run_all_backups() to run all backups * @see backup::restoreBackupDatabase() to restore a database @@ -93,6 +94,16 @@ class backup } return null; } + /** + * Checks whatever a backup mode is for a repository + * @param $mode Backup mode + * @return bool + * @author Jorge Muñoz + */ + protected static function backupModeIsRepos($mode) + { + return 'borg' === $mode; + } /** * Sets file ownership to $web_user for all files and folders except log, ssl and web/stats @@ -148,6 +159,7 @@ class backup * @return bool true if succeeded * @see backup_plugin::mount_backup_dir() * @author Ramil Valitov + * @author Jorge Muñoz */ public static function restoreBackupDatabase($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type) { @@ -155,60 +167,116 @@ class backup //* Load sql dump into db include 'lib/mysql_clientdb.conf'; + if (self::backupModeIsRepos($backup_mode)) { - if (empty($backup_format)) { - $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); - } - $extension = self::getBackupDbExtension($backup_format); - if (!empty($extension)) { - //Replace dots for preg_match search - $extension = str_replace('.', '\.', $extension); - } - $success = false; - $full_filename = $backup_dir . '/' . $filename; + $backup_archive = $filename; + + preg_match('@^(manual-)?db_(?P.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$@', $backup_archive, $matches); + if (isset($matches['db']) && ! empty($matches['db'])) { + $db_name = $matches['db']; + $backup_repos_folder = self::getReposFolder($backup_mode, 'mysql', '_' . $db_name); + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + + $app->log('Restoring MySQL backup from archive ' . $backup_archive . ', backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $password); + } else { + $app->log('Failed to detect database name during restore of ' . $backup_archive, LOGLEVEL_ERROR); + $db_name = null; + $archives = null; + } + if (is_array($archives)) { + if (in_array($backup_archive, $archives)) { + switch ($backup_mode) { + case "borg": + $command = self::getBorgCommand('borg extract --nobsdflags', $password); + $command .= " --stdout ? stdin | mysql -h ? -u ? -p? ?"; + break; + } + } else { + $app->log('Failed to process MySQL backup ' . $full_archive_path . ' because it does not exist', LOGLEVEL_ERROR); + $command = null; + } + } + if (!empty($command)) { + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, $full_archive_path, $clientdb_host, $clientdb_user, $clientdb_password, $db_name); + $retval = $app->system->last_exec_retcode(); + if ($retval == 0) { + $app->log('Restored database backup ' . $full_archive_path, LOGLEVEL_DEBUG); + $success = true; + } else { + $app->log('Failed to restore database backup ' . $full_archive_path . ', exit code ' . $retval, LOGLEVEL_ERROR); + } + } + } else { + if (empty($backup_format)) { + $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); + } + $extension = self::getBackupDbExtension($backup_format); + if (!empty($extension)) { + //Replace dots for preg_match search + $extension = str_replace('.', '\.', $extension); + } + $success = false; + $full_filename = $backup_dir . '/' . $filename; - $app->log('Restoring MySQL backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + $app->log('Restoring MySQL backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); - if (file_exists($full_filename) && !empty($extension)) { preg_match('@^(manual-)?db_(?P.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}' . $extension . '$@', $filename, $matches); if (!isset($matches['db']) || empty($matches['db'])) { $app->log('Failed to detect database name during restore of ' . $full_filename, LOGLEVEL_ERROR); - return false; + $db_name = null; + } else { + $db_name = $matches['db']; } - $db_name = $matches['db']; - switch ($backup_format) { - case "gzip": - $command = "gunzip --stdout ? | mysql -h ? -u ? -p? ?"; - break; - case "zip": - case "zip_bzip2": - $command = "unzip -qq -p -P " . escapeshellarg($password) . " ? | mysql -h ? -u ? -p? ?"; - break; - case "bzip2": - $command = "bunzip2 -q -c ? | mysql -h ? -u ? -p? ?"; - break; - case "xz": - $command = "unxz -q -q -c ? | mysql -h ? -u ? -p? ?"; - break; - case "rar": + + if ( ! empty($db_name)) { + $file_check = file_exists($full_filename) && !empty($extension); + if ( ! $file_check) { + $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_WARN); + } + } else { + $file_check = false; + } + if ($file_check) { + switch ($backup_format) { + case "gzip": + $command = "gunzip --stdout ? | mysql -h ? -u ? -p? ?"; + break; + case "zip": + case "zip_bzip2": + $command = "unzip -qq -p -P " . escapeshellarg($password) . " ? | mysql -h ? -u ? -p? ?"; + break; + case "bzip2": + $command = "bunzip2 -q -c ? | mysql -h ? -u ? -p? ?"; + break; + case "xz": + $command = "unxz -q -q -c ? | mysql -h ? -u ? -p? ?"; + break; + case "rar": + //First, test that the archive is correct and we have a correct password + $options = self::getUnrarOptions($password); + $app->system->exec_safe("rar t " . $options . " ?", $full_filename); + if ($app->system->last_exec_retcode() == 0) { + $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); + $command = "rar x " . $options. " ? | mysql -h ? -u ? -p? ?"; + } + break; + } + if (strpos($backup_format, "7z_") === 0) { + $options = self::get7zDecompressOptions($password); //First, test that the archive is correct and we have a correct password - $options = self::getUnrarOptions($password); - $app->system->exec_safe("rar t " . $options . " ?", $full_filename); + $app->system->exec_safe("7z t " . $options . " ?", $full_filename); if ($app->system->last_exec_retcode() == 0) { $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = "rar x " . $options. " ? | mysql -h ? -u ? -p? ?"; - } - break; - } - if (strpos($backup_format, "7z_") === 0) { - $options = self::get7zDecompressOptions($password); - //First, test that the archive is correct and we have a correct password - $app->system->exec_safe("7z t " . $options . " ?", $full_filename); - if ($app->system->last_exec_retcode() == 0) { - $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = "7z x " . $options . " -so ? | mysql -h ? -u ? -p? ?"; - } else - $command = null; + $command = "7z x " . $options . " -so ? | mysql -h ? -u ? -p? ?"; + } else + $command = null; + } } if (!empty($command)) { /** @var string $clientdb_host */ @@ -220,13 +288,9 @@ class backup $app->log('Restored MySQL backup ' . $full_filename, LOGLEVEL_DEBUG); $success = true; } else { - $app->log('Failed to restore web backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + $app->log('Failed to restore MySQL backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); } - } else { - $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); } - } else { - $app->log('Failed to process MySQL backup ' . $full_filename, LOGLEVEL_ERROR); } unset($clientdb_host); unset($clientdb_user); @@ -250,118 +314,337 @@ class backup * @return bool true if succeed * @see backup_plugin::mount_backup_dir() * @author Ramil Valitov + * @author Jorge Muñoz */ public static function restoreBackupWebFiles($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type, $web_root, $web_user, $web_group) { global $app; - if (empty($backup_format)) { - $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); - } - $full_filename = $backup_dir . '/' . $filename; $result = false; - $app->log('Restoring web backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + $app->system->web_folder_protection($web_root, false); + if (self::backupModeIsRepos($backup_mode)) { + $backup_archive = $filename; + $backup_repos_folder = self::getReposFolder($backup_mode, 'web'); + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + + $app->log('Restoring web backup archive ' . $full_archive_path . ', backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $password); + if (is_array($archives) && in_array($backup_archive, $archives)) { + $retval = 0; + switch ($backup_mode) { + case "borg": + $command = 'cd ? && borg extract --nobsdflags ?'; + $app->system->exec_safe($command, $web_root, $full_archive_path); + $retval = $app->system->last_exec_retcode(); + $success = ($retval == 0 || $retval == 1); + break; + } + if ($success) { + $app->log('Restored web backup ' . $full_archive_path, LOGLEVEL_DEBUG); + $result = true; + } else { + $app->log('Failed to restore web backup ' . $full_archive_path . ', exit code ' . $retval, LOGLEVEL_ERROR); + } + } else { + $app->log('Web backup archive does not exist ' . $full_archive_path, LOGLEVEL_ERROR); + } - if (!empty($backup_format)) { - $app->system->web_folder_protection($web_root, false); - if ($backup_mode == 'userzip' || $backup_mode == 'rootgz') { - $user_mode = $backup_mode == 'userzip'; - $filename = $user_mode ? ($web_root . '/backup/' . $filename) : $full_filename; + } elseif ($backup_mode == 'userzip' || $backup_mode == 'rootgz') { - if (file_exists($full_filename) && $web_root != '' && $web_root != '/' && !stristr($full_filename, '..') && !stristr($full_filename, 'etc')) { - if ($user_mode) { - if (file_exists($filename)) rename($filename, $filename . '.bak'); - copy($full_filename, $filename); - chgrp($filename, $web_group); - } - $user_prefix_cmd = $user_mode ? 'sudo -u ' . escapeshellarg($web_user) : ''; - $success = false; - $retval = 0; - switch ($backup_format) { - case "tar_gzip": - case "tar_bzip2": - case "tar_xz": - $command = $user_prefix_cmd . ' tar xf ? --directory ?'; - $app->system->exec_safe($command, $filename, $web_root); - $retval = $app->system->last_exec_retcode(); - $success = ($retval == 0 || $retval == 2); - break; - case "zip": - case "zip_bzip2": - $command = $user_prefix_cmd . ' unzip -qq -P ' . escapeshellarg($password) . ' -o ? -d ? 2> /dev/null'; - $app->system->exec_safe($command, $filename, $web_root); - $retval = $app->system->last_exec_retcode(); - /* - * Exit code 50 can happen when zip fails to overwrite files that do not - * belong to selected user, so we can consider this situation as success - * with warnings. - */ - $success = ($retval == 0 || $retval == 50); - if ($success) { - self::restoreFileOwnership($web_root, $web_user, $web_group); - } - break; - case 'rar': - $options = self::getUnRarOptions($password); - //First, test that the archive is correct and we have a correct password - $command = $user_prefix_cmd . " rar t " . $options . " ? ?"; - //Rar requires trailing slash - $app->system->exec_safe($command, $filename, $web_root . '/'); - $success = ($app->system->last_exec_retcode() == 0); - if ($success) { - //All good, now we can extract - $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = $user_prefix_cmd . " rar x " . $options . " ? ?"; - //Rar requires trailing slash - $app->system->exec_safe($command, $filename, $web_root . '/'); - $retval = $app->system->last_exec_retcode(); - //Exit code 9 can happen when we have file permission errors, in this case some - //files will be skipped during extraction. - $success = ($retval == 0 || $retval == 1 || $retval == 9); - } else { - $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); - } - break; - } - if (strpos($backup_format, "tar_7z_") === 0) { - $options = self::get7zDecompressOptions($password); + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); + } + $full_filename = $backup_dir . '/' . $filename; + + $app->log('Restoring web backup ' . $full_filename . ', backup format "' . $backup_format . '", backup mode "' . $backup_mode . '"', LOGLEVEL_DEBUG); + + $user_mode = $backup_mode == 'userzip'; + $filename = $user_mode ? ($web_root . '/backup/' . $filename) : $full_filename; + + if (file_exists($full_filename) && $web_root != '' && $web_root != '/' && !stristr($full_filename, '..') && !stristr($full_filename, 'etc')) { + if ($user_mode) { + if (file_exists($filename)) rename($filename, $filename . '.bak'); + copy($full_filename, $filename); + chgrp($filename, $web_group); + } + $user_prefix_cmd = $user_mode ? 'sudo -u ' . escapeshellarg($web_user) : ''; + $success = false; + $retval = 0; + switch ($backup_format) { + case "tar_gzip": + case "tar_bzip2": + case "tar_xz": + $command = $user_prefix_cmd . ' tar xf ? --directory ?'; + $app->system->exec_safe($command, $filename, $web_root); + $retval = $app->system->last_exec_retcode(); + $success = ($retval == 0 || $retval == 2); + break; + case "zip": + case "zip_bzip2": + $command = $user_prefix_cmd . ' unzip -qq -P ' . escapeshellarg($password) . ' -o ? -d ? 2> /dev/null'; + $app->system->exec_safe($command, $filename, $web_root); + $retval = $app->system->last_exec_retcode(); + /* + * Exit code 50 can happen when zip fails to overwrite files that do not + * belong to selected user, so we can consider this situation as success + * with warnings. + */ + $success = ($retval == 0 || $retval == 50); + if ($success) { + self::restoreFileOwnership($web_root, $web_user, $web_group); + } + break; + case 'rar': + $options = self::getUnRarOptions($password); //First, test that the archive is correct and we have a correct password - $command = $user_prefix_cmd . " 7z t " . $options . " ?"; - $app->system->exec_safe($command, $filename); + $command = $user_prefix_cmd . " rar t " . $options . " ? ?"; + //Rar requires trailing slash + $app->system->exec_safe($command, $filename, $web_root . '/'); $success = ($app->system->last_exec_retcode() == 0); if ($success) { //All good, now we can extract $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); - $command = $user_prefix_cmd . " 7z x " . $options . " -so ? | tar xf - --directory ?"; - $app->system->exec_safe($command, $filename, $web_root); + $command = $user_prefix_cmd . " rar x " . $options . " ? ?"; + //Rar requires trailing slash + $app->system->exec_safe($command, $filename, $web_root . '/'); $retval = $app->system->last_exec_retcode(); - $success = ($retval == 0 || $retval == 2); + //Exit code 9 can happen when we have file permission errors, in this case some + //files will be skipped during extraction. + $success = ($retval == 0 || $retval == 1 || $retval == 9); } else { $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); } - } - if ($user_mode) { - unlink($filename); - if (file_exists($filename . '.bak')) rename($filename . '.bak', $filename); - } + break; + } + if (strpos($backup_format, "tar_7z_") === 0) { + $options = self::get7zDecompressOptions($password); + //First, test that the archive is correct and we have a correct password + $command = $user_prefix_cmd . " 7z t " . $options . " ?"; + $app->system->exec_safe($command, $filename); + $success = ($app->system->last_exec_retcode() == 0); if ($success) { - $app->log('Restored web backup ' . $full_filename, LOGLEVEL_DEBUG); - $result = true; + //All good, now we can extract + $app->log('Archive test passed for ' . $full_filename, LOGLEVEL_DEBUG); + $command = $user_prefix_cmd . " 7z x " . $options . " -so ? | tar xf - --directory ?"; + $app->system->exec_safe($command, $filename, $web_root); + $retval = $app->system->last_exec_retcode(); + $success = ($retval == 0 || $retval == 2); } else { - $app->log('Failed to restore web backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + $app->log('Archive test failed for ' . $full_filename, LOGLEVEL_DEBUG); } } - } else { - $app->log('Failed to restore web backup ' . $full_filename . ', backup mode "' . $backup_mode . '" not recognized.', LOGLEVEL_DEBUG); + if ($user_mode) { + unlink($filename); + if (file_exists($filename . '.bak')) rename($filename . '.bak', $filename); + } + if ($success) { + $app->log('Restored web backup ' . $full_filename, LOGLEVEL_DEBUG); + $result = true; + } else { + $app->log('Failed to restore web backup ' . $full_filename . ', exit code ' . $retval, LOGLEVEL_ERROR); + } } - $app->system->web_folder_protection($web_root, true); } else { - $app->log('Failed to restore web backup ' . $full_filename . ', backup format not recognized.', LOGLEVEL_DEBUG); + $app->log('Failed to restore web backup ' . $full_filename . ', backup mode "' . $backup_mode . '" not recognized.', LOGLEVEL_DEBUG); } + $app->system->web_folder_protection($web_root, true); return $result; } + /** + * Deletes backup copy + * @param string $backup_format + * @param string $backup_password + * @param string $backup_dir + * @param string $filename + * @param string $backup_mode + * @param string $backup_type + * @param int $domain_id + * @param bool true on success + * @author Jorge Muñoz + */ + public static function deleteBackup($backup_format, $backup_password, $backup_dir, $filename, $backup_mode, $backup_type, $domain_id) { + global $app, $conf; + $server_id = $conf['server_id']; + $success = false; + + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($backup_mode, $backup_type); + } + if(self::backupModeIsRepos($backup_mode)) { + $repos_password = ''; + $backup_archive = $filename; + $backup_repos_folder = self::getBackupReposFolder($backup_mode, $backup_type); + if ($backup_type != 'web') { + preg_match('@^(manual-)?db_(?P.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$@', $backup_archive, $matches); + if (!isset($matches['db']) || empty($matches['db'])) { + $app->log('Failed to detect database name during delete of ' . $backup_archive, LOGLEVEL_ERROR); + return false; + } + $db_name = $matches['db']; + $backup_repos_folder .= '_' . $db_name; + } + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $repos_password); + if (is_array($archives) && in_array($backup_archive, $archives)) { + $success = self::deleteArchive($backup_mode, $backup_repos_path, $backup_archive, $repos_password); + } else { + $success = true; + } + } else { + if(file_exists($backup_dir.'/'.$filename) && !stristr($backup_dir.'/'.$filename, '..') && !stristr($backup_dir.'/'.$filename, 'etc')) { + $success = unlink($backup_dir.'/'.$filename); + } else { + $success = true; + } + } + if ($success) { + $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; + $app->db->query($sql, $server_id, $domain_id, $filename); + if($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $domain_id, $filename); + $app->log($sql . ' - ' . json_encode([$server_id, $domain_id, $filename]), LOGLEVEL_DEBUG); + } + return $success; + } + /** + * Downloads the backup copy + * @param string $backup_format + * @param string $password + * @param string $backup_dir + * @param string $filename + * @param string $backup_mode + * @param string $backup_type + * @param array $domain web_domain record + * @param bool true on success + * @author Jorge Muñoz + */ + public static function downloadBackup($backup_format, $password, $backup_dir, $filename, $backup_mode, $backup_type, $domain) + { + global $app; + + $success = false; + + if (self::backupModeIsRepos($backup_mode)) { + $backup_archive = $filename; + //When stored in repos, we first get target backup format to generate final download file + $repos_password = ''; + $server_id = $domain['server_id']; + $password = $domain['backup_encrypt'] == 'y' ? trim($domain['backup_password']) : ''; + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $backup_tmp = trim($server_config['backup_tmp']); + + if ($backup_type == 'web') { + $backup_format = $domain['backup_format_web']; + if (empty($backup_format) || $backup_format == 'default') { + $backup_format = self::getDefaultBackupFormat($server_backup_mode, 'web'); + } + $backup_repos_folder = self::getBackupReposFolder($backup_mode, 'web'); + $extension = self::getBackupWebExtension($backup_format); + } else { + if (preg_match('@^(manual-)?db_(?P.+)_\d{4}-\d{2}-\d{2}_\d{2}-\d{2}$@', $backup_archive, $matches)) { + $db_name = $matches['db']; + $backup_format = $domain['backup_format_db']; + if (empty($backup_format)) { + $backup_format = self::getDefaultBackupFormat($server_backup_mode, $backup_type); + } + $backup_repos_folder = self::getBackupReposFolder($backup_mode, $backup_type) . '_' . $db_name; + $extension = self::getBackupDbExtension($backup_format); + } else { + $app->log('Failed to detect database name during download of ' . $backup_archive, LOGLEVEL_ERROR); + $db_name = null; + } + } + if ( ! empty($extension)) { + $filename .= $extension; + $backup_repos_path = $backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + $archives = self::getReposArchives($backup_mode, $backup_repos_path, $repos_password); + } else { + $archives = null; + } + if (is_array($archives)) { + if (in_array($backup_archive, $archives)) { + $app->log('Extracting ' . $backup_type . ' backup from repository archive '.$full_archive_path. ' to ' . $domain['document_root'].'/backup/' . $filename, LOGLEVEL_DEBUG); + switch ($backup_mode) { + case 'borg': + if ($backup_type == 'mysql') { + if (strpos($extension, '.sql.gz') === 0 || strpos($extension, '.sql.bz2') === 0) { + //* .sql.gz and .sql.bz2 don't need a source file, so we can just pipe through the compression command + $ccmd = strpos($extension, '.sql.gz') === 0 ? 'gzip' : 'bzip2'; + $command = self::getBorgCommand('borg extract', $repos_password) . ' --stdout ? stdin | ' . $ccmd . ' -c > ?'; + $success = $app->system->exec_safe($command, $full_archive_path, $domain['document_root'].'/backup/'.$filename) == 0; + } else { + $tmp_extract = $backup_tmp . '/' . $backup_archive . '.sql'; + if (file_exists($tmp_extract)) { + unlink($tmp_extract); + } + $command = self::getBorgCommand('borg extract', $repos_password) . ' --stdout ? stdin > ?'; + $app->system->exec_safe($command, $full_archive_path, $tmp_extract); + } + } else { + if (strpos($extension, '.tar') === 0 && ($password == '' || strpos($extension, '.tar.7z') !== 0)) { + //* .tar.gz, .tar.bz2, etc are supported via borg export-tar, if they don't need encryption + $command = self::getBorgCommand('borg export-tar', $repos_password) . ' ? ?'; + $app->system->exec_safe($command, $full_archive_path, $domain['document_root'].'/backup/'.$filename); + $success = $app->system->last_exec_retcode() == 0; + } else { + $tmp_extract = tempnam($backup_tmp, $backup_archive); + unlink($tmp_extract); + mkdir($tmp_extract); + $command = 'cd ' . $tmp_extract . ' && ' . self::getBorgCommand('borg extract --nobsdflags', $repos_password) . ' ?'; + $app->system->exec_safe($command, $full_archive_path); + if ($app->system->last_exec_retcode() != 0) { + $app->log('Extraction of ' . $full_archive_path . ' into ' . $tmp_extract . ' failed.', LOGLEVEL_ERROR); + $tmp_extract = null; + } + } + } + break; + } + if ( ! empty($tmp_extract)) { + if (is_dir($tmp_extract)) { + $web_config = $app->getconf->get_server_config($server_id, 'web'); + $http_server_user = $web_config['user']; + $success = self::runWebCompression($backup_format, [], 'rootgz', $tmp_extract, $domain['document_root'].'/backup/', $filename, $domain['system_user'], $domain['system_group'], $http_server_user, $backup_tmp, $password); + } else { + self::runDatabaseCompression($backup_format, dirname($tmp_extract), basename($tmp_extract), $filename, $backup_tmp, $password) + AND $success = rename(dirname($tmp_extract) . '/' . $filename, $domain['document_root'].'/backup/'. $filename); + } + if ($success) { + $app->system->exec_safe('rm -Rf ?', $tmp_extract); + } else { + $app->log('Failed to run compression of ' . $tmp_extract . ' into ' . $domain['document_root'].'/backup/' . $filename . ' failed.', LOGLEVEL_ERROR); + } + } + } else { + $app->log('Failed to find archive ' . $full_archive_path . ' for download', LOGLEVEL_ERROR); + } + } + if ($success) { + $app->log('Download of archive ' . $full_archive_path . ' into ' . $domain['document_root'].'/backup/'.$filename . ' succeeded.', LOGLEVEL_DEBUG); + } + } + //* Copy the backup file to the backup folder of the website + elseif(file_exists($backup_dir.'/'.$filename) && file_exists($domain['document_root'].'/backup/') && !stristr($backup_dir.'/'.$filename, '..') && !stristr($backup_dir.'/'.$filename, 'etc')) { + $success = copy($backup_dir.'/'.$filename, $domain['document_root'].'/backup/'.$filename); + } + if (file_exists($domain['document_root'].'/backup/'.$filename)) { + chgrp($domain['document_root'].'/backup/'.$filename, $domain['system_group']); + chown($domain['document_root'].'/backup/'.$filename, $domain['system_user']); + chmod($domain['document_root'].'/backup/'.$filename,0600); + $app->log('Ready '.$domain['document_root'].'/backup/'.$filename, LOGLEVEL_DEBUG); + return true; + } else { + $app->log('Failed download of '.$domain['document_root'].'/backup/'.$filename , LOGLEVEL_ERROR); + return false; + } + } + + /** * Returns a compression method, for example returns bzip2 for tar_7z_bzip2 * @param string $format @@ -688,6 +971,139 @@ class backup return $options; } + /** + * Get borg command with password appended to the base command + * @param $command Base command to add password to + * @param $password Password to add + * @param $is_new Specify if command is for a new borg repository initialization + */ + protected static function getBorgCommand($command, $password, $is_new = false) + { + if ($password) { + if ($is_new) { + return "BORG_NEW_PASSPHRASE='" . escapeshellarg($password) . "' " . $command; + } + return "BORG_PASSPHRASE='" . escapeshellarg($password) . "' " . $command; + } + return $command; + } + /** + * Obtains command line options for "borg create" command. + * @param string $compression Compression options are validated and fixed if necessary. + * See: https://borgbackup.readthedocs.io/en/stable/internals/data-structures.html#compression + * @return string + * @author Jorge Muñoz + */ + protected static function getBorgCreateOptions($compression) + { + global $app; + + //* Validate compression + + $C = explode(',', $compression); + if (count($C) > 2) { + $app->log("Invalid compression option " . $C[2] . " from compression " . $compression . ".", LOGLEVEL_WARN); + $compression = $C[0] . ',' . $C[1]; + $C = [$C[0], $C[1]]; + } + if (count($C) > 1 && ! ctype_digit($C[1])) { + $app->log("Invalid compression option " . $C[1] . " from compression " . $compression . ".", LOGLEVEL_WARN); + $compression = $C[0]; + $C = [$C[0]]; + } + + switch ($C[0]) { + case 'none': + case 'lz4': + if (count($C) > 1) { + $app->log("Invalid compression format " . $compression . '. Defaulting to ' . $C[0] . '.', LOGLEVEL_WARN); + $compression = $C[0]; + } + break; + case 'zstd': + //* Check borg version + list(,$ver) = explode(' ', exec('borg --version')); + if (version_compare($ver, '1.1.4') < 0) { + $app->log("Current borg version " . $ver . " does not support compression format " . $compression . '. Defaulting to zlib.', LOGLEVEL_WARN); + $compression = 'zlib'; + } elseif (count($C) > 1 && ($C[1] < 1 || $C[1] > 22)) { + $app->log("Invalid compression format " . $compression . '. Defaulting to zstd.', LOGLEVEL_WARN); + $compression = 'zstd'; + } + break; + case 'zlib': + case 'lzma': + if (count($C) > 1 && ($C[1] < 0 || $C[1] > 9)) { + $app->log("Invalid compression format " . $compression . '. Defaulting to ' . $C[0] . '.', LOGLEVEL_WARN); + $compression = $C[0]; + } + break; + default: + $app->log("Unsupported borg compression format " . $compression . '. Defaulting to zlib.', LOGLEVEL_WARN); + $compression = 'zlib'; + } + + $options = array( + /** + * -C --compression + */ + '-C ' . $compression, + /** + * Excludes directories that contain CACHEDIR.TAG + */ + '--exclude-caches', + /** + * specify the chunker parameters (CHUNK_MIN_EXP, CHUNK_MAX_EXP, HASH_MASK_BITS, HASH_WINDOW_SIZE). + * @see https://borgbackup.readthedocs.io/en/stable/internals/data-structures.html#chunker-details + * Default: 19,23,21,4095 + */ + //'--chunker-params 19,23,21,4095', + ); + $options = implode(" ", $options); + return $options; + } + + /** + * Gets a list of repository archives + * @param string $backup_mode + * @param string $repos_path absolute path to repository + * @param string $password repository password or empty string if none + * @param string $list_format Supports either 'short' or 'json' + * @return array + * @author Jorge Muñoz + */ + protected static function getReposArchives($backup_mode, $repos_path, $password, $list_format = 'short') + { + global $app; + if ( ! is_dir($repos_path)) { + $app->log("Unknown path " . var_export($repos_path, TRUE) + . ' called from ' . (function() { + $dbt = debug_backtrace(); + return $dbt[1]['file'] . ':' . $dbt[1]['line']; + })(), LOGLEVEL_ERROR); + return FALSE; + } + switch ($backup_mode) { + case 'borg': + + $command = self::getBorgCommand('borg list', $password); + + if ($list_format == 'json') { + $command_opts = '--json'; + } else { + $command_opts = '--short'; + } + + $app->system->exec_safe($command . ' ' . $command_opts . ' ?', $repos_path); + + if ($app->system->last_exec_retcode() == 0) { + return array_map('trim', $app->system->last_exec_out()); + } + break; + } + return FALSE; + } + /** * Clears expired backups. * The backup directory must be mounted before calling this method. @@ -699,36 +1115,108 @@ class backup * @see backup_plugin::backups_garbage_collection() call this method first * @see backup_plugin::mount_backup_dir() * @author Ramil Valitov + * @author Jorge Muñoz */ protected static function clearBackups($server_id, $web_id, $max_backup_copies, $backup_dir, $prefix_list=null) { global $app; - $files = self::get_files($backup_dir, $prefix_list); - usort($files, function ($a, $b) use ($backup_dir) { - $time_a = filemtime($backup_dir . '/' . $a); - $time_b = filemtime($backup_dir . '/' . $b); - return ($time_a > $time_b) ? -1 : 1; - }); + $server_config = $app->getconf->get_server_config($server_id, 'server'); + $backup_mode = $server_config['backup_mode']; + //@todo obtain password from server config + $password = NULL; $db_list = array($app->db); if ($app->db->dbHost != $app->dbmaster->dbHost) array_push($db_list, $app->dbmaster); - //Delete old files that are beyond the limit - for ($n = $max_backup_copies; $n < sizeof($files); $n++) { - $filename = $files[$n]; - $full_filename = $backup_dir . '/' . $filename; - $app->log('Backup file ' . $full_filename . ' is beyond the limit of ' . $max_backup_copies . " copies and will be deleted from disk and database", LOGLEVEL_DEBUG); - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - foreach ($db_list as $db) { - $db->query($sql, $server_id, $web_id, $filename); + if ($backup_mode == "userzip" || $backup_mode == "rootgz") { + $files = self::get_files($backup_dir, $prefix_list); + usort($files, function ($a, $b) use ($backup_dir) { + $time_a = filemtime($backup_dir . '/' . $a); + $time_b = filemtime($backup_dir . '/' . $b); + return ($time_a > $time_b) ? -1 : 1; + }); + + //Delete old files that are beyond the limit + for ($n = $max_backup_copies; $n < sizeof($files); $n++) { + $filename = $files[$n]; + $full_filename = $backup_dir . '/' . $filename; + $app->log('Backup file ' . $full_filename . ' is beyond the limit of ' . $max_backup_copies . " copies and will be deleted from disk and database", LOGLEVEL_DEBUG); + $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; + foreach ($db_list as $db) { + $db->query($sql, $server_id, $web_id, $filename); + } + @unlink($full_filename); + } + } elseif (self::backupModeIsRepos($backup_mode)) { + $repos_archives = self::getAllArchives($backup_dir, $backup_mode, $password); + usort($repos_archives, function ($a, $b) { + return ($a['created_at'] > $b['created_at']) ? -1 : 1; + }); + //Delete old files that are beyond the limit + for ($n = $max_backup_copies; $n < sizeof($repos_archives); $n++) { + $archive = $repos_archives[$n]; + $app->log('Backup archive ' . $archive['archive'] . ' is beyond the limit of ' . $max_backup_copies . " copies and will be deleted from disk and database", LOGLEVEL_DEBUG); + $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; + foreach ($db_list as $db) { + $db->query($sql, $server_id, $web_id, $archive['archive']); + } + $backup_repos_path = $backup_dir . '/' . $archive['repos']; + self::deleteArchive($backup_mode, $backup_repos_path, $archive['archive'], $password); } - @unlink($full_filename); } return true; } + protected static function getAllArchives($backup_dir, $backup_mode, $password) + { + $d = dir($backup_dir); + $archives = []; + /** + * $archives[] = [ + * 'repos' => string, + * 'archive' => string, + * 'created_at' => int, + * ]; + */ + while (false !== ($entry = $d->read())) { + if ('.' === $entry || '..' === $entry) { + continue; + } + switch ($backup_mode) { + case 'borg': + $repos_path = $backup_dir . '/' . $entry; + if (is_dir($repos_path) && strncmp('borg_', $entry, 5) === 0) { + $archivesJson = json_decode(implode("", self::getReposArchives($backup_mode, $repos_path, $password, 'json')), TRUE); + foreach ($archivesJson['archives'] as $archive) { + $archives[] = [ + 'repos' => $entry, + 'archive' => $archive['name'], + 'created_at' => strtotime($archive['time']), + ]; + } + } + break; + } + } + return $archives; + } + + protected static function deleteArchive($backup_mode, $backup_repos_path, $backup_archive, $password) + { + global $app; + $app->log("Delete Archive - repos = " . $backup_repos_path . ", archive = " . $backup_archive, LOGLEVEL_DEBUG); + switch ($backup_mode) { + case 'borg': + $app->system->exec_safe('borg delete ?', $backup_repos_path . '::' . $backup_archive); + return $app->system->last_exec_retcode() == 0; + default: + $app->log("Unknown repos type " . $backup_mode, LOGLEVEL_ERROR); + } + return FALSE; + } + /** * Garbage collection: deletes records from database about files that do not exist and deletes untracked files and cleans up backup download directories. * The backup directory must be mounted before calling this method. @@ -748,7 +1236,7 @@ class backup $args_sql_domains_with_backups = array(); $server_config = $app->getconf->get_server_config($server_id, 'server'); $backup_dir = trim($server_config['backup_dir']); - $sql = "SELECT * FROM web_backup WHERE server_id = ?"; + $sql = "SELECT * FROM web_backup WHERE server_id = ? AND backup_mode != 'borg'"; $sql_domains = "SELECT domain_id,document_root,system_user,system_group,backup_interval FROM web_domain WHERE server_id = ? AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')"; $sql_domains_with_backups = "SELECT domain_id,document_root,system_user,system_group,backup_interval FROM web_domain WHERE domain_id in (SELECT parent_domain_id FROM web_backup WHERE server_id = ?" . ((!empty($backup_type)) ? " AND backup_type = ?" : "") . ") AND (type = 'vhost' OR type = 'vhostsubdomain' OR type = 'vhostalias')"; array_push($args_sql, $server_id); @@ -772,7 +1260,7 @@ class backup if ($app->db->dbHost != $app->dbmaster->dbHost) array_push($db_list, $app->dbmaster); - // Cleanup web_backup entries for non-existent backup files + // Cleanup web_backup entries for non-existent backup files foreach ($db_list as $db) { $backups = $app->db->queryAllRecords($sql, true, $args_sql); foreach ($backups as $backup) { @@ -785,7 +1273,7 @@ class backup } } - // Cleanup backup files with missing web_backup entries (runs on all servers) + // Cleanup backup files with missing web_backup entries (runs on all servers) $domains = $app->dbmaster->queryAllRecords($sql_domains_with_backups, true, $args_sql_domains_with_backups); foreach ($domains as $rec) { $domain_id = $rec['domain_id']; @@ -795,7 +1283,7 @@ class backup if (!empty($files)) { // leave out server_id here, in case backup storage is shared between servers $sql = "SELECT backup_id, filename FROM web_backup WHERE parent_domain_id = ?"; - $untracked_backup_files = array(); + $untracked_backup_files = array(); foreach ($db_list as $db) { $backups = $db->queryAllRecords($sql, $domain_id); foreach ($backups as $backup) { @@ -804,8 +1292,8 @@ class backup } } } - array_unique( $untracked_backup_files ); - foreach ($untracked_backup_files as $f) { + array_unique( $untracked_backup_files ); + foreach ($untracked_backup_files as $f) { $backup_file = $backup_dir . '/web' . $domain_id . '/' . $f; $app->log('Backup file ' . $backup_file . ' is not contained in database, deleting this file from disk', LOGLEVEL_DEBUG); @unlink($backup_file); @@ -813,7 +1301,7 @@ class backup } } - // This cleanup only runs on web servers + // This cleanup only runs on web servers $domains = $app->db->queryAllRecords($sql_domains, true, $args_sql_domains); foreach ($domains as $rec) { $domain_id = $rec['domain_id']; @@ -856,6 +1344,15 @@ class backup } } + protected static function getReposFolder($backup_mode, $backup_type, $postfix = '') + { + switch ($backup_mode) { + case 'borg': + return 'borg_' . $backup_type . $postfix; + } + return null; + } + /** * Gets list of files in directory * @param string $directory @@ -922,6 +1419,48 @@ class backup return $files; } + /** + * Gets list of directories in directory + * @param string $directory + * @param string[]|null $prefix_list filter files that have one of the prefixes. Use null for default filtering. + * @return string[] + * @author Ramil Valitov + */ + protected static function get_dirs($directory, $prefix_list = null, $endings_list = null) + { + $default_prefix_list = array( + 'borg', + ); + if (is_null($prefix_list)) + $prefix_list = $default_prefix_list; + + if (!is_dir($directory)) { + return array(); + } + + $dir_handle = dir($directory); + $dirs = array(); + while (false !== ($entry = $dir_handle->read())) { + $full_dirname = $directory . '/' . $entry; + if ($entry != '.' && $entry != '..' && is_dir($full_dirname)) { + if (!empty($prefix_list)) { + $add = false; + foreach ($prefix_list as $prefix) { + if (substr($entry, 0, strlen($prefix)) == $prefix) { + $add = true; + break; + } + } + } else + $add = true; + if ($add) + array_push($dirs, $entry); + } + } + $dir_handle->close(); + + return $dirs; + } /** * Generates excludes list for compressors * @param string[] $backup_excludes @@ -935,7 +1474,7 @@ class backup { $excludes = ""; foreach ($backup_excludes as $ex) { - # pass through escapeshellarg if not already done + # pass through escapeshellarg if not already done if ( preg_match( "/^'.+'$/", $ex ) ) { $excludes .= "${arg}${pre}${ex}${post} "; } else { @@ -1167,6 +1706,7 @@ class backup * @param string $backup_job type of backup job: manual or auto * @return bool true if success * @author Ramil Valitov + * @author Jorge Muñoz * @see backup_plugin::run_backup() recommeneded to use if you need to make backups */ protected static function make_database_backup($web_domain, $backup_job) @@ -1176,6 +1716,7 @@ class backup $server_id = intval($web_domain['server_id']); $domain_id = intval($web_domain['domain_id']); $server_config = $app->getconf->get_server_config($server_id, 'server'); + $backup_mode = $server_config['backup_mode']; $backup_dir = trim($server_config['backup_dir']); $backup_tmp = trim($server_config['backup_tmp']); $db_backup_dir = $backup_dir . '/web' . $domain_id; @@ -1200,67 +1741,118 @@ class backup unset($tmp); foreach ($records as $rec) { - $password = ($web_domain['backup_encrypt'] == 'y') ? trim($web_domain['backup_password']) : ''; - $backup_format_db = $web_domain['backup_format_db']; - if (empty($backup_format_db)) { - $backup_format_db = 'gzip'; - } - $backup_extension_db = self::getBackupDbExtension($backup_format_db); - - if (!empty($backup_extension_db)) { - //* Do the mysql database backup with mysqldump + if (self::backupModeIsRepos($backup_mode)) { + //@todo get $password from server config + $repos_password = ''; + //@todo get compression from server config + $compression = 'zlib'; $db_name = $rec['database_name']; - $db_file_prefix = 'db_' . $db_name . '_' . date('Y-m-d_H-i'); - $db_backup_file = $db_file_prefix . '.sql'; - $db_compressed_file = ($backup_job == 'manual' ? 'manual-' : '') . $db_file_prefix . $backup_extension_db; - $command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M " . $mysqldump_routines . " --result-file=? ?"; - /** @var string $clientdb_host */ - /** @var string $clientdb_user */ - /** @var string $clientdb_password */ - $app->system->exec_safe($command, $clientdb_host, $clientdb_user, $clientdb_password, $db_backup_dir . '/' . $db_backup_file, $db_name); - $exit_code = $app->system->last_exec_retcode(); - - //* Compress the backup - if ($exit_code == 0) { - $exit_code = self::runDatabaseCompression($backup_format_db, $db_backup_dir, $db_backup_file, $db_compressed_file, $backup_tmp, $password) ? 0 : 1; - if ($exit_code !== 0) - $app->log('Failed to make backup of database ' . $rec['database_name'], LOGLEVEL_ERROR); + $db_repos_folder = self::getBackupReposFolder($backup_mode, 'mysql') . '_' . $db_name; + $backup_repos_path = $db_backup_dir . '/' . $db_repos_folder; + $backup_format_db = ''; + if (self::prepareRepos($backup_mode, $backup_repos_path, $repos_password)) { + $db_backup_archive = ($backup_job == 'manual' ? 'manual-' : '') . 'db_' . $db_name . '_' . date('Y-m-d_H-i'); + $full_archive_path = $backup_repos_path . '::' . $db_backup_archive; + $dump_command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M " . $mysqldump_routines . " ?"; + switch ($backup_mode) { + case 'borg': + $borg_cmd = self::getBorgCommand('borg create', $repos_password); + $borg_options = self::getBorgCreateOptions($compression); + $command = $dump_command . ' | ' . $borg_cmd . ' ' . $borg_options . ' ? -'; + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, + $clientdb_host, $clientdb_user, $clientdb_password, $db_name, #mysqldump command part + $full_archive_path #borg command part + ); + $exit_code = $app->system->last_exec_retcode(); + break; + } + if ($exit_code == 0) { + $archive_size = self::getReposArchiveSize($backup_mode, $backup_repos_path, $db_backup_archive, $repos_password); + if ($archive_size !== false) { + //* Insert web backup record in database + $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + //* password is for `Encrypted` column informative purposes, on download password is obtained from web_domain settings + $password = $repos_password ? '*secret*' : ''; + $app->db->query($sql, $server_id, $domain_id, 'mysql', $backup_mode, $backup_format_db, time(), $db_backup_archive, $archive_size, $password); + if ($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $domain_id, 'mysql', $backup_mode, $backup_format_db, time(), $db_backup_archive, $archive_size, $password); + $success = true; + } else { + $app->log('Failed to obtain backup size of ' . $full_archive_path . ' for database ' . $rec['database_name'], LOGLEVEL_ERROR); + return false; + } + } else { + rename($backup_repos_path, $new_path = $backup_repos_path . '_failed_' . uniqid()); + $app->log('Failed to process mysql backup format ' . $backup_format_db . ' for database ' . $rec['database_name'] . ' repos renamed to ' . $new_path, LOGLEVEL_ERROR); + } } else { - $app->log('Failed to make backup of database ' . $rec['database_name'] . ', because mysqldump failed', LOGLEVEL_ERROR); + $app->log('Failed to initialize repository for database ' . $rec['database_name'] . ', folder ' . $backup_repos_path . ', backup mode ' . $backup_mode . '.', LOGLEVEL_ERROR); + } + } else { + $password = ($web_domain['backup_encrypt'] == 'y') ? trim($web_domain['backup_password']) : ''; + $backup_format_db = $web_domain['backup_format_db']; + if (empty($backup_format_db)) { + $backup_format_db = 'gzip'; } + $backup_extension_db = self::getBackupDbExtension($backup_format_db); + + if (!empty($backup_extension_db)) { + //* Do the mysql database backup with mysqldump + $db_name = $rec['database_name']; + $db_file_prefix = 'db_' . $db_name . '_' . date('Y-m-d_H-i'); + $db_backup_file = $db_file_prefix . '.sql'; + $db_compressed_file = ($backup_job == 'manual' ? 'manual-' : '') . $db_file_prefix . $backup_extension_db; + $command = "mysqldump -h ? -u ? -p? -c --add-drop-table --create-options --quick --max_allowed_packet=512M " . $mysqldump_routines . " --result-file=? ?"; + /** @var string $clientdb_host */ + /** @var string $clientdb_user */ + /** @var string $clientdb_password */ + $app->system->exec_safe($command, $clientdb_host, $clientdb_user, $clientdb_password, $db_backup_dir . '/' . $db_backup_file, $db_name); + $exit_code = $app->system->last_exec_retcode(); - if ($exit_code == 0) { - if (is_file($db_backup_dir . '/' . $db_compressed_file)) { - chmod($db_backup_dir . '/' . $db_compressed_file, 0750); - chown($db_backup_dir . '/' . $db_compressed_file, fileowner($db_backup_dir)); - chgrp($db_backup_dir . '/' . $db_compressed_file, filegroup($db_backup_dir)); - - //* Insert web backup record in database - $file_size = filesize($db_backup_dir . '/' . $db_compressed_file); - $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; - //Making compatible with previous versions of ISPConfig: - $sql_mode = ($backup_format_db == 'gzip') ? 'sqlgz' : ('sql' . $backup_format_db); - $app->db->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); - if ($app->db->dbHost != $app->dbmaster->dbHost) - $app->dbmaster->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); - $success = true; + //* Compress the backup + if ($exit_code == 0) { + $exit_code = self::runDatabaseCompression($backup_format_db, $db_backup_dir, $db_backup_file, $db_compressed_file, $backup_tmp, $password) ? 0 : 1; + if ($exit_code !== 0) + $app->log('Failed to make backup of database ' . $rec['database_name'], LOGLEVEL_ERROR); + } else { + $app->log('Failed to make backup of database ' . $rec['database_name'] . ', because mysqldump failed', LOGLEVEL_ERROR); } - } else { - if (is_file($db_backup_dir . '/' . $db_compressed_file)) unlink($db_backup_dir . '/' . $db_compressed_file); + + if ($exit_code == 0) { + if (is_file($db_backup_dir . '/' . $db_compressed_file)) { + chmod($db_backup_dir . '/' . $db_compressed_file, 0750); + chown($db_backup_dir . '/' . $db_compressed_file, fileowner($db_backup_dir)); + chgrp($db_backup_dir . '/' . $db_compressed_file, filegroup($db_backup_dir)); + + //* Insert web backup record in database + $file_size = filesize($db_backup_dir . '/' . $db_compressed_file); + $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + //Making compatible with previous versions of ISPConfig: + $sql_mode = ($backup_format_db == 'gzip') ? 'sqlgz' : ('sql' . $backup_format_db); + $app->db->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); + if ($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $domain_id, 'mysql', $sql_mode, $backup_format_db, time(), $db_compressed_file, $file_size, $password); + $success = true; + } + } else { + if (is_file($db_backup_dir . '/' . $db_compressed_file)) unlink($db_backup_dir . '/' . $db_compressed_file); + } + //* Remove the uncompressed file + if (is_file($db_backup_dir . '/' . $db_backup_file)) unlink($db_backup_dir . '/' . $db_backup_file); + } else { + $app->log('Failed to process mysql backup format ' . $backup_format_db . ' for database ' . $rec['database_name'], LOGLEVEL_ERROR); } - //* Remove the uncompressed file - if (is_file($db_backup_dir . '/' . $db_backup_file)) unlink($db_backup_dir . '/' . $db_backup_file); - - //* Remove old backups - self::backups_garbage_collection($server_id, 'mysql', $domain_id); - $prefix_list = array( - "db_${db_name}_", - "manual-db_${db_name}_", - ); - self::clearBackups($server_id, $domain_id, intval($rec['backup_copies']), $db_backup_dir, $prefix_list); - } else { - $app->log('Failed to process mysql backup format ' . $backup_format_db . ' for database ' . $rec['database_name'], LOGLEVEL_ERROR); } + //* Remove old backups + self::backups_garbage_collection($server_id, 'mysql', $domain_id); + $prefix_list = array( + "db_${db_name}_", + "manual-db_${db_name}_", + ); + self::clearBackups($server_id, $domain_id, intval($rec['backup_copies']), $db_backup_dir, $prefix_list); } unset($clientdb_host); @@ -1278,6 +1870,7 @@ class backup * @param string $backup_job type of backup job: manual or auto * @return bool true if success * @author Ramil Valitov + * @author Jorge Muñoz * @see backup_plugin::mount_backup_dir() * @see backup_plugin::run_backup() recommeneded to use if you need to make backups */ @@ -1328,11 +1921,11 @@ class backup self::prepare_backup_dir($server_id, $web_domain); $web_backup_dir = $backup_dir . '/web' . $web_id; - # default exclusions - $backup_excludes = array( - './backup*', - './bin', './dev', './etc', './lib', './lib32', './lib64', './opt', './sys', './usr', './var', './proc', './run', './tmp', - ); + # default exclusions + $backup_excludes = array( + './backup*', + './bin', './dev', './etc', './lib', './lib32', './lib64', './opt', './sys', './usr', './var', './proc', './run', './tmp', + ); $b_excludes = explode(',', trim($web_domain['backup_excludes'])); if (is_array($b_excludes) && !empty($b_excludes)) { @@ -1343,43 +1936,217 @@ class backup } } } + if (self::backupModeIsRepos($backup_mode)) { + $backup_format_web = ''; + $web_backup_archive = ($backup_job == 'manual' ? 'manual-' : '') . 'web' . $web_id . '_' . date('Y-m-d_H-i'); + $backup_repos_folder = self::getBackupReposFolder($backup_mode, 'web'); + + $backup_repos_path = $web_backup_dir . '/' . $backup_repos_folder; + $full_archive_path = $backup_repos_path . '::' . $web_backup_archive; + /** + * @todo the internal borg password can't be the backup instance $password because the repos shares all backups + * in a period of time. Instead we'll set the backup password on backup file download. + */ + $repos_password = ''; + //@todo get this from the server config perhaps + $compression = 'zlib'; - $web_backup_file = ($backup_job == 'manual' ? 'manual-' : '') . 'web' . $web_id . '_' . date('Y-m-d_H-i') . $backup_extension_web; - $full_filename = $web_backup_dir . '/' . $web_backup_file; - if (self::runWebCompression($backup_format_web, $backup_excludes, $backup_mode, $web_path, $web_backup_dir, $web_backup_file, $web_user, $web_group, $http_server_user, $backup_tmp, $password)) { - if (is_file($full_filename)) { + if ( ! self::prepareRepos($backup_mode, $backup_repos_path, $repos_password)) { + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' using path ' . $backup_repos_path . ' failed. Unable to prepare repository for ' . $backup_mode, LOGLEVEL_ERROR); + return FALSE; + } + #we wont use tar to be able to speed up things and extract specific files easily + #$find_user_files = 'cd ? && find . -group ? -or -user ? -print 2> /dev/null'; + $excludes = backup::generateExcludeList($backup_excludes, '--exclude '); + $success = false; + + $app->log('Performing web files backup of ' . $web_path . ', mode ' . $backup_mode, LOGLEVEL_DEBUG); + switch ($backup_mode) { + case 'borg': + $command = self::getBorgCommand('borg create', $repos_password); + $command_opts = self::getBorgCreateOptions($compression); + + $app->system->exec_safe( + 'cd ? && ' . $command . ' ' . $command_opts . ' ' . $excludes . ' ? .', + $web_path, $backup_repos_path . '::' . $web_backup_archive + ); + $success = $app->system->last_exec_retcode() == 0; + } + + if ($success) { $backup_username = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_user : 'root'; $backup_group = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_group : 'root'; - chown($full_filename, $backup_username); - chgrp($full_filename, $backup_group); - chmod($full_filename, 0750); - + //Insert web backup record in database - $file_size = filesize($full_filename); + $archive_size = self::getReposArchiveSize($backup_mode, $backup_repos_path, $web_backup_archive, $repos_password); + $password = $repos_password ? '*secret*' : ''; $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; - $app->db->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); + $backup_time = time(); + $app->db->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, $backup_time, $web_backup_archive, $archive_size, $password); if ($app->db->dbHost != $app->dbmaster->dbHost) - $app->dbmaster->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); - unset($file_size); - $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' completed successfully to file ' . $full_filename, LOGLEVEL_DEBUG); + $app->dbmaster->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, $backup_time, $web_backup_archive, $archive_size, $password); + unset($archive_size); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' completed successfully to archive ' . $full_archive_path, LOGLEVEL_DEBUG); } else { - $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' reported success, but the resulting file ' . $full_filename . ' not found.', LOGLEVEL_ERROR); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); } - } else { - if (is_file($full_filename)) - unlink($full_filename); - $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' failed using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); + $web_backup_file = ($backup_job == 'manual' ? 'manual-' : '') . 'web' . $web_id . '_' . date('Y-m-d_H-i') . $backup_extension_web; + $full_filename = $web_backup_dir . '/' . $web_backup_file; + if (self::runWebCompression($backup_format_web, $backup_excludes, $backup_mode, $web_path, $web_backup_dir, $web_backup_file, $web_user, $web_group, $http_server_user, $backup_tmp, $password)) { + if (is_file($full_filename)) { + $backup_username = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_user : 'root'; + $backup_group = ($global_config['backups_include_into_web_quota'] == 'y') ? $web_group : 'root'; + chown($full_filename, $backup_username); + chgrp($full_filename, $backup_group); + chmod($full_filename, 0750); + + //Insert web backup record in database + $file_size = filesize($full_filename); + $sql = "INSERT INTO web_backup (server_id, parent_domain_id, backup_type, backup_mode, backup_format, tstamp, filename, filesize, backup_password) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + $app->db->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); + if ($app->db->dbHost != $app->dbmaster->dbHost) + $app->dbmaster->query($sql, $server_id, $web_id, 'web', $backup_mode, $backup_format_web, time(), $web_backup_file, $file_size, $password); + unset($file_size); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' completed successfully to file ' . $full_filename, LOGLEVEL_DEBUG); + } else { + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' reported success, but the resulting file ' . $full_filename . ' not found.', LOGLEVEL_ERROR); + } + + } else { + if (is_file($full_filename)) + unlink($full_filename); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' failed using path ' . $web_path . ' failed.', LOGLEVEL_ERROR); + } } - $prefix_list = array( - 'web', - 'manual-web', - ); + $prefix_list = array( + 'web', + 'manual-web', + ); self::clearBackups($server_id, $web_id, intval($web_domain['backup_copies']), $web_backup_dir, $prefix_list); return true; } + protected static function getBackupReposFolder($backup_mode, $backup_type) + { + switch ($backup_mode) { + case 'borg': return 'borg_' . $backup_type; + } + return null; + } + + /** + * Prepares repository for backup. Initialization, etc. + */ + protected static function prepareRepos($backup_mode, $repos_path, $password) + { + global $app; + if (is_dir($repos_path)) { + self::getReposArchives($backup_mode, $repos_path, $password); + if ($app->system->last_exec_retcode() == 0) { + return true; + } + if ($app->system->last_exec_retcode() == 2 && preg_match('/passphrase supplied in.*is incorrect/', $app->system->last_exec_out()[0])) { + //Password was updated, so we rename folder and alert the event. + $repos_stat = stat($repos_path); + $mtime = $repos_stat['mtime']; + $new_repo_path = $repos_path . '_' . date('Y-m-d_H-i', $mtime); + rename($repos_path, $new_repo_name); + $app->log('Backup of web files for domain ' . $web_domain['domain'] . ' are encrypted under a different password. Original repos was moved to ' . $new_repo_name, LOGLEVEL_WARN); + } else { + return false; + } + } + switch ($backup_mode) { + case 'borg': + if ($password) { + $command = self::getBorgCommand('borg init', $password, true); + $app->system->exec_safe($command . ' --make-parent-dirs -e authenticated ?', $repos_path); + } else { + $app->system->exec_safe('borg init --make-parent-dirs -e none ?', $repos_path); + } + return $app->system->last_exec_retcode() == 0; + } + return false; + } + + /** + * Obtains archive compressed size from specific repository. + * @param string $backup_mode Server backup mode. + * @param string $backup_repos_path Absolute path to repository. + * @param string $backup_archive Name of the archive to obtain size from. + * @param string $password Provide repository password or empty string if there is none. + * @author Jorge Muñoz + */ + protected static function getReposArchiveSize($backup_mode, $backup_repos_path, $backup_archive, $password) + { + $info = self::getReposArchiveInfo($backup_mode, $backup_repos_path, $backup_archive, $password); + if ($info) { + return $info['compressed_size']; + } + return false; + } + /** + * Obtains archive information for specific repository archive. + * @param string $backup_mode Server backup mode. + * @param string $backup_repos_path Absolute path to repository. + * @param string $backup_archive Name of the archive to obtain size from. + * @param string $password Provide repository password or empty string if there is none. + * @return array Can contain one or more of the following keys: + * 'created_at': int unixtime + * 'created_by': string + * 'comment': string + * 'original_size': int + * 'compressed_size': int + * 'deduplicated_size': int + * 'num_files': int + * 'compression': string + * @author Jorge Muñoz + */ + protected static function getReposArchiveInfo($backup_mode, $backup_repos_path, $backup_archive, $password) + { + global $app; + $info = []; + switch ($backup_mode) { + case 'borg': + $command = self::getBorgCommand('borg info', $password); + $full_archive_path = $backup_repos_path . '::' . $backup_archive; + $app->system->exec_safe($command . ' --json ?', $full_archive_path); + if ($app->system->last_exec_retcode() != 0) { + $app->log('Command `borg info` failed for ' . $full_archive_path . '.', LOGLEVEL_ERROR); + } + $out = implode("", $app->system->last_exec_out()); + if ($out) { + $out = json_decode($out, true); + } + if (empty($out)) { + $app->log('No json result could be parsed from `borg info --json` command for repository ' . $full_archive_path . '.', LOGLEVEL_ERROR); + return false; + } + if (empty($out['archives'])) { + $app->log('No archive ' . $backup_archive . ' found for repository ' . $backup_repos_path . '.', LOGLEVEL_WARN); + return false; + } + $info['created_at'] = strtotime($out['archives'][0]['start']); + $info['created_by'] = $out['archives'][0]['username']; + $info['comment'] = $out['archives'][0]['comment']; + $info['original_size'] = (int)$out['archives'][0]['stats']['original_size']; + $info['compressed_size'] = (int)$out['archives'][0]['stats']['compressed_size']; + $info['deduplicated_size'] = (int)$out['archives'][0]['stats']['deduplicated_size']; + $info['num_files'] = (int)$out['archives'][0]['stats']['nfiles']; + $prev_arg = null; + foreach ($out['archives'][0]['command_line'] as $arg) { + if ($prev_arg == '-C' || $prev_arg == '--compression') { + $info['compression'] = $arg; + break; + } + $prev = $arg; + } + } + return $info; + } + /** * Creates and prepares a backup dir * @param int $server_id @@ -1498,7 +2265,7 @@ class backup } } - $sql = "SELECT DISTINCT d.*, db.server_id as `server_id` FROM web_database as db INNER JOIN web_domain as d ON (d.domain_id = db.parent_domain_id) WHERE db.server_id = ? AND db.active = 'y' AND d.backup_interval != 'none' AND d.backup_interval != ''"; + $sql = "SELECT DISTINCT d.*, db.server_id as `server_id` FROM web_database as db INNER JOIN web_domain as d ON (d.domain_id = db.parent_domain_id) WHERE db.server_id = ? AND db.active = 'y' AND d.backup_interval != 'none' AND d.backup_interval != ''"; $databases = $app->dbmaster->queryAllRecords($sql, $server_id); foreach ($databases as $database) { diff --git a/server/plugins-available/backup_plugin.inc.php b/server/plugins-available/backup_plugin.inc.php index a92165ba6d..8ba345b4c4 100644 --- a/server/plugins-available/backup_plugin.inc.php +++ b/server/plugins-available/backup_plugin.inc.php @@ -87,14 +87,7 @@ class backup_plugin { if($backup_dir_is_ready){ //* Make backup available for download if($action_name == 'backup_download') { - //* Copy the backup file to the backup folder of the website - if(file_exists($backup_dir.'/'.$backup['filename']) && file_exists($web['document_root'].'/backup/') && !stristr($backup_dir.'/'.$backup['filename'], '..') && !stristr($backup_dir.'/'.$backup['filename'], 'etc')) { - copy($backup_dir.'/'.$backup['filename'], $web['document_root'].'/backup/'.$backup['filename']); - chgrp($web['document_root'].'/backup/'.$backup['filename'], $web['system_group']); - chown($web['document_root'].'/backup/'.$backup['filename'], $web['system_user']); - chmod($web['document_root'].'/backup/'.$backup['filename'],0600); - $app->log('cp '.$backup_dir.'/'.$backup['filename'].' '.$web['document_root'].'/backup/'.$backup['filename'], LOGLEVEL_DEBUG); - } + backup::downloadBackup($backup['backup_format'], trim($backup['backup_password']), $backup_dir, $backup['filename'], $backup['backup_mode'], $backup['backup_type'], $web); } //* Restore a MongoDB backup @@ -134,14 +127,7 @@ class backup_plugin { } if($action_name == 'backup_delete') { - if(file_exists($backup_dir.'/'.$backup['filename']) && !stristr($backup_dir.'/'.$backup['filename'], '..') && !stristr($backup_dir.'/'.$backup['filename'], 'etc')) { - unlink($backup_dir.'/'.$backup['filename']); - - $sql = "DELETE FROM web_backup WHERE server_id = ? AND parent_domain_id = ? AND filename = ?"; - $app->db->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']); - if($app->db->dbHost != $app->dbmaster->dbHost) $app->dbmaster->query($sql, $conf['server_id'], $backup['parent_domain_id'], $backup['filename']); - $app->log('unlink '.$backup_dir.'/'.$backup['filename'], LOGLEVEL_DEBUG); - } + backup::deleteBackup($backup['backup_format'], trim($backup['backup_password']), $backup_dir, $backup['filename'], $backup['backup_mode'], $backup['backup_type'], $backup['parent_domain_id']); } backup::unmount_backup_dir($conf['server_id']); -- GitLab From 8cfb4fad03565548fff8da3a0914498a38438127 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 28 Sep 2021 10:09:45 -0600 Subject: [PATCH 1254/1368] fix tests for when to reconfigure postfix --- install/dist/lib/centos_base.lib.php | 47 +++++++++--------- install/dist/lib/fedora.lib.php | 47 +++++++++--------- install/dist/lib/gentoo.lib.php | 47 +++++++++--------- install/dist/lib/opensuse.lib.php | 47 +++++++++--------- install/lib/installer_base.lib.php | 48 +++++++++---------- .../postfix_server_plugin.inc.php | 6 ++- 6 files changed, 114 insertions(+), 128 deletions(-) diff --git a/install/dist/lib/centos_base.lib.php b/install/dist/lib/centos_base.lib.php index 0fe988439d..8c71db34a6 100644 --- a/install/dist/lib/centos_base.lib.php +++ b/install/dist/lib/centos_base.lib.php @@ -83,31 +83,28 @@ class installer_centos extends installer_dist { $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn # REMOVE ME', 1); replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1); diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php index 2e46ed16d3..71809ac81e 100644 --- a/install/dist/lib/fedora.lib.php +++ b/install/dist/lib/fedora.lib.php @@ -330,31 +330,28 @@ class installer_dist extends installer_base { $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn # REMOVE ME', 1); replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1); diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php index 83a4b5ffaf..ebb742a368 100644 --- a/install/dist/lib/gentoo.lib.php +++ b/install/dist/lib/gentoo.lib.php @@ -444,31 +444,28 @@ class installer extends installer_base $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); //* Add the clamav user to the amavis group exec('usermod -a -G amavis clamav'); diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php index 3effb1d10c..7cc368a14e 100644 --- a/install/dist/lib/opensuse.lib.php +++ b/install/dist/lib/opensuse.lib.php @@ -513,31 +513,28 @@ class installer_dist extends installer_base { $config_dir = $conf['postfix']['config_dir']; - // Adding amavis-services to the master.cf file if the service does not already exists - $add_amavis = !$this->get_postfix_service('amavis','unix'); - $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); // Add the clamav user to the vscan group //exec('groupmod --add-user clamav vscan'); diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index b788fd7c63..f4eb3f0451 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1720,32 +1720,28 @@ class installer_base { caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command"); } - // Adding amavis-services to the master.cf file if the service does not already exists - // (just remove the old service definitions and add them again) - $add_amavis = $this->remove_postfix_service('amavis','unix'); - $add_amavis_10025 = $this->remove_postfix_service('127.0.0.1:10025','inet'); - $add_amavis_10027 = $this->remove_postfix_service('127.0.0.1:10027','inet'); - - if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) { - //* backup master.cf - if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); - // adjust amavis-config - if($add_amavis) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10025) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - if ($add_amavis_10027) { - $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); - af($config_dir.'/master.cf', $content); - unset($content); - } - } + // Adding amavis-services to the master.cf file + + // backup master.cf + if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~'); + + // first remove the old service definitions + $this->remove_postfix_service('amavis','unix'); + $this->remove_postfix_service('127.0.0.1:10025','inet'); + $this->remove_postfix_service('127.0.0.1:10027','inet'); + + // then add them back + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master'); + af($config_dir.'/master.cf', $content); + unset($content); + + $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master'); + af($config_dir.'/master.cf', $content); + unset($content); } // Add the clamav user to the amavis group diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index 9d94bf8982..b9c41dd8f6 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -332,7 +332,9 @@ class postfix_server_plugin { } } - $quoted_postfix_config_dir = preg_quote($conf['postfix']['config_dir'], '|'); + $config_dir = exec("postconf -h config_directory"); + $quoted_postfix_config_dir = preg_quote($config_dir, '|'); + $new_options = array(); $options = preg_split("/,\s*/", exec("postconf -h smtpd_recipient_restrictions")); foreach ($options as $key => $value) { @@ -343,7 +345,7 @@ class postfix_server_plugin { } $new_options[] = $value; } - if (defined($configure_lmtp) && $configure_lmtp && $mail_config['content_filter'] == 'amavisd') { + if (isset($configure_lmtp) && $configure_lmtp && $mail_config['content_filter'] == 'amavisd') { for ($i = 0; isset($new_options[$i]); $i++) { if ($new_options[$i] == 'reject_unlisted_recipient') { array_splice($new_options, $i+1, 0, array("check_recipient_access proxy:mysql:${quoted_postfix_config_dir}/mysql-verify_recipients.cf")); -- GitLab From c8171a068547204c700dc32f53563711c8bcb0c5 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 7 Oct 2021 15:11:33 -0600 Subject: [PATCH 1255/1368] installer: handle server certificate files/links better --- install/lib/installer_base.lib.php | 97 ++++++++++++++++---------- server/lib/classes/letsencrypt.inc.php | 2 +- 2 files changed, 60 insertions(+), 39 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 103abaef19..0b4c130c57 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -52,7 +52,7 @@ class installer_base { } public function update_acme() { - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); $val = 0; @@ -2965,7 +2965,7 @@ class installer_base { $le_client = reset($le_client); // Check for Neilpang acme.sh as well - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); if((!$acme || !is_executable($acme)) && (!$le_client || !is_executable($le_client))) { @@ -2973,7 +2973,7 @@ class installer_base { if(!$success) { swriteln('Failed installing acme.sh. Will not be able to issue certificate during install.'); } else { - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); if($acme && is_executable($acme)) { swriteln('Installed acme.sh and using it for certificate creation during install.'); @@ -3016,14 +3016,30 @@ class installer_base { $issued_successfully = false; // Backup existing ispserver ssl files - if(file_exists($ssl_crt_file) || is_link($ssl_crt_file)) { - copy($ssl_crt_file, $ssl_crt_file . '-temporary.bak'); - } - if(file_exists($ssl_key_file) || is_link($ssl_key_file)) { - copy($ssl_key_file, $ssl_key_file . '-temporary.bak'); - } - if(file_exists($ssl_pem_file) || is_link($ssl_pem_file)) { - copy($ssl_pem_file, $ssl_pem_file . '-temporary.bak'); + // + // We may find valid or broken symlinks or actual files here. + // + // - dangling links are broken and get perm renamed (should just delete?). + // possibly web server can't start because vhost file points to non-existing cert files, + // we're not trying to catch or fix that (and not making it worse) + // + // - link to valid file is tmp renamed, and file copied to original name. + // if cert request is successful, remove the old symlink; + // if cert request fails, remove file copy and rename symlink to original name + // + // - actual file copied to tmp name. + // if cert request is successful, rename tmp copy to perm rename; + // if cert request fails, delete tmp copy + $cert_files = array( $ssl_crt_file, $ssl_key_file, $ssl_pem_file ); + foreach ($cert_files as $f) { + if (is_link($f) && ! file_exists($f)) { + rename($f, $f.'-'.$date->format('YmdHis').'.bak'); + } elseif (is_link($f)) { + rename($f, $f.'-temporary.bak'); + copy($f.'-temporary.bak', $f); + } elseif(file_exists($f)) { + copy($f, $f.'-temporary.bak'); + } } // Attempt to use Neilpang acme.sh first, as it is now the preferred LE client @@ -3062,26 +3078,28 @@ class installer_base { umask($old_umask); // Make temporary backup of self-signed certs permanent - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file.'-'.$date->format('YmdHis').'.bak'); + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } elseif(file_exists($f.'-temporary.bak')) { + rename($f.'-temporary.bak', $f.'-'.$date->format('YmdHis').'.bak'); + } + } } else { swriteln('Issuing certificate via acme.sh failed. Please check that your hostname can be verified by letsencrypt'); umask($old_umask); - // Restore temporary backup of self-signed certs - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file); - + // Restore/cleanup temporary backup of self-signed certs + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + @unlink($f); + rename($f.'-temporary.bak', $f); + } elseif(file_exists($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } + } } // Else, we attempt to use the official LE certbot client certbot } else { @@ -3120,23 +3138,26 @@ class installer_base { $issued_successfully = true; // Make temporary backup of self-signed certs permanent - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file.'-'.$date->format('YmdHis').'.bak'); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file.'-'.$date->format('YmdHis').'.bak'); + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } elseif(file_exists($f.'-temporary.bak')) { + rename($f.'-temporary.bak', $f.'-'.$date->format('YmdHis').'.bak'); + } + } } else { swriteln('Issuing certificate via certbot failed. Please check log files and make sure that your hostname can be verified by letsencrypt'); - // Restore temporary backup of self-signed certs - if(file_exists($ssl_crt_file.'-temporary.bak') || is_link($ssl_crt_file.'-temporary.bak')) - rename($ssl_crt_file.'-temporary.bak', $ssl_crt_file); - if(file_exists($ssl_key_file.'-temporary.bak') || is_link($ssl_key_file.'-temporary.bak')) - rename($ssl_key_file.'-temporary.bak', $ssl_key_file); - if(file_exists($ssl_pem_file.'-temporary.bak') || is_link($ssl_pem_file.'-temporary.bak')) - rename($ssl_pem_file.'-temporary.bak', $ssl_pem_file); + // Restore/cleanup temporary backup of self-signed certs + foreach ($cert_files as $f) { + if (is_link($f.'-temporary.bak')) { + @unlink($f); + rename($f.'-temporary.bak', $f); + } elseif(file_exists($f.'-temporary.bak')) { + unlink($f.'-temporary.bak'); + } + } } } else { diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index ac805a6b67..aaa118fb91 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -44,7 +44,7 @@ class letsencrypt { } public function get_acme_script() { - $acme = explode("\n", shell_exec('which /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); + $acme = explode("\n", shell_exec('which acme.sh /usr/local/ispconfig/server/scripts/acme.sh /root/.acme.sh/acme.sh')); $acme = reset($acme); if(is_executable($acme)) { return $acme; -- GitLab From 0897e410241276e2bd33dd4fb3715799e57fe340 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 8 Oct 2021 16:47:31 +0200 Subject: [PATCH 1256/1368] Create symlinks for conveniance, SFTP user should not land in an empty dir. --- server/plugins-available/shelluser_base_plugin.inc.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/plugins-available/shelluser_base_plugin.inc.php b/server/plugins-available/shelluser_base_plugin.inc.php index f9a316d90e..2fc4f0dfc7 100755 --- a/server/plugins-available/shelluser_base_plugin.inc.php +++ b/server/plugins-available/shelluser_base_plugin.inc.php @@ -168,6 +168,11 @@ class shelluser_base_plugin { $app->system->chown($homedir.'/.profile', $data['new']['username']); $app->system->chgrp($homedir.'/.profile', $data['new']['pgroup']); + // Create symlinks for conveniance, SFTP user should not land in an empty dir. + symlink('../../web', $homedir.'/web'); + symlink('../../log', $homedir.'/log'); + symlink('../../private', $homedir.'/private'); + //* Disable shell user temporarily if we use jailkit if($data['new']['chroot'] == 'jailkit') { $command = 'usermod -s /bin/false -L ? 2>/dev/null'; -- GitLab From 7e0c8c35ccde081155183610267d50ce599b80e0 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 13 Oct 2021 11:17:29 +0200 Subject: [PATCH 1257/1368] Add ipv6 option for dns_templatezone_add() --- interface/lib/classes/remote.d/dns.inc.php | 3 ++- remoting_client/examples/dns_templatezone_add.php | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index b5d4b3820c..5cae8b3556 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -42,7 +42,7 @@ class remoting_dns extends remoting { // DNS Function -------------------------------------------------------------------------------------------------- //* Create Zone with Template - public function dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email) { + public function dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email, $ipv6 = '') { global $app, $conf; if(!$this->checkPerm($session_id, 'dns_templatezone_add')) { throw new SoapFault('permission_denied', 'You do not have the permissions to access this function.'); @@ -63,6 +63,7 @@ class remoting_dns extends remoting { $tpl_content = $template_record['template']; if($domain != '') $tpl_content = str_replace('{DOMAIN}', $domain, $tpl_content); if($ip != '') $tpl_content = str_replace('{IP}', $ip, $tpl_content); + if($ipv6 != '') $tpl_content = str_replace('{IPV6}', $ipv6, $tpl_content); if($ns1 != '') $tpl_content = str_replace('{NS1}', $ns1, $tpl_content); if($ns2 != '') $tpl_content = str_replace('{NS2}', $ns2, $tpl_content); if($email != '') $tpl_content = str_replace('{EMAIL}', $email, $tpl_content); diff --git a/remoting_client/examples/dns_templatezone_add.php b/remoting_client/examples/dns_templatezone_add.php index aedfc61f5d..fa45965b48 100644 --- a/remoting_client/examples/dns_templatezone_add.php +++ b/remoting_client/examples/dns_templatezone_add.php @@ -32,8 +32,9 @@ try { $ns1 = 'ns1.testhoster.tld'; $ns2 = 'ns2.testhoster.tld'; $email = 'email.test.tld'; + $ipv6 = '2606:2800:220:1:248:1893:25c8:1946'; - $id = $client->dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email); + $id = $client->dns_templatezone_add($session_id, $client_id, $template_id, $domain, $ip, $ns1, $ns2, $email, $ipv6); echo "ID: ".$id."
    "; @@ -47,4 +48,4 @@ try { die('SOAP Error: '.$e->getMessage()); } -?> \ No newline at end of file +?> -- GitLab From 3c86c392bf103b9581c6f440d0f03a43c98b47aa Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Wed, 13 Oct 2021 11:34:38 +0200 Subject: [PATCH 1258/1368] Set amavis group for 50-user to make it readable in Debian 11 --- install/lib/installer_base.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 103abaef19..98e3ecc6c4 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -1659,6 +1659,7 @@ class installer_base { $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content); wf($conf['amavis']['config_dir'].'/conf.d/50-user', $content); chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640); + chgrp($conf['amavis']['config_dir'].'/conf.d/50-user', 'amavis'); // TODO: chmod and chown on the config file -- GitLab From 5fa5f4e6d4d529ede32bdeb6f314927f2ebef147 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 18 Oct 2021 10:51:18 +0000 Subject: [PATCH 1259/1368] Update server/plugins-available/postfix_server_plugin.inc.php --- server/plugins-available/postfix_server_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/postfix_server_plugin.inc.php b/server/plugins-available/postfix_server_plugin.inc.php index 8cdb95066b..a8ef21447d 100644 --- a/server/plugins-available/postfix_server_plugin.inc.php +++ b/server/plugins-available/postfix_server_plugin.inc.php @@ -138,7 +138,7 @@ class postfix_server_plugin { if ($value == '') continue; if (preg_match('/^reject_rbl_client/', $value)) continue; $new_options[] = $value; - if (preg_match('/^permit_mynetworks/', $value)) { + if (preg_match('/^permit_sasl_authenticated/', $value)) { $new_options = array_merge($new_options, $rbl_options); $rbl_options = array(); // so we don't ever array_merge twice } -- GitLab From 2285eec431fef0864bd41c4260b345388583f863 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 19 Oct 2021 10:12:07 +0200 Subject: [PATCH 1260/1368] Updated Debian version in readme file --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9e0eea359d..022897c584 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Development branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispc [^1]: not actively tested ## Supported operating systems -- Debian 9, 10, and testing +- Debian 9, 11, and testing - Ubuntu 16.04 - 20.04 - CentOS 7 and 8 -- GitLab From 139bbcaf8646e3ad7ab42b82bc31e4756feaba7f Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 19 Oct 2021 15:21:46 +0200 Subject: [PATCH 1261/1368] Various security improvments in API and server code. --- README.md | 2 +- .../sql/incremental/upd_dev_collection.sql | 1 + install/sql/ispconfig3.sql | 1 + interface/lib/classes/remoting.inc.php | 118 ++++++++++++++++-- interface/lib/classes/remoting_lib.inc.php | 6 +- interface/lib/classes/session.inc.php | 12 +- interface/web/login/index.php | 12 +- server/lib/classes/system.inc.php | 96 +++++++++++--- server/mods-available/web_module.inc.php | 23 +++- 9 files changed, 222 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 022897c584..901cb2a7b9 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ Development branch: [![pipeline status](https://git.ispconfig.org/ispconfig/ispc [^1]: not actively tested ## Supported operating systems -- Debian 9, 11, and testing +- Debian 9 - 11, and testing - Ubuntu 16.04 - 20.04 - CentOS 7 and 8 diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index e69de29bb2..0a17c38737 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -0,0 +1 @@ +ALTER TABLE `remote_session` ADD `remote_ip` VARCHAR(39) NOT NULL DEFAULT '' AFTER `tstamp`; \ No newline at end of file diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql index 51106cc183..4d61c38d8f 100644 --- a/install/sql/ispconfig3.sql +++ b/install/sql/ispconfig3.sql @@ -1317,6 +1317,7 @@ CREATE TABLE `remote_session` ( `remote_functions` text, `client_login` tinyint(1) unsigned NOT NULL default '0', `tstamp` int(10) unsigned NOT NULL DEFAULT '0', + `remote_ip` varchar(39) NOT NULL DEFAULT '', PRIMARY KEY (`remote_session`) ) DEFAULT CHARSET=utf8 ; diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index fbadebd777..20181102ae 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -85,10 +85,20 @@ class remoting { //* Delete old remoting sessions $sql = "DELETE FROM remote_session WHERE tstamp < UNIX_TIMESTAMP()"; $app->db->query($sql); + + //* Check for max. login attempts + $ip_md5 = md5($_SERVER['REMOTE_ADDR']); + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 5 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql, $ip_md5); + + if($alreadyfailed['times'] > 10) { + throw new SoapFault('login_failure_limit', 'The login failure limit has been reached.'); + return false; + } if($client_login == true) { $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, $username); + $user = $app->db->queryOneRecord($sql, (string)$username); if($user) { $saved_password = stripslashes($user['passwort']); @@ -104,6 +114,16 @@ class remoting { } } } else { + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } throw new SoapFault('client_login_failed', 'The login failed. Username or password wrong.'); } if($user['active'] != 1) { @@ -119,17 +139,23 @@ class remoting { //* Create a remote user session //srand ((double)microtime()*1000000); - $remote_session = md5(mt_rand().uniqid('ispco')); + $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).sha1(mt_rand().uniqid('ispco',true)); $remote_userid = $user['userid']; $remote_functions = ''; $tstamp = time() + $this->session_timeout; - $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,client_login,tstamp' - .') VALUES (?, ?, ?, 1, ?)'; - $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp); + $ip = $_SERVER['REMOTE_ADDR']; + $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,client_login,tstamp,remote_ip' + .') VALUES (?, ?, ?, 1, ?, ?)'; + $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp,$ip); + + //* Delete login attempts after successful login + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip_md5); + return $remote_session; } else { $sql = "SELECT * FROM remote_user WHERE remote_username = ?"; - $remote_user = $app->db->queryOneRecord($sql, $username); + $remote_user = $app->db->queryOneRecord($sql, (string)$username); if($remote_user) { if(substr($remote_user['remote_password'], 0, 1) === '$') { if(crypt(stripslashes($password), $remote_user['remote_password']) != $remote_user['remote_password']) { @@ -138,7 +164,7 @@ class remoting { } elseif(md5($password) == $remote_user['remote_password']) { // update hash algo $sql = 'UPDATE `remote_user` SET `remote_password` = ? WHERE `remote_username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), $username); + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); } else { $remote_user = null; } @@ -185,15 +211,32 @@ class remoting { } //* Create a remote user session //srand ((double)microtime()*1000000); - $remote_session = md5(mt_rand().uniqid('ispco')); + $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).sha1(mt_rand().uniqid('ispco',true)); $remote_userid = $remote_user['remote_userid']; $remote_functions = $remote_user['remote_functions']; $tstamp = time() + $this->session_timeout; - $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,tstamp' - .') VALUES (?, ?, ?, ?)'; - $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp); + $sql = 'INSERT INTO remote_session (remote_session,remote_userid,remote_functions,tstamp,remote_ip' + .') VALUES (?, ?, ?, ?, ?)'; + $app->db->query($sql, $remote_session,$remote_userid,$remote_functions,$tstamp, $ip); + + //* Delete login attempts after successful login + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip_md5); + return $remote_session; } else { + + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } + throw new SoapFault('login_failed', 'The login failed. Username or password wrong.'); return false; } @@ -212,7 +255,7 @@ class remoting { } $sql = "DELETE FROM remote_session WHERE remote_session = ?"; - if($app->db->query($sql, $session_id) != false) { + if($app->db->query($sql, (string)$session_id) != false) { return true; } else { return false; @@ -522,12 +565,61 @@ class remoting { throw new SoapFault('session_id_empty', 'The SessionID is empty.'); return false; } + + if(!is_string($session_id)) { + throw new SoapFault('session_id_nostring', 'Wrong SessionID datatype.'); + return false; + } + + $ip_md5 = md5($_SERVER['REMOTE_ADDR']); + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 5 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql, $ip_md5); + + if($alreadyfailed['times'] > 10) { + throw new SoapFault('session_failure_limit', 'The Session failure limit has been reached.'); + return false; + } $sql = "SELECT * FROM remote_session WHERE remote_session = ? AND tstamp >= UNIX_TIMESTAMP()"; - $session = $app->db->queryOneRecord($sql, $session_id); + $session = $app->db->queryOneRecord($sql, (string)$session_id); + + if(!is_array($session)) { + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } + + throw new SoapFault('session_does_not_exist', 'The Session is expired or does not exist.'); + return false; + } + + $ip = $_SERVER['REMOTE_ADDR']; + if($session['remote_ip'] != $ip) { + throw new SoapFault('session_ip_mismatch', 'Session IP mismatch.'); + return false; + } + if($session['remote_userid'] > 0) { return $session; } else { + + if(!$alreadyfailed['times'] ) + { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip_md5); + } elseif($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip_md5); + } + throw new SoapFault('session_does_not_exist', 'The Session is expired or does not exist.'); return false; } diff --git a/interface/lib/classes/remoting_lib.inc.php b/interface/lib/classes/remoting_lib.inc.php index 6436e6e792..c496cb7e22 100644 --- a/interface/lib/classes/remoting_lib.inc.php +++ b/interface/lib/classes/remoting_lib.inc.php @@ -232,7 +232,7 @@ class remoting_lib extends tform_base { if(@is_numeric($primary_id)) { if($primary_id > 0) { // Return a single record - return parent::getDataRecord($primary_id); + return parent::getDataRecord(intval($primary_id)); } elseif($primary_id == -1) { // Return a array with all records $sql = "SELECT * FROM ??"; @@ -255,8 +255,8 @@ class remoting_lib extends tform_base { } else { $sql_where .= "?? = ? AND "; } - $params[] = $key; - $params[] = $val; + $params[] = (string)$key; + $params[] = (string)$val; } $sql_where = substr($sql_where, 0, -5); if($sql_where == '') $sql_where = '1'; diff --git a/interface/lib/classes/session.inc.php b/interface/lib/classes/session.inc.php index 3e93cd4314..55247621a3 100644 --- a/interface/lib/classes/session.inc.php +++ b/interface/lib/classes/session.inc.php @@ -70,9 +70,9 @@ class session { function read ($session_id) { if($this->timeout > 0) { - $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ? AND (`permanent` = 'y' OR last_updated >= DATE_SUB(NOW(), INTERVAL ? MINUTE))", $session_id, $this->timeout); + $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ? AND (`permanent` = 'y' OR last_updated >= DATE_SUB(NOW(), INTERVAL ? MINUTE))", (string)$session_id, $this->timeout); } else { - $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ?", $session_id); + $rec = $this->db->queryOneRecord("SELECT * FROM sys_session WHERE session_id = ?", (string)$session_id); } if (is_array($rec)) { @@ -91,18 +91,18 @@ class session { // Dont write session_data to DB if session data has not been changed after reading it. if(isset($this->session_array['session_data']) && $this->session_array['session_data'] != '' && $this->session_array['session_data'] == $session_data) { - $this->db->query("UPDATE sys_session SET last_updated = NOW() WHERE session_id = ?", $session_id); + $this->db->query("UPDATE sys_session SET last_updated = NOW() WHERE session_id = ?", (string)$session_id); return true; } if (@$this->session_array['session_id'] == '') { $sql = "REPLACE INTO sys_session (session_id,date_created,last_updated,session_data,permanent) VALUES (?,NOW(),NOW(),?,?)"; - $this->db->query($sql, $session_id, $session_data, ($this->permanent ? 'y' : 'n')); + $this->db->query($sql, (string)$session_id, $session_data, ($this->permanent ? 'y' : 'n')); } else { $sql = "UPDATE sys_session SET last_updated = NOW(), session_data = ?" . ($this->permanent ? ", `permanent` = 'y'" : "") . " WHERE session_id = ?"; - $this->db->query($sql, $session_data, $session_id); + $this->db->query($sql, $session_data, (string)$session_id); } @@ -112,7 +112,7 @@ class session { function destroy ($session_id) { $sql = "DELETE FROM sys_session WHERE session_id = ?"; - $this->db->query($sql, $session_id); + $this->db->query($sql, (string)$session_id); return true; } diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 58456dea0e..70c3dbe055 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -96,7 +96,7 @@ if(count($_POST) > 0) { /* this is the reseller, that shall be re-logged in */ $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, $username, $password); + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); $client_group_id = $app->functions->intval($tmp['default_group']); $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); @@ -118,7 +118,7 @@ if(count($_POST) > 0) { /* this is the user the reseller wants to 'login as' */ $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, $username, $password); + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); if(!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { @@ -146,13 +146,13 @@ if(count($_POST) > 0) { if ($loginAs){ $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $user = $app->db->queryOneRecord($sql, $username, $password); + $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); } else { if(stristr($username, '@')) { //* mailuser login $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; - $mailuser = $app->db->queryOneRecord($sql, $username, $app->functions->idn_encode($username)); + $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); $user = false; if($mailuser) { $saved_password = stripslashes($mailuser['password']); @@ -184,7 +184,7 @@ if(count($_POST) > 0) { } else { //* normal cp user login $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, $username); + $user = $app->db->queryOneRecord($sql, (string)$username); if($user) { $saved_password = stripslashes($user['passwort']); if(substr($saved_password, 0, 1) == '$') { @@ -199,7 +199,7 @@ if(count($_POST) > 0) { } else { // update password with secure algo $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), $username); + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); } } } else { diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 9c202542e8..37418149ae 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1371,6 +1371,7 @@ class system{ * Control services to restart etc * */ + /* function daemon_init($daemon, $action){ //* $action = start|stop|restart|reload global $app; @@ -1409,7 +1410,7 @@ class system{ } } } - } + } */ function netmask($netmask){ list($f1, $f2, $f3, $f4) = explode('.', trim($netmask)); @@ -2064,36 +2065,103 @@ class system{ } function _getinitcommand($servicename, $action, $init_script_directory = '', $check_service) { - global $conf; + global $conf, $app; + // upstart + /* removed upstart support - deprecated if(is_executable('/sbin/initctl')){ exec('/sbin/initctl version 2>/dev/null | /bin/grep -q upstart', $retval['output'], $retval['retval']); if(intval($retval['retval']) == 0) return 'service '.$servicename.' '.$action; } + */ + + if(!in_array($action,array('restart','reload','force-reload'))) { + $app->log('Invalid init command action '.$action,LOGLEVEL_WARN); + return false; + } - // systemd + //* systemd (now default in all supported OS) if(is_executable('/bin/systemd') || is_executable('/usr/bin/systemctl')){ - if ($check_service) { - $this->exec_safe("systemctl is-enabled ? 2>&1", $servicename); - $ret_val = $this->last_exec_retcode(); - } - if ($ret_val == 0 || !$check_service) { - return 'systemctl '.$action.' '.$servicename.'.service'; + $app->log('Trying to use Systemd to restart service',LOGLEVEL_DEBUG); + + //* Test service name via regex + if(preg_match('/[a-zA-Z0-9\.\-\_]/',$servicename)) { + + //* Test if systemd service is enabled + if ($check_service) { + $this->exec_safe("systemctl is-enabled ? 2>&1", $servicename); + $ret_val = $this->last_exec_retcode(); + } else { + $app->log('Systemd service '.$servicename.' not found or not enabled.',LOGLEVEL_DEBUG); + } + + //* Return service command + if ($ret_val == 0 || !$check_service) { + return 'systemctl '.$action.' '.$servicename.'.service'; + } else { + $app->log('Failed to use Systemd to restart service '.$servicename.', we try init script instead.',LOGLEVEL_DEBUG); + } + } else { + $app->log('Systemd service name contains invalid chars: '.$servicename,LOGLEVEL_DEBUG); } + } else { + $app->log('Not using Systemd to restart services',LOGLEVEL_DEBUG); } - // sysvinit + //* sysvinit fallback + $app->log('Using init script to restart service',LOGLEVEL_DEBUG); + + //* Get init script directory if($init_script_directory == '') $init_script_directory = $conf['init_scripts']; if(substr($init_script_directory, -1) === '/') $init_script_directory = substr($init_script_directory, 0, -1); - if($check_service && is_executable($init_script_directory.'/'.$servicename)) { - return $init_script_directory.'/'.$servicename.' '.$action; + $init_script_directory = realpath($init_script_directory); + + //* Check init script dir + if(!is_dir($init_script_directory)) { + $app->log('Init script directory '.$init_script_directory.' not found',LOGLEVEL_WARN); + return false; + } + + //* Forbidden init script paths + if(substr($init_script_directory,0,4) == '/var' || substr($init_script_directory,0,4) == '/tmp') { + $app->log('Do not put init scripts in /var or /tmp folder.',LOGLEVEL_WARN); + return false; + } + + //* Check init script dir owner + if(fileowner($init_script_directory) !== 0) { + $app->log('Init script directory '.$init_script_directory.' not owned by root user',LOGLEVEL_WARN); + return false; + } + + $full_init_script_path = realpath($init_script_directory.'/'.$servicename); + + if($full_init_script_path == '') { + $app->log('No init script, we quit here.',LOGLEVEL_WARN); + return false; + } + + //* Check init script + if(!is_file($full_init_script_path)) { + $app->log('Init script '.$full_init_script_path.' not found',LOGLEVEL_WARN); + return false; + } + + //* Check init script owner + if(fileowner($full_init_script_path) !== 0) { + $app->log('Init script '.$full_init_script_path.' not owned by root user',LOGLEVEL_WARN); + return false; + } + + if($check_service && is_executable($full_init_script_path)) { + return $full_init_script_path.' '.$action; } if (!$check_service) { - return $init_script_directory.'/'.$servicename.' '.$action; + return $full_init_script_path.' '.$action; } } - function getinitcommand($servicename, $action, $init_script_directory = '', $check_service=false) { + function getinitcommand($servicename, $action, $init_script_directory = '', $check_service=true) { if (is_array($servicename)) { foreach($servicename as $service) { $out = $this->_getinitcommand($service, $action, $init_script_directory, true); diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php index 6019100ed7..bb2de0d1de 100644 --- a/server/mods-available/web_module.inc.php +++ b/server/mods-available/web_module.inc.php @@ -242,15 +242,20 @@ class web_module { return $retval; } } - - exec($cmd.' 2>&1', $retval['output'], $retval['retval']); + + $app->log("Restarting httpd: $cmd", LOGLEVEL_DEBUG); + + if($cmd != '') { + exec($cmd.' 2>&1', $retval['output'], $retval['retval']); + } else { + $app->log('We got no init command, restart or reload of service aborted.',LOGLEVEL_WARN); + } // if restart failed despite successful syntax check => try again if($web_config['server_type'] == 'nginx' && $retval['retval'] > 0){ sleep(2); exec($cmd.' 2>&1', $retval['output'], $retval['retval']); } - $app->log("Restarting httpd: $cmd", LOGLEVEL_DEBUG); // nginx: do a syntax check because on some distributions, the init script always returns 0 - even if the syntax is not ok (how stupid is that?) //if($web_config['server_type'] == 'nginx' && $retval['retval'] == 0){ @@ -307,10 +312,16 @@ class web_module { } */ } - - $retval = array('output' => '', 'retval' => 0); - exec($initcommand.' 2>&1', $retval['output'], $retval['retval']); + $app->log("Restarting php-fpm: $initcommand", LOGLEVEL_DEBUG); + + if($initcommand != '') { + $retval = array('output' => '', 'retval' => 0); + exec($initcommand.' 2>&1', $retval['output'], $retval['retval']); + } else { + $app->log('We got no init command, restart or reload of php-fpm service aborted.',LOGLEVEL_WARN); + } + return $retval; } -- GitLab From cfe9bd3fb2b8a9ee33ca25c82b764607a4e75ac2 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Tue, 19 Oct 2021 15:39:22 +0200 Subject: [PATCH 1262/1368] Changed lockout conditions. --- interface/lib/classes/remoting.inc.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index 20181102ae..80e30bf849 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -91,7 +91,7 @@ class remoting { $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 5 MINUTE) LIMIT 1"; $alreadyfailed = $app->db->queryOneRecord($sql, $ip_md5); - if($alreadyfailed['times'] > 10) { + if($alreadyfailed['times'] >= 10) { throw new SoapFault('login_failure_limit', 'The login failure limit has been reached.'); return false; } @@ -121,7 +121,7 @@ class remoting { $app->db->query($sql, $ip_md5); } elseif($alreadyfailed['times'] >= 1) { //* update times wrong - $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? ORDER BY `login_time` DESC LIMIT 1"; $app->db->query($sql, $ip_md5); } throw new SoapFault('client_login_failed', 'The login failed. Username or password wrong.'); @@ -233,7 +233,7 @@ class remoting { $app->db->query($sql, $ip_md5); } elseif($alreadyfailed['times'] >= 1) { //* update times wrong - $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? ORDER BY `login_time` DESC LIMIT 1"; $app->db->query($sql, $ip_md5); } @@ -575,7 +575,7 @@ class remoting { $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 5 MINUTE) LIMIT 1"; $alreadyfailed = $app->db->queryOneRecord($sql, $ip_md5); - if($alreadyfailed['times'] > 10) { + if($alreadyfailed['times'] >= 10) { throw new SoapFault('session_failure_limit', 'The Session failure limit has been reached.'); return false; } @@ -591,7 +591,7 @@ class remoting { $app->db->query($sql, $ip_md5); } elseif($alreadyfailed['times'] >= 1) { //* update times wrong - $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? ORDER BY `login_time` DESC LIMIT 1"; $app->db->query($sql, $ip_md5); } -- GitLab From 99b8b423453979ea97849889ad209670ce9d730b Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 20 Oct 2021 10:35:53 +0200 Subject: [PATCH 1263/1368] - hide mail whilelist / blacklist from menu of client when limit is 0 --- interface/web/mail/lib/module.conf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/mail/lib/module.conf.php b/interface/web/mail/lib/module.conf.php index fbe8ffbcb5..05910e6c46 100644 --- a/interface/web/mail/lib/module.conf.php +++ b/interface/web/mail/lib/module.conf.php @@ -61,7 +61,7 @@ if($app->auth->get_client_limit($userid, 'mailcatchall') != 0) 'html_id' => 'mail_domain_catchall_list'); } -if(! $app->auth->is_admin()) +if(! $app->auth->is_admin() && $app->auth->get_client_limit($userid, 'mail_wblist') != 0) { $items[] = array( 'title' => 'Email Whitelist', 'target' => 'content', -- GitLab From b428474e5acbf6e4c3847f41748fa8868e514c69 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Wed, 20 Oct 2021 13:42:29 +0200 Subject: [PATCH 1264/1368] global options must be placed before the actual command --- server/lib/classes/cron.d/500-backup_mail.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/500-backup_mail.inc.php b/server/lib/classes/cron.d/500-backup_mail.inc.php index 6a133fa839..4dcb199414 100644 --- a/server/lib/classes/cron.d/500-backup_mail.inc.php +++ b/server/lib/classes/cron.d/500-backup_mail.inc.php @@ -126,7 +126,7 @@ class cronjob_backup_mail extends cronjob { if ($rec['maildir_format'] == 'mdbox') { if (empty($this->tmp_backup_dir)) $this->tmp_backup_dir = $rec['maildir']; // Create temporary backup-mailbox - $app->system->exec_safe("su -c ?", 'dsync backup -o plugin/acl= -o plugin/quota= -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup'); + $app->system->exec_safe("su -c ?", 'dsync -o plugin/acl= -o plugin/quota= backup -u "'.$rec["email"].'" mdbox:' . $this->tmp_backup_dir . '/backup'); if($backup_mode == 'userzip') { $mail_backup_file.='.zip'; -- GitLab From a0c3cdab7296b1c485041e74ccd0f37f52af04e2 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 21 Oct 2021 16:11:19 +0200 Subject: [PATCH 1265/1368] - renamed incremental sql file for release --- install/sql/incremental/upd_0095.sql | 1 + install/sql/incremental/upd_dev_collection.sql | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 install/sql/incremental/upd_0095.sql diff --git a/install/sql/incremental/upd_0095.sql b/install/sql/incremental/upd_0095.sql new file mode 100644 index 0000000000..0a17c38737 --- /dev/null +++ b/install/sql/incremental/upd_0095.sql @@ -0,0 +1 @@ +ALTER TABLE `remote_session` ADD `remote_ip` VARCHAR(39) NOT NULL DEFAULT '' AFTER `tstamp`; \ No newline at end of file diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index 0a17c38737..e69de29bb2 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -1 +0,0 @@ -ALTER TABLE `remote_session` ADD `remote_ip` VARCHAR(39) NOT NULL DEFAULT '' AFTER `tstamp`; \ No newline at end of file -- GitLab From ae955620e9e1f5461ed1c82a138720124634a8ab Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 21 Oct 2021 16:04:40 -0600 Subject: [PATCH 1266/1368] fix conflicting $ip tmp variable name --- interface/lib/classes/remoting.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index 80e30bf849..bc75fee36b 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -196,9 +196,9 @@ class remoting { if(trim($remote_user['remote_ips']) == '') { $remote_allowed=true; } else { - $ip = inet_pton($_SERVER['REMOTE_ADDR']); + $ip_bin = inet_pton($ip); foreach($allowed_ips as $allowed) { - if($ip == inet_pton(trim($allowed))) { + if($ip_bin == inet_pton(trim($allowed))) { $remote_allowed=true; break; } -- GitLab From 8eed1daed814b28d2fce96eb78c575f23fd60d6c Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Fri, 22 Oct 2021 09:25:30 +0200 Subject: [PATCH 1267/1368] - allow patch version in release scripts --- .gitlab-ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6eedb90374..e7a4bf8148 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,7 +17,7 @@ syntax:lint: - schedules - web - merge_requests - - /^\d+\.\d+\.\d+$/ + - /^\d+\.\d+\.\d+(p\d+)?$/ script: - echo "Syntax checking PHP files" @@ -37,7 +37,7 @@ syntax_diff:lint: - schedules - web - merge_requests - - /^\d+\.\d+\.\d+$/ + - /^\d+\.\d+\.\d+(p\d+)?$/ script: - echo "Syntax checking PHP files" @@ -81,7 +81,7 @@ build:package: image: edbizarro/gitlab-ci-pipeline-php:7.2 only: refs: - - /^\d+\.\d+\.\d+$/ + - /^\d+\.\d+\.\d+(p\d+)?$/ - web script: @@ -96,7 +96,7 @@ build:package: - tar -tvf ISPConfig-${VER}.tar.gz - echo "Uploading file to download server" - curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ - - if [[ "$VER" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] ; then echo "Stable release ${VER}" ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ISPConfig-3-stable.tar.gz ; echo -n "${VER}" > ispconfig3_version.txt ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ispconfig3_version.txt ftp://${DEPLOY_FTP_SERVER}/web/ ; else echo "Dev release ${VER}" ; fi + - if [[ "$VER" =~ ^[0-9]+\.[0-9]+\.[0-9]+(p[0-9]+)?$ ]] ; then echo "Stable release ${VER}" ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ISPConfig-${VER}.tar.gz ftp://${DEPLOY_FTP_SERVER}/web/ISPConfig-3-stable.tar.gz ; echo -n "${VER}" > ispconfig3_version.txt ; curl -u "${DEPLOY_FTP_USER}:${DEPLOY_FTP_PASSWORD}" -T ispconfig3_version.txt ftp://${DEPLOY_FTP_SERVER}/web/ ; else echo "Dev release ${VER}" ; fi - rm ISPConfig-${VER}.tar.gz - echo "Download url is https://download.ispconfig.org/ISPConfig-${VER}.tar.gz" -- GitLab From 1aab22d6d8d000b2d4449527b9b2f75a44c69ee1 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 2 Nov 2021 20:04:05 +0000 Subject: [PATCH 1268/1368] Update rspamd_classifier-bayes.conf.master with junk_threshold --- server/conf/rspamd_classifier-bayes.conf.master | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/conf/rspamd_classifier-bayes.conf.master b/server/conf/rspamd_classifier-bayes.conf.master index c9e83495aa..0906bfe63e 100644 --- a/server/conf/rspamd_classifier-bayes.conf.master +++ b/server/conf/rspamd_classifier-bayes.conf.master @@ -6,8 +6,9 @@ servers = ""; password = "";
    autolearn { - spam_threshold = 6.0; - ham_threshold = -0.5; # When to learn ham (score <= threshold) + spam_threshold = 6.0; # When to learn spam (score >= threshold and action is reject) + junk_threshold = 4.0; # When to learn spam (score >= threshold and action is rewrite subject or add header, and has two or more positive results) + ham_threshold = -0.5; # When to learn ham (score <= threshold and action is no action, and score is negative or has three or more negative results) check_balance = true; # Check spam and ham balance min_balance = 0.9; # Keep diff for spam/ham learns for at least this value } -- GitLab From 22513694ce3888351c4e1042009ed6cae215184d Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 3 Nov 2021 20:26:03 +0000 Subject: [PATCH 1269/1368] jailkit: add utilities to 'wp' jail --- install/tpl/jk_init.ini.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 2563c40b04..e33383da5f 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -160,7 +160,7 @@ paths = cat, chgrp, chmod, chown, cp, date, dd, df, dir, echo, false, ln, ls, mk [wp] comment = WordPress Command Line -paths = wp, /usr/local/bin/php +paths = wp, which, mysqlcheck, tput, unrar, /usr/local/bin/php includesections = php, mysql-client [mysql-client] -- GitLab From 3fd9dd1b89f3372b65871f99cfe66e1be9b1e9cf Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 16 Nov 2021 11:59:37 -0700 Subject: [PATCH 1270/1368] fix certbot symlink creation when certificate files exist --- install/lib/installer_base.lib.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index bc6306d697..af4132a5e3 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3133,6 +3133,12 @@ class installer_base { // certbot returns with 0 on issue for already existing certificate $acme_cert_dir = '/etc/letsencrypt/live/' . $hostname; + foreach (array( 'fullchain.pem', 'privkey.pem' ) as $f) { + $f = $acme_cert_dir . '/' . $f; + if (file_exists($f) && ! is_link($f)) { + unlink($f); + } + } symlink($acme_cert_dir . '/fullchain.pem', $ssl_crt_file); symlink($acme_cert_dir . '/privkey.pem', $ssl_key_file); -- GitLab From 91c3b7d9a63a4e8e17f8cfecb7e3e3568fcb1642 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 17 Nov 2021 07:47:31 -0700 Subject: [PATCH 1271/1368] installer: fix checked wrong cert files for removal --- install/lib/installer_base.lib.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index af4132a5e3..d5f3f6b6aa 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -3133,8 +3133,7 @@ class installer_base { // certbot returns with 0 on issue for already existing certificate $acme_cert_dir = '/etc/letsencrypt/live/' . $hostname; - foreach (array( 'fullchain.pem', 'privkey.pem' ) as $f) { - $f = $acme_cert_dir . '/' . $f; + foreach (array( $ssl_crt_file, $ssl_key_file) as $f) { if (file_exists($f) && ! is_link($f)) { unlink($f); } -- GitLab From d427917afb442e074279a062b76d92106aad3b08 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 18 Nov 2021 11:10:17 -0700 Subject: [PATCH 1272/1368] restrict mailq access --- install/tpl/debian_postfix.conf.master | 2 ++ install/tpl/fedora_postfix.conf.master | 2 ++ install/tpl/gentoo_postfix.conf.master | 2 ++ install/tpl/opensuse_postfix.conf.master | 2 ++ 4 files changed, 8 insertions(+) diff --git a/install/tpl/debian_postfix.conf.master b/install/tpl/debian_postfix.conf.master index 5023caf6be..8bd34f6928 100644 --- a/install/tpl/debian_postfix.conf.master +++ b/install/tpl/debian_postfix.conf.master @@ -59,3 +59,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/fedora_postfix.conf.master b/install/tpl/fedora_postfix.conf.master index c5786c6ea8..8d2b1a9dc2 100644 --- a/install/tpl/fedora_postfix.conf.master +++ b/install/tpl/fedora_postfix.conf.master @@ -55,3 +55,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/gentoo_postfix.conf.master b/install/tpl/gentoo_postfix.conf.master index 405640f52a..c6b1c2f9c5 100644 --- a/install/tpl/gentoo_postfix.conf.master +++ b/install/tpl/gentoo_postfix.conf.master @@ -54,3 +54,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga diff --git a/install/tpl/opensuse_postfix.conf.master b/install/tpl/opensuse_postfix.conf.master index a98f4223e1..03f134bb08 100644 --- a/install/tpl/opensuse_postfix.conf.master +++ b/install/tpl/opensuse_postfix.conf.master @@ -57,3 +57,5 @@ smtp_sender_dependent_authentication = yes smtp_sasl_auth_enable = yes smtp_sasl_security_options = noanonymous, noplaintext smtp_sasl_tls_security_options = noanonymous +authorized_flush_users = +authorized_mailq_users = nagios, icinga -- GitLab From dc1b9064ced98f74949363eb551e28ade71bd83f Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Fri, 19 Nov 2021 07:18:59 -0700 Subject: [PATCH 1273/1368] fix letsencrypt_renew_hook.sh syntax error --- server/scripts/letsencrypt_renew_hook.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/scripts/letsencrypt_renew_hook.sh b/server/scripts/letsencrypt_renew_hook.sh index 63100ed650..5ec9912f59 100644 --- a/server/scripts/letsencrypt_renew_hook.sh +++ b/server/scripts/letsencrypt_renew_hook.sh @@ -36,15 +36,15 @@ if [ -d "$lelive" ]; then pureftpdpem=/etc/ssl/private/pure-ftpd.pem; if [ -e "$pureftpdpem" ]; then chmod 600 $pureftpdpem; fi # For Red Hat, Centos or derivatives if which yum &> /dev/null 2>&1 ; then - if [ rpm -q pure-ftpd ]; then service pure-ftpd restart; fi - if [ rpm -q monit ]; then service monit restart; fi - if [ rpm -q postfix ]; then service postfix restart; fi - if [ rpm -q dovecot ]; then service dovecot restart; fi - if [ rpm -q mysql-server ]; then service mysqld restart; fi - if [ rpm -q mariadb-server ]; then service mariadb restart; fi - if [ rpm -q MariaDB-server ]; then service mysql restart; fi - if [ rpm -q nginx ]; then service nginx restart; fi - if [ rpm -q httpd ]; then service httpd restart; fi + if ( rpm -q pure-ftpd ); then service pure-ftpd restart; fi + if ( rpm -q monit ); then service monit restart; fi + if ( rpm -q postfix ); then service postfix restart; fi + if ( rpm -q dovecot ); then service dovecot restart; fi + if ( rpm -q mysql-server ); then service mysqld restart; fi + if ( rpm -q mariadb-server ); then service mariadb restart; fi + if ( rpm -q MariaDB-server ); then service mysql restart; fi + if ( rpm -q nginx ); then service nginx restart; fi + if ( rpm -q httpd ); then service httpd restart; fi # For Debian, Ubuntu or derivatives elif apt-get -v >/dev/null 2>&1 ; then if [ $(dpkg-query -W -f='${Status}' pure-ftpd-mysql 2>/dev/null | grep -c "ok installed") -eq 1 ]; then service pure-ftpd-mysql restart; fi -- GitLab From d3f3b3ec3ea2443285ce4ffd646869a7fe120751 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 01:32:57 +0100 Subject: [PATCH 1274/1368] Cosmetic: Fixed some minor typos. --- interface/web/login/index.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 70c3dbe055..b518d6cf87 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -31,7 +31,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. require_once '../../lib/config.inc.php'; require_once '../../lib/app.inc.php'; -// Check if we have an active users ession and no login_as. +// Check if we have an active users session and no login_as. if($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { header('Location: /index.php'); die(); @@ -139,7 +139,7 @@ if(count($_POST) > 0) { $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; $alreadyfailed = $app->db->queryOneRecord($sql, $ip); - //* too many failedlogins + //* too many failed logins if($alreadyfailed['times'] > 5) { $error = $app->lng('error_user_too_many_logins'); } else { @@ -264,7 +264,7 @@ if(count($_POST) > 0) { $app->plugin->raiseEvent('login', $username); - //* Save successfull login message to var + //* Save successful login message to var $authlog = 'Successful login for user \''. $username .'\' from '. $_SERVER['REMOTE_ADDR'] .' at '. date('Y-m-d H:i:s') . ' with session ID ' .session_id(); $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); fwrite($authlog_handle, $authlog ."\n"); @@ -316,7 +316,7 @@ if(count($_POST) > 0) { } } -// Maintenance mode - show message when people try to log in and also when people are forcedly logged off +// Maintenance mode - show message when people try to log in and also when people are forcibly logged off if($maintenance_mode_error != '') $error = ''.$maintenance_mode_error.'

    '.$error; if($error != ''){ $error = '
    '.$error.'
    '; -- GitLab From 2d273538c11c25d2fc4f5db8c5a09312e6f4bd71 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 01:34:30 +0100 Subject: [PATCH 1275/1368] Cosmetic: Code format. --- interface/web/capp.php | 16 ++--- interface/web/login/index.php | 110 +++++++++++++++++----------------- 2 files changed, 62 insertions(+), 64 deletions(-) diff --git a/interface/web/capp.php b/interface/web/capp.php index 5d49fe80d7..1362eb8ebc 100644 --- a/interface/web/capp.php +++ b/interface/web/capp.php @@ -37,31 +37,31 @@ $mod = $_REQUEST["mod"]; $redirect = (isset($_REQUEST["redirect"]) ? $_REQUEST["redirect"] : ''); //* Check if user is logged in -if($_SESSION["s"]["user"]['active'] != 1) { +if ($_SESSION["s"]["user"]['active'] != 1) { die("URL_REDIRECT: /index.php"); //die(); } -if(!preg_match("/^[a-z]{2,20}$/i", $mod)) die('module name contains unallowed chars.'); -if($redirect != '' && !preg_match("/^[a-z0-9]+\/[a-z0-9_\.\-]+\?id=[0-9]{1,9}(\&type=[a-z0-9_\.\-]+)?$/i", $redirect)) die('redirect contains unallowed chars.'); +if (!preg_match("/^[a-z]{2,20}$/i", $mod)) die('module name contains unallowed chars.'); +if ($redirect != '' && !preg_match("/^[a-z0-9]+\/[a-z0-9_\.\-]+\?id=[0-9]{1,9}(\&type=[a-z0-9_\.\-]+)?$/i", $redirect)) die('redirect contains unallowed chars.'); //* Check if user may use the module. $user_modules = explode(",", $_SESSION["s"]["user"]["modules"]); -if(!in_array($mod, $user_modules)) $app->error($app->lng(301)); +if (!in_array($mod, $user_modules)) $app->error($app->lng(301)); //* Load module configuration into the session. -if(is_file($mod."/lib/module.conf.php")) { +if (is_file($mod."/lib/module.conf.php")) { include_once $mod."/lib/module.conf.php"; - $menu_dir = ISPC_WEB_PATH.'/' . $mod . '/lib/menu.d'; + $menu_dir = ISPC_WEB_PATH.'/'.$mod.'/lib/menu.d'; if (is_dir($menu_dir)) { if ($dh = opendir($menu_dir)) { //** Go through all files in the menu dir while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { - include_once $menu_dir . '/' . $file; + include_once $menu_dir.'/'.$file; } } } @@ -69,7 +69,7 @@ if(is_file($mod."/lib/module.conf.php")) { $_SESSION["s"]["module"] = $module; session_write_close(); - if($redirect == ''){ + if ($redirect == '') { echo "HEADER_REDIRECT:".$_SESSION["s"]["module"]["startpage"]; } else { //* If we click on a search result, load that one instead of the module's start page diff --git a/interface/web/login/index.php b/interface/web/login/index.php index b518d6cf87..5f016dbc5c 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -32,7 +32,7 @@ require_once '../../lib/config.inc.php'; require_once '../../lib/app.inc.php'; // Check if we have an active users session and no login_as. -if($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { +if ($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { header('Location: /index.php'); die(); } @@ -49,30 +49,30 @@ $app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); $maintenance_mode = false; $maintenance_mode_error = ''; $server_config_array = $app->getconf->get_global_config('misc'); -if($app->is_under_maintenance()) { +if ($app->is_under_maintenance()) { $maintenance_mode = true; $maintenance_mode_error = $app->lng('error_maintenance_mode'); } //* Login Form was sent -if(count($_POST) > 0) { +if (count($_POST) > 0) { //** Check variables - if(!preg_match("/^[\w\.\-\_\@]{1,128}$/", $app->functions->idn_encode($_POST['username']))) $error = $app->lng('user_regex_error'); - if(!preg_match("/^.{1,256}$/i", $_POST['password'])) $error = $app->lng('pw_error_length'); + if (!preg_match("/^[\w\.\-\_\@]{1,128}$/", $app->functions->idn_encode($_POST['username']))) $error = $app->lng('user_regex_error'); + if (!preg_match("/^.{1,256}$/i", $_POST['password'])) $error = $app->lng('pw_error_length'); //** importing variables $ip = md5($_SERVER['REMOTE_ADDR']); $username = $_POST['username']; $password = $_POST['password']; - $loginAs = false; + $loginAs = false; $time = time(); - if($username != '' && $password != '' && $error == '') { + if ($username != '' && $password != '' && $error == '') { /* * Check, if there is a "login as" instead of a "normal" login */ - if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1){ + if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1) { /* * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we * open the startpage (after killing the old session), so the user @@ -84,11 +84,11 @@ if(count($_POST) > 0) { * has logged in as "normal" user before... */ - if (isset($_SESSION['s_old'])&& ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))){ + if (isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))) { /* The "old" user is admin or reseller, so everything is ok * if he is reseller, we need to check if he logs in to one of his clients */ - if($_SESSION['s_old']['user']['typ'] != 'admin') { + if ($_SESSION['s_old']['user']['typ'] != 'admin') { /* this is the one currently logged in (normal user) */ $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); @@ -100,18 +100,17 @@ if(count($_POST) > 0) { $client_group_id = $app->functions->intval($tmp['default_group']); $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - if(!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"] ) { + if (!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"]) { die("You don't have the right to 'login as' this user!"); } unset($old_client); unset($tmp_client); unset($tmp); } - } - else { + } else { die("You don't have the right to 'login as'!"); } - } elseif($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { + } elseif ($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { /* a reseller wants to 'login as', we need to check if he is allowed to */ $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); @@ -121,7 +120,7 @@ if(count($_POST) > 0) { $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); - if(!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { + if (!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { die("You don't have the right to login as this user!"); } unset($res_client); @@ -140,26 +139,26 @@ if(count($_POST) > 0) { $alreadyfailed = $app->db->queryOneRecord($sql, $ip); //* too many failed logins - if($alreadyfailed['times'] > 5) { + if ($alreadyfailed['times'] > 5) { $error = $app->lng('error_user_too_many_logins'); } else { - if ($loginAs){ + if ($loginAs) { $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); } else { - if(stristr($username, '@')) { + if (stristr($username, '@')) { //* mailuser login $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); $user = false; - if($mailuser) { + if ($mailuser) { $saved_password = stripslashes($mailuser['password']); //* Check if mailuser password is correct - if(crypt(stripslashes($password), $saved_password) == $saved_password) { + if (crypt(stripslashes($password), $saved_password) == $saved_password) { //* Get the sys_user language of the client of the mailuser - $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid'] ); + $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); //* we build a fake user here which has access to the mailuser module only and userid 0 $user = array(); @@ -170,7 +169,7 @@ if(count($_POST) > 0) { $user['typ'] = 'user'; $user['email'] = $mailuser['email']; $user['username'] = $username; - if(is_array($sys_user_lang) && $sys_user_lang['language'] != '') { + if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { $user['language'] = $sys_user_lang['language']; } else { $user['language'] = $conf['language']; @@ -185,16 +184,16 @@ if(count($_POST) > 0) { //* normal cp user login $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; $user = $app->db->queryOneRecord($sql, (string)$username); - if($user) { + if ($user) { $saved_password = stripslashes($user['passwort']); - if(substr($saved_password, 0, 1) == '$') { + if (substr($saved_password, 0, 1) == '$') { //* The password is encrypted with crypt - if(crypt(stripslashes($password), $saved_password) != $saved_password) { + if (crypt(stripslashes($password), $saved_password) != $saved_password) { $user = false; } } else { //* The password is md5 encrypted - if(md5($password) != $saved_password) { + if (md5($password) != $saved_password) { $user = false; } else { // update password with secure algo @@ -208,10 +207,10 @@ if(count($_POST) > 0) { } } - if($user) { - if($user['active'] == 1) { + if ($user) { + if ($user['active'] == 1) { // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin - if(!$app->is_under_maintenance() || $user['typ'] == 'admin'){ + if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { // User login right, so attempts can be deleted $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; @@ -225,7 +224,7 @@ if(count($_POST) > 0) { // this problem. $app->uses('getconf'); $security_config = $app->getconf->get_security_config('permissions'); - if(isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { + if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { if (!$loginAs) session_regenerate_id(true); } $_SESSION = array(); @@ -236,25 +235,25 @@ if(count($_POST) > 0) { $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; - if(is_file(ISPC_WEB_PATH . '/' . $_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { - include_once $app->functions->check_include_path(ISPC_WEB_PATH . '/' . $_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); - $menu_dir = ISPC_WEB_PATH.'/' . $_SESSION['s']['user']['startmodule'] . '/lib/menu.d'; - if (is_dir($menu_dir)) { + if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; + if (is_dir($menu_dir)) { if ($dh = opendir($menu_dir)) { //** Go through all files in the menu dir while (($file = readdir($dh)) !== false) { if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { - include_once $menu_dir . '/' . $file; + include_once $menu_dir.'/'.$file; } } } } $_SESSION['s']['module'] = $module; } - // check if the user theme is valid - if($_SESSION['s']['user']['theme'] != 'default') { + // check if the user theme is valid + if ($_SESSION['s']['user']['theme'] != 'default') { $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; - if(!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { + if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { // fall back to default theme if this one is not compatible with current ispc version $_SESSION['s']['user']['theme'] = 'default'; $_SESSION['s']['theme'] = 'default'; @@ -265,9 +264,9 @@ if(count($_POST) > 0) { $app->plugin->raiseEvent('login', $username); //* Save successful login message to var - $authlog = 'Successful login for user \''. $username .'\' from '. $_SERVER['REMOTE_ADDR'] .' at '. date('Y-m-d H:i:s') . ' with session ID ' .session_id(); + $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog ."\n"); + fwrite($authlog_handle, $authlog."\n"); fclose($authlog_handle); /* @@ -275,7 +274,7 @@ if(count($_POST) > 0) { * new theme, if the logged-in user has another */ - if ($loginAs){ + if ($loginAs) { echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; exit; } else { @@ -287,38 +286,37 @@ if(count($_POST) > 0) { $error = $app->lng('error_user_blocked'); } } else { - if(!$alreadyfailed['times'] ) - { + if (!$alreadyfailed['times']) { //* user login the first time wrong $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; $app->db->query($sql, $ip); - } elseif($alreadyfailed['times'] >= 1) { + } elseif ($alreadyfailed['times'] >= 1) { //* update times wrong $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; $app->db->query($sql, $ip); } //* Incorrect login - Username and password incorrect $error = $app->lng('error_user_password_incorrect'); - if($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; + if ($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; $app->plugin->raiseEvent('login_failed', $username); //* Save failed login message to var - $authlog = 'Failed login for user \''. $username .'\' from '. $_SERVER['REMOTE_ADDR'] .' at '. date('Y-m-d H:i:s'); + $authlog = 'Failed login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s'); $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog ."\n"); + fwrite($authlog_handle, $authlog."\n"); fclose($authlog_handle); } } - } else { + } else { //* Username or password empty - if($error == '') $error = $app->lng('error_user_password_empty'); - $app->plugin->raiseEvent('login_empty', $username); + if ($error == '') $error = $app->lng('error_user_password_empty'); + $app->plugin->raiseEvent('login_empty', $username); } } // Maintenance mode - show message when people try to log in and also when people are forcibly logged off -if($maintenance_mode_error != '') $error = ''.$maintenance_mode_error.'

    '.$error; -if($error != ''){ +if ($maintenance_mode_error != '') $error = ''.$maintenance_mode_error.'

    '.$error; +if ($error != '') { $error = '
    '.$error.'
    '; } @@ -326,7 +324,7 @@ $app->load('getconf'); $sys_config = $app->getconf->get_global_config('misc'); $security_config = $app->getconf->get_security_config('permissions'); -if($security_config['password_reset_allowed'] == 'yes') { +if ($security_config['password_reset_allowed'] == 'yes') { $app->tpl->setVar('pw_lost_show', 1); } else { $app->tpl->setVar('pw_lost_show', 0); @@ -348,7 +346,7 @@ $app->tpl->setVar('current_theme', isset($_SESSION['s']['theme']) ? $_SESSION['s // Logo $logo = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1"); -if($logo['custom_logo'] != ''){ +if ($logo['custom_logo'] != '') { $base64_logo_txt = $logo['custom_logo']; } else { $base64_logo_txt = $logo['default_logo']; @@ -361,12 +359,12 @@ $app->tpl->setVar('base64_logo_txt', $base64_logo_txt); // Title if (!empty($sys_config['company_name'])) { - $app->tpl->setVar('company_name', $sys_config['company_name']. ' :: '); + $app->tpl->setVar('company_name', $sys_config['company_name'].' :: '); } // Custom Login if ($sys_config['custom_login_text'] != '') { - $custom_login = @($sys_config['custom_login_link'] != '')?''.$sys_config['custom_login_text'].'':$sys_config['custom_login_text']; + $custom_login = @($sys_config['custom_login_link'] != '') ? ''.$sys_config['custom_login_text'].'' : $sys_config['custom_login_text']; } $app->tpl->setVar('custom_login', $custom_login); -- GitLab From 7ce32a2061625663a1c3a4adbe4ea92509f390ca Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 01:51:15 +0100 Subject: [PATCH 1276/1368] Refactor: Extracted some common code as include_menu_dir_files() method in a new file named common.php. --- interface/web/capp.php | 14 ++------- interface/web/common.php | 53 +++++++++++++++++++++++++++++++++++ interface/web/login/index.php | 13 ++------- 3 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 interface/web/common.php diff --git a/interface/web/capp.php b/interface/web/capp.php index 1362eb8ebc..71d3d9ba35 100644 --- a/interface/web/capp.php +++ b/interface/web/capp.php @@ -31,6 +31,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. require_once '../lib/config.inc.php'; require_once '../lib/app.inc.php'; +include_once 'common.php'; + //* Import module variable $mod = $_REQUEST["mod"]; //* If we click on a search result, load that one instead of the module's start page @@ -55,17 +57,7 @@ if (is_file($mod."/lib/module.conf.php")) { include_once $mod."/lib/module.conf.php"; $menu_dir = ISPC_WEB_PATH.'/'.$mod.'/lib/menu.d'; - - if (is_dir($menu_dir)) { - if ($dh = opendir($menu_dir)) { - //** Go through all files in the menu dir - while (($file = readdir($dh)) !== false) { - if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { - include_once $menu_dir.'/'.$file; - } - } - } - } + include_menu_dir_files($menu_dir); $_SESSION["s"]["module"] = $module; session_write_close(); diff --git a/interface/web/common.php b/interface/web/common.php new file mode 100644 index 0000000000..2713ed4ed6 --- /dev/null +++ b/interface/web/common.php @@ -0,0 +1,53 @@ + 0) { if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; - if (is_dir($menu_dir)) { - if ($dh = opendir($menu_dir)) { - //** Go through all files in the menu dir - while (($file = readdir($dh)) !== false) { - if ($file != '.' && $file != '..' && substr($file, -9, 9) == '.menu.php' && $file != 'dns_resync.menu.php') { - include_once $menu_dir.'/'.$file; - } - } - } - } + include_menu_dir_files($menu_dir); $_SESSION['s']['module'] = $module; } // check if the user theme is valid -- GitLab From 324ec734b7b3bd0e8ecaa94b1db7062ed5cfd2e0 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 02:37:34 +0100 Subject: [PATCH 1277/1368] Refactor process_login_request 1: Extract method process_login_request(). --- interface/web/login/index.php | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 228d921cd0..861c9d9836 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -56,9 +56,15 @@ if ($app->is_under_maintenance()) { $maintenance_mode_error = $app->lng('error_maintenance_mode'); } -//* Login Form was sent -if (count($_POST) > 0) { - +/** + * @param app $app + * @param $error + * @param $conf + * @param $module + * @return void + */ +function process_login_request(app $app, &$error, $conf, $module) +{ //** Check variables if (!preg_match("/^[\w\.\-\_\@]{1,128}$/", $app->functions->idn_encode($_POST['username']))) $error = $app->lng('user_regex_error'); if (!preg_match("/^.{1,256}$/i", $_POST['password'])) $error = $app->lng('pw_error_length'); @@ -307,6 +313,11 @@ if (count($_POST) > 0) { } } +//* Login Form was sent +if (count($_POST) > 0) { + process_login_request($app, $error, $conf, $module); +} + // Maintenance mode - show message when people try to log in and also when people are forcibly logged off if ($maintenance_mode_error != '') $error = ''.$maintenance_mode_error.'

    '.$error; if ($error != '') { -- GitLab From f877cdef136af416f414d2c85f5e10f124f7b541 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 02:40:17 +0100 Subject: [PATCH 1278/1368] Refactor process_login_request 2: Invert if --- interface/web/login/index.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 861c9d9836..4844d30eba 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -76,7 +76,11 @@ function process_login_request(app $app, &$error, $conf, $module) $loginAs = false; $time = time(); - if ($username != '' && $password != '' && $error == '') { + if ($username == '' || $password == '' || $error != '') { + //* Username or password empty + if ($error == '') $error = $app->lng('error_user_password_empty'); + $app->plugin->raiseEvent('login_empty', $username); + } else { /* * Check, if there is a "login as" instead of a "normal" login */ @@ -306,10 +310,6 @@ function process_login_request(app $app, &$error, $conf, $module) fclose($authlog_handle); } } - } else { - //* Username or password empty - if ($error == '') $error = $app->lng('error_user_password_empty'); - $app->plugin->raiseEvent('login_empty', $username); } } -- GitLab From 14010034b17e3a8550e76fd51a9ae72a34371846 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 02:41:33 +0100 Subject: [PATCH 1279/1368] Refactor process_login_request 3: Explicit return statement --- interface/web/login/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 4844d30eba..2eef38ebc1 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -80,6 +80,7 @@ function process_login_request(app $app, &$error, $conf, $module) //* Username or password empty if ($error == '') $error = $app->lng('error_user_password_empty'); $app->plugin->raiseEvent('login_empty', $username); + return; } else { /* * Check, if there is a "login as" instead of a "normal" login -- GitLab From 32a8e5669766e45f1881f3f821e9aa712e27a317 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 02:42:44 +0100 Subject: [PATCH 1280/1368] Refactor process_login_request 4: Unwrap else --- interface/web/login/index.php | 392 +++++++++++++++++----------------- 1 file changed, 195 insertions(+), 197 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 2eef38ebc1..067ab87551 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -81,235 +81,233 @@ function process_login_request(app $app, &$error, $conf, $module) if ($error == '') $error = $app->lng('error_user_password_empty'); $app->plugin->raiseEvent('login_empty', $username); return; - } else { + } + + /* + * Check, if there is a "login as" instead of a "normal" login + */ + if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1) { /* - * Check, if there is a "login as" instead of a "normal" login + * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we + * open the startpage (after killing the old session), so the user + * is logout and has to start again! */ - if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1) { + if ($_SESSION['s']['user']['typ'] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { /* - * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we - * open the startpage (after killing the old session), so the user - * is logout and has to start again! + * The actual user is NOT a admin or reseller, but maybe he + * has logged in as "normal" user before... */ - if ($_SESSION['s']['user']['typ'] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { - /* - * The actual user is NOT a admin or reseller, but maybe he - * has logged in as "normal" user before... - */ - if (isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))) { - /* The "old" user is admin or reseller, so everything is ok - * if he is reseller, we need to check if he logs in to one of his clients - */ - if ($_SESSION['s_old']['user']['typ'] != 'admin') { + if (isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))) { + /* The "old" user is admin or reseller, so everything is ok + * if he is reseller, we need to check if he logs in to one of his clients + */ + if ($_SESSION['s_old']['user']['typ'] != 'admin') { - /* this is the one currently logged in (normal user) */ - $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $old_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $old_client_group_id); + /* this is the one currently logged in (normal user) */ + $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); + $old_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $old_client_group_id); - /* this is the reseller, that shall be re-logged in */ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - $client_group_id = $app->functions->intval($tmp['default_group']); - $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + /* this is the reseller, that shall be re-logged in */ + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + $client_group_id = $app->functions->intval($tmp['default_group']); + $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - if (!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"]) { - die("You don't have the right to 'login as' this user!"); - } - unset($old_client); - unset($tmp_client); - unset($tmp); + if (!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"]) { + die("You don't have the right to 'login as' this user!"); } - } else { - die("You don't have the right to 'login as'!"); - } - } elseif ($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { - /* a reseller wants to 'login as', we need to check if he is allowed to */ - $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); - - /* this is the user the reseller wants to 'login as' */ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); - - if (!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { - die("You don't have the right to login as this user!"); + unset($old_client); + unset($tmp_client); + unset($tmp); } - unset($res_client); - unset($tmp); - unset($tmp_client); + } else { + die("You don't have the right to 'login as'!"); } - $loginAs = true; - - } else { - /* normal login */ - $loginAs = false; + } elseif ($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { + /* a reseller wants to 'login as', we need to check if he is allowed to */ + $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); + $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); + + /* this is the user the reseller wants to 'login as' */ + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); + + if (!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { + die("You don't have the right to login as this user!"); + } + unset($res_client); + unset($tmp); + unset($tmp_client); } + $loginAs = true; - //* Check if there are already wrong logins - $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; - $alreadyfailed = $app->db->queryOneRecord($sql, $ip); - - //* too many failed logins - if ($alreadyfailed['times'] > 5) { - $error = $app->lng('error_user_too_many_logins'); - } else { + } else { + /* normal login */ + $loginAs = false; + } - if ($loginAs) { - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - } else { + //* Check if there are already wrong logins + $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; + $alreadyfailed = $app->db->queryOneRecord($sql, $ip); - if (stristr($username, '@')) { - //* mailuser login - $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; - $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); - $user = false; - if ($mailuser) { - $saved_password = stripslashes($mailuser['password']); - //* Check if mailuser password is correct - if (crypt(stripslashes($password), $saved_password) == $saved_password) { - //* Get the sys_user language of the client of the mailuser - $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); - - //* we build a fake user here which has access to the mailuser module only and userid 0 - $user = array(); - $user['userid'] = 0; - $user['active'] = 1; - $user['startmodule'] = 'mailuser'; - $user['modules'] = 'mailuser'; - $user['typ'] = 'user'; - $user['email'] = $mailuser['email']; - $user['username'] = $username; - if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { - $user['language'] = $sys_user_lang['language']; - } else { - $user['language'] = $conf['language']; - } - $user['theme'] = $conf['theme']; - $user['app_theme'] = $conf['theme']; - $user['mailuser_id'] = $mailuser['mailuser_id']; - $user['default_group'] = $mailuser['sys_groupid']; + //* too many failed logins + if ($alreadyfailed['times'] > 5) { + $error = $app->lng('error_user_too_many_logins'); + } else { + if ($loginAs) { + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + } else { + if (stristr($username, '@')) { + //* mailuser login + $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; + $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); + $user = false; + if ($mailuser) { + $saved_password = stripslashes($mailuser['password']); + //* Check if mailuser password is correct + if (crypt(stripslashes($password), $saved_password) == $saved_password) { + //* Get the sys_user language of the client of the mailuser + $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); + + //* we build a fake user here which has access to the mailuser module only and userid 0 + $user = array(); + $user['userid'] = 0; + $user['active'] = 1; + $user['startmodule'] = 'mailuser'; + $user['modules'] = 'mailuser'; + $user['typ'] = 'user'; + $user['email'] = $mailuser['email']; + $user['username'] = $username; + if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { + $user['language'] = $sys_user_lang['language']; + } else { + $user['language'] = $conf['language']; } + $user['theme'] = $conf['theme']; + $user['app_theme'] = $conf['theme']; + $user['mailuser_id'] = $mailuser['mailuser_id']; + $user['default_group'] = $mailuser['sys_groupid']; } - } else { - //* normal cp user login - $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username); - if ($user) { - $saved_password = stripslashes($user['passwort']); - if (substr($saved_password, 0, 1) == '$') { - //* The password is encrypted with crypt - if (crypt(stripslashes($password), $saved_password) != $saved_password) { - $user = false; - } - } else { - //* The password is md5 encrypted - if (md5($password) != $saved_password) { - $user = false; - } else { - // update password with secure algo - $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); - } + } + } else { + //* normal cp user login + $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username); + if ($user) { + $saved_password = stripslashes($user['passwort']); + if (substr($saved_password, 0, 1) == '$') { + //* The password is encrypted with crypt + if (crypt(stripslashes($password), $saved_password) != $saved_password) { + $user = false; } } else { - $user = false; + //* The password is md5 encrypted + if (md5($password) != $saved_password) { + $user = false; + } else { + // update password with secure algo + $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); + } } + } else { + $user = false; } } + } - if ($user) { - if ($user['active'] == 1) { - // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin - if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { - - // User login right, so attempts can be deleted - $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; - $app->db->query($sql, $ip); - $user = $app->db->toLower($user); - - if ($loginAs) $oldSession = $_SESSION['s']; - - // Session regenerate causes login problems on some systems, see Issue #3827 - // Set session_regenerate_id to no in security settings, it you encounter - // this problem. - $app->uses('getconf'); - $security_config = $app->getconf->get_security_config('permissions'); - if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { - if (!$loginAs) session_regenerate_id(true); - } - $_SESSION = array(); - if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! - $_SESSION['s']['user'] = $user; - $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; - $_SESSION['s']['language'] = $app->functions->check_language($user['language']); - $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; - if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; - - if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { - include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); - $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; - include_menu_dir_files($menu_dir); - $_SESSION['s']['module'] = $module; - } - // check if the user theme is valid - if ($_SESSION['s']['user']['theme'] != 'default') { - $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; - if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { - // fall back to default theme if this one is not compatible with current ispc version - $_SESSION['s']['user']['theme'] = 'default'; - $_SESSION['s']['theme'] = 'default'; - $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); - } + if ($user) { + if ($user['active'] == 1) { + // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin + if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { + + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip); + $user = $app->db->toLower($user); + + if ($loginAs) $oldSession = $_SESSION['s']; + + // Session regenerate causes login problems on some systems, see Issue #3827 + // Set session_regenerate_id to no in security settings, it you encounter + // this problem. + $app->uses('getconf'); + $security_config = $app->getconf->get_security_config('permissions'); + if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { + if (!$loginAs) session_regenerate_id(true); + } + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $app->functions->check_language($user['language']); + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; + + if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; + include_menu_dir_files($menu_dir); + $_SESSION['s']['module'] = $module; + } + // check if the user theme is valid + if ($_SESSION['s']['user']['theme'] != 'default') { + $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; + if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { + // fall back to default theme if this one is not compatible with current ispc version + $_SESSION['s']['user']['theme'] = 'default'; + $_SESSION['s']['theme'] = 'default'; + $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); } + } - $app->plugin->raiseEvent('login', $username); + $app->plugin->raiseEvent('login', $username); - //* Save successful login message to var - $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog."\n"); - fclose($authlog_handle); + //* Save successful login message to var + $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); - /* - * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the - * new theme, if the logged-in user has another - */ + /* + * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the + * new theme, if the logged-in user has another + */ - if ($loginAs) { - echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; - exit; - } else { - header('Location: ../index.php'); - die(); - } + if ($loginAs) { + echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; + exit; + } else { + header('Location: ../index.php'); + die(); } - } else { - $error = $app->lng('error_user_blocked'); } } else { - if (!$alreadyfailed['times']) { - //* user login the first time wrong - $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; - $app->db->query($sql, $ip); - } elseif ($alreadyfailed['times'] >= 1) { - //* update times wrong - $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; - $app->db->query($sql, $ip); - } - //* Incorrect login - Username and password incorrect - $error = $app->lng('error_user_password_incorrect'); - if ($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; - - $app->plugin->raiseEvent('login_failed', $username); - //* Save failed login message to var - $authlog = 'Failed login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s'); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog."\n"); - fclose($authlog_handle); + $error = $app->lng('error_user_blocked'); + } + } else { + if (!$alreadyfailed['times']) { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip); + } elseif ($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip); } + //* Incorrect login - Username and password incorrect + $error = $app->lng('error_user_password_incorrect'); + if ($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; + + $app->plugin->raiseEvent('login_failed', $username); + //* Save failed login message to var + $authlog = 'Failed login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s'); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); } } } -- GitLab From a8ec0a156a21d5bcca6f19648979d15aec9c9850 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 02:54:21 +0100 Subject: [PATCH 1281/1368] Refactor process_login_request 5: Extract method is_login_as(). --- interface/web/login/index.php | 139 ++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 64 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 067ab87551..3589f56443 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -83,70 +83,7 @@ function process_login_request(app $app, &$error, $conf, $module) return; } - /* - * Check, if there is a "login as" instead of a "normal" login - */ - if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1) { - /* - * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we - * open the startpage (after killing the old session), so the user - * is logout and has to start again! - */ - if ($_SESSION['s']['user']['typ'] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { - /* - * The actual user is NOT a admin or reseller, but maybe he - * has logged in as "normal" user before... - */ - - if (isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))) { - /* The "old" user is admin or reseller, so everything is ok - * if he is reseller, we need to check if he logs in to one of his clients - */ - if ($_SESSION['s_old']['user']['typ'] != 'admin') { - - /* this is the one currently logged in (normal user) */ - $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $old_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $old_client_group_id); - - /* this is the reseller, that shall be re-logged in */ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - $client_group_id = $app->functions->intval($tmp['default_group']); - $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); - - if (!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"]) { - die("You don't have the right to 'login as' this user!"); - } - unset($old_client); - unset($tmp_client); - unset($tmp); - } - } else { - die("You don't have the right to 'login as'!"); - } - } elseif ($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { - /* a reseller wants to 'login as', we need to check if he is allowed to */ - $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); - - /* this is the user the reseller wants to 'login as' */ - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); - - if (!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { - die("You don't have the right to login as this user!"); - } - unset($res_client); - unset($tmp); - unset($tmp_client); - } - $loginAs = true; - - } else { - /* normal login */ - $loginAs = false; - } + $loginAs = is_login_as($app, $username, $password); //* Check if there are already wrong logins $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1"; @@ -312,6 +249,80 @@ function process_login_request(app $app, &$error, $conf, $module) } } +/** + * Checks if there is a "login as" instead of a "normal" login + * @param app $app + * @param $username + * @param $password + * @return bool + */ +function is_login_as(app $app, $username, $password) +{ + if (isset($_SESSION['s']['user']) && $_SESSION['s']['user']['active'] == 1) { + /* + * only the admin or reseller can "login as" so if the user is NOT an admin or reseller, we + * open the startpage (after killing the old session), so the user + * is logout and has to start again! + */ + if ($_SESSION['s']['user']['typ'] != 'admin' && !$app->auth->has_clients($_SESSION['s']['user']['userid'])) { + /* + * The actual user is NOT a admin or reseller, but maybe he + * has logged in as "normal" user before... + */ + + if (isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin' || $app->auth->has_clients($_SESSION['s_old']['user']['userid']))) { + /* The "old" user is admin or reseller, so everything is ok + * if he is reseller, we need to check if he logs in to one of his clients + */ + if ($_SESSION['s_old']['user']['typ'] != 'admin') { + + /* this is the one currently logged in (normal user) */ + $old_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); + $old_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $old_client_group_id); + + /* this is the reseller, that shall be re-logged in */ + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + $client_group_id = $app->functions->intval($tmp['default_group']); + $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + + if (!$tmp_client || $old_client["parent_client_id"] != $tmp_client["client_id"] || $tmp["default_group"] != $_SESSION["s_old"]["user"]["default_group"]) { + die("You don't have the right to 'login as' this user!"); + } + unset($old_client); + unset($tmp_client); + unset($tmp); + } + } else { + die("You don't have the right to 'login as'!"); + } + } elseif ($_SESSION['s']['user']['typ'] != 'admin' && (!isset($_SESSION['s_old']['user']) || $_SESSION['s_old']['user']['typ'] != 'admin')) { + /* a reseller wants to 'login as', we need to check if he is allowed to */ + $res_client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); + $res_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $res_client_group_id); + + /* this is the user the reseller wants to 'login as' */ + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $tmp = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]); + + if (!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) { + die("You don't have the right to login as this user!"); + } + unset($res_client); + unset($tmp); + unset($tmp_client); + } + $loginAs = true; + + } else { + /* normal login */ + $loginAs = false; + } + + return $loginAs; +} + //* Login Form was sent if (count($_POST) > 0) { process_login_request($app, $error, $conf, $module); -- GitLab From 21e99c1eb52b771e43b45bf14ddeab8c01aa623e Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 02:59:29 +0100 Subject: [PATCH 1282/1368] Refactor process_login_request 6: Explicit return statement. --- interface/web/login/index.php | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 3589f56443..bad948d833 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -92,6 +92,7 @@ function process_login_request(app $app, &$error, $conf, $module) //* too many failed logins if ($alreadyfailed['times'] > 5) { $error = $app->lng('error_user_too_many_logins'); + return; } else { if ($loginAs) { $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; -- GitLab From c25dbd553d6a59608206ab0407a3debc66809e0d Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 03:05:06 +0100 Subject: [PATCH 1283/1368] Refactor process_login_request 7: Unwrap else. --- interface/web/login/index.php | 272 +++++++++++++++++----------------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index bad948d833..31e2658764 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -93,160 +93,160 @@ function process_login_request(app $app, &$error, $conf, $module) if ($alreadyfailed['times'] > 5) { $error = $app->lng('error_user_too_many_logins'); return; + } + + if ($loginAs) { + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); } else { - if ($loginAs) { - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - } else { - if (stristr($username, '@')) { - //* mailuser login - $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; - $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); - $user = false; - if ($mailuser) { - $saved_password = stripslashes($mailuser['password']); - //* Check if mailuser password is correct - if (crypt(stripslashes($password), $saved_password) == $saved_password) { - //* Get the sys_user language of the client of the mailuser - $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); - - //* we build a fake user here which has access to the mailuser module only and userid 0 - $user = array(); - $user['userid'] = 0; - $user['active'] = 1; - $user['startmodule'] = 'mailuser'; - $user['modules'] = 'mailuser'; - $user['typ'] = 'user'; - $user['email'] = $mailuser['email']; - $user['username'] = $username; - if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { - $user['language'] = $sys_user_lang['language']; - } else { - $user['language'] = $conf['language']; - } - $user['theme'] = $conf['theme']; - $user['app_theme'] = $conf['theme']; - $user['mailuser_id'] = $mailuser['mailuser_id']; - $user['default_group'] = $mailuser['sys_groupid']; + if (stristr($username, '@')) { + //* mailuser login + $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; + $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); + $user = false; + if ($mailuser) { + $saved_password = stripslashes($mailuser['password']); + //* Check if mailuser password is correct + if (crypt(stripslashes($password), $saved_password) == $saved_password) { + //* Get the sys_user language of the client of the mailuser + $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); + + //* we build a fake user here which has access to the mailuser module only and userid 0 + $user = array(); + $user['userid'] = 0; + $user['active'] = 1; + $user['startmodule'] = 'mailuser'; + $user['modules'] = 'mailuser'; + $user['typ'] = 'user'; + $user['email'] = $mailuser['email']; + $user['username'] = $username; + if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { + $user['language'] = $sys_user_lang['language']; + } else { + $user['language'] = $conf['language']; } + $user['theme'] = $conf['theme']; + $user['app_theme'] = $conf['theme']; + $user['mailuser_id'] = $mailuser['mailuser_id']; + $user['default_group'] = $mailuser['sys_groupid']; } - } else { - //* normal cp user login - $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username); - if ($user) { - $saved_password = stripslashes($user['passwort']); - if (substr($saved_password, 0, 1) == '$') { - //* The password is encrypted with crypt - if (crypt(stripslashes($password), $saved_password) != $saved_password) { - $user = false; - } - } else { - //* The password is md5 encrypted - if (md5($password) != $saved_password) { - $user = false; - } else { - // update password with secure algo - $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); - } + } + } else { + //* normal cp user login + $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username); + if ($user) { + $saved_password = stripslashes($user['passwort']); + if (substr($saved_password, 0, 1) == '$') { + //* The password is encrypted with crypt + if (crypt(stripslashes($password), $saved_password) != $saved_password) { + $user = false; } } else { - $user = false; + //* The password is md5 encrypted + if (md5($password) != $saved_password) { + $user = false; + } else { + // update password with secure algo + $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); + } } + } else { + $user = false; } } + } - if ($user) { - if ($user['active'] == 1) { - // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin - if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { - - // User login right, so attempts can be deleted - $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; - $app->db->query($sql, $ip); - $user = $app->db->toLower($user); - - if ($loginAs) $oldSession = $_SESSION['s']; - - // Session regenerate causes login problems on some systems, see Issue #3827 - // Set session_regenerate_id to no in security settings, it you encounter - // this problem. - $app->uses('getconf'); - $security_config = $app->getconf->get_security_config('permissions'); - if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { - if (!$loginAs) session_regenerate_id(true); - } - $_SESSION = array(); - if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! - $_SESSION['s']['user'] = $user; - $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; - $_SESSION['s']['language'] = $app->functions->check_language($user['language']); - $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; - if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; - - if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { - include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); - $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; - include_menu_dir_files($menu_dir); - $_SESSION['s']['module'] = $module; - } - // check if the user theme is valid - if ($_SESSION['s']['user']['theme'] != 'default') { - $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; - if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { - // fall back to default theme if this one is not compatible with current ispc version - $_SESSION['s']['user']['theme'] = 'default'; - $_SESSION['s']['theme'] = 'default'; - $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); - } + if ($user) { + if ($user['active'] == 1) { + // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin + if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { + + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip); + $user = $app->db->toLower($user); + + if ($loginAs) $oldSession = $_SESSION['s']; + + // Session regenerate causes login problems on some systems, see Issue #3827 + // Set session_regenerate_id to no in security settings, it you encounter + // this problem. + $app->uses('getconf'); + $security_config = $app->getconf->get_security_config('permissions'); + if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { + if (!$loginAs) session_regenerate_id(true); + } + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $app->functions->check_language($user['language']); + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; + + if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; + include_menu_dir_files($menu_dir); + $_SESSION['s']['module'] = $module; + } + // check if the user theme is valid + if ($_SESSION['s']['user']['theme'] != 'default') { + $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; + if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { + // fall back to default theme if this one is not compatible with current ispc version + $_SESSION['s']['user']['theme'] = 'default'; + $_SESSION['s']['theme'] = 'default'; + $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); } + } - $app->plugin->raiseEvent('login', $username); + $app->plugin->raiseEvent('login', $username); - //* Save successful login message to var - $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog."\n"); - fclose($authlog_handle); + //* Save successful login message to var + $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); - /* - * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the - * new theme, if the logged-in user has another - */ + /* + * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the + * new theme, if the logged-in user has another + */ - if ($loginAs) { - echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; - exit; - } else { - header('Location: ../index.php'); - die(); - } + if ($loginAs) { + echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; + exit; + } else { + header('Location: ../index.php'); + die(); } - } else { - $error = $app->lng('error_user_blocked'); } } else { - if (!$alreadyfailed['times']) { - //* user login the first time wrong - $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; - $app->db->query($sql, $ip); - } elseif ($alreadyfailed['times'] >= 1) { - //* update times wrong - $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; - $app->db->query($sql, $ip); - } - //* Incorrect login - Username and password incorrect - $error = $app->lng('error_user_password_incorrect'); - if ($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; - - $app->plugin->raiseEvent('login_failed', $username); - //* Save failed login message to var - $authlog = 'Failed login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s'); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog."\n"); - fclose($authlog_handle); + $error = $app->lng('error_user_blocked'); + } + } else { + if (!$alreadyfailed['times']) { + //* user login the first time wrong + $sql = "INSERT INTO `attempts_login` (`ip`, `times`, `login_time`) VALUES (?, 1, NOW())"; + $app->db->query($sql, $ip); + } elseif ($alreadyfailed['times'] >= 1) { + //* update times wrong + $sql = "UPDATE `attempts_login` SET `times`=`times`+1, `login_time`=NOW() WHERE `ip` = ? AND `login_time` < NOW() ORDER BY `login_time` DESC LIMIT 1"; + $app->db->query($sql, $ip); } + //* Incorrect login - Username and password incorrect + $error = $app->lng('error_user_password_incorrect'); + if ($app->db->errorMessage != '') $error .= '
    '.$app->db->errorMessage != ''; + + $app->plugin->raiseEvent('login_failed', $username); + //* Save failed login message to var + $authlog = 'Failed login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s'); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); } } -- GitLab From 480b97a607a786233c5230ffc123a7d83a619a34 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 03:15:50 +0100 Subject: [PATCH 1284/1368] Refactor process_login_request 8: Extract method validate_and_fetch_user(). --- interface/web/login/index.php | 140 +++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 62 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 31e2658764..d9b96a3c2f 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -95,68 +95,7 @@ function process_login_request(app $app, &$error, $conf, $module) return; } - if ($loginAs) { - $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - } else { - if (stristr($username, '@')) { - //* mailuser login - $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; - $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); - $user = false; - if ($mailuser) { - $saved_password = stripslashes($mailuser['password']); - //* Check if mailuser password is correct - if (crypt(stripslashes($password), $saved_password) == $saved_password) { - //* Get the sys_user language of the client of the mailuser - $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); - - //* we build a fake user here which has access to the mailuser module only and userid 0 - $user = array(); - $user['userid'] = 0; - $user['active'] = 1; - $user['startmodule'] = 'mailuser'; - $user['modules'] = 'mailuser'; - $user['typ'] = 'user'; - $user['email'] = $mailuser['email']; - $user['username'] = $username; - if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { - $user['language'] = $sys_user_lang['language']; - } else { - $user['language'] = $conf['language']; - } - $user['theme'] = $conf['theme']; - $user['app_theme'] = $conf['theme']; - $user['mailuser_id'] = $mailuser['mailuser_id']; - $user['default_group'] = $mailuser['sys_groupid']; - } - } - } else { - //* normal cp user login - $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username); - if ($user) { - $saved_password = stripslashes($user['passwort']); - if (substr($saved_password, 0, 1) == '$') { - //* The password is encrypted with crypt - if (crypt(stripslashes($password), $saved_password) != $saved_password) { - $user = false; - } - } else { - //* The password is md5 encrypted - if (md5($password) != $saved_password) { - $user = false; - } else { - // update password with secure algo - $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); - } - } - } else { - $user = false; - } - } - } + $user = validate_and_fetch_user($app, $username, $password, $loginAs, $conf); if ($user) { if ($user['active'] == 1) { @@ -250,6 +189,83 @@ function process_login_request(app $app, &$error, $conf, $module) } } +/** + * Validates user credentials and fetches the user if validation succeeded + * @param app $app + * @param $username + * @param $password + * @param $loginAs + * @param $conf + * @return array | bool + */ +function validate_and_fetch_user(app $app, $username, $password, $loginAs, $conf) +{ + if ($loginAs) { + $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); + } else { + if (stristr($username, '@')) { + //* mailuser login + $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; + $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); + $user = false; + if ($mailuser) { + $saved_password = stripslashes($mailuser['password']); + //* Check if mailuser password is correct + if (crypt(stripslashes($password), $saved_password) == $saved_password) { + //* Get the sys_user language of the client of the mailuser + $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); + + //* we build a fake user here which has access to the mailuser module only and userid 0 + $user = array(); + $user['userid'] = 0; + $user['active'] = 1; + $user['startmodule'] = 'mailuser'; + $user['modules'] = 'mailuser'; + $user['typ'] = 'user'; + $user['email'] = $mailuser['email']; + $user['username'] = $username; + if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { + $user['language'] = $sys_user_lang['language']; + } else { + $user['language'] = $conf['language']; + } + $user['theme'] = $conf['theme']; + $user['app_theme'] = $conf['theme']; + $user['mailuser_id'] = $mailuser['mailuser_id']; + $user['default_group'] = $mailuser['sys_groupid']; + } + } + } else { + //* normal cp user login + $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username); + if ($user) { + $saved_password = stripslashes($user['passwort']); + if (substr($saved_password, 0, 1) == '$') { + //* The password is encrypted with crypt + if (crypt(stripslashes($password), $saved_password) != $saved_password) { + $user = false; + } + } else { + //* The password is md5 encrypted + if (md5($password) != $saved_password) { + $user = false; + } else { + // update password with secure algo + $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); + } + } + } else { + $user = false; + } + } + } + + return $user; +} + /** * Checks if there is a "login as" instead of a "normal" login * @param app $app -- GitLab From 3878d84e8374830777fa41eddadcefd778a00030 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 03:29:33 +0100 Subject: [PATCH 1285/1368] Refactor process_login_request 9: Refactor validate_and_fetch_user() method. --- interface/web/login/index.php | 126 +++++++++++++++++++--------------- 1 file changed, 69 insertions(+), 57 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index d9b96a3c2f..b63a4808db 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -202,65 +202,77 @@ function validate_and_fetch_user(app $app, $username, $password, $loginAs, $conf { if ($loginAs) { $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username, (string)$password); - } else { - if (stristr($username, '@')) { - //* mailuser login - $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; - $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); - $user = false; - if ($mailuser) { - $saved_password = stripslashes($mailuser['password']); - //* Check if mailuser password is correct - if (crypt(stripslashes($password), $saved_password) == $saved_password) { - //* Get the sys_user language of the client of the mailuser - $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); - - //* we build a fake user here which has access to the mailuser module only and userid 0 - $user = array(); - $user['userid'] = 0; - $user['active'] = 1; - $user['startmodule'] = 'mailuser'; - $user['modules'] = 'mailuser'; - $user['typ'] = 'user'; - $user['email'] = $mailuser['email']; - $user['username'] = $username; - if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { - $user['language'] = $sys_user_lang['language']; - } else { - $user['language'] = $conf['language']; - } - $user['theme'] = $conf['theme']; - $user['app_theme'] = $conf['theme']; - $user['mailuser_id'] = $mailuser['mailuser_id']; - $user['default_group'] = $mailuser['sys_groupid']; - } - } + return $app->db->queryOneRecord($sql, (string)$username, (string)$password); + } + + if (stristr($username, '@')) { + //* mailuser login + $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?"; + $mailuser = $app->db->queryOneRecord($sql, (string)$username, $app->functions->idn_encode($username)); + + return $mailuser + ? build_fake_user($app, $username, $password, $mailuser, $conf) + : false; + } + + //* normal cp user login + $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; + $user = $app->db->queryOneRecord($sql, (string)$username); + if (!$user) return false; + + $saved_password = stripslashes($user['passwort']); + if (substr($saved_password, 0, 1) == '$') { + //* The password is encrypted with crypt + return crypt(stripslashes($password), $saved_password) == $saved_password + ? $user + : false; + } + + //* The password is md5 encrypted + if (md5($password) != $saved_password) return false; + + // update password with secure algo + $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; + $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); + + return $user; +} + +/** + * @param app $app + * @param $username + * @param $password + * @param array $mailuser + * @param array $user + * @param $conf + * @return array + */ +function build_fake_user(app $app, $username, $password, array $mailuser, $conf) +{ + $saved_password = stripslashes($mailuser['password']); + //* Check if mailuser password is correct + if (crypt(stripslashes($password), $saved_password) == $saved_password) { + //* Get the sys_user language of the client of the mailuser + $sys_user_lang = $app->db->queryOneRecord("SELECT language FROM sys_user WHERE default_group = ?", $mailuser['sys_groupid']); + + //* we build a fake user here which has access to the mailuser module only and userid 0 + $user = array(); + $user['userid'] = 0; + $user['active'] = 1; + $user['startmodule'] = 'mailuser'; + $user['modules'] = 'mailuser'; + $user['typ'] = 'user'; + $user['email'] = $mailuser['email']; + $user['username'] = $username; + if (is_array($sys_user_lang) && $sys_user_lang['language'] != '') { + $user['language'] = $sys_user_lang['language']; } else { - //* normal cp user login - $sql = "SELECT * FROM sys_user WHERE USERNAME = ?"; - $user = $app->db->queryOneRecord($sql, (string)$username); - if ($user) { - $saved_password = stripslashes($user['passwort']); - if (substr($saved_password, 0, 1) == '$') { - //* The password is encrypted with crypt - if (crypt(stripslashes($password), $saved_password) != $saved_password) { - $user = false; - } - } else { - //* The password is md5 encrypted - if (md5($password) != $saved_password) { - $user = false; - } else { - // update password with secure algo - $sql = 'UPDATE `sys_user` SET `passwort` = ? WHERE `username` = ?'; - $app->db->query($sql, $app->auth->crypt_password($password), (string)$username); - } - } - } else { - $user = false; - } + $user['language'] = $conf['language']; } + $user['theme'] = $conf['theme']; + $user['app_theme'] = $conf['theme']; + $user['mailuser_id'] = $mailuser['mailuser_id']; + $user['default_group'] = $mailuser['sys_groupid']; } return $user; -- GitLab From 89889dce62a8d7c0c86db36cf637c699d85f250b Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 03:45:07 +0100 Subject: [PATCH 1286/1368] Refactor process_login_request 10: Invert if / unwrap else. --- interface/web/login/index.php | 129 +++++++++++++++++----------------- 1 file changed, 65 insertions(+), 64 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index b63a4808db..151aa0a4ce 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -98,73 +98,74 @@ function process_login_request(app $app, &$error, $conf, $module) $user = validate_and_fetch_user($app, $username, $password, $loginAs, $conf); if ($user) { - if ($user['active'] == 1) { - // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin - if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { - - // User login right, so attempts can be deleted - $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; - $app->db->query($sql, $ip); - $user = $app->db->toLower($user); - - if ($loginAs) $oldSession = $_SESSION['s']; - - // Session regenerate causes login problems on some systems, see Issue #3827 - // Set session_regenerate_id to no in security settings, it you encounter - // this problem. - $app->uses('getconf'); - $security_config = $app->getconf->get_security_config('permissions'); - if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { - if (!$loginAs) session_regenerate_id(true); - } - $_SESSION = array(); - if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! - $_SESSION['s']['user'] = $user; - $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; - $_SESSION['s']['language'] = $app->functions->check_language($user['language']); - $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; - if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; - - if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { - include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); - $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; - include_menu_dir_files($menu_dir); - $_SESSION['s']['module'] = $module; - } - // check if the user theme is valid - if ($_SESSION['s']['user']['theme'] != 'default') { - $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; - if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { - // fall back to default theme if this one is not compatible with current ispc version - $_SESSION['s']['user']['theme'] = 'default'; - $_SESSION['s']['theme'] = 'default'; - $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); - } - } + if ($user['active'] != 1) { + $error = $app->lng('error_user_blocked'); + return; + } - $app->plugin->raiseEvent('login', $username); - - //* Save successful login message to var - $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog."\n"); - fclose($authlog_handle); - - /* - * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the - * new theme, if the logged-in user has another - */ - - if ($loginAs) { - echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; - exit; - } else { - header('Location: ../index.php'); - die(); + // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin + if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { + + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip); + $user = $app->db->toLower($user); + + if ($loginAs) $oldSession = $_SESSION['s']; + + // Session regenerate causes login problems on some systems, see Issue #3827 + // Set session_regenerate_id to no in security settings, it you encounter + // this problem. + $app->uses('getconf'); + $security_config = $app->getconf->get_security_config('permissions'); + if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { + if (!$loginAs) session_regenerate_id(true); + } + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $app->functions->check_language($user['language']); + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; + + if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; + include_menu_dir_files($menu_dir); + $_SESSION['s']['module'] = $module; + } + // check if the user theme is valid + if ($_SESSION['s']['user']['theme'] != 'default') { + $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; + if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { + // fall back to default theme if this one is not compatible with current ispc version + $_SESSION['s']['user']['theme'] = 'default'; + $_SESSION['s']['theme'] = 'default'; + $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); } } - } else { - $error = $app->lng('error_user_blocked'); + + $app->plugin->raiseEvent('login', $username); + + //* Save successful login message to var + $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); + + /* + * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the + * new theme, if the logged-in user has another + */ + + if ($loginAs) { + echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; + exit; + } else { + header('Location: ../index.php'); + die(); + } } } else { if (!$alreadyfailed['times']) { -- GitLab From d48b2bbbca8367671a1a6a5b110f3b5db2d433d0 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 03:47:20 +0100 Subject: [PATCH 1287/1368] Refactor process_login_request 11: Invert if / unwrap else. --- interface/web/login/index.php | 113 +++++++++++++++++----------------- 1 file changed, 56 insertions(+), 57 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 151aa0a4ce..4906cbf348 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -104,68 +104,67 @@ function process_login_request(app $app, &$error, $conf, $module) } // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin - if (!$app->is_under_maintenance() || $user['typ'] == 'admin') { - - // User login right, so attempts can be deleted - $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; - $app->db->query($sql, $ip); - $user = $app->db->toLower($user); - - if ($loginAs) $oldSession = $_SESSION['s']; - - // Session regenerate causes login problems on some systems, see Issue #3827 - // Set session_regenerate_id to no in security settings, it you encounter - // this problem. - $app->uses('getconf'); - $security_config = $app->getconf->get_security_config('permissions'); - if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { - if (!$loginAs) session_regenerate_id(true); - } - $_SESSION = array(); - if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! - $_SESSION['s']['user'] = $user; - $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; - $_SESSION['s']['language'] = $app->functions->check_language($user['language']); - $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; - if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; - - if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { - include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); - $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; - include_menu_dir_files($menu_dir); - $_SESSION['s']['module'] = $module; - } - // check if the user theme is valid - if ($_SESSION['s']['user']['theme'] != 'default') { - $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; - if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { - // fall back to default theme if this one is not compatible with current ispc version - $_SESSION['s']['user']['theme'] = 'default'; - $_SESSION['s']['theme'] = 'default'; - $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); - } + if ($app->is_under_maintenance() && $user['typ'] != 'admin') return; + + // User login right, so attempts can be deleted + $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; + $app->db->query($sql, $ip); + $user = $app->db->toLower($user); + + if ($loginAs) $oldSession = $_SESSION['s']; + + // Session regenerate causes login problems on some systems, see Issue #3827 + // Set session_regenerate_id to no in security settings, it you encounter + // this problem. + $app->uses('getconf'); + $security_config = $app->getconf->get_security_config('permissions'); + if (isset($security_config['session_regenerate_id']) && $security_config['session_regenerate_id'] == 'yes') { + if (!$loginAs) session_regenerate_id(true); + } + $_SESSION = array(); + if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back! + $_SESSION['s']['user'] = $user; + $_SESSION['s']['user']['theme'] = isset($user['app_theme']) ? $user['app_theme'] : 'default'; + $_SESSION['s']['language'] = $app->functions->check_language($user['language']); + $_SESSION["s"]['theme'] = $_SESSION['s']['user']['theme']; + if ($loginAs) $_SESSION['s']['plugin_cache'] = $_SESSION['s_old']['plugin_cache']; + + if (is_file(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) { + include_once $app->functions->check_include_path(ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); + $menu_dir = ISPC_WEB_PATH.'/'.$_SESSION['s']['user']['startmodule'].'/lib/menu.d'; + include_menu_dir_files($menu_dir); + $_SESSION['s']['module'] = $module; + } + // check if the user theme is valid + if ($_SESSION['s']['user']['theme'] != 'default') { + $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme']; + if (!@is_dir($tmp_path) || !@file_exists($tmp_path."/ispconfig_version") || trim(file_get_contents($tmp_path."/ispconfig_version")) != ISPC_APP_VERSION) { + // fall back to default theme if this one is not compatible with current ispc version + $_SESSION['s']['user']['theme'] = 'default'; + $_SESSION['s']['theme'] = 'default'; + $_SESSION['show_error_msg'] = $app->lng('theme_not_compatible'); } + } - $app->plugin->raiseEvent('login', $username); + $app->plugin->raiseEvent('login', $username); - //* Save successful login message to var - $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); - $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); - fwrite($authlog_handle, $authlog."\n"); - fclose($authlog_handle); + //* Save successful login message to var + $authlog = 'Successful login for user \''.$username.'\' from '.$_SERVER['REMOTE_ADDR'].' at '.date('Y-m-d H:i:s').' with session ID '.session_id(); + $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a'); + fwrite($authlog_handle, $authlog."\n"); + fclose($authlog_handle); - /* - * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the - * new theme, if the logged-in user has another - */ + /* + * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the + * new theme, if the logged-in user has another + */ - if ($loginAs) { - echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; - exit; - } else { - header('Location: ../index.php'); - die(); - } + if ($loginAs) { + echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage']; + exit; + } else { + header('Location: ../index.php'); + die(); } } else { if (!$alreadyfailed['times']) { -- GitLab From 437360f20b4f21789a15ffb139680150ea109167 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 7 Dec 2021 04:39:08 +0100 Subject: [PATCH 1288/1368] Added admin IP whitelist feature. --- interface/lib/config.inc.php | 3 ++ interface/web/login/index.php | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/interface/lib/config.inc.php b/interface/lib/config.inc.php index c5d14d79cd..a2bdaecd0d 100644 --- a/interface/lib/config.inc.php +++ b/interface/lib/config.inc.php @@ -159,4 +159,7 @@ define('LOGLEVEL_DEBUG', 0); define('LOGLEVEL_WARN', 1); define('LOGLEVEL_ERROR', 2); +//** Admin IP whitelist file +$conf['admin_ip_whitelist_file'] = '/etc/ispconfig_admin_ip_whitelist'; + ?> diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 4906cbf348..84fd49bc1e 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -106,6 +106,14 @@ function process_login_request(app $app, &$error, $conf, $module) // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin if ($app->is_under_maintenance() && $user['typ'] != 'admin') return; + if ($user['typ'] == 'admin' && !is_admin_ip_whitelisted($_SERVER['REMOTE_ADDR'], $conf)) { + // TODO: if it's not a security risk (information disclosure) to + // let the user know they are not whitelisted, then change this + // error message to a more appropriate one + $error = $app->lng('error_user_password_incorrect'); + return; + } + // User login right, so attempts can be deleted $sql = "DELETE FROM `attempts_login` WHERE `ip`=?"; $app->db->query($sql, $ip); @@ -189,6 +197,54 @@ function process_login_request(app $app, &$error, $conf, $module) } } +/** + * Checks if the given admin's IP address is whitelisted. + * @param string $ip + * @return bool + */ +function is_admin_ip_whitelisted($ip, $conf) +{ + // if there is no config value, we assume that webmaster doesn't use this feature + if (!isset($conf['admin_ip_whitelist_file'])) return true; + + // if the file doesn't exist, we assume that webmaster doesn't use this feature + if (!file_exists($conf['admin_ip_whitelist_file'])) return true; + + $file_content = file_get_contents($conf['admin_ip_whitelist_file']); + $file_lines = explode("\n", $file_content); + + $matches = array_filter($file_lines, function($v) use ($ip) { + $line = trim($v); + + // exclude empty lines and comments + if ($line === '' || $line[0] === '#') return false; + + return ip_matches_cidr($ip, $line); + }); + + return count($matches) > 0; +} + +// based on https://www.php.net/manual/en/ref.network.php (comments) +/** + * Checks if the given IP address matches the given CIDR. + * @param $ip + * @param $cidr + + * @return bool + */ +function ip_matches_cidr ($ip, $cidr) { + list ($net, $mask) = explode ('/', $cidr); + if (!$mask) $mask = 32; + + $ip_net = ip2long ($net); + $ip_mask = ~((1 << (32 - $mask)) - 1); + + $ip_ip = ip2long ($ip); + + return (($ip_ip & $ip_mask) == ($ip_net & $ip_mask)); +} + /** * Validates user credentials and fetches the user if validation succeeded * @param app $app -- GitLab From f0e15758d3888c91852a01aa4da989bf21878a31 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 13 Dec 2021 06:07:28 +0000 Subject: [PATCH 1289/1368] Update validate_client.inc.php --- interface/lib/classes/validate_client.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php index 4652e2a07b..463f697c29 100644 --- a/interface/lib/classes/validate_client.inc.php +++ b/interface/lib/classes/validate_client.inc.php @@ -175,6 +175,7 @@ class validate_client { } } try { + ini_set("default_socket_timeout", 5); $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); $params = array('countryCode' => $cc, 'vatNumber' => $vn); try{ -- GitLab From fb758fdb4af4e36d7cce7136c8e1f9321772e45f Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 15 Dec 2021 17:55:04 +0000 Subject: [PATCH 1290/1368] Update jk_init.ini.master: add php8.1 --- install/tpl/jk_init.ini.master | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index e33383da5f..0dfcdccb68 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -233,6 +233,11 @@ comment = php version 8.0 paths = /usr/bin/php8.0, /usr/lib/php/8.0/, /usr/lib/php/20200930/, /usr/share/php/8.0/, /etc/php/8.0/cli/, /etc/php/8.0/mods-available/ includesections = php_common +[php8_1] +comment = php version 8.1 +paths = /usr/bin/php8.1, /usr/lib/php/8.1/, /usr/lib/php/20210902/, /usr/share/php/8.1/, /etc/php/8.1/cli/, /etc/php/8.1/mods-available/ +includesections = php_common + [imagemagick] comment = ImageMagick needed for php-imagemagick extension paths = /usr/share/ImageMagick-*, /etc/ImageMagick-*, /usr/lib/*/ImageMagick-* -- GitLab From ed52af7debcd14a645d9be683ad9db6e9e9eac0b Mon Sep 17 00:00:00 2001 From: "J. Daniel Schmidt" Date: Sat, 18 Dec 2021 10:25:11 +0100 Subject: [PATCH 1291/1368] Only add SSLProxyEngine in proxy mode and when SSL is enabled for the web (fixes #6269) SSLProxyEngine is neither needed for http(s) redirects nor for non-SSL proxy configs. Thus excluding it from these cases. Based on a fix by Thom --- server/conf/vhost.conf.master | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master index 0b432f2bf4..a1873eab84 100644 --- a/server/conf/vhost.conf.master +++ b/server/conf/vhost.conf.master @@ -517,8 +517,12 @@ RewriteCond %{REQUEST_URI} !^/php-fcgi/ RewriteCond %{REQUEST_URI} !^
    + + SSLProxyEngine On + + RewriteRule ^/(.*)$ $1 -- GitLab From 1370a4aec9e9030bd9d7e6500d00fffa1d60883a Mon Sep 17 00:00:00 2001 From: francois parreaux-ey Date: Tue, 21 Dec 2021 10:46:18 +0000 Subject: [PATCH 1292/1368] 6187-DS-RECORD-functions-for-API -> Update dns.inc.php and other related files --- interface/lib/classes/remote.d/dns.inc.php | 22 +++++++++ remoting_client/API-docs/dns_a_add.html | 2 +- remoting_client/API-docs/dns_a_update.html | 2 +- remoting_client/API-docs/dns_aaaa_add.html | 2 +- remoting_client/API-docs/dns_aaaa_update.html | 2 +- remoting_client/API-docs/dns_alias_add.html | 2 +- .../API-docs/dns_alias_update.html | 2 +- remoting_client/API-docs/dns_cname_add.html | 2 +- .../API-docs/dns_cname_update.html | 2 +- remoting_client/API-docs/dns_ds_add.html | 38 +++++++++++++++ remoting_client/API-docs/dns_ds_delete.html | 29 ++++++++++++ remoting_client/API-docs/dns_ds_get.html | 29 ++++++++++++ remoting_client/API-docs/dns_ds_update.html | 38 +++++++++++++++ remoting_client/API-docs/dns_hinfo_add.html | 2 +- .../API-docs/dns_hinfo_update.html | 2 +- remoting_client/API-docs/dns_mx_add.html | 2 +- remoting_client/API-docs/dns_mx_update.html | 2 +- remoting_client/API-docs/dns_naptr_add.html | 2 +- .../API-docs/dns_naptr_update.html | 2 +- remoting_client/API-docs/dns_ns_add.html | 2 +- remoting_client/API-docs/dns_ns_update.html | 2 +- remoting_client/API-docs/dns_ptr_add.html | 2 +- remoting_client/API-docs/dns_ptr_update.html | 2 +- remoting_client/API-docs/dns_rp_add.html | 2 +- remoting_client/API-docs/dns_rp_update.html | 2 +- remoting_client/API-docs/dns_srv_add.html | 2 +- remoting_client/API-docs/dns_srv_update.html | 2 +- remoting_client/API-docs/dns_txt_add.html | 2 +- remoting_client/API-docs/dns_txt_update.html | 2 +- remoting_client/examples/dns_ds_add.php | 47 +++++++++++++++++++ remoting_client/examples/dns_ds_delete.php | 35 ++++++++++++++ remoting_client/examples/dns_ds_get.php | 34 ++++++++++++++ remoting_client/examples/dns_ds_update.php | 42 +++++++++++++++++ 33 files changed, 338 insertions(+), 24 deletions(-) create mode 100644 remoting_client/API-docs/dns_ds_add.html create mode 100644 remoting_client/API-docs/dns_ds_delete.html create mode 100644 remoting_client/API-docs/dns_ds_get.html create mode 100644 remoting_client/API-docs/dns_ds_update.html create mode 100644 remoting_client/examples/dns_ds_add.php create mode 100644 remoting_client/examples/dns_ds_delete.php create mode 100644 remoting_client/examples/dns_ds_get.php create mode 100644 remoting_client/examples/dns_ds_update.php diff --git a/interface/lib/classes/remote.d/dns.inc.php b/interface/lib/classes/remote.d/dns.inc.php index 463b474cd1..4b1ade6f31 100644 --- a/interface/lib/classes/remote.d/dns.inc.php +++ b/interface/lib/classes/remote.d/dns.inc.php @@ -581,6 +581,28 @@ class remoting_dns extends remoting { // ---------------------------------------------------------------------------------------------------------------- + //* Get record details + public function dns_ds_get($session_id, $primary_id) { + return $this->dns_rr_get($session_id, $primary_id, 'DS'); + } + + //* Add a record + public function dns_ds_add($session_id, $client_id, $params, $update_serial=false) { + return $this->dns_rr_add($session_id, $client_id, $params, $update_serial, 'DS'); + } + + //* Update a record + public function dns_ds_update($session_id, $client_id, $primary_id, $params, $update_serial=false) { + return $this->dns_rr_update($session_id, $client_id, $primary_id, $params, $update_serial, 'DS'); + } + + //* Delete a record + public function dns_ds_delete($session_id, $primary_id, $update_serial=false) { + return $this->dns_rr_delete($session_id, $primary_id, $update_serial, 'DS'); + } + + // ---------------------------------------------------------------------------------------------------------------- + //* Get record details public function dns_ptr_get($session_id, $primary_id) { return $this->dns_rr_get($session_id, $primary_id, 'PTR'); diff --git a/remoting_client/API-docs/dns_a_add.html b/remoting_client/API-docs/dns_a_add.html index eaa7f8eb92..e7217bcdcf 100644 --- a/remoting_client/API-docs/dns_a_add.html +++ b/remoting_client/API-docs/dns_a_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_a_update.html b/remoting_client/API-docs/dns_a_update.html index b279c6d476..ccacab408b 100644 --- a/remoting_client/API-docs/dns_a_update.html +++ b/remoting_client/API-docs/dns_a_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_aaaa_add.html b/remoting_client/API-docs/dns_aaaa_add.html index 0f8e8b61d1..ea21b15361 100644 --- a/remoting_client/API-docs/dns_aaaa_add.html +++ b/remoting_client/API-docs/dns_aaaa_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_aaaa_update.html b/remoting_client/API-docs/dns_aaaa_update.html index 1ad798fd5d..94b60f4df4 100644 --- a/remoting_client/API-docs/dns_aaaa_update.html +++ b/remoting_client/API-docs/dns_aaaa_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx''naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_alias_add.html b/remoting_client/API-docs/dns_alias_add.html index d7d68dc64e..4bea3dea6f 100644 --- a/remoting_client/API-docs/dns_alias_add.html +++ b/remoting_client/API-docs/dns_alias_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_alias_update.html b/remoting_client/API-docs/dns_alias_update.html index e43e5c40f8..058654f2f7 100644 --- a/remoting_client/API-docs/dns_alias_update.html +++ b/remoting_client/API-docs/dns_alias_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_cname_add.html b/remoting_client/API-docs/dns_cname_add.html index 71b585a68e..afef2bd75c 100644 --- a/remoting_client/API-docs/dns_cname_add.html +++ b/remoting_client/API-docs/dns_cname_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_cname_update.html b/remoting_client/API-docs/dns_cname_update.html index 568091c7db..f066633104 100644 --- a/remoting_client/API-docs/dns_cname_update.html +++ b/remoting_client/API-docs/dns_cname_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_ds_add.html b/remoting_client/API-docs/dns_ds_add.html new file mode 100644 index 0000000000..9a6ffdec04 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_add.html @@ -0,0 +1,38 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
    +

    dns_ds_add($session_id, $client_id, $params);

    +
    +

    Description:

    +

    Adds a dns authoritative nameserver record if type is ds.


    +

    Input Variables:

    +

    $session_id, $client_id, $params

    +

    Parameters (in $params):

    +

    server_id  (int(11))

    +

    zone  (int(11))

    +

    name  (varchar(64))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    +

    data  (varchar(255))

    +

    aux  (int(11))

    +

    ttl  (int(11))

    +

    active  (enum('n','y'))

    +

    stamp  (timestamp)

    +

    serial  (int(10))

    +

    Output:

    +

    Returns the ID of the newly added ds resource record.

    + +
    + + diff --git a/remoting_client/API-docs/dns_ds_delete.html b/remoting_client/API-docs/dns_ds_delete.html new file mode 100644 index 0000000000..6e54496d0a --- /dev/null +++ b/remoting_client/API-docs/dns_ds_delete.html @@ -0,0 +1,29 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
    +

    dns_ds_delete($session_id, $primary_id);

    +
    +

    Description:

    +

    Deletes target dns ds resource record.


    +

    Input Variables:

    +

    $session_id, $primary_id

    +

    Parameters (in $params):

    +

    None

    +

    Output:

    +

    Returns the number of deleted records.

    + +
    + + diff --git a/remoting_client/API-docs/dns_ds_get.html b/remoting_client/API-docs/dns_ds_get.html new file mode 100644 index 0000000000..f8d8785b54 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_get.html @@ -0,0 +1,29 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
    +

    dns_ds_get($session_id, $primary_id);

    +
    +

    Description:

    +

    Retrieves information about target dns ds resource record.


    +

    Input Variables:

    +

    $session_id, $primary_id

    +

    Parameters (in $params):

    +

    None

    +

    Output:

    +

    Returns all fields and values of the chosen dns ds resource record.

    + +
    + + diff --git a/remoting_client/API-docs/dns_ds_update.html b/remoting_client/API-docs/dns_ds_update.html new file mode 100644 index 0000000000..6b04a847b9 --- /dev/null +++ b/remoting_client/API-docs/dns_ds_update.html @@ -0,0 +1,38 @@ + +ISPCOnfig 3 remote API documentation + + + + + + + + + + +
    +

    dns_ds_update($session_id, $client_id, $primary_id, $params);

    +
    +Description: +

    Updates an authoritative nameserver record if type is ds.


    +Input Variables: +

    $session_id, $client_id, $primary_id, $params

    +Parameters (in $params): +

    server_id  (int(11))

    +

    zone  (int(11))

    +

    name  (varchar(64))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    +

    data  (varchar(255))

    +

    aux  (int(11))

    +

    ttl  (int(11))

    +

    active  (enum('n','y'))

    +

    stamp  (timestamp)

    +

    serial  (int(10))

    +Output: +

    Returns the number of affected rows.

    + +
    + + diff --git a/remoting_client/API-docs/dns_hinfo_add.html b/remoting_client/API-docs/dns_hinfo_add.html index c1bac26bdd..acd89b3d34 100644 --- a/remoting_client/API-docs/dns_hinfo_add.html +++ b/remoting_client/API-docs/dns_hinfo_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_hinfo_update.html b/remoting_client/API-docs/dns_hinfo_update.html index b2a266cef7..463b25b84a 100644 --- a/remoting_client/API-docs/dns_hinfo_update.html +++ b/remoting_client/API-docs/dns_hinfo_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_mx_add.html b/remoting_client/API-docs/dns_mx_add.html index d2c08877fe..e306b81a18 100644 --- a/remoting_client/API-docs/dns_mx_add.html +++ b/remoting_client/API-docs/dns_mx_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_mx_update.html b/remoting_client/API-docs/dns_mx_update.html index 81acd1f706..d75a8343d3 100644 --- a/remoting_client/API-docs/dns_mx_update.html +++ b/remoting_client/API-docs/dns_mx_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_naptr_add.html b/remoting_client/API-docs/dns_naptr_add.html index d691d65b3a..a8b5d966bf 100644 --- a/remoting_client/API-docs/dns_naptr_add.html +++ b/remoting_client/API-docs/dns_naptr_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_naptr_update.html b/remoting_client/API-docs/dns_naptr_update.html index 97f40f056f..98c4f03183 100644 --- a/remoting_client/API-docs/dns_naptr_update.html +++ b/remoting_client/API-docs/dns_naptr_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_ns_add.html b/remoting_client/API-docs/dns_ns_add.html index d231d37e50..8fd9564bbb 100644 --- a/remoting_client/API-docs/dns_ns_add.html +++ b/remoting_client/API-docs/dns_ns_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_ns_update.html b/remoting_client/API-docs/dns_ns_update.html index fa35029efd..32258a1504 100644 --- a/remoting_client/API-docs/dns_ns_update.html +++ b/remoting_client/API-docs/dns_ns_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_ptr_add.html b/remoting_client/API-docs/dns_ptr_add.html index 8e9a29a74a..d2331660d2 100644 --- a/remoting_client/API-docs/dns_ptr_add.html +++ b/remoting_client/API-docs/dns_ptr_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_ptr_update.html b/remoting_client/API-docs/dns_ptr_update.html index 026a44eee1..25097708ae 100644 --- a/remoting_client/API-docs/dns_ptr_update.html +++ b/remoting_client/API-docs/dns_ptr_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_rp_add.html b/remoting_client/API-docs/dns_rp_add.html index 3f2bde4fce..e20f5186c3 100644 --- a/remoting_client/API-docs/dns_rp_add.html +++ b/remoting_client/API-docs/dns_rp_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_rp_update.html b/remoting_client/API-docs/dns_rp_update.html index a1adbd289a..1e7a92db1f 100644 --- a/remoting_client/API-docs/dns_rp_update.html +++ b/remoting_client/API-docs/dns_rp_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_srv_add.html b/remoting_client/API-docs/dns_srv_add.html index 342965687b..5a2649cadb 100644 --- a/remoting_client/API-docs/dns_srv_add.html +++ b/remoting_client/API-docs/dns_srv_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_srv_update.html b/remoting_client/API-docs/dns_srv_update.html index d7caef2d60..8a2a6107bf 100644 --- a/remoting_client/API-docs/dns_srv_update.html +++ b/remoting_client/API-docs/dns_srv_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_txt_add.html b/remoting_client/API-docs/dns_txt_add.html index 11c3d89463..d99f790846 100644 --- a/remoting_client/API-docs/dns_txt_add.html +++ b/remoting_client/API-docs/dns_txt_add.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/API-docs/dns_txt_update.html b/remoting_client/API-docs/dns_txt_update.html index 9bb7f6ac30..374bede8fb 100644 --- a/remoting_client/API-docs/dns_txt_update.html +++ b/remoting_client/API-docs/dns_txt_update.html @@ -22,7 +22,7 @@

    server_id  (int(11))

    zone  (int(11))

    name  (varchar(64))

    -

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ptr','rp','srv','txt'))

    +

    type  (enum('a','aaaa','alias','cname','hinfo','mx','naptr','ns','ds','ptr','rp','srv','txt'))

    data  (varchar(255))

    aux  (int(11))

    ttl  (int(11))

    diff --git a/remoting_client/examples/dns_ds_add.php b/remoting_client/examples/dns_ds_add.php new file mode 100644 index 0000000000..b673150ec1 --- /dev/null +++ b/remoting_client/examples/dns_ds_add.php @@ -0,0 +1,47 @@ + $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
    '; + } + + //* Set the function parameters. + //* 'data' are given for example MUST be edited with appropriate DS record + $client_id = 1; + $params = array( + 'server_id' => 1, + 'zone' => 7, + 'name' => 'nameserver', + 'type' => 'ds', + 'data' => '13456 13 2 0EXD84534054012XFN7880EDFR23Z56Y34GRC64KOY704DFTEV87AE A34ZDC45', + 'aux' => '0', + 'ttl' => '3600', + 'active' => 'y', + 'stamp' => 'CURRENT_TIMESTAMP', + 'serial' => '1', + ); + + $id = $client->dns_ds_add($session_id, $client_id, $params); + + echo "ID: ".$id."
    "; + + if($client->logout($session_id)) { + echo 'Logged out.
    '; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_ds_delete.php b/remoting_client/examples/dns_ds_delete.php new file mode 100644 index 0000000000..28794ca6fe --- /dev/null +++ b/remoting_client/examples/dns_ds_delete.php @@ -0,0 +1,35 @@ + $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
    '; + } + + //* Parameters + $id = 8; + + + $affected_rows = $client->dns_ds_delete($session_id, $id); + + echo "Number of records that have been deleted: ".$affected_rows."
    "; + + if($client->logout($session_id)) { + echo 'Logged out.
    '; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_ds_get.php b/remoting_client/examples/dns_ds_get.php new file mode 100644 index 0000000000..6dffa18c10 --- /dev/null +++ b/remoting_client/examples/dns_ds_get.php @@ -0,0 +1,34 @@ + $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
    '; + } + + //* Set the function parameters. + $id = 8; + + $dns_record = $client->dns_ds_get($session_id, $id); + + print_r($dns_record); + + if($client->logout($session_id)) { + echo 'Logged out.
    '; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> diff --git a/remoting_client/examples/dns_ds_update.php b/remoting_client/examples/dns_ds_update.php new file mode 100644 index 0000000000..94f5cb10a4 --- /dev/null +++ b/remoting_client/examples/dns_ds_update.php @@ -0,0 +1,42 @@ + $soap_location, + 'uri' => $soap_uri, + 'trace' => 1, + 'exceptions' => 1)); + + +try { + if($session_id = $client->login($username, $password)) { + echo 'Logged successfull. Session ID:'.$session_id.'
    '; + } + + //* Parameters + $id = 8; + $client_id = 1; + + + //* Get the dns record + $dns_record = $client->dns_ds_get($session_id, $id); + + //* Change active to inactive + $dns_record['active'] = 'n'; + + $affected_rows = $client->dns_ds_update($session_id, $client_id, $id, $dns_record); + + echo "Number of records that have been changed in the database: ".$affected_rows."
    "; + + if($client->logout($session_id)) { + echo 'Logged out.
    '; + } + + +} catch (SoapFault $e) { + echo $client->__getLastResponse(); + die('SOAP Error: '.$e->getMessage()); +} + +?> -- GitLab From 6b35dec6c993e8a2fc77466ff6e204bcbba137cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Bla=C5=BEej?= Date: Sun, 26 Dec 2021 20:53:08 +0000 Subject: [PATCH 1293/1368] issue 6265: add slovak translation for email and web templates --- server/conf/index/standard_index.html_sk | 60 +++++++++++++++++++ server/conf/index/user_standard_index.html_sk | 60 +++++++++++++++++++ server/conf/mail/db_quota_notification_sk.txt | 13 ++++ .../conf/mail/db_quota_ok_notification_sk.txt | 13 ++++ .../conf/mail/mail_quota_notification_sk.txt | 14 +++++ .../mail/mail_quota_ok_notification_sk.txt | 14 +++++ .../conf/mail/web_quota_notification_sk.txt | 14 +++++ .../mail/web_quota_ok_notification_sk.txt | 14 +++++ .../conf/mail/web_traffic_notification_sk.txt | 8 +++ .../mail/web_traffic_notification_warn_sk.txt | 8 +++ server/conf/mail/welcome_email_sk.txt | 4 ++ 11 files changed, 222 insertions(+) create mode 100644 server/conf/index/standard_index.html_sk create mode 100644 server/conf/index/user_standard_index.html_sk create mode 100644 server/conf/mail/db_quota_notification_sk.txt create mode 100644 server/conf/mail/db_quota_ok_notification_sk.txt create mode 100644 server/conf/mail/mail_quota_notification_sk.txt create mode 100644 server/conf/mail/mail_quota_ok_notification_sk.txt create mode 100644 server/conf/mail/web_quota_notification_sk.txt create mode 100644 server/conf/mail/web_quota_ok_notification_sk.txt create mode 100644 server/conf/mail/web_traffic_notification_sk.txt create mode 100644 server/conf/mail/web_traffic_notification_warn_sk.txt create mode 100644 server/conf/mail/welcome_email_sk.txt diff --git a/server/conf/index/standard_index.html_sk b/server/conf/index/standard_index.html_sk new file mode 100644 index 0000000000..d6edcdeb9f --- /dev/null +++ b/server/conf/index/standard_index.html_sk @@ -0,0 +1,60 @@ + + + + Vitajte! + + + + + + +
    + +
    +

    Toto je štandardná stránka Vašej webstránky.

    +

    Môžete ju bez obáv vymazať alebo nahradiť iným súborom. Toto je súbor index.html v adresári web.

    +

    Ak máte akékoľvek otázky kontaktujte podporu.

    +
    + +
    + + diff --git a/server/conf/index/user_standard_index.html_sk b/server/conf/index/user_standard_index.html_sk new file mode 100644 index 0000000000..36e8e90db8 --- /dev/null +++ b/server/conf/index/user_standard_index.html_sk @@ -0,0 +1,60 @@ + + + + Vitajte! + + + + + + +
    + +
    +

    Toto je štandardná stránka Vašej webstránky {USER_USERNAME}

    +

    Môžete ju bez obáv vymazať alebo nahradiť iným súborom. Toto je súbor index.html v adresári user/{USER_USERNAME}/web.

    +

    Ak máte akékoľvek otázky kontaktujte podporu.

    +
    + +
    + + diff --git a/server/conf/mail/db_quota_notification_sk.txt b/server/conf/mail/db_quota_notification_sk.txt new file mode 100644 index 0000000000..c90c985407 --- /dev/null +++ b/server/conf/mail/db_quota_notification_sk.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na veľkosť databázy + +Databáza {database_name} je blízko alebo prekročila limit veľkosti. + +Databáza: {database_name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/db_quota_ok_notification_sk.txt b/server/conf/mail/db_quota_ok_notification_sk.txt new file mode 100644 index 0000000000..10dc74ca81 --- /dev/null +++ b/server/conf/mail/db_quota_ok_notification_sk.txt @@ -0,0 +1,13 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Veľkosť databázy ok + +Databáza {database_name} už nie je blízko ani neprekračuje limit veľkosti. + +Databáza: {database_name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/mail_quota_notification_sk.txt b/server/conf/mail/mail_quota_notification_sk.txt new file mode 100644 index 0000000000..f9abcab03a --- /dev/null +++ b/server/conf/mail/mail_quota_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na veľkosť poštovej schránky + +Poštová schránka {email} je blízko alebo prekročila limit veľkosti. + +Poštová schránka: {email} +Meno: {name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/mail_quota_ok_notification_sk.txt b/server/conf/mail/mail_quota_ok_notification_sk.txt new file mode 100644 index 0000000000..1750a5ecd5 --- /dev/null +++ b/server/conf/mail/mail_quota_ok_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Veľkosť poštovej schránky ok + +Poštová schránka {email} už nie je blízko ani neprekračuje limit veľkosti. + +Poštová schránka: {email} +Meno: {name} +Využité miesto: {used} +Limit: {quota} +Percento využitia: {ratio} diff --git a/server/conf/mail/web_quota_notification_sk.txt b/server/conf/mail/web_quota_notification_sk.txt new file mode 100644 index 0000000000..62a73a7404 --- /dev/null +++ b/server/conf/mail/web_quota_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na veľkosť webstránky + +Webstránka {domain} je blízko alebo prekročila limit veľkosti. + +Doména: {domain} +Využité miesto: {used} +Mäkký limit: {soft} +Tvrdý limit: {hard} +Percento využitia: {ratio} diff --git a/server/conf/mail/web_quota_ok_notification_sk.txt b/server/conf/mail/web_quota_ok_notification_sk.txt new file mode 100644 index 0000000000..88f36432a0 --- /dev/null +++ b/server/conf/mail/web_quota_ok_notification_sk.txt @@ -0,0 +1,14 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Veľkosť webstránky ok + +Webstránka {domain} už nie je blízko ani neprekračuje limit veľkosti. + +Doména: {domain} +Využité miesto: {used} +Mäkký limit: {soft} +Tvrdý limit: {hard} +Percento využitia: {ratio} diff --git a/server/conf/mail/web_traffic_notification_sk.txt b/server/conf/mail/web_traffic_notification_sk.txt new file mode 100644 index 0000000000..8cac0e9613 --- /dev/null +++ b/server/conf/mail/web_traffic_notification_sk.txt @@ -0,0 +1,8 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na dátovú premávku webstránky + +Webstránka {domain} prekročila limit dátovej premávky a bola zablokovaná. diff --git a/server/conf/mail/web_traffic_notification_warn_sk.txt b/server/conf/mail/web_traffic_notification_warn_sk.txt new file mode 100644 index 0000000000..7f83616a5e --- /dev/null +++ b/server/conf/mail/web_traffic_notification_warn_sk.txt @@ -0,0 +1,8 @@ +MIME-Version: 1.0 +Content-type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit +From: {admin_mail} +Reply-To: {admin_mail} +Subject: Upozornenie na dátovú premávku webstránky + +Webstránka {domain} prekročila limit dátovej premávky. diff --git a/server/conf/mail/welcome_email_sk.txt b/server/conf/mail/welcome_email_sk.txt new file mode 100644 index 0000000000..98f6d8ecc6 --- /dev/null +++ b/server/conf/mail/welcome_email_sk.txt @@ -0,0 +1,4 @@ +From: {admin_name} <{admin_mail}> +Subject: Vitajte vo Vašej novej emailovej schránke. + +Vitajte vo Vašej novej emailovej schránke. Váš správca. -- GitLab From 8add9a8661e8c4cc97161501b784bf2ed195796c Mon Sep 17 00:00:00 2001 From: Till Date: Fri, 7 Jan 2022 12:04:47 +0100 Subject: [PATCH 1294/1368] Fixed issue in removeLine function of system lib. --- server/lib/classes/system.inc.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/server/lib/classes/system.inc.php b/server/lib/classes/system.inc.php index 37418149ae..7e4e7ae447 100644 --- a/server/lib/classes/system.inc.php +++ b/server/lib/classes/system.inc.php @@ -1707,10 +1707,7 @@ class system{ $out = ''; foreach($lines as $line) { if($strict == 0 && preg_match('/^REGEX:(.*)$/', $search_pattern)) { - if(preg_match(substr($search_pattern, 6), $line)) { - $out .= $new_line."\n"; - $found = 1; - } else { + if(!preg_match(substr($search_pattern, 6), $line)) { $out .= $line; } } elseif($strict == 0) { -- GitLab From e801eb80d9ec084312f593215ad8b07c083acaea Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Tue, 11 Jan 2022 17:43:11 +0100 Subject: [PATCH 1295/1368] overhauled RHEL/Fedora detection --- server/lib/classes/monitor_tools.inc.php | 104 +++++++++-------------- 1 file changed, 42 insertions(+), 62 deletions(-) diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 42ed9146e4..e7bc8bab93 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -261,8 +261,8 @@ class monitor_tools { $distbaseid = 'opensuse'; } elseif(stristr(file_get_contents('/etc/os-release'), 'opensuse')) { $content = file_get_contents('/etc/os-release'); - preg_match_all('/NAME=\"([\w ]+)\"/m', $content, $name); - preg_match_all('/VERSION_ID=\"([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*).$/m', $content, $version); + preg_match_all('/NAME=\"([\w ]+)\"/m', $content, $name); + preg_match_all('/VERSION_ID=\"([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*).$/m', $content, $version); $distname = is_array($name) ? $name[1][0] : 'openSUSE'; $distver = is_array($version) ? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) : 'Unknown'; $distid = 'opensuse112'; @@ -276,85 +276,65 @@ class monitor_tools { } - //** Redhat - elseif(file_exists('/etc/redhat-release')) { + //** RHEL (including compatible clones) & Fedora + elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { + $content = file_get_contents('/etc/os-release'); - $content = file_get_contents('/etc/redhat-release'); + //preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); + preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); + preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); + preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); - if(stristr($content, 'Fedora release 9 (Sulphur)')) { - $distname = 'Fedora'; - $distver = '9'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 10 (Cambridge)')) { - $distname = 'Fedora'; - $distver = '10'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 10')) { - $distname = 'Fedora'; - $distver = '11'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 32 (Thirty Two)')) { + if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) { $distname = 'Fedora'; $distver = '32'; $distid = 'fedora32'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'Fedora release 33 (Thirty Three)')) { + } elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) { $distname = 'Fedora'; $distver = '33'; $distid = 'fedora33'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS release 5.2 (Final)')) { - $distname = 'CentOS'; - $distver = '5.2'; - $distid = 'centos52'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS release 5.3 (Final)')) { - $distname = 'CentOS'; - $distver = '5.3'; - $distid = 'centos53'; + //** RHEL 7 and compatible clones + } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_string); + $distname = $name[0]; + $distver = is_array($centos7_string)? implode('.', array_filter(array($centos7_string[1][0],$centos7_string[2][0],$centos7_string[3][0]),'strlen')) : $version[0]; + $distid = 'centos72'; + $distbaseid = 'fedora'; + //** RHEL 8 and compatible clones + } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { + $distname = $name[0]; + $distver = $version[0]; + $distid = 'centos80'; $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS release 5')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - } elseif(stristr($content, 'CentOS Linux release 7')) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); - $distname = 'CentOS'; - $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; - $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - if($var=='7.0' || $var=='7.1') { - $distid = 'centos70'; - } else { - $distid = 'centos72'; - } - } elseif(stristr($content, 'CentOS Linux release 8')) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', $content, $version); - $distname = 'CentOS'; - $distver = is_array($version)? implode('.', array_filter(array($version[1][0],$version[2][0],$version[3][0]),'strlen')) :'Unknown'; - $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; } else { $distname = 'Redhat'; $distver = 'Unknown'; $distid = 'fedora9'; $distbaseid = 'fedora'; } + } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release')) { + + $content = file_get_contents('/etc/redhat-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + $distname = 'CentOS'; + $distver = 'Unknown'; + $distid = 'centos53'; + $distbaseid = 'fedora'; + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } + } + + + //** Gentoo elseif(file_exists('/etc/gentoo-release')) { -- GitLab From 60875211113fe2e9c2b91aecdb86aad366d6be15 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Tue, 11 Jan 2022 18:04:38 +0100 Subject: [PATCH 1296/1368] prepared installer for new RHEL 8 clones --- install/lib/install.lib.php | 150 +++++++++-------------- server/lib/classes/monitor_tools.inc.php | 1 + 2 files changed, 62 insertions(+), 89 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 6ff32bb785..ab6bc76d3c 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -291,96 +291,68 @@ function get_distname() { } } - - //** Redhat - elseif(file_exists('/etc/redhat-release')) { - - $content = file_get_contents('/etc/redhat-release'); - - if(stristr($content, 'Fedora release 9 (Sulphur)')) { - $distname = 'Fedora'; - $distver = '9'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 9 or compatible\n"); - } elseif(stristr($content, 'Fedora release 10 (Cambridge)')) { - $distname = 'Fedora'; - $distver = '10'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 10 or compatible\n"); - } elseif(stristr($content, 'Fedora release 10')) { - $distname = 'Fedora'; - $distver = '11'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 11 or compatible\n"); - } elseif(stristr($content, 'Fedora release 32 (Thirty Two)')) { - $distname = 'Fedora'; - $distver = '32'; - $distid = 'fedora32'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 32 or compatible\n"); - } elseif(stristr($content, 'Fedora release 33 (Thirty Three)')) { - $distname = 'Fedora'; - $distver = '33'; - $distid = 'fedora33'; - $distbaseid = 'fedora'; - swriteln("Operating System: Fedora 33 or compatible\n"); - } elseif(stristr($content, 'CentOS release 5.2 (Final)')) { - $distname = 'CentOS'; - $distver = '5.2'; - $distid = 'centos52'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 5.2 or compatible\n"); - } elseif(stristr($content, 'CentOS release 5.3 (Final)')) { - $distname = 'CentOS'; - $distver = '5.3'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 5.3 or compatible\n"); - } elseif(stristr($content, 'CentOS release 5')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 5 or compatible\n"); - } elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distid = 'centos53'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS 6 or compatible\n"); - } elseif(stristr($content, 'CentOS Linux release 7')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distbaseid = 'fedora'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - if($var=='7.0' || $var=='7.1') { - $distid = 'centos70'; - } else { - $distid = 'centos72'; - } - swriteln("Operating System: CentOS $var\n"); - } elseif(stristr($content, 'CentOS Linux release 8')) { - $distname = 'CentOS'; - $distver = 'Unknown'; - $distbaseid = 'fedora'; - $distid = 'centos80'; - $var=explode(" ", $content); - $var=explode(".", $var[3]); - $var=$var[0].".".$var[1]; - swriteln("Operating System: CentOS $var\n"); - } else { - $distname = 'Redhat'; - $distver = 'Unknown'; - $distid = 'fedora9'; - $distbaseid = 'fedora'; - swriteln("Operating System: Redhat or compatible, unknown version.\n"); + //** RHEL (including compatible clones) & Fedora + elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { + $content = file_get_contents('/etc/os-release'); + + preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); + preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); + preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); + + if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) { + $distname = 'Fedora'; + $distver = '32'; + $distid = 'fedora32'; + $distbaseid = 'fedora'; + swriteln("Operating System: Fedora 32 or compatible\n"); + } elseif(stristr($prettyname[0], 'Fedora 33 (Thirty Three)')) { + $distname = 'Fedora'; + $distver = '33'; + $distid = 'fedora33'; + $distbaseid = 'fedora'; + swriteln("Operating System: Fedora 33 or compatible\n"); + //** RHEL 7 and compatible clones + } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_string); + $distname = $name[0]; + $distver = is_array($centos7_string)? implode('.', array_filter(array($centos7_string[1][0],$centos7_string[2][0],$centos7_string[3][0]),'strlen')) : $version[0]; + $distid = 'centos72'; + $distbaseid = 'fedora'; + swriteln("Operating System: RHEL 7 or compatible\n"); + //** RHEL 8 and compatible clones + } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { + $distname = $name[0]; + $distver = $version[0]; + $distid = 'centos80'; + $distbaseid = 'fedora'; + swriteln("Operating System: RHEL 8 or compatible\n"); + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + swriteln("Operating System: Redhat or compatible\n"); } - } + //** RHEL 6 and compatible clones + } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release')) { + + $content = file_get_contents('/etc/redhat-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + $distname = 'CentOS'; + $distver = 'Unknown'; + $distid = 'centos53'; + $distbaseid = 'fedora'; + swriteln("Operating System: CentOS/RHEL 6 or compatible\n"); + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + swriteln("Operating System: Redhat or compatible\n"); + } + + } //** Gentoo elseif(file_exists('/etc/gentoo-release')) { diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index e7bc8bab93..258ebd0f72 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -314,6 +314,7 @@ class monitor_tools { $distid = 'fedora9'; $distbaseid = 'fedora'; } + //** RHEL 6 and compatible clones } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release')) { $content = file_get_contents('/etc/redhat-release'); -- GitLab From ec55ba1cfc75c40ba7a6d3c6db9f51a62985af61 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Tue, 11 Jan 2022 22:54:07 +0100 Subject: [PATCH 1297/1368] readded prettyname detection --- install/lib/install.lib.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index ab6bc76d3c..96ff4da0bd 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -293,9 +293,11 @@ function get_distname() { //** RHEL (including compatible clones) & Fedora elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { - $content = file_get_contents('/etc/os-release'); - preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); + $content = file_get_contents('/etc/os-release'); + + preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); + preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); @@ -318,14 +320,14 @@ function get_distname() { $distver = is_array($centos7_string)? implode('.', array_filter(array($centos7_string[1][0],$centos7_string[2][0],$centos7_string[3][0]),'strlen')) : $version[0]; $distid = 'centos72'; $distbaseid = 'fedora'; - swriteln("Operating System: RHEL 7 or compatible\n"); + swriteln("Operating System: RHEL/CentOS 7 or compatible\n"); //** RHEL 8 and compatible clones } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { $distname = $name[0]; $distver = $version[0]; $distid = 'centos80'; $distbaseid = 'fedora'; - swriteln("Operating System: RHEL 8 or compatible\n"); + swriteln("Operating System: RHEL/CentOS 8 or compatible\n"); } else { $distname = 'Redhat'; $distver = 'Unknown'; -- GitLab From efc2cbe5e094337a0337ae287c29e73e5e38b114 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Wed, 12 Jan 2022 15:21:22 +0100 Subject: [PATCH 1298/1368] clean up and comments changed --- install/lib/install.lib.php | 47 +++++++++++++++++------- server/lib/classes/monitor_tools.inc.php | 35 +++++++++++++----- 2 files changed, 59 insertions(+), 23 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 96ff4da0bd..be22aead13 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -315,47 +315,66 @@ function get_distname() { swriteln("Operating System: Fedora 33 or compatible\n"); //** RHEL 7 and compatible clones } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_string); + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version); $distname = $name[0]; - $distver = is_array($centos7_string)? implode('.', array_filter(array($centos7_string[1][0],$centos7_string[2][0],$centos7_string[3][0]),'strlen')) : $version[0]; + $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0]; $distid = 'centos72'; - $distbaseid = 'fedora'; - swriteln("Operating System: RHEL/CentOS 7 or compatible\n"); - //** RHEL 8 and compatible clones + $distbaseid = 'fedora'; + swriteln("Operating System: " . $distname . " " . $distver . "\n"); + //** RHEL 8 and compatible clones } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { $distname = $name[0]; $distver = $version[0]; $distid = 'centos80'; $distbaseid = 'fedora'; - swriteln("Operating System: RHEL/CentOS 8 or compatible\n"); - } else { + swriteln("Operating System: " . $prettyname[0] . "\n"); + } else { $distname = 'Redhat'; $distver = 'Unknown'; $distid = 'fedora9'; $distbaseid = 'fedora'; swriteln("Operating System: Redhat or compatible\n"); } - //** RHEL 6 and compatible clones - } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release')) { + //** CentOS 6 + } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) { $content = file_get_contents('/etc/redhat-release'); if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { - $distname = 'CentOS'; - $distver = 'Unknown'; + preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = is_array($centos6_version)? implode('.', array_filter(array($centos6_version[0][0]),'strlen')) : '6'; $distid = 'centos53'; - $distbaseid = 'fedora'; - swriteln("Operating System: CentOS/RHEL 6 or compatible\n"); + $distbaseid = 'fedora'; + swriteln("Operating System: " . $distname . " " . $distver . "\n"); + } else { $distname = 'Redhat'; $distver = 'Unknown'; $distid = 'fedora9'; $distbaseid = 'fedora'; - swriteln("Operating System: Redhat or compatible\n"); } + //** CentOS 6 Extended Lifecycle Support by CloudLinux + } elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) { + $content = file_get_contents('/etc/els-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = $centos6_version[0][0]; + $distid = 'centos53'; + $distbaseid = 'fedora'; + swriteln("Operating System: " . $distname . " " . $distver . "\n"); + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } } + //** Gentoo elseif(file_exists('/etc/gentoo-release')) { diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 258ebd0f72..33eceeb5f4 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -280,7 +280,7 @@ class monitor_tools { elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { $content = file_get_contents('/etc/os-release'); - //preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); + preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); @@ -297,9 +297,9 @@ class monitor_tools { $distbaseid = 'fedora'; //** RHEL 7 and compatible clones } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { - preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_string); + preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version); $distname = $name[0]; - $distver = is_array($centos7_string)? implode('.', array_filter(array($centos7_string[1][0],$centos7_string[2][0],$centos7_string[3][0]),'strlen')) : $version[0]; + $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0]; $distid = 'centos72'; $distbaseid = 'fedora'; //** RHEL 8 and compatible clones @@ -314,24 +314,41 @@ class monitor_tools { $distid = 'fedora9'; $distbaseid = 'fedora'; } - //** RHEL 6 and compatible clones - } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release')) { + //** CentOS 6 + } elseif(file_exists('/etc/redhat-release') && !file_exists('/etc/os-release') && !file_exists('/etc/els-release')) { $content = file_get_contents('/etc/redhat-release'); if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { - $distname = 'CentOS'; - $distver = 'Unknown'; + preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = is_array($centos6_version)? implode('.', array_filter(array($centos6_version[0][0]),'strlen')) : '6'; $distid = 'centos53'; $distbaseid = 'fedora'; - } else { + } else { $distname = 'Redhat'; $distver = 'Unknown'; $distid = 'fedora9'; $distbaseid = 'fedora'; } + //** CentOS 6 Extended Lifecycle Support by CloudLinux + } elseif(file_exists('/etc/redhat-release') && file_exists('/etc/els-release') && !file_exists('/etc/os-release')) { - } + $content = file_get_contents('/etc/els-release'); + + if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { + preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version); + $distname = 'CentOS Linux'; + $distver = $centos6_version[0][0]; + $distid = 'centos53'; + $distbaseid = 'fedora'; + } else { + $distname = 'Redhat'; + $distver = 'Unknown'; + $distid = 'fedora9'; + $distbaseid = 'fedora'; + } + } -- GitLab From b517b7c5ad8f6b8237526c6fe0554ac453795a55 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Thu, 13 Jan 2022 18:17:47 +0100 Subject: [PATCH 1299/1368] Changed the file location for $conf['admin_ip_whitelist_file'], as suggested. --- interface/lib/config.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/config.inc.php b/interface/lib/config.inc.php index a2bdaecd0d..c492680513 100644 --- a/interface/lib/config.inc.php +++ b/interface/lib/config.inc.php @@ -160,6 +160,6 @@ define('LOGLEVEL_WARN', 1); define('LOGLEVEL_ERROR', 2); //** Admin IP whitelist file -$conf['admin_ip_whitelist_file'] = '/etc/ispconfig_admin_ip_whitelist'; +$conf['admin_ip_whitelist_file'] = '/usr/local/ispconfig/security/admin_ip.whitelist'; ?> -- GitLab From 861f2b9804aac33037fcf36d16c9ff5849a56490 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Fri, 14 Jan 2022 23:17:28 +0100 Subject: [PATCH 1300/1368] Add translation lines for all other languages --- interface/web/dns/lib/lang/ar_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/bg_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/br_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/ca_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/cz_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/de_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/dk_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/el_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/es_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/fi_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/fr_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/hr_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/hu_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/id_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/it_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/ja_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/pl_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/pt_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/ro_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/ru_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/se_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/sk_dns_soa.lng | 2 ++ interface/web/dns/lib/lang/tr_dns_soa.lng | 2 ++ 23 files changed, 46 insertions(+) diff --git a/interface/web/dns/lib/lang/ar_dns_soa.lng b/interface/web/dns/lib/lang/ar_dns_soa.lng index 0d90b7091b..4333c3793a 100644 --- a/interface/web/dns/lib/lang/ar_dns_soa.lng +++ b/interface/web/dns/lib/lang/ar_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/bg_dns_soa.lng b/interface/web/dns/lib/lang/bg_dns_soa.lng index 4cd3c705ac..c1e57edf8b 100644 --- a/interface/web/dns/lib/lang/bg_dns_soa.lng +++ b/interface/web/dns/lib/lang/bg_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/br_dns_soa.lng b/interface/web/dns/lib/lang/br_dns_soa.lng index 81b2bb24c7..e6c8982de0 100644 --- a/interface/web/dns/lib/lang/br_dns_soa.lng +++ b/interface/web/dns/lib/lang/br_dns_soa.lng @@ -42,3 +42,5 @@ $wb['error_not_allowed_server_id'] = 'O servidor selecionado não é permitido p $wb['soa_cannot_be_changed_txt'] = 'A zona (SOA) não pode ser modificada. Por favor, contate o administrador se deseja modificar esta zona.'; $wb['configuration_error_txt'] = 'ERRO DE CONFIGURAÇÃO'; $wb['dnssec_algo_txt'] = 'Algoritmo DNSSEC'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; diff --git a/interface/web/dns/lib/lang/ca_dns_soa.lng b/interface/web/dns/lib/lang/ca_dns_soa.lng index ee2fdb07b6..2ac84a17df 100644 --- a/interface/web/dns/lib/lang/ca_dns_soa.lng +++ b/interface/web/dns/lib/lang/ca_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/cz_dns_soa.lng b/interface/web/dns/lib/lang/cz_dns_soa.lng index ef6fdf82d8..73c2582117 100644 --- a/interface/web/dns/lib/lang/cz_dns_soa.lng +++ b/interface/web/dns/lib/lang/cz_dns_soa.lng @@ -42,3 +42,5 @@ $wb['error_not_allowed_server_id'] = 'Vybraný server není pro tento účet pov $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algoritmus'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; diff --git a/interface/web/dns/lib/lang/de_dns_soa.lng b/interface/web/dns/lib/lang/de_dns_soa.lng index 14897b24e4..7338e15433 100644 --- a/interface/web/dns/lib/lang/de_dns_soa.lng +++ b/interface/web/dns/lib/lang/de_dns_soa.lng @@ -42,4 +42,6 @@ $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithmus'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/dk_dns_soa.lng b/interface/web/dns/lib/lang/dk_dns_soa.lng index a4ff50f14f..6759024041 100644 --- a/interface/web/dns/lib/lang/dk_dns_soa.lng +++ b/interface/web/dns/lib/lang/dk_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'The Zone (SOA) can not be changed. Please contact your administrator to change the zone.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/el_dns_soa.lng b/interface/web/dns/lib/lang/el_dns_soa.lng index a22c9de413..4ceed78dc9 100644 --- a/interface/web/dns/lib/lang/el_dns_soa.lng +++ b/interface/web/dns/lib/lang/el_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/es_dns_soa.lng b/interface/web/dns/lib/lang/es_dns_soa.lng index b1484e749a..b1061373f5 100644 --- a/interface/web/dns/lib/lang/es_dns_soa.lng +++ b/interface/web/dns/lib/lang/es_dns_soa.lng @@ -42,4 +42,6 @@ $wb['xfer_error_regex'] = 'Notificar también a: Por favor, usa una dirección I $wb['xfer_txt'] = 'Permitir transferencia de zonas a
    estas IP (lista separada por comas)'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/fi_dns_soa.lng b/interface/web/dns/lib/lang/fi_dns_soa.lng index d90de950b0..36f95abab0 100644 --- a/interface/web/dns/lib/lang/fi_dns_soa.lng +++ b/interface/web/dns/lib/lang/fi_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/fr_dns_soa.lng b/interface/web/dns/lib/lang/fr_dns_soa.lng index d2449c323e..dd66dc1986 100644 --- a/interface/web/dns/lib/lang/fr_dns_soa.lng +++ b/interface/web/dns/lib/lang/fr_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/hr_dns_soa.lng b/interface/web/dns/lib/lang/hr_dns_soa.lng index d738ff1e18..5d88b47087 100644 --- a/interface/web/dns/lib/lang/hr_dns_soa.lng +++ b/interface/web/dns/lib/lang/hr_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/hu_dns_soa.lng b/interface/web/dns/lib/lang/hu_dns_soa.lng index 38d3272f04..fdabdd99c2 100644 --- a/interface/web/dns/lib/lang/hu_dns_soa.lng +++ b/interface/web/dns/lib/lang/hu_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/id_dns_soa.lng b/interface/web/dns/lib/lang/id_dns_soa.lng index 2c1842e6f2..d6cb9d78da 100644 --- a/interface/web/dns/lib/lang/id_dns_soa.lng +++ b/interface/web/dns/lib/lang/id_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa.lng b/interface/web/dns/lib/lang/it_dns_soa.lng index 714c6c7056..56dfd03daa 100644 --- a/interface/web/dns/lib/lang/it_dns_soa.lng +++ b/interface/web/dns/lib/lang/it_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/ja_dns_soa.lng b/interface/web/dns/lib/lang/ja_dns_soa.lng index a2e5e20c71..70d9414d26 100644 --- a/interface/web/dns/lib/lang/ja_dns_soa.lng +++ b/interface/web/dns/lib/lang/ja_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/pl_dns_soa.lng b/interface/web/dns/lib/lang/pl_dns_soa.lng index 7502a59237..d83e0aeeb0 100644 --- a/interface/web/dns/lib/lang/pl_dns_soa.lng +++ b/interface/web/dns/lib/lang/pl_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/pt_dns_soa.lng b/interface/web/dns/lib/lang/pt_dns_soa.lng index 7d4c692855..e1e8490b7d 100644 --- a/interface/web/dns/lib/lang/pt_dns_soa.lng +++ b/interface/web/dns/lib/lang/pt_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/ro_dns_soa.lng b/interface/web/dns/lib/lang/ro_dns_soa.lng index f1125b6981..87382ffa6f 100644 --- a/interface/web/dns/lib/lang/ro_dns_soa.lng +++ b/interface/web/dns/lib/lang/ro_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/ru_dns_soa.lng b/interface/web/dns/lib/lang/ru_dns_soa.lng index f6043010d4..36a4c89cdf 100644 --- a/interface/web/dns/lib/lang/ru_dns_soa.lng +++ b/interface/web/dns/lib/lang/ru_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'Выбранный сервер не до $wb['soa_cannot_be_changed_txt'] = 'Зона (SOA) не может быть изменена. Пожалуйста, обратитесь к администратору, чтобы изменить зону.'; $wb['configuration_error_txt'] = 'ОШИБКА КОНФИГУРАЦИИ'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/se_dns_soa.lng b/interface/web/dns/lib/lang/se_dns_soa.lng index a27181699d..0e9732b43e 100644 --- a/interface/web/dns/lib/lang/se_dns_soa.lng +++ b/interface/web/dns/lib/lang/se_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/sk_dns_soa.lng b/interface/web/dns/lib/lang/sk_dns_soa.lng index a03b15d477..115df56725 100644 --- a/interface/web/dns/lib/lang/sk_dns_soa.lng +++ b/interface/web/dns/lib/lang/sk_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'The selected server is not allowed for thi $wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; $wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/dns/lib/lang/tr_dns_soa.lng b/interface/web/dns/lib/lang/tr_dns_soa.lng index e5d55678cb..fc1bc60a82 100644 --- a/interface/web/dns/lib/lang/tr_dns_soa.lng +++ b/interface/web/dns/lib/lang/tr_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'Seçilmiş sunucuda bu hesap kullanılamaz $wb['soa_cannot_be_changed_txt'] = 'Bölge (SOA) değiştirilemez. Lütfen bölgeyi değiştirmek için yöneticiniz ile görüşün.'; $wb['configuration_error_txt'] = 'YAPILANDIRMA SORUNU'; $wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> -- GitLab From 0cdd669ccfdc66a8bc784a9fa32ce2fc528685ff Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Sat, 15 Jan 2022 13:04:06 +0100 Subject: [PATCH 1301/1368] Add config checkbox for dns-zone-rendering --- .../web/admin/form/system_config.tform.php | 6 +++++ .../web/admin/lib/lang/ar_system_config.lng | 1 + .../web/admin/lib/lang/bg_system_config.lng | 1 + .../web/admin/lib/lang/br_system_config.lng | 1 + .../web/admin/lib/lang/ca_system_config.lng | 1 + .../web/admin/lib/lang/cz_system_config.lng | 1 + .../web/admin/lib/lang/de_system_config.lng | 1 + .../web/admin/lib/lang/dk_system_config.lng | 1 + .../web/admin/lib/lang/el_system_config.lng | 1 + .../web/admin/lib/lang/en_system_config.lng | 1 + .../web/admin/lib/lang/es_system_config.lng | 1 + .../web/admin/lib/lang/fi_system_config.lng | 1 + .../web/admin/lib/lang/fr_system_config.lng | 1 + .../web/admin/lib/lang/hr_system_config.lng | 1 + .../web/admin/lib/lang/hu_system_config.lng | 1 + .../web/admin/lib/lang/id_system_config.lng | 1 + .../web/admin/lib/lang/it_system_config.lng | 1 + .../web/admin/lib/lang/ja_system_config.lng | 1 + .../web/admin/lib/lang/nl_system_config.lng | 1 + .../web/admin/lib/lang/pl_system_config.lng | 1 + .../web/admin/lib/lang/pt_system_config.lng | 1 + .../web/admin/lib/lang/ro_system_config.lng | 1 + .../web/admin/lib/lang/ru_system_config.lng | 1 + .../web/admin/lib/lang/se_system_config.lng | 1 + .../web/admin/lib/lang/sk_system_config.lng | 1 + .../web/admin/lib/lang/tr_system_config.lng | 1 + .../templates/system_config_dns_edit.htm | 10 ++++++- interface/web/dns/form/dns_soa.tform.php | 26 +++++++++++-------- 28 files changed, 55 insertions(+), 12 deletions(-) diff --git a/interface/web/admin/form/system_config.tform.php b/interface/web/admin/form/system_config.tform.php index c7d15ffcf4..bce858b522 100644 --- a/interface/web/admin/form/system_config.tform.php +++ b/interface/web/admin/form/system_config.tform.php @@ -481,6 +481,12 @@ $form["tabs"]['dns'] = array ( 'value' => '', 'name' => 'default_slave_dnsserver' ), + 'dns_show_zoneexport' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), //################################# // END Datatable fields //################################# diff --git a/interface/web/admin/lib/lang/ar_system_config.lng b/interface/web/admin/lib/lang/ar_system_config.lng index 5d21ab4c2e..a10274c670 100644 --- a/interface/web/admin/lib/lang/ar_system_config.lng +++ b/interface/web/admin/lib/lang/ar_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/bg_system_config.lng b/interface/web/admin/lib/lang/bg_system_config.lng index 1b8d10541d..898020365f 100644 --- a/interface/web/admin/lib/lang/bg_system_config.lng +++ b/interface/web/admin/lib/lang/bg_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/br_system_config.lng b/interface/web/admin/lib/lang/br_system_config.lng index 6cf3bf58bb..1fb510ace0 100644 --- a/interface/web/admin/lib/lang/br_system_config.lng +++ b/interface/web/admin/lib/lang/br_system_config.lng @@ -106,3 +106,4 @@ $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; $wb['monitor_key_txt'] = 'Senha do Monitor'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; diff --git a/interface/web/admin/lib/lang/ca_system_config.lng b/interface/web/admin/lib/lang/ca_system_config.lng index 9f9f362288..68ca245f3d 100644 --- a/interface/web/admin/lib/lang/ca_system_config.lng +++ b/interface/web/admin/lib/lang/ca_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/cz_system_config.lng b/interface/web/admin/lib/lang/cz_system_config.lng index 23dbc9c41e..c6f45e7d46 100644 --- a/interface/web/admin/lib/lang/cz_system_config.lng +++ b/interface/web/admin/lib/lang/cz_system_config.lng @@ -106,3 +106,4 @@ $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; $wb['monitor_key_txt'] = 'Monitor keyword'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; diff --git a/interface/web/admin/lib/lang/de_system_config.lng b/interface/web/admin/lib/lang/de_system_config.lng index 7d372a820e..328124f6e7 100644 --- a/interface/web/admin/lib/lang/de_system_config.lng +++ b/interface/web/admin/lib/lang/de_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/dk_system_config.lng b/interface/web/admin/lib/lang/dk_system_config.lng index 18160789a9..71533e77d0 100644 --- a/interface/web/admin/lib/lang/dk_system_config.lng +++ b/interface/web/admin/lib/lang/dk_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/el_system_config.lng b/interface/web/admin/lib/lang/el_system_config.lng index 7e2df97a49..f64df47bc9 100644 --- a/interface/web/admin/lib/lang/el_system_config.lng +++ b/interface/web/admin/lib/lang/el_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/en_system_config.lng b/interface/web/admin/lib/lang/en_system_config.lng index 7db4270c12..2f32d4feaa 100644 --- a/interface/web/admin/lib/lang/en_system_config.lng +++ b/interface/web/admin/lib/lang/en_system_config.lng @@ -106,4 +106,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/es_system_config.lng b/interface/web/admin/lib/lang/es_system_config.lng index 92633c1601..471975be43 100644 --- a/interface/web/admin/lib/lang/es_system_config.lng +++ b/interface/web/admin/lib/lang/es_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/fi_system_config.lng b/interface/web/admin/lib/lang/fi_system_config.lng index 1a12444057..30dd462a29 100644 --- a/interface/web/admin/lib/lang/fi_system_config.lng +++ b/interface/web/admin/lib/lang/fi_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/fr_system_config.lng b/interface/web/admin/lib/lang/fr_system_config.lng index a79bf9dafd..ac606922a0 100644 --- a/interface/web/admin/lib/lang/fr_system_config.lng +++ b/interface/web/admin/lib/lang/fr_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/hr_system_config.lng b/interface/web/admin/lib/lang/hr_system_config.lng index 7a3426eff5..0f29ae0c0c 100644 --- a/interface/web/admin/lib/lang/hr_system_config.lng +++ b/interface/web/admin/lib/lang/hr_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/hu_system_config.lng b/interface/web/admin/lib/lang/hu_system_config.lng index 5fb8f7cd6e..1258e6acfe 100644 --- a/interface/web/admin/lib/lang/hu_system_config.lng +++ b/interface/web/admin/lib/lang/hu_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/id_system_config.lng b/interface/web/admin/lib/lang/id_system_config.lng index b1df781b76..60eff076d3 100644 --- a/interface/web/admin/lib/lang/id_system_config.lng +++ b/interface/web/admin/lib/lang/id_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index ddfc072ff2..f77dc68061 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/ja_system_config.lng b/interface/web/admin/lib/lang/ja_system_config.lng index 8ff20d13ca..b5601ea800 100644 --- a/interface/web/admin/lib/lang/ja_system_config.lng +++ b/interface/web/admin/lib/lang/ja_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/nl_system_config.lng b/interface/web/admin/lib/lang/nl_system_config.lng index 0caa9228e0..107c42395e 100644 --- a/interface/web/admin/lib/lang/nl_system_config.lng +++ b/interface/web/admin/lib/lang/nl_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/pl_system_config.lng b/interface/web/admin/lib/lang/pl_system_config.lng index 92b167c60d..1bb2098765 100644 --- a/interface/web/admin/lib/lang/pl_system_config.lng +++ b/interface/web/admin/lib/lang/pl_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/pt_system_config.lng b/interface/web/admin/lib/lang/pt_system_config.lng index 491aa6272c..41becdf5cb 100644 --- a/interface/web/admin/lib/lang/pt_system_config.lng +++ b/interface/web/admin/lib/lang/pt_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/ro_system_config.lng b/interface/web/admin/lib/lang/ro_system_config.lng index fc268d2241..2fc1a00b56 100644 --- a/interface/web/admin/lib/lang/ro_system_config.lng +++ b/interface/web/admin/lib/lang/ro_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/ru_system_config.lng b/interface/web/admin/lib/lang/ru_system_config.lng index ae12c4b4c1..d829d1ca97 100644 --- a/interface/web/admin/lib/lang/ru_system_config.lng +++ b/interface/web/admin/lib/lang/ru_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/se_system_config.lng b/interface/web/admin/lib/lang/se_system_config.lng index fa302c344a..fa67bc2bc9 100644 --- a/interface/web/admin/lib/lang/se_system_config.lng +++ b/interface/web/admin/lib/lang/se_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/sk_system_config.lng b/interface/web/admin/lib/lang/sk_system_config.lng index 6735e91c53..317b435eae 100644 --- a/interface/web/admin/lib/lang/sk_system_config.lng +++ b/interface/web/admin/lib/lang/sk_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/lib/lang/tr_system_config.lng b/interface/web/admin/lib/lang/tr_system_config.lng index b767101e22..a6e6299375 100644 --- a/interface/web/admin/lib/lang/tr_system_config.lng +++ b/interface/web/admin/lib/lang/tr_system_config.lng @@ -105,4 +105,5 @@ $wb['show_support_messages_txt'] = 'Show message function in help module'; $wb['show_aps_menu_txt'] = 'Show APS menu'; $wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; $wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/admin/templates/system_config_dns_edit.htm b/interface/web/admin/templates/system_config_dns_edit.htm index f3d0b20dda..9636b4a261 100644 --- a/interface/web/admin/templates/system_config_dns_edit.htm +++ b/interface/web/admin/templates/system_config_dns_edit.htm @@ -11,10 +11,18 @@ {tmpl_var name='default_dnsserver'} + +
    + +
    + {tmpl_var name='dns_show_zoneexport'} +
    +
    +
    -
    \ No newline at end of file + diff --git a/interface/web/dns/form/dns_soa.tform.php b/interface/web/dns/form/dns_soa.tform.php index 92f07d7883..6259cceddb 100644 --- a/interface/web/dns/form/dns_soa.tform.php +++ b/interface/web/dns/form/dns_soa.tform.php @@ -322,17 +322,21 @@ $form["tabs"]['dns_soa'] = array ( //################################# ) ); -$form["tabs"]['dns_rendered_zone'] = array ( - 'title' => "Zone rendering", - 'width' => 100, - 'template' => "templates/dns_soa_rendered.htm", - 'fields' => array ( - 'rendered_zone' => array ( - 'datatype' => 'TEXT', - 'formtype' => 'TEXTAREA', - ), - ) -); + +$sys_config = $app->getconf->get_global_config('dns'); +if($sys_config['dns_show_zoneexport'] == 'y') { + $form["tabs"]['dns_rendered_zone'] = array ( + 'title' => "Zone rendering", + 'width' => 100, + 'template' => "templates/dns_soa_rendered.htm", + 'fields' => array ( + 'rendered_zone' => array ( + 'datatype' => 'TEXT', + 'formtype' => 'TEXTAREA', + ), + ) + ); +} // show update acl to admins only. if(!$app->auth->is_admin()) unset($form["tabs"]['dns_soa']['fields']['update_acl']); -- GitLab From 7a037916df511962e7e03b47da3d88ebd90adf00 Mon Sep 17 00:00:00 2001 From: Judah - MW <6523-maximaweb@users.noreply.git.ispconfig.org> Date: Tue, 18 Jan 2022 09:45:21 +0000 Subject: [PATCH 1302/1368] Changed hardcoded quota warning levels to be adjustable in server config --- install/tpl/server.ini.master | 3 ++ .../web/admin/form/server_config.tform.php | 36 +++++++++++++++++++ .../web/admin/lib/lang/ar_server_config.lng | 3 ++ .../web/admin/lib/lang/bg_server_config.lng | 3 ++ .../web/admin/lib/lang/br_server_config.lng | 3 ++ .../web/admin/lib/lang/ca_server_config.lng | 3 ++ .../web/admin/lib/lang/cz_server_config.lng | 3 ++ .../web/admin/lib/lang/de_server_config.lng | 3 ++ .../web/admin/lib/lang/dk_server_config.lng | 3 ++ .../web/admin/lib/lang/el_server_config.lng | 3 ++ .../web/admin/lib/lang/en_server_config.lng | 3 ++ .../web/admin/lib/lang/es_server_config.lng | 3 ++ .../web/admin/lib/lang/fi_server_config.lng | 3 ++ .../web/admin/lib/lang/fr_server_config.lng | 3 ++ .../web/admin/lib/lang/hr_server_config.lng | 3 ++ .../web/admin/lib/lang/hu_server_config.lng | 3 ++ .../web/admin/lib/lang/id_server_config.lng | 3 ++ .../web/admin/lib/lang/it_server_config.lng | 3 ++ .../web/admin/lib/lang/ja_server_config.lng | 3 ++ .../web/admin/lib/lang/nl_server_config.lng | 3 ++ .../web/admin/lib/lang/pl_server_config.lng | 3 ++ .../web/admin/lib/lang/pt_server_config.lng | 3 ++ .../web/admin/lib/lang/ro_server_config.lng | 3 ++ .../web/admin/lib/lang/ru_server_config.lng | 3 ++ .../web/admin/lib/lang/se_server_config.lng | 3 ++ .../web/admin/lib/lang/sk_server_config.lng | 3 ++ .../web/admin/lib/lang/tr_server_config.lng | 3 ++ .../templates/server_config_mail_edit.htm | 5 +++ .../templates/server_config_web_edit.htm | 10 ++++++ .../classes/cron.d/300-quota_notify.inc.php | 12 +++---- 30 files changed, 135 insertions(+), 6 deletions(-) diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 36d48d913e..8799e1f34c 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -58,6 +58,7 @@ mailbox_size_limit=0 message_size_limit=0 mailbox_quota_stats=y realtime_blackhole_list=zen.spamhaus.org +overquota_notify_threshold=90 overquota_notify_admin=y overquota_notify_client=y overquota_notify_freq=7 @@ -118,9 +119,11 @@ connect_userid_to_webid_start=10000 web_folder_protection=y php_ini_check_minutes=1 overtraffic_disable_web=y +overquota_notify_threshold=90 overquota_notify_admin=y overquota_notify_client=y overquota_notify_freq=7 +overquota_db_notify_threshold=90 overquota_db_notify_admin=y overquota_db_notify_client=y overquota_notify_onok=n diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 47a48a3c27..a7947ba147 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -740,6 +740,18 @@ $form["tabs"]['mail'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_notify_threshold' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '90', + 'validators' => array( + 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'overquota_notify_threshold_error'), + 1 => array('type' => 'RANGE', 'range' => '0:100', 'errmsg' => 'overquota_notify_threshold_error'), + ), + 'value' => '', + 'width' => '20', + 'maxlength' => '3' + ), 'overquota_notify_admin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1082,6 +1094,18 @@ $form["tabs"]['web'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_notify_threshold' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '90', + 'validators' => array( + 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'overquota_notify_threshold_error'), + 1 => array('type' => 'RANGE', 'range' => '0:100', 'errmsg' => 'overquota_notify_threshold_error'), + ), + 'value' => '', + 'width' => '20', + 'maxlength' => '3' + ), 'overquota_notify_admin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', @@ -1094,6 +1118,18 @@ $form["tabs"]['web'] = array( 'default' => 'y', 'value' => array(0 => 'n', 1 => 'y') ), + 'overquota_db_notify_threshold' => array( + 'datatype' => 'INTEGER', + 'formtype' => 'TEXT', + 'default' => '90', + 'validators' => array( + 0 => array('type' => 'NOTEMPTY', 'errmsg' => 'overquota_notify_threshold_error'), + 1 => array('type' => 'RANGE', 'range' => '0:100', 'errmsg' => 'overquota_notify_threshold_error'), + ), + 'value' => '', + 'width' => '20', + 'maxlength' => '3' + ), 'overquota_db_notify_admin' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/lib/lang/ar_server_config.lng b/interface/web/admin/lib/lang/ar_server_config.lng index ac03605279..fe494f4bd7 100644 --- a/interface/web/admin/lib/lang/ar_server_config.lng +++ b/interface/web/admin/lib/lang/ar_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/bg_server_config.lng b/interface/web/admin/lib/lang/bg_server_config.lng index b9d6e648ce..837d254dac 100644 --- a/interface/web/admin/lib/lang/bg_server_config.lng +++ b/interface/web/admin/lib/lang/bg_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/br_server_config.lng b/interface/web/admin/lib/lang/br_server_config.lng index ac551c588c..7c08431fdb 100644 --- a/interface/web/admin/lib/lang/br_server_config.lng +++ b/interface/web/admin/lib/lang/br_server_config.lng @@ -200,6 +200,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Enviar notificação de tráfego excedido $wb['overtraffic_notify_client_txt'] = 'Enviar notificação de tráfego excedido para o cliente'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Por favor, insira nomes de host válidos para RBLs.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Enviar alerta da cota para o administrador'; $wb['overquota_notify_client_txt'] = 'Enviar alerta da cota para o cliente'; $wb['overquota_notify_onok_txt'] = 'Enviar mensagem da cota para o cliente'; @@ -223,6 +225,7 @@ $wb['v6_prefix_length'] = 'O prefixo é muito longo de acordo com as definiçõe $wb['backup_dir_is_mount_txt'] = 'O diretório de backup está montando?'; $wb['backup_dir_mount_cmd_txt'] = 'Comando mount, se o diretório não está montado'; $wb['backup_delete_txt'] = 'Remover backups de domínios/site'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Enviar alerta da cota do Banco de Dados para o administrador'; $wb['overquota_db_notify_client_txt'] = 'Enviar alerta da cota do Banco de Dados para o cliente'; $wb['monitor_system_updates_txt'] = 'Verificar por atualizações do sistema'; diff --git a/interface/web/admin/lib/lang/ca_server_config.lng b/interface/web/admin/lib/lang/ca_server_config.lng index 25ed761836..2ced57478a 100644 --- a/interface/web/admin/lib/lang/ca_server_config.lng +++ b/interface/web/admin/lib/lang/ca_server_config.lng @@ -196,6 +196,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -219,6 +221,7 @@ $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_is_mount_txt'] = 'Backup directory is a mount?'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['monitor_system_updates_txt'] = 'Check for Linux updates'; diff --git a/interface/web/admin/lib/lang/cz_server_config.lng b/interface/web/admin/lib/lang/cz_server_config.lng index 6da8dfc0bb..590a8d9796 100644 --- a/interface/web/admin/lib/lang/cz_server_config.lng +++ b/interface/web/admin/lib/lang/cz_server_config.lng @@ -179,6 +179,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Při překročení limitu přenesených d $wb['overtraffic_notify_client_txt'] = 'Při překročení limitu přenesených dat, poslat oznámení klientovi'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Poslat varování o překročení nebo vyčerpání kvót adminovi'; $wb['overquota_notify_client_txt'] = 'Poslat varování o překročení nebo vyčerpání kvót klientovi'; $wb['overquota_notify_onok_txt'] = 'Poslat zprávu klientovi, že kvóta je již v pořádku'; @@ -269,6 +271,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Odstranit zálohy pokud byla smazána doména/webové stránky'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Poslat varování o překročení nebo vyčerpání DB kvót adminovi'; $wb['overquota_db_notify_client_txt'] = 'Poslat varování o překročení nebo vyčerpání DB kvót klientovi'; $wb['php_handler_txt'] = 'Výchozí PHP obslužná rutina'; diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index d0b43059c4..557d313704 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -199,6 +199,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Überschreiten des Datentransfer Limits a $wb['overtraffic_notify_client_txt'] = 'Überschreiten des Datentransfer Limits an den Kunden senden'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Bitte geben Sie gültige RBL-Hostnamen an.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Quota-Warnungen an den Administrator senden'; $wb['overquota_notify_client_txt'] = 'Quota-Warnungen an den Kunden senden'; $wb['overquota_notify_onok_txt'] = 'Meldung an den Kunden senden, wenn Belegung wieder ok'; @@ -276,6 +278,7 @@ $wb['cron_init_script_error_regex'] = 'Invalid cron init script.'; $wb['crontab_dir_error_regex'] = 'Invalid crontab directory.'; $wb['cron_wget_error_regex'] = 'Invalid cron wget path.'; $wb['network_filesystem_txt'] = 'Netzwerk-Dateisystem'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Datenbank-Quota-Warnungen an den Administrator senden'; $wb['overquota_db_notify_client_txt'] = 'Datenbank-Quota-Warnungen an den Kunden senden'; $wb['php_ini_check_minutes_txt'] = 'Prüfe php.ini alle X Minuten auf Änderungen'; diff --git a/interface/web/admin/lib/lang/dk_server_config.lng b/interface/web/admin/lib/lang/dk_server_config.lng index b1ebcec391..ccf12bc3e2 100644 --- a/interface/web/admin/lib/lang/dk_server_config.lng +++ b/interface/web/admin/lib/lang/dk_server_config.lng @@ -182,6 +182,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send over-trafik meddelelse til admin'; $wb['overtraffic_notify_client_txt'] = 'Send over-trafik meddelelse til kunde'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Angiv gyldige RBL værtsnavne.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send kvote advarsler til admin'; $wb['overquota_notify_client_txt'] = 'Send kvote advarsler til kunde'; $wb['overquota_notify_onok_txt'] = 'Send kvote ok meddelelse til kunde'; @@ -272,6 +274,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/el_server_config.lng b/interface/web/admin/lib/lang/el_server_config.lng index b147f15e5c..468560c751 100644 --- a/interface/web/admin/lib/lang/el_server_config.lng +++ b/interface/web/admin/lib/lang/el_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 4125b2648e..0d09d4222a 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -206,6 +206,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -229,6 +231,7 @@ $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_is_mount_txt'] = 'Backup directory is a mount?'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['monitor_system_updates_txt'] = 'Check for Linux updates'; diff --git a/interface/web/admin/lib/lang/es_server_config.lng b/interface/web/admin/lib/lang/es_server_config.lng index 67e77efac8..7b1364b2ac 100644 --- a/interface/web/admin/lib/lang/es_server_config.lng +++ b/interface/web/admin/lib/lang/es_server_config.lng @@ -187,8 +187,11 @@ $wb['nginx_vhost_conf_enabled_dir_error_empty'] = 'El directorio de configuraci $wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'El directorio de configuración para Vhost habilitados de Nginx es inválido.'; $wb['nginx_vhost_conf_enabled_dir_txt'] = 'Directorio de configuración de host virtual de Nginx habilitado'; $wb['no_notifications_txt'] = 'Sin notificaciones'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Enviar advertencias de cuota de base de datos al administrador'; $wb['overquota_db_notify_client_txt'] = 'Enviar advertencias de cuota de base de datos a los clientes'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Enviar advertencias de cuota excedida al administrador'; $wb['overquota_notify_client_txt'] = 'Enviar advertencias de cuota excedida al cliente'; $wb['overquota_notify_freq_note_txt'] = '0 = enviar mensaje solo una vez, sin volver a notificar'; diff --git a/interface/web/admin/lib/lang/fi_server_config.lng b/interface/web/admin/lib/lang/fi_server_config.lng index dac02a14b7..8dc41ff17d 100644 --- a/interface/web/admin/lib/lang/fi_server_config.lng +++ b/interface/web/admin/lib/lang/fi_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/fr_server_config.lng b/interface/web/admin/lib/lang/fr_server_config.lng index 0599b8bbed..9aecf3ba21 100644 --- a/interface/web/admin/lib/lang/fr_server_config.lng +++ b/interface/web/admin/lib/lang/fr_server_config.lng @@ -181,6 +181,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -271,6 +273,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/hr_server_config.lng b/interface/web/admin/lib/lang/hr_server_config.lng index e0894ceb82..5d81f21d24 100644 --- a/interface/web/admin/lib/lang/hr_server_config.lng +++ b/interface/web/admin/lib/lang/hr_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['network_filesystem_txt'] = 'Network Filesystem'; $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/hu_server_config.lng b/interface/web/admin/lib/lang/hu_server_config.lng index 97774f9ecd..e1c69b610c 100644 --- a/interface/web/admin/lib/lang/hu_server_config.lng +++ b/interface/web/admin/lib/lang/hu_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/id_server_config.lng b/interface/web/admin/lib/lang/id_server_config.lng index 814e963f64..e871616ffe 100644 --- a/interface/web/admin/lib/lang/id_server_config.lng +++ b/interface/web/admin/lib/lang/id_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index f9e30f3937..c485bd00a1 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -181,6 +181,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Trasmetti notifiche superamento traffico $wb['overtraffic_notify_client_txt'] = 'Trasmetti notifiche superamento traffico al cliente'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Per cortesia specificare nomi host RBL validi.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Trasmetti allarmi quota ad admin'; $wb['overquota_notify_client_txt'] = 'Trasmetti allarmi quota al cliente'; $wb['overquota_notify_onok_txt'] = 'Trasmetti messaggio quota ok al cliente'; @@ -271,6 +273,7 @@ $wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; $wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; $wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/ja_server_config.lng b/interface/web/admin/lib/lang/ja_server_config.lng index 52ac44a351..2547989627 100644 --- a/interface/web/admin/lib/lang/ja_server_config.lng +++ b/interface/web/admin/lib/lang/ja_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/nl_server_config.lng b/interface/web/admin/lib/lang/nl_server_config.lng index e9e412b609..ac24a8b5f9 100644 --- a/interface/web/admin/lib/lang/nl_server_config.lng +++ b/interface/web/admin/lib/lang/nl_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/pl_server_config.lng b/interface/web/admin/lib/lang/pl_server_config.lng index f9d43d3bfd..d5e0dbe0f6 100644 --- a/interface/web/admin/lib/lang/pl_server_config.lng +++ b/interface/web/admin/lib/lang/pl_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Prześlij informacje o przekroczeniu tran $wb['overtraffic_notify_client_txt'] = 'Prześlij informacje o przekroczeniu transferu do klienta'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/pt_server_config.lng b/interface/web/admin/lib/lang/pt_server_config.lng index 468413a1de..85011d112f 100644 --- a/interface/web/admin/lib/lang/pt_server_config.lng +++ b/interface/web/admin/lib/lang/pt_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/ro_server_config.lng b/interface/web/admin/lib/lang/ro_server_config.lng index e20fb9ee9f..95bf27a4f1 100644 --- a/interface/web/admin/lib/lang/ro_server_config.lng +++ b/interface/web/admin/lib/lang/ro_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/ru_server_config.lng b/interface/web/admin/lib/lang/ru_server_config.lng index 1799b075f4..6ebd4ebe0e 100644 --- a/interface/web/admin/lib/lang/ru_server_config.lng +++ b/interface/web/admin/lib/lang/ru_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Присылать уведомление $wb['overtraffic_notify_client_txt'] = 'Присылать уведомление трафика клиенту'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Пожалуйста, укажите действительные имена хостов RBL.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Присылать предупреждения квоты администратору'; $wb['overquota_notify_client_txt'] = 'Присылать предупреждения квоты клиенту'; $wb['overquota_notify_onok_txt'] = 'Присылать сообщение квоты ОК клиенту'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Отключить сообщения bind9 дл $wb['apps_vhost_enabled_txt'] = 'Apps-vhost включен'; $wb['do_not_try_rescue_mongodb_txt'] = 'Отключить мониторинг MongoDB'; $wb['backup_dir_mount_cmd_txt'] = 'Выполните команду монтирования, если каталог резервного копирования не установлен'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Присылать предупреждения квоты DB администратору'; $wb['overquota_db_notify_client_txt'] = 'Присылать предупреждения квоты DB клиенту'; $wb['php_handler_txt'] = 'Обработчик PHP по умолчанию'; diff --git a/interface/web/admin/lib/lang/se_server_config.lng b/interface/web/admin/lib/lang/se_server_config.lng index fe3c2e9234..99b1f714fa 100644 --- a/interface/web/admin/lib/lang/se_server_config.lng +++ b/interface/web/admin/lib/lang/se_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/sk_server_config.lng b/interface/web/admin/lib/lang/sk_server_config.lng index bc7f9f514b..7fa947a4b0 100644 --- a/interface/web/admin/lib/lang/sk_server_config.lng +++ b/interface/web/admin/lib/lang/sk_server_config.lng @@ -193,6 +193,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Send overtraffic notification to admin'; $wb['overtraffic_notify_client_txt'] = 'Send overtraffic notification to client'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Please specify valid RBL hostnames.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Send quota warnings to admin'; $wb['overquota_notify_client_txt'] = 'Send quota warnings to client'; $wb['overquota_notify_onok_txt'] = 'Send quota ok message to client'; @@ -273,6 +275,7 @@ $wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; $wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; $wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; $wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; $wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; $wb['php_handler_txt'] = 'Default PHP Handler'; diff --git a/interface/web/admin/lib/lang/tr_server_config.lng b/interface/web/admin/lib/lang/tr_server_config.lng index 0d0c84f2c7..565b7b1f48 100644 --- a/interface/web/admin/lib/lang/tr_server_config.lng +++ b/interface/web/admin/lib/lang/tr_server_config.lng @@ -200,6 +200,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Trafik Aşımı Bildirimi Yöneticiye Gö $wb['overtraffic_notify_client_txt'] = 'Trafik Aşımı Bildirimi Müşteriye Gönderilsin'; $wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; $wb['rbl_error_regex'] = 'Lütfen geçerli RBL sunucu adları yazın.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Kota Uyarıları Yöneticiye Gönderilsin'; $wb['overquota_notify_client_txt'] = 'Kota Uyarıları Müşteriye Gönderilsin'; $wb['overquota_notify_onok_txt'] = 'Kota Tamam İletisi Müşteriye Gönderilsin'; @@ -223,6 +225,7 @@ $wb['v6_prefix_length'] = 'Ön ek tanımlanmış IPv6 adresine göre çok uzun ' $wb['backup_dir_is_mount_txt'] = 'Yedek Klasörü Takılı mı?'; $wb['backup_dir_mount_cmd_txt'] = 'Mount komutu, yedek klasörü takılı değil ise'; $wb['backup_delete_txt'] = 'Etki alanı ya da web sitesi silindiğinde yedekler de silinsin'; +$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; $wb['overquota_db_notify_admin_txt'] = 'Veritabanı Kotası Bildirimleri Yöneticiye Gönderilsin'; $wb['overquota_db_notify_client_txt'] = 'Veritabanı Kotası Bildirimleri Müşteriye Gönderilsin'; $wb['monitor_system_updates_txt'] = 'Linux Güncellemeleri Denetlensin'; diff --git a/interface/web/admin/templates/server_config_mail_edit.htm b/interface/web/admin/templates/server_config_mail_edit.htm index 0eac988961..d23a23a59c 100644 --- a/interface/web/admin/templates/server_config_mail_edit.htm +++ b/interface/web/admin/templates/server_config_mail_edit.htm @@ -146,6 +146,11 @@ {tmpl_var name='mailbox_quota_stats'} +
    + +
    +
    %
    +
    diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index ca1d54344c..5cf5c43a75 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -144,6 +144,11 @@
    {tmpl_var name='overtraffic_disable_web'}
    +
    +
    + +
    +
    %
    @@ -156,6 +161,11 @@
    {tmpl_var name='overquota_notify_client'}
    +
    +
    + +
    +
    %
    diff --git a/server/lib/classes/cron.d/300-quota_notify.inc.php b/server/lib/classes/cron.d/300-quota_notify.inc.php index 5e1bb92276..ac7ae0aa5c 100644 --- a/server/lib/classes/cron.d/300-quota_notify.inc.php +++ b/server/lib/classes/cron.d/300-quota_notify.inc.php @@ -210,8 +210,8 @@ class cronjob_quota_notify extends cronjob { $rec['hard'] .= ' KB'; } - // send notifications only if 90% or more of the quota are used - if($used_ratio < 0.9) { + // send notifications only if the website is over the quota threshold + if($used_ratio <= $web_config['overquota_notify_threshold'] / 100) { // reset notification date if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => null), 'domain_id', $rec['domain_id']); @@ -339,8 +339,8 @@ class cronjob_quota_notify extends cronjob { $rec['used'] = round($rec['used'] / 1048576, 4).' MB'; } - // send notifications only if 90% or more of the quota are used - if($used_ratio < 0.9) { + // send notifications only if the mail account is over the quota threshold + if($used_ratio <= $mail_config['overquota_notify_threshold'] / 100) { // reset notification date if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => null), 'mailuser_id', $rec['mailuser_id']); @@ -455,8 +455,8 @@ class cronjob_quota_notify extends cronjob { if ($quota > 0) $used_ratio = $monitor['size'] / $quota; else $used_ratio = 0; - //* send notifications only if 90% or more of the quota are used - if($used_ratio > 0.9 && $used_ratio != 0) { + //* send notifications only if the database is over the quota threshold + if($used_ratio >= $web_config['overquota_db_notify_threshold'] / 100 && $used_ratio != 0) { //* could a notification be sent? $send_notification = false; -- GitLab From 97b9db57b7b42b6fa60a9df6a3e61f739791e6ee Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Tue, 18 Jan 2022 10:53:39 +0100 Subject: [PATCH 1303/1368] clean up --- install/lib/install.lib.php | 12 ++++++------ server/lib/classes/monitor_tools.inc.php | 23 +++++++++++------------ 2 files changed, 17 insertions(+), 18 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index be22aead13..11c6707cbe 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -296,10 +296,10 @@ function get_distname() { $content = file_get_contents('/etc/os-release'); - preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); + preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); - preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); - preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); + preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); + preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) { $distname = 'Fedora'; @@ -343,8 +343,8 @@ function get_distname() { if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version); $distname = 'CentOS Linux'; - $distver = is_array($centos6_version)? implode('.', array_filter(array($centos6_version[0][0]),'strlen')) : '6'; - $distid = 'centos53'; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; + $distid = 'centos53'; $distbaseid = 'fedora'; swriteln("Operating System: " . $distname . " " . $distver . "\n"); @@ -362,7 +362,7 @@ function get_distname() { if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version); $distname = 'CentOS Linux'; - $distver = $centos6_version[0][0]; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; $distid = 'centos53'; $distbaseid = 'fedora'; swriteln("Operating System: " . $distname . " " . $distver . "\n"); diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 33eceeb5f4..5d91bf5ace 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -278,11 +278,12 @@ class monitor_tools { //** RHEL (including compatible clones) & Fedora elseif(file_exists('/etc/redhat-release') && file_exists('/etc/os-release')) { + $content = file_get_contents('/etc/os-release'); preg_match('/(?<=PRETTY_NAME=\").+?(?=\")/', $content, $prettyname); preg_match('/(?<=NAME=\").+?(?=\")/', $content, $name); - preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); + preg_match('/(?<=VERSION=\").+?(?=\")/', $content, $version); preg_match('/(?<=VERSION_ID=\").+?(?=\")/', $content, $versionid); if(stristr($prettyname[0], 'Fedora 32 (Thirty Two)')) { @@ -298,15 +299,15 @@ class monitor_tools { //** RHEL 7 and compatible clones } elseif(preg_match('/^(?:7|7\.[0-9]{1,2})$/', $versionid[0])) { preg_match_all('/([0-9]{1,2})\.?([0-9]{0,2})\.?([0-9]*)/', file_get_contents('/etc/redhat-release'), $centos7_version); - $distname = $name[0]; - $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0]; - $distid = 'centos72'; - $distbaseid = 'fedora'; + $distname = $name[0]; + $distver = is_array($centos7_version)? implode('.', array_filter(array($centos7_version[1][0],$centos7_version[2][0],$centos7_version[3][0]),'strlen')) : $version[0]; + $distid = 'centos72'; + $distbaseid = 'fedora'; //** RHEL 8 and compatible clones } elseif(preg_match('/^(?:8|8\.[0-9]{1,2})$/', $versionid[0])) { - $distname = $name[0]; - $distver = $version[0]; - $distid = 'centos80'; + $distname = $name[0]; + $distver = $version[0]; + $distid = 'centos80'; $distbaseid = 'fedora'; } else { $distname = 'Redhat'; @@ -322,7 +323,7 @@ class monitor_tools { if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { preg_match_all('/(6\.?([0-9]{0,2})\.?(\s)?([a-zA-Z()]+))$/', $content, $centos6_version); $distname = 'CentOS Linux'; - $distver = is_array($centos6_version)? implode('.', array_filter(array($centos6_version[0][0]),'strlen')) : '6'; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; $distid = 'centos53'; $distbaseid = 'fedora'; } else { @@ -339,7 +340,7 @@ class monitor_tools { if(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) { preg_match_all('/(6)\.?([0-9]{0,2})?\.?\s([a-zA-Z(), ]+)?$/', $content, $centos6_version); $distname = 'CentOS Linux'; - $distver = $centos6_version[0][0]; + $distver = $centos6_version[0][0] ? $centos6_version[0][0] : '6'; $distid = 'centos53'; $distbaseid = 'fedora'; } else { @@ -351,8 +352,6 @@ class monitor_tools { } - - //** Gentoo elseif(file_exists('/etc/gentoo-release')) { -- GitLab From b8e14cb39939990e342d9ca1361a3b51d53af90b Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 18 Jan 2022 11:45:12 +0000 Subject: [PATCH 1304/1368] Apply 2 suggestion(s) to 1 file(s) --- interface/lib/classes/plugin_backuplist.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/lib/classes/plugin_backuplist.inc.php b/interface/lib/classes/plugin_backuplist.inc.php index 6fff24f611..0bb02a0720 100644 --- a/interface/lib/classes/plugin_backuplist.inc.php +++ b/interface/lib/classes/plugin_backuplist.inc.php @@ -184,7 +184,7 @@ class plugin_backuplist extends plugin_base { $backup_format = $rec['backup_format']; $backup_mode = $rec['backup_mode']; - if ($backup_mode == 'borg') { + if ($backup_mode === 'borg') { // Get backup format from domain config switch ($rec['backup_type']) { case 'mysql': @@ -236,7 +236,7 @@ class plugin_backuplist extends plugin_base { if($rec['filesize'] > 0){ $rec['filesize'] = $app->functions->currency_format($rec['filesize']/(1024*1024), 'client').' MB'; - if($backup_mode == "borg") { + if($backup_mode === "borg") { $rec['filesize'] = '*' -- GitLab From b43ddc8ae081b441376d65f3fe499a5e8a6ecb76 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 18 Jan 2022 11:45:46 +0000 Subject: [PATCH 1305/1368] Apply 1 suggestion(s) to 1 file(s) --- interface/lib/classes/plugin_backuplist.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/interface/lib/classes/plugin_backuplist.inc.php b/interface/lib/classes/plugin_backuplist.inc.php index 0bb02a0720..b2fdd006d2 100644 --- a/interface/lib/classes/plugin_backuplist.inc.php +++ b/interface/lib/classes/plugin_backuplist.inc.php @@ -320,6 +320,7 @@ class plugin_backuplist extends plugin_base { } return null; } + protected static function getDefaultBackupFormat($backup_mode, $backup_type) { //We have a backup from old version of ISPConfig -- GitLab From 600d2c320eefc2ad6f651b980f2c981b185bcc25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jorge=20Mu=C3=B1oz?= Date: Tue, 18 Jan 2022 18:51:23 +0000 Subject: [PATCH 1306/1368] Fix check of borg utility not performed on slave server --- interface/web/admin/server_config_edit.php | 15 ++++++++++++++- .../lib/classes/cron.d/100-monitor_backup.inc.php | 9 +++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/interface/web/admin/server_config_edit.php b/interface/web/admin/server_config_edit.php index 29384ea941..32aa270893 100644 --- a/interface/web/admin/server_config_edit.php +++ b/interface/web/admin/server_config_edit.php @@ -64,7 +64,20 @@ class page_action extends tform_actions { unset($app->tform->formDef["tabs"]["vlogger"]); } //Check if borg is installed - if (!$app->system->is_installed('borg')) { + $is_borg_installed = false; + if($this->id != $conf['server_id']) { + $mon = $app->db->queryOneRecord('SELECT `data` FROM `monitor_data` WHERE `server_id` = ? AND `type` = ? ORDER BY `created` DESC', $this->id, 'backup_utils'); + if($mon) { + $missing_utils = unserialize($mon['data']); + if($missing_utils) { + $missing_utils = $missing_utils['missing_utils']; + $is_borg_installed = ! in_array('borg', $missing_utils); + } + } + } else { + $is_borg_installed = $app->system->is_installed('borg'); + } + if ( ! $is_borg_installed) { $app->tpl->setVar('missing_utils', 'BorgBackup'); } parent::onShow(); diff --git a/server/lib/classes/cron.d/100-monitor_backup.inc.php b/server/lib/classes/cron.d/100-monitor_backup.inc.php index 40f5362082..b90290d7c3 100644 --- a/server/lib/classes/cron.d/100-monitor_backup.inc.php +++ b/server/lib/classes/cron.d/100-monitor_backup.inc.php @@ -63,7 +63,8 @@ class cronjob_monitor_backup extends cronjob { $type = 'backup_utils'; $missing_utils = array(); - $compressors_list = array( + $util_list = array( + 'borg', 'gzip', 'gunzip', 'zip', @@ -77,9 +78,9 @@ class cronjob_monitor_backup extends cronjob { '7z', 'rar', ); - foreach ($compressors_list as $compressor) { - if (!$app->system->is_installed($compressor)) { - $missing_utils[] = $compressor; + foreach ($util_list as $util) { + if (!$app->system->is_installed($util)) { + $missing_utils[] = $util; } } -- GitLab From 8414f388f50e0b70b2a3a1b2e4a758831a21d878 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Thu, 20 Jan 2022 08:36:16 +0100 Subject: [PATCH 1307/1368] Moved all the functions on top of the file. --- interface/web/login/index.php | 56 +++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 84fd49bc1e..a888aab6e7 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -28,34 +28,6 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -require_once '../../lib/config.inc.php'; -require_once '../../lib/app.inc.php'; - -include_once '../common.php'; - -// Check if we have an active users session and no login_as. -if ($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { - header('Location: /index.php'); - die(); -} - -$app->uses('tpl'); -$app->tpl->newTemplate('main_login.tpl.htm'); -$app->tpl->setInclude('content_tpl', 'templates/index.htm'); - -$error = ''; - -$app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); - -// Maintenance mode -$maintenance_mode = false; -$maintenance_mode_error = ''; -$server_config_array = $app->getconf->get_global_config('misc'); -if ($app->is_under_maintenance()) { - $maintenance_mode = true; - $maintenance_mode_error = $app->lng('error_maintenance_mode'); -} - /** * @param app $app * @param $error @@ -408,6 +380,34 @@ function is_login_as(app $app, $username, $password) return $loginAs; } +require_once '../../lib/config.inc.php'; +require_once '../../lib/app.inc.php'; + +include_once '../common.php'; + +// Check if we have an active users session and no login_as. +if ($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) { + header('Location: /index.php'); + die(); +} + +$app->uses('tpl'); +$app->tpl->newTemplate('main_login.tpl.htm'); +$app->tpl->setInclude('content_tpl', 'templates/index.htm'); + +$error = ''; + +$app->load_language_file('web/login/lib/lang/'.$conf["language"].'.lng'); + +// Maintenance mode +$maintenance_mode = false; +$maintenance_mode_error = ''; +$server_config_array = $app->getconf->get_global_config('misc'); +if ($app->is_under_maintenance()) { + $maintenance_mode = true; + $maintenance_mode_error = $app->lng('error_maintenance_mode'); +} + //* Login Form was sent if (count($_POST) > 0) { process_login_request($app, $error, $conf, $module); -- GitLab From 20a609227c8522e7d68372a2708a71a242830e14 Mon Sep 17 00:00:00 2001 From: Mladen B Date: Thu, 20 Jan 2022 08:38:55 +0100 Subject: [PATCH 1308/1368] Used file() instead of file_get_contents() and explode(). --- interface/web/login/index.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index a888aab6e7..2bcb380d95 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -182,8 +182,7 @@ function is_admin_ip_whitelisted($ip, $conf) // if the file doesn't exist, we assume that webmaster doesn't use this feature if (!file_exists($conf['admin_ip_whitelist_file'])) return true; - $file_content = file_get_contents($conf['admin_ip_whitelist_file']); - $file_lines = explode("\n", $file_content); + $file_lines = file($conf['admin_ip_whitelist_file']); $matches = array_filter($file_lines, function($v) use ($ip) { $line = trim($v); -- GitLab From 1582f928887f30f11bc8be9285b2a167f598002e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 2 Feb 2022 20:52:37 +0000 Subject: [PATCH 1309/1368] Update node paths in jk_init.ini.master --- install/tpl/jk_init.ini.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 0dfcdccb68..0a1f609049 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -175,7 +175,7 @@ includesections = php, uidbasics, netbasics [node] comment = NodeJS -paths = npm, node, nodejs, /usr/lib/nodejs, /usr/share/npm, /usr/share/node-mime, /usr/lib/node_modules, /usr/local/lib/nodejs, /usr/local/lib/node_modules, elmi-to-json, /usr/local/bin/elmi-to-json +paths = npm, npx, node, nodejs, semver, /usr/lib/nodejs, /usr/share/nodejs, /usr/share/npm, /usr/share/node-mime, /usr/lib/node_modules, /usr/local/lib/nodejs, /usr/local/lib/node_modules, /etc/npmrc, /etc/npmignore, elmi-to-json, /usr/local/bin/elmi-to-json [env] comment = /usr/bin/env for environment variables -- GitLab From 858d3386b75d430d8cad839f59bacc46ebca420a Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Tue, 1 Feb 2022 16:58:39 -0700 Subject: [PATCH 1310/1368] more secure unique strings --- .../autoinstall.conf_sample.php | 4 +- install/dist/conf/centos80.conf.php | 4 +- install/dist/conf/debian100.conf.php | 4 +- install/dist/conf/debian110.conf.php | 4 +- install/dist/conf/debian90.conf.php | 4 +- install/dist/conf/debiantesting.conf.php | 4 +- install/dist/conf/gentoo.conf.php | 4 +- install/dist/conf/ubuntu1604.conf.php | 4 +- install/dist/conf/ubuntu1710.conf.php | 4 +- install/dist/conf/ubuntu1804.conf.php | 4 +- install/dist/conf/ubuntu2004.conf.php | 4 +- install/lib/installer_base.lib.php | 1 + interface/lib/app.inc.php | 2 + interface/lib/classes/auth.inc.php | 18 ++--- interface/lib/classes/functions.inc.php | 18 ++--- interface/lib/classes/remoting.inc.php | 4 +- interface/lib/compatibility.inc.php | 80 +++++++++++++++++++ interface/web/login/password_reset.php | 2 +- server/lib/classes/functions.inc.php | 6 +- server/lib/classes/letsencrypt.inc.php | 2 +- .../plugins-available/apache2_plugin.inc.php | 11 +-- server/plugins-available/nginx_plugin.inc.php | 12 +-- 22 files changed, 136 insertions(+), 64 deletions(-) create mode 100644 interface/lib/compatibility.inc.php diff --git a/docs/autoinstall_samples/autoinstall.conf_sample.php b/docs/autoinstall_samples/autoinstall.conf_sample.php index 904d65403c..c8bf209f9f 100644 --- a/docs/autoinstall_samples/autoinstall.conf_sample.php +++ b/docs/autoinstall_samples/autoinstall.conf_sample.php @@ -29,7 +29,7 @@ $autoinstall['ssl_cert_email'] = 'hostmaster@'.$autoinstall['hostname']; /* optional expert mode settings, needed only for expert mode */ $autoinstall['mysql_ispconfig_user'] = 'ispconfig'; // default: ispconfig -$autoinstall['mysql_ispconfig_password'] = md5(uniqid(rand())); +$autoinstall['mysql_ispconfig_password'] = bin2hex(random_bytes(20)); $autoinstall['join_multiserver_setup'] = 'n'; // y, n (default) $autoinstall['mysql_master_hostname'] = 'master.example.com'; $autoinstall['mysql_master_root_user'] = 'root'; @@ -70,4 +70,4 @@ $autoupdate['svc_detect_change_firewall_server'] = 'yes'; // yes (default), no $autoupdate['svc_detect_change_vserver_server'] = 'yes'; // yes (default), no $autoupdate['svc_detect_change_db_server'] = 'yes'; // yes (default), no -?> \ No newline at end of file +?> diff --git a/install/dist/conf/centos80.conf.php b/install/dist/conf/centos80.conf.php index 0411fb9ce5..36e85e02d2 100644 --- a/install/dist/conf/centos80.conf.php +++ b/install/dist/conf/centos80.conf.php @@ -63,14 +63,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/debian100.conf.php b/install/dist/conf/debian100.conf.php index 0861af83de..b6b0dc4135 100644 --- a/install/dist/conf/debian100.conf.php +++ b/install/dist/conf/debian100.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/debian110.conf.php b/install/dist/conf/debian110.conf.php index c60152df5c..10f57d88a1 100644 --- a/install/dist/conf/debian110.conf.php +++ b/install/dist/conf/debian110.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/debian90.conf.php b/install/dist/conf/debian90.conf.php index e5d1d8a9b4..b253a31f22 100644 --- a/install/dist/conf/debian90.conf.php +++ b/install/dist/conf/debian90.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/debiantesting.conf.php b/install/dist/conf/debiantesting.conf.php index cbc380fffb..3a06dfb86b 100644 --- a/install/dist/conf/debiantesting.conf.php +++ b/install/dist/conf/debiantesting.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/gentoo.conf.php b/install/dist/conf/gentoo.conf.php index 24c7d0633e..23558a164d 100644 --- a/install/dist/conf/gentoo.conf.php +++ b/install/dist/conf/gentoo.conf.php @@ -63,14 +63,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* SuPHP $conf['suphp']['config_file'] = '/etc/suphp.conf'; diff --git a/install/dist/conf/ubuntu1604.conf.php b/install/dist/conf/ubuntu1604.conf.php index 0d3fe23bad..bd8d0bcd1c 100644 --- a/install/dist/conf/ubuntu1604.conf.php +++ b/install/dist/conf/ubuntu1604.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/ubuntu1710.conf.php b/install/dist/conf/ubuntu1710.conf.php index 0730f8f2d5..d365388549 100644 --- a/install/dist/conf/ubuntu1710.conf.php +++ b/install/dist/conf/ubuntu1710.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/ubuntu1804.conf.php b/install/dist/conf/ubuntu1804.conf.php index 2a09f787db..fa96f7a5ca 100644 --- a/install/dist/conf/ubuntu1804.conf.php +++ b/install/dist/conf/ubuntu1804.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/dist/conf/ubuntu2004.conf.php b/install/dist/conf/ubuntu2004.conf.php index fe5a9b083b..28d4bf3c14 100644 --- a/install/dist/conf/ubuntu2004.conf.php +++ b/install/dist/conf/ubuntu2004.conf.php @@ -65,14 +65,14 @@ $conf['mysql']['admin_user'] = 'root'; $conf['mysql']['admin_password'] = ''; $conf['mysql']['charset'] = 'utf8'; $conf['mysql']['ispconfig_user'] = 'ispconfig'; -$conf['mysql']['ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['ispconfig_password'] = md5(random_bytes(20)); $conf['mysql']['master_slave_setup'] = 'n'; $conf['mysql']['master_host'] = ''; $conf['mysql']['master_database'] = 'dbispconfig'; $conf['mysql']['master_admin_user'] = 'root'; $conf['mysql']['master_admin_password'] = ''; $conf['mysql']['master_ispconfig_user'] = ''; -$conf['mysql']['master_ispconfig_password'] = md5(uniqid(rand())); +$conf['mysql']['master_ispconfig_password'] = md5(random_bytes(20)); //* Apache $conf['apache']['installed'] = false; // will be detected automatically during installation diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 103abaef19..3a3d415bb5 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -190,6 +190,7 @@ class installer_base { $salt_length = 12; } + // todo: replace the below with password_hash() when we drop php5.4 support if(function_exists('openssl_random_pseudo_bytes')) { $salt .= substr(bin2hex(openssl_random_pseudo_bytes($salt_length)), 0, $salt_length); } else { diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php index ee4713cd98..7ff158fbdc 100755 --- a/interface/lib/app.inc.php +++ b/interface/lib/app.inc.php @@ -28,6 +28,8 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +require_once 'compatibility.inc.php'; + //* Enable gzip compression for the interface ob_start('ob_gzhandler'); diff --git a/interface/lib/classes/auth.inc.php b/interface/lib/classes/auth.inc.php index a69d43da2e..3a4cc1603c 100644 --- a/interface/lib/classes/auth.inc.php +++ b/interface/lib/classes/auth.inc.php @@ -231,7 +231,7 @@ class auth { public function get_random_password($minLength = 8, $special = false) { if($minLength < 8) $minLength = 8; $maxLength = $minLength + 5; - $length = mt_rand($minLength, $maxLength); + $length = random_int($minLength, $maxLength); $alphachars = "abcdefghijklmnopqrstuvwxyz"; $upperchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -240,28 +240,28 @@ class auth { $num_special = 0; if($special == true) { - $num_special = intval(mt_rand(0, round($length / 4))) + 1; + $num_special = intval(random_int(0, round($length / 4))) + 1; } - $numericlen = mt_rand(1, 2); + $numericlen = random_int(1, 2); $alphalen = $length - $num_special - $numericlen; $upperlen = intval($alphalen / 2); $alphalen = $alphalen - $upperlen; $password = ''; for($i = 0; $i < $alphalen; $i++) { - $password .= substr($alphachars, mt_rand(0, strlen($alphachars) - 1), 1); + $password .= substr($alphachars, random_int(0, strlen($alphachars) - 1), 1); } for($i = 0; $i < $upperlen; $i++) { - $password .= substr($upperchars, mt_rand(0, strlen($upperchars) - 1), 1); + $password .= substr($upperchars, random_int(0, strlen($upperchars) - 1), 1); } for($i = 0; $i < $num_special; $i++) { - $password .= substr($specialchars, mt_rand(0, strlen($specialchars) - 1), 1); + $password .= substr($specialchars, random_int(0, strlen($specialchars) - 1), 1); } for($i = 0; $i < $numericlen; $i++) { - $password .= substr($numchars, mt_rand(0, strlen($numchars) - 1), 1); + $password .= substr($numchars, random_int(0, strlen($numchars) - 1), 1); } return str_shuffle($password); @@ -298,8 +298,8 @@ class auth { public function csrf_token_get($form_name) { /* CSRF PROTECTION */ // generate csrf protection id and key - $_csrf_id = uniqid($form_name . '_'); // form id - $_csrf_key = sha1(uniqid(microtime(true), true)); // the key + $_csrf_id = $form_name . '_' . bin2hex(random_bytes(12)); // form id + $_csrf_key = sha1(random_bytes(20)); // the key if(!isset($_SESSION['_csrf'])) $_SESSION['_csrf'] = array(); if(!isset($_SESSION['_csrf_timeout'])) $_SESSION['_csrf_timeout'] = array(); $_SESSION['_csrf'][$_csrf_id] = $_csrf_key; diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 02d573a778..98cdc71a4f 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -28,6 +28,8 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +require_once 'compatibility.inc.php'; + //* The purpose of this library is to provide some general functions. //* This class is loaded automatically by the ispconfig framework. @@ -437,10 +439,10 @@ class functions { $iteration = 0; $password = ""; $maxLength = $minLength + 5; - $length = $this->getRandomInt($minLength, $maxLength); + $length = random_int($minLength, $maxLength); while($iteration < $length){ - $randomNumber = (floor(((mt_rand() / mt_getrandmax()) * 100)) % 94) + 33; + $randomNumber = random_int(33, 126); if(!$special){ if (($randomNumber >=33) && ($randomNumber <=47)) { continue; } if (($randomNumber >=58) && ($randomNumber <=64)) { continue; } @@ -455,10 +457,6 @@ class functions { return $password; } - public function getRandomInt($min, $max){ - return floor((mt_rand() / mt_getrandmax()) * ($max - $min + 1)) + $min; - } - public function generate_customer_no(){ global $app; // generate customer no. @@ -474,14 +472,16 @@ class functions { global $app; // generate the SSH key pair for the client - $id_rsa_file = '/tmp/'.uniqid('',true); + $app->system->exec_safe('mktemp -dt id_rsa.XXXXXXXX'); + $tmpdir = $app->system->last_exec_out(); + $id_rsa_file = $tmpdir . uniqid('',true); $id_rsa_pub_file = $id_rsa_file.'.pub'; if(file_exists($id_rsa_file)) unset($id_rsa_file); if(file_exists($id_rsa_pub_file)) unset($id_rsa_pub_file); if(!file_exists($id_rsa_file) && !file_exists($id_rsa_pub_file)) { $app->system->exec_safe('ssh-keygen -t rsa -C ? -f ? -N ""', $username.'-rsa-key-'.time(), $id_rsa_file); - $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", @file_get_contents($id_rsa_file), @file_get_contents($id_rsa_pub_file), $client_id); - $app->system->exec_safe('rm -f ? ?', $id_rsa_file, $id_rsa_pub_file); + $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", $app->system->file_get_contents($id_rsa_file), $app->system->file_get_contents($id_rsa_pub_file), $client_id); + $app->system->rmdir($tmpdir, true); } else { $app->log("Failed to create SSH keypair for ".$username, LOGLEVEL_WARN); } diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index 80e30bf849..23c123ec6c 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -139,7 +139,7 @@ class remoting { //* Create a remote user session //srand ((double)microtime()*1000000); - $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).sha1(mt_rand().uniqid('ispco',true)); + $remote_session = bin2hex(random_bytes(20)); $remote_userid = $user['userid']; $remote_functions = ''; $tstamp = time() + $this->session_timeout; @@ -211,7 +211,7 @@ class remoting { } //* Create a remote user session //srand ((double)microtime()*1000000); - $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).sha1(mt_rand().uniqid('ispco',true)); + $remote_session = bin2hex(random_bytes(20)); $remote_userid = $remote_user['remote_userid']; $remote_functions = $remote_user['remote_functions']; $tstamp = time() + $this->session_timeout; diff --git a/interface/lib/compatibility.inc.php b/interface/lib/compatibility.inc.php new file mode 100644 index 0000000000..562e07ada4 --- /dev/null +++ b/interface/lib/compatibility.inc.php @@ -0,0 +1,80 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* random_bytes can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_bytes')) { + function random_bytes($length) { + return openssl_random_pseudo_bytes($length); + } +} + +/* random_int can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_int')) { + function random_int($min=null, $max=null) { + if (null === $min) { + $min = PHP_INT_MIN; + } + + if (null === $max) { + $min = PHP_INT_MAX; + } + + if (!is_int($min) || !is_int($max)) { + trigger_error('random_int: $min and $max must be integer values', E_USER_NOTICE); + $min = (int)$min; + $max = (int)$max; + } + + if ($min > $max) { + trigger_error('random_int: $max can\'t be lesser than $min', E_USER_WARNING); + return null; + } + + $range = $counter = $max - $min; + $bits = 1; + + while ($counter >>= 1) { + ++$bits; + } + + $bytes = (int)max(ceil($bits/8), 1); + $bitmask = pow(2, $bits) - 1; + + if ($bitmask >= PHP_INT_MAX) { + $bitmask = PHP_INT_MAX; + } + + do { + $result = hexdec(bin2hex(random_bytes($bytes))) & $bitmask; + } while ($result > $range); + + return $result + $min; + } +} diff --git a/interface/web/login/password_reset.php b/interface/web/login/password_reset.php index db4ad71c22..659075483c 100644 --- a/interface/web/login/password_reset.php +++ b/interface/web/login/password_reset.php @@ -71,7 +71,7 @@ if(isset($_POST['username']) && is_string($_POST['username']) && $_POST['usernam } elseif ($continue) { if($client['client_id'] > 0) { $username = $client['username']; - $password_hash = sha1(uniqid('ispc_pw')); + $password_hash = sha1(random_bytes(20)); $app->db->query("UPDATE sys_user SET lost_password_reqtime = NOW(), lost_password_hash = ? WHERE username = ?", $password_hash, $username); $server_domain = (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST']); diff --git a/server/lib/classes/functions.inc.php b/server/lib/classes/functions.inc.php index 5296c3012b..34e5943cda 100644 --- a/server/lib/classes/functions.inc.php +++ b/server/lib/classes/functions.inc.php @@ -468,14 +468,16 @@ class functions { global $app; // generate the SSH key pair for the client - $id_rsa_file = '/tmp/'.uniqid('',true); + $app->system->exec_safe('mktemp -dt id_rsa.XXXXXXXX'); + $tmpdir = $app->system->last_exec_out(); + $id_rsa_file = $tmpdir . uniqid('',true); $id_rsa_pub_file = $id_rsa_file.'.pub'; if(file_exists($id_rsa_file)) unset($id_rsa_file); if(file_exists($id_rsa_pub_file)) unset($id_rsa_pub_file); if(!file_exists($id_rsa_file) && !file_exists($id_rsa_pub_file)) { $app->system->exec_safe('ssh-keygen -t rsa -C ? -f ? -N ""', $username.'-rsa-key-'.time(), $id_rsa_file); $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", $app->system->file_get_contents($id_rsa_file), $app->system->file_get_contents($id_rsa_pub_file), $client_id); - $app->system->exec_safe('rm -f ? ?', $id_rsa_file, $id_rsa_pub_file); + $app->system->rmdir($tmpdir, true); } else { $app->log("Failed to create SSH keypair for ".$username, LOGLEVEL_WARN); } diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index ac805a6b67..c9f22f14c5 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -373,7 +373,7 @@ class letsencrypt { $temp_domains = array_unique($temp_domains); // check if domains are reachable to avoid letsencrypt verification errors - $le_rnd_file = uniqid('le-') . '.txt'; + $le_rnd_file = uniqid('le-', true) . '.txt'; $le_rnd_hash = md5(uniqid('le-', true)); if(!is_dir('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/')) { $app->system->mkdir('/usr/local/ispconfig/interface/acme/.well-known/acme-challenge/', false, 0755, true); diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index f2a121825b..35133ae322 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -296,16 +296,9 @@ class apache2_plugin { if(file_exists($crt_file)) $app->system->rename($crt_file, $crt_file.'.bak'); $rand_file = $ssl_dir.'/random_file'; - $rand_data = md5(uniqid(microtime(), 1)); - for($i=0; $i<1000; $i++) { - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - } - $app->system->file_put_contents($rand_file, $rand_data); + $app->system->exec_safe('dd if=/dev/urandom of=? bs=256 count=1', $rand_file); - $ssl_password = substr(md5(uniqid(microtime(), 1)), 0, 15); + $ssl_password = bin2hex(random_bytes(12)); $ssl_cnf = " RANDFILE = $rand_file diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 0e2cacaef9..9e111e72d9 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -129,16 +129,10 @@ class nginx_plugin { if(file_exists($crt_file)) $app->system->rename($crt_file, $crt_file.'.bak'); $rand_file = $ssl_dir.'/random_file'; - $rand_data = md5(uniqid(microtime(), 1)); - for($i=0; $i<1000; $i++) { - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - $rand_data .= md5(uniqid(microtime(), 1)); - } - $app->system->file_put_contents($rand_file, $rand_data); + $app->system->exec_safe('dd if=/dev/urandom of=? bs=256 count=1', $rand_file); + + $ssl_password = bin2hex(random_bytes(12)); - $ssl_password = substr(md5(uniqid(microtime(), 1)), 0, 15); $ssl_cnf = " RANDFILE = $rand_file -- GitLab From f5025023fad7f0fbe896a39b67bef87c89737f2f Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 3 Feb 2022 14:14:59 -0700 Subject: [PATCH 1311/1368] session id must begin with char --- interface/lib/classes/remoting.inc.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index 23c123ec6c..8b888cb231 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -138,8 +138,8 @@ class remoting { } //* Create a remote user session - //srand ((double)microtime()*1000000); - $remote_session = bin2hex(random_bytes(20)); + // session id must begin with a char, not digit, to avoid mysql type confusion abuse + $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).bin2hex(random_bytes(20)); $remote_userid = $user['userid']; $remote_functions = ''; $tstamp = time() + $this->session_timeout; @@ -210,8 +210,8 @@ class remoting { return false; } //* Create a remote user session - //srand ((double)microtime()*1000000); - $remote_session = bin2hex(random_bytes(20)); + // session id must begin with a char, not digit, to avoid mysql type confusion abuse + $remote_session = substr(str_shuffle('abcdefghijklmnopqrstuvwxyz'),0,1).bin2hex(random_bytes(20)); $remote_userid = $remote_user['remote_userid']; $remote_functions = $remote_user['remote_functions']; $tstamp = time() + $this->session_timeout; -- GitLab From d2d6206897fa9c0865ecb30a0208f7f10d9895e8 Mon Sep 17 00:00:00 2001 From: Xaver Maierhofer Date: Sat, 5 Feb 2022 01:36:48 +0100 Subject: [PATCH 1312/1368] Redo sorting arrows --- .../default/assets/stylesheets/ispconfig.css | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index c53b988632..e42bca2b85 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -340,34 +340,30 @@ thead.dark th.tiny-col { text-overflow: ellipsis; } thead.dark th[data-column] { - cursor: pointer; + cursor: pointer; + position: relative; +} + +thead.dark th[data-column]:before { + content: "⇅"; + position: absolute; + right: 15px; + vertical-align: middle; + line-height: inherit; + color: #aaa; } thead.dark th[data-column][data-ordered] { - font-weight: bold; - position: relative; + background: linear-gradient(to top,#57646d,#3e474e); } thead.dark th[data-column][data-ordered]:before { - content: ""; - display: block; - position: absolute; - right: 5px; - top: 16px; - width: 0; - height: 0; - vertical-align: middle; - border-bottom: 5px solid #fff; - border-top: 5px solid transparent; - border-right: 5px solid transparent; - border-left: 6px solid transparent; - line-height: inherit; + color: #fff; + content: "🡫"; } thead.dark th[data-column][data-ordered="desc"]:before { - top: 21px; - border-bottom: 5px solid transparent; - border-top: 5px solid #fff; + content: "🡩"; } thead.dark td input, -- GitLab From f0527d162c94a834c443dd87ae2ed9abf27f718d Mon Sep 17 00:00:00 2001 From: Mladen B Date: Tue, 8 Feb 2022 20:37:29 +0100 Subject: [PATCH 1313/1368] Add IPv6 support for admin IP whitelist feature. --- interface/web/login/index.php | 51 +++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 2bcb380d95..d59d24efc8 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -190,7 +190,7 @@ function is_admin_ip_whitelisted($ip, $conf) // exclude empty lines and comments if ($line === '' || $line[0] === '#') return false; - return ip_matches_cidr($ip, $line); + return ipv6_matches_cidr($ip, $line) || ipv4_matches_cidr($ip, $line); }); return count($matches) > 0; @@ -198,24 +198,59 @@ function is_admin_ip_whitelisted($ip, $conf) // based on https://www.php.net/manual/en/ref.network.php (comments) /** - * Checks if the given IP address matches the given CIDR. - * @param $ip - * @param $cidr - + * Checks if the given IPv4 address matches the given CIDR. + * @param string $ip The IPv4 address. + * @param string $cidr The CIDR in the IPv4 format. * @return bool */ -function ip_matches_cidr ($ip, $cidr) { +function ipv4_matches_cidr ($ip, $cidr) +{ + if (strpos($ip, '.') === false) return false; + list ($net, $mask) = explode ('/', $cidr); if (!$mask) $mask = 32; $ip_net = ip2long ($net); - $ip_mask = ~((1 << (32 - $mask)) - 1); - $ip_ip = ip2long ($ip); + $ip_mask = ~((1 << (32 - $mask)) - 1); return (($ip_ip & $ip_mask) == ($ip_net & $ip_mask)); } +// based on https://stackoverflow.com/a/7951507/2428861 +/** + * Checks if the given IPv6 address matches the given CIDR. + * @param string $ip The IPv6 address. + * @param string $cidr The CIDR in the IPv6 format. + * @return bool + */ +function ipv6_matches_cidr($ip, $cidr) +{ + if (strpos($ip, ':') === false) return false; + + list ($net, $mask) = explode('/', $cidr); + if (!$mask) $mask = 128; + + $ip_net = in_addr_to_bitstring(inet_pton($net)); + $ip_ip = in_addr_to_bitstring(inet_pton($ip)); + + return substr($ip_ip, 0, $mask) === substr($ip_net, 0, $mask); +} + +/** + * Converts the output of {@see inet_pton()} to string of bits. + * @param string $in_addr The in_addr representation of the IP address. + * @return string String of bits representing given in_addr representation of the IP address. + */ +function in_addr_to_bitstring($in_addr) +{ + $result = ''; + foreach (str_split($in_addr) as $c) { + $result .= str_pad(decbin(ord($c)), 8, '0', STR_PAD_LEFT); + } + return $result; +} + /** * Validates user credentials and fetches the user if validation succeeded * @param app $app -- GitLab From 8705975b7911ad6323356eb90bdc4be93e9a0356 Mon Sep 17 00:00:00 2001 From: Manoa Ratefiarison Date: Thu, 10 Feb 2022 19:12:30 +0000 Subject: [PATCH 1314/1368] Check if ISPConfig is configured with NGINX or with Apache instead of installed software (Fixes #26290) --- install/lib/install.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 6ff32bb785..610123b1c6 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -842,7 +842,7 @@ function is_installed($appname) { function get_ispconfig_port_number() { global $conf; - if($conf['nginx']['installed'] == true){ + if(is_file($conf['nginx']['vhost_conf_dir'].'/ispconfig.vhost')) { $ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/ispconfig.vhost'; $regex = '/listen (\d+)/'; } else { @@ -868,7 +868,7 @@ function get_ispconfig_port_number() { function get_apps_vhost_port_number() { global $conf; - if($conf['nginx']['installed'] == true){ + if(is_file($conf['nginx']['vhost_conf_dir'].'/apps.vhost')) { $ispconfig_vhost_file = $conf['nginx']['vhost_conf_dir'].'/apps.vhost'; $regex = '/listen (\d+)/'; } else { -- GitLab From 4790489b63e3b79fa325ec46220196d1320fcc32 Mon Sep 17 00:00:00 2001 From: Thom Date: Sat, 19 Feb 2022 15:56:16 +0000 Subject: [PATCH 1315/1368] Fix question column width (#6293) --- interface/web/help/templates/faq_manage_questions_list.htm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/interface/web/help/templates/faq_manage_questions_list.htm b/interface/web/help/templates/faq_manage_questions_list.htm index 9b54e7d4ff..f810ad6ce3 100644 --- a/interface/web/help/templates/faq_manage_questions_list.htm +++ b/interface/web/help/templates/faq_manage_questions_list.htm @@ -12,7 +12,7 @@ - + @@ -45,4 +45,4 @@
    {tmpl_var name="faq_question_txt"}{tmpl_var name="faq_question_txt"} {tmpl_var name="faq_section_name_txt"} {tmpl_var name="faq_delete_txt"} {tmpl_var name="faq_edit_txt"}
    - \ No newline at end of file + -- GitLab From d716ba29fc2735c5f137e663e4481eb104cc3c21 Mon Sep 17 00:00:00 2001 From: Thom Date: Fri, 25 Feb 2022 21:26:34 +0000 Subject: [PATCH 1316/1368] Fix deactivation of e-mail domain policy (#6286) --- interface/web/mail/mail_domain_edit.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 48f6eb2e4d..f17f74e012 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -440,7 +440,7 @@ class page_action extends tform_actions { } } - $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); + $tmp_user = $app->db->queryOneRecord("SELECT id, policy_id FROM spamfilter_users WHERE email = ?", '@' . $domain); if($tmp_user["id"] > 0) { // There is already a record that we will update if((! $skip_spamfilter_users_update) && ($policy_id != $tmp_user['policy_id'])) { -- GitLab From 513e0772e7aec8c9f99977365ce3c5f8a426544e Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 18:25:17 +0100 Subject: [PATCH 1317/1368] Remove obsolete dnssec-enable option (#5928) --- install/tpl/named.conf.options.master | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/install/tpl/named.conf.options.master b/install/tpl/named.conf.options.master index 4f001960bf..ebae9af395 100644 --- a/install/tpl/named.conf.options.master +++ b/install/tpl/named.conf.options.master @@ -18,11 +18,10 @@ options { // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //======================================================================== - dnssec-enable yes; dnssec-validation yes; version "unknown"; - + allow-transfer {none;}; auth-nxdomain no; # conform to RFC1035 -- GitLab From 19753000f4d9086d13fd043363f4df35968d07ff Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 18:26:12 +0100 Subject: [PATCH 1318/1368] Remove option dnssec-validation as the default (auto) is the correct setting (#5928) --- install/tpl/named.conf.options.master | 1 - 1 file changed, 1 deletion(-) diff --git a/install/tpl/named.conf.options.master b/install/tpl/named.conf.options.master index ebae9af395..588488c181 100644 --- a/install/tpl/named.conf.options.master +++ b/install/tpl/named.conf.options.master @@ -18,7 +18,6 @@ options { // If BIND logs error messages about the root key being expired, // you will need to update your keys. See https://www.isc.org/bind-keys //======================================================================== - dnssec-validation yes; version "unknown"; -- GitLab From 90245b97e3571d7af5bfb819574a7124b00c4eb3 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 18:50:25 +0100 Subject: [PATCH 1319/1368] Add curl to [netutils] (#6274) --- install/dist/tpl/gentoo/jk_init.ini.master | 4 ++-- install/tpl/jk_init.ini.master | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/install/dist/tpl/gentoo/jk_init.ini.master b/install/dist/tpl/gentoo/jk_init.ini.master index 6e11d05fd5..267210535b 100644 --- a/install/dist/tpl/gentoo/jk_init.ini.master +++ b/install/dist/tpl/gentoo/jk_init.ini.master @@ -96,8 +96,8 @@ regularfiles = /etc/vimrc directories = /etc/joe, /etc/terminfo, /usr/share/vim, /usr/share/terminfo, /usr/lib/terminfo [netutils] -comment = several internet utilities like wget, ftp, rsync, scp, ssh -executables = /usr/bin/wget, /usr/bin/lynx, /usr/bin/ftp, /usr/bin/host, /usr/bin/rsync, /usr/bin/smbclient +comment = several internet utilities like curl, wget, ftp, rsync, scp, ssh +executables = /usr/bin/curl /usr/bin/wget, /usr/bin/lynx, /usr/bin/ftp, /usr/bin/host, /usr/bin/rsync, /usr/bin/smbclient includesections = netbasics, ssh, sftp, scp directories = /etc/ssl/certs/ regularfiles = /usr/lib/ssl/certs diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 0dfcdccb68..3cbb818097 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -87,7 +87,7 @@ paths = awk, bzip2, bunzip2, ldd, less, clear, cut, du, find, head, less, md5sum includesections = basicshell, midnightcommander, editors [terminfo] -comment = terminfo databases, required for example for ncurses or vim +comment = terminfo databases, required for example for ncurses or vim paths = /etc/terminfo, /usr/share/terminfo, /lib/terminfo [editors] @@ -96,8 +96,8 @@ includesections = terminfo paths = joe, nano, vi, vim, /etc/vimrc, /etc/joe, /usr/share/vim [netutils] -comment = several internet utilities like wget, ftp, rsync, scp, ssh -paths = wget, lynx, ftp, host, rsync, smbclient +comment = several internet utilities like curl, wget, ftp, rsync, scp, ssh +paths = curl, wget, lynx, ftp, host, rsync, smbclient includesections = netbasics, ssh, sftp, scp [apacheutils] -- GitLab From da73d6a0bec252dde85fbc4e98ff7461c9c52f62 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 18:52:39 +0100 Subject: [PATCH 1320/1368] Add php8.2 to jailkit (#6275) --- install/tpl/jk_init.ini.master | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install/tpl/jk_init.ini.master b/install/tpl/jk_init.ini.master index 3cbb818097..b6e731b536 100644 --- a/install/tpl/jk_init.ini.master +++ b/install/tpl/jk_init.ini.master @@ -238,6 +238,11 @@ comment = php version 8.1 paths = /usr/bin/php8.1, /usr/lib/php/8.1/, /usr/lib/php/20210902/, /usr/share/php/8.1/, /etc/php/8.1/cli/, /etc/php/8.1/mods-available/ includesections = php_common +[php8_2] +comment = php version 8.2 +paths = /usr/bin/php8.2, /usr/lib/php/8.2/, /usr/lib/php/20210902/, /usr/share/php/8.2/, /etc/php/8.2/cli/, /etc/php/8.2/mods-available/ +includesections = php_common + [imagemagick] comment = ImageMagick needed for php-imagemagick extension paths = /usr/share/ImageMagick-*, /etc/ImageMagick-*, /usr/lib/*/ImageMagick-* -- GitLab From fed62850b3167c6a333e346531d6c1db0d0da74a Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 20:04:38 +0100 Subject: [PATCH 1321/1368] Create backup folder when site is created (#6277) --- server/plugins-available/apache2_plugin.inc.php | 1 + server/plugins-available/nginx_plugin.inc.php | 1 + 2 files changed, 2 insertions(+) diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index f2a121825b..df9db8ccdf 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -724,6 +724,7 @@ class apache2_plugin { if(!is_dir($data['new']['document_root'].'/cgi-bin')) $app->system->mkdirpath($data['new']['document_root'].'/cgi-bin'); if(!is_dir($data['new']['document_root'].'/tmp')) $app->system->mkdirpath($data['new']['document_root'].'/tmp', 0770); if(!is_dir($data['new']['document_root'].'/webdav')) $app->system->mkdirpath($data['new']['document_root'].'/webdav'); + if(!is_dir($data['new']['document_root'].'/backup')) $app->system->mkdirpath($data['new']['document_root'].'/backup'); if(!is_dir($data['new']['document_root'].'/.ssh')) { $app->system->mkdirpath($data['new']['document_root'].'/.ssh'); diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php index 0e2cacaef9..996f8afa46 100644 --- a/server/plugins-available/nginx_plugin.inc.php +++ b/server/plugins-available/nginx_plugin.inc.php @@ -567,6 +567,7 @@ class nginx_plugin { if(!is_dir($data['new']['document_root'].'/ssl')) $app->system->mkdirpath($data['new']['document_root'].'/ssl'); if(!is_dir($data['new']['document_root'].'/cgi-bin')) $app->system->mkdirpath($data['new']['document_root'].'/cgi-bin'); if(!is_dir($data['new']['document_root'].'/tmp')) $app->system->mkdirpath($data['new']['document_root'].'/tmp'); + if(!is_dir($data['new']['document_root'].'/backup')) $app->system->mkdirpath($data['new']['document_root'].'/backup'); if(!is_dir($data['new']['document_root'].'/.ssh')) { $app->system->mkdirpath($data['new']['document_root'].'/.ssh'); -- GitLab From 17ac10909ff6ca630650578426410a8562416a7c Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 21:34:41 +0100 Subject: [PATCH 1322/1368] Add ability to acknowledge all system log messages (#4159) --- .../web/monitor/lib/lang/ar_syslog_list.lng | 3 + .../web/monitor/lib/lang/bg_syslog_list.lng | 3 + .../web/monitor/lib/lang/br_syslog_list.lng | 4 + .../web/monitor/lib/lang/ca_syslog_list.lng | 3 + .../web/monitor/lib/lang/cz_syslog_list.lng | 4 + .../web/monitor/lib/lang/de_syslog_list.lng | 3 + .../web/monitor/lib/lang/dk_syslog_list.lng | 3 + .../web/monitor/lib/lang/el_syslog_list.lng | 3 + .../web/monitor/lib/lang/en_syslog_list.lng | 5 +- .../web/monitor/lib/lang/es_syslog_list.lng | 3 + .../web/monitor/lib/lang/fi_syslog_list.lng | 3 + .../web/monitor/lib/lang/fr_syslog_list.lng | 3 + .../web/monitor/lib/lang/hr_syslog_list.lng | 3 + .../web/monitor/lib/lang/hu_syslog_list.lng | 3 + .../web/monitor/lib/lang/id_syslog_list.lng | 3 + .../web/monitor/lib/lang/it_syslog_list.lng | 3 + .../web/monitor/lib/lang/ja_syslog_list.lng | 3 + .../web/monitor/lib/lang/nl_syslog_list.lng | 3 + .../web/monitor/lib/lang/pl_syslog_list.lng | 3 + .../web/monitor/lib/lang/pt_syslog_list.lng | 3 + .../web/monitor/lib/lang/ro_syslog_list.lng | 3 + .../web/monitor/lib/lang/ru_syslog_list.lng | 3 + .../web/monitor/lib/lang/se_syslog_list.lng | 3 + .../web/monitor/lib/lang/sk_syslog_list.lng | 3 + .../web/monitor/lib/lang/tr_syslog_list.lng | 3 + interface/web/monitor/log_del.php | 10 +- .../web/monitor/templates/syslog_list.htm | 134 +++++++++++------- 27 files changed, 166 insertions(+), 57 deletions(-) diff --git a/interface/web/monitor/lib/lang/ar_syslog_list.lng b/interface/web/monitor/lib/lang/ar_syslog_list.lng index 00da5abc7b..c1b8ce74ba 100644 --- a/interface/web/monitor/lib/lang/ar_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ar_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Message'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/bg_syslog_list.lng b/interface/web/monitor/lib/lang/bg_syslog_list.lng index 98ac28c0a7..ef607637ea 100644 --- a/interface/web/monitor/lib/lang/bg_syslog_list.lng +++ b/interface/web/monitor/lib/lang/bg_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Дата'; $wb['server_id_txt'] = 'Сървър'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Съобщение'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/br_syslog_list.lng b/interface/web/monitor/lib/lang/br_syslog_list.lng index 18543c9ad3..ca97be1ab9 100644 --- a/interface/web/monitor/lib/lang/br_syslog_list.lng +++ b/interface/web/monitor/lib/lang/br_syslog_list.lng @@ -4,3 +4,7 @@ $wb['tstamp_txt'] = 'Data/hora'; $wb['server_id_txt'] = 'Servidor'; $wb['loglevel_txt'] = 'Nível'; $wb['message_txt'] = 'Mensagem'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +?> diff --git a/interface/web/monitor/lib/lang/ca_syslog_list.lng b/interface/web/monitor/lib/lang/ca_syslog_list.lng index 1b01a35df7..da918d516f 100644 --- a/interface/web/monitor/lib/lang/ca_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ca_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Serveur'; $wb['loglevel_txt'] = 'Niveau de log '; $wb['message_txt'] = 'Message'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/cz_syslog_list.lng b/interface/web/monitor/lib/lang/cz_syslog_list.lng index 5d5ce8f8c1..de26512883 100644 --- a/interface/web/monitor/lib/lang/cz_syslog_list.lng +++ b/interface/web/monitor/lib/lang/cz_syslog_list.lng @@ -4,3 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Úroveň protokolu'; $wb['message_txt'] = 'Zpráva'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +?> diff --git a/interface/web/monitor/lib/lang/de_syslog_list.lng b/interface/web/monitor/lib/lang/de_syslog_list.lng index 4aa045a24b..527fd72a1f 100644 --- a/interface/web/monitor/lib/lang/de_syslog_list.lng +++ b/interface/web/monitor/lib/lang/de_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Protokoll-Level'; $wb['message_txt'] = 'Nachricht'; +$wb['batch_delete_errors_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/dk_syslog_list.lng b/interface/web/monitor/lib/lang/dk_syslog_list.lng index e1b067bfe3..082f59c00a 100644 --- a/interface/web/monitor/lib/lang/dk_syslog_list.lng +++ b/interface/web/monitor/lib/lang/dk_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Dato'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Meddelelse'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/el_syslog_list.lng b/interface/web/monitor/lib/lang/el_syslog_list.lng index c2db4823dd..7a26a826b4 100644 --- a/interface/web/monitor/lib/lang/el_syslog_list.lng +++ b/interface/web/monitor/lib/lang/el_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Ημερομηνία'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Επίπεδο καταγραφής'; $wb['message_txt'] = 'Μήνυμα'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/en_syslog_list.lng b/interface/web/monitor/lib/lang/en_syslog_list.lng index d85ab8d40f..c1b8ce74ba 100644 --- a/interface/web/monitor/lib/lang/en_syslog_list.lng +++ b/interface/web/monitor/lib/lang/en_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Message'; -?> \ No newline at end of file +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +?> diff --git a/interface/web/monitor/lib/lang/es_syslog_list.lng b/interface/web/monitor/lib/lang/es_syslog_list.lng index 355b1cffdf..0e32c8ff72 100644 --- a/interface/web/monitor/lib/lang/es_syslog_list.lng +++ b/interface/web/monitor/lib/lang/es_syslog_list.lng @@ -4,4 +4,7 @@ $wb['loglevel_txt'] = 'Nivel de registro'; $wb['message_txt'] = 'Mensaje'; $wb['server_id_txt'] = 'Servidor'; $wb['tstamp_txt'] = 'Fecha'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/fi_syslog_list.lng b/interface/web/monitor/lib/lang/fi_syslog_list.lng index 54aaa4e306..65e7e4e6a5 100644 --- a/interface/web/monitor/lib/lang/fi_syslog_list.lng +++ b/interface/web/monitor/lib/lang/fi_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Päiväys'; $wb['server_id_txt'] = 'Palvelin'; $wb['loglevel_txt'] = 'Lokitaso'; $wb['message_txt'] = 'Viesti'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/fr_syslog_list.lng b/interface/web/monitor/lib/lang/fr_syslog_list.lng index 1b01a35df7..da918d516f 100644 --- a/interface/web/monitor/lib/lang/fr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/fr_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Serveur'; $wb['loglevel_txt'] = 'Niveau de log '; $wb['message_txt'] = 'Message'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/hr_syslog_list.lng b/interface/web/monitor/lib/lang/hr_syslog_list.lng index 83c5fcdf49..13f2932598 100644 --- a/interface/web/monitor/lib/lang/hr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/hr_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Logovi'; $wb['message_txt'] = 'Poruka'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/hu_syslog_list.lng b/interface/web/monitor/lib/lang/hu_syslog_list.lng index 65480b9d71..1ce56abfc3 100644 --- a/interface/web/monitor/lib/lang/hu_syslog_list.lng +++ b/interface/web/monitor/lib/lang/hu_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Dátum'; $wb['server_id_txt'] = 'Szerver'; $wb['loglevel_txt'] = 'Naplózási szint'; $wb['message_txt'] = 'Üzenet'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/id_syslog_list.lng b/interface/web/monitor/lib/lang/id_syslog_list.lng index c523a55a2b..060fbd8f19 100644 --- a/interface/web/monitor/lib/lang/id_syslog_list.lng +++ b/interface/web/monitor/lib/lang/id_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Tanggal'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Tingkatan Log'; $wb['message_txt'] = 'Pesan'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/it_syslog_list.lng b/interface/web/monitor/lib/lang/it_syslog_list.lng index 65ff6fc7c5..b5894bb43f 100644 --- a/interface/web/monitor/lib/lang/it_syslog_list.lng +++ b/interface/web/monitor/lib/lang/it_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Livello log'; $wb['message_txt'] = 'Messaggio'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/ja_syslog_list.lng b/interface/web/monitor/lib/lang/ja_syslog_list.lng index 598b8d451a..51630cc32d 100644 --- a/interface/web/monitor/lib/lang/ja_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ja_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = '日付'; $wb['server_id_txt'] = 'サーバー'; $wb['loglevel_txt'] = 'ログレベル'; $wb['message_txt'] = 'メッセージ'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/nl_syslog_list.lng b/interface/web/monitor/lib/lang/nl_syslog_list.lng index 7e2fa4a45f..2f9531a5c3 100644 --- a/interface/web/monitor/lib/lang/nl_syslog_list.lng +++ b/interface/web/monitor/lib/lang/nl_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Log niveau'; $wb['message_txt'] = 'Bericht'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/pl_syslog_list.lng b/interface/web/monitor/lib/lang/pl_syslog_list.lng index e37799c474..7ad1a7f4c0 100644 --- a/interface/web/monitor/lib/lang/pl_syslog_list.lng +++ b/interface/web/monitor/lib/lang/pl_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Serwer'; $wb['loglevel_txt'] = 'Poziom logowania'; $wb['message_txt'] = 'Wiadomość'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/pt_syslog_list.lng b/interface/web/monitor/lib/lang/pt_syslog_list.lng index 23f3c6d5da..e186861245 100644 --- a/interface/web/monitor/lib/lang/pt_syslog_list.lng +++ b/interface/web/monitor/lib/lang/pt_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Servidor'; $wb['loglevel_txt'] = 'Nível do Log'; $wb['message_txt'] = 'Mensagem'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/ro_syslog_list.lng b/interface/web/monitor/lib/lang/ro_syslog_list.lng index 572095d8da..62b0801cc1 100644 --- a/interface/web/monitor/lib/lang/ro_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ro_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Mesaj'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/ru_syslog_list.lng b/interface/web/monitor/lib/lang/ru_syslog_list.lng index 242d06f3e3..0b4a8418ac 100644 --- a/interface/web/monitor/lib/lang/ru_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ru_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Отметка времени'; $wb['server_id_txt'] = 'Сервер'; $wb['loglevel_txt'] = 'Уровень журналирования'; $wb['message_txt'] = 'Сообщение'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/se_syslog_list.lng b/interface/web/monitor/lib/lang/se_syslog_list.lng index 6c7268cb76..aaa45b8a51 100644 --- a/interface/web/monitor/lib/lang/se_syslog_list.lng +++ b/interface/web/monitor/lib/lang/se_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Datum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Loggnivå'; $wb['message_txt'] = 'Meddelande'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/sk_syslog_list.lng b/interface/web/monitor/lib/lang/sk_syslog_list.lng index e3a800c8c1..6696f4064e 100644 --- a/interface/web/monitor/lib/lang/sk_syslog_list.lng +++ b/interface/web/monitor/lib/lang/sk_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Dátum'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Úroveň logovania'; $wb['message_txt'] = 'Správa'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/lib/lang/tr_syslog_list.lng b/interface/web/monitor/lib/lang/tr_syslog_list.lng index b961014e86..8b7dc81b1b 100644 --- a/interface/web/monitor/lib/lang/tr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/tr_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Tarih'; $wb['server_id_txt'] = 'Sunucu'; $wb['loglevel_txt'] = 'Günlükleme Düzeyi'; $wb['message_txt'] = 'İleti'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/monitor/log_del.php b/interface/web/monitor/log_del.php index 40fe185977..ec6b9442eb 100644 --- a/interface/web/monitor/log_del.php +++ b/interface/web/monitor/log_del.php @@ -34,8 +34,14 @@ require_once '../../lib/app.inc.php'; //* Check permissions for module $app->auth->check_module_permissions('monitor'); -$syslog_id = $app->functions->intval($_GET['id']); -$app->db->query("UPDATE sys_log SET loglevel = 0 WHERE syslog_id = ?", $syslog_id); +$type = $app->functions->intval($_GET['type']); +if ($type == "batch") { + $loglevel = $app->functions->intval($_GET['loglevel']); + $app->db->query("UPDATE sys_log SET loglevel = 0 WHERE loglevel = ?", $loglevel); +} else { + $syslog_id = $app->functions->intval($_GET['id']); + $app->db->query("UPDATE sys_log SET loglevel = 0 WHERE syslog_id = ?", $syslog_id); +} header('Location: log_list.php'); exit; diff --git a/interface/web/monitor/templates/syslog_list.htm b/interface/web/monitor/templates/syslog_list.htm index 7196e3ab02..087af5cdc9 100644 --- a/interface/web/monitor/templates/syslog_list.htm +++ b/interface/web/monitor/templates/syslog_list.htm @@ -1,59 +1,85 @@ -

    +

    + +

    + {tmpl_var name='batch_delete_warnings_txt'} + {tmpl_var name='batch_delete_errors_txt'} +

    + +

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + + + + + {tmpl_var name='search_limit'}
      + +
    {tmpl_var name="tstamp"}{tmpl_var name="server_id"}{tmpl_var name="loglevel"}{tmpl_var name="message"} + + + + + + +
    {tmpl_var name='globalsearch_noresults_text_txt'}
    + +
    +
    -

    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    {tmpl_var name='search_limit'}
      - -
    {tmpl_var name="tstamp"}{tmpl_var name="server_id"}{tmpl_var name="loglevel"}{tmpl_var name="message"} - - - - - - -
    {tmpl_var name='globalsearch_noresults_text_txt'}
    - -
    \ No newline at end of file -- GitLab From 68ba6f8fe4f2a9bfc60d26a3b7ba0a5cbe9a9a5f Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 22:22:48 +0100 Subject: [PATCH 1323/1368] Reverse order so newest PHP socket is used if available (#6233) --- install/lib/installer_base.lib.php | 8 ++++---- server/plugins-available/apps_vhost_plugin.inc.php | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index eb69090579..2d4ca4423e 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2759,11 +2759,11 @@ class installer_base { $content = str_replace('{use_socket}', $use_socket, $content); // Fix socket path on PHP 7 systems - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); - if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); wf($vhost_conf_dir.'/apps.vhost', $content); diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index 91a994b109..e77c1dd60b 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -214,7 +214,7 @@ class apps_vhost_plugin { $content = str_replace('{ssl_comment}', '#', $content); $content = preg_replace('/(\s)\{ssl_on\}/', '', $content); } - + $content = str_replace('{use_tcp}', $use_tcp, $content); $content = str_replace('{use_socket}', $use_socket, $content); @@ -227,11 +227,11 @@ class apps_vhost_plugin { $content = str_replace('{use_rspamd}', $use_rspamd, $content); // Fix socket path on PHP 7 systems - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); - if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); + if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); // PHP-FPM // Dont just copy over the php-fpm pool template but add some custom settings -- GitLab From 4bb58a64e6a5c9d44a98e34ec45a61e8ac9e649a Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 22:23:56 +0100 Subject: [PATCH 1324/1368] Whitespace fix --- server/plugins-available/apps_vhost_plugin.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/plugins-available/apps_vhost_plugin.inc.php b/server/plugins-available/apps_vhost_plugin.inc.php index e77c1dd60b..6318c519ef 100644 --- a/server/plugins-available/apps_vhost_plugin.inc.php +++ b/server/plugins-available/apps_vhost_plugin.inc.php @@ -229,9 +229,9 @@ class apps_vhost_plugin { // Fix socket path on PHP 7 systems if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); - if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); + if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); // PHP-FPM // Dont just copy over the php-fpm pool template but add some custom settings -- GitLab From de956eb3cfc7553f5ac4e6a07dd5195b07be10c8 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 22:25:42 +0100 Subject: [PATCH 1325/1368] Whitespace fix --- install/lib/installer_base.lib.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 2d4ca4423e..591ff54a57 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2761,9 +2761,9 @@ class installer_base { // Fix socket path on PHP 7 systems if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); - if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); + if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); wf($vhost_conf_dir.'/apps.vhost', $content); -- GitLab From 51f8dc9f935db36380b353b6f0b2844cef48021a Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 22:28:19 +0100 Subject: [PATCH 1326/1368] Enable TLS for PureFTPd if certificate file exists (#6263) --- install/dist/lib/gentoo.lib.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/install/dist/lib/gentoo.lib.php b/install/dist/lib/gentoo.lib.php index ebb742a368..c98788e33c 100644 --- a/install/dist/lib/gentoo.lib.php +++ b/install/dist/lib/gentoo.lib.php @@ -506,7 +506,13 @@ class installer extends installer_base */ - $content = preg_replace('/MISC_OTHER="[^"]+"/', 'MISC_OTHER="-b -A -E -Z -D -H -O clf:'.$logdir.'/transfer.log"', $content); + //* Enable TLS if certificate file exists + $enable_tls = ''; + if(file_exists('/etc/ssl/private/pure-ftpd.pem')) { + $enable_tls = ' -Y 1'; + } + + $content = preg_replace('/MISC_OTHER="[^"]+"/', 'MISC_OTHER="-b -A -E -Z -D -H -O clf:'.$logdir.'/transfer.log'.$enable_tls.'"', $content); $this->write_config_file($conf['pureftpd']['config_file'], $content); } -- GitLab From e1ac2b0fdd7f7b1b9c81097ca9ef8effa8da3bb2 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Feb 2022 22:39:16 +0100 Subject: [PATCH 1327/1368] Backup Let's Encrypt certificates on update (#6281) --- install/update.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/install/update.php b/install/update.php index 4639615801..6e64750342 100644 --- a/install/update.php +++ b/install/update.php @@ -216,6 +216,17 @@ if($do_backup == 'yes') { exec("tar pcfz $backup_path/etc.tar.gz /etc 2> /dev/null", $out, $returnvar); if($returnvar != 0) die("Backup failed. We stop here...\n"); + if (is_dir('/root/.acme.sh')) { + swriteln('Creating backup of "/root/.acme.sh" directory...'); + exec("tar pcfz $backup_path/acme.sh.tar.gz /root/.acme.sh 2> /dev/null", $out, $returnvar); + if($returnvar != 0) die("Backup failed. We stop here...\n"); + } elseif (is_dir('/etc/letsencrypt')) { + swriteln('Creating backup of "/etc/letsencrypt" directory...'); + exec("tar pcfz $backup_path/letsencrypt.tar.gz /etc/letsencrypt 2> /dev/null", $out, $returnvar); + if($returnvar != 0) die("Backup failed. We stop here...\n"); + } + + exec("chown root:root $backup_path/*.tar.gz"); exec("chmod 700 $backup_path/*.tar.gz"); } -- GitLab From d5510c30ea0befa0d81cac06cb2d596bd3308a84 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Mon, 28 Feb 2022 09:55:14 +0000 Subject: [PATCH 1328/1368] Apply 1 suggestion(s) to 1 file(s) --- interface/web/themes/default/assets/stylesheets/ispconfig.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/themes/default/assets/stylesheets/ispconfig.css b/interface/web/themes/default/assets/stylesheets/ispconfig.css index e42bca2b85..b614bebdf5 100644 --- a/interface/web/themes/default/assets/stylesheets/ispconfig.css +++ b/interface/web/themes/default/assets/stylesheets/ispconfig.css @@ -354,7 +354,7 @@ thead.dark th[data-column]:before { } thead.dark th[data-column][data-ordered] { - background: linear-gradient(to top,#57646d,#3e474e); + background: linear-gradient(to top, #57646d, #3e474e); } thead.dark th[data-column][data-ordered]:before { -- GitLab From aebdcd4f01adfd79e057cbf17baaaf8c1945a556 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Mon, 28 Feb 2022 12:03:07 +0100 Subject: [PATCH 1329/1368] - add missing global $app --- interface/web/common.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/interface/web/common.php b/interface/web/common.php index 2713ed4ed6..3053e97119 100644 --- a/interface/web/common.php +++ b/interface/web/common.php @@ -39,6 +39,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ function include_menu_dir_files($menu_dir) { + global $app; + if (is_dir($menu_dir)) { if ($dh = opendir($menu_dir)) { //** Go through all files in the menu dir -- GitLab From ae0a481fd528ab01da142d0cb15db1f4e959a70a Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Mon, 28 Feb 2022 15:53:15 +0000 Subject: [PATCH 1330/1368] Apply 1 suggestion(s) to 1 file(s) --- install/update.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/install/update.php b/install/update.php index 6e64750342..98c798f500 100644 --- a/install/update.php +++ b/install/update.php @@ -220,7 +220,9 @@ if($do_backup == 'yes') { swriteln('Creating backup of "/root/.acme.sh" directory...'); exec("tar pcfz $backup_path/acme.sh.tar.gz /root/.acme.sh 2> /dev/null", $out, $returnvar); if($returnvar != 0) die("Backup failed. We stop here...\n"); - } elseif (is_dir('/etc/letsencrypt')) { + } + + if (is_dir('/etc/letsencrypt')) { swriteln('Creating backup of "/etc/letsencrypt" directory...'); exec("tar pcfz $backup_path/letsencrypt.tar.gz /etc/letsencrypt 2> /dev/null", $out, $returnvar); if($returnvar != 0) die("Backup failed. We stop here...\n"); -- GitLab From 5ee1a8cc778e77f133f1aa97746511ee62ebaa31 Mon Sep 17 00:00:00 2001 From: System Administrator Date: Mon, 28 Feb 2022 16:56:02 +0100 Subject: [PATCH 1331/1368] Fix whitespaces --- install/update.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/install/update.php b/install/update.php index 98c798f500..a93f8e5ba8 100644 --- a/install/update.php +++ b/install/update.php @@ -218,14 +218,14 @@ if($do_backup == 'yes') { if (is_dir('/root/.acme.sh')) { swriteln('Creating backup of "/root/.acme.sh" directory...'); - exec("tar pcfz $backup_path/acme.sh.tar.gz /root/.acme.sh 2> /dev/null", $out, $returnvar); - if($returnvar != 0) die("Backup failed. We stop here...\n"); + exec("tar pcfz $backup_path/acme.sh.tar.gz /root/.acme.sh 2> /dev/null", $out, $returnvar); + if($returnvar != 0) die("Backup failed. We stop here...\n"); } if (is_dir('/etc/letsencrypt')) { swriteln('Creating backup of "/etc/letsencrypt" directory...'); - exec("tar pcfz $backup_path/letsencrypt.tar.gz /etc/letsencrypt 2> /dev/null", $out, $returnvar); - if($returnvar != 0) die("Backup failed. We stop here...\n"); + exec("tar pcfz $backup_path/certbot.tar.gz /etc/letsencrypt 2> /dev/null", $out, $returnvar); + if($returnvar != 0) die("Backup failed. We stop here...\n"); } -- GitLab From f71ffb3e794ba4969daa0344833aae4c7ba7ec45 Mon Sep 17 00:00:00 2001 From: System Administrator Date: Mon, 28 Feb 2022 17:01:15 +0100 Subject: [PATCH 1332/1368] Use elseif instead of if (#6233) --- install/lib/installer_base.lib.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index 591ff54a57..bd357c8778 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2759,11 +2759,17 @@ class installer_base { $content = str_replace('{use_socket}', $use_socket, $content); // Fix socket path on PHP 7 systems - if(file_exists('/var/run/php/php7.4-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); - if(file_exists('/var/run/php/php7.3-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); - if(file_exists('/var/run/php/php7.2-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); - if(file_exists('/var/run/php/php7.1-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); - if(file_exists('/var/run/php/php7.0-fpm.sock')) $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); + if (file_exists('/var/run/php/php7.4-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.4-fpm.sock', $content); + } elseif(file_exists('/var/run/php/php7.3-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.3-fpm.sock', $content); + } elseif (file_exists('/var/run/php/php7.2-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.2-fpm.sock', $content); + } elseif (file_exists('/var/run/php/php7.1-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.1-fpm.sock', $content); + } elseif (file_exists('/var/run/php/php7.0-fpm.sock')) { + $content = str_replace('/var/run/php5-fpm.sock', '/var/run/php/php7.0-fpm.sock', $content); + } wf($vhost_conf_dir.'/apps.vhost', $content); -- GitLab From 7d56e50c34a2eeb3fbf2506e4c7cb568a52fe6fa Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Tue, 1 Mar 2022 15:58:16 +0100 Subject: [PATCH 1333/1368] - add $module to global --- interface/web/common.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/common.php b/interface/web/common.php index 3053e97119..ac37a1aa76 100644 --- a/interface/web/common.php +++ b/interface/web/common.php @@ -39,7 +39,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ function include_menu_dir_files($menu_dir) { - global $app; + global $app, $module; if (is_dir($menu_dir)) { if ($dh = opendir($menu_dir)) { -- GitLab From a0158943903a8e844ae9409155a274b922e45317 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Tue, 1 Mar 2022 21:14:54 +0100 Subject: [PATCH 1334/1368] Add warning for Courier users --- install/update.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/install/update.php b/install/update.php index a93f8e5ba8..ef2e1fcfe3 100644 --- a/install/update.php +++ b/install/update.php @@ -664,6 +664,11 @@ $md5_filename = '/usr/local/ispconfig/security/data/file_checksums_'.date('Y-m-d exec('find /usr/local/ispconfig -type f -print0 | xargs -0 md5sum > '.$md5_filename . ' 2>/dev/null'); chmod($md5_filename,0700); +// TODO: In a future update, stop the update script when running courier +if ($conf['courier']['installed'] == true) { + swriteln('WARNING: You are running Courier. We are removing support for Courier from ISPConfig. Migrate your system to Dovecot as soon as possible. See https://www.howtoforge.com/community/threads/migrate-from-courier-to-dovecot-on-your-ispconfig-managed-mailserver.88523/ for more information.'); +} + echo "Update finished.\n"; ?> -- GitLab From de80006ae2aa768ee051a0d537734e68651cff75 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 2 Mar 2022 13:47:53 -0700 Subject: [PATCH 1335/1368] fix include path --- interface/lib/classes/functions.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index 98cdc71a4f..b39486e2c4 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -28,7 +28,7 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -require_once 'compatibility.inc.php'; +require_once __DIR__.'/../compatibility.inc.php'; //* The purpose of this library is to provide some general functions. //* This class is loaded automatically by the ispconfig framework. -- GitLab From 8c2008dcfe028cf95efa505b10dd5fb9852a7970 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Wed, 2 Mar 2022 14:18:23 -0700 Subject: [PATCH 1336/1368] fix $app->system-> calls in system/ but not interface/ --- interface/lib/classes/functions.inc.php | 7 ++++--- interface/lib/classes/system.inc.php | 26 +++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/interface/lib/classes/functions.inc.php b/interface/lib/classes/functions.inc.php index b39486e2c4..1b39668674 100644 --- a/interface/lib/classes/functions.inc.php +++ b/interface/lib/classes/functions.inc.php @@ -472,15 +472,16 @@ class functions { global $app; // generate the SSH key pair for the client - $app->system->exec_safe('mktemp -dt id_rsa.XXXXXXXX'); - $tmpdir = $app->system->last_exec_out(); + if (! $tmpdir = $app->system->exec_safe('mktemp -dt id_rsa.XXXXXXXX')) { + $app->log("mktemp failed, cannot create SSH keypair for ".$username, LOGLEVEL_WARN); + } $id_rsa_file = $tmpdir . uniqid('',true); $id_rsa_pub_file = $id_rsa_file.'.pub'; if(file_exists($id_rsa_file)) unset($id_rsa_file); if(file_exists($id_rsa_pub_file)) unset($id_rsa_pub_file); if(!file_exists($id_rsa_file) && !file_exists($id_rsa_pub_file)) { $app->system->exec_safe('ssh-keygen -t rsa -C ? -f ? -N ""', $username.'-rsa-key-'.time(), $id_rsa_file); - $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", $app->system->file_get_contents($id_rsa_file), $app->system->file_get_contents($id_rsa_pub_file), $client_id); + $app->db->query("UPDATE client SET created_at = UNIX_TIMESTAMP(), id_rsa = ?, ssh_rsa = ? WHERE client_id = ?", @file_get_contents($id_rsa_file), @file_get_contents($id_rsa_pub_file), $client_id); $app->system->rmdir($tmpdir, true); } else { $app->log("Failed to create SSH keypair for ".$username, LOGLEVEL_WARN); diff --git a/interface/lib/classes/system.inc.php b/interface/lib/classes/system.inc.php index d6b0ef149e..9cb171cae5 100644 --- a/interface/lib/classes/system.inc.php +++ b/interface/lib/classes/system.inc.php @@ -79,6 +79,32 @@ class system { return false; } + function rmdir($path, $recursive=false) { + // Disallow operating on root directory + if(realpath($path) == '/') { + $app->log("rmdir: afraid I might delete root: $path", LOGLEVEL_WARN); + return false; + } + + $path = rtrim($path, '/'); + if (is_dir($path) && !is_link($path)) { + $objects = array_diff(scandir($path), array('.', '..')); + foreach ($objects as $object) { + if ($recursive) { + if (is_dir("$path/$object") && !is_link("$path/$object")) { + $this->rmdir("$path/$object", $recursive); + } else { + unlink ("$path/$object"); + } + } else { + $app->log("rmdir: invoked non-recursive, not removing $path (expect rmdir failure)", LOGLEVEL_DEBUG); + } + } + return rmdir($path); + } + return false; + } + public function last_exec_out() { return $this->_last_exec_out; } -- GitLab From ad131a8ac87ff224c23ac5bf4686aee1bf395796 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 3 Mar 2022 16:21:58 +0100 Subject: [PATCH 1337/1368] Also include the global lng file, #6246 --- interface/web/dashboard/dashlets/limits.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/web/dashboard/dashlets/limits.php b/interface/web/dashboard/dashlets/limits.php index e5a8cc459f..a649fef0f7 100644 --- a/interface/web/dashboard/dashlets/limits.php +++ b/interface/web/dashboard/dashlets/limits.php @@ -141,6 +141,10 @@ class dashlet_limits if (is_file($lng_file)) { include $lng_file; } + $lng_file = ISPC_ROOT_PATH . '/lib/lang/'.$_SESSION['s']['language'].'.lng'; + if (is_file($lng_file)) { + include $lng_file; + } $tpl->setVar($wb); if ($app->auth->is_admin()) { -- GitLab From a18e8bcecb84e965646cfbddaf9cbe5f6cb76735 Mon Sep 17 00:00:00 2001 From: Herman van Rink Date: Thu, 3 Mar 2022 17:06:21 +0100 Subject: [PATCH 1338/1368] limit_mail_wblist_txt was missing for all languages _dashlet_limits.lng, #6246 --- interface/web/dashboard/lib/lang/ar_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/bg_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/br_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/ca_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/cz_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/de_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/dk_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/el_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/en_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/es_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/fi_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/fr_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/hr_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/hu_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/id_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/it_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/ja_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/nl_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/pl_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/pt_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/ro_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/ru_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/se_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/sk_dashlet_limits.lng | 1 + interface/web/dashboard/lib/lang/tr_dashlet_limits.lng | 1 + 25 files changed, 25 insertions(+) diff --git a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng index b15261dfc4..7f87485dfe 100644 --- a/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ar_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng b/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng index 961e6825df..78f68a0312 100644 --- a/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/bg_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/br_dashlet_limits.lng b/interface/web/dashboard/lib/lang/br_dashlet_limits.lng index 057a1c780c..1b336fe02b 100644 --- a/interface/web/dashboard/lib/lang/br_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/br_dashlet_limits.lng @@ -30,3 +30,4 @@ $wb['limit_domain_txt'] = 'Número de domínios'; $wb['limit_mailquota_txt'] = 'Cotas atribuídas para contas de email'; $wb['limit_web_quota_txt'] = 'Cotas atribuídas para sites'; $wb['limit_database_quota_txt'] = 'Cotas atribuídas para Banco de Dados'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; diff --git a/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng index ae78112c85..6a443950a4 100644 --- a/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ca_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng b/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng index 7386ff3c4d..7ad586e7c6 100644 --- a/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/cz_dashlet_limits.lng @@ -30,3 +30,4 @@ $wb['limit_domain_txt'] = 'Počet domén'; $wb['limit_mailquota_txt'] = 'Přiřazená e-mailová kvóta'; $wb['limit_web_quota_txt'] = 'Přiřazená webová kvóta'; $wb['limit_database_quota_txt'] = 'Přiřazená databázová kvóta'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; diff --git a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng index 22e87237d5..68f5e262c2 100644 --- a/interface/web/dashboard/lib/lang/de_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/de_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Anzahl der Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng b/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng index 402aa722f5..02c7125c23 100644 --- a/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/dk_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Antal af Domæner'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/el_dashlet_limits.lng b/interface/web/dashboard/lib/lang/el_dashlet_limits.lng index f51c1da1b5..fe9d66391d 100644 --- a/interface/web/dashboard/lib/lang/el_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/el_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng index 2e3bb8c086..f05b37f62e 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng @@ -31,4 +31,5 @@ $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; $wb['unlimited_txt'] = 'Unlimited'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/es_dashlet_limits.lng b/interface/web/dashboard/lib/lang/es_dashlet_limits.lng index d56d17c661..5e04a1ba61 100644 --- a/interface/web/dashboard/lib/lang/es_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/es_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['of_txt'] = 'de'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng b/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng index b15261dfc4..7f87485dfe 100644 --- a/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/fi_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng index fa5043ab85..7d46a22e6f 100644 --- a/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/fr_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng index 2aa1792f91..6eada3538e 100644 --- a/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/hr_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng b/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng index 76498eed86..67049d5137 100644 --- a/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/hu_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/id_dashlet_limits.lng b/interface/web/dashboard/lib/lang/id_dashlet_limits.lng index 94a64e226f..0e34d0e13d 100644 --- a/interface/web/dashboard/lib/lang/id_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/id_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng index 895f619864..8f2b2d70d8 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Numero domini'; $wb['limit_mailquota_txt'] = 'Quota mailbox assegnata'; $wb['limit_web_quota_txt'] = 'Quota web assegnata'; $wb['limit_database_quota_txt'] = 'Quota database assegnata'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng index b15261dfc4..7f87485dfe 100644 --- a/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ja_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng index 10bb89a3ea..e46d5f7649 100644 --- a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng @@ -31,4 +31,5 @@ $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; $wb['unlimited_txt'] = 'Ongelimiteerd'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng index 5513b32551..b4cdeb1d7a 100644 --- a/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/pl_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng b/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng index b15261dfc4..7f87485dfe 100644 --- a/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/pt_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng index b15261dfc4..7f87485dfe 100644 --- a/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ro_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng b/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng index 9e77f43d8d..c97f090052 100644 --- a/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/ru_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Количество доменов'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/se_dashlet_limits.lng b/interface/web/dashboard/lib/lang/se_dashlet_limits.lng index f02f83bffd..7cbd24f2fb 100644 --- a/interface/web/dashboard/lib/lang/se_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/se_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng b/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng index b15261dfc4..7f87485dfe 100644 --- a/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/sk_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng b/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng index 6a4a6a0d24..b48a81377a 100644 --- a/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/tr_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Etki Alanı Sayısı'; $wb['limit_mailquota_txt'] = 'E-posta Kutusu Alanı Kotası'; $wb['limit_web_quota_txt'] = 'Web Sitesi Alanı Kotası'; $wb['limit_database_quota_txt'] = 'Veritabanı Alanı Kotası'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> -- GitLab From c4cd74fca6595da99d816c4d31a72fe93dc61175 Mon Sep 17 00:00:00 2001 From: Thom Date: Fri, 4 Mar 2022 23:57:26 +0000 Subject: [PATCH 1339/1368] Improve PHP handler for apps vhost (#6296) --- install/tpl/apache_apps.vhost.master | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/install/tpl/apache_apps.vhost.master b/install/tpl/apache_apps.vhost.master index 8d6df71b7d..6957ed5eb8 100644 --- a/install/tpl/apache_apps.vhost.master +++ b/install/tpl/apache_apps.vhost.master @@ -9,10 +9,12 @@ ServerAdmin webmaster@localhost {tmpl_var name='apps_vhost_servername'} - - - SetHandler None - + + + + SetHandler None + + # SSL Configuration SSLEngine On @@ -96,7 +98,7 @@ DocumentRoot {tmpl_var name='apps_vhost_dir'} SuexecUserGroup ispapps ispapps - Options +Indexes +FollowSymLinks +MultiViews +ExecCGI + Options -Indexes +FollowSymLinks +MultiViews +ExecCGI AllowOverride AuthConfig Indexes Limit Options FileInfo SetHandler fcgid-script @@ -109,6 +111,8 @@ Allow from all
    + IPCCommTimeout 7200 + MaxRequestLen 15728640
    {tmpl_if name="use_rspamd"} -- GitLab From db636b5895d1b024100bb5d90914e4ba08781ad6 Mon Sep 17 00:00:00 2001 From: Thom Date: Sat, 5 Mar 2022 12:05:53 +0000 Subject: [PATCH 1340/1368] Redirect error 400 (http request to https port) to https (#5948) --- install/tpl/apache_ispconfig.vhost.master | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index 0d12694f7a..e38e39a8e1 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -112,4 +112,8 @@ NameVirtualHost *: SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors Off + + # Redirect http to https + ErrorDocument 400 "

    Error 400 - trying to redirect

    " + -- GitLab From 512763167ef48fd96e0c60bacb07b265266ddbb7 Mon Sep 17 00:00:00 2001 From: Thom Date: Sat, 5 Mar 2022 19:14:30 +0000 Subject: [PATCH 1341/1368] Remove the unlimited_txt string that is now included from the global lng file. --- interface/web/dashboard/lib/lang/en_dashlet_limits.lng | 1 - interface/web/dashboard/lib/lang/nl_dashlet_limits.lng | 1 - 2 files changed, 2 deletions(-) diff --git a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng index f05b37f62e..0306e6ead3 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng @@ -30,6 +30,5 @@ $wb['limit_domain_txt'] = 'Number of Domains'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; -$wb['unlimited_txt'] = 'Unlimited'; $wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng index e46d5f7649..9f00b2eeeb 100644 --- a/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/nl_dashlet_limits.lng @@ -30,6 +30,5 @@ $wb['limit_domain_txt'] = 'Aantal domeinen'; $wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; $wb['limit_web_quota_txt'] = 'Assigned web quota'; $wb['limit_database_quota_txt'] = 'Assigned database quota'; -$wb['unlimited_txt'] = 'Ongelimiteerd'; $wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> -- GitLab From 32aecc646b6cf5fd1c15de87249d52201728db0e Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Wed, 9 Mar 2022 08:50:54 +0000 Subject: [PATCH 1342/1368] Update validate_client.inc.php --- interface/lib/classes/validate_client.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php index 463f697c29..09e1df9e15 100644 --- a/interface/lib/classes/validate_client.inc.php +++ b/interface/lib/classes/validate_client.inc.php @@ -176,7 +176,7 @@ class validate_client { } try { ini_set("default_socket_timeout", 5); - $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); + $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl", array('connection_timeout' => 5)); $params = array('countryCode' => $cc, 'vatNumber' => $vn); try{ $r = $client->checkVat($params); -- GitLab From 993956a7e4c38bdc5570767e0259de4822faf556 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Sat, 12 Mar 2022 07:48:41 +0000 Subject: [PATCH 1343/1368] Update ispconfig.js --- interface/web/themes/default/assets/javascripts/ispconfig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/themes/default/assets/javascripts/ispconfig.js b/interface/web/themes/default/assets/javascripts/ispconfig.js index c634ff7fb2..18940f6f3b 100644 --- a/interface/web/themes/default/assets/javascripts/ispconfig.js +++ b/interface/web/themes/default/assets/javascripts/ispconfig.js @@ -739,7 +739,7 @@ $(document).on("click", "[data-uncheck-fields] > input[type='checkbox']", functi } }); -$(document).on('ready', function () { +$(document).ready(function() { $.fn.extend({ insertAtCaret: function(myValue){ return this.each(function(i) { -- GitLab From 6ef85318c3d32e9c38cf5fda6e787debb3b06b31 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 14 Mar 2022 12:18:51 +0000 Subject: [PATCH 1344/1368] Update letsencrypt.inc.php --- server/lib/classes/letsencrypt.inc.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index df6561bd66..6cb0f7927c 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -415,6 +415,10 @@ class letsencrypt { if($use_acme) { $letsencrypt_cmd = $this->get_acme_command($temp_domains, $key_file, $bundle_file, $crt_file, $server_type); $allow_return_codes = array(2); + // Cleanup ssl cert symlinks, if exists + if(@is_link($key_file)) unlink($key_file); + if(@is_link($bundle_file)) unlink($bundle_file); + if(@is_link($crt_file)) unlink($crt_file); } else { $letsencrypt_cmd = $this->get_certbot_command($temp_domains); umask($old_umask); -- GitLab From 39c76960d925220ee6507ae47bb0357c93e9b07c Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Tue, 15 Mar 2022 19:40:55 +0000 Subject: [PATCH 1345/1368] feat: Add filename/line data to DEBUG messages Also, tried to clean up the code formatting according to the guidelines _and_ added (most) entries for PHPDoc. --- server/lib/app.inc.php | 244 ++++++++++++++++++++++++++++++----------- 1 file changed, 178 insertions(+), 66 deletions(-) diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index e0e8c85db2..e4fb8bb24e 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -1,7 +1,6 @@ load('db_'.$conf['db_type']); + $this->load('db_' . $conf['db_type']); try { $this->db = new db; - } catch (Exception $e) { + } catch(Exception $e) { $this->db = false; } /* - Initialize the connection to the master DB, - if we are in a multiserver setup - */ + Initialize the connection to the master DB, + if we are in a multiserver setup + */ if($conf['dbmaster_host'] != '' && ($conf['dbmaster_host'] != $conf['db_host'] || ($conf['dbmaster_host'] == $conf['db_host'] && $conf['dbmaster_database'] != $conf['db_database']))) { try { @@ -67,14 +83,19 @@ class app { } else { $this->dbmaster = $this->db; } - - } + } // end constructor - } - + /** + * Getter method for some of the (valid) proprieties. + * + * @param string $name A valid property name to get. Will be checked for validity first! + * + * @return mixed + */ public function __get($name) { - $valid_names = array('functions', 'getconf', 'letsencrypt', 'modules', 'plugins', 'services', 'system'); + /** @var array List of all possible proprieties that are valid to get. */ + $valid_names = ['functions', 'getconf', 'letsencrypt', 'modules', 'plugins', 'services', 'system']; if(!in_array($name, $valid_names)) { trigger_error('Undefined property ' . $name . ' of class app', E_USER_WARNING); } @@ -89,14 +110,37 @@ class app { } } + /** + * Sets the calling script. + * + * @param callable $caller Calling script function. + * + * @return void + */ function setCaller($caller) { $this->_calling_script = $caller; } + /** + * Gets the calling script. + * + * Note that there is no error checking! + * + * @param void + * + * @return callable|null + */ function getCaller() { return $this->_calling_script; } + /** + * Emergency exit funcion. + * + * @param string $errmsg Error message to be displayedby the die() command on exit. + * + * @return void + */ function forceErrorExit($errmsg = 'undefined') { global $conf; @@ -106,16 +150,27 @@ class app { die('Exiting because of error: ' . $errmsg); } + /** + * Dynamic plugin loader and instantiator. + * + * This will include PHP scripts on demand, each representing a class to be loaded, + * and if the process succeeds, it will retrieve an instance for the class. + * + * @param string $classes A list of plugin classes to be loaded (e.g. their files will be included) + * and subsequently instantiated; it's a comma-separated string. + * + * @return void + */ function uses($classes) { - global $conf; + /** @var array|null List of classes to be used, as an array, after successful 'explosion' */ $cl = explode(',', $classes); if(is_array($cl)) { foreach($cl as $classname) { if(!@is_object($this->$classname)) { - if(is_file($conf['classpath'].'/'.$classname.'.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'].'/'.$classname.'.inc.php'))) { - include_once $conf['classpath'].'/'.$classname.'.inc.php'; + if(is_file($conf['classpath'] . '/' . $classname . '.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'] . '/' . $classname . '.inc.php'))) { + include_once $conf['classpath'] . '/' . $classname . '.inc.php'; $this->$classname = new $classname; } } @@ -123,64 +178,117 @@ class app { } } + /** + * Dynamic plugin loader (no instantation). + * + * Similar to uses() but does _not_ instantate a new class; files are merely included. + * die() is called on a failure to include the file for a class. + * + * @param string $classes A list of plugin classes to be loaded (e.g. their files will be included); + * it's a comma-separated string. + * + * @return void + */ function load($classes) { - global $conf; + /** @var array|null List of classes to be loaded, as an array, after successful 'explosion' */ $cl = explode(',', $classes); if(is_array($cl)) { foreach($cl as $classname) { - if(is_file($conf['classpath'].'/'.$classname.'.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'].'/'.$classname.'.inc.php'))) { - include_once $conf['classpath'].'/'.$classname.'.inc.php'; + if(is_file($conf['classpath'] . '/' . $classname . '.inc.php') && (DEVSYSTEM || !is_link($conf['classpath'] . '/' . $classname . '.inc.php'))) { + include_once $conf['classpath'] . '/' . $classname . '.inc.php'; } else { - die('Unable to load: '.$conf['classpath'].'/'.$classname.'.inc.php'); + die('Unable to load: ' . $conf['classpath'] . '/' . $classname . '.inc.php'); } } } } - /* - 0 = DEBUG - 1 = WARNING - 2 = ERROR - */ - + /** + * Logs a message with a certain priority to the different log backends. + * + * This method will check if the priority is equal or larger than what the user has + * defined as the minimum logging level, and will output to several logging facilities: + * - At the very least, the message will _usually_ go to stdout; + * - It may optionally also go to the file log (usually `/var/log/ispconfig/ispconfig.log`) + * which will be created if it doesn't exist; + * - When the $dblog parameter is set to true (the default), the message will also be logged + * to the database; + * - If the system is configured to send email messages to the administrator, + * this method will also handle those (assuming, again, that the priority matches). + * + * Debugging messages will also have the name of the calling module/script as well as a line number + * to assist error tracking (gwyneth 20220315). This incurs in a slight performance hit. + * + * @param string $msg The message to be logged. + * @param int $priority Should be set to 0 = DEBUG, 1 = WARNING or 2 = ERROR; anything else + * will skip setting the priority textual variable. + * @param bool $dblog Should the message also be logged to the database? (Default is _true_) + * + * @return void + * + * @note The error() method below seems to write to an invalid priority (3), which will cause + * no message priority text to be emitted, and will _force_ a database write and/or sending + * an email to the administrator. + */ function log($msg, $priority = 0, $dblog = true) { - global $conf; + /** + * @var string $file_line_caller + * + * For debugging, deal with retrieving caller information from the stack. (gwyneth 20220315) + * See https://stackoverflow.com/q/1252529/1035977 (including the precious comments!) for an explanation + * of how this works. + **/ + $file_line_caller = ""; + /** @var string Defined here because recent versions of PHP are stricter with scoping issues. (gwyneth 20220315) */ + $priority_txt = ''; + switch ($priority) { case 0: - $priority_txt = 'DEBUG'; - break; + $priority_txt = 'DEBUG'; + $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); // we don't need _all_ data, so we save some processing time here (gwyneth 20220315) + $caller = array_shift($bt); + $file_line_caller = '[' . strtr(basename($caller['file'], '.php'), '_', ' ') . ':' . $caller['line'] . '] '; + break; case 1: - $priority_txt = 'WARNING'; - break; + $priority_txt = 'WARNING'; + break; case 2: - $priority_txt = 'ERROR'; - break; + $priority_txt = 'ERROR'; + break; + // Note: $this->error() seems to use case 3 to deliberately skip setting a priority text. + // It will also *force* a write to the logs and/or send emails. (gwyneth 20220315) } - $log_msg = @date('d.m.Y-H:i').' - '.$priority_txt.' - '. $msg; + /** @var string Formatted message to be sent to the logging subsystems. */ + $log_msg = @date('d.m.Y-H:i') . ' - ' . $priority_txt .' ' . $file_line_caller . '- '. $msg; + + // Check if the user-set priority defines that this message should be output at all. if($priority >= $conf['log_priority']) { - //if (is_writable($conf["log_file"])) { - if (!$fp = fopen($conf['log_file'], 'a')) { + // Prepare to add a line on the logfile, or to create the logfile in + // append mode if it doesn't exist yet. Failure means that die() is called. + + //if(is_writable($conf["log_file"])) { + if(!$fp = fopen($conf['log_file'], 'a')) { die('Unable to open logfile.'); } - if (!fwrite($fp, $log_msg."\r\n")) { + if(!fwrite($fp, $log_msg . '\r\n')) { die('Unable to write to logfile.'); } - echo $log_msg."\n"; + echo $log_msg . "\n"; fclose($fp); - // Log to database + // Log to database. if($dblog === true && isset($this->dbmaster)) { $server_id = $conf['server_id']; $loglevel = $priority; $message = $msg; - $datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)?$this->modules->current_datalog_id:0; + $datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)? $this->modules->current_datalog_id : 0; if($datalog_id > 0) { $tmp_rec = $this->dbmaster->queryOneRecord("SELECT count(syslog_id) as number FROM sys_log WHERE datalog_id = ? AND loglevel = ?", $datalog_id, LOGLEVEL_ERROR); //* Do not insert duplicate errors into the web log. @@ -198,18 +306,18 @@ class app { // die("Unable to write to logfile."); //} - } // if + // Send an email to the administrator if the current priority demands it. if(isset($conf['admin_notify_priority']) && $priority >= $conf['admin_notify_priority'] && $conf['admin_mail'] != '') { if($conf['hostname'] != 'localhost' && $conf['hostname'] != '') { $hostname = $conf['hostname']; } else { $hostname = exec('hostname -f'); } - // send notification to admin + // Send notification to admin. $mailBody = $hostname . " - " . $log_msg; - $mailSubject = substr("[" . $hostname . "]" . " " . $log_msg, 0, 70).'...'; + $mailSubject = substr("[" . $hostname . "]" . " " . $log_msg, 0, 70) . '...'; $mailHeaders = "MIME-Version: 1.0" . "\n"; $mailHeaders .= "Content-type: text/plain; charset=utf-8" . "\n"; $mailHeaders .= "Content-Transfer-Encoding: 8bit" . "\n"; @@ -218,26 +326,30 @@ class app { mail($conf['admin_mail'], $mailSubject, $mailBody, $mailHeaders); } - } // func - - - /* - 0 = DEBUG - 1 = WARNING - 2 = ERROR - */ + } // func log + /** + * Logs a message with an undefined priority (3) and dies. + * + * This method writes to an invalid/undefined priority level (3), which will cause + * no message priority text to be emitted, but will _force_ a database write and/or sending + * an email to the administrator. + * + * @param string $msg The message to be logged. + * + * @return void + */ function error($msg) { - $this->log($msg, 3); + $this->log($msg, 3); // isn't this supposed to be error code 2? (gwyneth 20220315) die($msg); } - } -/* - Initialize application (app) object -*/ - +/** + * @var \app $app + * + * Initialize application object. + */ $app = new app; ?> -- GitLab From 894d9c58a97aba697621fb538936d759471b1927 Mon Sep 17 00:00:00 2001 From: Thom Date: Wed, 16 Mar 2022 18:37:11 +0000 Subject: [PATCH 1346/1368] Change regex to allow ' (#6270) --- interface/web/mail/form/mail_user_filter.tform.php | 2 +- interface/web/mailuser/form/mail_user_filter.tform.php | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/web/mail/form/mail_user_filter.tform.php b/interface/web/mail/form/mail_user_filter.tform.php index 1e5980af2d..f0ae4b6611 100644 --- a/interface/web/mail/form/mail_user_filter.tform.php +++ b/interface/web/mail/form/mail_user_filter.tform.php @@ -121,7 +121,7 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[\p{Latin}0-9\.\-\_\ \&\/]{0,100}$/u', + 'regex' => '/^[\p{Latin}0-9\.\'\-\_\ \&\/]{0,100}$/u', 'errmsg'=> 'target_error_regex'), ), 'default' => '', diff --git a/interface/web/mailuser/form/mail_user_filter.tform.php b/interface/web/mailuser/form/mail_user_filter.tform.php index ec693fff36..f9f59db31a 100644 --- a/interface/web/mailuser/form/mail_user_filter.tform.php +++ b/interface/web/mailuser/form/mail_user_filter.tform.php @@ -94,7 +94,6 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'SELECT', 'default' => '', - //'value' => array('contains'=>'contains_txt','is' => 'Is','begins'=>'Begins with','ends'=>'Ends with') 'value' => array('contains'=>'contains_txt', 'is'=>'is_txt', 'begins'=>'begins_with_txt', 'ends'=>'ends_with_txt', 'regex'=>'regex_txt', 'localpart'=>'localpart_txt', 'domain'=>'domain_txt') ), 'searchterm' => array ( @@ -122,7 +121,7 @@ $form["tabs"]['filter'] = array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', 'validators' => array ( 0 => array ( 'type' => 'REGEX', - 'regex' => '/^[\p{Latin}0-9\.\-\_\ \&\/]{0,100}$/u', + 'regex' => '/^[\p{Latin}0-9\.\'\-\_\ \&\/]{0,100}$/u', 'errmsg'=> 'target_error_regex'), ), 'default' => '', -- GitLab From c26713ccf7e29f7204d2cfffd37f8dcac5c8f4a0 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Fri, 18 Mar 2022 23:34:27 +0100 Subject: [PATCH 1347/1368] Add function to configure AppArmor (needed to allow use of /etc/bind for zone files) (#6701) --- install/dist/conf/centos52.conf.php | 3 +++ install/dist/conf/centos53.conf.php | 3 +++ install/dist/conf/centos70.conf.php | 3 +++ install/dist/conf/centos72.conf.php | 3 +++ install/dist/conf/centos80.conf.php | 3 +++ install/dist/conf/debian100.conf.php | 3 +++ install/dist/conf/debian110.conf.php | 3 +++ install/dist/conf/debian40.conf.php | 3 +++ install/dist/conf/debian60.conf.php | 3 +++ install/dist/conf/debian90.conf.php | 3 +++ install/dist/conf/debiantesting.conf.php | 3 +++ install/dist/conf/fedora32.conf.php | 3 +++ install/dist/conf/fedora33.conf.php | 3 +++ install/dist/conf/fedora9.conf.php | 3 +++ install/dist/conf/gentoo.conf.php | 3 +++ install/dist/conf/opensuse110.conf.php | 3 +++ install/dist/conf/opensuse112.conf.php | 3 +++ install/dist/conf/ubuntu1604.conf.php | 3 +++ install/dist/conf/ubuntu1710.conf.php | 3 +++ install/dist/conf/ubuntu1804.conf.php | 3 +++ install/dist/conf/ubuntu2004.conf.php | 3 +++ install/install.php | 6 ++++++ install/lib/installer_base.lib.php | 8 ++++++++ install/tpl/apparmor_usr.sbin.named | 2 ++ install/update.php | 6 ++++++ 25 files changed, 85 insertions(+) create mode 100644 install/tpl/apparmor_usr.sbin.named diff --git a/install/dist/conf/centos52.conf.php b/install/dist/conf/centos52.conf.php index 6dff93f65f..9a7e2d0cad 100644 --- a/install/dist/conf/centos52.conf.php +++ b/install/dist/conf/centos52.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos53.conf.php b/install/dist/conf/centos53.conf.php index 6dff93f65f..9a7e2d0cad 100644 --- a/install/dist/conf/centos53.conf.php +++ b/install/dist/conf/centos53.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos70.conf.php b/install/dist/conf/centos70.conf.php index 0465e5618a..efe166e079 100644 --- a/install/dist/conf/centos70.conf.php +++ b/install/dist/conf/centos70.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos72.conf.php b/install/dist/conf/centos72.conf.php index 8bb2ca5239..f4a3c937ba 100644 --- a/install/dist/conf/centos72.conf.php +++ b/install/dist/conf/centos72.conf.php @@ -224,4 +224,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/centos80.conf.php b/install/dist/conf/centos80.conf.php index 36e85e02d2..1a354d3644 100644 --- a/install/dist/conf/centos80.conf.php +++ b/install/dist/conf/centos80.conf.php @@ -224,4 +224,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian100.conf.php b/install/dist/conf/debian100.conf.php index b6b0dc4135..30f483980a 100644 --- a/install/dist/conf/debian100.conf.php +++ b/install/dist/conf/debian100.conf.php @@ -236,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian110.conf.php b/install/dist/conf/debian110.conf.php index 10f57d88a1..ce5bda7170 100644 --- a/install/dist/conf/debian110.conf.php +++ b/install/dist/conf/debian110.conf.php @@ -236,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian40.conf.php b/install/dist/conf/debian40.conf.php index c04a54e998..653b979a67 100644 --- a/install/dist/conf/debian40.conf.php +++ b/install/dist/conf/debian40.conf.php @@ -229,4 +229,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian60.conf.php b/install/dist/conf/debian60.conf.php index e7c8f59845..3577869bcd 100644 --- a/install/dist/conf/debian60.conf.php +++ b/install/dist/conf/debian60.conf.php @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debian90.conf.php b/install/dist/conf/debian90.conf.php index b253a31f22..1abbf732a1 100644 --- a/install/dist/conf/debian90.conf.php +++ b/install/dist/conf/debian90.conf.php @@ -236,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/debiantesting.conf.php b/install/dist/conf/debiantesting.conf.php index 3a06dfb86b..6564be0dab 100644 --- a/install/dist/conf/debiantesting.conf.php +++ b/install/dist/conf/debiantesting.conf.php @@ -236,4 +236,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/fedora32.conf.php b/install/dist/conf/fedora32.conf.php index 6701bb8729..0280959988 100644 --- a/install/dist/conf/fedora32.conf.php +++ b/install/dist/conf/fedora32.conf.php @@ -226,4 +226,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/fedora33.conf.php b/install/dist/conf/fedora33.conf.php index 873376fa2c..677731c01e 100644 --- a/install/dist/conf/fedora33.conf.php +++ b/install/dist/conf/fedora33.conf.php @@ -226,4 +226,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/fedora9.conf.php b/install/dist/conf/fedora9.conf.php index 23453ae48f..c05d21a155 100644 --- a/install/dist/conf/fedora9.conf.php +++ b/install/dist/conf/fedora9.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/gentoo.conf.php b/install/dist/conf/gentoo.conf.php index 23558a164d..057d397796 100644 --- a/install/dist/conf/gentoo.conf.php +++ b/install/dist/conf/gentoo.conf.php @@ -238,4 +238,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/opensuse110.conf.php b/install/dist/conf/opensuse110.conf.php index 37f5a14d3b..ac4f5a3e18 100644 --- a/install/dist/conf/opensuse110.conf.php +++ b/install/dist/conf/opensuse110.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget';; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/opensuse112.conf.php b/install/dist/conf/opensuse112.conf.php index 378320a144..eda4879004 100644 --- a/install/dist/conf/opensuse112.conf.php +++ b/install/dist/conf/opensuse112.conf.php @@ -221,4 +221,7 @@ $conf['cron']['wget'] = '/usr/bin/wget'; //* OpenVZ $conf['openvz']['installed'] = false; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu1604.conf.php b/install/dist/conf/ubuntu1604.conf.php index bd8d0bcd1c..1893a93fbf 100644 --- a/install/dist/conf/ubuntu1604.conf.php +++ b/install/dist/conf/ubuntu1604.conf.php @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu1710.conf.php b/install/dist/conf/ubuntu1710.conf.php index d365388549..b37c91291f 100644 --- a/install/dist/conf/ubuntu1710.conf.php +++ b/install/dist/conf/ubuntu1710.conf.php @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu1804.conf.php b/install/dist/conf/ubuntu1804.conf.php index fa96f7a5ca..9c27211413 100644 --- a/install/dist/conf/ubuntu1804.conf.php +++ b/install/dist/conf/ubuntu1804.conf.php @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/dist/conf/ubuntu2004.conf.php b/install/dist/conf/ubuntu2004.conf.php index 28d4bf3c14..72bf90d45e 100644 --- a/install/dist/conf/ubuntu2004.conf.php +++ b/install/dist/conf/ubuntu2004.conf.php @@ -232,4 +232,7 @@ $conf['xmpp']['installed'] = false; $conf['xmpp']['init_script'] = 'metronome'; +// AppArmor +$conf['apparmor']['installed'] = false; + ?> diff --git a/install/install.php b/install/install.php index b94c1c7f6f..9cc6bb5fa7 100644 --- a/install/install.php +++ b/install/install.php @@ -500,6 +500,12 @@ if($force) { swriteln('Configuring OpenVZ'); } +// Configure AppArmor +if($conf['apparmor']['installed']){ + swriteln('Configuring AppArmor'); + $inst->configure_apparmor(); +} + if($install_mode == 'standard' || strtolower($inst->simple_query('Configure Firewall Server', array('y', 'n'), 'y','configure_firewall')) == 'y') { //* Check for Firewall if(!$conf['ufw']['installed'] && !$conf['firewall']['installed']) { diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index dc45f209b4..bb5fd5d409 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -226,6 +226,7 @@ class installer_base { if(is_installed('named') || is_installed('bind') || is_installed('bind9')) $conf['bind']['installed'] = true; if(is_installed('squid')) $conf['squid']['installed'] = true; if(is_installed('nginx')) $conf['nginx']['installed'] = true; + if(is_installed('apparmor_status')) $conf['apparmor']['installed'] = true; if(is_installed('iptables') && is_installed('ufw')) { $conf['ufw']['installed'] = true; } elseif(is_installed('iptables')) { @@ -2478,6 +2479,13 @@ class installer_base { exec('chown root:root '.$conf["squid"]["config_dir"].'/'.$configfile); } + public function configure_apparmor() { + $configfile = 'apparmor_usr.sbin.named'; + if(is_file('/etc/apparmor.d/local/usr.sbin.named')) copy('/etc/apparmor.d/local/usr.sbin.named', '/etc/apparmor.d/local/usr.sbin.named~'); + $content = rf("tpl/".$configfile.".master"); + wf('/etc/apparmor.d/local/usr.sbin.named', $content); + } + public function configure_ufw_firewall() { if($this->is_update == false) { diff --git a/install/tpl/apparmor_usr.sbin.named b/install/tpl/apparmor_usr.sbin.named new file mode 100644 index 0000000000..38a30ffc87 --- /dev/null +++ b/install/tpl/apparmor_usr.sbin.named @@ -0,0 +1,2 @@ +/etc/bind/slave/** lrw, +/etc/bind/slave/ rw, diff --git a/install/update.php b/install/update.php index ef2e1fcfe3..56316546ac 100644 --- a/install/update.php +++ b/install/update.php @@ -512,6 +512,12 @@ if($reconfigure_services_answer == 'yes' || $reconfigure_services_answer == 'sel $inst->configure_xmpp('dont-create-certs'); } + // Configure AppArmor + if($conf['apparmor']['installed']){ + swriteln('Configuring AppArmor'); + $inst->configure_apparmor(); + } + if($conf['services']['firewall'] && $inst->reconfigure_app('Firewall', $reconfigure_services_answer)) { if($conf['ufw']['installed'] == true) { //* Configure Ubuntu Firewall -- GitLab From d4429a7d8e93de864851b73da934279e3b0b5b1c Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Sat, 19 Mar 2022 20:59:09 +0000 Subject: [PATCH 1348/1368] Good point; I'd even use `!empty($caller['file']) && !empty($caller['line'])` to save a few cycles in the (improbable) case where both _may_ be set, but empty (thus making the whole exercise pointless...). --- server/lib/app.inc.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index e4fb8bb24e..526ce3060e 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -251,7 +251,9 @@ class app { $priority_txt = 'DEBUG'; $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); // we don't need _all_ data, so we save some processing time here (gwyneth 20220315) $caller = array_shift($bt); - $file_line_caller = '[' . strtr(basename($caller['file'], '.php'), '_', ' ') . ':' . $caller['line'] . '] '; + if(isset($caller['file']) && isset($caller['line'])) { + $file_line_caller = '[' . strtr(basename($caller['file'], '.php'), '_', ' ') . ':' . $caller['line'] . '] '; + } break; case 1: $priority_txt = 'WARNING'; -- GitLab From 62974cc4060aca13465b1fd890b6d088f6282cb0 Mon Sep 17 00:00:00 2001 From: Gwyneth Llewelyn Date: Sat, 19 Mar 2022 21:08:46 +0000 Subject: [PATCH 1349/1368] Fix: make sure that 'file'/'line' are not empty There may be no guarantee that `$caller[...]` is actually set, or that either `file` or `line` are not empty. --- .gitignore | 36 +++++++++++++++++++++++++++++++++++- server/lib/app.inc.php | 4 +++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 81d5108cae..c49a12edc1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,39 @@ -.DS_Store .idea /nbproject/private/ .phplint-cache *.swp + +# macOS-specific things to exclude + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +Icon? + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Configuration for the Nova editor +.nova \ No newline at end of file diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index e4fb8bb24e..f8f4a30811 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -251,7 +251,9 @@ class app { $priority_txt = 'DEBUG'; $bt = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); // we don't need _all_ data, so we save some processing time here (gwyneth 20220315) $caller = array_shift($bt); - $file_line_caller = '[' . strtr(basename($caller['file'], '.php'), '_', ' ') . ':' . $caller['line'] . '] '; + if(!empty($caller['file']) && !empty($caller['line'])) { + $file_line_caller = '[' . strtr(basename($caller['file'], '.php'), '_', ' ') . ':' . $caller['line'] . '] '; + } break; case 1: $priority_txt = 'WARNING'; -- GitLab From 817a2800460198eb812815868280c489d424a119 Mon Sep 17 00:00:00 2001 From: Thom Date: Mon, 21 Mar 2022 12:30:48 +0000 Subject: [PATCH 1350/1368] Fix filename (add .master) (#6306) --- .../{apparmor_usr.sbin.named => apparmor_usr.sbin.named.master} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename install/tpl/{apparmor_usr.sbin.named => apparmor_usr.sbin.named.master} (100%) diff --git a/install/tpl/apparmor_usr.sbin.named b/install/tpl/apparmor_usr.sbin.named.master similarity index 100% rename from install/tpl/apparmor_usr.sbin.named rename to install/tpl/apparmor_usr.sbin.named.master -- GitLab From ee8e8f4f344fa76764092cfdbc59cc859f744c74 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Mon, 21 Mar 2022 11:58:32 -0600 Subject: [PATCH 1351/1368] add acme proxy functions to remote api --- interface/web/admin/lib/remote.conf.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/web/admin/lib/remote.conf.php b/interface/web/admin/lib/remote.conf.php index 9c2db8144e..d8bd2beffe 100644 --- a/interface/web/admin/lib/remote.conf.php +++ b/interface/web/admin/lib/remote.conf.php @@ -8,4 +8,6 @@ $function_list['admin_record_permissions'] = 'Record permission changes'; # $function_list['client_get_id,login,logout,mail_alias_get,mail_fetchmail_add,mail_fetchmail_delete,mail_fetchmail_get,mail_fetchmail_update,mail_policy_get,mail_spamfilter_blacklist_add,mail_spamfilter_blacklist_delete,mail_spamfilter_blacklist_get,mail_spamfilter_blacklist_update,mail_spamfilter_user_add,mail_spamfilter_user_get,mail_spamfilter_user_update,mail_spamfilter_whitelist_add,mail_spamfilter_whitelist_delete,mail_spamfilter_whitelist_get,mail_spamfilter_whitelist_update,mail_user_filter_add,mail_user_filter_delete,mail_user_filter_get,mail_user_filter_update,mail_user_get,mail_user_update,server_get,server_get_app_version'] = 'Roundcube plugins functions'; -?> +# functions used by ispc_acmeproxy: https://git.ispconfig.org/ispconfig/Modules/-/tree/master/ispc_acmeproxy +# +$function_list['client_get_by_username,client_get_id,dns_zone_get,dns_zone_get_by_user,dns_zone_update,dns_txt_add,dns_txt_get,dns_txt_delete'] = 'ISPC acme proxy functions'; -- GitLab From 6d16621bca3a1e58578b5ed81a411bc77e4de24a Mon Sep 17 00:00:00 2001 From: Thom Date: Tue, 22 Mar 2022 13:24:59 +0000 Subject: [PATCH 1352/1368] Apply 1 suggestion(s) to 1 file(s) --- interface/web/admin/lib/remote.conf.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/admin/lib/remote.conf.php b/interface/web/admin/lib/remote.conf.php index d8bd2beffe..56abdffee9 100644 --- a/interface/web/admin/lib/remote.conf.php +++ b/interface/web/admin/lib/remote.conf.php @@ -10,4 +10,4 @@ $function_list['client_get_id,login,logout,mail_alias_get,mail_fetchmail_add,mai # functions used by ispc_acmeproxy: https://git.ispconfig.org/ispconfig/Modules/-/tree/master/ispc_acmeproxy # -$function_list['client_get_by_username,client_get_id,dns_zone_get,dns_zone_get_by_user,dns_zone_update,dns_txt_add,dns_txt_get,dns_txt_delete'] = 'ISPC acme proxy functions'; +$function_list['client_get_by_username,client_get_id,dns_zone_get,dns_zone_get_by_user,dns_zone_update,dns_txt_add,dns_txt_get,dns_txt_delete'] = 'ISPConfig module: acme proxy functions'; -- GitLab From d08ae171d09c682158c24f0de38973e6d751447e Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 23 Mar 2022 12:32:59 +0000 Subject: [PATCH 1353/1368] Update remote.conf.php, change # to // --- interface/web/admin/lib/remote.conf.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/interface/web/admin/lib/remote.conf.php b/interface/web/admin/lib/remote.conf.php index 56abdffee9..fd94b6275e 100644 --- a/interface/web/admin/lib/remote.conf.php +++ b/interface/web/admin/lib/remote.conf.php @@ -3,11 +3,11 @@ $function_list['server_get,server_config_set,get_function_list,client_templates_get_all,server_get_serverid_by_ip,server_ip_get,server_ip_add,server_ip_update,server_ip_delete,system_config_set,system_config_get,config_value_get,config_value_add,config_value_update,config_value_replace,config_value_delete'] = 'Server functions'; $function_list['admin_record_permissions'] = 'Record permission changes'; -# Roundcube: generate list of actual soap methods used with: -# grep soap-\> /usr/share/roundcube/plugins/ispconfig3_*/ispconfig3_*.php | sed -e 's/^.*soap->//g' -e 's/(.*$//g' | sort -u | xargs | sed -e 's/ /,/g' -# +// Roundcube: generate list of actual soap methods used with: +// grep soap-\> /usr/share/roundcube/plugins/ispconfig3_*/ispconfig3_*.php | sed -e 's/^.*soap->//g' -e 's/(.*$//g' | sort -u | xargs | sed -e 's/ /,/g' +// $function_list['client_get_id,login,logout,mail_alias_get,mail_fetchmail_add,mail_fetchmail_delete,mail_fetchmail_get,mail_fetchmail_update,mail_policy_get,mail_spamfilter_blacklist_add,mail_spamfilter_blacklist_delete,mail_spamfilter_blacklist_get,mail_spamfilter_blacklist_update,mail_spamfilter_user_add,mail_spamfilter_user_get,mail_spamfilter_user_update,mail_spamfilter_whitelist_add,mail_spamfilter_whitelist_delete,mail_spamfilter_whitelist_get,mail_spamfilter_whitelist_update,mail_user_filter_add,mail_user_filter_delete,mail_user_filter_get,mail_user_filter_update,mail_user_get,mail_user_update,server_get,server_get_app_version'] = 'Roundcube plugins functions'; -# functions used by ispc_acmeproxy: https://git.ispconfig.org/ispconfig/Modules/-/tree/master/ispc_acmeproxy -# +// functions used by ispc_acmeproxy: https://git.ispconfig.org/ispconfig/Modules/-/tree/master/ispc_acmeproxy +// $function_list['client_get_by_username,client_get_id,dns_zone_get,dns_zone_get_by_user,dns_zone_update,dns_txt_add,dns_txt_get,dns_txt_delete'] = 'ISPConfig module: acme proxy functions'; -- GitLab From c65925bd8d8c6fd93c47efc06bb7583c63f56155 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 23 Mar 2022 13:58:55 +0100 Subject: [PATCH 1354/1368] - move dev collection sql to update file --- install/sql/incremental/upd_0096.sql | 19 +++++++++++++++++++ .../sql/incremental/upd_dev_collection.sql | 19 ------------------- 2 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 install/sql/incremental/upd_0096.sql diff --git a/install/sql/incremental/upd_0096.sql b/install/sql/incremental/upd_0096.sql new file mode 100644 index 0000000000..db4870ad66 --- /dev/null +++ b/install/sql/incremental/upd_0096.sql @@ -0,0 +1,19 @@ +-- create mail_relay_domain and load with current domains from mail_transport table +CREATE TABLE IF NOT EXISTS `mail_relay_domain` ( + `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT, + `sys_userid` int(11) NOT NULL DEFAULT '0', + `sys_groupid` int(11) NOT NULL DEFAULT '0', + `sys_perm_user` varchar(5) DEFAULT NULL, + `sys_perm_group` varchar(5) DEFAULT NULL, + `sys_perm_other` varchar(5) DEFAULT NULL, + `server_id` int(11) NOT NULL DEFAULT '0', + `domain` varchar(255) DEFAULT NULL, + `access` varchar(255) NOT NULL DEFAULT 'OK', + `active` varchar(255) NOT NULL DEFAULT 'y', + PRIMARY KEY (`relay_domain_id`), + UNIQUE KEY `domain` (`domain`, `server_id`) + ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; + +INSERT INTO `mail_relay_domain` SELECT NULL, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `domain`, 'OK', `active` FROM `mail_transport` WHERE `domain` NOT LIKE '%@%' AND `domain` LIKE '%.%' GROUP BY `domain`, `server_id`; + +ALTER TABLE `dns_soa` ADD `rendered_zone` MEDIUMTEXT NULL AFTER `dnssec_info`; diff --git a/install/sql/incremental/upd_dev_collection.sql b/install/sql/incremental/upd_dev_collection.sql index db4870ad66..e69de29bb2 100644 --- a/install/sql/incremental/upd_dev_collection.sql +++ b/install/sql/incremental/upd_dev_collection.sql @@ -1,19 +0,0 @@ --- create mail_relay_domain and load with current domains from mail_transport table -CREATE TABLE IF NOT EXISTS `mail_relay_domain` ( - `relay_domain_id` bigint(20) NOT NULL AUTO_INCREMENT, - `sys_userid` int(11) NOT NULL DEFAULT '0', - `sys_groupid` int(11) NOT NULL DEFAULT '0', - `sys_perm_user` varchar(5) DEFAULT NULL, - `sys_perm_group` varchar(5) DEFAULT NULL, - `sys_perm_other` varchar(5) DEFAULT NULL, - `server_id` int(11) NOT NULL DEFAULT '0', - `domain` varchar(255) DEFAULT NULL, - `access` varchar(255) NOT NULL DEFAULT 'OK', - `active` varchar(255) NOT NULL DEFAULT 'y', - PRIMARY KEY (`relay_domain_id`), - UNIQUE KEY `domain` (`domain`, `server_id`) - ) DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; - -INSERT INTO `mail_relay_domain` SELECT NULL, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_id`, `domain`, 'OK', `active` FROM `mail_transport` WHERE `domain` NOT LIKE '%@%' AND `domain` LIKE '%.%' GROUP BY `domain`, `server_id`; - -ALTER TABLE `dns_soa` ADD `rendered_zone` MEDIUMTEXT NULL AFTER `dnssec_info`; -- GitLab From b300e590bbe916ce22cac51027458210319a6839 Mon Sep 17 00:00:00 2001 From: Thom Date: Thu, 24 Mar 2022 13:17:36 +0000 Subject: [PATCH 1355/1368] Fix line break issue (#6309) --- server/lib/app.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index f8f4a30811..e6b88ddc81 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -278,7 +278,7 @@ class app { die('Unable to open logfile.'); } - if(!fwrite($fp, $log_msg . '\r\n')) { + if(!fwrite($fp, $log_msg . "\r\n")) { die('Unable to write to logfile.'); } -- GitLab From 7302af358afae0b3f6bcaf88572fcdbdc06fddb3 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Mar 2022 13:23:25 +0000 Subject: [PATCH 1356/1368] Update app.inc.php --- server/lib/app.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index e6b88ddc81..04f2ec5cc4 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -266,7 +266,7 @@ class app { } /** @var string Formatted message to be sent to the logging subsystems. */ - $log_msg = @date('d.m.Y-H:i') . ' - ' . $priority_txt .' ' . $file_line_caller . '- '. $msg; + $log_msg = @date('d.m.Y-H:i') . ' - ' . $priority_txt . ' ' . $file_line_caller . ' - '. $msg; // Check if the user-set priority defines that this message should be output at all. if($priority >= $conf['log_priority']) { -- GitLab From 1e57465c166f703ba188db5d60d7816dc61790ac Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 24 Mar 2022 13:40:50 +0000 Subject: [PATCH 1357/1368] Apply 1 suggestion(s) to 1 file(s) --- server/lib/app.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index 04f2ec5cc4..ea6bf27977 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -266,7 +266,7 @@ class app { } /** @var string Formatted message to be sent to the logging subsystems. */ - $log_msg = @date('d.m.Y-H:i') . ' - ' . $priority_txt . ' ' . $file_line_caller . ' - '. $msg; + $log_msg = @date('d.m.Y-H:i') . ' - ' . $priority_txt . ' ' . $file_line_caller . '- '. $msg; // Check if the user-set priority defines that this message should be output at all. if($priority >= $conf['log_priority']) { -- GitLab From e240dde9e0a278632f4bb3a3fb990ca3d921f7a4 Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 24 Mar 2022 14:50:12 +0000 Subject: [PATCH 1358/1368] Avoid symlink() error if acme conf already exists as a file. --- install/lib/installer_base.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index bb5fd5d409..94e7a2e6d0 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -2875,7 +2875,7 @@ class installer_base { if(@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { unlink($vhost_conf_enabled_dir.'/' . $use_symlink); } - if(!@is_link($vhost_conf_enabled_dir.'/' . $use_symlink)) { + if(!@is_file($vhost_conf_enabled_dir.'/' . $use_symlink)) { symlink($vhost_conf_dir.'/' . $use_name, $vhost_conf_enabled_dir.'/' . $use_symlink); } } -- GitLab From e09bbc10727023bab0b360babac9f11868fe641a Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 24 Mar 2022 09:34:37 -0600 Subject: [PATCH 1359/1368] add compatibility functions to server/ environment --- server/lib/app.inc.php | 2 + server/lib/compatibility.inc.php | 80 ++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 server/lib/compatibility.inc.php diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index ea6bf27977..a2e2dcf19b 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -27,6 +27,8 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ +require_once 'compatibility.inc.php'; + // Set timezone if(isset($conf['timezone']) && $conf['timezone'] != '') { // note: !empty($conf['timezone']) should give the same result and is more idiomatic for current versions of PHP (gwyneth 20220315) date_default_timezone_set($conf['timezone']); diff --git a/server/lib/compatibility.inc.php b/server/lib/compatibility.inc.php new file mode 100644 index 0000000000..562e07ada4 --- /dev/null +++ b/server/lib/compatibility.inc.php @@ -0,0 +1,80 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* random_bytes can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_bytes')) { + function random_bytes($length) { + return openssl_random_pseudo_bytes($length); + } +} + +/* random_int can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_int')) { + function random_int($min=null, $max=null) { + if (null === $min) { + $min = PHP_INT_MIN; + } + + if (null === $max) { + $min = PHP_INT_MAX; + } + + if (!is_int($min) || !is_int($max)) { + trigger_error('random_int: $min and $max must be integer values', E_USER_NOTICE); + $min = (int)$min; + $max = (int)$max; + } + + if ($min > $max) { + trigger_error('random_int: $max can\'t be lesser than $min', E_USER_WARNING); + return null; + } + + $range = $counter = $max - $min; + $bits = 1; + + while ($counter >>= 1) { + ++$bits; + } + + $bytes = (int)max(ceil($bits/8), 1); + $bitmask = pow(2, $bits) - 1; + + if ($bitmask >= PHP_INT_MAX) { + $bitmask = PHP_INT_MAX; + } + + do { + $result = hexdec(bin2hex(random_bytes($bytes))) & $bitmask; + } while ($result > $range); + + return $result + $min; + } +} -- GitLab From 9be73c126d32f62a3774fe3d0931b17022645f7e Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 24 Mar 2022 09:37:49 -0600 Subject: [PATCH 1360/1368] add compatibility functions to installer environment --- install/lib/compatibility.inc.php | 80 +++++++++++++++++++++++++++++++ install/lib/install.lib.php | 1 + 2 files changed, 81 insertions(+) create mode 100644 install/lib/compatibility.inc.php diff --git a/install/lib/compatibility.inc.php b/install/lib/compatibility.inc.php new file mode 100644 index 0000000000..562e07ada4 --- /dev/null +++ b/install/lib/compatibility.inc.php @@ -0,0 +1,80 @@ + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +/* random_bytes can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_bytes')) { + function random_bytes($length) { + return openssl_random_pseudo_bytes($length); + } +} + +/* random_int can be dropped when php 5.6 support is dropped */ +if (! function_exists('random_int')) { + function random_int($min=null, $max=null) { + if (null === $min) { + $min = PHP_INT_MIN; + } + + if (null === $max) { + $min = PHP_INT_MAX; + } + + if (!is_int($min) || !is_int($max)) { + trigger_error('random_int: $min and $max must be integer values', E_USER_NOTICE); + $min = (int)$min; + $max = (int)$max; + } + + if ($min > $max) { + trigger_error('random_int: $max can\'t be lesser than $min', E_USER_WARNING); + return null; + } + + $range = $counter = $max - $min; + $bits = 1; + + while ($counter >>= 1) { + ++$bits; + } + + $bytes = (int)max(ceil($bits/8), 1); + $bitmask = pow(2, $bits) - 1; + + if ($bitmask >= PHP_INT_MAX) { + $bitmask = PHP_INT_MAX; + } + + do { + $result = hexdec(bin2hex(random_bytes($bytes))) & $bitmask; + } while ($result > $range); + + return $result + $min; + } +} diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 0f57e1f456..88021a8881 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -29,6 +29,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ error_reporting(E_ALL|E_STRICT); +require_once 'compatibility.inc.php'; $FILE = realpath('../install.php'); -- GitLab From d31c4af6a49252ca812ade3ae34731a3db1e5743 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Thu, 24 Mar 2022 16:02:10 +0000 Subject: [PATCH 1361/1368] Update installer_base.lib.php --- install/lib/installer_base.lib.php | 1 + 1 file changed, 1 insertion(+) diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php index bb5fd5d409..b53d5ccc16 100644 --- a/install/lib/installer_base.lib.php +++ b/install/lib/installer_base.lib.php @@ -249,6 +249,7 @@ class installer_base { $msg = ''; if(version_compare(phpversion(), '5.4', '<')) $msg .= "PHP Version 5.4 or newer is required. The currently used PHP version is ".phpversion().".\n"; + if(version_compare(phpversion(), '8.0', '>=')) $msg .= "PHP Version 8 is not supported yet. Change PHP version back to the default version of the OS. The currently used PHP version is ".phpversion().".\n"; if(!function_exists('curl_init')) $msg .= "PHP Curl Module is missing.\n"; if(!function_exists('mysqli_connect')) $msg .= "PHP MySQLi Module is nmissing.\n"; if(!function_exists('mb_detect_encoding')) $msg .= "PHP Multibyte Module (MB) is missing.\n"; -- GitLab From 5cf9e792644733df63f48b3aab8a7a17be50f9dc Mon Sep 17 00:00:00 2001 From: Jesse Norell Date: Thu, 24 Mar 2022 10:27:35 -0600 Subject: [PATCH 1362/1368] version check for loading compatibility functions --- install/lib/install.lib.php | 4 +++- interface/lib/app.inc.php | 4 +++- server/lib/app.inc.php | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/install/lib/install.lib.php b/install/lib/install.lib.php index 88021a8881..d9b482a842 100644 --- a/install/lib/install.lib.php +++ b/install/lib/install.lib.php @@ -29,7 +29,9 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ error_reporting(E_ALL|E_STRICT); -require_once 'compatibility.inc.php'; +if(version_compare(phpversion(), '7.0', '<')) { + require_once 'compatibility.inc.php'; +} $FILE = realpath('../install.php'); diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php index 7ff158fbdc..96e8a1ddef 100755 --- a/interface/lib/app.inc.php +++ b/interface/lib/app.inc.php @@ -28,7 +28,9 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -require_once 'compatibility.inc.php'; +if(version_compare(phpversion(), '7.0', '<')) { + require_once 'compatibility.inc.php'; +} //* Enable gzip compression for the interface ob_start('ob_gzhandler'); diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php index a2e2dcf19b..ffd20e9fb6 100644 --- a/server/lib/app.inc.php +++ b/server/lib/app.inc.php @@ -27,7 +27,9 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -require_once 'compatibility.inc.php'; +if(version_compare(phpversion(), '7.0', '<')) { + require_once 'compatibility.inc.php'; +} // Set timezone if(isset($conf['timezone']) && $conf['timezone'] != '') { // note: !empty($conf['timezone']) should give the same result and is more idiomatic for current versions of PHP (gwyneth 20220315) -- GitLab From 72bdcce1f9c1774f92724dc4a7b80acaae42f08d Mon Sep 17 00:00:00 2001 From: Thom Date: Fri, 25 Mar 2022 22:52:21 +0000 Subject: [PATCH 1363/1368] Fix typo in error 400 redirect script (#6319) --- install/tpl/apache_ispconfig.vhost.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/apache_ispconfig.vhost.master b/install/tpl/apache_ispconfig.vhost.master index e38e39a8e1..df0b98fda7 100644 --- a/install/tpl/apache_ispconfig.vhost.master +++ b/install/tpl/apache_ispconfig.vhost.master @@ -114,6 +114,6 @@ NameVirtualHost *: # Redirect http to https - ErrorDocument 400 "

    Error 400 - trying to redirect

    " + ErrorDocument 400 "

    Error 400 - trying to redirect

    " -- GitLab From 406cd69eb3a4da05c9ea4c278c678aff440edec4 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Mar 2022 17:59:15 +0100 Subject: [PATCH 1364/1368] Updated Italian translation (#6317) --- .../admin/lib/lang/it_directive_snippets.lng | 12 +- .../lib/lang/it_directive_snippets_list.lng | 6 +- .../web/admin/lib/lang/it_groups_list.lng | 2 +- interface/web/admin/lib/lang/it_iptables.lng | 18 +- .../web/admin/lib/lang/it_iptables_list.lng | 16 +- .../admin/lib/lang/it_language_complete.lng | 8 +- .../web/admin/lib/lang/it_language_edit.lng | 8 +- .../web/admin/lib/lang/it_language_import.lng | 2 +- .../web/admin/lib/lang/it_remote_action.lng | 16 +- .../web/admin/lib/lang/it_remote_user.lng | 62 ++-- .../web/admin/lib/lang/it_server_config.lng | 297 ++++++++------- interface/web/admin/lib/lang/it_server_ip.lng | 8 +- .../web/admin/lib/lang/it_server_ip_list.lng | 4 +- .../web/admin/lib/lang/it_server_ip_map.lng | 22 +- .../admin/lib/lang/it_server_ip_map_list.lng | 8 +- .../web/admin/lib/lang/it_server_php.lng | 28 +- .../admin/lib/lang/it_software_package.lng | 6 + .../lib/lang/it_software_package_install.lng | 6 + .../lib/lang/it_software_package_list.lng | 13 + .../web/admin/lib/lang/it_software_repo.lng | 8 + .../admin/lib/lang/it_software_repo_list.lng | 6 + .../lib/lang/it_software_update_list.lng | 9 + .../web/admin/lib/lang/it_system_config.lng | 159 ++++---- .../admin/lib/lang/it_tpl_default_admin.lng | 24 +- interface/web/admin/lib/lang/it_users.lng | 16 +- .../web/admin/lib/lang/it_users_list.lng | 2 +- interface/web/client/lib/lang/it_client.lng | 238 ++++++------ .../web/client/lib/lang/it_client_circle.lng | 10 +- .../client/lib/lang/it_client_circle_list.lng | 10 +- .../web/client/lib/lang/it_client_del.lng | 8 +- .../web/client/lib/lang/it_client_message.lng | 34 +- .../lib/lang/it_client_message_template.lng | 22 +- .../lang/it_client_message_template_list.lng | 6 +- .../client/lib/lang/it_client_template.lng | 138 +++---- .../lib/lang/it_client_template_list.lng | 4 +- .../web/client/lib/lang/it_clients_list.lng | 6 +- interface/web/client/lib/lang/it_domain.lng | 2 +- interface/web/client/lib/lang/it_reseller.lng | 348 +++++++++--------- .../web/client/lib/lang/it_resellers_list.lng | 2 +- .../dashboard/lib/lang/it_dashlet_donate.lng | 10 +- .../it_dashlet_invoice_client_settings.lng | 2 +- .../lib/lang/it_dashlet_invoices.lng | 28 +- .../dashboard/lib/lang/it_dashlet_limits.lng | 7 +- .../lib/lang/it_dashlet_mailquota.lng | 2 +- .../lib/lang/it_dashlet_products.lng | 12 +- .../dashboard/lib/lang/it_dashlet_shop.lng | 12 +- interface/web/dns/lib/lang/it_dns_a.lng | 22 +- interface/web/dns/lib/lang/it_dns_a_list.lng | 14 +- interface/web/dns/lib/lang/it_dns_aaaa.lng | 2 +- interface/web/dns/lib/lang/it_dns_alias.lng | 18 +- interface/web/dns/lib/lang/it_dns_caa.lng | 30 +- interface/web/dns/lib/lang/it_dns_cname.lng | 4 +- interface/web/dns/lib/lang/it_dns_dkim.lng | 20 +- interface/web/dns/lib/lang/it_dns_dmarc.lng | 90 ++--- interface/web/dns/lib/lang/it_dns_dname.lng | 2 +- interface/web/dns/lib/lang/it_dns_ds.lng | 24 +- interface/web/dns/lib/lang/it_dns_hinfo.lng | 20 +- interface/web/dns/lib/lang/it_dns_import.lng | 24 +- interface/web/dns/lib/lang/it_dns_loc.lng | 20 +- interface/web/dns/lib/lang/it_dns_mx.lng | 16 +- interface/web/dns/lib/lang/it_dns_naptr.lng | 28 +- interface/web/dns/lib/lang/it_dns_ns.lng | 4 +- interface/web/dns/lib/lang/it_dns_ptr.lng | 18 +- interface/web/dns/lib/lang/it_dns_rp.lng | 18 +- interface/web/dns/lib/lang/it_dns_slave.lng | 22 +- .../dns/lib/lang/it_dns_slave_admin_list.lng | 6 +- .../web/dns/lib/lang/it_dns_slave_list.lng | 2 +- interface/web/dns/lib/lang/it_dns_soa.lng | 50 ++- .../dns/lib/lang/it_dns_soa_admin_list.lng | 8 +- .../web/dns/lib/lang/it_dns_soa_list.lng | 10 +- interface/web/dns/lib/lang/it_dns_spf.lng | 50 +-- interface/web/dns/lib/lang/it_dns_srv.lng | 20 +- interface/web/dns/lib/lang/it_dns_sshfp.lng | 22 +- .../web/dns/lib/lang/it_dns_template.lng | 8 +- .../web/dns/lib/lang/it_dns_template_list.lng | 4 +- interface/web/dns/lib/lang/it_dns_tlsa.lng | 24 +- interface/web/dns/lib/lang/it_dns_txt.lng | 24 +- interface/web/dns/lib/lang/it_dns_wizard.lng | 28 +- .../lib/lang/it_faq_manage_questions_list.lng | 2 +- .../web/help/lib/lang/it_support_message.lng | 2 +- .../help/lib/lang/it_support_message_list.lng | 2 +- .../mail/lib/lang/it_backup_stats_list.lng | 8 +- interface/web/mail/lib/lang/it_mail_alias.lng | 10 +- .../web/mail/lib/lang/it_mail_alias_list.lng | 4 +- .../web/mail/lib/lang/it_mail_aliasdomain.lng | 14 +- .../lib/lang/it_mail_aliasdomain_list.lng | 8 +- .../web/mail/lib/lang/it_mail_backup_list.lng | 26 +- .../web/mail/lib/lang/it_mail_blacklist.lng | 16 +- .../mail/lib/lang/it_mail_blacklist_list.lng | 8 +- .../mail/lib/lang/it_mail_content_filter.lng | 2 +- .../lib/lang/it_mail_content_filter_list.lng | 4 +- .../web/mail/lib/lang/it_mail_domain.lng | 25 +- .../mail/lib/lang/it_mail_domain_catchall.lng | 18 +- .../lib/lang/it_mail_domain_catchall_list.lng | 4 +- .../web/mail/lib/lang/it_mail_domain_list.lng | 2 +- .../web/mail/lib/lang/it_mail_forward.lng | 14 +- .../mail/lib/lang/it_mail_forward_list.lng | 6 +- interface/web/mail/lib/lang/it_mail_get.lng | 14 +- .../web/mail/lib/lang/it_mail_get_list.lng | 8 +- .../web/mail/lib/lang/it_mail_mailinglist.lng | 16 +- .../mail/lib/lang/it_mail_relay_recipient.lng | 6 +- .../lib/lang/it_mail_relay_recipient_list.lng | 10 +- .../mail/lib/lang/it_mail_spamfilter_list.lng | 2 +- .../web/mail/lib/lang/it_mail_transport.lng | 6 +- .../mail/lib/lang/it_mail_transport_list.lng | 2 +- interface/web/mail/lib/lang/it_mail_user.lng | 62 ++-- .../web/mail/lib/lang/it_mail_user_filter.lng | 26 +- .../web/mail/lib/lang/it_mail_whitelist.lng | 18 +- .../mail/lib/lang/it_mail_whitelist_list.lng | 8 +- .../mail/lib/lang/it_spamfilter_blacklist.lng | 2 +- .../mail/lib/lang/it_spamfilter_config.lng | 4 +- .../mail/lib/lang/it_spamfilter_policy.lng | 96 ++--- .../lib/lang/it_spamfilter_policy_list.lng | 12 +- .../web/mail/lib/lang/it_spamfilter_users.lng | 6 +- .../lib/lang/it_spamfilter_users_list.lng | 8 +- .../mail/lib/lang/it_spamfilter_whitelist.lng | 2 +- .../lib/lang/it_spamfilter_whitelist_list.lng | 2 +- .../web/mail/lib/lang/it_xmpp_domain.lng | 110 +++--- .../lib/lang/it_xmpp_domain_admin_list.lng | 10 +- .../web/mail/lib/lang/it_xmpp_domain_list.lng | 8 +- interface/web/mail/lib/lang/it_xmpp_user.lng | 20 +- .../web/mail/lib/lang/it_xmpp_user_list.lng | 10 +- interface/web/mailuser/lib/lang/it_index.lng | 4 +- .../web/mailuser/lib/lang/it_mail_user_cc.lng | 6 +- .../mailuser/lib/lang/it_mail_user_filter.lng | 8 +- .../lib/lang/it_mail_user_filter_list.lng | 8 +- .../lib/lang/it_mail_user_spamfilter.lng | 4 +- .../lib/lang/it_dataloghistory_list.lng | 6 +- .../lib/lang/it_dataloghistory_undo.lng | 10 +- .../lib/lang/it_dataloghistory_view.lng | 46 +-- .../web/monitor/lib/lang/it_syslog_list.lng | 3 - interface/web/sites/lib/lang/it_aps.lng | 8 +- .../sites/lib/lang/it_backup_stats_list.lng | 12 +- interface/web/sites/lib/lang/it_cron.lng | 6 +- interface/web/sites/lib/lang/it_database.lng | 14 +- .../web/sites/lib/lang/it_database_list.lng | 2 +- .../lib/lang/it_database_quota_stats_list.lng | 4 +- .../web/sites/lib/lang/it_database_user.lng | 10 +- .../lib/lang/it_ftp_sites_stats_list.lng | 12 +- interface/web/sites/lib/lang/it_ftp_user.lng | 10 +- .../web/sites/lib/lang/it_shell_user.lng | 14 +- .../web/sites/lib/lang/it_web_aliasdomain.lng | 62 ++-- .../lib/lang/it_web_aliasdomain_list.lng | 4 +- .../web/sites/lib/lang/it_web_backup_list.lng | 71 ++-- .../web/sites/lib/lang/it_web_childdomain.lng | 176 ++++----- .../lib/lang/it_web_childdomain_list.lng | 8 +- .../lib/lang/it_web_directive_snippets.lng | 2 +- .../web/sites/lib/lang/it_web_domain.lng | 44 +-- .../web/sites/lib/lang/it_web_folder.lng | 2 +- .../web/sites/lib/lang/it_web_subdomain.lng | 48 +-- .../sites/lib/lang/it_web_vhost_domain.lng | 290 +++++++-------- .../lang/it_web_vhost_domain_admin_list.lng | 20 +- .../lib/lang/it_web_vhost_domain_list.lng | 10 +- .../sites/lib/lang/it_web_vhost_subdomain.lng | 144 ++++---- .../web/sites/lib/lang/it_webdav_user.lng | 10 +- .../tools/lib/lang/it_import_ispconfig.lng | 42 +-- .../web/tools/lib/lang/it_import_vpopmail.lng | 10 +- interface/web/tools/lib/lang/it_index.lng | 4 +- interface/web/tools/lib/lang/it_interface.lng | 7 + interface/web/tools/lib/lang/it_resync.lng | 88 ++--- .../web/tools/lib/lang/it_tpl_default.lng | 10 +- .../web/tools/lib/lang/it_usersettings.lng | 16 +- .../web/vm/lib/lang/it_openvz_ostemplate.lng | 10 +- .../vm/lib/lang/it_openvz_ostemplate_list.lng | 2 +- .../web/vm/lib/lang/it_openvz_template.lng | 14 +- .../vm/lib/lang/it_openvz_template_list.lng | 4 +- interface/web/vm/lib/lang/it_openvz_vm.lng | 12 +- .../web/vm/lib/lang/it_openvz_vm_list.lng | 2 +- 168 files changed, 2152 insertions(+), 2109 deletions(-) create mode 100644 interface/web/admin/lib/lang/it_software_package.lng create mode 100644 interface/web/admin/lib/lang/it_software_package_install.lng create mode 100644 interface/web/admin/lib/lang/it_software_package_list.lng create mode 100644 interface/web/admin/lib/lang/it_software_repo.lng create mode 100644 interface/web/admin/lib/lang/it_software_repo_list.lng create mode 100644 interface/web/admin/lib/lang/it_software_update_list.lng create mode 100644 interface/web/tools/lib/lang/it_interface.lng diff --git a/interface/web/admin/lib/lang/it_directive_snippets.lng b/interface/web/admin/lib/lang/it_directive_snippets.lng index 35e17caaff..1e7d3109a1 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets.lng @@ -7,9 +7,9 @@ $wb['active_txt'] = 'Attivo'; $wb['directive_snippets_name_empty'] = 'Indicare un nome per lo snippet.'; $wb['directive_snippets_name_error_unique'] = 'Esiste già una direttiva snippet con questo nome.'; $wb['variables_txt'] = 'Variabili'; -$wb['customer_viewable_txt'] = 'Customer viewable'; -$wb['required_php_snippets_txt'] = 'Required PHP Snippet'; -$wb['update_sites_txt'] = 'Update sites using this snippet'; -$wb['error_hide_snippet_active_sites'] = 'You cannot hide this snippet from customers as it is currently used by existing websites.'; -$wb['error_disable_snippet_active_sites'] = 'You cannot disable this snippet as it is currently used by existing websites.'; -$wb['error_delete_snippet_active_sites'] = 'You cannot delete this snippet as it is currently used by existing websites.'; \ No newline at end of file +$wb['customer_viewable_txt'] = 'Cliente visibile'; +$wb['required_php_snippets_txt'] = 'Richiedi Snippet PHP'; +$wb['update_sites_txt'] = 'Aggiorna i siti usando questo snippet'; +$wb['error_hide_snippet_active_sites'] = 'Non puoi nascondere questo snippet poichè e già usato dai siti web esistenti.'; +$wb['error_disable_snippet_active_sites'] = 'Non puoi disabilitare questo snippet poichè e già usato dai siti web esistenti.'; +$wb['error_delete_snippet_active_sites'] = 'Non puoi cancellare questo snippet poichè e già usato dai siti web esistenti.'; diff --git a/interface/web/admin/lib/lang/it_directive_snippets_list.lng b/interface/web/admin/lib/lang/it_directive_snippets_list.lng index 7bb90ce943..b1d82a1caa 100644 --- a/interface/web/admin/lib/lang/it_directive_snippets_list.lng +++ b/interface/web/admin/lib/lang/it_directive_snippets_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/it_groups_list.lng b/interface/web/admin/lib/lang/it_groups_list.lng index 52cdce78e7..f816bcca86 100644 --- a/interface/web/admin/lib/lang/it_groups_list.lng +++ b/interface/web/admin/lib/lang/it_groups_list.lng @@ -3,5 +3,5 @@ $wb['list_head_txt'] = 'Gruppi utenti sistema'; $wb['description_txt'] = 'Descrizione'; $wb['name_txt'] = 'Gruppo'; $wb['add_new_record_txt'] = 'Aggiungi nuovo gruppo'; -$wb['warning_txt'] = 'ATTENZIONE: Non editare o modificare alcuna impostazione utente da qui. Utilizzare invece le impostazioni del modulo nella sezione Clienti- e Rivenditori. Modificare o cambiare Utenti o Gruppi in questa sezione può causare perdita di dati!'; +$wb['warning_txt'] = 'ATTENZIONE: Non editare o modificare alcuna impostazione utente da qui. Utilizzare invece le impostazioni del modulo nella sezione Clienti e Rivenditori. Modificare o cambiare Utenti o Gruppi in questa sezione può causare perdita di dati!'; ?> diff --git a/interface/web/admin/lib/lang/it_iptables.lng b/interface/web/admin/lib/lang/it_iptables.lng index 8fb963ebec..24016ff7c8 100644 --- a/interface/web/admin/lib/lang/it_iptables.lng +++ b/interface/web/admin/lib/lang/it_iptables.lng @@ -1,13 +1,13 @@ diff --git a/interface/web/admin/lib/lang/it_iptables_list.lng b/interface/web/admin/lib/lang/it_iptables_list.lng index 76fbcaff85..f8248869d8 100644 --- a/interface/web/admin/lib/lang/it_iptables_list.lng +++ b/interface/web/admin/lib/lang/it_iptables_list.lng @@ -2,14 +2,14 @@ $wb['list_head_txt'] = 'IPTables'; $wb['add_new_rule_txt'] = 'Aggiungi Regola IPTables'; $wb['server_id_txt'] = 'Server'; -$wb['multiport_txt'] = 'Multi Port'; -$wb['singleport_txt'] = 'Single Port'; -$wb['protocol_txt'] = 'Protocol'; -$wb['table_txt'] = 'Table'; -$wb['target_txt'] = 'Target'; -$wb['state_txt'] = 'State'; -$wb['destination_ip_txt'] = 'Destination Address'; -$wb['source_ip_txt'] = 'Source Address'; +$wb['multiport_txt'] = 'Multi Porta'; +$wb['singleport_txt'] = 'Singola Porta'; +$wb['protocol_txt'] = 'Protocollo'; +$wb['table_txt'] = 'Tavola'; +$wb['target_txt'] = 'Obiettivo'; +$wb['state_txt'] = 'Stato'; +$wb['destination_ip_txt'] = 'Indirizzo Destinazione'; +$wb['source_ip_txt'] = 'Indirizzo Sorgente'; $wb['active_txt'] = 'Attivo'; $wb['iptables_error_unique'] = 'Esiste già una regola firewall per questo server.'; ?> diff --git a/interface/web/admin/lib/lang/it_language_complete.lng b/interface/web/admin/lib/lang/it_language_complete.lng index 84e629e100..a637e532f4 100644 --- a/interface/web/admin/lib/lang/it_language_complete.lng +++ b/interface/web/admin/lib/lang/it_language_complete.lng @@ -1,7 +1,7 @@ This adds missing strings from the english master language files to the selected language.'; -$wb['language_select_txt'] = 'Select language'; -$wb['btn_save_txt'] = 'Merge files now'; +$wb['list_head_txt'] = 'Unisci il file di traduzione selezionato con il file master in lingua inglese.
    Questo aggiungerà le stringhe mancanti (in inglese) al file di traduzione selezionato.'; +$wb['language_select_txt'] = 'Seleziona lingua'; +$wb['btn_save_txt'] = 'Unisci i file adesso'; $wb['btn_cancel_txt'] = 'Annulla'; -$wb['list_desc_txt'] = 'Merge the selected language file with the english master language file.
    This adds missing strings from the english master language files to the selected language.'; +$wb['list_desc_txt'] = 'Unendo il file di traduzione selezionato con il file master in lingua inglese.
    Questo aggiungerà le stringhe mancanti (in inglese) al file di traduzione selezionato..'; ?> diff --git a/interface/web/admin/lib/lang/it_language_edit.lng b/interface/web/admin/lib/lang/it_language_edit.lng index 5a710c90ea..101d41072a 100644 --- a/interface/web/admin/lib/lang/it_language_edit.lng +++ b/interface/web/admin/lib/lang/it_language_edit.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/admin/lib/lang/it_language_import.lng b/interface/web/admin/lib/lang/it_language_import.lng index a6ce43814c..0705efd126 100644 --- a/interface/web/admin/lib/lang/it_language_import.lng +++ b/interface/web/admin/lib/lang/it_language_import.lng @@ -5,5 +5,5 @@ $wb['btn_save_txt'] = 'Importa il file di lingua selezionato'; $wb['language_overwrite_txt'] = 'Sovrascrivi file, se esiste'; $wb['btn_cancel_txt'] = 'Annulla'; $wb['ignore_version_txt'] = 'Tralascia controllo versione ISPconfig'; -$wb['list_desc_txt'] = 'WARNING: Do not import language files from untrustworthy sources.'; +$wb['list_desc_txt'] = 'ATTENZIONE: non importare file di traduzione da sorgenti non affidabili.'; ?> diff --git a/interface/web/admin/lib/lang/it_remote_action.lng b/interface/web/admin/lib/lang/it_remote_action.lng index bb14a01f75..9f43cb45fc 100644 --- a/interface/web/admin/lib/lang/it_remote_action.lng +++ b/interface/web/admin/lib/lang/it_remote_action.lng @@ -1,12 +1,12 @@
    USE THIS AT YOUR OWN RISK!'; -$wb['do_ispcupdate_caption'] = 'Do ISPConfig 3 - Update at remote server'; -$wb['do_ispcupdate_desc'] = 'This action does a ISPConfig3 update at your selected server.

    USE THIS AT YOUR OWN RISK!'; -$wb['action_scheduled'] = 'The action is scheduled for execution'; -$wb['select_all_server'] = 'All server'; -$wb['ispconfig_update_title'] = 'ISPConfig update instructions'; -$wb['ispconfig_update_text'] = 'Login as root user on the shell of your server and execute the command

    ispconfig_update.sh

    to start the ISPConfig update.

    Click here for detailed update instructins'; +$wb['do_osupdate_caption'] = 'Esegui un aggiornamento del S.O. sul server remoto'; +$wb['do_osupdate_desc'] = 'Questa azione esegue apt -y upgrade sul server selezionato.

    USI QUESTA FUNZIONE A TUO RISCHIO E PERICOLO!'; +$wb['do_ispcupdate_caption'] = 'Esegui aggiornamento di ISPConfig 3 sul server remoto'; +$wb['do_ispcupdate_desc'] = 'Questa operazione esegue un aggiornamento a ISPConfig 3 sul server selezionato.

    USI QUESTA FUNZIONE A TUO RISCHIO E PERICOLO!'; +$wb['action_scheduled'] = 'L\'azione è programmata per la sua esecuzione'; +$wb['select_all_server'] = 'Tutti i server'; +$wb['ispconfig_update_title'] = 'Istruzioni per l\'aggiornamento di ISPConfig'; +$wb['ispconfig_update_text'] = 'Collegati alla shell del server come root ed esegui il comando

    ispconfig_update.sh

    per iniziare il processo di aggiornamento.

    Clicca qui per le istruzioni dettagliate di aggiornamento (in inglese)'; ?> diff --git a/interface/web/admin/lib/lang/it_remote_user.lng b/interface/web/admin/lib/lang/it_remote_user.lng index f5fc847d68..f3bdba7737 100644 --- a/interface/web/admin/lib/lang/it_remote_user.lng +++ b/interface/web/admin/lib/lang/it_remote_user.lng @@ -1,12 +1,12 @@ any
    )'; -$wb['remote_user_error_ips'] = 'At least one of the entered ip addresses or hostnames is invalid.'; +$wb['remote_access_txt'] = 'Accesso remoto Access'; +$wb['remote_ips_txt'] = 'Accesso remoto IPs / Hostnames (separati da , lasciare vuote per qualunque)'; +$wb['remote_user_error_ips'] = 'Almeno un indirizzo IP o hostname inserito non è valido.'; ?> diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index fc7175adf3..7e75a265f4 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -1,27 +1,27 @@ Informazione:
    Se desideri fermare MySQL devi selezionare la spunta per Disabilitare monitor MySQL ed attendere 2-3 minuti.
    Se non attendi 2-3 minuti, il sistema tenterà di riavviare MySQL!'; $wb['enable_sni_txt'] = 'Abilita SNI'; $wb['set_folder_permissions_on_update_txt'] = 'Imposta permessi cartella ad aggiornamento'; -$wb['add_web_users_to_sshusers_group_txt'] = 'Aggiungi utente sito web a gruppo utenti -ssh-'; -$wb['connect_userid_to_webid_txt'] = 'Conllega userid Linux a webid'; +$wb['add_web_users_to_sshusers_group_txt'] = 'Aggiungi utente sito web a gruppo utenti -ssh-'; +$wb['connect_userid_to_webid_txt'] = 'Collega userid Linux a webid'; $wb['connect_userid_to_webid_start_txt'] = 'Avvia ID per collegamento userid/webid'; $wb['website_autoalias_txt'] = 'Sito Web auto alias'; -$wb['website_autoalias_note_txt'] = 'Placeholders:'; +$wb['website_autoalias_note_txt'] = 'Marcaposto:'; $wb['backup_mode_txt'] = 'Modalità di Backup'; $wb['backup_mode_userzip'] = 'Backup files siti web come utente web in formato zip'; $wb['backup_mode_rootgz'] = 'Backup di tutti i files nella cartella sito come utente root'; -$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; -$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Lista Real-Time Blackhole'; $wb['realtime_blackhole_list_note_txt'] = '(Separare RBL con le virgole)'; -$wb['stress_adaptive_txt'] = 'Adapt to temporary load spikes'; -$wb['tooltip_stress_adaptive_txt'] = 'Enables Postfix stress-adaptive behavior.'; +$wb['stress_adaptive_txt'] = 'Adatta a momentanee punte di carico di lavoro'; +$wb['tooltip_stress_adaptive_txt'] = 'Abilita il comportamente adattivo allo stress di Postfix.'; $wb['ssl_settings_txt'] = 'Impostazioni SSL'; $wb['permissions_txt'] = 'Permessi'; $wb['php_settings_txt'] = 'Impostazioni PHP'; @@ -181,10 +179,8 @@ $wb['enable_ip_wildcard_txt'] = 'Abilita IP wildcard (*)'; $wb['web_folder_protection_txt'] = 'Imposta cartelle sito in moaniera non modificabile (attributi estesi)'; $wb['overtraffic_notify_admin_txt'] = 'Trasmetti notifiche superamento traffico ad admin'; $wb['overtraffic_notify_client_txt'] = 'Trasmetti notifiche superamento traffico al cliente'; -$wb['overtraffic_disable_web_txt'] = 'Disable websites that exceed traffic limit'; +$wb['overtraffic_disable_web_txt'] = 'Disabilita i siti web che eccedono il limiti di traffico'; $wb['rbl_error_regex'] = 'Per cortesia specificare nomi host RBL validi.'; -$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; -$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Trasmetti allarmi quota ad admin'; $wb['overquota_notify_client_txt'] = 'Trasmetti allarmi quota al cliente'; $wb['overquota_notify_onok_txt'] = 'Trasmetti messaggio quota ok al cliente'; @@ -196,12 +192,12 @@ $wb['monit_url_txt'] = 'Monit URL'; $wb['monit_user_txt'] = 'Monit utente'; $wb['monit_password_txt'] = 'Monit Password'; $wb['monit_url_error_regex'] = 'Monit URL non valida'; -$wb['monit_url_note_txt'] = 'Placeholder:'; +$wb['monit_url_note_txt'] = 'Marcaposto:'; $wb['munin_url_txt'] = 'Munin URL'; $wb['munin_user_txt'] = 'Munin Utente'; $wb['munin_password_txt'] = 'Munin Password'; $wb['munin_url_error_regex'] = 'Munin URL non valida'; -$wb['munin_url_note_txt'] = 'Placeholder:'; +$wb['munin_url_note_txt'] = 'Marcaposto:'; $wb['backup_dir_is_mount_txt'] = 'La direttirice di Backup è un mount?'; $wb['monitor_system_updates_txt'] = 'Verifica aggiornamenti Linux'; $wb['hostname_error_regex'] = 'Nome Host non valido.'; @@ -220,122 +216,121 @@ $wb['website_symlinks_error_regex'] = 'website symlinks non valido.'; $wb['vhost_conf_dir_error_regex'] = 'Direttrice configurazione vhost non valida.'; $wb['vhost_conf_enabled_dir_error_regex'] = 'Direttirce abilitata per vhost conf non valida.'; $wb['nginx_vhost_conf_dir_error_regex'] = 'nginx config directory non valida.'; -$wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'Invalid nginx conf enabled directory.'; -$wb['ca_path_error_regex'] = 'Invalid CA path.'; -$wb['invalid_nginx_user_txt'] = 'Invalid nginx user.'; -$wb['invalid_nginx_group_txt'] = 'Invalid nginx group.'; -$wb['php_ini_path_apache_error_regex'] = 'Invalid apache php.ini path.'; -$wb['php_ini_path_cgi_error_regex'] = 'Invalid cgi php.ini path.'; -$wb['php_fpm_init_script_error_regex'] = 'Invalid php-fpm init script.'; -$wb['php_fpm_ini_path_error_regex'] = 'Invalid php-fpm ini path.'; -$wb['php_fpm_pool_dir_error_regex'] = 'Invalid php-fpm pool directory.'; -$wb['php_fpm_socket_dir_error_regex'] = 'Invalid php-fpm socket directory.'; -$wb['php_open_basedir_error_regex'] = 'Invalid php open_basedir.'; -$wb['awstats_data_dir_empty'] = 'awstats data directory is empty'; -$wb['awstats_data_dir_error_regex'] = 'Invalid awstats data directory.'; -$wb['awstats_pl_empty'] = 'awstats.pl setting vuoto.'; -$wb['awstats_pl_error_regex'] = 'Invalid awstats.pl path.'; -$wb['awstats_buildstaticpages_pl_empty'] = 'awstats_buildstaticpages.pl is empty'; -$wb['awstats_buildstaticpages_pl_error_regex'] = 'Invalid awstats_buildstaticpages.pl path.'; -$wb['invalid_bind_user_txt'] = 'Invalid BIND user.'; -$wb['invalid_bind_group_txt'] = 'Invalid BIND group.'; -$wb['bind_zonefiles_dir_error_regex'] = 'Invalid BIND zonefiles directory.'; -$wb['named_conf_path_error_regex'] = 'Invalid named.conf path.'; -$wb['named_conf_local_path_error_regex'] = 'Invalid named.conf.local path.'; -$wb['fastcgi_starter_path_error_regex'] = 'Invalid fastcgi starter path.'; -$wb['fastcgi_starter_script_error_regex'] = 'Invalid fastcgi starter script.'; -$wb['fastcgi_alias_error_regex'] = 'Invalid fastcgi alias.'; -$wb['fastcgi_phpini_path_error_regex'] = 'Invalid fastcgi path.'; -$wb['fastcgi_bin_error_regex'] = 'Invalid fastcgi bin.'; -$wb['jailkit_chroot_home_error_regex'] = 'Invalid jaikit chroot home.'; -$wb['jailkit_chroot_app_sections_error_regex'] = 'Invalid jaikit chroot sections.'; -$wb['jailkit_chroot_app_programs_error_regex'] = 'Invalid jaikit chroot app programs.'; -$wb['jailkit_chroot_cron_programs_error_regex'] = 'Invalid jaikit chroot cron programs.'; -$wb['vlogger_config_dir_error_regex'] = 'Invalid vlogger config dir.'; -$wb['cron_init_script_error_regex'] = 'Invalid cron init script.'; -$wb['crontab_dir_error_regex'] = 'Invalid crontab directory.'; -$wb['cron_wget_error_regex'] = 'Invalid cron wget path.'; -$wb['network_filesystem_txt'] = 'Network Filesystem'; -$wb['maildir_format_txt'] = 'Maildir Format'; -$wb['dkim_path_txt'] = 'DKIM Path'; -$wb['mailbox_virtual_uidgid_maps_txt'] = 'Use Websites Linux uid for mailbox'; -$wb['mailbox_virtual_uidgid_maps_info_txt'] = 'only in single web and mail-server-setup'; -$wb['mailbox_virtual_uidgid_maps_error_nosingleserver'] = 'Uid cannot be mapped in multi-server-setup.'; -$wb['mailbox_virtual_uidgid_maps_error_nodovecot'] = 'Uid-mapping can only be used with dovecot.'; -$wb['mailbox_virtual_uidgid_maps_error_alreadyusers'] = 'Uid-mapping cannot be changed if there are already mail users.'; -$wb['reject_sender_login_mismatch_txt'] = 'Reject sender and login mismatch'; -$wb['reject_unknown_txt'] = 'Reject unknown hostnames'; -$wb['tooltip_reject_unknown_txt'] = 'Requires hostnames to pass DNS checks. Not checked for authenticated users.'; -$wb['reject_unknown_helo_txt'] = 'Reject unknown helo hostnames'; -$wb['reject_unknown_client_txt'] = 'Reject unknown client hostnames'; -$wb['reject_unknown_client_helo_txt'] = 'Reject unknown helo and client hostnames'; -$wb['do_not_try_rescue_mongodb_txt'] = 'Disable MongoDB monitoring'; -$wb['v6_prefix_txt'] = 'IPv6 Prefix'; -$wb['vhost_rewrite_v6_txt'] = 'Rewrite IPv6 on Mirror'; -$wb['v6_prefix_length'] = 'Prefix too long according to defined IPv6 '; -$wb['backup_dir_mount_cmd_txt'] = 'Mount command, if backup directory not mounted'; -$wb['backup_delete_txt'] = 'Delete backups on domain/website delete'; -$wb['overquota_db_notify_threshold_txt'] = 'DB quota warning usage level'; -$wb['overquota_db_notify_admin_txt'] = 'Send DB quota warnings to admin'; -$wb['overquota_db_notify_client_txt'] = 'Send DB quota warnings to client'; +$wb['nginx_vhost_conf_enabled_dir_error_regex'] = 'Cartella conf enabled di nginx non valida.'; +$wb['ca_path_error_regex'] = 'Invalido percorso a CA.'; +$wb['invalid_nginx_user_txt'] = 'Invalido utente nginx.'; +$wb['invalid_nginx_group_txt'] = 'Invalido gruppo nginx.'; +$wb['php_ini_path_apache_error_regex'] = 'Percorso apache php.ini non valido.'; +$wb['php_ini_path_cgi_error_regex'] = 'Percorso cgi php.ini non valido.'; +$wb['php_fpm_init_script_error_regex'] = 'Script php-fpm init non valido.'; +$wb['php_fpm_ini_path_error_regex'] = 'Percorso php-fpm ini non valido.'; +$wb['php_fpm_pool_dir_error_regex'] = 'Cartella php-fpm pool non valida.'; +$wb['php_fpm_socket_dir_error_regex'] = 'Cartella php-fpm socket non valida.'; +$wb['php_open_basedir_error_regex'] = 'php open_basedir non valido.'; +$wb['awstats_data_dir_empty'] = 'awstats: la cartella dati è vuota'; +$wb['awstats_data_dir_error_regex'] = 'Cartella dati awstats non valida.'; +$wb['awstats_pl_empty'] = 'awstats.pl impostazioni vuoto.'; +$wb['awstats_pl_error_regex'] = 'Percorso awstats.pl non valido.'; +$wb['awstats_buildstaticpages_pl_empty'] = 'awstats_buildstaticpages.pl è vuoto'; +$wb['awstats_buildstaticpages_pl_error_regex'] = 'Percorso awstats_buildstaticpages.pl non valido.'; +$wb['invalid_bind_user_txt'] = 'Utente BIND non valido.'; +$wb['invalid_bind_group_txt'] = 'Gruppo BIND non valido.'; +$wb['bind_zonefiles_dir_error_regex'] = 'Cartella zone BIND non valida.'; +$wb['named_conf_path_error_regex'] = 'Percorso named.conf non valido.'; +$wb['named_conf_local_path_error_regex'] = 'Percorso named.conf.local non valido.'; +$wb['fastcgi_starter_path_error_regex'] = 'Percorso starter fastcgi non valido.'; +$wb['fastcgi_starter_script_error_regex'] = 'Percorso script di avvioo fastcgi non valido.'; +$wb['fastcgi_alias_error_regex'] = 'Alias fastcgi non valido.'; +$wb['fastcgi_phpini_path_error_regex'] = 'Percorso fastcgi non valido.'; +$wb['fastcgi_bin_error_regex'] = 'Binario fastcgi non valido.'; +$wb['jailkit_chroot_home_error_regex'] = 'Cartella home jailkit chroot non valida.'; +$wb['jailkit_chroot_app_sections_error_regex'] = 'Sezione jailkit chroot non valida.'; +$wb['jailkit_chroot_app_programs_error_regex'] = 'Programma jailkit chroot app non valido.'; +$wb['jailkit_chroot_cron_programs_error_regex'] = 'Programma jailkit chroot cron non valido.'; +$wb['vlogger_config_dir_error_regex'] = 'Cartella di configurazione vlogger non valida.'; +$wb['cron_init_script_error_regex'] = 'Script di avvio cron non valido.'; +$wb['crontab_dir_error_regex'] = 'Cartella crontab non valida.'; +$wb['cron_wget_error_regex'] = 'Percorso cron wget non valido.'; +$wb['network_filesystem_txt'] = 'Filesystem di rete'; +$wb['maildir_format_txt'] = 'Formato Maildir'; +$wb['dkim_path_txt'] = 'Percorso DKIM'; +$wb['mailbox_virtual_uidgid_maps_txt'] = 'Usare uid dei siti Web per mailbox'; +$wb['mailbox_virtual_uidgid_maps_info_txt'] = 'Solo per setup di unico sito web e server mail'; +$wb['mailbox_virtual_uidgid_maps_error_nosingleserver'] = 'Uid non può essere usato per mappare multi-server-setup.'; +$wb['mailbox_virtual_uidgid_maps_error_nodovecot'] = 'La mappatura Uidpuò essere usata solo con dovecot.'; +$wb['mailbox_virtual_uidgid_maps_error_alreadyusers'] = 'La mappatura Uid non può essere cambiata se esistono già utenti mail.'; +$wb['reject_sender_login_mismatch_txt'] = 'RIfiuta se il mittente non soddisfa login'; +$wb['reject_unknown_txt'] = 'Rifiuta hostnames sconosciuti'; +$wb['tooltip_reject_unknown_txt'] = 'Richiedi che gli hostnames tsuperino il check del DNS. Check non eseguito per utenti autenticati.'; +$wb['reject_unknown_helo_txt'] = 'Rifiuta helo hostnames sconosciuti'; +$wb['reject_unknown_client_txt'] = 'Rifiuta client hostnames sconosciuti'; +$wb['reject_unknown_client_helo_txt'] = 'Rifiuta helo e client hostnames sconosciuti'; +$wb['do_not_try_rescue_mongodb_txt'] = 'Disabilita monitoring MongoDB'; +$wb['v6_prefix_txt'] = 'Prefisso IPv6'; +$wb['vhost_rewrite_v6_txt'] = 'Riscrivi IPv6 su Mirror'; +$wb['v6_prefix_length'] = 'Prefisso troppo lungo secondo le regole IPv6'; +$wb['backup_dir_mount_cmd_txt'] = 'Comanda mount se la directory di backup non è montata'; +$wb['backup_delete_txt'] = 'Cancellare i backup alla cancellazione dei domini/siti web'; +$wb['overquota_db_notify_admin_txt'] = 'Invia avviso di quota DB all\'amministratore'; +$wb['overquota_db_notify_client_txt'] = 'Invia avviso di quota DB al cliente'; $wb['php_handler_txt'] = 'Default PHP Handler'; $wb['php_fpm_default_chroot_txt'] = 'Default chrooted PHP-FPM'; -$wb['php_fpm_incron_reload_txt'] = 'Install incron trigger file to reload PHP-FPM'; -$wb['disabled_txt'] = 'Disabled'; -$wb['dkim_strength_txt'] = 'DKIM strength'; -$wb['php_ini_check_minutes_txt'] = 'Check php.ini every X minutes for changes'; -$wb['php_ini_check_minutes_error_empty'] = 'Please specify a value how often php.ini should be checked for changes.'; +$wb['php_fpm_incron_reload_txt'] = 'Installare trigger incron trigger per riavviare PHP-FPM'; +$wb['disabled_txt'] = 'Disabilitato'; +$wb['dkim_strength_txt'] = 'Affidabilità DKIM'; +$wb['php_ini_check_minutes_txt'] = 'Verifica php.ini ogni X minuti per canbiamenti'; +$wb['php_ini_check_minutes_error_empty'] = 'Indica quanto spesso deve essere verificato php.ini per cambiamenti.'; $wb['php_ini_check_minutes_info_txt'] = '0 = no check'; $wb['web_settings_txt'] = 'Web Server'; $wb['xmpp_server_txt'] = 'XMPP Server'; $wb['xmpp_use_ipv6_txt'] = 'Use IPv6'; -$wb['xmpp_bosh_max_inactivity_txt'] = 'Max. BOSH inactivity time'; -$wb['xmpp_bosh_timeout_range_wrong'] = 'Please enter a bosh timeout range between 15 - 360'; +$wb['xmpp_bosh_max_inactivity_txt'] = 'Max. BOSH tempo di inattività time'; +$wb['xmpp_bosh_timeout_range_wrong'] = 'Inserire un tempo di bosh compreso tra 15 - 360'; $wb['xmpp_module_saslauth'] = 'saslauth'; -$wb['xmpp_server_admins_txt'] = 'Server Admins (JIDs)'; -$wb['xmpp_modules_enabled_txt'] = 'Serverwide enabled plugins (one per line)'; -$wb['xmpp_ports_txt'] = 'Component ports'; +$wb['xmpp_server_admins_txt'] = 'Amministratori del Server (JIDs)'; +$wb['xmpp_modules_enabled_txt'] = 'plugins abilitati su tutti i server (uno per linea)'; +$wb['xmpp_ports_txt'] = 'Porte del componente'; $wb['xmpp_port_http_txt'] = 'HTTP'; $wb['xmpp_port_https_txt'] = 'HTTPS'; $wb['xmpp_port_pastebin_txt'] = 'Pastebin'; $wb['xmpp_port_bosh_txt'] = 'BOSH'; -$wb['disable_bind_log_txt'] = 'Disable bind9 messages for Loglevel WARN'; -$wb['apps_vhost_enabled_txt'] = 'Apps-vhost enabled'; -$wb['backup_time_txt'] = 'Backup time'; -$wb['skip_le_check_txt'] = 'Skip Lets Encrypt Check'; -$wb['migration_mode_txt'] = 'Server Migration Mode'; -$wb['nginx_enable_pagespeed_txt'] = 'Makes Pagespeed available'; -$wb['backup_tmp_txt'] = 'Backup tmp directory for zip'; -$wb['tmpdir_path_error_empty'] = 'tmp-dir Path is empty.'; -$wb['tmpdir_path_error_regex'] = 'Invalid tmp-dir path.'; -$wb['logging_txt'] = 'Store website access and error logs'; -$wb['logging_desc_txt'] = 'Use Tools > Resync to apply changes to existing sites. For Apache, access and error log can be anonymized. For nginx, only the access log is anonymized, the error log will contain IP addresses.'; -$wb['log_retention_txt'] = 'Log retention (days)'; -$wb['log_retention_error_ispositive'] = 'Log retention must be a number > 0'; -$wb['php_default_hide_txt'] = 'Hide Default PHP-Version in selectbox'; -$wb['php_default_name_txt'] = 'Description Default PHP-Version'; -$wb['php_default_name_error_empty'] = 'Description Default PHP-Version must not be empty'; -$wb['error_mailbox_message_size_txt'] = 'Mailbox size must be larger or equal to message size'; -$wb['php_fpm_reload_mode_txt'] = 'PHP-FPM reload mode'; -$wb['content_filter_txt'] = 'Content Filter'; +$wb['disable_bind_log_txt'] = 'Disabilita messaggi bind9 di tipologia WARN'; +$wb['apps_vhost_enabled_txt'] = 'Apps-vhost abilitato'; +$wb['backup_time_txt'] = 'Ora del backuo'; +$wb['skip_le_check_txt'] = 'Salta la verifica Let\'s Encrypt'; +$wb['migration_mode_txt'] = 'Modo migrazione delServer'; +$wb['nginx_enable_pagespeed_txt'] = 'Rendi Pagespeed disponibile'; +$wb['backup_tmp_txt'] = 'Cartella temporanea di backup per zip'; +$wb['tmpdir_path_error_empty'] = 'Percorso tmp-dir è vuoto.'; +$wb['tmpdir_path_error_regex'] = 'Percorso tmp-dir non valido.'; +$wb['logging_txt'] = 'Memorizza log di accessi ed errori dei sisti web'; +$wb['logging_desc_txt'] = 'Usare Strumenti > Risincronizza per applicare le modifiche ai siti web esistenti. Con Apache, i log di accesso ed errori possono essere resi anonimi. Con nginx, solo i log di accesso sono resi anonimi, i log di errore conterranno gli indirizzi IP.'; +$wb['log_retention_txt'] = 'Tempo di conservazione dei Log (giorni)'; +$wb['log_retention_error_ispositive'] = 'Il tempo di conservazione dei Log deve essere un numero > 0'; +$wb['php_default_hide_txt'] = 'Nasconi la versione default di PHP nel box di selezione'; +$wb['php_default_name_txt'] = 'Descrizione versione Default di PHP'; +$wb['php_default_name_error_empty'] = 'Descrizione versione Default di PHP non può essere vuota'; +$wb['error_mailbox_message_size_txt'] = 'La dimensione della casella di posta deve essere più grande della dimensione del messaggio'; +$wb['php_fpm_reload_mode_txt'] = 'Metodo di riavvio PHP-FPM'; +$wb['content_filter_txt'] = 'Filtro contenuti'; $wb['rspamd_url_txt'] = 'Rspamd URL'; $wb['rspamd_user_txt'] = 'Rspamd User'; $wb['rspamd_password_txt'] = 'Rspamd Password'; $wb['rspamd_redis_servers_txt'] = 'Redis Servers'; -$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) which Rspamd will use. Eg. \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; +$wb['tooltip_rspamd_redis_servers_txt'] = 'Redis server(s) che sarà usato da Rspamd. Esempio: \'127.0.0.1\', \'localhost:6379\' or \'/var/run/redis/redis-server.sock\'.'; $wb['rspamd_redis_password_txt'] = 'Redis Password'; -$wb['tooltip_rspamd_redis_password_txt'] = 'Password for Redis Servers (leave blank if unused).'; -$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers for Bayes'; -$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) which Rspamd will use for Bayes if different (otherwise leave blank). Eg. \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; -$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password for Bayes'; -$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password for Bayes Redis Server (leave blank if unused).'; -$wb['vhost_proxy_protocol_enabled_txt'] = 'Enable PROXY Protocol'; -$wb['vhost_proxy_protocol_http_port_txt'] = 'PROXY Protocol HTTP Port'; -$wb['vhost_proxy_protocol_https_port_txt'] = 'PROXY Protocol HTTPS Port'; -$wb['jailkit_chroot_authorized_keys_template_txt'] = 'Jailkit authorized_keys template'; -$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'Invalid jaikit chroot authorized_keys template file.'; -$wb['jailkit_hardlinks_txt'] = 'Hardlinks within Jailkit chroot'; -$wb['tooltip_jailkit_hardlinks_txt'] = 'Using hardlinks is insecure, but saves disk space.'; -$wb['jailkit_hardlinks_allow_txt'] = 'Allow hardlinks within the jail'; -$wb['jailkit_hardlinks_no_txt'] = 'No, remove hardlinked files'; -$wb['jailkit_hardlinks_yes_txt'] = 'Yes, use hardlinks if possible'; +$wb['tooltip_rspamd_redis_password_txt'] = 'Password per Redis Servers (lasciare vuoto se non usato).'; +$wb['rspamd_redis_bayes_servers_txt'] = 'Redis Servers per Bayes'; +$wb['tooltip_rspamd_redis_bayes_servers_txt'] = 'Redis server(s) che Rspamd userà per Bayes se differente (altrimenti lasciare vuoto). Esempio: \'localhost:6378\' or \'/var/run/redis-bayes/redis-server.sock\'.'; +$wb['rspamd_redis_bayes_password_txt'] = 'Redis Password per Bayes'; +$wb['tooltip_rspamd_redis_bayes_password_txt'] = 'Password per Bayes Redis Server (lasciare vuoto se non usato).'; +$wb['vhost_proxy_protocol_enabled_txt'] = 'Abilita protocollo PROXY'; +$wb['vhost_proxy_protocol_http_port_txt'] = 'Porta HHTP per il protocollo PROXY'; +$wb['vhost_proxy_protocol_https_port_txt'] = 'Porta HHTPS per il protocollo PROXY'; +$wb['jailkit_chroot_authorized_keys_template_txt'] = 'modello Jailkit authorized_keys'; +$wb['jailkit_chroot_authorized_keys_template_error_regex'] = 'modello file per jailkit chroot authorized_keys non valido.'; +$wb['jailkit_hardlinks_txt'] = 'Hardlinks per Jailkit chroot'; +$wb['tooltip_jailkit_hardlinks_txt'] = 'L\'uso di hardlinks è meno sicuro però riduce lo spazio disco.'; +$wb['jailkit_hardlinks_allow_txt'] = 'Consenti hardlinks all\'interno di jail'; +$wb['jailkit_hardlinks_no_txt'] = 'No, rimuovi i file con hardlink'; +$wb['jailkit_hardlinks_yes_txt'] = 'Si, usa hardlinks se possibile'; diff --git a/interface/web/admin/lib/lang/it_server_ip.lng b/interface/web/admin/lib/lang/it_server_ip.lng index 9850f2e38b..42cecce91a 100644 --- a/interface/web/admin/lib/lang/it_server_ip.lng +++ b/interface/web/admin/lib/lang/it_server_ip.lng @@ -1,13 +1,13 @@ diff --git a/interface/web/admin/lib/lang/it_server_ip_list.lng b/interface/web/admin/lib/lang/it_server_ip_list.lng index b831408dc0..97e19468bf 100644 --- a/interface/web/admin/lib/lang/it_server_ip_list.lng +++ b/interface/web/admin/lib/lang/it_server_ip_list.lng @@ -5,6 +5,6 @@ $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['add_new_record_txt'] = 'Aggiungi nuovo indirizzo IP'; $wb['client_id_txt'] = 'Cliente'; $wb['virtualhost_txt'] = 'HTTP Vhost'; -$wb['virtualhost_port_txt'] = 'HTTP Ports'; -$wb['ip_type_txt'] = 'Type'; +$wb['virtualhost_port_txt'] = 'Porte HTTP'; +$wb['ip_type_txt'] = 'Tipo'; ?> diff --git a/interface/web/admin/lib/lang/it_server_ip_map.lng b/interface/web/admin/lib/lang/it_server_ip_map.lng index f02bdafd84..fff88acc12 100644 --- a/interface/web/admin/lib/lang/it_server_ip_map.lng +++ b/interface/web/admin/lib/lang/it_server_ip_map.lng @@ -1,14 +1,14 @@ diff --git a/interface/web/admin/lib/lang/it_server_ip_map_list.lng b/interface/web/admin/lib/lang/it_server_ip_map_list.lng index 1fedc10b2e..790975c33a 100644 --- a/interface/web/admin/lib/lang/it_server_ip_map_list.lng +++ b/interface/web/admin/lib/lang/it_server_ip_map_list.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/admin/lib/lang/it_server_php.lng b/interface/web/admin/lib/lang/it_server_php.lng index d85b5cd7da..7569ba9b52 100644 --- a/interface/web/admin/lib/lang/it_server_php.lng +++ b/interface/web/admin/lib/lang/it_server_php.lng @@ -1,20 +1,20 @@ diff --git a/interface/web/admin/lib/lang/it_software_package.lng b/interface/web/admin/lib/lang/it_software_package.lng new file mode 100644 index 0000000000..4125430c56 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_package.lng @@ -0,0 +1,6 @@ + diff --git a/interface/web/admin/lib/lang/it_software_package_install.lng b/interface/web/admin/lib/lang/it_software_package_install.lng new file mode 100644 index 0000000000..1e210d5894 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_package_install.lng @@ -0,0 +1,6 @@ + diff --git a/interface/web/admin/lib/lang/it_software_package_list.lng b/interface/web/admin/lib/lang/it_software_package_list.lng new file mode 100644 index 0000000000..5ab82417de --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_package_list.lng @@ -0,0 +1,13 @@ + diff --git a/interface/web/admin/lib/lang/it_software_repo.lng b/interface/web/admin/lib/lang/it_software_repo.lng new file mode 100644 index 0000000000..76b0182697 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_repo.lng @@ -0,0 +1,8 @@ + diff --git a/interface/web/admin/lib/lang/it_software_repo_list.lng b/interface/web/admin/lib/lang/it_software_repo_list.lng new file mode 100644 index 0000000000..be378f3ca8 --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_repo_list.lng @@ -0,0 +1,6 @@ + diff --git a/interface/web/admin/lib/lang/it_software_update_list.lng b/interface/web/admin/lib/lang/it_software_update_list.lng new file mode 100644 index 0000000000..cc264b84ec --- /dev/null +++ b/interface/web/admin/lib/lang/it_software_update_list.lng @@ -0,0 +1,9 @@ + diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index f77dc68061..39cbfb6321 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -6,104 +6,103 @@ $wb['dbname_prefix_txt'] = 'Prefisso nome database'; $wb['dbuser_prefix_txt'] = 'Prefisso utente database'; $wb['shelluser_prefix_txt'] = 'Prefisso utente Shell'; $wb['ftpuser_prefix_txt'] = 'Prefisso utente FTP'; -$wb['dbname_prefix_error_regex'] = 'Char not allowed in database name prefix.'; -$wb['dbuser_prefix_error_regex'] = 'Char not allowed in database user prefix.'; -$wb['ftpuser_prefix_error_regex'] = 'Char not allowed in ftp user prefix.'; -$wb['shelluser_prefix_error_regex'] = 'Char not allowed in shell user prefix.'; -$wb['dblist_phpmyadmin_link_txt'] = 'Link to phpmyadmin in DB list'; -$wb['mailboxlist_webmail_link_txt'] = 'Link to webmail in Mailbox list'; +$wb['dbname_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome database.'; +$wb['dbuser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente database.'; +$wb['ftpuser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente FTP.'; +$wb['shelluser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente shell..'; +$wb['dblist_phpmyadmin_link_txt'] = 'Collegamento a phpmyadmin nella lista dei DB'; +$wb['mailboxlist_webmail_link_txt'] = 'Collegamento a webmail nella lista di Mailbox'; $wb['webmail_url_txt'] = 'Webmail 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 can not free 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['webdavuser_prefix_txt'] = 'Webdav user prefix'; -$wb['webdavuser_prefix_error_regex'] = 'Char not allowed in webdav user prefix.'; +$wb['use_domain_module_txt'] = 'Usare il modulo Siti per aggiungere un Dominio'; +$wb['use_domain_module_hint'] = 'Se usi questo modulo, i tuoi clienti potranno solamente selezionare uno dei domini creati per loro. Non potranno cambiare a loro piacimento i campi del dominio. Devi disconnetterti e rifare il login dopo aver cambiato i dati affinchè questi siano visibili.'; +$wb['new_domain_txt'] = 'HTML per creare un nuovo dominio'; +$wb['webdavuser_prefix_txt'] = 'Prefisso utente webdav'; +$wb['webdavuser_prefix_error_regex'] = 'Carattere non consentito nel prefisso del nome utente webdav..'; $wb['webftp_url_txt'] = 'WebFTP URL'; $wb['dashboard_atom_url_admin_txt'] = 'Dashboard atom feed URL (admin)'; $wb['dashboard_atom_url_reseller_txt'] = 'Dashboard atom feed URL (reseller)'; $wb['dashboard_atom_url_client_txt'] = 'Dashboard atom feed URL (client)'; -$wb['enable_welcome_mail_txt'] = 'Enable welcome email'; -$wb['enable_custom_login_txt'] = 'Allow custom login name'; -$wb['mailmailinglist_link_txt'] = 'Link to mailing list in Mailing list list'; +$wb['enable_welcome_mail_txt'] = 'Abilita email di benvenuto'; +$wb['enable_custom_login_txt'] = 'Consenti login name personalizzati'; +$wb['mailmailinglist_link_txt'] = 'Collegamento alla mailing list in Mailing list list'; $wb['mailmailinglist_url_txt'] = 'Mailing list URL'; -$wb['admin_mail_txt'] = 'Administrators e-mail'; -$wb['admin_name_txt'] = 'Administrators name'; -$wb['maintenance_mode_txt'] = 'Maintenance Mode'; -$wb['maintenance_mode_exclude_ips_txt'] = 'Exclude IP\'s from maintenance'; -$wb['maintenance_mode_exclude_ips_error_isip'] = 'One or more invalid IP addresses in maintenance mode exclude list. Must be a list of comma-separated IPv4 and/or IPv6 addresses.'; -$wb['smtp_enabled_txt'] = 'Use SMTP to send system mails'; +$wb['admin_mail_txt'] = 'Email dell\'Amministratore'; +$wb['admin_name_txt'] = 'Nome dell\'Amministratore name'; +$wb['maintenance_mode_txt'] = 'Modo manutenzione'; +$wb['maintenance_mode_exclude_ips_txt'] = 'Escludere IP\'s per manutenzione'; +$wb['maintenance_mode_exclude_ips_error_isip'] = 'Uno o più indirizzi IP errati nella lista di esclusione per manutenzione. Deve essere una lista, separata da virgole, di indirizzi IPv4 e/o IPv6.'; +$wb['smtp_enabled_txt'] = 'Usare SMTP per inviare mail di sistema'; $wb['smtp_host_txt'] = 'SMTP host'; -$wb['smtp_port_txt'] = 'SMTP port'; -$wb['smtp_user_txt'] = 'SMTP user'; +$wb['smtp_port_txt'] = 'SMTP porta'; +$wb['smtp_user_txt'] = 'SMTP utente'; $wb['smtp_pass_txt'] = 'SMTP password'; -$wb['smtp_crypt_txt'] = 'Use SSL/TLS encrypted connection for SMTP'; -$wb['smtp_missing_admin_mail_txt'] = 'Please enter the admin name and admin mail address if you want to use smtp mail sending.'; -$wb['tab_change_discard_txt'] = 'Discard changes on tab change'; -$wb['tab_change_warning_txt'] = 'Tab change warning'; -$wb['tab_change_warning_note_txt'] = 'Show a warning on tab change in edit forms if any data has been altered by the user.'; -$wb['vhost_subdomains_txt'] = 'Crea Subdomains as web site'; -$wb['vhost_subdomains_note_txt'] = 'You cannot disable this as long as vhost subdomains exist in the system!'; -$wb['phpmyadmin_url_error_regex'] = 'Invalid phpmyadmin URL'; -$wb['use_combobox_txt'] = 'Use jQuery UI Combobox'; -$wb['use_loadindicator_txt'] = 'Use Load Indicator'; -$wb['f5_to_reload_js_txt'] = 'If you change this, you might have to press F5 to make the browser reload JavaScript libraries or empty your browser cache.'; -$wb['client_username_web_check_disabled_txt'] = 'Disable client username check for the word \'web\'.'; -$wb['show_per_domain_relay_options_txt'] = 'Show per domain relay options'; -$wb['mailbox_show_autoresponder_tab_txt'] = 'Show autoresponder tab in mail account details'; -$wb['mailbox_show_mail_filter_tab_txt'] = 'Show mail filter tab in mail account details'; -$wb['mailbox_show_custom_rules_tab_txt'] = 'Show custom mailfilter tab in mail account details'; -$wb['webmail_url_error_regex'] = 'Invalid webmail URL'; -$wb['phpmyadmin_url_note_txt'] = 'Placeholder:'; -$wb['webmail_url_note_txt'] = 'Placeholder:'; -$wb['available_dashlets_note_txt'] = 'Available Dashlets:'; -$wb['admin_dashlets_left_txt'] = 'Left Admin Dashlets'; -$wb['admin_dashlets_right_txt'] = 'Right Admin Dashlets'; -$wb['reseller_dashlets_left_txt'] = 'Left Reseller Dashlets'; -$wb['reseller_dashlets_right_txt'] = 'Right Reseller Dashlets'; -$wb['client_dashlets_left_txt'] = 'Left Client Dashlets'; -$wb['client_dashlets_right_txt'] = 'Right Client Dashlets'; -$wb['customer_no_template_txt'] = 'Customer No. template'; -$wb['customer_no_template_error_regex_txt'] = 'The customer No. template contains invalid characters'; -$wb['customer_no_start_txt'] = 'Customer No. start value'; -$wb['customer_no_counter_txt'] = 'Customer No. counter'; -$wb['session_timeout_txt'] = 'Session timeout (minutes)'; -$wb['session_allow_endless_txt'] = 'Enable \\"stay logged in\\"'; +$wb['smtp_crypt_txt'] = 'Usare connessione cifrata SSL/TLS per SMTP'; +$wb['smtp_missing_admin_mail_txt'] = 'Inserire nome amministratore e mail amministratore se vuoi usaresmtp per inviare mail.'; +$wb['tab_change_discard_txt'] = 'Trascura le modifiche al cambio di scheda'; +$wb['tab_change_warning_txt'] = 'Avviso di cambio scheda'; +$wb['tab_change_warning_note_txt'] = 'Mostra un avviso al cambio di scheda se qualche dato è stato cambiato nel modulo in uso.'; +$wb['vhost_subdomains_txt'] = 'Crea Sottodomini come siti web'; +$wb['vhost_subdomains_note_txt'] = 'Non puoi disabilitare questo fintanto che un sottodominio vhost esiste nel sistema!'; +$wb['phpmyadmin_url_error_regex'] = 'URL a phpmyadmin non valido'; +$wb['use_combobox_txt'] = 'Usare jQuery UI Combobox'; +$wb['use_loadindicator_txt'] = 'Usare Indicatore di carico'; +$wb['f5_to_reload_js_txt'] = 'Se cambi questo, dovrai premere F5 per costringere il browser a ricaricare le librerie JavaScript oppure devi svuotare la cache del browser.'; +$wb['client_username_web_check_disabled_txt'] = 'Disabilita la verifica del nome utente per la parola \'web\'.'; +$wb['show_per_domain_relay_options_txt'] = 'Mostra le opzioni di relay per il dominio'; +$wb['mailbox_show_autoresponder_tab_txt'] = 'Mostra la scheda autorisponditore nel profilo mail'; +$wb['mailbox_show_mail_filter_tab_txt'] = 'Mostra la scheda dei filtri mail nel profilo mail'; +$wb['mailbox_show_custom_rules_tab_txt'] = 'Mostra la scheda di filtri mail personalizzati nel profilo mail'; +$wb['webmail_url_error_regex'] = 'URL webmail non valido'; +$wb['phpmyadmin_url_note_txt'] = 'Segnaposto:'; +$wb['webmail_url_note_txt'] = 'Segnaposto:'; +$wb['available_dashlets_note_txt'] = 'Dashlets disponibili:'; +$wb['admin_dashlets_left_txt'] = 'Dashlets di sinistra per amministratore'; +$wb['admin_dashlets_right_txt'] = 'Dashlets di destra per amministratore'; +$wb['reseller_dashlets_left_txt'] = 'Dashlets di sinistra per rivenditore'; +$wb['reseller_dashlets_right_txt'] = 'Dashlets di destra per rivenditore'; +$wb['client_dashlets_left_txt'] = 'Dashlets di sinistra per Clienti'; +$wb['client_dashlets_right_txt'] = 'Dashlets di destra per Clienti'; +$wb['customer_no_template_txt'] = 'Modello per n° cliente'; +$wb['customer_no_template_error_regex_txt'] = 'Il templeate per il n° cliente contiene caratteri non validi'; +$wb['customer_no_start_txt'] = 'Valore iniziale del n° Cliente'; +$wb['customer_no_counter_txt'] = 'Contatore n° Clienti'; +$wb['session_timeout_txt'] = 'Timeout di sessione (minuti)'; +$wb['session_allow_endless_txt'] = 'Abilita \\"rimani collegato\\"'; $wb['No'] = 'No'; -$wb['min_password_length_txt'] = 'Minimum password length'; -$wb['min_password_strength_txt'] = 'Minimum password strength'; -$wb['ssh_authentication_txt'] = 'Allowed SSH authentication'; -$wb['ssh_authentication_password_key'] = 'Password & Key'; +$wb['min_password_length_txt'] = 'Lunghezza minima della password'; +$wb['min_password_strength_txt'] = 'Robustezza minima della password'; +$wb['ssh_authentication_txt'] = 'Autenticazione SSH consentita'; +$wb['ssh_authentication_password_key'] = 'Password & Chiave'; $wb['ssh_authentication_password'] = 'Password'; -$wb['ssh_authentication_key'] = 'Key'; -$wb['vhost_aliasdomains_txt'] = 'Create aliasdomains as web site'; -$wb['vhost_aliasdomains_note_txt'] = 'You cannot disable this as long as vhost aliasdomains exist in the system!'; -$wb['backups_include_into_web_quota_txt'] = 'Include backup files into web quota.'; +$wb['ssh_authentication_key'] = 'Chiave'; +$wb['vhost_aliasdomains_txt'] = 'Crea dominio alias come sito web'; +$wb['vhost_aliasdomains_note_txt'] = 'Non puoi disabilitare questo fintanto che un dominio alias vhost è presente nel sistema!'; +$wb['backups_include_into_web_quota_txt'] = 'Includere i file di backup nella quota web.'; $wb['default_mailserver_txt'] = 'Default Mailserver'; $wb['default_webserver_txt'] = 'Default Webserver'; $wb['default_dnsserver_txt'] = 'Default DNS Server'; $wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; $wb['default_dbserver_txt'] = 'Default Database Server'; -$wb['company_name_txt'] = 'Company Name for the page title'; -$wb['reseller_can_use_options_txt'] = 'Reseller can use the option-tab for websites'; -$wb['custom_login_text_txt'] = 'Custom Text on Login-Page'; -$wb['custom_login_link_txt'] = 'Custom Link on Login-Page'; -$wb['login_link_error_regex'] = 'Invalid Link for Custom Login'; +$wb['company_name_txt'] = 'Nome azienda per il titolo della pagina'; +$wb['reseller_can_use_options_txt'] = 'Il Rivenditore può usare la scheda opzioni per i siti web'; +$wb['custom_login_text_txt'] = 'Text personalizzato nella pagina di login'; +$wb['custom_login_link_txt'] = 'Collegamento personalizzato nella pagina di login'; +$wb['login_link_error_regex'] = 'Collegamento per login personalizzato non valido'; $wb['default_remote_dbserver_txt'] = 'DB remoti predefiniti'; $wb['disable_client_remote_dbserver_txt'] = 'Disabilita la configurazione dei DB Remoti per i clienti'; -$wb['ca_name_txt'] = 'Name'; -$wb['ca_issue_txt'] = 'Issue'; -$wb['ca_wildcard_txt'] = 'Use Wildcard'; -$wb['ca_critical_txt'] = 'Strict Check'; +$wb['ca_name_txt'] = 'Nome'; +$wb['ca_issue_txt'] = 'Testo'; +$wb['ca_wildcard_txt'] = 'Usare Wildcard'; +$wb['ca_critical_txt'] = 'Verifica approfondita'; $wb['ca_iodef_txt'] = 'iodef'; -$wb['active_txt'] = 'Aktive'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; +$wb['active_txt'] = 'Attivo'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; $wb['web_php_options_txt'] = 'PHP Handler (Apache only)'; -$wb['client_protection_txt'] = 'Client protection'; -$wb['show_support_messages_txt'] = 'Show message function in help module'; -$wb['show_aps_menu_txt'] = 'Show APS menu'; -$wb['show_aps_menu_note_txt'] = 'APS will be removed from the panel in the near future.'; -$wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; -$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; +$wb['client_protection_txt'] = 'Protezione Cliente'; +$wb['show_support_messages_txt'] = 'Mostra la funzione messaggio nel modulo Help'; +$wb['show_aps_menu_txt'] = 'Mostra menu APS'; +$wb['show_aps_menu_note_txt'] = 'APS saranno rimosse dal pannello in un prossimo futuro.'; +$wb['show_aps_menu_note_url_txt'] = 'Clicca qui per maggiori informazioni.'; ?> diff --git a/interface/web/admin/lib/lang/it_tpl_default_admin.lng b/interface/web/admin/lib/lang/it_tpl_default_admin.lng index 04d2bd959a..ba9e1b41bb 100644 --- a/interface/web/admin/lib/lang/it_tpl_default_admin.lng +++ b/interface/web/admin/lib/lang/it_tpl_default_admin.lng @@ -1,18 +1,18 @@ diff --git a/interface/web/admin/lib/lang/it_users.lng b/interface/web/admin/lib/lang/it_users.lng index e657d2ae96..2c5dbeda48 100644 --- a/interface/web/admin/lib/lang/it_users.lng +++ b/interface/web/admin/lib/lang/it_users.lng @@ -1,13 +1,13 @@ diff --git a/interface/web/admin/lib/lang/it_users_list.lng b/interface/web/admin/lib/lang/it_users_list.lng index decfe623aa..6d2acae1ec 100644 --- a/interface/web/admin/lib/lang/it_users_list.lng +++ b/interface/web/admin/lib/lang/it_users_list.lng @@ -5,5 +5,5 @@ $wb['client_id_txt'] = 'Client ID'; $wb['active_txt'] = 'Attivo'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo user'; $wb['warning_txt'] = 'ATTENZIONE: non editare o modificare alcuna impostazione utente in questa schermata. Usare piuttosto le impostazioni Cliente/Rivenditore del modulo Clienti. Modificare Utenti o gruppi in questa schermata può provocare la perdita di dati.'; -$wb['groups_txt'] = 'Groups'; +$wb['groups_txt'] = 'Gruppi'; ?> diff --git a/interface/web/client/lib/lang/it_client.lng b/interface/web/client/lib/lang/it_client.lng index 883bb42487..9b2e6492cf 100644 --- a/interface/web/client/lib/lang/it_client.lng +++ b/interface/web/client/lib/lang/it_client.lng @@ -3,11 +3,11 @@ $wb['limit_maildomain_txt'] = 'Numero massimo di domini di posta'; $wb['limit_mailbox_txt'] = 'Numero massimo di caselle di posta'; $wb['limit_mailalias_txt'] = 'Numero massimo di aliases di posta'; $wb['limit_mailforward_txt'] = 'Numero massimo di forwarders di posta'; -$wb['limit_mailcatchall_txt'] = 'Numero massimo di catchall accounts'; +$wb['limit_mailcatchall_txt'] = 'Numero massimo di profili catchall'; $wb['limit_mailrouting_txt'] = 'Numero massimo di email routes'; $wb['limit_mail_wblist_txt'] = 'Max. number of email white / blacklist entries'; $wb['limit_mailfilter_txt'] = 'Numero massimo di email filters'; -$wb['limit_fetchmail_txt'] = 'Numero massimo di fetchmail accounts'; +$wb['limit_fetchmail_txt'] = 'Numero massimo di profili fetchmail'; $wb['limit_mailquota_txt'] = 'Limite quota mailbox'; $wb['limit_spamfilter_wblist_txt'] = 'Numero massimo di filtri spamfilter white / blacklist'; $wb['limit_spamfilter_user_txt'] = 'Numero massimo di utenti spamfilter'; @@ -43,7 +43,7 @@ $wb['limit_subdomain_txt'] = 'limit_subdomain'; $wb['limit_webquota_txt'] = 'limit_webquota'; $wb['limit_database_txt'] = 'Numero massimo database'; $wb['ip_address_txt'] = 'Indirizzi ip'; -$wb['limit_client_error_notint'] = 'The sub client limit must be a number.'; +$wb['limit_client_error_notint'] = 'Il numero di sub-cliente deve essere un numero.'; $wb['firstname_error_empty'] = 'Nome è vuoto.'; $wb['contact_error_empty'] = 'Nome azienda è vuoto.'; $wb['default_webserver_txt'] = 'Webserver predefinito'; @@ -61,95 +61,95 @@ $wb['username_error_unique'] = 'Il nome utente deve essere unico.'; $wb['limit_maildomain_error_notint'] = 'Il limite dei domini email devessere un numero.'; $wb['limit_mailbox_error_notint'] = 'Il limite delle caselle di posta devessere un numero.'; $wb['limit_mailalias_error_notint'] = 'Il limite di email alias deve essere un numero.'; -$wb['limit_mailforward_error_notint'] = 'The email forward limit must be a number.'; -$wb['limit_mailcatchall_error_notint'] = 'The email catchall limit must be a number.'; -$wb['limit_mailrouting_error_notint'] = 'The email routing limit must be a number.'; -$wb['limit_mail_wblist_error_notint'] = 'The email white / blacklist limit must be a number.'; -$wb['limit_mailfilter_error_notint'] = 'The email filter limit must be a number.'; -$wb['limit_mailfetchmail_error_notint'] = 'The fetchmail limit must be a number.'; -$wb['limit_mailquota_error_notint'] = 'The email quota limit must be a number.'; -$wb['limit_spamfilter_wblist_error_notint'] = 'The spamfilter white / blacklist limit must be a number.'; -$wb['limit_spamfilter_user_error_notint'] = 'The spamfilter user limit must be a number.'; -$wb['limit_spamfilter_policy_error_notint'] = 'The spamfilter policy limit must be a number.'; -$wb['limit_web_domain_error_notint'] = 'The website limit must be a number.'; -$wb['limit_web_aliasdomain_error_notint'] = 'The website alias domain limit must be a number.'; -$wb['limit_web_subdomain_error_notint'] = 'The website subdomain limit must be a number.'; +$wb['limit_mailforward_error_notint'] = 'Il limite delle forward email deve essere un numero.'; +$wb['limit_mailcatchall_error_notint'] = 'Il limite delle mail catchall deve essere un numero.'; +$wb['limit_mailrouting_error_notint'] = 'Il limite di di routing email dve essere un numero.'; +$wb['limit_mail_wblist_error_notint'] = 'Il limite delle liste bianche / nere deve essere un numero.'; +$wb['limit_mailfilter_error_notint'] = 'Il limite di filtri email deve essere un numero.'; +$wb['limit_mailfetchmail_error_notint'] = 'Il limite di fetchmail deve essere un numero.'; +$wb['limit_mailquota_error_notint'] = 'La quota email deve essere un numero.'; +$wb['limit_spamfilter_wblist_error_notint'] = 'Il limite di liste bianche / nere di filtri SPAM deve essere un numero.'; +$wb['limit_spamfilter_user_error_notint'] = 'Il limite di utenti di filtri SPAM deve essere un numero.'; +$wb['limit_spamfilter_policy_error_notint'] = 'Il limite delle politiche di spamfilter deve essere un numero.'; +$wb['limit_web_domain_error_notint'] = 'Il limite di siti web deve essere un numero.'; +$wb['limit_web_aliasdomain_error_notint'] = 'Il limite dei domini web Alias deve essere un numero.'; +$wb['limit_web_subdomain_error_notint'] = 'Il limite dei siti web sottodomini deve essere un numero.'; $wb['limit_ftp_user_error_notint'] = 'Il limite degli utenti ftp deve essere un numero.'; $wb['limit_shell_user_error_notint'] = 'Il limite degli utenti shell deve essere un numero.'; $wb['limit_dns_zone_error_notint'] = 'Il limite dei record dns deve essere un numero.'; -$wb['limit_dns_slave_zone_error_notint'] = 'The dns slave zone limit must be a number.'; +$wb['limit_dns_slave_zone_error_notint'] = 'Il limite delle zone DNS slave deve essere un numero.'; $wb['default_dbserver_txt'] = 'Server Database predefinito'; $wb['limit_database_error_notint'] = 'Il limite dei database deve essere un numero.'; $wb['username_error_regex'] = 'Il nome utente contiene caratteri non validi.'; -$wb['password_strength_txt'] = 'Sicurezza della Password'; +$wb['password_strength_txt'] = 'Robustezza della Password'; $wb['template_master_txt'] = 'Principale'; $wb['template_additional_txt'] = 'Aggiuntivo'; -$wb['ssh_chroot_txt'] = 'SSH-Chroot Options'; -$wb['web_php_options_txt'] = 'PHP Options'; -$wb['limit_cron_txt'] = 'Max. number of cron jobs'; -$wb['limit_cron_type_txt'] = 'Max. type of cron jobs (chrooted and full implies url)'; -$wb['limit_cron_frequency_txt'] = 'Min. delay between executions'; -$wb['limit_cron_error_notint'] = 'The cron limit must be a number.'; -$wb['limit_cron_error_frequency'] = 'The cron frequency limit must be a number.'; -$wb['limit_client_error'] = 'The max. number of clients is reached.'; -$wb['limit_mailaliasdomain_txt'] = 'Max. number of domain aliases'; -$wb['limit_mailaliasdomain_error_notint'] = 'The email domain alias limit must be a number.'; +$wb['ssh_chroot_txt'] = 'Opzioni chroot SSH'; +$wb['web_php_options_txt'] = 'Opzioni PHP'; +$wb['limit_cron_txt'] = 'Numero massimo di cron jobs'; +$wb['limit_cron_type_txt'] = 'Massimo tipo di cron jobs (chrooted e completi implica url)'; +$wb['limit_cron_frequency_txt'] = 'Ritardo minimo tra le esecuzioni'; +$wb['limit_cron_error_notint'] = 'Il limite di cron deve essere un numero.'; +$wb['limit_cron_error_frequency'] = 'Il limite di frequenza cron deve essere un numero.'; +$wb['limit_client_error'] = 'Hai raggiunto il numero massimo di clienti.'; +$wb['limit_mailaliasdomain_txt'] = 'Massimo numero di domini Alias'; +$wb['limit_mailaliasdomain_error_notint'] = 'Il numero massimo di domini email alias devve essere un numero.'; $wb['limit_web_quota_txt'] = 'Quota Web'; $wb['limit_traffic_quota_txt'] = 'Quota Traffico'; -$wb['limit_trafficquota_error_notint'] = 'Traffic Quota must be a number.'; -$wb['limit_webdav_user_txt'] = 'Max. number of Webdav users'; -$wb['limit_webdav_user_error_notint'] = 'The webdav user limit must be a number.'; -$wb['customer_no_txt'] = 'Customer No.'; +$wb['limit_trafficquota_error_notint'] = 'La quota traffico deve essere un numero.'; +$wb['limit_webdav_user_txt'] = 'Massimo numero di utenti Webdav'; +$wb['limit_webdav_user_error_notint'] = 'Il numero massimo di utenti Webdav deve essere un numero.'; +$wb['customer_no_txt'] = 'n° Cliente'; $wb['vat_id_txt'] = 'P. IVA'; $wb['required_fields_txt'] = '* Campi obbligatori'; -$wb['limit_mailmailinglist_txt'] = 'Max. number of mailing lists'; -$wb['limit_mailmailinglist_error_notint'] = 'The mailing list record limit must be a number.'; +$wb['limit_mailmailinglist_txt'] = 'Massimo numero di mailing lists'; +$wb['limit_mailmailinglist_error_notint'] = 'Il numero di mailing list deve essere un numero.'; $wb['company_id_txt'] = 'Azienda/Titolare ID'; $wb['limit_openvz_vm_txt'] = 'Numero massimo server virtuali'; -$wb['limit_openvz_vm_template_id_txt'] = 'Force virtual server template'; -$wb['limit_openvz_vm_error_notint'] = 'The virtual server limit must be a number.'; -$wb['web_php_options_notempty'] = 'No PHP option(s) selected. Select at least one PHP option.'; -$wb['ssh_chroot_notempty'] = 'No SSH chroot option selected. Select at least one option.'; -$wb['username_error_collision'] = 'The username may not start with the word -web- or -web- followed by a number.'; -$wb['add_additional_template_txt'] = 'Add additional template'; -$wb['delete_additional_template_txt'] = 'Elimina additional template'; -$wb['limit_cgi_txt'] = 'CGI available'; -$wb['limit_ssi_txt'] = 'SSI available'; -$wb['limit_perl_txt'] = 'Perl available'; -$wb['limit_ruby_txt'] = 'Ruby available'; -$wb['limit_python_txt'] = 'Python available'; -$wb['force_suexec_txt'] = 'SuEXEC forced'; -$wb['limit_hterror_txt'] = 'Custom error docs available'; -$wb['limit_wildcard_txt'] = 'Wildcard subdomain available'; -$wb['limit_ssl_txt'] = 'SSL available'; -$wb['bank_account_number_txt'] = 'Bank account no.'; -$wb['bank_code_txt'] = 'Bank code'; -$wb['bank_name_txt'] = 'Bank name'; +$wb['limit_openvz_vm_template_id_txt'] = 'Forzare il modello dei server virtuali'; +$wb['limit_openvz_vm_error_notint'] = 'Il limite dei server virtuali deve essere un numero.'; +$wb['web_php_options_notempty'] = 'Nessuna opzione PHP selezionata. Seleziona almeno una opzione PHP.'; +$wb['ssh_chroot_notempty'] = 'Nessuna opzione chroot SSH selezionata. Seleziona almeno una opzione.'; +$wb['username_error_collision'] = 'Il nome utente non può iniziare con la parola -web- o con -web- seguito da un numero.'; +$wb['add_additional_template_txt'] = 'Aggiungi un modello'; +$wb['delete_additional_template_txt'] = 'Elimina un modello'; +$wb['limit_cgi_txt'] = 'CGI disponibile'; +$wb['limit_ssi_txt'] = 'SSI disponibile'; +$wb['limit_perl_txt'] = 'Perl disponibile'; +$wb['limit_ruby_txt'] = 'Ruby disponibile'; +$wb['limit_python_txt'] = 'Python disponibile'; +$wb['force_suexec_txt'] = 'SuEXEC imposto'; +$wb['limit_hterror_txt'] = 'Messaggi di errore personalizzati disponibili'; +$wb['limit_wildcard_txt'] = 'Sottodomini * disponibile'; +$wb['limit_ssl_txt'] = 'SSL disponibile'; +$wb['bank_account_number_txt'] = 'n° Conto corrente bancario'; +$wb['bank_code_txt'] = 'Codice Banca'; +$wb['bank_name_txt'] = 'Nome Banca'; $wb['bank_account_iban_txt'] = 'IBAN'; $wb['bank_account_swift_txt'] = 'BIC / Swift'; -$wb['web_limits_txt'] = 'Web Limits'; -$wb['email_limits_txt'] = 'Email Limits'; -$wb['database_limits_txt'] = 'Database Limits'; -$wb['cron_job_limits_txt'] = 'Cron Job Limits'; -$wb['dns_limits_txt'] = 'DNS Limits'; -$wb['virtualization_limits_txt'] = 'Virtualization Limits'; +$wb['web_limits_txt'] = 'Limiti Web'; +$wb['email_limits_txt'] = 'Limiti Email'; +$wb['database_limits_txt'] = 'Limiti Database'; +$wb['cron_job_limits_txt'] = 'Limiti Cron Job'; +$wb['dns_limits_txt'] = 'Limiti DNS'; +$wb['virtualization_limits_txt'] = 'Limiti Virtualizzazione'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['active_template_additional_txt'] = 'AttivoAddons'; -$wb['bank_account_owner_txt'] = 'Bank account owner'; -$wb['email_error_isemail'] = 'Please enter a valid email address.'; -$wb['customer_no_error_unique'] = 'The customer no. must be unique (or empty).'; -$wb['paypal_email_error_isemail'] = 'Please enter a valid PayPal email address.'; -$wb['paypal_email_txt'] = 'PayPal Email'; -$wb['err_msg_master_tpl_set'] = 'All custom limit settings are ignored if any master template other than \\"custom\\" is selected.'; -$wb['aps_limits_txt'] = 'APS Installer Limits'; -$wb['limit_aps_txt'] = 'Max. number of APS instances'; -$wb['limit_aps_error_notint'] = 'The APS instances limit must be a number.'; -$wb['default_slave_dnsserver_txt'] = 'Default Secondary DNS Server'; -$wb['locked_txt'] = 'Locked (disables everything except DNS)'; -$wb['canceled_txt'] = 'Cancellato(disables client login)'; +$wb['active_template_additional_txt'] = 'Attivo Addons'; +$wb['bank_account_owner_txt'] = 'Titolare conto bancario'; +$wb['email_error_isemail'] = 'Inserire un email valido.'; +$wb['customer_no_error_unique'] = 'Il n° di cliente deve essere univoco (o vuoto).'; +$wb['paypal_email_error_isemail'] = 'Inserire una email valida per PayPal.'; +$wb['paypal_email_txt'] = 'email PayPal'; +$wb['err_msg_master_tpl_set'] = 'Tutti i limiti personalizzati impostati sono ignorati se viene selezionato un modello master diverso da \\"custom\\".'; +$wb['aps_limits_txt'] = 'Limite installazione APS'; +$wb['limit_aps_txt'] = 'Numero massimo di istanze APS'; +$wb['limit_aps_error_notint'] = 'Il limite di istanze APS deve essere un numero.'; +$wb['default_slave_dnsserver_txt'] = 'Server DNS secondario default'; +$wb['locked_txt'] = 'Bloccato (Disabilita tutto eccetto DNS)'; +$wb['canceled_txt'] = 'Cancellato (disabilita il login del cliente)'; $wb['gender_txt'] = 'Titolo'; $wb['gender_m_txt'] = 'Sig.'; $wb['gender_f_txt'] = 'Sig.ra'; @@ -157,52 +157,52 @@ $wb['added_by_txt'] = 'Aggiunto da'; $wb['added_date_txt'] = 'Data inserimento'; $wb['parent_client_id_txt'] = 'Cliente di rivenditore'; $wb['none_txt'] = 'Nessuno'; -$wb['contact_firstname_txt'] = 'Contact firstname'; -$wb['limit_backup_txt'] = 'Backupfunction available'; -$wb['xmpp_limits_txt'] = 'XMPP Limits'; +$wb['contact_firstname_txt'] = 'Nome contatto'; +$wb['limit_backup_txt'] = 'Funzione backup disponibile'; +$wb['xmpp_limits_txt'] = 'Limiti XMPPs'; $wb['web_servers_txt'] = 'Webservers'; -$wb['web_servers_placeholder'] = 'Select webservers'; -$wb['no_web_server_error'] = 'At least one webserver must be selected.'; -$wb['web_servers_used'] = 'The server you are trying to remove from this client is used as a webserver. Be sure that this server is not used by this client before you remove it.'; -$wb['dns_servers_txt'] = 'DNS servers'; -$wb['dns_servers_placeholder'] = 'Select DNS servers'; -$wb['no_dns_server_error'] = 'At least one DNS server must be selected.'; -$wb['dns_servers_used'] = 'The server you are trying to remove from this client is used as a DNS server. Be sure that this server is not used by this client before you remove it.'; -$wb['db_servers_txt'] = 'Database servers'; -$wb['db_servers_placeholder'] = 'Select database servers'; -$wb['no_db_server_error'] = 'At least one Database server must be selected.'; -$wb['db_servers_used'] = 'The server you are trying to remove from this client is used as a Database server. Be sure that this server is not used by this client before you remove it.'; +$wb['web_servers_placeholder'] = 'Seleziona webservers'; +$wb['no_web_server_error'] = 'Almeno un webserver deve essere selezionato.'; +$wb['web_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come sito Web. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['dns_servers_txt'] = 'Server DNS'; +$wb['dns_servers_placeholder'] = 'Seleziona i server DNS'; +$wb['no_dns_server_error'] = 'Almeno un server DNS deve essere selezionato.'; +$wb['dns_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server DNS. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['db_servers_txt'] = 'Server Database'; +$wb['db_servers_placeholder'] = 'Seleziona server database'; +$wb['no_db_server_error'] = 'Almeno un server Database server deve essere selezionato.'; +$wb['db_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server Database. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['mail_servers_txt'] = 'Mailservers'; -$wb['mail_servers_placeholder'] = 'Select mailservers'; -$wb['no_mail_server_error'] = 'At least one mailserver must be selected.'; -$wb['mail_servers_used'] = 'The server you are trying to remove from this client is used as a Mailserver. Be sure that this server is not used by this client before you remove it.'; -$wb['xmpp_servers_txt'] = 'XMPP Servers'; -$wb['xmpp_servers_placeholder'] = 'Select XMPP Servers'; -$wb['no_xmpp_server_error'] = 'At least one XMPP Server must be selected.'; -$wb['xmpp_servers_used'] = 'The server you are trying to remove from this client is used as a XMPP Server. Be sure that this server is not used by this client before you remove it.'; -$wb['limit_xmpp_domain_error_notint'] = 'The XMPP domain limit must be a number.'; -$wb['limit_xmpp_user_error_notint'] = 'The XMPP user limit must be a number.'; -$wb['limit_xmpp_domain_txt'] = 'Max. number of XMPP domains'; -$wb['limit_xmpp_user_txt'] = 'Max. number of XMPP accounts'; -$wb['limit_xmpp_muc_txt'] = 'Multiuser chat available'; -$wb['limit_xmpp_pastebin_txt'] = 'Pastebin for MUC available'; -$wb['limit_xmpp_httparchive_txt'] = 'HTTP archive for MUC available'; -$wb['limit_xmpp_anon_txt'] = 'Anonymous host available'; -$wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available'; -$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available'; -$wb['limit_xmpp_status_txt'] = 'Status host available'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['reseller_txt'] = 'Reseller'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['invalid_vat_id'] = 'The VAT ID is invalid.'; -$wb['email_error_empty'] = 'Email is empty'; -$wb['limit_database_user_txt'] = 'Max. Database users'; -$wb['limit_database_user_error_notint'] = 'The database user limit must be a number.'; -$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; -$wb['limit_directive_snippets_txt'] = 'Show web server config selection'; -$wb['password_click_to_set_txt'] = 'Click to set'; -$wb['limit_dns_record_error_notint'] = 'The dns record limit must be a number.'; -$wb['Address'] = 'Address'; -$wb['Limits'] = 'Limits'; +$wb['mail_servers_placeholder'] = 'Seleziona mailservers'; +$wb['no_mail_server_error'] = 'Almeno un server mail deve essere selezionato.'; +$wb['mail_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come serve Mail. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['xmpp_servers_txt'] = 'Server XMPP'; +$wb['xmpp_servers_placeholder'] = 'Seleziona server XMPP'; +$wb['no_xmpp_server_error'] = 'Almeno un server XMPP deve essere selezionato.'; +$wb['xmpp_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server XMPP. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['limit_xmpp_domain_error_notint'] = 'Il limite dei domini XMPP deve essere un numero.'; +$wb['limit_xmpp_user_error_notint'] = 'Il limite degli utenti XMPP deve essere un numero.'; +$wb['limit_xmpp_domain_txt'] = 'Numero massimo di domini XMPP'; +$wb['limit_xmpp_user_txt'] = 'Massimo numero di profili XMPP'; +$wb['limit_xmpp_muc_txt'] = 'Multiuser chat disponibile'; +$wb['limit_xmpp_pastebin_txt'] = 'Pastebin per MUC disponibile'; +$wb['limit_xmpp_httparchive_txt'] = 'Archivio HTTP per MUC disponibile'; +$wb['limit_xmpp_anon_txt'] = 'host anonimo disponibile'; +$wb['limit_xmpp_vjud_txt'] = 'Rubrica utenti VJUD disponibile'; +$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy disponibile'; +$wb['limit_xmpp_status_txt'] = 'Status host disponibile'; +$wb['limit_database_quota_txt'] = 'quota Database'; +$wb['limit_database_quota_error_notint'] = 'La quota database deve essere un numero.'; +$wb['reseller_txt'] = 'Rivenditori'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['invalid_vat_id'] = 'Il n° di IVA non + valido.'; +$wb['email_error_empty'] = 'Email è vuoto'; +$wb['limit_database_user_txt'] = 'Massimo numero utenti Database'; +$wb['limit_database_user_error_notint'] = 'Il numero di utenti database deve essere un numero.'; +$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt disponibile'; +$wb['limit_directive_snippets_txt'] = 'Mostra selezione di configurazione del server web'; +$wb['password_click_to_set_txt'] = 'Clicca per impostare'; +$wb['limit_dns_record_error_notint'] = 'Il limite di record DNS deve essere un numero.'; +$wb['Address'] = 'Indirizzo'; +$wb['Limits'] = 'Limiti'; diff --git a/interface/web/client/lib/lang/it_client_circle.lng b/interface/web/client/lib/lang/it_client_circle.lng index b7703b4f99..70ff1fd6e0 100644 --- a/interface/web/client/lib/lang/it_client_circle.lng +++ b/interface/web/client/lib/lang/it_client_circle.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/client/lib/lang/it_client_circle_list.lng b/interface/web/client/lib/lang/it_client_circle_list.lng index faa225f058..a7e74f32e3 100644 --- a/interface/web/client/lib/lang/it_client_circle_list.lng +++ b/interface/web/client/lib/lang/it_client_circle_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/client/lib/lang/it_client_del.lng b/interface/web/client/lib/lang/it_client_del.lng index a17dc6a7ff..ec0e31aa3c 100644 --- a/interface/web/client/lib/lang/it_client_del.lng +++ b/interface/web/client/lib/lang/it_client_del.lng @@ -3,8 +3,8 @@ $wb['confirm_action_txt'] = 'Conferma operazione'; $wb['delete_explanation'] = 'Questa operazione cancellerà i seguenti record associati a questo cliente'; $wb['btn_save_txt'] = 'Cancella cliente'; $wb['btn_cancel_txt'] = 'Annulla senza cancellare il cliente'; -$wb['confirm_client_delete_txt'] = 'Are you sure you want to delete this client?'; -$wb['list_head_txt'] = 'Delete Client'; -$wb['table_txt'] = 'Table'; -$wb['data_txt'] = 'Data'; +$wb['confirm_client_delete_txt'] = 'Sei sicuro di voler cancellare questo Cliente?'; +$wb['list_head_txt'] = 'Cancella Cliente'; +$wb['table_txt'] = 'Tavola'; +$wb['data_txt'] = 'Dati'; ?> diff --git a/interface/web/client/lib/lang/it_client_message.lng b/interface/web/client/lib/lang/it_client_message.lng index 6e8f0fe1b8..fcb5c20e57 100644 --- a/interface/web/client/lib/lang/it_client_message.lng +++ b/interface/web/client/lib/lang/it_client_message.lng @@ -1,20 +1,20 @@ diff --git a/interface/web/client/lib/lang/it_client_message_template.lng b/interface/web/client/lib/lang/it_client_message_template.lng index f9c7d11c4d..d464077026 100644 --- a/interface/web/client/lib/lang/it_client_message_template.lng +++ b/interface/web/client/lib/lang/it_client_message_template.lng @@ -1,13 +1,13 @@ diff --git a/interface/web/client/lib/lang/it_client_message_template_list.lng b/interface/web/client/lib/lang/it_client_message_template_list.lng index d9c307ed52..a79bad2a1d 100644 --- a/interface/web/client/lib/lang/it_client_message_template_list.lng +++ b/interface/web/client/lib/lang/it_client_message_template_list.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/client/lib/lang/it_client_template.lng b/interface/web/client/lib/lang/it_client_template.lng index 119d5d28e5..418bb033c7 100644 --- a/interface/web/client/lib/lang/it_client_template.lng +++ b/interface/web/client/lib/lang/it_client_template.lng @@ -1,24 +1,24 @@ ipo di Modello'; +$wb['limit_mailmailinglist_txt'] = 'Numero massimo delle mailing lists'; +$wb['limit_mailmailinglist_error_notint'] = 'Il limite dell mailing list deve essere un numero.'; +$wb['limit_openvz_vm_txt'] = 'Numero massimo di Virtual Server'; +$wb['limit_openvz_vm_template_id_txt'] = 'Forza modello per virtual server'; +$wb['limit_openvz_vm_error_notint'] = 'Il limite di server virtuali deve essere un numero.'; +$wb['ssh_chroot_txt'] = 'Opzioni chroot SSH'; +$wb['web_php_options_txt'] = 'Opzioni PHP'; +$wb['limit_cgi_txt'] = 'CGI disponibile'; +$wb['limit_ssi_txt'] = 'SSI disponibile'; +$wb['limit_perl_txt'] = 'Perl disponibile'; +$wb['limit_ruby_txt'] = 'Ruby disponibile'; +$wb['limit_python_txt'] = 'Python disponibile'; +$wb['force_suexec_txt'] = 'SuEXEC imposto'; +$wb['limit_hterror_txt'] = 'Messaggi di errore personalizzati disponibile'; +$wb['limit_wildcard_txt'] = 'Sottodomini * disponibile'; +$wb['limit_ssl_txt'] = 'SSL disponibile'; +$wb['web_limits_txt'] = 'Limite Web'; +$wb['email_limits_txt'] = 'Limite Email'; +$wb['database_limits_txt'] = 'Database'; +$wb['cron_job_limits_txt'] = 'Limite Cron Job'; +$wb['dns_limits_txt'] = 'Limite DNS'; +$wb['virtualization_limits_txt'] = 'Limite Virtualizzazioni'; +$wb['aps_limits_txt'] = 'Limite installazione APS'; +$wb['limit_aps_txt'] = 'Numero massimo di istanze APS'; +$wb['limit_aps_error_notint'] = 'Il limite delle istanze APS deve essere un numero.'; +$wb['limit_domainmodule_txt'] = 'Limiti del modulo Domini'; +$wb['client_limits_txt'] = 'Limite Clienti'; +$wb['template_name_txt'] = 'Nome Modello'; +$wb['limit_mail_backup_txt'] = 'Funzione backup email disponibile'; +$wb['default_mailserver_txt'] = 'Mailserver Default'; +$wb['default_webserver_txt'] = 'Webserver Default'; +$wb['default_dnsserver_txt'] = 'Default Server DNS'; +$wb['default_slave_dnsserver_txt'] = 'Default Server DNS Secondario'; +$wb['limit_backup_txt'] = 'Funzione backup disponibile'; $wb['default_dbserver_txt'] = 'Default Database Server'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['xmpp_limits_txt'] = 'XMPP Limits'; -$wb['xmpp_servers_txt'] = 'XMPP Servers'; -$wb['xmpp_servers_placeholder'] = 'Select XMPP Servers'; -$wb['no_xmpp_server_error'] = 'At least one XMPP Server must be selected.'; -$wb['xmpp_servers_used'] = 'The server you are trying to remove from this client is used as a XMPP Server. Be sure that this server is not used by this client before you remove it.'; -$wb['limit_xmpp_domain_error_notint'] = 'The XMPP domain limit must be a number.'; -$wb['limit_xmpp_user_error_notint'] = 'The XMPP user limit must be a number.'; -$wb['limit_xmpp_domain_txt'] = 'Max. number of XMPP domains'; -$wb['limit_xmpp_user_txt'] = 'Max. number of XMPP accounts'; -$wb['limit_xmpp_muc_txt'] = 'Multiuser chat available'; -$wb['limit_xmpp_pastebin_txt'] = 'Pastebin for MUC available'; -$wb['limit_xmpp_httparchive_txt'] = 'HTTP archive for MUC available'; -$wb['limit_xmpp_anon_txt'] = 'Anonymous host available'; -$wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available'; -$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available'; -$wb['limit_xmpp_status_txt'] = 'Status host available'; -$wb['dns_servers_txt'] = 'DNS servers'; -$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; -$wb['limit_directive_snippets_txt'] = 'Show web server config selection'; -$wb['limit_database_user_txt'] = 'Max. Database users'; +$wb['limit_database_quota_txt'] = 'Quota Database'; +$wb['limit_database_quota_error_notint'] = 'Il limite di quota database deve essere un numero.'; +$wb['xmpp_limits_txt'] = 'Limiti XMPP'; +$wb['xmpp_servers_txt'] = 'Servers XMPP'; +$wb['xmpp_servers_placeholder'] = 'Seleziona i Server XMPP'; +$wb['no_xmpp_server_error'] = 'Almeno un Server XMPP deve essere selezionato.'; +$wb['xmpp_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è usato come server XMPP. Assicurati che questo server non sia in uso da questo cliente prima di rimuoverlo.'; +$wb['limit_xmpp_domain_error_notint'] = 'Il limite dei domini XMPP deve essere un numero.'; +$wb['limit_xmpp_user_error_notint'] = 'Il limite degli utenti XMPP deve essere un numero.'; +$wb['limit_xmpp_domain_txt'] = 'Numero massimo di domini XMPP'; +$wb['limit_xmpp_user_txt'] = 'Numero massimo di profili XMPP'; +$wb['limit_xmpp_muc_txt'] = 'chat multiutente disponibile'; +$wb['limit_xmpp_pastebin_txt'] = 'Pastebin per MUC disponibile'; +$wb['limit_xmpp_httparchive_txt'] = 'Archivio su HTTP per MUC disponibile'; +$wb['limit_xmpp_anon_txt'] = 'host anonimo disponibile'; +$wb['limit_xmpp_vjud_txt'] = 'Rubrica utenti VJUD disponibile'; +$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy disponibile'; +$wb['limit_xmpp_status_txt'] = 'Status host disponibile'; +$wb['dns_servers_txt'] = 'servers DNS'; +$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt disponibile'; +$wb['limit_directive_snippets_txt'] = 'Mostra selezione configurazione web server'; +$wb['limit_database_user_txt'] = 'Numero massimo utenti database'; $wb['web_servers_txt'] = 'Webservers'; $wb['db_servers_txt'] = 'Database servers'; $wb['mail_servers_txt'] = 'Mailservers'; -$wb['Limits'] = 'Limits'; +$wb['Limits'] = 'Limiti'; diff --git a/interface/web/client/lib/lang/it_client_template_list.lng b/interface/web/client/lib/lang/it_client_template_list.lng index 43b1a5ca49..0d22389e35 100644 --- a/interface/web/client/lib/lang/it_client_template_list.lng +++ b/interface/web/client/lib/lang/it_client_template_list.lng @@ -2,6 +2,6 @@ $wb['list_head_txt'] = 'Modelli cliente'; $wb['template_type_txt'] = 'Tipo'; $wb['template_name_txt'] = 'Nome modello'; -$wb['template_id_txt'] = 'Template ID'; -$wb['sys_groupid_txt'] = 'Reseller'; +$wb['template_id_txt'] = 'Modello ID'; +$wb['sys_groupid_txt'] = 'Rivenditore'; ?> diff --git a/interface/web/client/lib/lang/it_clients_list.lng b/interface/web/client/lib/lang/it_clients_list.lng index 6b502eea88..674f65f284 100644 --- a/interface/web/client/lib/lang/it_clients_list.lng +++ b/interface/web/client/lib/lang/it_clients_list.lng @@ -7,8 +7,8 @@ $wb['city_txt'] = 'Città'; $wb['country_txt'] = 'Stato'; $wb['add_new_record_txt'] = 'Aggiungi nuovo cliente'; $wb['username_txt'] = 'Nome Utente'; -$wb['customer_no_txt'] = 'Customer No.'; -$wb['locked_txt'] = 'Locked'; -$wb['yes_txt'] = 'Yes'; +$wb['customer_no_txt'] = 'n° Cliente'; +$wb['locked_txt'] = 'Bloccato'; +$wb['yes_txt'] = 'si'; $wb['no_txt'] = 'No'; ?> diff --git a/interface/web/client/lib/lang/it_domain.lng b/interface/web/client/lib/lang/it_domain.lng index 7c26779aae..dba372981a 100644 --- a/interface/web/client/lib/lang/it_domain.lng +++ b/interface/web/client/lib/lang/it_domain.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/client/lib/lang/it_reseller.lng b/interface/web/client/lib/lang/it_reseller.lng index ca1f01467d..2acac2cb60 100644 --- a/interface/web/client/lib/lang/it_reseller.lng +++ b/interface/web/client/lib/lang/it_reseller.lng @@ -1,25 +1,25 @@ 0 or -1 (unlimited)'; +$wb['limit_aps_txt'] = 'Massimo numero di istanze APS'; +$wb['limit_aps_error_notint'] = 'Il limite di istanze APS edve essere un numero.'; +$wb['default_slave_dnsserver_txt'] = 'Server DNS Secondario Default'; +$wb['locked_txt'] = 'Bloccato'; +$wb['canceled_txt'] = 'Eliminato'; +$wb['gender_m_txt'] = 'Sig.'; +$wb['gender_f_txt'] = 'Sig.ra'; +$wb['gender_txt'] = 'Titolo'; +$wb['customer_no_template_txt'] = 'Modello n° Cliente'; +$wb['customer_no_template_error_regex_txt'] = 'Il modello del n° cliente contiene caratteri non ammessi'; +$wb['customer_no_start_txt'] = 'Valore iniziale del n° cliente'; +$wb['customer_no_counter_txt'] = 'Contatore n° Cliente'; +$wb['added_by_txt'] = 'Aggiunto da'; +$wb['added_date_txt'] = 'Aggiunto in data'; +$wb['limit_domainmodule_error_notint'] = 'Il limite del modulo di Domini deve essere un numero.'; +$wb['limit_domainmodule_txt'] = 'Limite modulo Domini'; +$wb['client_limits_txt'] = 'Limiti Cliente'; +$wb['err_msg_master_tpl_set'] = 'Tutti i limiti personalizzati sono ignorati se viene selezionato un mìtemplate master diverso da \\"custom\\".'; +$wb['contact_firstname_txt'] = 'Nome contatto'; +$wb['limit_backup_txt'] = 'Funzione Backup disponibile'; +$wb['limit_client_error_positive_or_unlimited'] = 'Il numero di clienti deve essere > 0 or -1 (illimitato)'; $wb['web_servers_txt'] = 'Webservers'; -$wb['web_servers_placeholder'] = 'Select Webservers'; -$wb['no_web_server_error'] = 'At least one webserver must be selected.'; -$wb['web_servers_used'] = 'The server you are trying to remove from this client is used as a webserver. Be sure that this server is not used by this client before to remove it.'; +$wb['web_servers_placeholder'] = 'Seleziona Webservers'; +$wb['no_web_server_error'] = 'Almeno un webserver deve essere selezionato.'; +$wb['web_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come web server. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['dns_servers_txt'] = 'DNS Server'; -$wb['dns_servers_placeholder'] = 'Select DNS Servers'; -$wb['no_dns_server_error'] = 'At least one DNS server must be selected.'; -$wb['dns_servers_used'] = 'The server you are trying to remove from this client is used as a DNS server. Be sure that this server is not used by this client before to remove it.'; +$wb['dns_servers_placeholder'] = 'Seleziona DNS Servers'; +$wb['no_dns_server_error'] = 'Almeno un DNS server deve essere selezionato.'; +$wb['dns_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come DNS server. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['db_servers_txt'] = 'Database Server'; -$wb['db_servers_placeholder'] = 'Select Database Servers'; -$wb['no_db_server_error'] = 'At least one Database server must be selected.'; -$wb['db_servers_used'] = 'The server you are trying to remove from this client is used as a Database server. Be sure that this server is not used by this client before to remove it.'; +$wb['db_servers_placeholder'] = 'Seleziona Database Servers'; +$wb['no_db_server_error'] = 'Almeno un Database server deve essere selezionato.'; +$wb['db_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come Database server. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; $wb['mail_servers_txt'] = 'Mailservers'; -$wb['mail_servers_placeholder'] = 'Select Mailservers'; -$wb['no_mail_server_error'] = 'At least one Mailserver must be selected.'; -$wb['mail_servers_used'] = 'The server you are trying to remove from this client is used as a Mailserver. Be sure that this server is not used by this client before to remove it.'; -$wb['xmpp_limits_txt'] = 'XMPP Limits'; +$wb['mail_servers_placeholder'] = 'Seleziona Mailservers'; +$wb['no_mail_server_error'] = 'Almeno un Mailserver deve essere selezionate.'; +$wb['mail_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server Mail. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['xmpp_limits_txt'] = 'Limiti XMPP'; $wb['xmpp_servers_txt'] = 'XMPP Servers'; -$wb['xmpp_servers_placeholder'] = 'Select XMPP Servers'; -$wb['no_xmpp_server_error'] = 'At least one XMPP Server must be selected.'; -$wb['xmpp_servers_used'] = 'The server you are trying to remove from this client is used as a XMPP Server. Be sure that this server is not used by this client before you remove it.'; -$wb['limit_xmpp_domain_error_notint'] = 'The XMPP domain limit must be a number.'; -$wb['limit_xmpp_user_error_notint'] = 'The XMPP user limit must be a number.'; -$wb['limit_xmpp_domain_txt'] = 'Max. number of XMPP domains'; -$wb['limit_xmpp_user_txt'] = 'Max. number of XMPP accounts'; -$wb['limit_xmpp_muc_txt'] = 'Multiuser chat available'; -$wb['limit_xmpp_pastebin_txt'] = 'Pastebin for MUC available'; -$wb['limit_xmpp_httparchive_txt'] = 'HTTP archive for MUC available'; -$wb['limit_xmpp_anon_txt'] = 'Anonymous host available'; -$wb['limit_xmpp_vjud_txt'] = 'VJUD user directory available'; -$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy available'; -$wb['limit_xmpp_status_txt'] = 'Status host available'; -$wb['invalid_vat_id'] = 'The VAT ID is invalid.'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['email_error_empty'] = 'Email is empty'; -$wb['limit_database_user_txt'] = 'Max. Database users'; -$wb['limit_database_user_error_notint'] = 'The database user limit must be a number.'; -$wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt available'; -$wb['limit_directive_snippets_txt'] = 'Show web server config selection'; -$wb['password_click_to_set_txt'] = 'Click to set'; -$wb['Reseller'] = 'Reseller'; -$wb['Address'] = 'Address'; -$wb['Limits'] = 'Limits'; +$wb['xmpp_servers_placeholder'] = 'Seleziona XMPP Servers'; +$wb['no_xmpp_server_error'] = 'Almeno un XMPP Server deve essere selezionata.'; +$wb['xmpp_servers_used'] = 'Il server che stai cercando di rimuovere da questo cliente è in uso come server XMPP. Assicurati che non sia usato dal cliente prima di tentare di rimuoverlo.'; +$wb['limit_xmpp_domain_error_notint'] = 'Il limite di domini XMPP deve essere un numero.'; +$wb['limit_xmpp_user_error_notint'] = 'Il limite di utenti XMPP deve essere un numero.'; +$wb['limit_xmpp_domain_txt'] = 'Massimo numero di domini XMPP'; +$wb['limit_xmpp_user_txt'] = 'Massimo numero di profili XMPP'; +$wb['limit_xmpp_muc_txt'] = 'Multiuser chat disponibile'; +$wb['limit_xmpp_pastebin_txt'] = 'Pastebin per MUC disponibile'; +$wb['limit_xmpp_httparchive_txt'] = 'Archivio HTTP per MUC disponibile'; +$wb['limit_xmpp_anon_txt'] = 'host anonimo disponibile'; +$wb['limit_xmpp_vjud_txt'] = 'Rubrica utenti VJUD disponibile'; +$wb['limit_xmpp_proxy_txt'] = 'Bytestream proxy disponibile'; +$wb['limit_xmpp_status_txt'] = 'Status host disponibile'; +$wb['invalid_vat_id'] = 'Il numero IVA non è corretto.'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['email_error_empty'] = 'Email è vuoto'; +$wb['limit_database_user_txt'] = 'Massimo numero di utenti Database'; +$wb['limit_database_user_error_notint'] = 'Il limite di utente database deve essere un numero.'; +$wb['limit_database_quota_txt'] = 'Quota Database'; +$wb['limit_database_quota_error_notint'] = 'La quota database deve essere un numore.'; +$wb['limit_ssl_letsencrypt_txt'] = 'Let\'s Encrypt disponibile'; +$wb['limit_directive_snippets_txt'] = 'Mostra selezione configurazione server web'; +$wb['password_click_to_set_txt'] = 'Clicca per impostare'; +$wb['Reseller'] = 'Rivenditore'; +$wb['Address'] = 'Indirizzo'; +$wb['Limits'] = 'Limiti'; diff --git a/interface/web/client/lib/lang/it_resellers_list.lng b/interface/web/client/lib/lang/it_resellers_list.lng index 079ce84f4d..dbf6b8f6ec 100644 --- a/interface/web/client/lib/lang/it_resellers_list.lng +++ b/interface/web/client/lib/lang/it_resellers_list.lng @@ -6,6 +6,6 @@ $wb['contact_name_txt'] = 'Contatto'; $wb['city_txt'] = 'Città'; $wb['country_txt'] = 'Nazione'; $wb['add_new_record_txt'] = 'Aggiungi nuovo rivenditore'; -$wb['customer_no_txt'] = 'Customer No.'; +$wb['customer_no_txt'] = 'n° cliente'; $wb['username_txt'] = 'Nome Utente'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_donate.lng b/interface/web/dashboard/lib/lang/it_dashlet_donate.lng index e41c374cde..803301e046 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_donate.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_donate.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng b/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng index 8cae3dfb4f..bde1eb9f97 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_invoice_client_settings.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng b/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng index a680daa8f6..8c5eec03a1 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_invoices.lng @@ -1,18 +1,18 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng index 8f2b2d70d8..8cf14ea629 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng @@ -1,15 +1,15 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng index daaaa67f49..6b7fc62c1e 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_mailquota.lng @@ -4,5 +4,5 @@ $wb['email_txt'] = 'Indirizzo e-mail'; $wb['name_txt'] = 'Nome'; $wb['used_txt'] = 'Spazio Usato'; $wb['quota_txt'] = 'Quota'; -$wb['no_email_accounts_txt'] = 'Nessun account e-mail trovato.'; +$wb['no_email_accounts_txt'] = 'Nessun profilo e-mail trovato.'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_products.lng b/interface/web/dashboard/lib/lang/it_dashlet_products.lng index a69b61d2fb..9e5895d711 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_products.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_products.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/dashboard/lib/lang/it_dashlet_shop.lng b/interface/web/dashboard/lib/lang/it_dashlet_shop.lng index 1e0b5361d7..0befa94c0a 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_shop.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_shop.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/dns/lib/lang/it_dns_a.lng b/interface/web/dns/lib/lang/it_dns_a.lng index f45709437e..b6d94f76a5 100644 --- a/interface/web/dns/lib/lang/it_dns_a.lng +++ b/interface/web/dns/lib/lang/it_dns_a.lng @@ -1,17 +1,17 @@ diff --git a/interface/web/dns/lib/lang/it_dns_a_list.lng b/interface/web/dns/lib/lang/it_dns_a_list.lng index 4c9a3de2dd..cd3682a217 100644 --- a/interface/web/dns/lib/lang/it_dns_a_list.lng +++ b/interface/web/dns/lib/lang/it_dns_a_list.lng @@ -2,14 +2,14 @@ $wb['list_head_txt'] = 'A-Record'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; -$wb['zone_txt'] = 'Zone'; +$wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Nome'; -$wb['data_txt'] = 'Data'; -$wb['aux_txt'] = 'Priorita'; +$wb['data_txt'] = 'Dati'; +$wb['aux_txt'] = 'Priorità'; $wb['ttl_txt'] = 'TTL'; -$wb['type_txt'] = 'Type'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS A-Record'; -$wb['page_txt'] = 'Page'; -$wb['page_of_txt'] = 'of'; +$wb['type_txt'] = 'Tipo'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo DNS A-Record'; +$wb['page_txt'] = 'Pagina'; +$wb['page_of_txt'] = 'di'; $wb['delete_confirmation'] = 'Vuoi davvero eliminare questo record?'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_aaaa.lng b/interface/web/dns/lib/lang/it_dns_aaaa.lng index a54f87a5fa..8de4a2c5e2 100644 --- a/interface/web/dns/lib/lang/it_dns_aaaa.lng +++ b/interface/web/dns/lib/lang/it_dns_aaaa.lng @@ -6,7 +6,7 @@ $wb['type_txt'] = 'tipo'; $wb['data_txt'] = 'Indirizzo IPv6'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo records DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo records DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; diff --git a/interface/web/dns/lib/lang/it_dns_alias.lng b/interface/web/dns/lib/lang/it_dns_alias.lng index e2eade0f8a..c95d9b01e2 100644 --- a/interface/web/dns/lib/lang/it_dns_alias.lng +++ b/interface/web/dns/lib/lang/it_dns_alias.lng @@ -1,17 +1,17 @@ diff --git a/interface/web/dns/lib/lang/it_dns_caa.lng b/interface/web/dns/lib/lang/it_dns_caa.lng index 8040cb4d54..3cd8efd365 100644 --- a/interface/web/dns/lib/lang/it_dns_caa.lng +++ b/interface/web/dns/lib/lang/it_dns_caa.lng @@ -1,19 +1,19 @@ diff --git a/interface/web/dns/lib/lang/it_dns_cname.lng b/interface/web/dns/lib/lang/it_dns_cname.lng index ced97b351a..0e05f1ea8f 100644 --- a/interface/web/dns/lib/lang/it_dns_cname.lng +++ b/interface/web/dns/lib/lang/it_dns_cname.lng @@ -6,12 +6,12 @@ $wb['type_txt'] = 'tipo'; $wb['data_txt'] = 'Target Nome Host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; $wb['data_error_empty'] = 'Target nome host vuoto'; $wb['data_error_regex'] = 'Target nome host formato errato'; -$wb['data_error_duplicate'] = 'Duplicate A, AAAA, ALIAS, CNAME, or DNAME record'; +$wb['data_error_duplicate'] = 'record A, AAAA, ALIAS, CNAME, or DNAME Duplicato'; $wb['ttl_range_error'] = 'TTL time minimo 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_dkim.lng b/interface/web/dns/lib/lang/it_dns_dkim.lng index 4d45fb4fe9..dd05a1fa1e 100644 --- a/interface/web/dns/lib/lang/it_dns_dkim.lng +++ b/interface/web/dns/lib/lang/it_dns_dkim.lng @@ -1,13 +1,13 @@ diff --git a/interface/web/dns/lib/lang/it_dns_dmarc.lng b/interface/web/dns/lib/lang/it_dns_dmarc.lng index cf78bb8eed..64e66f4a93 100644 --- a/interface/web/dns/lib/lang/it_dns_dmarc.lng +++ b/interface/web/dns/lib/lang/it_dns_dmarc.lng @@ -1,50 +1,50 @@ diff --git a/interface/web/dns/lib/lang/it_dns_dname.lng b/interface/web/dns/lib/lang/it_dns_dname.lng index e9d1a057cc..1e1e548b6b 100644 --- a/interface/web/dns/lib/lang/it_dns_dname.lng +++ b/interface/web/dns/lib/lang/it_dns_dname.lng @@ -6,7 +6,7 @@ $wb['type_txt'] = 'tipo'; $wb['data_txt'] = 'Target Nome Host'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo di record DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Formato errato per Nome Host.'; diff --git a/interface/web/dns/lib/lang/it_dns_ds.lng b/interface/web/dns/lib/lang/it_dns_ds.lng index c3622dc5b5..52fd45af0e 100644 --- a/interface/web/dns/lib/lang/it_dns_ds.lng +++ b/interface/web/dns/lib/lang/it_dns_ds.lng @@ -1,17 +1,17 @@ diff --git a/interface/web/dns/lib/lang/it_dns_hinfo.lng b/interface/web/dns/lib/lang/it_dns_hinfo.lng index 905b1e62e2..7ffae6a63c 100644 --- a/interface/web/dns/lib/lang/it_dns_hinfo.lng +++ b/interface/web/dns/lib/lang/it_dns_hinfo.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/it_dns_import.lng b/interface/web/dns/lib/lang/it_dns_import.lng index 1d734ab4b0..3f49ddc427 100644 --- a/interface/web/dns/lib/lang/it_dns_import.lng +++ b/interface/web/dns/lib/lang/it_dns_import.lng @@ -5,21 +5,21 @@ $wb['btn_save_txt'] = 'Importa file di zona'; $wb['btn_cancel_txt'] = 'Annulla'; $wb['domain_txt'] = 'Dominio'; $wb['zone_file_successfully_imported_txt'] = 'File di zona importato con successo!'; -$wb['error_no_valid_zone_file_txt'] = 'Fil di zona non corretto!'; +$wb['error_no_valid_zone_file_txt'] = 'File di zona non corretto!'; $wb['zonefile_to_import_txt'] = 'File di Zona'; $wb['domain_field_desc_txt'] = 'Può essere tralasciato se il dominio è nel nome del file di zona o nel contenuto del file.'; $wb['title'] = 'Importa file di zona'; $wb['no_file_uploaded_error'] = 'Nessun file di zona selezionato'; $wb['zone_file_import_txt'] = 'Importa file di zona'; -$wb['error_no_server_id'] = 'No server provided.'; -$wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -$wb['zone_already_exists'] = 'This zone already exists, you must delete or rename it first.'; -$wb['zone_not_allowed'] = 'This zone is not allowed for this account.'; -$wb['zone_file_missing_soa'] = 'The zone file must contain a SOA record.'; -$wb['zone_file_multiple_soa'] = 'The zone file cannot contain multiple SOA records.'; -$wb['zone_file_soa_parser'] = 'The SOA record in this zone file could not be processed. Ensure SERIAL, REFRESH, RETRY, EXPIRE and MINIMUM are each on a separate line from other data.'; -$wb['ignore_record_not_class_in'] = 'Ignoring DNS record, not class IN.'; -$wb['ignore_record_unknown_type'] = 'Ignoring DNS record, unknown type.'; -$wb['ignore_record_invalid_owner'] = 'Ignoring DNS record, not able to validate owner name.'; -$wb['zone_file_import_fail'] = 'The zone file did not import.'; +$wb['error_no_server_id'] = 'Nessun server indicato.'; +$wb['error_not_allowed_server_id'] = 'Il server selezionato non è consentito per il tuo profilo.'; +$wb['zone_already_exists'] = 'Questa zona esiste già devi prima cancellarla o rinominarla.'; +$wb['zone_not_allowed'] = 'Questa zona non è consentita per il tuo profilo.'; +$wb['zone_file_missing_soa'] = 'Il file di zoma deve contenere un record SOA.'; +$wb['zone_file_multiple_soa'] = 'Il file di zona non può avere più di un record SOA.'; +$wb['zone_file_soa_parser'] = 'Il record SOA di questa zona non può essere processato. Verifica che SERIAL, REFRESH, RETRY, EXPIRE and MINIMUM siano ognuno in una linea diversa da altri dati.'; +$wb['ignore_record_not_class_in'] = 'Ignoro record DNS non di tipo IN.'; +$wb['ignore_record_unknown_type'] = 'Ignoro record DNS record di tipo sconosciuto.'; +$wb['ignore_record_invalid_owner'] = 'Ignoro record DNS non essendo possibile di validare il nome del titolare.'; +$wb['zone_file_import_fail'] = 'Il file di zona non è stato importato.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_loc.lng b/interface/web/dns/lib/lang/it_dns_loc.lng index dc9ad9a006..3aed26d4ff 100644 --- a/interface/web/dns/lib/lang/it_dns_loc.lng +++ b/interface/web/dns/lib/lang/it_dns_loc.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/it_dns_mx.lng b/interface/web/dns/lib/lang/it_dns_mx.lng index d01ec250e1..221670a87d 100644 --- a/interface/web/dns/lib/lang/it_dns_mx.lng +++ b/interface/web/dns/lib/lang/it_dns_mx.lng @@ -7,12 +7,12 @@ $wb['data_txt'] = 'Mailserver hostname'; $wb['aux_txt'] = 'Priorita'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'The hostname vuoto.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['data_error_empty'] = 'Mailserver hostname empty'; -$wb['data_error_regex'] = 'Mailserver hostname format invalid'; -$wb['duplicate_mx_record_txt'] = 'Duplicate MX record.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['name_error_empty'] = 'Campo hostname è vuoto.'; +$wb['name_error_regex'] = 'L\'hostname ha un formato errato.'; +$wb['data_error_empty'] = 'hostname del Mailserver vuoto'; +$wb['data_error_regex'] = 'L\'hostname del Mailserver ha un formato non valido'; +$wb['duplicate_mx_record_txt'] = 'record MX Duplicato.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_naptr.lng b/interface/web/dns/lib/lang/it_dns_naptr.lng index b39373c13d..124897d596 100644 --- a/interface/web/dns/lib/lang/it_dns_naptr.lng +++ b/interface/web/dns/lib/lang/it_dns_naptr.lng @@ -1,21 +1,21 @@ diff --git a/interface/web/dns/lib/lang/it_dns_ns.lng b/interface/web/dns/lib/lang/it_dns_ns.lng index 4ee8be59c8..03f2281695 100644 --- a/interface/web/dns/lib/lang/it_dns_ns.lng +++ b/interface/web/dns/lib/lang/it_dns_ns.lng @@ -6,11 +6,11 @@ $wb['type_txt'] = 'type'; $wb['data_txt'] = 'Hostname'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Numero massimo record DNS raggiunto per il tuo account.'; +$wb['limit_dns_record_txt'] = 'Numero massimo record DNS raggiunto per il tuo profilo.'; $wb['no_zone_perm'] = 'Non hai i permessi per aggiungere record a questa zona DNS.'; $wb['name_error_empty'] = 'Zona vuota.'; $wb['name_error_regex'] = 'La zona ha un formato errato.'; $wb['data_error_empty'] = 'Nameserver vuoto'; $wb['data_error_regex'] = 'Formato nameserver non valido'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_ptr.lng b/interface/web/dns/lib/lang/it_dns_ptr.lng index 0da6da4366..ea30150116 100644 --- a/interface/web/dns/lib/lang/it_dns_ptr.lng +++ b/interface/web/dns/lib/lang/it_dns_ptr.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/it_dns_rp.lng b/interface/web/dns/lib/lang/it_dns_rp.lng index 691177bfe5..fdeb758d54 100644 --- a/interface/web/dns/lib/lang/it_dns_rp.lng +++ b/interface/web/dns/lib/lang/it_dns_rp.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/it_dns_slave.lng b/interface/web/dns/lib/lang/it_dns_slave.lng index beae2824e4..dd6ef101d9 100644 --- a/interface/web/dns/lib/lang/it_dns_slave.lng +++ b/interface/web/dns/lib/lang/it_dns_slave.lng @@ -1,17 +1,17 @@ these IPs (comma separated list)'; -$wb['server_id_error_empty'] = 'No server selected'; -$wb['origin_error_empty'] = 'Zone vuoto.'; -$wb['origin_error_unique'] = 'There is already a record for this zone.'; -$wb['origin_error_regex'] = 'Zone has a invalid format.'; -$wb['ns_error_regex'] = 'NS has a invalid format.'; -$wb['eg_domain_tld'] = 'e.g. domain.tld.'; -$wb['ipv4_form_txt'] = 'Separate multiple IPs with commas'; -$wb['secondary_zone_txt'] = 'Secondary DNS Zone'; +$wb['xfer_txt'] = 'Consenti il trasferimento di zona a
    questi IP (lista indirizzi separati da virgola)'; +$wb['server_id_error_empty'] = 'Nessun server selezionato'; +$wb['origin_error_empty'] = 'Zona vuoto.'; +$wb['origin_error_unique'] = 'Esiste già un record per questa zona.'; +$wb['origin_error_regex'] = 'Zona ha un formato non valido.'; +$wb['ns_error_regex'] = 'NS ha un formato non valido.'; +$wb['eg_domain_tld'] = 'esempio: domain.tld.'; +$wb['ipv4_form_txt'] = 'Separare più indirizzi IP con virgola'; +$wb['secondary_zone_txt'] = 'Zona DNS Secondaria'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng b/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng index 726f14ffd3..8365833402 100644 --- a/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng +++ b/interface/web/dns/lib/lang/it_dns_slave_admin_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/dns/lib/lang/it_dns_slave_list.lng b/interface/web/dns/lib/lang/it_dns_slave_list.lng index 3ab1a1de9d..2edbc37e2e 100644 --- a/interface/web/dns/lib/lang/it_dns_slave_list.lng +++ b/interface/web/dns/lib/lang/it_dns_slave_list.lng @@ -5,5 +5,5 @@ $wb['server_id_txt'] = 'Server'; $wb['origin_txt'] = 'Zona'; $wb['ns_txt'] = 'NS'; $wb['add_new_record_txt'] = 'Aggiungi una nuova zona DNS Secondaria'; -$wb['eg_domain_tld'] = 'e.g. domain.tld.'; +$wb['eg_domain_tld'] = 'esempio: domain.tld.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa.lng b/interface/web/dns/lib/lang/it_dns_soa.lng index 56dfd03daa..c3fc730945 100644 --- a/interface/web/dns/lib/lang/it_dns_soa.lng +++ b/interface/web/dns/lib/lang/it_dns_soa.lng @@ -4,16 +4,16 @@ $wb['origin_txt'] = 'Zona (SOA)'; $wb['ns_txt'] = 'NS'; $wb['mbox_txt'] = 'Email'; $wb['serial_txt'] = 'Seriale'; -$wb['refresh_txt'] = 'Refresh'; -$wb['retry_txt'] = 'Retry'; -$wb['expire_txt'] = 'Expire'; -$wb['minimum_txt'] = 'Minimum (negative cache ttl)'; +$wb['refresh_txt'] = 'Aggiornamento'; +$wb['retry_txt'] = 'Ritenta'; +$wb['expire_txt'] = 'Scade'; +$wb['minimum_txt'] = 'Minimo (cache ttl negativa)'; $wb['ttl_txt'] = 'TTL'; $wb['xfer_txt'] = 'Consenti trasferimento zone a
    questi IP (elenco separato da virgola)'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_zone_txt'] = 'Numero massimo zone DNS raggiunto per il tuo account.'; +$wb['limit_dns_zone_txt'] = 'Numero massimo zone DNS raggiunto per il tuo profilo.'; $wb['client_txt'] = 'Cliente'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record DNZ a questa zona.'; $wb['server_id_error_empty'] = 'Nessun server selezionato!'; $wb['origin_error_empty'] = 'Zona vuoto.'; $wb['origin_error_unique'] = 'Esiste già un record per questa zona.'; @@ -21,27 +21,25 @@ $wb['origin_error_regex'] = 'La zona ha un formato errato.'; $wb['ns_error_regex'] = 'NS ha un formato errato.'; $wb['mbox_error_empty'] = 'Email vuoto.'; $wb['mbox_error_regex'] = 'Email formato errato.'; -$wb['also_notify_txt'] = 'Also Notify'; -$wb['update_acl_txt'] = 'Aggiorna ACL'; +$wb['also_notify_txt'] = 'Notifica anche'; +$wb['update_acl_txt'] = 'Aggiorna ACL'; $wb['also_notify_error_regex'] = 'Per favore utilizza un indirizzo IP.'; $wb['seconds_txt'] = 'Secondi'; -$wb['eg_domain_tld'] = 'e.g. domain.tld'; -$wb['eg_ns1_domain_tld'] = 'e.g. ns1.domain.tld'; -$wb['eg_webmaster_domain_tld'] = 'e.g. webmaster@domain.tld'; -$wb['The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'] = 'Il dominio non può essere modificato. Per cortesia contatta l'; -$wb['refresh_range_error'] = 'Min. Refresh time di 60 secondi.'; -$wb['retry_range_error'] = 'Min. Retry time di 60 secondi.'; -$wb['expire_range_error'] = 'Min. Expire time di 60 secondi.'; -$wb['minimum_range_error'] = 'Min. Minimum time di 60 secondi.'; -$wb['ttl_range_error'] = 'Min. TTL time di 60 secondi.'; -$wb['xfer_error_regex'] = 'Also notify: Per cortesia utilizzare un indirizzo IP.'; +$wb['eg_domain_tld'] = 'esempio: domain.tld'; +$wb['eg_ns1_domain_tld'] = 'esempio: ns1.domain.tld'; +$wb['eg_webmaster_domain_tld'] = 'esempio: webmaster@domain.tld'; +$wb['The Domain can not be changed. Please ask your Administrator if you want to change the domain name.'] = 'Il dominio non può essere modificato. Per cortesia contatta l\'amministratore se vuoi cambiare il nome di dominio.'; +$wb['refresh_range_error'] = 'Minimo intevallo di aggiornamento di 60 secondi.'; +$wb['retry_range_error'] = 'Minimo intervallo di riprova di 60 secondi.'; +$wb['expire_range_error'] = 'Minimo tempo di scadenza di 60 secondi.'; +$wb['minimum_range_error'] = 'Minimo tempo di 60 secondi.'; +$wb['ttl_range_error'] = 'Min. TTL di 60 secondi.'; +$wb['xfer_error_regex'] = 'Notifica anche: Per cortesia utilizzare un indirizzo IP.'; $wb['dnssec_info_txt'] = 'DNSSEC DS-Data for registry'; -$wb['dnssec_wanted_txt'] = 'Sign zone (DNSSEC)'; -$wb['dnssec_wanted_info'] = 'When disabling DNSSEC keys are not going to be deleted if DNSSEC was enabled before and keys already have been generated but the zone will no longer be delivered in signed format afterwards. If you use PowerDNS, keys WILL be deleted!'; -$wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -$wb['soa_cannot_be_changed_txt'] = 'Die Zone (SOA) kann nicht verändert werden. Bitte kontaktieren Sie ihren Administrator, um die Zone zu ändern.'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; -$wb['dnssec_algo_txt'] = 'DNSSEC Algorithm'; -$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; -$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; +$wb['dnssec_wanted_txt'] = 'Firma la zona (DNSSEC)'; +$wb['dnssec_wanted_info'] = 'Quando viene disabilitata la DNSSEC le chiavi non vengono cancellate se erano già state generate ma la zona sarà distribuita in formato non firmato. Se si usa PowerDNS le chiavi verranno cancellate!'; +$wb['error_not_allowed_server_id'] = 'Il server selezionato non è abilitato per il tuo profilo.'; +$wb['soa_cannot_be_changed_txt'] = 'La zona SOA non può essere modificata. Contatta l\'Amministratore se hai necessità di fare la modifica.'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURATIONE'; +$wb['dnssec_algo_txt'] = 'Algoritmo DNSSEC'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng b/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng index a7cce01001..22ecde574e 100644 --- a/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng +++ b/interface/web/dns/lib/lang/it_dns_soa_admin_list.lng @@ -1,12 +1,12 @@ diff --git a/interface/web/dns/lib/lang/it_dns_soa_list.lng b/interface/web/dns/lib/lang/it_dns_soa_list.lng index 0e5ea64569..713e0149f6 100644 --- a/interface/web/dns/lib/lang/it_dns_soa_list.lng +++ b/interface/web/dns/lib/lang/it_dns_soa_list.lng @@ -1,11 +1,11 @@ diff --git a/interface/web/dns/lib/lang/it_dns_spf.lng b/interface/web/dns/lib/lang/it_dns_spf.lng index 0cbf77862f..3c707f0013 100644 --- a/interface/web/dns/lib/lang/it_dns_spf.lng +++ b/interface/web/dns/lib/lang/it_dns_spf.lng @@ -1,30 +1,30 @@ edit the existing record?'; -$wb['spf_record_exists_multiple_txt'] = 'Multiple SPF-Records exist for hostname "{hostname}". This will cause recipients to reject your mail! Delete or merge duplicate existing records and try again.'; -$wb['limit_dns_record_txt'] = 'The max. number of DNS records for your account is reached.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; -$wb['name_error_regex'] = 'The hostname has the wrong format.'; -$wb['btn_edit_as_txt_record_txt'] = 'Edit as TXT record'; +$wb['active_txt'] = 'Attivo'; +$wb['record_exists_txt'] = 'DNS-Record esite già'; +$wb['spf_record_exists_txt'] = 'SPF-Record esiste già per il nome host "{hostname}". Vuoi modificare il record esistente?'; +$wb['spf_record_exists_multiple_txt'] = 'Sono presenti più record SPF per il nome host "{hostname}". Questo causerà il rifiuto delle mail da parte dei destinatari. Cancella o unisci i doppioni esistenti e prova di nuovo.'; +$wb['limit_dns_record_txt'] = 'Hai raggiunto il massimo numero di record DNS per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere record a questa zona DNS.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondsi'; +$wb['name_error_regex'] = 'Il nome host ha un formato errato.'; +$wb['btn_edit_as_txt_record_txt'] = 'Modifica come record TXT'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_srv.lng b/interface/web/dns/lib/lang/it_dns_srv.lng index 6d77d66e7f..33790bbad1 100644 --- a/interface/web/dns/lib/lang/it_dns_srv.lng +++ b/interface/web/dns/lib/lang/it_dns_srv.lng @@ -3,18 +3,18 @@ $wb['server_id_txt'] = 'Server'; $wb['zone_txt'] = 'Zona'; $wb['name_txt'] = 'Nome Host'; $wb['type_txt'] = 'tipo'; -$wb['target_txt'] = 'Target'; -$wb['weight_txt'] = 'Weight'; -$wb['port_txt'] = 'Port'; +$wb['target_txt'] = 'Obiettivo'; +$wb['weight_txt'] = 'Peso'; +$wb['port_txt'] = 'Porta'; $wb['ttl_txt'] = 'TTL'; $wb['active_txt'] = 'Attivo'; -$wb['limit_dns_record_txt'] = 'Limite massimo record DNS raggiunto per il tuo account.'; -$wb['no_zone_perm'] = 'You do not have the permission to add a record to this DNS zone.'; -$wb['name_error_empty'] = 'Nome Host vuoto.'; +$wb['limit_dns_record_txt'] = 'Limite massimo record DNS raggiunto per il tuo profilo.'; +$wb['no_zone_perm'] = 'Non hai il permesso di aggiungere un record a questa zona DNS.'; +$wb['name_error_empty'] = 'Nome Host vuoto.'; $wb['name_error_regex'] = 'Nome Host formato errato.'; -$wb['data_error_empty'] = 'Server record empty'; -$wb['data_error_regex'] = 'Server record format invalid'; -$wb['srv_error_regex'] = 'Invalid server record format. The server record must contain 3 text strings separated by spaces.'; +$wb['data_error_empty'] = 'Server record vuoto'; +$wb['data_error_regex'] = 'Server record formato non valido'; +$wb['srv_error_regex'] = 'Formato Record del server non valido. Il record del server deve contenre 3 stringhe di testo separate da spazio.'; $wb['aux_txt'] = 'Priorita'; -$wb['ttl_range_error'] = 'Min. TTL time is 60 seconds.'; +$wb['ttl_range_error'] = 'Minimo TTL è 60 secondi.'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_sshfp.lng b/interface/web/dns/lib/lang/it_dns_sshfp.lng index dc9ad9a006..e592105311 100644 --- a/interface/web/dns/lib/lang/it_dns_sshfp.lng +++ b/interface/web/dns/lib/lang/it_dns_sshfp.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/it_dns_template.lng b/interface/web/dns/lib/lang/it_dns_template.lng index ee07983b28..6abf3801dc 100644 --- a/interface/web/dns/lib/lang/it_dns_template.lng +++ b/interface/web/dns/lib/lang/it_dns_template.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/dns/lib/lang/it_dns_template_list.lng b/interface/web/dns/lib/lang/it_dns_template_list.lng index 0d316c5629..f68205327a 100644 --- a/interface/web/dns/lib/lang/it_dns_template_list.lng +++ b/interface/web/dns/lib/lang/it_dns_template_list.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/dns/lib/lang/it_dns_tlsa.lng b/interface/web/dns/lib/lang/it_dns_tlsa.lng index 3b87e2ad59..762235dc39 100644 --- a/interface/web/dns/lib/lang/it_dns_tlsa.lng +++ b/interface/web/dns/lib/lang/it_dns_tlsa.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/dns/lib/lang/it_dns_txt.lng b/interface/web/dns/lib/lang/it_dns_txt.lng index de49712afd..5b184ed262 100644 --- a/interface/web/dns/lib/lang/it_dns_txt.lng +++ b/interface/web/dns/lib/lang/it_dns_txt.lng @@ -1,19 +1,19 @@ diff --git a/interface/web/dns/lib/lang/it_dns_wizard.lng b/interface/web/dns/lib/lang/it_dns_wizard.lng index 4174b0c5c4..4ea81375ec 100644 --- a/interface/web/dns/lib/lang/it_dns_wizard.lng +++ b/interface/web/dns/lib/lang/it_dns_wizard.lng @@ -12,10 +12,10 @@ $wb['ip_txt'] = 'Indirizzo IP'; $wb['error_origin_empty'] = 'Origine vuoto.'; $wb['error_ns_empty'] = 'NS vuoto.'; $wb['error_mbox_empty'] = 'Casella Mail vuoto.'; -$wb['error_refresh_empty'] = 'Refresh vuoto.'; -$wb['error_retry_empty'] = 'Retry vuoto.'; -$wb['error_expire_empty'] = 'Expire vuoto.'; -$wb['error_minimum_empty'] = 'Minimum vuoto.'; +$wb['error_refresh_empty'] = 'Aggiorna vuoto.'; +$wb['error_retry_empty'] = 'Riprova vuoto.'; +$wb['error_expire_empty'] = 'Scade vuoto.'; +$wb['error_minimum_empty'] = 'Minimo vuoto.'; $wb['error_ttl_empty'] = 'TTL vuoto.'; $wb['error_domain_empty'] = 'Dominio vuoto'; $wb['error_ip_empty'] = 'IP vuoto.'; @@ -25,21 +25,21 @@ $wb['error_email_empty'] = 'EMail vuoto.'; $wb['error_domain_regex'] = 'Dominio contiene caratteri non validi.'; $wb['error_ns1_regex'] = 'NS1 contiene caratteri non validi.'; $wb['error_ns2_regex'] = 'NS2 contiene caratteri non validi.'; -$wb['error_email_regex'] = 'Email does not contain a valid email address.'; -$wb['dns_zone_txt'] = 'DNS Zone'; +$wb['error_email_regex'] = 'Email non contiene un indirizzo mail valido.'; +$wb['dns_zone_txt'] = 'Zona DNS'; $wb['globalsearch_resultslimit_of_txt'] = 'di'; $wb['globalsearch_resultslimit_results_txt'] = 'risultati'; $wb['globalsearch_noresults_text_txt'] = 'Nessun risultato.'; $wb['globalsearch_noresults_limit_txt'] = '0 risultati'; $wb['globalsearch_searchfield_watermark_txt'] = 'Cerca'; $wb['globalsearch_suggestions_text_txt'] = 'Suggerimenti'; -$wb['list_head_txt'] = 'Wizard Zone DNS'; +$wb['list_head_txt'] = 'Procedura guidata Zona DNS'; $wb['list_desc_txt'] = 'Crea una zona DNS con un configuratore automatico'; -$wb['dkim_txt'] = 'DKIM enabled'; -$wb['ipv6_txt'] = 'IPv6 Address'; -$wb['error_ipv6_empty'] = 'IPv6 empty.'; -$wb['error_no_server_id'] = 'No server provided.'; -$wb['error_not_allowed_server_id'] = 'The selected server is not allowed for this account.'; -$wb['dnssec_txt'] = 'Sign zone (DNSSEC)'; -$wb['limit_dns_zone_txt'] = 'The max. number of DNS zones for your account is reached.'; +$wb['dkim_txt'] = 'DKIM Abilitato'; +$wb['ipv6_txt'] = 'Indirizzo IPv6'; +$wb['error_ipv6_empty'] = 'IPv6 vuoto.'; +$wb['error_no_server_id'] = 'Nessun server indicato.'; +$wb['error_not_allowed_server_id'] = 'Il server selezionato non è abilitato per il tuo profilo.'; +$wb['dnssec_txt'] = 'Firma zona (DNSSEC)'; +$wb['limit_dns_zone_txt'] = 'Hai raggiunto il massimo numero di zone DNS per il tuo profilo.'; ?> diff --git a/interface/web/help/lib/lang/it_faq_manage_questions_list.lng b/interface/web/help/lib/lang/it_faq_manage_questions_list.lng index 857a9d20a4..d5a66daac3 100644 --- a/interface/web/help/lib/lang/it_faq_manage_questions_list.lng +++ b/interface/web/help/lib/lang/it_faq_manage_questions_list.lng @@ -5,5 +5,5 @@ $wb['faq_delete_txt'] = 'Elimina'; $wb['faq_edit_txt'] = 'Modifica'; $wb['faq_sections_txt'] = 'Sezione'; $wb['faq_faq_questions_txt'] = 'Domande frequenti'; -$wb['faq_new_question_txt'] = 'Aggiungi nuova domanda & rispondi'; +$wb['faq_new_question_txt'] = 'Aggiungi nuova domanda & risposta'; ?> diff --git a/interface/web/help/lib/lang/it_support_message.lng b/interface/web/help/lib/lang/it_support_message.lng index 60999758fb..1525512490 100644 --- a/interface/web/help/lib/lang/it_support_message.lng +++ b/interface/web/help/lib/lang/it_support_message.lng @@ -3,7 +3,7 @@ $wb['recipient_id_txt'] = 'ID del Destinatario'; $wb['sender_id_txt'] = 'ID del Mittente'; $wb['subject_txt'] = 'Oggetto'; $wb['message_txt'] = 'Messaggio'; -$wb['tstamp_txt'] = 'Timestamp'; +$wb['tstamp_txt'] = 'Data'; $wb['reply_txt'] = 'Rispondi'; $wb['date_txt'] = 'Data'; $wb['support_request_subject_txt'] = 'Richiesta supporto'; diff --git a/interface/web/help/lib/lang/it_support_message_list.lng b/interface/web/help/lib/lang/it_support_message_list.lng index 1416474627..814618e819 100644 --- a/interface/web/help/lib/lang/it_support_message_list.lng +++ b/interface/web/help/lib/lang/it_support_message_list.lng @@ -3,5 +3,5 @@ $wb['list_head_txt'] = 'Messaggi di supporto'; $wb['sender_id_txt'] = 'Mittente'; $wb['subject_txt'] = 'Oggetto'; $wb['add_new_record_txt'] = 'Crea nuovo messaggio di supporto'; -$wb['date_txt'] = 'Date'; +$wb['date_txt'] = 'Data'; ?> diff --git a/interface/web/mail/lib/lang/it_backup_stats_list.lng b/interface/web/mail/lib/lang/it_backup_stats_list.lng index 79cd6c9a63..027ef0d0b5 100644 --- a/interface/web/mail/lib/lang/it_backup_stats_list.lng +++ b/interface/web/mail/lib/lang/it_backup_stats_list.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/mail/lib/lang/it_mail_alias.lng b/interface/web/mail/lib/lang/it_mail_alias.lng index eab82caf51..6f6cbe17f9 100644 --- a/interface/web/mail/lib/lang/it_mail_alias.lng +++ b/interface/web/mail/lib/lang/it_mail_alias.lng @@ -6,11 +6,11 @@ $wb['email_error_isemail'] = 'Indirizzo email non valido.'; $wb['email_error_unique'] = 'Indirizzo email duplicato.'; $wb['no_domain_perm'] = 'Permessi non sufficienti per questo dominio.'; $wb['destination_error_isemail'] = 'Email destinatario non valida.'; -$wb['limit_mailalias_txt'] = 'Raggiunto numero massimo di alias email per questo account.'; +$wb['limit_mailalias_txt'] = 'Raggiunto numero massimo di alias email per questo profilo.'; $wb['duplicate_mailbox_txt'] = 'Cé già una casella di posta con questo indirizzo email.'; $wb['domain_txt'] = 'Dominio'; -$wb['duplicate_email_alias_txt'] = 'This email alias does already exist.'; +$wb['duplicate_email_alias_txt'] = 'Questo alias email esiste già.'; $wb['source_txt'] = 'Alias'; -$wb['send_as_txt'] = 'Send as'; -$wb['send_as_exp'] = 'Allow target to send mail using this alias as origin'; -$wb['greylisting_txt'] = 'Enable greylisting'; +$wb['send_as_txt'] = 'Invia come'; +$wb['send_as_exp'] = 'Consenti di inviare mail come alias'; +$wb['greylisting_txt'] = 'Abilita le liste grigie'; diff --git a/interface/web/mail/lib/lang/it_mail_alias_list.lng b/interface/web/mail/lib/lang/it_mail_alias_list.lng index 0f77839b94..5ccede91e5 100644 --- a/interface/web/mail/lib/lang/it_mail_alias_list.lng +++ b/interface/web/mail/lib/lang/it_mail_alias_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/mail/lib/lang/it_mail_aliasdomain.lng b/interface/web/mail/lib/lang/it_mail_aliasdomain.lng index 698582eddb..cad85dcfec 100644 --- a/interface/web/mail/lib/lang/it_mail_aliasdomain.lng +++ b/interface/web/mail/lib/lang/it_mail_aliasdomain.lng @@ -1,11 +1,11 @@ diff --git a/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng b/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng index 176964e54a..cc79dc89c7 100644 --- a/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng +++ b/interface/web/mail/lib/lang/it_mail_aliasdomain_list.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/mail/lib/lang/it_mail_backup_list.lng b/interface/web/mail/lib/lang/it_mail_backup_list.lng index 73286a0737..f92d6671ec 100644 --- a/interface/web/mail/lib/lang/it_mail_backup_list.lng +++ b/interface/web/mail/lib/lang/it_mail_backup_list.lng @@ -1,16 +1,16 @@ diff --git a/interface/web/mail/lib/lang/it_mail_blacklist.lng b/interface/web/mail/lib/lang/it_mail_blacklist.lng index 0b4f16a7c4..ce87313dab 100644 --- a/interface/web/mail/lib/lang/it_mail_blacklist.lng +++ b/interface/web/mail/lib/lang/it_mail_blacklist.lng @@ -1,12 +1,12 @@ diff --git a/interface/web/mail/lib/lang/it_mail_content_filter.lng b/interface/web/mail/lib/lang/it_mail_content_filter.lng index 5169e7fd63..d2d9da5a31 100644 --- a/interface/web/mail/lib/lang/it_mail_content_filter.lng +++ b/interface/web/mail/lib/lang/it_mail_content_filter.lng @@ -3,7 +3,7 @@ $wb['server_id_txt'] = 'Server'; $wb['type_txt'] = 'Filter'; $wb['pattern_txt'] = 'Regexp. Pattern'; $wb['data_txt'] = 'Data'; -$wb['action_txt'] = 'Action'; +$wb['action_txt'] = 'Azione'; $wb['active_txt'] = 'Attivo'; $wb['pattern_error_empty'] = 'Pattern vuoto.'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_content_filter_list.lng b/interface/web/mail/lib/lang/it_mail_content_filter_list.lng index bfda794abf..fa9de14b13 100644 --- a/interface/web/mail/lib/lang/it_mail_content_filter_list.lng +++ b/interface/web/mail/lib/lang/it_mail_content_filter_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/mail/lib/lang/it_mail_domain.lng b/interface/web/mail/lib/lang/it_mail_domain.lng index 88e2c146df..13af4beb97 100644 --- a/interface/web/mail/lib/lang/it_mail_domain.lng +++ b/interface/web/mail/lib/lang/it_mail_domain.lng @@ -6,20 +6,21 @@ $wb['active_txt'] = 'Attivo'; $wb['domain_error_empty'] = 'Dominio vuoto.'; $wb['domain_error_unique'] = 'Dominio duplicato.'; $wb['domain_error_regex'] = 'Nome dominio non valido.'; -$wb['client_txt'] = 'Cleient'; -$wb['limit_maildomain_txt'] = 'Raggiunto numero massimo di domini email per questo account.'; +$wb['client_txt'] = 'Cliente'; +$wb['limit_maildomain_txt'] = 'Raggiunto numero massimo di domini email per questo profilo.'; $wb['policy_txt'] = 'Filtro Spam'; $wb['no_policy'] = '- non abilitato -'; -$wb['dkim_txt'] = 'enable DKIM'; -$wb['dkim_private_txt'] = 'DKIM Private-key'; -$wb['dkim_public_txt'] = 'DKIM Public-key\nfor information only'; -$wb['dkim_generate_txt'] = 'Generate DKIM Private-key'; +$wb['dkim_txt'] = 'abilita DKIM'; +$wb['dkim_private_txt'] = 'Chiave privata DKIM'; +$wb['dkim_public_txt'] = 'Chiave pubblica DKIM solo per informazione'; +$wb['dkim_generate_txt'] = 'Genera chiave DKIM Privata'; $wb['dkim_dns_txt'] = 'DNS-Record'; -$wb['dkim_private_key_error'] = 'Invalid DKIM-Private key'; -$wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM)'; -$wb['error_not_allowed_server_id'] = 'Chosen server is not allowed for this account.'; -$wb['dkim_selector_txt'] = 'DKIM-Selector'; -$wb['dkim_selector_error'] = 'Invalid DKIM-Selector. Use only lower-case alphanumeric characters (a-z or 0-9) up to 63 chars'; +$wb['dkim_private_key_error'] = 'Chave DKIM-Privata invalida'; +$wb['dkim_settings_txt'] = 'DomainKeys Identified Mail (DKIM) - Chiave di identificazione dominio mail'; +$wb['error_not_allowed_server_id'] = 'Non sei abilitato a operare su questo server'; +$wb['dkim_selector_txt'] = 'Selettore di chiave DKIM'; +$wb['dkim_selector_error'] = 'Selettore di chiave DKIM invalido. Usare solo caratteri minuscoli e cifre (a-z or 0-9) fino a max 63 caratteri.'; $wb['relayhost_txt'] = 'Relayhost'; -$wb['relayhost_user_txt'] = 'Relayhost User'; +$wb['relayhost_user_txt'] = 'Utente Relayhost'; $wb['relayhost_password_txt'] = 'Relayhost Password'; +?> diff --git a/interface/web/mail/lib/lang/it_mail_domain_catchall.lng b/interface/web/mail/lib/lang/it_mail_domain_catchall.lng index 7403fcd663..841a439125 100644 --- a/interface/web/mail/lib/lang/it_mail_domain_catchall.lng +++ b/interface/web/mail/lib/lang/it_mail_domain_catchall.lng @@ -2,12 +2,12 @@ $wb['domain_txt'] = 'Dominio'; $wb['destination_txt'] = 'Destinazione'; $wb['active_txt'] = 'Attivo'; -$wb['domain_error_unique'] = 'There is already a Catchall record for this domain.'; -$wb['no_domain_perm'] = 'Non hai i diritti per this domain.'; -$wb['domain_error_regex'] = 'Invalid domain name od domain contiene caratteri non validi.'; -$wb['limit_mailcatchall_txt'] = 'The max. number of email catchall accounts raggiunto per il tuo account.'; -$wb['source_txt'] = 'Source'; -$wb['destination_error_isemail'] = 'Destination is no valid email address.'; -$wb['greylisting_txt'] = 'Enable greylisting'; -$wb['send_as_txt'] = 'Send as'; -$wb['send_as_exp'] = 'Allow destination to send from email addresses in this domain'; +$wb['domain_error_unique'] = 'Esiste già un record catchall per questo dominio.'; +$wb['no_domain_perm'] = 'Non hai i diritti per questo dominio.'; +$wb['domain_error_regex'] = 'Il dominio contiene caratteri non validi.'; +$wb['limit_mailcatchall_txt'] = 'Hai raggiunto il massimo numero di mail catchall per il tuo profilo.'; +$wb['source_txt'] = 'Mittente'; +$wb['destination_error_isemail'] = 'Il Destinatario non è un indirizzo mail valido.'; +$wb['greylisting_txt'] = 'Abilita greylisting'; +$wb['send_as_txt'] = 'Invia comes'; +$wb['send_as_exp'] = 'Abilita ad inviare da indirizzi mail di questo dominio'; diff --git a/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng b/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng index 78515acd8a..b2b069e3fe 100644 --- a/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng +++ b/interface/web/mail/lib/lang/it_mail_domain_catchall_list.lng @@ -2,8 +2,8 @@ $wb['list_head_txt'] = 'Email Catchall'; $wb['active_txt'] = 'Attivo'; $wb['source_txt'] = 'source'; -$wb['destination_txt'] = 'Destination email address'; +$wb['destination_txt'] = 'Indirizzo email destinatario'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Catchall'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Catchall'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_domain_list.lng b/interface/web/mail/lib/lang/it_mail_domain_list.lng index fcdf0d2b55..e18a059072 100644 --- a/interface/web/mail/lib/lang/it_mail_domain_list.lng +++ b/interface/web/mail/lib/lang/it_mail_domain_list.lng @@ -2,6 +2,6 @@ $wb['list_head_txt'] = 'Dominio di Posta'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Domain'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo Dominio'; $wb['active_txt'] = 'Attivo'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_forward.lng b/interface/web/mail/lib/lang/it_mail_forward.lng index 6c4690c750..8cba861377 100644 --- a/interface/web/mail/lib/lang/it_mail_forward.lng +++ b/interface/web/mail/lib/lang/it_mail_forward.lng @@ -2,14 +2,14 @@ $wb['email_txt'] = 'Email'; $wb['destination_txt'] = 'Destinazione Email'; $wb['active_txt'] = 'Attivo'; -$wb['limit_mailforward_txt'] = 'Raggiunto il numero massimo di forwarders per il tuo account.'; +$wb['limit_mailforward_txt'] = 'Raggiunto il numero massimo di forwarders per il tuo profilo.'; $wb['duplicate_mailbox_txt'] = 'Esiste già una casella email per questo indirizzo'; $wb['domain_txt'] = 'Dominio'; $wb['source_txt'] = 'Source Email'; -$wb['destination_error_empty'] = 'The destination must not be empty.'; -$wb['destination_error_isemail'] = 'The destination contains at least one invalid email address.'; -$wb['email_error_isemail'] = 'Please enter a valid email address.'; +$wb['destination_error_empty'] = 'Il destinatario non può essere vuoto.'; +$wb['destination_error_isemail'] = 'Almeno un indirizzo email non valido tra i destinatari.'; +$wb['email_error_isemail'] = 'Inserire un indirizzo mail corretto.'; $wb['email_error_unique'] = 'Indirizzo email duplicato.'; -$wb['send_as_txt'] = 'Send as'; -$wb['send_as_exp'] = 'Allow target to send mail using this address as origin (if target is internal)'; -$wb['greylisting_txt'] = 'Enable greylisting'; +$wb['send_as_txt'] = 'Invia come'; +$wb['send_as_exp'] = 'Consenti al soggetto di inviare mail usando questo indirizzo come mittente (se il soggetto è interno)'; +$wb['greylisting_txt'] = 'Abilita liste grigie'; diff --git a/interface/web/mail/lib/lang/it_mail_forward_list.lng b/interface/web/mail/lib/lang/it_mail_forward_list.lng index 46215c510c..14687f01a7 100644 --- a/interface/web/mail/lib/lang/it_mail_forward_list.lng +++ b/interface/web/mail/lib/lang/it_mail_forward_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/mail/lib/lang/it_mail_get.lng b/interface/web/mail/lib/lang/it_mail_get.lng index 70770c22d4..9451959b1b 100644 --- a/interface/web/mail/lib/lang/it_mail_get.lng +++ b/interface/web/mail/lib/lang/it_mail_get.lng @@ -1,19 +1,19 @@ diff --git a/interface/web/mail/lib/lang/it_mail_get_list.lng b/interface/web/mail/lib/lang/it_mail_get_list.lng index 839a076d67..086f187afe 100644 --- a/interface/web/mail/lib/lang/it_mail_get_list.lng +++ b/interface/web/mail/lib/lang/it_mail_get_list.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/mail/lib/lang/it_mail_mailinglist.lng b/interface/web/mail/lib/lang/it_mail_mailinglist.lng index 15629238a9..37835237d8 100644 --- a/interface/web/mail/lib/lang/it_mail_mailinglist.lng +++ b/interface/web/mail/lib/lang/it_mail_mailinglist.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/mail/lib/lang/it_mail_relay_recipient.lng b/interface/web/mail/lib/lang/it_mail_relay_recipient.lng index 3bac79de1e..f3a9302ebc 100644 --- a/interface/web/mail/lib/lang/it_mail_relay_recipient.lng +++ b/interface/web/mail/lib/lang/it_mail_relay_recipient.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng b/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng index 17a1fa008d..3925fb7530 100644 --- a/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng +++ b/interface/web/mail/lib/lang/it_mail_relay_recipient_list.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng b/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng index b7daa3eaad..ea46965e4e 100644 --- a/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng +++ b/interface/web/mail/lib/lang/it_mail_spamfilter_list.lng @@ -4,5 +4,5 @@ $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['server_name_txt'] = 'server_name'; $wb['email_txt'] = 'Email'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo Spamfilter record'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo record Spamfilter'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_transport.lng b/interface/web/mail/lib/lang/it_mail_transport.lng index fbd1a58087..6b4734abaf 100644 --- a/interface/web/mail/lib/lang/it_mail_transport.lng +++ b/interface/web/mail/lib/lang/it_mail_transport.lng @@ -2,10 +2,10 @@ $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['destination_txt'] = 'Destinazione'; -$wb['type_txt'] = 'Type'; +$wb['type_txt'] = 'Tipo'; $wb['mx_txt'] = 'No MX lookup'; $wb['sort_order_txt'] = 'Ordina per'; $wb['active_txt'] = 'Attivo'; -$wb['limit_mailrouting_txt'] = 'The max. number of routes raggiunto per il tuo account.'; +$wb['limit_mailrouting_txt'] = 'Hai raggiunto il numero massimo di mailroutes per il tuo profilo.'; $wb['transport_txt'] = 'Transport'; -$wb['domain_error_unique'] = 'A mail transport for this Domain already exists on this server.'; +$wb['domain_error_unique'] = 'Un sistema di trasporto mail esiste già per questo dominio su questo server.'; diff --git a/interface/web/mail/lib/lang/it_mail_transport_list.lng b/interface/web/mail/lib/lang/it_mail_transport_list.lng index c89bb9ff77..4c0c6b6b33 100644 --- a/interface/web/mail/lib/lang/it_mail_transport_list.lng +++ b/interface/web/mail/lib/lang/it_mail_transport_list.lng @@ -5,5 +5,5 @@ $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['transport_txt'] = 'Transport'; $wb['sort_order_txt'] = 'Ordina per'; -$wb['add_new_record_txt'] = 'Aggiungi un nuovo transport'; +$wb['add_new_record_txt'] = 'Aggiungi un nuovo transport'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_user.lng b/interface/web/mail/lib/lang/it_mail_user.lng index 9d96407e45..fbfdfd2ae4 100644 --- a/interface/web/mail/lib/lang/it_mail_user.lng +++ b/interface/web/mail/lib/lang/it_mail_user.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/mail/lib/lang/it_mail_user_filter.lng b/interface/web/mail/lib/lang/it_mail_user_filter.lng index 1287b716ff..745e5deb1e 100644 --- a/interface/web/mail/lib/lang/it_mail_user_filter.lng +++ b/interface/web/mail/lib/lang/it_mail_user_filter.lng @@ -6,26 +6,26 @@ $wb['active_txt'] = 'Attivo'; $wb['rulename_error_empty'] = 'Nome vuoto.'; $wb['searchterm_is_empty'] = 'Termine ricerca vuoto.'; $wb['source_txt'] = 'Origine'; -$wb['target_error_regex'] = 'The target may only contain these characters: a-z, 0-9, -, ., _, &, /, and {space}'; -$wb['limit_mailfilter_txt'] = 'The max. number of mailfilters is reached.'; +$wb['target_error_regex'] = 'Può contenere solo: a-z, 0-9, -, ., _, &, /, e {spazio}'; +$wb['limit_mailfilter_txt'] = 'Hai raggiunto il numero massimo di filtri mail.'; $wb['subject_txt'] = 'Oggetto'; $wb['from_txt'] = 'Da'; $wb['to_txt'] = 'A'; -$wb['list_id_txt'] = 'List ID'; +$wb['list_id_txt'] = 'Lista ID'; $wb['contains_txt'] = 'Contiene'; $wb['is_txt'] = 'è'; $wb['begins_with_txt'] = 'Inizia con'; $wb['ends_with_txt'] = 'Termina con'; -$wb['regex_txt'] = 'Matches Regex'; +$wb['regex_txt'] = 'Soddisfa espressione'; $wb['delete_txt'] = 'Elimina'; -$wb['move_stop_txt'] = 'Move to'; -$wb['header_txt'] = 'Header'; -$wb['size_over_txt'] = 'Email size over (KB)'; -$wb['size_under_txt'] = 'Email size under (KB)'; -$wb['localpart_txt'] = 'Localpart'; -$wb['domain_txt'] = 'Domain'; -$wb['keep_txt'] = 'Keep'; -$wb['reject_txt'] = 'Reject'; +$wb['move_stop_txt'] = 'sposta a'; +$wb['header_txt'] = 'Intestazione'; +$wb['size_over_txt'] = 'dimensione Email oltre (KB)'; +$wb['size_under_txt'] = 'Dimensione Email inferiore (KB)'; +$wb['localpart_txt'] = 'Parte locale'; +$wb['domain_txt'] = 'Dominio'; +$wb['keep_txt'] = 'Mantieni'; +$wb['reject_txt'] = 'Rifiuta'; $wb['stop_txt'] = 'Stop'; -$wb['move_to_txt'] = 'Move to'; +$wb['move_to_txt'] = 'Sposta a'; ?> diff --git a/interface/web/mail/lib/lang/it_mail_whitelist.lng b/interface/web/mail/lib/lang/it_mail_whitelist.lng index fbc9980fed..3d683c9d06 100644 --- a/interface/web/mail/lib/lang/it_mail_whitelist.lng +++ b/interface/web/mail/lib/lang/it_mail_whitelist.lng @@ -1,12 +1,12 @@ diff --git a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng index 862999b00a..625b483309 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_blacklist.lng @@ -5,7 +5,7 @@ $wb['rid_txt'] = 'Utente'; $wb['email_txt'] = 'Email'; $wb['priority_txt'] = 'Priorita'; $wb['active_txt'] = 'Attivo'; -$wb['limit_spamfilter_wblist_txt'] = 'E stato raggiunto il numero massimo di record per White- o Blacklist del tuo account.'; +$wb['limit_spamfilter_wblist_txt'] = 'E stato raggiunto il numero massimo di record per White- o Blacklist del tuo profilo.'; $wb['10 - highest'] = '10 - elevato'; $wb['5 - medium'] = '5 - medio'; $wb['1 - lowest'] = '1 - minimo'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_config.lng b/interface/web/mail/lib/lang/it_spamfilter_config.lng index 05b1a3dacf..4f26656a18 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_config.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_config.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng b/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng index 7010d61471..cc6fa50261 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_policy_list.lng @@ -1,9 +1,9 @@ diff --git a/interface/web/mail/lib/lang/it_spamfilter_users.lng b/interface/web/mail/lib/lang/it_spamfilter_users.lng index 2f49b05a41..097d75ffbd 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_users.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_users.lng @@ -5,9 +5,9 @@ $wb['policy_id_txt'] = 'Policy'; $wb['email_txt'] = 'Email (Pattern)'; $wb['fullname_txt'] = 'Nome'; $wb['local_txt'] = 'Local'; -$wb['email_error_notempty'] = 'The email address must not be vuoto.'; -$wb['fullname_error_notempty'] = 'The name must not be vuoto.'; +$wb['email_error_notempty'] = 'L\'indirizzo mail non può essere vuoto.'; +$wb['fullname_error_notempty'] = 'Il nome non può essere vuoto.'; $wb['10 - highest'] = '10 - elevata'; $wb['5 - medium'] = '5 - media'; $wb['1 - lowest'] = '1 - minima'; -$wb['inherit_policy'] = '- Inherit domain setting -'; +$wb['inherit_policy'] = '- Importa le impostazioni del dominio -'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_users_list.lng b/interface/web/mail/lib/lang/it_spamfilter_users_list.lng index 3a70797550..33ffd4db99 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_users_list.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_users_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng index a484eaf4f8..277abadf1b 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_whitelist.lng @@ -5,7 +5,7 @@ $wb['rid_txt'] = 'Utente'; $wb['email_txt'] = 'Email'; $wb['priority_txt'] = 'Priorità'; $wb['active_txt'] = 'Attivo'; -$wb['limit_spamfilter_wblist_txt'] = 'Raggiunto numero massimo di record white/blacklist per questo account.'; +$wb['limit_spamfilter_wblist_txt'] = 'Raggiunto numero massimo di record white/blacklist per questo profilo.'; $wb['10 - highest'] = '10 - elevata'; $wb['5 - medium'] = '5 - media'; $wb['1 - lowest'] = '1 - minima'; diff --git a/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng b/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng index 1b75490065..2f91ad20a4 100644 --- a/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng +++ b/interface/web/mail/lib/lang/it_spamfilter_whitelist_list.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Whitelist Filtro Spam '; $wb['active_txt'] = 'Activo'; $wb['server_id_txt'] = 'Server'; -$wb['priority_txt'] = 'Priorita'; +$wb['priority_txt'] = 'Priorità'; $wb['rid_txt'] = 'Utente'; $wb['email_txt'] = 'Email in Whitelist'; $wb['add_new_record_txt'] = 'Adggiungi record Whitelist'; diff --git a/interface/web/mail/lib/lang/it_xmpp_domain.lng b/interface/web/mail/lib/lang/it_xmpp_domain.lng index 0541203b2e..9e375a433c 100644 --- a/interface/web/mail/lib/lang/it_xmpp_domain.lng +++ b/interface/web/mail/lib/lang/it_xmpp_domain.lng @@ -1,62 +1,62 @@ diff --git a/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng b/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng index af643eab5a..45c5b08979 100644 --- a/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng +++ b/interface/web/mail/lib/lang/it_xmpp_domain_admin_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/mail/lib/lang/it_xmpp_domain_list.lng b/interface/web/mail/lib/lang/it_xmpp_domain_list.lng index ebfebab7d5..7bf8ea9187 100644 --- a/interface/web/mail/lib/lang/it_xmpp_domain_list.lng +++ b/interface/web/mail/lib/lang/it_xmpp_domain_list.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/mail/lib/lang/it_xmpp_user.lng b/interface/web/mail/lib/lang/it_xmpp_user.lng index 6ab739d98b..960ff8b331 100644 --- a/interface/web/mail/lib/lang/it_xmpp_user.lng +++ b/interface/web/mail/lib/lang/it_xmpp_user.lng @@ -1,15 +1,15 @@ diff --git a/interface/web/mail/lib/lang/it_xmpp_user_list.lng b/interface/web/mail/lib/lang/it_xmpp_user_list.lng index f2651cb62b..0a22caf8a1 100644 --- a/interface/web/mail/lib/lang/it_xmpp_user_list.lng +++ b/interface/web/mail/lib/lang/it_xmpp_user_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/mailuser/lib/lang/it_index.lng b/interface/web/mailuser/lib/lang/it_index.lng index b0d9555d65..41cd1a2532 100644 --- a/interface/web/mailuser/lib/lang/it_index.lng +++ b/interface/web/mailuser/lib/lang/it_index.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/mailuser/lib/lang/it_mail_user_filter.lng b/interface/web/mailuser/lib/lang/it_mail_user_filter.lng index 77f47f1c4c..6a1ec61d52 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_filter.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_filter.lng @@ -18,8 +18,8 @@ $wb['ends_with_txt'] = 'Termina con'; $wb['move_to_txt'] = 'Sposta in'; $wb['regex_txt'] = 'Matches Regex'; $wb['delete_txt'] = 'Elimina'; -$wb['mailbox_filter_txt'] = 'Mailbox filter'; -$wb['header_txt'] = 'Header'; -$wb['size_over_txt'] = 'Email size over (KB)'; -$wb['size_under_txt'] = 'Email size under (KB)'; +$wb['mailbox_filter_txt'] = 'Mailbox filtro'; +$wb['header_txt'] = 'Intestazione'; +$wb['size_over_txt'] = 'dimensione Email sopra (KB)'; +$wb['size_under_txt'] = 'dimensione Email sotto (KB)'; ?> diff --git a/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng b/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng index e391368e09..7970040a86 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_filter_list.lng @@ -1,8 +1,8 @@ diff --git a/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng b/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng index 17c811f115..96cd80f04a 100644 --- a/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng +++ b/interface/web/mailuser/lib/lang/it_mail_user_spamfilter.lng @@ -2,6 +2,6 @@ $wb['mailbox_spamfilter_txt'] = 'Filtro SPAM'; $wb['spamfilter_txt'] = 'Filtro SPAM'; $wb['email_txt'] = 'E-mail'; -$wb['inherit_policy'] = '- Inherit domain setting -'; -$wb['policy_txt'] = 'Policy'; +$wb['inherit_policy'] = '- Ingloba le impostazioni del dominio -'; +$wb['policy_txt'] = 'Politica'; ?> diff --git a/interface/web/monitor/lib/lang/it_dataloghistory_list.lng b/interface/web/monitor/lib/lang/it_dataloghistory_list.lng index f1ba8c67b8..26138fba25 100644 --- a/interface/web/monitor/lib/lang/it_dataloghistory_list.lng +++ b/interface/web/monitor/lib/lang/it_dataloghistory_list.lng @@ -2,7 +2,7 @@ $wb['list_head_txt'] = 'Datalog History'; $wb['tstamp_txt'] = 'Date'; $wb['server_id_txt'] = 'Server'; -$wb['dbtable_txt'] = 'DB Table'; -$wb['action_txt'] = 'Action'; -$wb['status_txt'] = 'Status'; +$wb['dbtable_txt'] = 'Tabella DB'; +$wb['action_txt'] = 'Azione'; +$wb['status_txt'] = 'Stato'; ?> diff --git a/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng b/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng index 0e040a3e77..32b9fb57a0 100644 --- a/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng +++ b/interface/web/monitor/lib/lang/it_dataloghistory_undo.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/monitor/lib/lang/it_dataloghistory_view.lng b/interface/web/monitor/lib/lang/it_dataloghistory_view.lng index df9ddd286f..3951e6b873 100644 --- a/interface/web/monitor/lib/lang/it_dataloghistory_view.lng +++ b/interface/web/monitor/lib/lang/it_dataloghistory_view.lng @@ -1,26 +1,26 @@ diff --git a/interface/web/monitor/lib/lang/it_syslog_list.lng b/interface/web/monitor/lib/lang/it_syslog_list.lng index b5894bb43f..65ff6fc7c5 100644 --- a/interface/web/monitor/lib/lang/it_syslog_list.lng +++ b/interface/web/monitor/lib/lang/it_syslog_list.lng @@ -4,7 +4,4 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Livello log'; $wb['message_txt'] = 'Messaggio'; -$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; -$wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' ?> diff --git a/interface/web/sites/lib/lang/it_aps.lng b/interface/web/sites/lib/lang/it_aps.lng index 0a6365f98f..b075afda16 100644 --- a/interface/web/sites/lib/lang/it_aps.lng +++ b/interface/web/sites/lib/lang/it_aps.lng @@ -35,7 +35,7 @@ $wb['package_settings_txt'] = 'Impostazioni Pacchetto'; $wb['error_main_domain'] = 'Il dominio del percorso di installazione è errato.'; $wb['error_no_main_location'] = 'Hai fornito un percorso di installazione non valido.'; $wb['error_inv_main_location'] = 'La cartella di installazione fornita non è valida.'; -$wb['error_license_agreement'] = 'Per poter proseguire è necessario che prendi visione ed accetti l accordi di licenza.'; +$wb['error_license_agreement'] = 'Per poter proseguire è necessario che prendi visione ed accetti gli accordi di licenza.'; $wb['error_no_database_pw'] = 'La password fornita non è valida.'; $wb['error_short_database_pw'] = 'Per favore scegli una password di database più lunga.'; $wb['error_no_value_for'] = 'Il campo \\"%s\\" non può essere vuoto.'; @@ -45,8 +45,8 @@ $wb['error_inv_value_for'] = 'Hai inserito un valore non valido per il campo \\" $wb['error_inv_email_for'] = 'Hai inserito un indirizzo email non valido per il campo \\"%s\\".'; $wb['error_inv_domain_for'] = 'Hai inserito un dominio non valido per il campo \\"%s\\".'; $wb['error_inv_integer_for'] = 'Hai inserito un numero non valido per il campo \\"%s\\".'; -$wb['error_inv_float_for'] = 'Hai inserito un numero di floating point non valido per il campo \\"%s\\".'; -$wb['error_used_location'] = 'L installazione della patch contiene già un pacchetto di installazione.'; +$wb['error_inv_float_for'] = 'Hai inserito un numero decimale non valido per il campo \\"%s\\".'; +$wb['error_used_location'] = 'L\'installazione della patch contiene già un pacchetto di installazione.'; $wb['installation_task_txt'] = 'Installazione pianificata'; $wb['installation_error_txt'] = 'Errore di installazione'; $wb['installation_success_txt'] = 'Installato'; @@ -54,7 +54,7 @@ $wb['installation_remove_txt'] = 'Rimozione pianificata'; $wb['packagelist_update_finished_txt'] = 'Elenco aggiornamenti APS terminato.'; $wb['btn_install_txt'] = 'Installa'; $wb['btn_cancel_txt'] = 'Annulla'; -$wb['limit_aps_txt'] = 'Nmero massimo di istanza APS raggiunto per il tuo account.'; +$wb['limit_aps_txt'] = 'Nmero massimo di istanza APS raggiunto per il tuo profilo.'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; diff --git a/interface/web/sites/lib/lang/it_backup_stats_list.lng b/interface/web/sites/lib/lang/it_backup_stats_list.lng index 65792aa591..34645126a3 100644 --- a/interface/web/sites/lib/lang/it_backup_stats_list.lng +++ b/interface/web/sites/lib/lang/it_backup_stats_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/sites/lib/lang/it_cron.lng b/interface/web/sites/lib/lang/it_cron.lng index 1ecf489fe6..ee38450186 100644 --- a/interface/web/sites/lib/lang/it_cron.lng +++ b/interface/web/sites/lib/lang/it_cron.lng @@ -1,6 +1,6 @@ diff --git a/interface/web/sites/lib/lang/it_database.lng b/interface/web/sites/lib/lang/it_database.lng index 007daaa002..ba9be34091 100644 --- a/interface/web/sites/lib/lang/it_database.lng +++ b/interface/web/sites/lib/lang/it_database.lng @@ -10,7 +10,7 @@ $wb['remote_access_txt'] = 'Accesso remoto'; $wb['client_txt'] = 'Cliente'; $wb['active_txt'] = 'Attivo'; $wb['database_name_error_empty'] = 'Il nome database è vuoto.'; -$wb['database_name_error_unique'] = 'Esiste già un nome di database con questo nome sul server. Per ottenere un nome unico, ad esempio. preponi il nome del tuo dominio al nome di database.'; +$wb['database_name_error_unique'] = 'Esiste già un database con questo nome sul server. Per ottenere un nome unico, ad esempio, preponi il nome del tuo dominio al nome di database.'; $wb['database_name_error_regex'] = 'Nome database non valido. Il nome database può contenere i seguenti caratteri: a-z, A-Z, 0-9 e underscore. Lungheezza: 2 - 64 caratteri.'; $wb['database_user_error_empty'] = 'Utente Database vuoto.'; $wb['database_user_error_unique'] = 'Esiste già un utente di database con questo nome sul server. Per ottenere un nome unico, ad esempio. preponi il nome del tuo dominio al nome utente.'; @@ -18,7 +18,7 @@ $wb['database_user_error_regex'] = 'Nome utente database non valido. Il nome ute $wb['limit_database_txt'] = 'Numero massimo di databases raggiunto.'; $wb['database_name_change_txt'] = 'Il nome di database non può essere modificato'; $wb['database_charset_change_txt'] = 'Il charset per il database non può essere modificato'; -$wb['remote_ips_txt'] = 'Accesso IP remoti(separa con , e lascia campo vuoto per qualunque)'; +$wb['remote_ips_txt'] = 'Accesso IP remoti (separa con , e lascia campo vuoto per qualunque)'; $wb['database_remote_error_ips'] = 'Almeno uno degli indirizzi IP inseriti non è valido.'; $wb['database_name_error_len'] = 'Nome Database - {db} - troppo lungo. La lunghezza massima compreso il prefisso è di 64 caratteri.'; $wb['database_user_error_len'] = 'Nome utente Database - {user}- troppo lungo. La lunghezza massima compreso il prefisso è di 16 caratteri.'; @@ -33,7 +33,7 @@ $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; $wb['globalsearch_resultslimit_of_txt'] = 'di'; $wb['globalsearch_resultslimit_results_txt'] = 'risultati'; -$wb['globalsearch_noresults_text_txt'] = 'Nesuun risultato.'; +$wb['globalsearch_noresults_text_txt'] = 'Nessun risultato.'; $wb['globalsearch_noresults_limit_txt'] = '0 risultati'; $wb['globalsearch_searchfield_watermark_txt'] = 'Cerca'; $wb['globalsearch_suggestions_text_txt'] = 'Suggerimenti'; @@ -41,10 +41,10 @@ $wb['database_ro_user_txt'] = 'Utente database di sola lettura'; $wb['optional_txt'] = 'opzionale'; $wb['select_dbuser_txt'] = 'Seleziona utente database'; $wb['no_dbuser_txt'] = 'Nessuno'; -$wb['database_client_differs_txt'] = 'Il cliente del sito parent e il database non coincidono.'; +$wb['database_client_differs_txt'] = 'Il cliente del sito genitore e il database non coincidono.'; $wb['database_user_missing_txt'] = 'Per favore selezionare un utente per questo database.'; $wb['limit_database_quota_txt'] = 'Database quota'; -$wb['limit_database_quota_error_notint'] = 'The database quota limit must be a number.'; -$wb['limit_database_quota_free_txt'] = 'Max. available DB quota '; -$wb['limit_database_quota_not_0_txt']= 'Database quota can not be 0'; +$wb['limit_database_quota_error_notint'] = 'La quota del database deve essere un numero positivo.'; +$wb['limit_database_quota_free_txt'] = 'Quota DB disponibile '; +$wb['limit_database_quota_not_0_txt'] = 'La quota Database non può essere 0'; ?> diff --git a/interface/web/sites/lib/lang/it_database_list.lng b/interface/web/sites/lib/lang/it_database_list.lng index 09abd791bb..f4288fc296 100644 --- a/interface/web/sites/lib/lang/it_database_list.lng +++ b/interface/web/sites/lib/lang/it_database_list.lng @@ -7,5 +7,5 @@ $wb['database_name_txt'] = 'Nome Database'; $wb['add_new_record_txt'] = 'Aggiungi nuovo Database'; $wb['database_user_txt'] = 'Utente Database'; $wb['parent_domain_id_txt'] = 'Sito Web'; -$wb['type_txt'] = 'Type'; +$wb['type_txt'] = 'Tipo'; ?> diff --git a/interface/web/sites/lib/lang/it_database_quota_stats_list.lng b/interface/web/sites/lib/lang/it_database_quota_stats_list.lng index 50f2dcc496..21a2220e7f 100644 --- a/interface/web/sites/lib/lang/it_database_quota_stats_list.lng +++ b/interface/web/sites/lib/lang/it_database_quota_stats_list.lng @@ -2,8 +2,8 @@ $wb['database_txt'] = 'Database'; $wb['server_name_txt'] = 'Server'; $wb['client_txt'] = 'Client'; -$wb['used_txt'] = 'Used space'; +$wb['used_txt'] = 'Spazio usato'; $wb['quota_txt'] = 'Quota'; -$wb['percentage_txt'] = 'Used in %'; +$wb['percentage_txt'] = 'Usato in %'; $wb['list_head_txt'] = 'Database Quota'; ?> diff --git a/interface/web/sites/lib/lang/it_database_user.lng b/interface/web/sites/lib/lang/it_database_user.lng index c0cb43b9d5..c7692d686a 100644 --- a/interface/web/sites/lib/lang/it_database_user.lng +++ b/interface/web/sites/lib/lang/it_database_user.lng @@ -15,11 +15,11 @@ $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; $wb['globalsearch_resultslimit_of_txt'] = 'of'; -$wb['globalsearch_resultslimit_results_txt'] = 'results'; -$wb['globalsearch_noresults_text_txt'] = 'Nessun results.'; -$wb['globalsearch_noresults_limit_txt'] = '0 results'; +$wb['globalsearch_resultslimit_results_txt'] = 'risultati'; +$wb['globalsearch_noresults_text_txt'] = 'Nessun risultato.'; +$wb['globalsearch_noresults_limit_txt'] = '0 risultati'; $wb['globalsearch_searchfield_watermark_txt'] = 'Cerca'; $wb['globalsearch_suggestions_text_txt'] = 'Suggerimenti'; -$wb['limit_database_user_txt'] = 'The max. number of database users is reached.'; -$wb['database_password_error_empty'] = 'Database password is empty.'; +$wb['limit_database_user_txt'] = 'Hai raggiunto il numero massimo di utenti database.'; +$wb['database_password_error_empty'] = 'La password del Database è vuota.'; ?> diff --git a/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng b/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng index e44025a715..e62f81b429 100644 --- a/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng +++ b/interface/web/sites/lib/lang/it_ftp_sites_stats_list.lng @@ -1,10 +1,10 @@ diff --git a/interface/web/sites/lib/lang/it_ftp_user.lng b/interface/web/sites/lib/lang/it_ftp_user.lng index 36b068335b..0a254471c5 100644 --- a/interface/web/sites/lib/lang/it_ftp_user.lng +++ b/interface/web/sites/lib/lang/it_ftp_user.lng @@ -2,7 +2,7 @@ $wb['uid_txt'] = 'UID'; $wb['gid_txt'] = 'GID'; $wb['dir_txt'] = 'Cartella'; -$wb['quota_files_txt'] = 'Filequota'; +$wb['quota_files_txt'] = 'Quota file'; $wb['ul_ratio_txt'] = 'Uploadratio'; $wb['dl_ratio_txt'] = 'Downloadratio'; $wb['ul_bandwidth_txt'] = 'Banda Upload'; @@ -14,11 +14,11 @@ $wb['password_txt'] = 'Password'; $wb['password_strength_txt'] = 'Livello sicurezza Password'; $wb['quota_size_txt'] = 'Quota Spazio Disco'; $wb['active_txt'] = 'Attivo'; -$wb['limit_ftp_user_txt'] = 'Hai raggiunto il numero masslimo consentito di utenti FTP per il tuo account.'; -$wb['username_error_empty'] = 'Nome utente vuoto.'; +$wb['limit_ftp_user_txt'] = 'Hai raggiunto il numero masslimo consentito di utenti FTP per il tuo profilo.'; +$wb['username_error_empty'] = 'Nome utente vuoto.'; $wb['username_error_unique'] = 'Nome utente deve essere unico.'; $wb['username_error_regex'] = 'Il nome utente contiene dei carateri che non sono ammessi.'; -$wb['quota_size_error_empty'] = 'Quota vuoto.'; +$wb['quota_size_error_empty'] = 'Quota vuoto.'; $wb['uid_error_empty'] = 'GID vuoto.'; $wb['directory_error_empty'] = 'Directory vuoto.'; $wb['quota_files_unity_txt'] = 'Files'; @@ -31,5 +31,5 @@ $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['expires_txt'] = 'Expire at'; +$wb['expires_txt'] = 'Scade il'; ?> diff --git a/interface/web/sites/lib/lang/it_shell_user.lng b/interface/web/sites/lib/lang/it_shell_user.lng index 53af373542..a5fcf7e39b 100644 --- a/interface/web/sites/lib/lang/it_shell_user.lng +++ b/interface/web/sites/lib/lang/it_shell_user.lng @@ -12,25 +12,25 @@ $wb['active_txt'] = 'Attivo'; $wb['username_error_empty'] = 'Username vuoto.'; $wb['username_error_unique'] = 'Il nome utente deve essere unico.'; $wb['username_error_regex'] = 'Nome utente contiene caratteri non autorizzati.'; -$wb['quota_size_error_empty'] = 'Valore Quota vuoto.'; +$wb['quota_size_error_empty'] = 'Valore Quota vuoto.'; $wb['uid_error_empty'] = 'GID vuoto.'; $wb['directory_error_empty'] = 'Valore direttrice vuoto.'; $wb['limit_shell_user_txt'] = 'Numero massimo utenti shell raggiunto.'; $wb['parent_domain_id_error_empty'] = 'Nessun sito selezionato.'; $wb['puser_txt'] = 'Nome utente web'; $wb['pgroup_txt'] = 'Gruppo web'; -$wb['ssh_rsa_txt'] = 'SSH-RSA Public Key (for key-based logins)'; -$wb['dir_dot_error'] = 'Nessun .. consentito nel percorso.'; -$wb['dir_slashdot_error'] = 'Nessun ./ consentito nel percorso.'; +$wb['ssh_rsa_txt'] = 'SSH-Chiave RSA Pubblica (per login basati su chiave)'; +$wb['dir_dot_error'] = 'Non è consentito .. nel percorso.'; +$wb['dir_slashdot_error'] = 'Non è consentito ./ nel percorso.'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; $wb['username_must_not_exceed_32_chars_txt'] = 'il nome utente non deve superare i 32 caratteri.'; -$wb['username_not_allowed_txt'] = 'L utente non è autorizzato.'; +$wb['username_not_allowed_txt'] = 'L\'utente non è autorizzato.'; $wb['invalid_system_user_or_group_txt'] = 'Utenti di sistema o gruppo non valido'; -$wb['directory_error_regex'] = 'Direttrice non valida'; +$wb['directory_error_regex'] = 'Percorso cartelle non valida'; $wb['shell_error_regex'] = 'shell non valida'; $wb['invalid_username_txt'] = 'Nome utente non valido'; -$wb['directory_error_notinweb'] = 'La direttrice deve essere all interno della direttrice del sito .'; +$wb['directory_error_notinweb'] = 'La cartella deve essere all\'interno della cartella del sito .'; ?> diff --git a/interface/web/sites/lib/lang/it_web_aliasdomain.lng b/interface/web/sites/lib/lang/it_web_aliasdomain.lng index ee30db96a0..7ef46f8554 100644 --- a/interface/web/sites/lib/lang/it_web_aliasdomain.lng +++ b/interface/web/sites/lib/lang/it_web_aliasdomain.lng @@ -5,24 +5,24 @@ $wb['backup_copies_txt'] = 'Numero copie di backup'; $wb['ssl_state_txt'] = 'Stato'; $wb['ssl_locality_txt'] = 'Paese'; $wb['ssl_organisation_txt'] = 'Nome Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Nome Unità di organizzazione'; +$wb['ssl_organisation_unit_txt'] = 'Nome Reparto'; $wb['ssl_country_txt'] = 'Città'; -$wb['ssl_key_txt'] = 'SSL Key'; +$wb['ssl_key_txt'] = 'Chiav eSSL'; $wb['ssl_request_txt'] = 'SSL Richiesta'; $wb['ssl_cert_txt'] = 'SSL Certificato'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['ssl_domain_txt'] = 'SSL Domain'; $wb['server_id_txt'] = 'Server'; $wb['web_folder_error_regex'] = 'Percorso inserito non valido. Non inserire slash.'; $wb['type_txt'] = 'Tipo'; -$wb['parent_domain_id_txt'] = 'Sito Parent'; -$wb['redirect_type_txt'] = 'Tipo di Redirect'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; -$wb['redirect_path_txt'] = 'Redirect Path'; +$wb['parent_domain_id_txt'] = 'Sito genitore'; +$wb['redirect_type_txt'] = 'Tipo di reindirizzamento'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento Permanente + ultima regola)'; +$wb['redirect_path_txt'] = 'Percorso di reindirizzamento'; $wb['active_txt'] = 'Attivo'; $wb['document_root_txt'] = 'Cartella del sito'; $wb['system_user_txt'] = 'Utente Linux'; @@ -40,20 +40,20 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'Numero massimo domini per il tuo account raggiunti.'; -$wb['limit_web_aliasdomain_txt'] = 'Numero massimo domini alias per il tuo account è stato raggiunto.'; -$wb['limit_web_subdomain_txt'] = 'Numero massimo sottodomini per il tuo account raggiunto.'; -$wb['apache_directives_txt'] = 'Apache Direttive'; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['limit_web_domain_txt'] = 'Hai raggiunto il numero massimo domini per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Il numero massimo domini alias per il tuo profilo è stato raggiunto.'; +$wb['limit_web_subdomain_txt'] = 'Il numero massimo sottodomini per il tuo profilo raggiunto.'; +$wb['apache_directives_txt'] = 'Direttive Apache'; +$wb['domain_error_empty'] = 'Domain vuoto.'; $wb['domain_error_unique'] = 'Esiste già un sito o sottodominio / domino alias con questo nome dominio.'; $wb['domain_error_regex'] = 'Nome dominio non valido.'; $wb['domain_error_autosub'] = 'Impostazioni di sottodominio esistenti.'; -$wb['hd_quota_error_empty'] = 'Harddisk quota 0 o vuoto.'; -$wb['traffic_quota_error_empty'] = 'Campo Quota Traffico vuoto.'; -$wb['error_ssl_state_empty'] = 'SSL State vuoto.'; +$wb['hd_quota_error_empty'] = 'quota disco 0 o vuoto.'; +$wb['traffic_quota_error_empty'] = 'Campo Quota Traffico vuoto.'; +$wb['error_ssl_state_empty'] = 'SSL Stato vuoto.'; $wb['error_ssl_locality_empty'] = 'SSL Paese vuoto.'; -$wb['error_ssl_organisation_empty'] = 'SSL Organizzazione vuoto.'; -$wb['error_ssl_organisation_unit_empty'] = 'SSL Organisation Unit vuoto.'; +$wb['error_ssl_organisation_empty'] = 'SSL Organizzazione vuoto.'; +$wb['error_ssl_organisation_unit_empty'] = 'SSL Reparto vuoto.'; $wb['error_ssl_country_empty'] = 'SSL Città vuoto.'; $wb['error_ssl_cert_empty'] = 'SSL Certificato vuoto'; $wb['client_group_id_txt'] = 'Cliente'; @@ -61,10 +61,10 @@ $wb['stats_password_txt'] = 'Impostare password accesso a Statistiche Web'; $wb['allow_override_txt'] = 'Apache AllowOverride'; $wb['limit_web_quota_free_txt'] = 'Quota disco massima disponibile'; $wb['ssl_state_error_regex'] = 'Campo Stato SSL non valido.Valori accettati: a-z, 0-9 e .,-_'; -$wb['ssl_locality_error_regex'] = 'Campo SSL Locality non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_organisation_error_regex'] = 'Campo SSL Organisation non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_organistaion_unit_error_regex'] = 'Campo SSL Organisation Unit. Caratteri ammessi: a-z, 0-9 e .,-_'; -$wb['ssl_country_error_regex'] = 'Campo SSL Country. Valid characters are: A-Z'; +$wb['ssl_locality_error_regex'] = 'Campo SSL Località non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_organisation_error_regex'] = 'Campo SSL Organizzazione non valido.. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_organistaion_unit_error_regex'] = 'Campo SSL Reparto. Caratteri ammessi: a-z, 0-9 e .,-_'; +$wb['ssl_country_error_regex'] = 'Campo SSL Paese. Caratteri ammessi: A-Z'; $wb['limit_traffic_quota_free_txt'] = 'Quota Traffico massimo disponibile'; $wb['redirect_error_regex'] = 'Percorso reinderizzamento non valido. Percorsi di redirect sono ad esempio: /test/ or https://www.domain.tld/test/'; $wb['php_open_basedir_txt'] = 'PHP open_basedir'; @@ -77,7 +77,7 @@ $wb['disabled_txt'] = 'Disabilitato '; $wb['no_redirect_txt'] = 'Nessun redirect'; $wb['no_flag_txt'] = 'Nessun flag'; $wb['save_certificate_txt'] = 'Salva certificato'; -$wb['create_certificate_txt'] = 'Crea certificato'; +$wb['create_certificate_txt'] = 'Crea certificato'; $wb['delete_certificate_txt'] = 'Elimina certificato'; $wb['nginx_directives_txt'] = 'nginx Direttive'; $wb['seo_redirect_txt'] = 'Reinderizzamento SEO'; @@ -91,7 +91,7 @@ $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'I valori per PHP-FPM pm devono essere i seguenti: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['error_php_fpm_pm_settings_txt'] = 'I valori per PHP-FPM pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; $wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero postivo.'; $wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero postivo.'; $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero postivo.'; @@ -109,11 +109,11 @@ $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['available_php_directive_snippets_txt'] = 'Sniipets Direttive PHP disponibili:'; -$wb['available_apache_directive_snippets_txt'] = 'Snippets Direttive Apache disponibili:'; -$wb['available_nginx_directive_snippets_txt'] = 'Snippets Direttive nginx Directive disponibili:'; +$wb['available_php_directive_snippets_txt'] = 'Direttive Snippets PHP disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Snippets Apache disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive Snippets nginx disponibili:'; $wb['proxy_directives_txt'] = 'Direttive Proxy'; -$wb['available_proxy_directive_snippets_txt'] = 'Snippets Direttive Proxy disponibili:'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Snippets Proxy disponibili:'; $wb['Domain'] = 'Domini Alias'; -$wb['stats_type_txt'] = 'Webstatistics program'; +$wb['stats_type_txt'] = 'Gestrore statistiche Web'; ?> diff --git a/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng b/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng index bea222d28d..d7c0728a28 100644 --- a/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng +++ b/interface/web/sites/lib/lang/it_web_aliasdomain_list.lng @@ -5,10 +5,10 @@ $wb['server_id_txt'] = 'Server'; $wb['parent_domain_id_txt'] = 'Sito Web'; $wb['domain_txt'] = 'Domini Alias'; $wb['add_new_record_txt'] = 'Aggiungi un nuovo dominio alias'; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['domain_error_empty'] = 'Dominio vuoto.'; $wb['domain_error_unique'] = 'Nome DOminio deve essere unico.'; $wb['domain_error_regex'] = 'Nome Dominio non valido.'; $wb['no_redirect_txt'] = 'Nessun reinderizzamento'; -$wb['no_flag_txt'] = 'Nessun flag'; +$wb['no_flag_txt'] = 'Nessuna bandierina'; $wb['none_txt'] = 'Nessuno'; ?> diff --git a/interface/web/sites/lib/lang/it_web_backup_list.lng b/interface/web/sites/lib/lang/it_web_backup_list.lng index 08f3b48e84..572d729193 100644 --- a/interface/web/sites/lib/lang/it_web_backup_list.lng +++ b/interface/web/sites/lib/lang/it_web_backup_list.lng @@ -12,43 +12,42 @@ $wb['download_pending_txt'] = 'Esiste già un operazione di download di backup i $wb['restore_pending_txt'] = 'Esiste già un operazione di ripristino da backup in attesa.'; $wb['backup_type_mysql'] = 'Database MySQL'; $wb['backup_type_web'] = 'Files del Sito Web'; -$wb['filesize_txt'] = 'Filesize'; -$wb['delete_backup_txt'] = 'Delete Backup'; -$wb['delete_info_txt'] = 'Delete of the backup has been started. This action takes several minutes to be completed.'; -$wb['delete_confirm_txt'] = 'Really delete this backup?'; -$wb['delete_pending_txt'] = 'There is already a pending backup delete job.'; +$wb['filesize_txt'] = 'Dimensione file'; +$wb['delete_backup_txt'] = 'Cancella Backup'; +$wb['delete_info_txt'] = 'La cancellazione del backup è stata avviata. L\'operazione può richiedere diversi minuti per finire.'; +$wb['delete_confirm_txt'] = 'Vuoi realmente cancellare questo backup?'; +$wb['delete_pending_txt'] = 'C\'è già un\'operazione di cancellazione in corso.'; $wb['backup_type_mongodb'] = 'MongoDB Database'; -$wb['backup_pending_txt'] = 'There is already a pending backup job.'; -$wb['error_txt'] = 'Error'; -$wb['backup_info_txt'] = 'A backup process started. This action can take several minutes to complete.'; -$wb['backup_format_txt'] = 'Backup format'; -$wb['backup_format_unknown_txt'] = 'Unknown'; -$wb['backup_job_txt'] = 'Scheduler'; -$wb['backup_job_manual_txt'] = 'Manual'; +$wb['backup_pending_txt'] = 'C\'è già un\'operazione di backup in corso.'; +$wb['error_txt'] = 'Errore'; +$wb['backup_info_txt'] = 'È stato avviato un backup. Questa operazione può richiedere diversi minuti.'; +$wb['backup_format_txt'] = 'Formato Backup'; +$wb['backup_format_unknown_txt'] = 'Formato Backup sconosciuto'; +$wb['backup_job_txt'] = 'Schedulatore'; +$wb['backup_job_manual_txt'] = 'Manuale'; $wb['backup_job_auto_txt'] = 'Auto'; -$wb['manual_backup_title_txt'] = 'Manual backup'; -$wb['make_backup_web_txt'] = 'Make backup of web files'; -$wb['make_backup_database_txt'] = 'Make backup of databases'; -$wb['make_backup_confirm_txt'] = 'You are about to start a manual backup process. Manual backups count towards the total number of allowed backup copies: therefore if the limit will be exceeded, then oldest backups may be deleted automatically. Proceed?'; -$wb['final_size_txt'] = 'Final download size may vary depending on selected compression format.'; -$wb['yes_txt'] = 'Yes'; +$wb['manual_backup_title_txt'] = 'Backup manuale'; +$wb['make_backup_web_txt'] = 'Fare il backup dei file web'; +$wb['make_backup_database_txt'] = 'Fare il backup del databases'; +$wb['make_backup_confirm_txt'] = 'Stai per iniziare un backup manuale. I backup manuali rientrano nel conteggio del numero totale dei backup consentiti. Quindi se il limite sarà superato verranno cancellati automaticamente i backup più vecchi. Vuoi procedere?'; +$wb['yes_txt'] = 'Si'; $wb['no_txt'] = 'No'; -$wb['backup_is_encrypted_txt'] = 'Encrypted'; -$wb['backup_format_zip_txt'] = 'zip (deflate)'; -$wb['backup_format_gzip_txt'] = 'gzip'; -$wb['backup_format_bzip2_txt'] = 'bzip2'; -$wb['backup_format_xz_txt'] = 'xz'; -$wb['backup_format_tar_gzip_txt'] = 'tar (gzip)'; -$wb['backup_format_tar_bzip2_txt'] = 'tar (bzip2)'; -$wb['backup_format_tar_xz_txt'] = 'tar (xz)'; -$wb['backup_format_zip_bzip2_txt'] = 'zip (bzip2)'; -$wb['backup_format_7z_lzma_txt'] = '7z (LZMA)'; -$wb['backup_format_7z_lzma2_txt'] = '7z (LZMA2)'; -$wb['backup_format_7z_ppmd_txt'] = '7z (PPMd)'; -$wb['backup_format_7z_bzip2_txt'] = '7z (BZip2)'; -$wb['backup_format_tar_7z_lzma_txt'] = 'tar + 7z (LZMA)'; -$wb['backup_format_tar_7z_lzma2_txt'] = 'tar + 7z (LZMA2)'; -$wb['backup_format_tar_7z_ppmd_txt'] = 'tar + 7z (PPMd)'; -$wb['backup_format_tar_7z_bzip2_txt'] = 'tar + 7z (BZip2)'; -$wb['backup_format_rar_txt'] = 'RAR'; +$wb['backup_is_encrypted_txt'] = 'Il backup è cifrato'; +$wb['backup_format_zip_txt'] = 'Backup formato zip'; +$wb['backup_format_gzip_txt'] = 'Backup formato gzip'; +$wb['backup_format_bzip2_txt'] = 'Backup formato bzip2'; +$wb['backup_format_xz_txt'] = 'Backup formato xz'; +$wb['backup_format_tar_gzip_txt'] = 'Backup formato tar (gzip)'; +$wb['backup_format_tar_bzip2_txt'] = 'Backup formato tar (bzip2)'; +$wb['backup_format_tar_xz_txt'] = 'Backup formato tar (xz)'; +$wb['backup_format_zip_bzip2_txt'] = 'Backup formato zip (bzip2)'; +$wb['backup_format_7z_lzma_txt'] = 'Backup formato 7z (LZMA)'; +$wb['backup_format_7z_lzma2_txt'] = 'Backup formato 7z (LZMA2)'; +$wb['backup_format_7z_ppmd_txt'] = 'Backup formato 7z (PPMd)'; +$wb['backup_format_7z_bzip2_txt'] = 'Backup formato 7z (BZip2)'; +$wb['backup_format_tar_7z_lzma_txt'] = 'Backup formato tar + 7z (LZMA)'; +$wb['backup_format_tar_7z_lzma2_txt'] = 'Backup formato tar + 7z (LZMA2)'; +$wb['backup_format_tar_7z_ppmd_txt'] = 'Backup formato tar + 7z (PPMd)'; +$wb['backup_format_tar_7z_bzip2_txt'] = 'Backup formato tar + 7z (BZip2)'; +$wb['backup_format_rar_txt'] = 'Backup formato RAR'; ?> diff --git a/interface/web/sites/lib/lang/it_web_childdomain.lng b/interface/web/sites/lib/lang/it_web_childdomain.lng index ed48eae876..5918bf20fa 100644 --- a/interface/web/sites/lib/lang/it_web_childdomain.lng +++ b/interface/web/sites/lib/lang/it_web_childdomain.lng @@ -1,30 +1,30 @@ = 0.'; -$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; -$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; -$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; -$wb['Domain'] = 'Aliasdomain'; -$wb['ssl_letsencrypt_exclude_txt'] = 'Don\'t add to Let\'s Encrypt certificate'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un intero positivo.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests deve essere un intero >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'evi avere una versione PHP >= 5.3.9 per poter utilizzare ondemand process manager. Se hai selezionato ondemand per una versione PHP precedente, PHP non si avvierà più!'; +$wb['generate_password_txt'] = 'Generare Password'; +$wb['repeat_password_txt'] = 'Ripetere Password'; +$wb['password_mismatch_txt'] = 'Le passwords non coincidono.'; +$wb['password_match_txt'] = 'Le passwords sono uguali.'; +$wb['available_php_directive_snippets_txt'] = 'Direttive Snippets PHP disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Snippets Apache disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive Snippets nginx disponibili:'; +$wb['Domain'] = 'Dominio Alias'; +$wb['ssl_letsencrypt_exclude_txt'] = 'Non fare aggiunte al certificato Let\'s Encrypt'; ?> diff --git a/interface/web/sites/lib/lang/it_web_childdomain_list.lng b/interface/web/sites/lib/lang/it_web_childdomain_list.lng index 45d82ecc58..606ebc17bf 100644 --- a/interface/web/sites/lib/lang/it_web_childdomain_list.lng +++ b/interface/web/sites/lib/lang/it_web_childdomain_list.lng @@ -11,8 +11,8 @@ $wb['domain_error_acme_invalid'] = 'Domain name acme.invalid not permitted.'; $wb['no_redirect_txt'] = 'No redirect'; $wb['no_flag_txt'] = 'No flag'; $wb['none_txt'] = 'None'; -$wb['add_new_subdomain_txt'] = 'Add new Subdomain'; -$wb['add_new_aliasdomain_txt'] = 'Add new Aliasdomain'; -$wb['aliasdomain_list_head_txt'] = 'Aliasdomains'; -$wb['subdomain_list_head_txt'] = 'Subdomains'; +$wb['add_new_subdomain_txt'] = 'Aggiungi un Sottodominio'; +$wb['add_new_aliasdomain_txt'] = 'AAggiungi un Alias di dominio'; +$wb['aliasdomain_list_head_txt'] = 'Dominio Alias'; +$wb['subdomain_list_head_txt'] = 'Sottodominio'; ?> diff --git a/interface/web/sites/lib/lang/it_web_directive_snippets.lng b/interface/web/sites/lib/lang/it_web_directive_snippets.lng index d2590e53cf..569070daaa 100644 --- a/interface/web/sites/lib/lang/it_web_directive_snippets.lng +++ b/interface/web/sites/lib/lang/it_web_directive_snippets.lng @@ -1,3 +1,3 @@ diff --git a/interface/web/sites/lib/lang/it_web_domain.lng b/interface/web/sites/lib/lang/it_web_domain.lng index b05f2a1557..18765c4702 100644 --- a/interface/web/sites/lib/lang/it_web_domain.lng +++ b/interface/web/sites/lib/lang/it_web_domain.lng @@ -2,24 +2,24 @@ $wb['ssl_state_txt'] = 'Stato'; $wb['ssl_locality_txt'] = 'Città'; $wb['ssl_organisation_txt'] = 'Organizzazione'; -$wb['ssl_organisation_unit_txt'] = 'Organisation Unit'; +$wb['ssl_organisation_unit_txt'] = 'Reparto'; $wb['ssl_country_txt'] = 'Codice Nazione'; $wb['ssl_request_txt'] = 'Richiesta SSL'; $wb['ssl_cert_txt'] = 'Certificato SSL'; $wb['ssl_bundle_txt'] = 'SSL Bundle'; -$wb['ssl_action_txt'] = 'SSL Action'; +$wb['ssl_action_txt'] = 'Azione SSL'; $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['type_txt'] = 'Tipo'; $wb['parent_domain_id_txt'] = 'Sito Web di riferimento'; $wb['redirect_type_txt'] = 'Tipo Reinderizzamento'; -$wb['r_redirect_txt'] = 'R (Temporary redirect)'; -$wb['l_redirect_txt'] = 'L (Last redirect rule)'; -$wb['r_l_redirect_txt'] = 'R,L (Temporary redirect + last rule)'; -$wb['r_301_l_redirect_txt'] = 'R=301,L (Permanent redirect + last rule)'; +$wb['r_redirect_txt'] = 'R (Reindirizzamento temporaneo)'; +$wb['l_redirect_txt'] = 'L (Ultima regola di reindirizzamento)'; +$wb['r_l_redirect_txt'] = 'R,L (Reindirizzamento temporaneo + ultima regola)'; +$wb['r_301_l_redirect_txt'] = 'R=301,L (Reindirizzamento permanente + ultima regola)'; $wb['redirect_path_txt'] = 'Percorso Reinderizzamento'; $wb['active_txt'] = 'Attivo'; -$wb['document_root_txt'] = 'Documentroot'; +$wb['document_root_txt'] = 'Radice dei documenti'; $wb['system_user_txt'] = 'Utente Linux'; $wb['system_group_txt'] = 'Gruppo Linux'; $wb['ip_address_txt'] = 'Indirizzo IP'; @@ -33,11 +33,11 @@ $wb['ssl_txt'] = 'SSL'; $wb['suexec_txt'] = 'SuEXEC'; $wb['php_txt'] = 'PHP'; $wb['client_txt'] = 'Cliente'; -$wb['limit_web_domain_txt'] = 'Numero massimo domini siti web raggiunto per il tuo account.'; -$wb['limit_web_aliasdomain_txt'] = 'Numero massimo di domini alias raggiunto per il tuo account.'; -$wb['limit_web_subdomain_txt'] = 'Numero massimo di sottodomini raggiunto per il tuo account.'; -$wb['apache_directives_txt'] = 'Apache Direttive '; -$wb['domain_error_empty'] = 'Domain vuoto.'; +$wb['limit_web_domain_txt'] = 'Numero massimo domini siti web raggiunto per il tuo profilo.'; +$wb['limit_web_aliasdomain_txt'] = 'Numero massimo di domini alias raggiunto per il tuo profilo.'; +$wb['limit_web_subdomain_txt'] = 'Numero massimo di sottodomini raggiunto per il tuo profilo.'; +$wb['apache_directives_txt'] = 'Direttive Apache '; +$wb['domain_error_empty'] = 'Domain vuoto.'; $wb['domain_error_unique'] = 'Il dominio deve essere unico.'; $wb['domain_error_regex'] = 'Nome Dominio non valido.'; $wb['hd_quota_error_empty'] = 'Quota Spazio Disco vuoto.'; @@ -51,7 +51,7 @@ $wb['subdomain_txt'] = 'Auto-Sottodominio'; $wb['client_group_id_txt'] = 'Cliente'; $wb['stats_password_txt'] = 'Pssword Statistiche Web'; $wb['ssl_domain_txt'] = 'SSL Domimio'; -$wb['allow_override_txt'] = 'Allow Override'; +$wb['allow_override_txt'] = 'Consenti di trascurare'; $wb['limit_web_quota_free_txt'] = 'Valore massimo Quota Spazio Disco disponibile'; $wb['ssl_state_error_regex'] = 'SSL Stato non valido. Caratteri ammessi: a-z, 0-9 e .,-_'; $wb['ssl_locality_error_regex'] = 'SSL Città non valido. Caratteri ammessi: a-z, 0-9 e .,-_'; @@ -88,16 +88,16 @@ $wb['pm_max_children_txt'] = 'PHP-FPM pm.max_children'; $wb['pm_start_servers_txt'] = 'PHP-FPM pm.start_servers'; $wb['pm_min_spare_servers_txt'] = 'PHP-FPM pm.min_spare_servers'; $wb['pm_max_spare_servers_txt'] = 'PHP-FPM pm.max_spare_servers'; -$wb['error_php_fpm_pm_settings_txt'] = 'I Valori per impostazioni PHP-FPM pm devono essere i seguenti: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; +$wb['error_php_fpm_pm_settings_txt'] = 'I Valori per impostazioni PHP-FPM pm devono soddisfare: pm.max_children >= pm.max_spare_servers >= pm.start_servers >= pm.min_spare_servers > 0'; $wb['pm_max_children_error_regex'] = 'PHP-FPM pm.max_children deve essere un valore intero positivo.'; $wb['pm_start_servers_error_regex'] = 'PHP-FPM pm.start_servers deve essere un valore intero positivo.'; $wb['pm_min_spare_servers_error_regex'] = 'PHP-FPM pm.min_spare_servers deve essere un valore intero positivo.'; $wb['pm_max_spare_servers_error_regex'] = 'PHP-FPM pm.max_spare_servers deve essere un valore intero positivo.'; $wb['hd_quota_error_regex'] = 'Quota spazio disco non valida.'; $wb['traffic_quota_error_regex'] = 'Quota Traffico non valida.'; -$wb['ssl_key_txt'] = 'SSL Key'; +$wb['ssl_key_txt'] = 'Chiave SSL'; $wb['perl_txt'] = 'Perl'; -$wb['server_php_id_txt'] = 'PHP Versione'; +$wb['server_php_id_txt'] = 'Versione PHP'; $wb['pm_txt'] = 'PHP-FPM Process Manager'; $wb['pm_process_idle_timeout_txt'] = 'PHP-FPM pm.process_idle_timeout'; $wb['pm_max_requests_txt'] = 'PHP-FPM pm.max_requests'; @@ -123,7 +123,7 @@ $wb['monthly_backup_txt'] = 'Mensile'; $wb['rewrite_rules_txt'] = 'Rewrite Rules'; $wb['invalid_rewrite_rules_txt'] = 'Rewrite Rules non valide'; $wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURAZIONE'; $wb['variables_txt'] = 'Variabili'; $wb['added_by_txt'] = 'Inserito da'; $wb['added_date_txt'] = 'Data inserimento'; @@ -133,9 +133,9 @@ $wb['backup_excludes_error_regex'] = 'Le cartelle escluse contengono caratteri n $wb['invalid_custom_php_ini_settings_txt'] = 'Impsotazioni php.ini non valide'; $wb['invalid_system_user_or_group_txt'] = 'Utente di sistema o Gruppo non valido'; $wb['apache_directive_blocked_error'] = 'Direttive di Apache bloccate da impostazioni di sicurezza:'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; -$wb['nginx_directive_blocked_error'] = 'Nginx directive blocked by security settings:'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; +$wb['nginx_directive_blocked_error'] = 'Direttive Nginx bloccate per impostazioni di sicurezza:'; ?> diff --git a/interface/web/sites/lib/lang/it_web_folder.lng b/interface/web/sites/lib/lang/it_web_folder.lng index eb32a966f4..37404ef1da 100644 --- a/interface/web/sites/lib/lang/it_web_folder.lng +++ b/interface/web/sites/lib/lang/it_web_folder.lng @@ -4,5 +4,5 @@ $wb['parent_domain_id_txt'] = 'Sito Web'; $wb['path_txt'] = 'Path'; $wb['active_txt'] = 'Attivo'; $wb['path_error_regex'] = 'Percorso cartella non valido.'; -$wb['error_folder_already_protected_txt'] = 'esiste già un record per questa cartella.'; +$wb['error_folder_already_protected_txt'] = 'Esiste già un record per questa cartella.'; ?> diff --git a/interface/web/sites/lib/lang/it_web_subdomain.lng b/interface/web/sites/lib/lang/it_web_subdomain.lng index e3438eaf75..6f8e81d7b6 100644 --- a/interface/web/sites/lib/lang/it_web_subdomain.lng +++ b/interface/web/sites/lib/lang/it_web_subdomain.lng @@ -1,30 +1,30 @@ diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain.lng b/interface/web/sites/lib/lang/it_web_vhost_domain.lng index 22fce96dab..3e036a7748 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng @@ -1,23 +1,23 @@ = 0.'; -$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['web_folder_error_regex'] = 'Invalid folder entered. Please do not enter a slash.'; -$wb['web_folder_error_empty'] = 'Web folder cannot be empty. Use /web/ to make the same as the Parent Website'; -$wb['domain_error_autosub'] = 'There is already a subdomain with these settings.'; -$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; -$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; -$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; -$wb['proxy_directives_txt'] = 'Proxy Directives'; -$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; -$wb['no_server_error'] = 'No server selected.'; -$wb['no_backup_txt'] = 'No backup'; -$wb['daily_backup_txt'] = 'Daily'; -$wb['weekly_backup_txt'] = 'Weekly'; -$wb['monthly_backup_txt'] = 'Monthly'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un valore intero positivo.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests deve essere un valore intero positivo >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'Devi avere una versione PHP >= 5.3.9 per utilizzare il processo on demand. Se selezioni ondemand con una versione PHP più vecchia, PHP non ripartirà più!'; +$wb['generate_password_txt'] = 'Genera una Password'; +$wb['repeat_password_txt'] = 'Ripeti Password'; +$wb['password_mismatch_txt'] = 'Le password sono diverse.'; +$wb['password_match_txt'] = 'Le password coincidono.'; +$wb['web_folder_error_regex'] = 'Cartella non valida. Non inserire la sbarra.'; +$wb['web_folder_error_empty'] = 'La cartella Web non può essere vuota. Usa /web/ per assegnare lo stesso al sito Web genitore'; +$wb['domain_error_autosub'] = 'C\'è già un sottodominio con le stesse impostazioni.'; +$wb['available_php_directive_snippets_txt'] = 'Direttive PHP Snippets disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Apache Snippets disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive nginx Snippets disponibili:'; +$wb['proxy_directives_txt'] = 'Direttive Proxy'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Proxy Snippets disponibili:'; +$wb['no_server_error'] = 'Nessun server selezionato.'; +$wb['no_backup_txt'] = 'Nessu backup'; +$wb['daily_backup_txt'] = 'Giornaliero'; +$wb['weekly_backup_txt'] = 'Settimanale'; +$wb['monthly_backup_txt'] = 'Mensile'; $wb['rewrite_rules_txt'] = 'Rewrite Rules'; -$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; -$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; -$wb['web_folder_txt'] = 'Web folder'; -$wb['web_folder_invalid_txt'] = 'The web folder is invalid, please choose a different one.'; -$wb['web_folder_unique_txt'] = 'The web folder is already used, please choose a different one.'; +$wb['invalid_rewrite_rules_txt'] = 'Rewrite Rules non valide'; +$wb['allowed_rewrite_rule_directives_txt'] = 'Directive consentite:'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURAZIONE'; +$wb['web_folder_txt'] = 'Cartella Web'; +$wb['web_folder_invalid_txt'] = 'La cartella web non è valida, usa un percorso differente.'; +$wb['web_folder_unique_txt'] = 'La cartella web è già usata, usa un percorso differente.'; $wb['host_txt'] = 'Hostname'; -$wb['domain_error_wildcard'] = 'Wildcard subdomains are not allowed.'; -$wb['variables_txt'] = 'Variables'; -$wb['added_by_txt'] = 'Added by'; -$wb['added_date_txt'] = 'Added date'; -$wb['backup_excludes_txt'] = 'Excluded Directories'; -$wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)'; -$wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; -$wb['server_chosen_not_ok'] = 'The selected server is not allowed for this account.'; -$wb['subdomain_error_empty'] = 'The subdommain field is empty or contains invalid characters.'; -$wb['btn_save_txt'] = 'Save'; -$wb['btn_cancel_txt'] = 'Cancel'; -$wb['load_client_data_txt'] = 'Load client details'; -$wb['load_my_data_txt'] = 'Load my contact details'; -$wb['reset_client_data_txt'] = 'Reset data'; -$wb['rewrite_to_https_txt'] = 'Rewrite HTTP to HTTPS'; -$wb['password_strength_txt'] = 'Password strength'; -$wb['directive_snippets_id_txt'] = 'Web server config'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; -$wb['enable_pagespeed_txt'] = 'Enable PageSpeed'; -$wb['log_retention_txt'] = 'Logfiles retention time'; -$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)'; -$wb['limit_web_quota_not_0_txt'] = 'Harddisk Quota cannot be set to 0.'; -$wb['proxy_protocol_txt'] = 'Enable PROXY Protocol'; -$wb['backup_format_web_txt'] = 'Backup format for web files'; -$wb['backup_format_db_txt'] = 'Backup format for database'; -$wb['backup_missing_utils_txt'] = 'The following formats can not be used because they are not installed on the webserver: '; -$wb['backup_compression_options_txt'] = 'Compression options'; -$wb['backup_encryption_note_txt'] = 'Encryption is only available for 7z, RAR, and zip (not secure).'; -$wb['backup_encryption_options_txt'] = 'Encryption options'; -$wb['backup_enable_encryption_txt'] = 'Enable encryption'; +$wb['domain_error_wildcard'] = 'I sottodomini * non sono consentiti.'; +$wb['variables_txt'] = 'Variabili'; +$wb['added_by_txt'] = 'Aggiunto da'; +$wb['added_date_txt'] = 'Data di inserimento'; +$wb['backup_excludes_txt'] = 'Directory escluse'; +$wb['backup_excludes_note_txt'] = '(Separare le directory con una virgola. Esempio: web/cache/*,web/backup)'; +$wb['backup_excludes_error_regex'] = 'Le directory inserite contengono caratteri non corretti.'; +$wb['server_chosen_not_ok'] = 'Il server selezionato non è abilitato al tuo profilo.'; +$wb['subdomain_error_empty'] = 'Il campo sottodominio è vuoto o contiene caratteri non validi.'; +$wb['btn_save_txt'] = 'Salva'; +$wb['btn_cancel_txt'] = 'Annulla'; +$wb['load_client_data_txt'] = 'Carica i dettagli del cliente'; +$wb['load_my_data_txt'] = 'Carica i dettagli del mio contatto'; +$wb['reset_client_data_txt'] = 'Cancella i dati'; +$wb['rewrite_to_https_txt'] = 'Riscrivi HTTP to HTTPS'; +$wb['password_strength_txt'] = 'Forza della password'; +$wb['directive_snippets_id_txt'] = 'Configurazione Web server'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; +$wb['enable_pagespeed_txt'] = 'Abilita PageSpeed'; +$wb['log_retention_txt'] = 'Durata di mantenimento dei file di log'; +$wb['log_retention_error_regex'] = 'Tempo di mantenimento in giorni (valori consentiti: min. 0 - max. 9999)'; +$wb['limit_web_quota_not_0_txt'] = 'Quota disco non può essere 0.'; +$wb['proxy_protocol_txt'] = 'Abilita protocollo PROXY'; +$wb['backup_format_web_txt'] = 'Formato Backup per i file web'; +$wb['backup_format_db_txt'] = 'Formato Backup per il database'; +$wb['backup_missing_utils_txt'] = 'I seguenti formati non possono essere usati perchè non sono installati sul server web: '; +$wb['backup_compression_options_txt'] = 'Opzioni di compressione'; +$wb['backup_encryption_note_txt'] = 'La cifratura è disponibile solo per i formati 7z, RAR e zip (poco sicura).'; +$wb['backup_encryption_options_txt'] = 'Opzioni di cifratura'; +$wb['backup_enable_encryption_txt'] = 'Abilita cifratura'; $wb['backup_password_txt'] = 'Password'; -$wb['backup_format_default_txt'] = 'Default: zip (deflate) or tar (gzip)'; +$wb['backup_format_default_txt'] = 'Default: zip (deflate) o tar (gzip)'; $wb['backup_format_zip_txt'] = 'zip (deflate)'; $wb['backup_format_gzip_txt'] = 'gzip'; $wb['backup_format_bzip2_txt'] = 'bzip2'; @@ -186,19 +186,19 @@ $wb['backup_format_tar_7z_lzma_txt'] = 'tar + 7z (LZMA)'; $wb['backup_format_tar_7z_lzma2_txt'] = 'tar + 7z (LZMA2)'; $wb['backup_format_tar_7z_ppmd_txt'] = 'tar + 7z (PPMd)'; $wb['backup_format_tar_7z_bzip2_txt'] = 'tar + 7z (BZip2)'; -$wb['dependent_domains_txt'] = 'Dependent sub- / aliasdomains'; -$wb['error_ipv4_change_forbidden'] = 'The IP cannot be changed. Please contact your administrator if you want to change the IPv4 address.'; -$wb['error_ipv6_change_forbidden'] = 'The IP cannot be changed. Please contact your administrator if you want to change the IPv6 address.'; -$wb['error_domain_change_forbidden'] = 'The domain name cannot be changed. Please contact your administrator if you want to change the domain name.'; -$wb['error_server_change_not_possible'] = 'The server cannot be changed.'; -$wb['jailkit_chroot_app_sections_txt'] = 'Jailkit chroot app sections'; -$wb['jailkit_chroot_app_programs_txt'] = 'Jailkit chrooted applications'; -$wb['jailkit_chroot_app_sections_error_empty'] = 'Jailkit chroot app sections vuoto.'; -$wb['jailkit_chroot_app_programs_error_empty'] = 'Jailkit chrooted applications vuoto.'; -$wb['jailkit_chroot_app_sections_error_regex'] = 'Invalid jaikit chroot sections.'; -$wb['jailkit_chroot_app_programs_error_regex'] = 'Invalid jaikit chroot app programs.'; -$wb['tooltip_jailkit_chroot_app_sections_txt'] = 'When empty, uses Jailkit chroot app sections from Server Config'; -$wb['tooltip_jailkit_chroot_app_programs_txt'] = 'When empty, uses Jailkit chroot applications from Server Config'; -$wb['delete_unused_jailkit_txt'] = 'Delete unused jailkit chroot'; -$wb['tooltip_delete_unused_jailkit_txt'] = 'Delete the jailkit chroot environment when there are no shell users or cron jobs which require it.'; -$wb['ssl_options_not_for_le_txt'] = 'You have Let\'s Encrypt certificates enabled for this website. Please be aware that all options on this page apply to non-Let\'s Encrypt certificates only. Remember to uncheck Let\'s Encrypt on the main tab if you want to switch to a different certificate.'; +$wb['dependent_domains_txt'] = ' sub- / alias dominio dipendente'; +$wb['error_ipv4_change_forbidden'] = 'Il numero IP non può essere cambiato. Contatta l\'amministratore se vuoi cambiare l\'indirizzo IP v4.'; +$wb['error_ipv6_change_forbidden'] = 'Il numero IP non può essere cambiato. Contatta l\'amministratore se vuoi cambiare l\'indirizzo IP v6.'; +$wb['error_domain_change_forbidden'] = 'Il dominio non può essere cambiato. Contatta l\'amministratore se vuoi cambiare il nome di dominio.'; +$wb['error_server_change_not_possible'] = 'Il server non può essere cambiato.'; +$wb['jailkit_chroot_app_sections_txt'] = 'Sezione Jailkit chroot app'; +$wb['jailkit_chroot_app_programs_txt'] = 'Applicazioni Jailkit chrooted'; +$wb['jailkit_chroot_app_sections_error_empty'] = 'Sezione Jailkit chroot app vuota.'; +$wb['jailkit_chroot_app_programs_error_empty'] = 'Applicazioni Jailkit chrooted vuota.'; +$wb['jailkit_chroot_app_sections_error_regex'] = 'Sezione Jailkit chroot non valida.'; +$wb['jailkit_chroot_app_programs_error_regex'] = 'Programmi Jailkit chroot app non validi.'; +$wb['tooltip_jailkit_chroot_app_sections_txt'] = 'Se vuota, usa la sezione Jailkit chroot app dalle configurazioni del server.'; +$wb['tooltip_jailkit_chroot_app_programs_txt'] = 'Se vuota, usa la sezione Jailkit chroot applications della configurazione del Server'; +$wb['delete_unused_jailkit_txt'] = 'Cancella jailkit chroot non usate'; +$wb['tooltip_delete_unused_jailkit_txt'] = 'Cancella l\'ambiente jailkit chroot quando non sono presenti utenti della shell o job cron che lo richiedono.'; +$wb['ssl_options_not_for_le_txt'] = 'Hai abilitato i certificati Let\'Encrypt per questo sito Web. Considera che tutte le opzioni di questa pagina si applicano a ai certificati non Let\'Encrypt solamente. Ricorda di deselezionare l\'opzione Let\'s Encrypt nella scheda principale se vuoi passare ad certificato differente.'; diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng b/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng index 4f07fd8588..db7fbdb378 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain_admin_list.lng @@ -1,14 +1,14 @@ diff --git a/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng b/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng index b1ce2136c2..4093dca27f 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_domain_list.lng @@ -6,9 +6,9 @@ $wb['server_id_txt'] = 'Server'; $wb['domain_txt'] = 'Dominio'; $wb['add_new_record_txt'] = 'Aggiungi nuovo sito'; $wb['parent_domain_id_txt'] = 'Website'; -$wb['add_new_subdomain_txt'] = 'Add new subdomain'; -$wb['add_new_aliasdomain_txt'] = 'Add new aliasdomain'; -$wb['domain_list_head_txt'] = 'Websites'; -$wb['aliasdomain_list_head_txt'] = 'Aliasdomains (Vhost)'; -$wb['subdomain_list_head_txt'] = 'Subdomains (Vhost)'; +$wb['add_new_subdomain_txt'] = 'Aggiungi nuovo sottodominio'; +$wb['add_new_aliasdomain_txt'] = 'Aggiungi nuovo alis di dominio'; +$wb['domain_list_head_txt'] = 'Siti Web'; +$wb['aliasdomain_list_head_txt'] = 'Alias dominio (Vhost)'; +$wb['subdomain_list_head_txt'] = 'Subdominio (Vhost)'; ?> diff --git a/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng b/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng index 5366e37baf..7caed382ae 100644 --- a/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng +++ b/interface/web/sites/lib/lang/it_web_vhost_subdomain.lng @@ -1,40 +1,40 @@ = 0.'; -$wb['pm_ondemand_hint_txt'] = 'Please note that you must have PHP version >= 5.3.9 in order to use the ondemand process manager. If you select ondemand for an older PHP version, PHP will not start anymore!'; +$wb['pm_process_idle_timeout_error_regex'] = 'PHP-FPM pm.process_idle_timeout deve essere un valore intero positivo.'; +$wb['pm_max_requests_error_regex'] = 'PHP-FPM pm.max_requests deve essere un intero >= 0.'; +$wb['pm_ondemand_hint_txt'] = 'Nota: che devi avere una versione PHP >= 5.3.9 per poter usare il processo ondemand. Se selezioni ondemand con una versione precedente di PHP, PHP non ripartirà più!'; $wb['generate_password_txt'] = 'Genera Password'; $wb['repeat_password_txt'] = 'Ripeti Password'; $wb['password_mismatch_txt'] = 'Le password non coincidono.'; $wb['password_match_txt'] = 'Le password coincidono.'; -$wb['available_php_directive_snippets_txt'] = 'Available PHP Directive Snippets:'; -$wb['available_apache_directive_snippets_txt'] = 'Available Apache Directive Snippets:'; -$wb['available_nginx_directive_snippets_txt'] = 'Available nginx Directive Snippets:'; -$wb['proxy_directives_txt'] = 'Proxy Directives'; -$wb['available_proxy_directive_snippets_txt'] = 'Available Proxy Directive Snippets:'; -$wb['rewrite_rules_txt'] = 'Rewrite Rules'; -$wb['invalid_rewrite_rules_txt'] = 'Invalid Rewrite Rules'; -$wb['allowed_rewrite_rule_directives_txt'] = 'Allowed Directives:'; -$wb['configuration_error_txt'] = 'CONFIGURATION ERROR'; -$wb['variables_txt'] = 'Variables'; -$wb['backup_excludes_txt'] = 'Excluded Directories'; -$wb['backup_excludes_note_txt'] = '(Separate multiple directories with commas. Example: web/cache/*,web/backup)'; -$wb['backup_excludes_error_regex'] = 'The excluded directories contain invalid characters.'; -$wb['subdomain_error_empty'] = 'The subdommain field is empty or contiene caratteri non validi.'; -$wb['http_port_txt'] = 'HTTP Port'; -$wb['https_port_txt'] = 'HTTPS Port'; -$wb['http_port_error_regex'] = 'HTTP Port invalid.'; -$wb['https_port_error_regex'] = 'HTTPS Port invalid.'; +$wb['available_php_directive_snippets_txt'] = 'Direttive PHP Snippets disponibili:'; +$wb['available_apache_directive_snippets_txt'] = 'Direttive Apache Snippets disponibili:'; +$wb['available_nginx_directive_snippets_txt'] = 'Direttive nginx Snippets disponibili:'; +$wb['proxy_directives_txt'] = 'Direttive Proxy'; +$wb['available_proxy_directive_snippets_txt'] = 'Direttive Proxy Snippets disponibili:'; +$wb['rewrite_rules_txt'] = 'Regole di riscrittura'; +$wb['invalid_rewrite_rules_txt'] = 'Regole di riscrittura non valide'; +$wb['allowed_rewrite_rule_directives_txt'] = 'Direttive consentite:'; +$wb['configuration_error_txt'] = 'ERRORE DI CONFIGURAZIONE'; +$wb['variables_txt'] = 'Variabili'; +$wb['backup_excludes_txt'] = 'Cartelle escluse'; +$wb['backup_excludes_note_txt'] = '(Separate le cartelle da virgola. Esempi: web/cache/*,web/backup)'; +$wb['backup_excludes_error_regex'] = 'TLe cartelle escluse contengono caratteri non ammessi.'; +$wb['subdomain_error_empty'] = 'Il campo sottodominio è vuoto o contiene caratteri non validi.'; +$wb['http_port_txt'] = 'Porta HTTP'; +$wb['https_port_txt'] = 'Porta HTTPS'; +$wb['http_port_error_regex'] = 'Porta HTTP non valida.'; +$wb['https_port_error_regex'] = 'Porta HTTPS non valida.'; diff --git a/interface/web/sites/lib/lang/it_webdav_user.lng b/interface/web/sites/lib/lang/it_webdav_user.lng index 37be4c0861..71d3adc9d3 100644 --- a/interface/web/sites/lib/lang/it_webdav_user.lng +++ b/interface/web/sites/lib/lang/it_webdav_user.lng @@ -1,19 +1,19 @@ diff --git a/interface/web/tools/lib/lang/it_import_vpopmail.lng b/interface/web/tools/lib/lang/it_import_vpopmail.lng index 66fe56da1c..96a3ce35cd 100644 --- a/interface/web/tools/lib/lang/it_import_vpopmail.lng +++ b/interface/web/tools/lib/lang/it_import_vpopmail.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/tools/lib/lang/it_index.lng b/interface/web/tools/lib/lang/it_index.lng index a3ef38f219..ea996c4ff4 100644 --- a/interface/web/tools/lib/lang/it_index.lng +++ b/interface/web/tools/lib/lang/it_index.lng @@ -1,4 +1,4 @@ diff --git a/interface/web/tools/lib/lang/it_interface.lng b/interface/web/tools/lib/lang/it_interface.lng new file mode 100644 index 0000000000..151bc2c3f0 --- /dev/null +++ b/interface/web/tools/lib/lang/it_interface.lng @@ -0,0 +1,7 @@ + diff --git a/interface/web/tools/lib/lang/it_resync.lng b/interface/web/tools/lib/lang/it_resync.lng index 42831b890b..704533c52c 100644 --- a/interface/web/tools/lib/lang/it_resync.lng +++ b/interface/web/tools/lib/lang/it_resync.lng @@ -1,53 +1,53 @@ diff --git a/interface/web/tools/lib/lang/it_tpl_default.lng b/interface/web/tools/lib/lang/it_tpl_default.lng index c06246304d..aca4cc59e4 100644 --- a/interface/web/tools/lib/lang/it_tpl_default.lng +++ b/interface/web/tools/lib/lang/it_tpl_default.lng @@ -1,7 +1,7 @@ diff --git a/interface/web/tools/lib/lang/it_usersettings.lng b/interface/web/tools/lib/lang/it_usersettings.lng index a1ad8eba87..0f1cefe1bf 100644 --- a/interface/web/tools/lib/lang/it_usersettings.lng +++ b/interface/web/tools/lib/lang/it_usersettings.lng @@ -2,14 +2,14 @@ $wb['password_txt'] = 'Password'; $wb['language_txt'] = 'Lingua'; $wb['password_mismatch'] = 'Il secondo campo password non corrisponde con il primo.'; -$wb['Form to edit the user password and language.'] = 'Form per modificare la password e la lingua dellutente.'; +$wb['Form to edit the user password and language.'] = 'Form per modificare la password e la lingua dell\'utente.'; $wb['Settings'] = 'Impostazioni'; $wb['password_strength_txt'] = 'Sicurezza della Password'; -$wb['generate_password_txt'] = 'Generate Password'; -$wb['repeat_password_txt'] = 'Repeat Password'; -$wb['password_mismatch_txt'] = 'The passwords do not match.'; -$wb['password_match_txt'] = 'The passwords do match.'; -$wb['language_txt'] = 'Language'; -$wb['startmodule_txt'] = 'Startmodule'; -$wb['app_theme_txt'] = 'Design'; +$wb['generate_password_txt'] = 'Genera Password'; +$wb['repeat_password_txt'] = 'Ripeti Password'; +$wb['password_mismatch_txt'] = 'Le password sono diverse.'; +$wb['password_match_txt'] = 'Le password coincidono.'; +$wb['language_txt'] = 'Lingua pannello'; +$wb['startmodule_txt'] = 'Modulo di avvio'; +$wb['app_theme_txt'] = 'Apparenza'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_ostemplate.lng b/interface/web/vm/lib/lang/it_openvz_ostemplate.lng index 5b58e7ebc5..3d5bbda64b 100644 --- a/interface/web/vm/lib/lang/it_openvz_ostemplate.lng +++ b/interface/web/vm/lib/lang/it_openvz_ostemplate.lng @@ -1,11 +1,11 @@ diff --git a/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng b/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng index 7df4dc7fe6..847ee336cf 100644 --- a/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng +++ b/interface/web/vm/lib/lang/it_openvz_ostemplate_list.lng @@ -4,5 +4,5 @@ $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Server'; $wb['allservers_txt'] = 'Esiste su tutti i servers'; $wb['ostemplate_id_txt'] = 'ID'; -$wb['template_name_txt'] = 'Template name'; +$wb['template_name_txt'] = 'Modello name'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_template.lng b/interface/web/vm/lib/lang/it_openvz_template.lng index b23f862363..07e6b16281 100644 --- a/interface/web/vm/lib/lang/it_openvz_template.lng +++ b/interface/web/vm/lib/lang/it_openvz_template.lng @@ -56,7 +56,7 @@ $wb['dcachesize_desc_txt'] = 'Dimensione totale di dentry and inode structures l $wb['numiptent_desc_txt'] = 'Numero di inserimenti NETFILTER (IP packet filtering).'; $wb['swappages_desc_txt'] = 'Dimensione di swap space da mostrare nel contenitore.'; $wb['create_dns_txt'] = 'Crea DNS per questo nome host'; -$wb['template_name_error_empty'] = 'Template name vuoto.'; +$wb['template_name_error_empty'] = 'Modello name vuoto.'; $wb['diskspace_error_empty'] = 'Spazio disco vuoto.'; $wb['ram_error_empty'] = 'RAM (guaranteed) vuoto.'; $wb['ram_burst_error_empty'] = 'RAM (burst) vuoto.'; @@ -87,11 +87,11 @@ $wb['numsiginfo_error_empty'] = 'Numsiginfo vuoto.'; $wb['dcachesize_error_empty'] = 'Dcachesize vuoto.'; $wb['numiptent_error_empty'] = 'Numiptent vuoto.'; $wb['swappages_error_empty'] = 'Swappages vuoto.'; -$wb['Template'] = 'Template'; -$wb['Advanced'] = 'Advanced'; -$wb['template_name_txt'] = 'Template name'; -$wb['features_txt'] = 'Features'; +$wb['Template'] = 'Modello'; +$wb['Advanced'] = 'Avanzate'; +$wb['template_name_txt'] = 'Nome Modello'; +$wb['features_txt'] = 'Caratteristiche'; $wb['iptables_txt'] = 'IP Tables'; -$wb['custom_txt'] = 'Custom settings'; -$wb['custom_error'] = 'Not allowed in Custom settings: '; +$wb['custom_txt'] = 'Impostazioni personalizzate'; +$wb['custom_error'] = 'Non consentito nelle impostazioni personalizzate: '; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_template_list.lng b/interface/web/vm/lib/lang/it_openvz_template_list.lng index f752068085..d0e815f8f3 100644 --- a/interface/web/vm/lib/lang/it_openvz_template_list.lng +++ b/interface/web/vm/lib/lang/it_openvz_template_list.lng @@ -1,5 +1,5 @@ diff --git a/interface/web/vm/lib/lang/it_openvz_vm.lng b/interface/web/vm/lib/lang/it_openvz_vm.lng index 8290d94e99..ee32d56e56 100644 --- a/interface/web/vm/lib/lang/it_openvz_vm.lng +++ b/interface/web/vm/lib/lang/it_openvz_vm.lng @@ -8,10 +8,10 @@ $wb['cpu_limit_txt'] = 'CPU limite'; $wb['io_priority_txt'] = 'I/O priorita'; $wb['nameserver_txt'] = 'Nameserver(s)'; $wb['nameserver_desc_txt'] = '(separati da spazi)'; -$wb['capability_txt'] = 'Capacita'; +$wb['capability_txt'] = 'Capacità'; $wb['server_id_txt'] = 'Hostserver'; $wb['ostemplate_id_txt'] = 'OSTemplate'; -$wb['template_id_txt'] = 'Template'; +$wb['template_id_txt'] = 'Modello'; $wb['ip_address_txt'] = 'Indirizzo IP '; $wb['hostname_txt'] = 'Hostname'; $wb['vm_password_txt'] = 'VM Password'; @@ -37,9 +37,9 @@ $wb['io_priority_error_empty'] = 'I/O priority vuoto.'; $wb['template_nameserver_error_empty'] = 'Nameserver(s) vuoto.'; $wb['Virtual server'] = 'Virtual server'; $wb['Advanced'] = 'Avanzato'; -$wb['features_txt'] = 'Features'; +$wb['features_txt'] = 'Caratteristiche'; $wb['iptables_txt'] = 'IP Tables'; -$wb['custom_txt'] = 'Custom settings'; -$wb['bootorder_txt'] = 'Boot order priority'; -$wb['bootorder_error_notpositive'] = 'Only positive integers are allowed for Boot order priority'; +$wb['custom_txt'] = 'Impostazioni personalizzate'; +$wb['bootorder_txt'] = 'Ordine di priorità di boot'; +$wb['bootorder_error_notpositive'] = 'Sono consentiti solo numeri interi positivi per ordine di priorità Boot'; ?> diff --git a/interface/web/vm/lib/lang/it_openvz_vm_list.lng b/interface/web/vm/lib/lang/it_openvz_vm_list.lng index 3ed0a012af..22d4b00ad9 100644 --- a/interface/web/vm/lib/lang/it_openvz_vm_list.lng +++ b/interface/web/vm/lib/lang/it_openvz_vm_list.lng @@ -3,7 +3,7 @@ $wb['list_head_txt'] = 'Virtual server'; $wb['active_txt'] = 'Attivo'; $wb['server_id_txt'] = 'Hostserver'; $wb['ostemplate_id_txt'] = 'OSTemplate'; -$wb['template_id_txt'] = 'Template'; +$wb['template_id_txt'] = 'Modello'; $wb['hostname_txt'] = 'Nome Host'; $wb['ip_address_txt'] = 'Indirizzo IP'; $wb['veid_txt'] = 'VEID'; -- GitLab From 4158d52cb68cf55b04d172b34bc464808be0ec88 Mon Sep 17 00:00:00 2001 From: Thom Pol Date: Sat, 26 Mar 2022 18:15:39 +0100 Subject: [PATCH 1365/1368] Add missing translations, fix syntax error --- interface/web/admin/lib/lang/it_server_config.lng | 4 ++++ interface/web/admin/lib/lang/it_system_config.lng | 2 ++ interface/web/dashboard/lib/lang/it_dashlet_limits.lng | 1 + interface/web/dns/lib/lang/it_dns_soa.lng | 2 ++ interface/web/monitor/lib/lang/ar_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/bg_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/br_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/ca_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/cz_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/de_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/dk_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/el_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/en_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/es_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/fi_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/fr_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/hr_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/hu_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/id_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/it_syslog_list.lng | 3 +++ interface/web/monitor/lib/lang/ja_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/nl_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/pl_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/pt_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/ro_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/ru_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/se_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/sk_syslog_list.lng | 2 +- interface/web/monitor/lib/lang/tr_syslog_list.lng | 2 +- 29 files changed, 36 insertions(+), 24 deletions(-) diff --git a/interface/web/admin/lib/lang/it_server_config.lng b/interface/web/admin/lib/lang/it_server_config.lng index 7e75a265f4..7d67123662 100644 --- a/interface/web/admin/lib/lang/it_server_config.lng +++ b/interface/web/admin/lib/lang/it_server_config.lng @@ -164,6 +164,8 @@ $wb['website_autoalias_note_txt'] = 'Marcaposto:'; $wb['backup_mode_txt'] = 'Modalità di Backup'; $wb['backup_mode_userzip'] = 'Backup files siti web come utente web in formato zip'; $wb['backup_mode_rootgz'] = 'Backup di tutti i files nella cartella sito come utente root'; +$wb['backup_mode_borg_txt'] = 'BorgBackup: Backup all files in vhost directory and databases into incremental repositories'; +$wb['backup_missing_utils_txt'] = 'The following backup mode can not be used because the required tools are not installed:'; $wb['realtime_blackhole_list_txt'] = 'Lista Real-Time Blackhole'; $wb['realtime_blackhole_list_note_txt'] = '(Separare RBL con le virgole)'; $wb['stress_adaptive_txt'] = 'Adatta a momentanee punte di carico di lavoro'; @@ -181,6 +183,8 @@ $wb['overtraffic_notify_admin_txt'] = 'Trasmetti notifiche superamento traffico $wb['overtraffic_notify_client_txt'] = 'Trasmetti notifiche superamento traffico al cliente'; $wb['overtraffic_disable_web_txt'] = 'Disabilita i siti web che eccedono il limiti di traffico'; $wb['rbl_error_regex'] = 'Per cortesia specificare nomi host RBL validi.'; +$wb['overquota_notify_threshold_txt'] = 'Quota warning usage level'; +$wb['overquota_notify_threshold_error'] = 'Quota warning usage level must be between 0-100%'; $wb['overquota_notify_admin_txt'] = 'Trasmetti allarmi quota ad admin'; $wb['overquota_notify_client_txt'] = 'Trasmetti allarmi quota al cliente'; $wb['overquota_notify_onok_txt'] = 'Trasmetti messaggio quota ok al cliente'; diff --git a/interface/web/admin/lib/lang/it_system_config.lng b/interface/web/admin/lib/lang/it_system_config.lng index 39cbfb6321..d58e1d1d22 100644 --- a/interface/web/admin/lib/lang/it_system_config.lng +++ b/interface/web/admin/lib/lang/it_system_config.lng @@ -105,4 +105,6 @@ $wb['show_support_messages_txt'] = 'Mostra la funzione messaggio nel modulo Help $wb['show_aps_menu_txt'] = 'Mostra menu APS'; $wb['show_aps_menu_note_txt'] = 'APS saranno rimosse dal pannello in un prossimo futuro.'; $wb['show_aps_menu_note_url_txt'] = 'Clicca qui per maggiori informazioni.'; +$wb['show_aps_menu_note_url_txt'] = 'Click here for more information.'; +$wb['dns_show_zoneexport_txt'] = 'Show zone export.'; ?> diff --git a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng index 8cf14ea629..b09fbaabc8 100644 --- a/interface/web/dashboard/lib/lang/it_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/it_dashlet_limits.lng @@ -30,4 +30,5 @@ $wb['limit_domain_txt'] = 'Numero domini'; $wb['limit_mailquota_txt'] = 'Quota mailbox assegnata'; $wb['limit_web_quota_txt'] = 'Quota web assegnata'; $wb['limit_database_quota_txt'] = 'Quota database assegnata'; +$wb['limit_mail_wblist_txt'] = 'Number of email white / blacklist entries'; ?> diff --git a/interface/web/dns/lib/lang/it_dns_soa.lng b/interface/web/dns/lib/lang/it_dns_soa.lng index c3fc730945..41c900e398 100644 --- a/interface/web/dns/lib/lang/it_dns_soa.lng +++ b/interface/web/dns/lib/lang/it_dns_soa.lng @@ -42,4 +42,6 @@ $wb['error_not_allowed_server_id'] = 'Il server selezionato non è abilitato per $wb['soa_cannot_be_changed_txt'] = 'La zona SOA non può essere modificata. Contatta l\'Amministratore se hai necessità di fare la modifica.'; $wb['configuration_error_txt'] = 'ERRORE DI CONFIGURATIONE'; $wb['dnssec_algo_txt'] = 'Algoritmo DNSSEC'; +$wb['rendered_zone_txt'] = 'Bind zone format for reference and export.'; +$wb['rendered_zone_unavailable_txt'] = 'Sorry, no data is available yet.'; ?> diff --git a/interface/web/monitor/lib/lang/ar_syslog_list.lng b/interface/web/monitor/lib/lang/ar_syslog_list.lng index c1b8ce74ba..256c0cb1ec 100644 --- a/interface/web/monitor/lib/lang/ar_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ar_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Message'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/bg_syslog_list.lng b/interface/web/monitor/lib/lang/bg_syslog_list.lng index ef607637ea..ceec6c7d72 100644 --- a/interface/web/monitor/lib/lang/bg_syslog_list.lng +++ b/interface/web/monitor/lib/lang/bg_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Съобщение'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/br_syslog_list.lng b/interface/web/monitor/lib/lang/br_syslog_list.lng index ca97be1ab9..24118b4830 100644 --- a/interface/web/monitor/lib/lang/br_syslog_list.lng +++ b/interface/web/monitor/lib/lang/br_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Nível'; $wb['message_txt'] = 'Mensagem'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ca_syslog_list.lng b/interface/web/monitor/lib/lang/ca_syslog_list.lng index da918d516f..19396b5ca2 100644 --- a/interface/web/monitor/lib/lang/ca_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ca_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Niveau de log '; $wb['message_txt'] = 'Message'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/cz_syslog_list.lng b/interface/web/monitor/lib/lang/cz_syslog_list.lng index de26512883..5fa66e066e 100644 --- a/interface/web/monitor/lib/lang/cz_syslog_list.lng +++ b/interface/web/monitor/lib/lang/cz_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Úroveň protokolu'; $wb['message_txt'] = 'Zpráva'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/de_syslog_list.lng b/interface/web/monitor/lib/lang/de_syslog_list.lng index 527fd72a1f..6ee36a677b 100644 --- a/interface/web/monitor/lib/lang/de_syslog_list.lng +++ b/interface/web/monitor/lib/lang/de_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Protokoll-Level'; $wb['message_txt'] = 'Nachricht'; $wb['batch_delete_errors_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/dk_syslog_list.lng b/interface/web/monitor/lib/lang/dk_syslog_list.lng index 082f59c00a..22fbadfd1d 100644 --- a/interface/web/monitor/lib/lang/dk_syslog_list.lng +++ b/interface/web/monitor/lib/lang/dk_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Meddelelse'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/el_syslog_list.lng b/interface/web/monitor/lib/lang/el_syslog_list.lng index 7a26a826b4..1eb4831e88 100644 --- a/interface/web/monitor/lib/lang/el_syslog_list.lng +++ b/interface/web/monitor/lib/lang/el_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Επίπεδο καταγραφής'; $wb['message_txt'] = 'Μήνυμα'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/en_syslog_list.lng b/interface/web/monitor/lib/lang/en_syslog_list.lng index c1b8ce74ba..256c0cb1ec 100644 --- a/interface/web/monitor/lib/lang/en_syslog_list.lng +++ b/interface/web/monitor/lib/lang/en_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Message'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/es_syslog_list.lng b/interface/web/monitor/lib/lang/es_syslog_list.lng index 0e32c8ff72..38cb93e098 100644 --- a/interface/web/monitor/lib/lang/es_syslog_list.lng +++ b/interface/web/monitor/lib/lang/es_syslog_list.lng @@ -6,5 +6,5 @@ $wb['server_id_txt'] = 'Servidor'; $wb['tstamp_txt'] = 'Fecha'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/fi_syslog_list.lng b/interface/web/monitor/lib/lang/fi_syslog_list.lng index 65e7e4e6a5..842ed01335 100644 --- a/interface/web/monitor/lib/lang/fi_syslog_list.lng +++ b/interface/web/monitor/lib/lang/fi_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Lokitaso'; $wb['message_txt'] = 'Viesti'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/fr_syslog_list.lng b/interface/web/monitor/lib/lang/fr_syslog_list.lng index da918d516f..19396b5ca2 100644 --- a/interface/web/monitor/lib/lang/fr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/fr_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Niveau de log '; $wb['message_txt'] = 'Message'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/hr_syslog_list.lng b/interface/web/monitor/lib/lang/hr_syslog_list.lng index 13f2932598..8a62c62489 100644 --- a/interface/web/monitor/lib/lang/hr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/hr_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Logovi'; $wb['message_txt'] = 'Poruka'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/hu_syslog_list.lng b/interface/web/monitor/lib/lang/hu_syslog_list.lng index 1ce56abfc3..21ef2bfcdf 100644 --- a/interface/web/monitor/lib/lang/hu_syslog_list.lng +++ b/interface/web/monitor/lib/lang/hu_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Naplózási szint'; $wb['message_txt'] = 'Üzenet'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/id_syslog_list.lng b/interface/web/monitor/lib/lang/id_syslog_list.lng index 060fbd8f19..a06f5e3d71 100644 --- a/interface/web/monitor/lib/lang/id_syslog_list.lng +++ b/interface/web/monitor/lib/lang/id_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Tingkatan Log'; $wb['message_txt'] = 'Pesan'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/it_syslog_list.lng b/interface/web/monitor/lib/lang/it_syslog_list.lng index 65ff6fc7c5..c67c716e3b 100644 --- a/interface/web/monitor/lib/lang/it_syslog_list.lng +++ b/interface/web/monitor/lib/lang/it_syslog_list.lng @@ -4,4 +4,7 @@ $wb['tstamp_txt'] = 'Data'; $wb['server_id_txt'] = 'Server'; $wb['loglevel_txt'] = 'Livello log'; $wb['message_txt'] = 'Messaggio'; +$wb['batch_delete_warnings_txt'] = 'Remove all warnings'; +$wb['batch_delete_errors_txt'] = 'Remove all errors'; +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ja_syslog_list.lng b/interface/web/monitor/lib/lang/ja_syslog_list.lng index 51630cc32d..bda73f402b 100644 --- a/interface/web/monitor/lib/lang/ja_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ja_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'ログレベル'; $wb['message_txt'] = 'メッセージ'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/nl_syslog_list.lng b/interface/web/monitor/lib/lang/nl_syslog_list.lng index 2f9531a5c3..b084d9120d 100644 --- a/interface/web/monitor/lib/lang/nl_syslog_list.lng +++ b/interface/web/monitor/lib/lang/nl_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Log niveau'; $wb['message_txt'] = 'Bericht'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/pl_syslog_list.lng b/interface/web/monitor/lib/lang/pl_syslog_list.lng index 7ad1a7f4c0..efd50405ed 100644 --- a/interface/web/monitor/lib/lang/pl_syslog_list.lng +++ b/interface/web/monitor/lib/lang/pl_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Poziom logowania'; $wb['message_txt'] = 'Wiadomość'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/pt_syslog_list.lng b/interface/web/monitor/lib/lang/pt_syslog_list.lng index e186861245..9d9189d720 100644 --- a/interface/web/monitor/lib/lang/pt_syslog_list.lng +++ b/interface/web/monitor/lib/lang/pt_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Nível do Log'; $wb['message_txt'] = 'Mensagem'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ro_syslog_list.lng b/interface/web/monitor/lib/lang/ro_syslog_list.lng index 62b0801cc1..617fbed9b9 100644 --- a/interface/web/monitor/lib/lang/ro_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ro_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Loglevel'; $wb['message_txt'] = 'Mesaj'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/ru_syslog_list.lng b/interface/web/monitor/lib/lang/ru_syslog_list.lng index 0b4a8418ac..adeed60a3c 100644 --- a/interface/web/monitor/lib/lang/ru_syslog_list.lng +++ b/interface/web/monitor/lib/lang/ru_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Уровень журналирования'; $wb['message_txt'] = 'Сообщение'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/se_syslog_list.lng b/interface/web/monitor/lib/lang/se_syslog_list.lng index aaa45b8a51..c0ad7a2466 100644 --- a/interface/web/monitor/lib/lang/se_syslog_list.lng +++ b/interface/web/monitor/lib/lang/se_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Loggnivå'; $wb['message_txt'] = 'Meddelande'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/sk_syslog_list.lng b/interface/web/monitor/lib/lang/sk_syslog_list.lng index 6696f4064e..5a01e6bef6 100644 --- a/interface/web/monitor/lib/lang/sk_syslog_list.lng +++ b/interface/web/monitor/lib/lang/sk_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Úroveň logovania'; $wb['message_txt'] = 'Správa'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> diff --git a/interface/web/monitor/lib/lang/tr_syslog_list.lng b/interface/web/monitor/lib/lang/tr_syslog_list.lng index 8b7dc81b1b..67a63387fa 100644 --- a/interface/web/monitor/lib/lang/tr_syslog_list.lng +++ b/interface/web/monitor/lib/lang/tr_syslog_list.lng @@ -6,5 +6,5 @@ $wb['loglevel_txt'] = 'Günlükleme Düzeyi'; $wb['message_txt'] = 'İleti'; $wb['batch_delete_warnings_txt'] = 'Remove all warnings'; $wb['batch_delete_errors_txt'] = 'Remove all errors'; -$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?' +$wb['batch_delete_confirmation'] = 'Are you sure you want to acknowledge all log entries?'; ?> -- GitLab From 89a12aeae7f34b11513fe0c0549b66c115775d07 Mon Sep 17 00:00:00 2001 From: Tim de Boer Date: Wed, 30 Mar 2022 14:01:36 +0200 Subject: [PATCH 1366/1368] Changed 'Client Limit'-check and fixed styling --- interface/web/mail/lib/module.conf.php | 60 +++++++++----------------- 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/interface/web/mail/lib/module.conf.php b/interface/web/mail/lib/module.conf.php index 39fd5c36bb..40a7813b62 100644 --- a/interface/web/mail/lib/module.conf.php +++ b/interface/web/mail/lib/module.conf.php @@ -13,56 +13,49 @@ $module['order'] = '40'; //**** Email accounts menu $items = array(); -if($app->auth->get_client_limit($userid, 'maildomain') != 0) -{ +if($app->auth->get_client_limit($userid, 'maildomain') != 0) { $items[] = array( 'title' => 'Domain', 'target' => 'content', 'link' => 'mail/mail_domain_list.php', 'html_id' => 'mail_domain_list'); } -if($app->auth->get_client_limit($userid, 'mailaliasdomain') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailaliasdomain') != 0) { $items[] = array( 'title' => 'Domain Alias', 'target' => 'content', 'link' => 'mail/mail_aliasdomain_list.php', 'html_id' => 'mail_aliasdomain_list'); } -if($app->auth->get_client_limit($userid, 'mailbox') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailbox') != 0) { $items[] = array( 'title' => 'Email Mailbox', 'target' => 'content', 'link' => 'mail/mail_user_list.php', 'html_id' => 'mail_user_list'); } -if($app->auth->get_client_limit($userid, 'mailalias') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailalias') != 0) { $items[] = array( 'title' => 'Email Alias', 'target' => 'content', 'link' => 'mail/mail_alias_list.php', 'html_id' => 'mail_alias_list'); } -if($app->auth->get_client_limit($userid, 'mailforward') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailforward') != 0) { $items[] = array( 'title' => 'Email Forward', 'target' => 'content', 'link' => 'mail/mail_forward_list.php', 'html_id' => 'mail_forward_list'); } -if($app->auth->get_client_limit($userid, 'mailcatchall') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailcatchall') != 0) { $items[] = array( 'title' => 'Email Catchall', 'target' => 'content', 'link' => 'mail/mail_domain_catchall_list.php', 'html_id' => 'mail_domain_catchall_list'); } -if(! $app->auth->is_admin() && $app->auth->get_client_limit($userid, 'mail_wblist') != 0) -{ +if(! $app->auth->is_admin() && $app->auth->get_client_limit($userid, 'mail_wblist') != 0) { $items[] = array( 'title' => 'Email Whitelist', 'target' => 'content', 'link' => 'mail/mail_whitelist_list.php', @@ -74,8 +67,7 @@ if(! $app->auth->is_admin() && $app->auth->get_client_limit($userid, 'mail_wblis 'link' => 'mail/mail_blacklist_list.php', 'html_id' => 'mail_blacklist_list'); -if($app->auth->get_client_limit($userid, 'mailrouting') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailrouting') != 0) { $items[] = array( 'title' => 'Email Routing', 'target' => 'content', 'link' => 'mail/mail_transport_list.php', @@ -84,8 +76,7 @@ if($app->auth->get_client_limit($userid, 'mailrouting') != 0) } -if(count($items) && $app->system->has_service($userid, 'mail')) -{ +if(count($items) && $app->system->has_service($userid, 'mail')) { $module['nav'][] = array( 'title' => 'Email Accounts', 'open' => 1, 'items' => $items); @@ -94,16 +85,14 @@ if(count($items) && $app->system->has_service($userid, 'mail')) //**** Mailinglist menu $items = array(); -if($app->auth->get_client_limit($userid, 'mailmailinglist') != 0) -{ +if($app->auth->get_client_limit($userid, 'mailmailinglist') != 0) { $items[] = array( 'title' => 'Mailing List', 'target' => 'content', 'link' => 'mail/mail_mailinglist_list.php', 'html_id' => 'mail_mailinglist_list'); } -if(count($items) && $app->system->has_service($userid, 'mail')) -{ +if(count($items) && $app->system->has_service($userid, 'mail')) { $module['nav'][] = array( 'title' => 'Mailing List', 'open' => 1, 'items' => $items); @@ -112,8 +101,7 @@ if(count($items) && $app->system->has_service($userid, 'mail')) //**** Spamfilter menu $items = array(); -if($app->auth->get_client_limit($userid, 'spamfilter_wblist') != 0) -{ +if($app->auth->get_client_limit($userid, 'spamfilter_wblist') != 0) { $items[] = array( 'title' => 'Whitelist', 'target' => 'content', 'link' => 'mail/spamfilter_whitelist_list.php', @@ -125,8 +113,7 @@ if($app->auth->get_client_limit($userid, 'spamfilter_wblist') != 0) 'html_id' => 'spamfilter_blacklist_list'); } -if($app->auth->is_admin()) -{ +if($app->auth->is_admin()) { $items[] = array( 'title' => 'User / Domain', 'target' => 'content', 'link' => 'mail/spamfilter_users_list.php', @@ -142,8 +129,7 @@ if($app->auth->is_admin()) // 'link' => 'mail/spamfilter_config_list.php'); } -if(count($items)) -{ +if(count($items)) { $module['nav'][] = array( 'title' => 'Spamfilter', 'open' => 1, 'items' => $items); @@ -152,8 +138,7 @@ if(count($items)) //**** Fetchmail menu $items = array(); -if($app->auth->get_client_limit($userid, 'fetchmail') != 0) -{ +if($app->auth->get_client_limit($userid, 'fetchmail') != 0) { $items[] = array( 'title' => 'Fetchmail', 'target' => 'content', 'link' => 'mail/mail_get_list.php', @@ -168,24 +153,21 @@ if($app->auth->get_client_limit($userid, 'fetchmail') != 0) if ($app->system->has_service($userid, 'xmpp')) { $items = array(); - if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) - { + if($app->auth->get_client_limit($userid, 'xmpp_domain') != 0) { $items[] = array( 'title' => 'XMPP Domain', 'target' => 'content', 'link' => 'mail/xmpp_domain_list.php', 'html_id' => 'xmpp_domain_list'); } - if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) - { + if($app->auth->get_client_limit($userid, 'xmpp_user') != 0) { $items[] = array( 'title' => 'XMPP Account', 'target' => 'content', 'link' => 'mail/xmpp_user_list.php', 'html_id' => 'xmpp_user_list'); } - if(count($items)) - { + if(count($items)) { $module['nav'][] = array( 'title' => 'Jabber / XMPP', 'open' => 1, 'items' => $items); @@ -207,8 +189,7 @@ $items[] = array( 'title' => 'Mailbox traffic', 'link' => 'mail/mail_user_stats.php', 'html_id' => 'mail_user_stats'); -if($app->auth->get_client_limit($userid, 'backup') == 'y') -{ +if($app->auth->get_client_limit($userid, 'mail_backup') != 'n') { $items[] = array ( 'title' => 'Backup Stats', 'target' => 'content', @@ -223,8 +204,7 @@ $module['nav'][] = array( 'title' => 'Statistics', //**** Global filters menu $items = array(); -if($app->auth->is_admin()) -{ +if($app->auth->is_admin()) { $items[] = array( 'title' => 'Postfix Whitelist', 'target' => 'content', 'link' => 'mail/mail_whitelist_list.php', -- GitLab From c4d52f6a5934556d9bb8dbff8c2b5d159a632347 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 31 Mar 2022 05:31:05 +0000 Subject: [PATCH 1367/1368] removed unneccessary words --- .../web/sites/lib/lang/it_web_backup_list.lng | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/interface/web/sites/lib/lang/it_web_backup_list.lng b/interface/web/sites/lib/lang/it_web_backup_list.lng index 572d729193..75587300a2 100644 --- a/interface/web/sites/lib/lang/it_web_backup_list.lng +++ b/interface/web/sites/lib/lang/it_web_backup_list.lng @@ -32,22 +32,22 @@ $wb['make_backup_database_txt'] = 'Fare il backup del databases'; $wb['make_backup_confirm_txt'] = 'Stai per iniziare un backup manuale. I backup manuali rientrano nel conteggio del numero totale dei backup consentiti. Quindi se il limite sarà superato verranno cancellati automaticamente i backup più vecchi. Vuoi procedere?'; $wb['yes_txt'] = 'Si'; $wb['no_txt'] = 'No'; -$wb['backup_is_encrypted_txt'] = 'Il backup è cifrato'; -$wb['backup_format_zip_txt'] = 'Backup formato zip'; -$wb['backup_format_gzip_txt'] = 'Backup formato gzip'; -$wb['backup_format_bzip2_txt'] = 'Backup formato bzip2'; -$wb['backup_format_xz_txt'] = 'Backup formato xz'; -$wb['backup_format_tar_gzip_txt'] = 'Backup formato tar (gzip)'; -$wb['backup_format_tar_bzip2_txt'] = 'Backup formato tar (bzip2)'; -$wb['backup_format_tar_xz_txt'] = 'Backup formato tar (xz)'; -$wb['backup_format_zip_bzip2_txt'] = 'Backup formato zip (bzip2)'; -$wb['backup_format_7z_lzma_txt'] = 'Backup formato 7z (LZMA)'; -$wb['backup_format_7z_lzma2_txt'] = 'Backup formato 7z (LZMA2)'; -$wb['backup_format_7z_ppmd_txt'] = 'Backup formato 7z (PPMd)'; -$wb['backup_format_7z_bzip2_txt'] = 'Backup formato 7z (BZip2)'; -$wb['backup_format_tar_7z_lzma_txt'] = 'Backup formato tar + 7z (LZMA)'; -$wb['backup_format_tar_7z_lzma2_txt'] = 'Backup formato tar + 7z (LZMA2)'; -$wb['backup_format_tar_7z_ppmd_txt'] = 'Backup formato tar + 7z (PPMd)'; -$wb['backup_format_tar_7z_bzip2_txt'] = 'Backup formato tar + 7z (BZip2)'; -$wb['backup_format_rar_txt'] = 'Backup formato RAR'; +$wb['backup_is_encrypted_txt'] = 'cifrato'; +$wb['backup_format_zip_txt'] = 'zip'; +$wb['backup_format_gzip_txt'] = 'gzip'; +$wb['backup_format_bzip2_txt'] = 'bzip2'; +$wb['backup_format_xz_txt'] = 'xz'; +$wb['backup_format_tar_gzip_txt'] = 'tar (gzip)'; +$wb['backup_format_tar_bzip2_txt'] = 'tar (bzip2)'; +$wb['backup_format_tar_xz_txt'] = 'tar (xz)'; +$wb['backup_format_zip_bzip2_txt'] = 'zip (bzip2)'; +$wb['backup_format_7z_lzma_txt'] = '7z (LZMA)'; +$wb['backup_format_7z_lzma2_txt'] = '7z (LZMA2)'; +$wb['backup_format_7z_ppmd_txt'] = '7z (PPMd)'; +$wb['backup_format_7z_bzip2_txt'] = '7z (BZip2)'; +$wb['backup_format_tar_7z_lzma_txt'] = 'tar + 7z (LZMA)'; +$wb['backup_format_tar_7z_lzma2_txt'] = 'tar + 7z (LZMA2)'; +$wb['backup_format_tar_7z_ppmd_txt'] = 'tar + 7z (PPMd)'; +$wb['backup_format_tar_7z_bzip2_txt'] = 'tar + 7z (BZip2)'; +$wb['backup_format_rar_txt'] = 'RAR'; ?> -- GitLab From 2ffabb4d36174c2de8fa3db6d1a813c29151add9 Mon Sep 17 00:00:00 2001 From: Mattia Rizzolo Date: Mon, 4 Apr 2022 14:20:15 +0200 Subject: [PATCH 1368/1368] Avoid bashisms in the call to acme.sh This command is using features that are not POSIX-compliant (the [[ and the || in them), that despite being supported by many shells (including bash) are not available in dash. Since system() runs the code with /bin/sh that is an interface defined as only being POSIX-compliant, with no extensions, it should not presume a specific shell in that. Closes: #6326 Signed-off-by: Mattia Rizzolo --- server/lib/classes/letsencrypt.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/letsencrypt.inc.php b/server/lib/classes/letsencrypt.inc.php index 6cb0f7927c..e78ef2636e 100644 --- a/server/lib/classes/letsencrypt.inc.php +++ b/server/lib/classes/letsencrypt.inc.php @@ -74,7 +74,7 @@ class letsencrypt { $cert_arg = '--fullchain-file ' . escapeshellarg($bundle_file) . ' --cert-file ' . escapeshellarg($cert_file); } - $cmd = 'R=0 ; C=0 ; ' . $letsencrypt . ' --issue ' . $cmd . ' -w /usr/local/ispconfig/interface/acme --always-force-new-domain-key --keylength 4096; R=$? ; if [[ $R -eq 0 || $R -eq 2 ]] ; then ' . $letsencrypt . ' --install-cert ' . $cmd . ' --key-file ' . escapeshellarg($key_file) . ' ' . $cert_arg . ' --reloadcmd ' . escapeshellarg($this->get_reload_command()) . ' --log ' . escapeshellarg($conf['ispconfig_log_dir'].'/acme.log') . '; C=$? ; fi ; if [[ $C -eq 0 ]] ; then exit $R ; else exit $C ; fi'; + $cmd = 'R=0 ; C=0 ; ' . $letsencrypt . ' --issue ' . $cmd . ' -w /usr/local/ispconfig/interface/acme --always-force-new-domain-key --keylength 4096; R=$? ; if [ $R -eq 0 -o $R -eq 2 ] ; then ' . $letsencrypt . ' --install-cert ' . $cmd . ' --key-file ' . escapeshellarg($key_file) . ' ' . $cert_arg . ' --reloadcmd ' . escapeshellarg($this->get_reload_command()) . ' --log ' . escapeshellarg($conf['ispconfig_log_dir'].'/acme.log') . '; C=$? ; fi ; if [ $C -eq 0 ] ; then exit $R ; else exit $C ; fi'; return $cmd; } -- GitLab