\ 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 310dda1c9e9cc056c2a95b6cf80b34934a730ede..39d8bb4c2f981d224d31410eef43b00881c46797 100644
--- a/interface/web/dns/templates/dns_dkim_edit.htm
+++ b/interface/web/dns/templates/dns_dkim_edit.htm
@@ -34,5 +34,5 @@
\ 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 0be975f529bee5aa8c25147866b789bd27007fec..8964f7a525cc99949a9164408316026c368437eb 100644
--- a/interface/web/dns/templates/dns_hinfo_edit.htm
+++ b/interface/web/dns/templates/dns_hinfo_edit.htm
@@ -28,5 +28,5 @@
-
+
\ 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 12cfb6357fd42285214e4423c5e9196b6c5dc7df..a1ba7c95cd39d132655d14f35a8ac547e5dc7ba6 100644
--- a/interface/web/dns/templates/dns_loc_edit.htm
+++ b/interface/web/dns/templates/dns_loc_edit.htm
@@ -28,5 +28,5 @@
-
+
\ 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 290c218faf96b3cbb772c2b257c4c1c2aef67f69..576ffc9dc61151ef67d264c4795e0a46f38b7b24 100644
--- a/interface/web/dns/templates/dns_mx_edit.htm
+++ b/interface/web/dns/templates/dns_mx_edit.htm
@@ -31,5 +31,5 @@
-
+
\ 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 3cafa17dafaa8bf64046db2bf86f10874ab02f8e..9460ff3937ba885d29eb62cce075d1ecec319bc2 100644
--- a/interface/web/dns/templates/dns_ns_edit.htm
+++ b/interface/web/dns/templates/dns_ns_edit.htm
@@ -28,5 +28,5 @@
-
+
\ 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 de59069259df650f1359a102d3b52af31b1ff27a..10f26fd365269d34a0a5ab6cb39de9b4eb16d25a 100644
--- a/interface/web/dns/templates/dns_ptr_edit.htm
+++ b/interface/web/dns/templates/dns_ptr_edit.htm
@@ -28,5 +28,5 @@
-
+
\ 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 3dd04adf1a3344d7d9864c02f57e0bb4bb7465fd..68912309612c134a708d9ecc70a360b9a8ca914a 100644
--- a/interface/web/dns/templates/dns_rp_edit.htm
+++ b/interface/web/dns/templates/dns_rp_edit.htm
@@ -28,5 +28,5 @@
-
+
\ No newline at end of file
diff --git a/interface/web/dns/templates/dns_spf_edit.htm b/interface/web/dns/templates/dns_spf_edit.htm
index 3c34b37a41b03d0f74b5f335d2a3986c25f2ed43..9939a86d38e8e62f9183056ab6ca9e5cb21fedec 100644
--- a/interface/web/dns/templates/dns_spf_edit.htm
+++ b/interface/web/dns/templates/dns_spf_edit.htm
@@ -57,6 +57,6 @@
\ No newline at end of file
diff --git a/interface/web/dns/templates/dns_tlsa_edit.htm b/interface/web/dns/templates/dns_tlsa_edit.htm
index c2cde8be6197c060588bf337749b315e6ed151c9..15a9fa227493d265afb07b3516e5ad97cb395942 100644
--- a/interface/web/dns/templates/dns_tlsa_edit.htm
+++ b/interface/web/dns/templates/dns_tlsa_edit.htm
@@ -28,5 +28,5 @@
-
+
\ 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 f03f6d36c86209aec2aff3e2c368ba83e13b7f41..a35909dfa48a54b1ba742664a270b0e14f566be4 100644
--- a/interface/web/dns/templates/dns_txt_edit.htm
+++ b/interface/web/dns/templates/dns_txt_edit.htm
@@ -28,5 +28,5 @@
-
+
\ No newline at end of file
diff --git a/interface/web/help/faq_list.php b/interface/web/help/faq_list.php
index 128480dca2c2573d3dcb630a4a4d0730d00ce640..4ea86722cfe07a78b4b8016d9775edc3ac38e952 100644
--- a/interface/web/help/faq_list.php
+++ b/interface/web/help/faq_list.php
@@ -3,6 +3,10 @@
require_once '../../lib/config.inc.php';
require_once '../../lib/app.inc.php';
+// Markdown support
+require_once '../../lib/classes/parsedown/parsedown.php';
+require_once '../../lib/classes/parsedown/parsedown_extra.php';
+
// Path to the list definition file
$list_def_file = 'list/faq_list.php';
@@ -15,6 +19,18 @@ if(!stristr($_SESSION['s']['user']['modules'], 'help')) {
// Loading the class
$app->uses('listform_actions');
+class list_actions extends listform_actions {
+ /**
+ * @author Frantisek Preissler
+ */
+ function prepareDataRow($rec) {
+ $rec['hf_answer'] = ParsedownExtra::instance()->parse($rec['hf_answer']);
+ return parent::prepareDataRow($rec);
+ }
+}
+
+$override = new list_actions;
+
// Optional limit
$hf_section = 0;
if(isset($_GET['hfs_id']))
@@ -26,12 +42,12 @@ if(!$hf_section)
$res = $app->db->queryOneRecord("SELECT MIN(hfs_id) AS min_id FROM help_faq_sections");
$hf_section = $res['min_id'];
}
-$app->listform_actions->SQLExtWhere = "help_faq.hf_section = $hf_section";
+$override->SQLExtWhere = "help_faq.hf_section = $hf_section";
if($hf_section) $res = $app->db->queryOneRecord("SELECT hfs_name FROM help_faq_sections WHERE hfs_id=?", $hf_section);
// Start the form rendering and action ahndling
echo "
FAQ: ".$res['hfs_name']."
";
-if($hf_section) $app->listform_actions->onLoad();
+if($hf_section) $override->onLoad();
?>
diff --git a/interface/web/help/lib/lang/bg.lng b/interface/web/help/lib/lang/bg.lng
index fa57a5d4d99183c0aae002562e89a20402b60040..7d65941b7990f016dda966200b313d10e81ce66b 100644
--- a/interface/web/help/lib/lang/bg.lng
+++ b/interface/web/help/lib/lang/bg.lng
@@ -6,9 +6,9 @@ $wb['View messages'] = 'Преглед на съобщенията';
$wb['Support'] = 'Поддръжка';
$wb['About ISPConfig'] = 'За ISPConfig';
$wb['Version'] = 'Версия';
-$wb['Frequently Asked Questions'] = 'Често задавани въпроси';
-$wb['FAQ Sections'] = 'ЧЗВ секция';
-$wb['Manage Sections'] = 'Редактирай секциите';
-$wb['Add a Question & Answer Pair'] = 'Добави въпрос & Отговор ';
-$wb['Manage Questions'] = 'Редактирай въпроса';
+$wb['Frequently Asked Questions'] = 'Често Задавани Въпроси';
+$wb['FAQ Sections'] = 'ЧЗВ секции';
+$wb['Manage Sections'] = 'Управление секциите';
+$wb['Add a Question & Answer Pair'] = 'Добави Въпрос и Отговор';
+$wb['Manage Questions'] = 'Управление на въпросите';
?>
diff --git a/interface/web/help/lib/lang/it.lng b/interface/web/help/lib/lang/it.lng
index d02e52ee374dcb67fabc8b850dab2972aa880ba6..fc4f0431750c03cfec012750abc1cf177612afc9 100644
--- a/interface/web/help/lib/lang/it.lng
+++ b/interface/web/help/lib/lang/it.lng
@@ -4,11 +4,11 @@ $wb['Message'] = 'Messaggi';
$wb['Send message'] = 'Spedisci messaggio';
$wb['View messages'] = 'Visualizza messaggi';
$wb['Support'] = 'Supporto';
-$wb['About ISPConfig'] = 'About ISPConfig';
+$wb['About ISPConfig'] = 'Info su ISPConfig';
$wb['Version'] = 'Versione';
-$wb['Frequently Asked Questions'] = 'Frequently Asked Questions';
+$wb['Frequently Asked Questions'] = 'Domande frequenti';
$wb['FAQ Sections'] = 'FAQ Sezioni';
$wb['Manage Sections'] = 'Gestisci Sezioni';
$wb['Add a Question & Answer Pair'] = 'Aggiungi una domanda e rispondi';
-$wb['Manage Questions'] = 'Manage Questions';
+$wb['Manage Questions'] = 'Gestisci domande';
?>
diff --git a/interface/web/help/lib/lang/it_faq_form.lng b/interface/web/help/lib/lang/it_faq_form.lng
index 7716d19dfa17b215a8d83955eb05fc57dfd2c941..c271fa40803622362ad58019a77ecd110c39090b 100644
--- a/interface/web/help/lib/lang/it_faq_form.lng
+++ b/interface/web/help/lib/lang/it_faq_form.lng
@@ -1,5 +1,5 @@
diff --git a/interface/web/help/lib/lang/it_support_message.lng b/interface/web/help/lib/lang/it_support_message.lng
index e4e18aa3ee3707b71c3ab2501847f99448b4dcbe..89e0b91687c35515d5d81855bcf92899faf50af4 100644
--- a/interface/web/help/lib/lang/it_support_message.lng
+++ b/interface/web/help/lib/lang/it_support_message.lng
@@ -12,5 +12,5 @@ $wb['answer_to_support_request_txt'] = 'Hai una risposta alla richiesta di suppo
$wb['answer_to_support_request_sent_txt'] = 'La tua richiesta di supporto è stata trasmessa. Non rispondere a questa email.';
$wb['support_request_sent_txt'] = 'La tua richiesta di supporto è stata trasmessa. Non rispondere a questa email.';
$wb['recipient_or_sender_email_address_not_valid_txt'] = 'Impossibile trasmettere il messaggio. Destinatario non valido.';
-$wb['subject_is_empty'] = 'The subject can not be empty.';
+$wb['subject_is_empty'] = 'L'oggetto non può essere vuoto.';
?>
diff --git a/interface/web/login/index.php b/interface/web/login/index.php
index bccf4330af9e6dedc0c9328976cddd9ccb5cf361..303e2e88c5a96fc25975d417ecdd2c99d51cd5fc 100644
--- a/interface/web/login/index.php
+++ b/interface/web/login/index.php
@@ -267,12 +267,20 @@ if(count($_POST) > 0) {
fwrite($authlog_handle, $authlog ."\n");
fclose($authlog_handle);
+ // get last IP used to login
+ $user_data = $app->db->queryOneRecord("SELECT last_login_ip,last_login_at FROM sys_user WHERE username = ?", $username);
+
+ $_SESSION['s']['last_login_ip'] = $user_data['last_login_ip'];
+ $_SESSION['s']['last_login_at'] = $user_data['last_login_at'];
+ if(!$loginAs) {
+ $app->db->query("UPDATE sys_user SET last_login_ip = ?, last_login_at = ? WHERE username = ?", $_SERVER['REMOTE_ADDR'], time(), $username);
+ }
/*
* We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the
* new theme, if the logged-in user has another
*/
- if ($loginAs){
+ if($loginAs) {
echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage'];
exit;
} else {
@@ -284,8 +292,7 @@ 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);
diff --git a/interface/web/login/lib/lang/ar_login_as.lng b/interface/web/login/lib/lang/ar_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/ar_login_as.lng
+++ b/interface/web/login/lib/lang/ar_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/bg_login_as.lng b/interface/web/login/lib/lang/bg_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/bg_login_as.lng
+++ b/interface/web/login/lib/lang/bg_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/br_login_as.lng b/interface/web/login/lib/lang/br_login_as.lng
index e2a6f529dcc3403f807f80ee3016be04ff523196..8fc0d1c1c3ce0ebe0e51cb64aeb0adf6f09ff16b 100644
--- a/interface/web/login/lib/lang/br_login_as.lng
+++ b/interface/web/login/lib/lang/br_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Já existe um registro de firewall igual para es
$wb['tcp_ports_error_regex'] = 'Caractere não permitido para atribuição numa porta TCP. Caracteres permitidos são: números, \':\' e \',\'.';
$wb['udp_ports_error_regex'] = 'Caractere não permitido para atribuição numa porta UDP. Caracteres permitidos são: números, \':\' e \',\'.';
$wb['login_as_or_logout_txt'] = 'Você deseja acessar novamente como {UTYPE} ou sair?';
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
?>
diff --git a/interface/web/login/lib/lang/ca_login_as.lng b/interface/web/login/lib/lang/ca_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/ca_login_as.lng
+++ b/interface/web/login/lib/lang/ca_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/cz_login_as.lng b/interface/web/login/lib/lang/cz_login_as.lng
index 53629ac2a5127b46fd872adcec215632b5479dc2..9c0e7368f7314edeb828ae0022a07b39078af9a3 100644
--- a/interface/web/login/lib/lang/cz_login_as.lng
+++ b/interface/web/login/lib/lang/cz_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Pro tento server již existuje záznam firewallu
$wb['tcp_ports_error_regex'] = 'Znak není povole v definici TCP portu. Povolené symboly jsou čísla, : a ,.';
$wb['udp_ports_error_regex'] = 'Znak není povole v definici UDP portu. Povolené symboly jsou čísla, : a ,.';
$wb['login_as_or_logout_txt'] = 'Chcete se znovu přihlásit jako uživatel {UTYPE} nebo se chcete odhlásit ?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/de_login_as.lng b/interface/web/login/lib/lang/de_login_as.lng
index 4baa195d3a71735586dba972a96b968d0cbf70da..131ff5fa3cd4eeb98d0954cca3f73bad502a28e0 100644
--- a/interface/web/login/lib/lang/de_login_as.lng
+++ b/interface/web/login/lib/lang/de_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Es gibt bereits einen Firewalleintrag für diese
$wb['tcp_ports_error_regex'] = 'Es sind nur Zahlen in der TCP Port Definition erlaubt. ';
$wb['udp_ports_error_regex'] = 'Es sind nur Zahlen in der UDP Port Definition erlaubt., ';
$wb['login_as_or_logout_txt'] = 'Wollen Sie sich wieder als {UTYPE} anmelden oder sich abmelden?';
-?>
+$wb['btn_reloginas_txt'] = 'Ja, erneut als %s anmelden';
+$wb['btn_nologout_txt'] = 'Nein, abmelden';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/dk_login_as.lng b/interface/web/login/lib/lang/dk_login_as.lng
index bebcf165a7bf2a78b5ba13d7eb1d47d41c214e4c..83dcf39c63698953cce51142524e98e4ef60d86b 100644
--- a/interface/web/login/lib/lang/dk_login_as.lng
+++ b/interface/web/login/lib/lang/dk_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Der er allerede en firewall post for denne serve
$wb['tcp_ports_error_regex'] = 'Tegn ikke tilladt i TCP port definition. Tilladt tegn er tal, \\":\\" og \\",\\".';
$wb['udp_ports_error_regex'] = 'Tegn ikke tilladt i UDP port definition. Tilladt tegn er tal, \\":\\" og \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/el_login_as.lng b/interface/web/login/lib/lang/el_login_as.lng
index 435d3e9a69eeb7f79abbc9c30d98ecaf32913529..060b91aa8417fd1cf58cc3f5bea0ce09d6d8e385 100644
--- a/interface/web/login/lib/lang/el_login_as.lng
+++ b/interface/web/login/lib/lang/el_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Υπάρχει ήδη μια εγγραφή Fire
$wb['tcp_ports_error_regex'] = 'Μη έγκυρος χαρακτήρας για τον ορισμός θύρας tcp. Επιτρεπόμενοι χαρακτήρες είναι οι αριθμοί, η \\":\\" και οι \\",\\".';
$wb['udp_ports_error_regex'] = 'Μη έγκυρος χαρακτήρας για τον ορισμός θύρας udp. Επιτρεπόμενοι χαρακτήρες είναι οι αριθμοί, η \\":\\" και οι \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/en_login_as.lng b/interface/web/login/lib/lang/en_login_as.lng
index d1f98c8806204e162954107caf753aa174153295..c849db3d04b724f0ae8a65de2dff4b6ca43e38f3 100644
--- a/interface/web/login/lib/lang/en_login_as.lng
+++ b/interface/web/login/lib/lang/en_login_as.lng
@@ -10,4 +10,6 @@ $wb["active_txt"] = 'Active';
$wb["tcp_ports_error_regex"] = 'Character not allowed in tcp port definition. Allowed characters are numbers, ":" and ",".';
$wb["udp_ports_error_regex"] = 'Character not allowed in udp port definition. Allowed characters are numbers, ":" and ",".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/es.lng b/interface/web/login/lib/lang/es.lng
index c7576d509d8aec45c7799df0958125e4d349e10c..ccd34f244c1d89d0ff1e48c866d205f4a58e599b 100755
--- a/interface/web/login/lib/lang/es.lng
+++ b/interface/web/login/lib/lang/es.lng
@@ -25,10 +25,10 @@ $wb['stay_logged_in_txt'] = 'Permanecer conectado';
$wb['theme_not_compatible'] = 'El tema elegido no es compatible con la versión actual. Por favor busca una nueva versión del tema. Se ha activado el tema por defecto automáticamente.';
$wb['user_regex_error'] = 'El nombre de usuario contiene caracteres no permitidos o tiene más de 64 caracteres.';
$wb['username_txt'] = 'Nombre de usuario';
-$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['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.';
+$wb['pw_reset_act'] = 'Se le ha eniado un enlace de activación. Por favor visite el enlace para confirmar la petición de cambio de contraseña.';
+$wb['pw_reset_act_mail_title'] = 'Confirmar restablecer la contraseña del panel de control ISPConfig 3';
+$wb['pw_reset_act_mail_msg'] = 'Por favor confirme que desea restablecer la contraseña de su panel de control ISPConfig 3 visitando el siguiente enlace de activación: ';
+$wb['lost_password_function_wait_txt'] = 'No puede solicitar una nueva contraseña todavía. Por favor, espere unos minutos.';
+$wb['lost_password_function_expired_txt'] = 'Este enlace de activación ha caducado. Por favor, solicite uno nuevo.';
+$wb['lost_password_function_denied_txt'] = 'Este enlace de activación no es válido.';
?>
diff --git a/interface/web/login/lib/lang/es_login_as.lng b/interface/web/login/lib/lang/es_login_as.lng
index b7f3e21f987f2ca4016eeaf3834b4e5445983571..b235675a6f88c2b79f933bece533dc5fa35c27c2 100755
--- a/interface/web/login/lib/lang/es_login_as.lng
+++ b/interface/web/login/lib/lang/es_login_as.lng
@@ -8,5 +8,7 @@ $wb['login_2_txt'] = 'Si lo hace, puede \\"volver\\" haciendo clic en salir.';
$wb['tcp_ports_error_regex'] = 'Caracteres no permitidos en la definición de puertos tcp. Los caracteres permitidos son: números, \\":\\" y \\",\\".';
$wb['udp_port_help_txt'] = 'Separado por comas';
$wb['udp_ports_error_regex'] = 'Caracteres no permitidos en la definición de puertos udp. Los caracteres permitidos son: números, \\":\\" y \\",\\".';
-$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['login_as_or_logout_txt'] = '¿Desea reiniciar sesión como {UTYPE} o terminar sesión?';
+$wb['btn_reloginas_txt'] = 'Sí, reiniciar como %s';
+$wb['btn_nologout_txt'] = 'No, terminar sesión';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/fi_login_as.lng b/interface/web/login/lib/lang/fi_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/fi_login_as.lng
+++ b/interface/web/login/lib/lang/fi_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/fr_login_as.lng b/interface/web/login/lib/lang/fr_login_as.lng
index 55c9f6df5b6a302d260b83c3e61b0f668d7f5154..612246a33cd488b4cd8ac5f659b5c7efb648cc00 100644
--- a/interface/web/login/lib/lang/fr_login_as.lng
+++ b/interface/web/login/lib/lang/fr_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Caractère non autorisé dans la règle de port TCP. Les caractères autorisés sont : les chiffres, « : » et « , ».';
$wb['udp_ports_error_regex'] = 'Caractère non autorisé dans la règle de port UDP. Les caractères autorisés sont : les chiffres, « : » et « , ».';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/hr_login_as.lng b/interface/web/login/lib/lang/hr_login_as.lng
index bcd13040d38363cad1bddf8ed3953ad13edbbeb8..e1fe01edc14811455c63d7f1e4ec0f9bcfb8e9a2 100644
--- a/interface/web/login/lib/lang/hr_login_as.lng
+++ b/interface/web/login/lib/lang/hr_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/hu_login_as.lng b/interface/web/login/lib/lang/hu_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/hu_login_as.lng
+++ b/interface/web/login/lib/lang/hu_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/id_login_as.lng b/interface/web/login/lib/lang/id_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/id_login_as.lng
+++ b/interface/web/login/lib/lang/id_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/it.lng b/interface/web/login/lib/lang/it.lng
index 017d60df78beb46a9a6ee5654caaee0a915d8e1f..d45c7b406bd3db2499259749fab246ed15ee0ed0 100644
--- a/interface/web/login/lib/lang/it.lng
+++ b/interface/web/login/lib/lang/it.lng
@@ -24,11 +24,11 @@ $wb['theme_not_compatible'] = 'Il tema selezionato non è compatibile con questa
$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['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.';
+$wb['lost_password_function_disabled_txt'] = 'Funzione di password persa non disponibile per questo utente.';
+$wb['pw_reset_act'] = 'Link per reset password. Prego visitare il link per confermare la password.';
+$wb['pw_reset_act_mail_title'] = 'Conferma reset password ISPConfig 3';
+$wb['pw_reset_act_mail_msg'] = 'Per confermare il reset della password per ISPConfig 3 si prega di visitare questo link: ';
+$wb['lost_password_function_wait_txt'] = 'Non puoi richiedere una nuova password in questo momento. Riprova tra qualche minuto.';
+$wb['lost_password_function_expired_txt'] = 'Link di attivazione scaduto. Si prega di richiedere un nuovo link di attivazione.';
+$wb['lost_password_function_denied_txt'] = 'Link di attivazione non valido.';
?>
diff --git a/interface/web/login/lib/lang/it_login_as.lng b/interface/web/login/lib/lang/it_login_as.lng
index 3fa23da2741f0911bc933af3a615b675507813b3..70ac752eda0f553059a7359b349ce99e57f89b62 100644
--- a/interface/web/login/lib/lang/it_login_as.lng
+++ b/interface/web/login/lib/lang/it_login_as.lng
@@ -8,5 +8,7 @@ $wb['active_txt'] = 'Attivo';
$wb['firewall_error_unique'] = 'Esiste già un record firewall per questo server.';
$wb['tcp_ports_error_regex'] = 'Caratteri non autorizzati nella definizine di porta tcp. Sono consentiti caratteri numerici, \\":\\" e \\",\\".';
$wb['udp_ports_error_regex'] = 'Caratteri non autorizzati nella definizine di porta udp. ono consentiti caratteri numerici, \\":\\" e \\",\\".';
-$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['login_as_or_logout_txt'] = 'Ri-loggarsi come {UTYPE} o uscire?';
+$wb['btn_reloginas_txt'] = 'Sì, ri-loggarsi come %s';
+$wb['btn_nologout_txt'] = 'No, esci';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/ja_login_as.lng b/interface/web/login/lib/lang/ja_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/ja_login_as.lng
+++ b/interface/web/login/lib/lang/ja_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/nl_login_as.lng b/interface/web/login/lib/lang/nl_login_as.lng
index d4d2715e7a664a3aa0b7b0b2b89503dc3caf546c..1952618e0e5565bc2c0100bd8776f0a9be08f757 100644
--- a/interface/web/login/lib/lang/nl_login_as.lng
+++ b/interface/web/login/lib/lang/nl_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/pl.lng b/interface/web/login/lib/lang/pl.lng
index 702b50117f7000a48e7a1a9c08e9f7d5b7b4332d..ce9c489ce47f3919700964796882faf2013c3e50 100644
--- a/interface/web/login/lib/lang/pl.lng
+++ b/interface/web/login/lib/lang/pl.lng
@@ -14,21 +14,21 @@ $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';
$wb['email_txt'] = 'E-mail';
$wb['error_maintenance_mode'] = 'Ta instalacja ISPConfig jest aktualnie w trakcje modernizacji. Wracamy niebawem - proszę o cierpliwość.';
$wb['theme_not_compatible'] = 'Wybrany temat nie jest kompatybilny z aktualną wersją ISPConfig. Proszę wybrać nową wersję tematu. Został aktywowany automatycznie domyślny temat.';
-$wb['back_txt'] = 'Back';
-$wb['email_error'] = 'Email contains unallowed characters or has a invalid format.';
-$wb['stay_logged_in_txt'] = 'Keep me logged in';
-$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['back_txt'] = 'Wstecz';
+$wb['email_error'] = 'E-mail zawiera niedozwolone znaki lub ma nieprawidłowy format.';
+$wb['stay_logged_in_txt'] = 'Pozostaw mnie zalogowanym';
+$wb['lost_password_function_disabled_txt'] = 'Funkcja utraconego hasła nie jest dostępna dla tego użytkownika.';
+$wb['pw_reset_act'] = 'Został wysłany link aktywacyjny. Przejdź do linku, aby potwierdzić prośbę o podanie hasła.';
$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['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.';
+$wb['lost_password_function_wait_txt'] = 'Nie możesz jeszcze zażądać nowego hasła. Poczekaj kilka minut.';
+$wb['lost_password_function_expired_txt'] = 'Link aktywacyjny wygasł. Poproś o nowy.';
+$wb['lost_password_function_denied_txt'] = 'Ten link aktywacyjny jest nieprawidłowy.';
?>
diff --git a/interface/web/login/lib/lang/pl_login_as.lng b/interface/web/login/lib/lang/pl_login_as.lng
index fd673484d7bfbbc44175d3939d12fb48c5a20593..55683a80b0738b675ffeff7336d93f21949fdc6c 100644
--- a/interface/web/login/lib/lang/pl_login_as.lng
+++ b/interface/web/login/lib/lang/pl_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Istnieje już wpis firewalla dla tego serwera.';
$wb['tcp_ports_error_regex'] = 'Niedozwolony znam w definicji portu TCP. Dozwolone są liczby, dwukropek i przecinek (: i ,)';
$wb['udp_ports_error_regex'] = 'Niedozwolony znam w definicji portu UDP. Dozwolone są liczby, dwukropek i przecinek (: i ,)';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/pt_login_as.lng b/interface/web/login/lib/lang/pt_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/pt_login_as.lng
+++ b/interface/web/login/lib/lang/pt_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/ro_login_as.lng b/interface/web/login/lib/lang/ro_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/ro_login_as.lng
+++ b/interface/web/login/lib/lang/ro_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/ru_login_as.lng b/interface/web/login/lib/lang/ru_login_as.lng
index 653f4174a0d20ee439fc0427b93695e1b1d80a93..2fdafc39802f61bc8cb1b5ba569d58cc144db0dc 100644
--- a/interface/web/login/lib/lang/ru_login_as.lng
+++ b/interface/web/login/lib/lang/ru_login_as.lng
@@ -9,4 +9,4 @@ $wb['firewall_error_unique'] = 'Уже есть такая запись бред
$wb['tcp_ports_error_regex'] = 'Недопустимый символ в указании tcp порта. Корректные сиволы - цифры, ":" и ","';
$wb['udp_ports_error_regex'] = 'Некорректный символ в указании UDP порта. Допустимые сиволы - цифры, ":" и ","';
$wb['login_as_or_logout_txt'] = 'Вы хотите заново войти как {UTYPE} или выйти?';
-?>
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/se_login_as.lng b/interface/web/login/lib/lang/se_login_as.lng
index 17a82080dc9defec177c24ad06092da45f1a7e07..3ce5b9be41c7281595e815c9f40b9e99cbd8d0c5 100644
--- a/interface/web/login/lib/lang/se_login_as.lng
+++ b/interface/web/login/lib/lang/se_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/sk_login_as.lng b/interface/web/login/lib/lang/sk_login_as.lng
index cf75b54b47a852400eec51271488e41ea64e69c4..cf9d01f16b887af957146ebcd060c3ff984f2d34 100644
--- a/interface/web/login/lib/lang/sk_login_as.lng
+++ b/interface/web/login/lib/lang/sk_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'There is already a firewall record for this serv
$wb['tcp_ports_error_regex'] = 'Character not allowed in tcp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['udp_ports_error_regex'] = 'Character not allowed in udp port definition. Allowed characters are numbers, \\":\\" and \\",\\".';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/lib/lang/tr_login_as.lng b/interface/web/login/lib/lang/tr_login_as.lng
index f7f12feeff4124ca933211de12edd708dd0ec508..7dc28e71c77faba2f72c43a1ab255d4c78e5c3b5 100644
--- a/interface/web/login/lib/lang/tr_login_as.lng
+++ b/interface/web/login/lib/lang/tr_login_as.lng
@@ -9,4 +9,6 @@ $wb['firewall_error_unique'] = 'Bu sunucu için bir güvenlik duvarı kaydı zat
$wb['tcp_ports_error_regex'] = 'TCP kapı açıklamasında karakter kullanılamaz. Yalnız rakam, \\":\\" ve \\",\\" karakterleri kullanılabilir.';
$wb['udp_ports_error_regex'] = 'UDP kapı açıklamasında karakter kullanılamaz. Yalnız rakam, \\":\\" ve \\",\\" karakterleri kullanılabilir.';
$wb['login_as_or_logout_txt'] = 'Do you want to re-login as {UTYPE} or logout?';
-?>
+$wb['btn_reloginas_txt'] = 'Yes, re-login as %s';
+$wb['btn_nologout_txt'] = 'No, logout';
+?>
\ No newline at end of file
diff --git a/interface/web/login/logout.php b/interface/web/login/logout.php
index a4a127ff8bcfa3cd3e48fcd1f3cfa311a070e84e..db5f3adbcc39396ee054a77a2bd48eb5c937b850 100644
--- a/interface/web/login/logout.php
+++ b/interface/web/login/logout.php
@@ -56,8 +56,8 @@ if ((isset($_SESSION['s_old']) && ($_SESSION['s_old']['user']['typ'] == 'admin'
-
-
+
+
';
exit;
@@ -84,4 +84,4 @@ if($_SESSION["s"]["site"]["logout"] != '') {
$_SESSION = array();
session_destroy();
session_write_close();
-?>
+?>
\ No newline at end of file
diff --git a/interface/web/login/templates/index.htm b/interface/web/login/templates/index.htm
index 9a75a66cbda5003c367ceda39aaa93d34c22a23c..3662dff52bb1bb5d937c6d999df806ba5ef957eb 100644
--- a/interface/web/login/templates/index.htm
+++ b/interface/web/login/templates/index.htm
@@ -21,8 +21,8 @@
\ No newline at end of file
diff --git a/interface/web/mail/templates/mail_mailinglist_options.htm b/interface/web/mail/templates/mail_mailinglist_options.htm
new file mode 100644
index 0000000000000000000000000000000000000000..9d0489a165ce1b80c0d7a305d49085a56323123a
--- /dev/null
+++ b/interface/web/mail/templates/mail_mailinglist_options.htm
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {tmpl_var name='archive'}
+
+
+
+
+
+
+
+
+
+
diff --git a/interface/web/mail/templates/mail_mailinglist_privacy.htm b/interface/web/mail/templates/mail_mailinglist_privacy.htm
new file mode 100644
index 0000000000000000000000000000000000000000..63fe167ade096cf6a04f80ac305e756a51ea0c46
--- /dev/null
+++ b/interface/web/mail/templates/mail_mailinglist_privacy.htm
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+ {tmpl_var name='list_type'}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interface/web/mail/templates/mail_ml_membership_edit.htm b/interface/web/mail/templates/mail_ml_membership_edit.htm
new file mode 100644
index 0000000000000000000000000000000000000000..bc45027edab2965f327799d2817d7238774f4506
--- /dev/null
+++ b/interface/web/mail/templates/mail_ml_membership_edit.htm
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{tmpl_var name='name_optional_txt'}
+
+
+
+
+
+
+
+
+
+
+ {tmpl_var name='goodbye_msg'}
+
+
+
+
+
+
+
+
+
+
+
+
+
{tmpl_var name='name_optional_txt'}
+
+
+
+
+
+
+
+
+
+
+ {tmpl_var name='welcome_msg'}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/interface/web/mail/templates/mail_ml_membership_list.htm b/interface/web/mail/templates/mail_ml_membership_list.htm
new file mode 100644
index 0000000000000000000000000000000000000000..9142179bc58f667fc3d11107195c317656892710
--- /dev/null
+++ b/interface/web/mail/templates/mail_ml_membership_list.htm
@@ -0,0 +1,75 @@
+
\ No newline at end of file
diff --git a/interface/web/sites/form/database.tform.php b/interface/web/sites/form/database.tform.php
index aef56f55141bbe937e552215207b762777b99d6b..40085478397bd7b0a7ca8733f5f1b4014d5fe853 100644
--- a/interface/web/sites/form/database.tform.php
+++ b/interface/web/sites/form/database.tform.php
@@ -157,7 +157,7 @@ $form["tabs"]['database'] = array (
'datatype' => 'VARCHAR',
'formtype' => 'SELECT',
'default' => '',
- 'value' => array('' => 'DB-Default', 'latin1' => 'Latin 1', 'utf8' => 'UTF-8')
+ 'value' => array('' => 'DB-Default', 'latin1' => 'Latin 1', 'utf8' => 'UTF-8', 'utf8mb4' => 'UTF-8 4-Byte')
),
'remote_access' => array (
'datatype' => 'VARCHAR',
diff --git a/interface/web/sites/form/ftp_user.tform.php b/interface/web/sites/form/ftp_user.tform.php
index 239bfdb8583a7ec0a6e52b699a7ed98164dcbcb9..3b2ad1aee90a90cdd14e7514a80bf2a6bc62a129 100644
--- a/interface/web/sites/form/ftp_user.tform.php
+++ b/interface/web/sites/form/ftp_user.tform.php
@@ -203,7 +203,7 @@ if($app->auth->is_admin()) {
'validators' => array ( 0 => array ( 'type' => 'NOTEMPTY',
'errmsg'=> 'directory_error_empty'),
1 => array ( 'type' => 'REGEX',
- 'regex' => '/^\/[a-zA-Z0-9\ \.\-\_\/]{10,128}$/',
+ 'regex' => '/^\/[a-zA-Z0-9\ \.\-\_\/]{7,128}$/',
'errmsg'=> 'directory_error_regex'),
2 => array ( 'type' => 'CUSTOM',
'class' => 'validate_ftpuser',
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 41f4eb9bb1f21761774069477e28370445dfb01e..1f01c23704c3791362d3dd99e75fd85eb18b2b00 100644
--- a/interface/web/sites/lib/lang/ar_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/ar_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 2da107636ca51e9206b69a989ba879c2f26826c6..971ca5d893c646b4ffb2b6d0eb2f4ece4e02fcc1 100644
--- a/interface/web/sites/lib/lang/bg_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/bg_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 468fe0c7a2e6ea19ac6b26ea4df13430807eaa7b..8628d66264bc0f0804690db425921523cf272a8d 100644
--- a/interface/web/sites/lib/lang/br_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/br_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $wb['https_port_txt'] = 'Porta HTTPS';
$wb['http_port_error_regex'] = 'Porta HTTP inválida.';
$wb['https_port_error_regex'] = 'Porta HTTPS inválida.';
$wb['enable_pagespeed_txt'] = 'Habilitar PageSpeed';
+$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['log_retention_txt'] = 'Tempo de armazenamenro dos arquivos de log';
$wb['log_retention_error_regex'] = 'Tempo de armazenamento, em dias (valores permitidos: min. 0 - max. 9999)';
?>
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 43a58b0dd1e65434b6c643d0aba3636b6cad7675..83538dc778d95776ae89083b3fbf36bf46e0709a 100644
--- a/interface/web/sites/lib/lang/ca_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/ca_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 a278776629ca75b43d93f9f42b62d171faa2f1db..435c2b63fb70c7846ee9fced9cc6ba34651172fc 100644
--- a/interface/web/sites/lib/lang/cz_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/cz_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
diff --git a/interface/web/sites/lib/lang/de.lng b/interface/web/sites/lib/lang/de.lng
index 48e0a9a9a77432462558a73e0e1b1f5cf5be2c09..f5cf2e2052f88c852180c9d4d9ddeb4987f0641f 100644
--- a/interface/web/sites/lib/lang/de.lng
+++ b/interface/web/sites/lib/lang/de.lng
@@ -14,7 +14,7 @@ $wb['Command Line'] = 'Kommandozeile';
$wb['Shell-User'] = 'Shell Benutzer';
$wb['Cron Jobs'] = 'Cronjobs';
$wb['Statistics'] = 'Statistik';
-$wb['Web traffic'] = 'Datentransfer';
+$wb['Web traffic'] = 'Web-Datentransfer';
$wb['Website quota (Harddisk)'] = 'Speicherplatzbeschränkung';
$wb['Cron'] = 'Cron';
$wb['Stats'] = 'Statistiken';
@@ -32,4 +32,7 @@ $wb['Installed packages'] = 'Installierte Pakete';
$wb['Update Packagelist'] = 'Paketliste aktualisieren';
$wb['error_proxy_requires_url'] = 'Weiterleitungstyp ';
$wb['Subdomain (Vhost)'] = 'Subdomain (vHost)';
+$wb['Database quota'] = 'Datenbank-Quota';
+$wb['FTP traffic'] = 'FTP-Datentransfer';
+$wb['Backup Stats'] = 'Backup-Statistiken';
?>
diff --git a/interface/web/sites/lib/lang/de_database_quota_stats_list.lng b/interface/web/sites/lib/lang/de_database_quota_stats_list.lng
index 3bc9874bf105333a5ae9d0a6517f909b075d4772..087756104a3cdcd706ae4de1805193a403083851 100644
--- a/interface/web/sites/lib/lang/de_database_quota_stats_list.lng
+++ b/interface/web/sites/lib/lang/de_database_quota_stats_list.lng
@@ -5,5 +5,5 @@ $wb['client_txt'] = 'Kunde';
$wb['used_txt'] = 'Verwendeter Speicherplatz';
$wb['quota_txt'] = 'Quota';
$wb['percentage_txt'] = 'Verbraucht in %';
-$wb['list_head_txt'] = 'Database Quota';
+$wb['list_head_txt'] = 'Datenbank-Quota';
?>
diff --git a/interface/web/sites/lib/lang/de_ftp_sites_stats_list.lng b/interface/web/sites/lib/lang/de_ftp_sites_stats_list.lng
index e44025a715dbf435bdca9faee0b109ba25bf611d..c2df2b397c58bdbde1366ee1bbd6135b6671b298 100644
--- a/interface/web/sites/lib/lang/de_ftp_sites_stats_list.lng
+++ b/interface/web/sites/lib/lang/de_ftp_sites_stats_list.lng
@@ -1,10 +1,10 @@
diff --git a/interface/web/sites/lib/lang/de_shell_user.lng b/interface/web/sites/lib/lang/de_shell_user.lng
index 9130b456e345e32b661ff72b78b8d39d7a217a49..6b5dac53c3a5a1ed6558e733ed9572eb695154d4 100644
--- a/interface/web/sites/lib/lang/de_shell_user.lng
+++ b/interface/web/sites/lib/lang/de_shell_user.lng
@@ -28,9 +28,9 @@ $wb['password_mismatch_txt'] = 'Die Passwörter stimmen nicht überein.';
$wb['password_match_txt'] = 'Die Passwörter stimmen überein.';
$wb['username_must_not_exceed_32_chars_txt'] = 'Der Benutzername darf 32 Zeichen nicht überschreiten.';
$wb['username_not_allowed_txt'] = 'Dieser Benutzername ist nicht erlaubt.';
-$wb['invalid_system_user_or_group_txt'] = 'Invalid system user or group';
-$wb['directory_error_regex'] = 'Invalid directory';
-$wb['shell_error_regex'] = 'Invalid shell';
-$wb['invalid_username_txt'] = 'Invalid Username';
-$wb['directory_error_notinweb'] = 'The directory has to be inside the web root.';
+$wb['invalid_system_user_or_group_txt'] = 'Ungültiger Web Benutzername oder Gruppe';
+$wb['directory_error_regex'] = 'Ungültiges Verzeichnis';
+$wb['shell_error_regex'] = 'Ungültige Shell';
+$wb['invalid_username_txt'] = 'Ungültiger Benutzername';
+$wb['directory_error_notinweb'] = 'Das Verzeichnis muss innerhalb des Web-Verzeichnisses liegen.';
?>
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 275b09080caeaf0cfd0973adbd0cf5a9f3995736..136a3d70adbce67c8d4b71ed20ce580e477340c2 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';
?>
diff --git a/interface/web/sites/lib/lang/de_web_subdomain.lng b/interface/web/sites/lib/lang/de_web_subdomain.lng
index 586c90adc38f69190b75a1723f6641b92ed4558f..4f34874a11f1d7490f6c8536c502faabea09492a 100644
--- a/interface/web/sites/lib/lang/de_web_subdomain.lng
+++ b/interface/web/sites/lib/lang/de_web_subdomain.lng
@@ -45,6 +45,6 @@ $wb['available_proxy_directive_snippets_txt'] = 'Verfügbare Proxy Direktiven Sc
$wb['error_proxy_requires_url'] = 'Weiterleitungstyp \\"proxy\\" erfordert eine URL als Weiterleitungspfad.';
$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['http_port_error_regex'] = 'HTTP Port ungültig.';
+$wb['https_port_error_regex'] = 'HTTPS Port ungültig.';
?>
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 1b86171ea7a3ea7c27833c4a9a477caade0c8e77..7719b296894a22f1c701aed85b713a00fd2287bc 100644
--- a/interface/web/sites/lib/lang/de_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/de_web_vhost_domain.lng
@@ -138,15 +138,19 @@ $wb['enable_spdy_txt'] = 'Aktiviere SPDY';
$wb['load_client_data_txt'] = 'Kundendaten übernehmen';
$wb['load_my_data_txt'] = 'Meine Kontaktdaten laden';
$wb['reset_client_data_txt'] = 'Daten verwerfen';
-$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['rewrite_to_https_txt'] = 'Rewrite HTTP to HTTPS';
-$wb['password_strength_txt'] = 'Password strength';
+$wb['server_chosen_not_ok'] = 'Der ausgewählte Server ist nicht zulässig für diesen Account.';
+$wb['subdomain_error_empty'] = 'Die Subdomain ist leer oder ungültig.';
+$wb['rewrite_to_https_txt'] = 'HTTP zu HTTPS weiterleiten';
+$wb['password_strength_txt'] = 'Passwortstärke';
$wb['directive_snippets_id_txt'] = 'Webserver-Konfiguration';
$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['http_port_error_regex'] = 'HTTP Port ungültig.';
+$wb['https_port_error_regex'] = 'HTTPS Port ungültig.';
+$wb['error_ipv4_change_forbidden'] = 'Die IP-Adresse kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator, wenn Sie die IPv4-Adresse ändern möchten.';
+$wb['error_ipv6_change_forbidden'] = 'Die IP-Adresse kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator, wenn Sie die IPv6-Adresse ändern möchten.';
+$wb['error_domain_change_forbidden'] = 'Der Domainname kann nicht geändert werden. Bitte kontaktieren Sie Ihren Administrator, wenn Sie den Domainnamen ändern möchten.';
+$wb['error_server_change_not_possible'] = 'Der Server kann nicht geändert werden.';
$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)";
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 43a58b0dd1e65434b6c643d0aba3636b6cad7675..83538dc778d95776ae89083b3fbf36bf46e0709a 100644
--- a/interface/web/sites/lib/lang/dk_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/dk_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 66d8f33a16a093809b45c5c0da56899deadb047d..983a298b36c97aee6bbe240fe276e0a227212bd4 100644
--- a/interface/web/sites/lib/lang/el_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/el_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
diff --git a/interface/web/sites/lib/lang/en_ftp_user.lng b/interface/web/sites/lib/lang/en_ftp_user.lng
index 9d6a27fb682e4f7e18b278efa33a45a6014318f7..2deefcb719d7ab6bdc7c6345b535f4ff61e54fd9 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.';
diff --git a/interface/web/sites/lib/lang/en_web_folder_user.lng b/interface/web/sites/lib/lang/en_web_folder_user.lng
index 207f5367ebe1f5036bb28254d584d9845740c7d8..7736d6132fbaa998fa02d1492d87657af1b7416f 100644
--- a/interface/web/sites/lib/lang/en_web_folder_user.lng
+++ b/interface/web/sites/lib/lang/en_web_folder_user.lng
@@ -11,4 +11,5 @@ $wb['password_mismatch_txt'] = 'The passwords do not match.';
$wb['password_match_txt'] = 'The passwords do match.';
$wb["no_folder_perm"] = 'You have no permission for this folder.';
$wb['error_user_exists_already_txt'] = 'There is already a record for this user.';
+$wb["username_error_regex"] = 'The Username contains invalid characters.';
?>
\ No newline at end of file
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 4d7b32015155c5f35403e2f5cdaa7a118db69339..9948839b5f75693c376edea2cf64670540598f09 100644
--- a/interface/web/sites/lib/lang/en_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/en_web_vhost_domain.lng
@@ -153,6 +153,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 432dd843410e2efd3c1ef63e1bf340dbdbe15729..e484620216ef4ef6e6d36e706779ba79cd953752 100644
--- a/interface/web/sites/lib/lang/es_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/es_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 f2de0000a0db169ab3c30a08caebd649306d79e3..74b98d86aa20336066207629921c54c8dbe94dfc 100644
--- a/interface/web/sites/lib/lang/fi_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/fi_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 eb1bb82750cba95b5e98781cfcfa7a62492c412e..39a1040d7ba210ca8eced7cff78b28e5cfc0795b 100644
--- a/interface/web/sites/lib/lang/fr_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/fr_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 7262c6f85850de5b762e5177fa8da470896a143f..ecbc78132d0fc4c00b15166df0143c616a45b9e2 100644
--- a/interface/web/sites/lib/lang/hr_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/hr_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 e10f791710b0593d0116ca75f5e22f0a272003ac..e05cce85431f942995666c0190934299f7872c93 100644
--- a/interface/web/sites/lib/lang/hu_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/hu_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 0cd28efa96b3f3b3fe7613e7626ea5e5cffff4eb..7c637d58310c67c58daffd437b48f0a5af5f8149 100644
--- a/interface/web/sites/lib/lang/id_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/id_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 73b7b4d352180bc716a8d8fc0c4233308ea41103..59a30ed4134bbefc55e70b28f650fbf4c339da92 100644
--- a/interface/web/sites/lib/lang/it_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/it_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 47d7a154f19de5a8f3a9dc609bcc1628f26e8b61..faddd9b76ce2a6f8738ee2da07a132ca367dbc7f 100644
--- a/interface/web/sites/lib/lang/ja_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/ja_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 227eb70d21110ea0bd3174e5c7828c45bdc15266..ceac5ff8212914158f15dbad278159167f948d12 100644
--- a/interface/web/sites/lib/lang/nl_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/nl_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $wb['https_port_txt'] = 'HTTPS Poort';
$wb['http_port_error_regex'] = 'HTTP Poort niet correct.';
$wb['https_port_error_regex'] = 'HTTPS Poort niet correct.';
$wb['enable_pagespeed_txt'] = 'Enable PageSpeed';
+$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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
diff --git a/interface/web/sites/lib/lang/pl_ftp_sites_stats_list.lng b/interface/web/sites/lib/lang/pl_ftp_sites_stats_list.lng
index e44025a715dbf435bdca9faee0b109ba25bf611d..74ee2d2187a40eedfca4598f2b568141fcec8987 100644
--- a/interface/web/sites/lib/lang/pl_ftp_sites_stats_list.lng
+++ b/interface/web/sites/lib/lang/pl_ftp_sites_stats_list.lng
@@ -1,10 +1,10 @@
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 3ccd645c32d4c6e5d159bf3dd6f3e5460ae86318..b8f22335013fde543e8f1af7294be9f571998b5a 100644
--- a/interface/web/sites/lib/lang/pl_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/pl_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 4ff1e7c4252101f4ec762bea8c594f939b0c2886..ec24cbe806939c4a4c52b66ba2de20ea210901a8 100644
--- a/interface/web/sites/lib/lang/pt_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/pt_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 fc10154df554189effef1c9f2d30a7ee415154a2..a874c27bed800f9810c6e17d685a385faaacddd4 100644
--- a/interface/web/sites/lib/lang/ro_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/ro_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 b8dae2f09a640e81d9c2eabbfd929f7415e69cf4..e0dd1e129431f20e1e34384ef46748f3df52da9c 100644
--- a/interface/web/sites/lib/lang/se_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/se_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 140835db84c53c8efabe363378b725dba6f1acec..390e0d171d55f397094a2153e00916df891d1021 100644
--- a/interface/web/sites/lib/lang/sk_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/sk_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
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 e2676913bf7a389118525ff17f10b8327450f2a4..d78b7cead6e5bd8179b2f15fa8636f304bae8069 100644
--- a/interface/web/sites/lib/lang/tr_web_vhost_domain.lng
+++ b/interface/web/sites/lib/lang/tr_web_vhost_domain.lng
@@ -148,6 +148,10 @@ $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['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['log_retention_txt'] = 'Logfiles retention time';
$wb['log_retention_error_regex'] = 'Retention time in days (allowed values: min. 0 - max. 9999)';
?>
diff --git a/interface/web/sites/web_vhost_domain_edit.php b/interface/web/sites/web_vhost_domain_edit.php
index 023f8db0c52938f467b5c3eb5c8ba6d61e9420c5..72c07724ea2e153780f6b6adb59e482a8756479d 100644
--- a/interface/web/sites/web_vhost_domain_edit.php
+++ b/interface/web/sites/web_vhost_domain_edit.php
@@ -1472,7 +1472,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('The Server can not be changed.');
+ $app->tform->errorMessage .= $app->tform->lng('error_server_change_not_possible');
$this->dataRecord["server_id"] = $rec['server_id'];
}
unset($rec);
@@ -1483,17 +1483,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('The Domain can not be changed. Please ask your Administrator if you want to change the domain name.');
+ $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('The IP can not be changed. Please ask your Administrator if you want to change the IPv4-Address.');
+ $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('The IP can not be changed. Please ask your Administrator if you want to change the IPv6-Address.');
+ $app->tform->errorMessage .= $app->tform->lng('error_ipv6_change_forbidden');
$this->dataRecord["ipv6_address"] = $rec['ipv6_address'];
}
unset($rec);
diff --git a/interface/web/strengthmeter/lib/lang/it_strengthmeter.lng b/interface/web/strengthmeter/lib/lang/it_strengthmeter.lng
index 3f2b615f75809e0ad79d3c54f68729f31852e522..b006c4714150243cf1fb1e306af4acb9948e2cab 100644
--- a/interface/web/strengthmeter/lib/lang/it_strengthmeter.lng
+++ b/interface/web/strengthmeter/lib/lang/it_strengthmeter.lng
@@ -1,7 +1,7 @@
-
+
-
@@ -79,7 +79,7 @@
@@ -141,7 +141,7 @@
searchFieldWatermark: '',
resultBoxPosition: ''
});
-
+ ISPConfig.loadInitContent();
});
//-->
diff --git a/interface/web/tools/import_ispconfig.php b/interface/web/tools/import_ispconfig.php
index c43b15b7eb0ef286ff5d66ab8220f1e1d91bb2c1..728c279c01933b152905734cd122e7b197e88a46 100644
--- a/interface/web/tools/import_ispconfig.php
+++ b/interface/web/tools/import_ispconfig.php
@@ -109,10 +109,21 @@ if(isset($_POST['connected'])) {
try {
+ //* Second connections to self signed SSL certs
+ $context = stream_context_create(
+ array(
+ 'ssl' => array (
+ 'verify_peer' => false,
+ 'verify_peer_name' => false,
+ 'allow_self_signed' => true
+ )
+ )
+ );
$client = new SoapClient(null, array('location' => $_POST['remote_server'],
'uri' => $_POST['remote_server'].'/index.php',
'trace' => 1,
- 'exceptions' => 1));
+ 'exceptions' => 1,
+ 'stream_context' => $context));
if(!isset($remote_session_id)) $remote_session_id = $_POST['remote_session_id'];
diff --git a/interface/web/vm/lib/lang/bg.lng b/interface/web/vm/lib/lang/bg.lng
index 4167e14a8a150090ecfb1aa6738fb8a6abf17760..b42a772d5b0cb34a9833f8bc7add1d2be8945ea4 100644
--- a/interface/web/vm/lib/lang/bg.lng
+++ b/interface/web/vm/lib/lang/bg.lng
@@ -1,7 +1,7 @@
diff --git a/remoting_client/examples/sites_database_add.php b/remoting_client/examples/sites_database_add.php
index 3c827769904ab9f0fbf4270e5e91c64cd62d4f8a..c63ad551eb243da03c4b0475cac66bb7fbf254a0 100644
--- a/remoting_client/examples/sites_database_add.php
+++ b/remoting_client/examples/sites_database_add.php
@@ -19,7 +19,7 @@ try {
$params = array(
'server_id' => 1,
'type' => 'mysql',
- 'website_id' => 1,
+ 'parent_domain_id' => 1,
'database_name' => 'db_name2',
'database_user_id' => '1',
'database_ro_user_id' => '0',
diff --git a/remoting_client/examples/sites_database_user_add.php b/remoting_client/examples/sites_database_user_add.php
index 108163340989e2096f2b1574b3d21b9199f98573..d59b66d9e62e53eb9c9b06d0fe650f618fbf870b 100644
--- a/remoting_client/examples/sites_database_user_add.php
+++ b/remoting_client/examples/sites_database_user_add.php
@@ -22,7 +22,7 @@ try {
'database_password' => 'db_name2'
);
- $database_id = $client->sites_database_user_add($session_id, $client_id, $params);
+ $database_user_id = $client->sites_database_user_add($session_id, $client_id, $params);
echo "Database ID: ".$database_user_id." ";
diff --git a/server/conf/apache_apps.vhost.master b/server/conf/apache_apps.vhost.master
index 47d35304f609f4e4e3405d06ad33c46e146dce3a..86814064a86ea6f21d2e4af1e2565597795b362f 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
@@ -10,7 +9,7 @@
ServerAdmin webmaster@localhost
{tmpl_var name='apps_vhost_servername'}
-
+
SetHandler None
@@ -18,13 +17,7 @@
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
@@ -46,9 +39,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
diff --git a/server/conf/apache_ispconfig.conf.master b/server/conf/apache_ispconfig.conf.master
index 3edf45fd46f2bc425642c78fe1bf37054d1e0196..74277a2637c5d6cc390046a257dad56d7f825313 100644
--- a/server/conf/apache_ispconfig.conf.master
+++ b/server/conf/apache_ispconfig.conf.master
@@ -1,128 +1,141 @@
+################################################
+# ISPConfig General Apache Options
+################################################
+ServerTokens ProductOnly
+ServerSignature Off
+
+
+
+SSLStaplingCache shmcb:/var/run/ocsp(128000)
+
+
################################################
# ISPConfig Logfile configuration for vlogger
################################################
-SetEnvIf Request_URI "^/datalogstatus.php$" dontlog
-
+
+LogFormat '%v %h %l %u %t "%r" %>s %S "%{Referer}i" "%{User-Agent}i"' combined_ispconfig
+
LogFormat "%v %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined_ispconfig
-CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig env=!dontlog
+
+CustomLog "| /usr/local/ispconfig/server/scripts/vlogger -s access.log -t \"%Y%m%d-access.log\" /var/log/ispconfig/httpd" combined_ispconfig
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
+
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
@@ -131,8 +144,10 @@ Alias /.well-known/acme-challenge /usr/local/ispconfig/interface/acme/.well-know
+
NameVirtualHost *:80
NameVirtualHost *:443
NameVirtualHost {tmpl_var name="ip_address"}:{tmpl_var name="port"}
+
diff --git a/server/conf/bind_pri.domain.master b/server/conf/bind_pri.domain.master
index ed395064af5490be0a11aafeac61a67a9ef99d2e..897ece496ce2be29203845cc37607697ac04527e 100644
--- a/server/conf/bind_pri.domain.master
+++ b/server/conf/bind_pri.domain.master
@@ -20,6 +20,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'} CAA {tmpl_var name='data'}
+
{tmpl_var name='name'} {tmpl_var name='ttl'} CNAME {tmpl_var name='data'}
@@ -53,5 +56,8 @@ $TTL {tmpl_var name='ttl'}
{tmpl_var name='name'} {tmpl_var name='ttl'} TXT "{tmpl_var name='data'}"
+
+{tmpl_var name='name'} {tmpl_var name='ttl'} TYPE257 {tmpl_var name='data'}
+
diff --git a/server/conf/metronome_conf_host.master b/server/conf/metronome_conf_host.master
index 179d533e19c532bdc498d938406a962cf877c437..3dea69257bc8cc2b637570196500ff64df24f1ea 100644
--- a/server/conf/metronome_conf_host.master
+++ b/server/conf/metronome_conf_host.master
@@ -59,7 +59,7 @@ VirtualHost "{tmpl_var name='domain'}"
};
-
+
VirtualHost "anon.{tmpl_var name='domain'}"
enabled = true;
authentication = "anonymous";
diff --git a/server/conf/nginx_apps.vhost.master b/server/conf/nginx_apps.vhost.master
index ed5e3a49ae5160842cfbc25bbd25e7e22f6c4822..75daa4df8f1692f48eacca62c217583473d9cbbf 100644
--- a/server/conf/nginx_apps.vhost.master
+++ b/server/conf/nginx_apps.vhost.master
@@ -89,7 +89,7 @@ server {
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
- # To access phpMyAdmin, the default user (like www-data on Debian/Ubuntu) must be used
+ # To access phpMyAdmin, the default user (like www-data on Debian/Devuan/Ubuntu) must be used
{use_tcp}fastcgi_pass 127.0.0.1:9000;
{use_socket}fastcgi_pass unix:{fpm_socket};
fastcgi_index index.php;
@@ -139,7 +139,7 @@ server {
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
- # To access SquirrelMail, the default user (like www-data on Debian/Ubuntu) must be used
+ # To access SquirrelMail, the default user (like www-data on Debian/Devuan/Ubuntu) must be used
{use_tcp}fastcgi_pass 127.0.0.1:9000;
{use_socket}fastcgi_pass unix:{fpm_socket};
fastcgi_index index.php;
diff --git a/server/conf/nginx_vhost.conf.master b/server/conf/nginx_vhost.conf.master
index 8cfdbcf8f6b9ba00dd8c2d42504ed46c732e99a7..7b3c376e9818626c1b258ad8e4efdaf0489476e4 100644
--- a/server/conf/nginx_vhost.conf.master
+++ b/server/conf/nginx_vhost.conf.master
@@ -1,10 +1,32 @@
+
+
+server {
+ listen :;
+
+ listen []:;
+
+ server_name ;
+ access_log off;
+ rewrite ^ https://$http_host$request_uri? permanent;
+}
+
+
+
server {
+
listen :;
listen []:;
+
+
+ listen :;
+
+ 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};
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';
@@ -35,13 +57,6 @@ server {
rewrite ^(.*)$ $2 ;
}
-
-
- if ($scheme != "https") {
- rewrite ^ https://$http_host$request_uri? permanent;
- }
-
-
@@ -290,15 +305,16 @@ server {
server {
- listen :80;
+ listen :;
- listen []:80;
+ listen []:;
-
+
- listen :443 ssl;
+ 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_protocols TLSv1 TLSv1.1 TLSv1.2;
- listen []:443 ssl;
+ 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 ;
diff --git a/server/conf/sieve_filter.master b/server/conf/sieve_filter.master
index 8e78c6c83aa87fdeb53f03a42d771aacd0c0b5e5..bfd75c4d43e6279ecba65701c7151ccade11fa79 100644
--- a/server/conf/sieve_filter.master
+++ b/server/conf/sieve_filter.master
@@ -1,4 +1,4 @@
-require ["fileinto", "regex", "vacation"];
+require ["fileinto", "regex", "vacation", "imap4flags", "envelope", "subaddress"];
# Send a copy of email to
diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master
index 0dd9e62e6c4b2e6ba0a58c96af27191d0d215217..47370ec0a919e4c165835e8fd5ae8734cc7b5c45 100644
--- a/server/conf/sieve_filter_1.2.master
+++ b/server/conf/sieve_filter_1.2.master
@@ -1,4 +1,4 @@
-require ["fileinto", "regex", "date", "relational", "vacation"];
+require ["fileinto", "regex", "date", "relational", "vacation", "imap4flags", "envelope", "subaddress"];
# Send a copy of email to
diff --git a/server/conf/vhost.conf.master b/server/conf/vhost.conf.master
index 063b5c7e3390666fb569578f97ec5448e9b38b35..812e8e0fcc9aec596e90c73a52903c442ad8591c 100644
--- a/server/conf/vhost.conf.master
+++ b/server/conf/vhost.conf.master
@@ -13,6 +13,12 @@
+
+
+ Protocols h2 h2c http/1.1
+
+
+
DocumentRoot
@@ -51,8 +57,8 @@
ErrorDocument 503 /error/503.html
-
+
SSLEngine on
SSLProtocol All -SSLv2 -SSLv3
# 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
@@ -71,9 +77,9 @@
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
-
+
# Clear PHP settings of this website
@@ -339,12 +345,24 @@
- SetHandler php5-fcgi
+
+
+ SetHandler php5-fcgi
+
+
+ SetHandler php5-fcgi
+
- SetHandler php5-fcgi
+
+
+ SetHandler php5-fcgi
+
+
+ SetHandler php5-fcgi
+
Action php5-fcgi /php5-fcgi virtual
@@ -361,7 +379,13 @@
#ProxyPassMatch ^/(.*\.php[345]?(/.*)?)$ fcgi://127.0.0.1:/$1
- SetHandler "proxy:fcgi://127.0.0.1:"
+
+
+ SetHandler "proxy:fcgi://127.0.0.1:"
+
+
+ SetHandler "proxy:fcgi://127.0.0.1:"
+
@@ -369,7 +393,13 @@
#ProxyPassMatch ^/(.*\.php[345]?(/.*)?)$ unix://|fcgi://localhost//$1
- SetHandler "proxy:unix:|fcgi://localhost"
+
+
+ SetHandler "proxy:unix:|fcgi://localhost"
+
+
+ SetHandler "proxy:unix:|fcgi://localhost"
+
@@ -440,22 +470,31 @@
RewriteCond %{REQUEST_URI} ^/\.well-known/acme-challenge/
RewriteRule ^ - [END]
+
+
+
+ RewriteCond %{HTTPS} off
+ RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
+
+ RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
+
+
RewriteCond %{HTTP_HOST} ^$ [NC]
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
- RewriteRule ^(.*)$ https://$1 [R=301,NE,L]
+ RewriteRule ^ https://%{REQUEST_URI} [R=301,NE,L]
RewriteCond %{HTTP_HOST} ^$ [NC]
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
- RewriteRule ^(.*)$ https://$1 [R=301,NE,L]
+ RewriteRule ^ https://%{REQUEST_URI} [R=301,NE,L]
- RewriteCond %{HTTP_HOST} $ [NC]
+ RewriteCond %{HTTP_HOST} $ [NC]
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
@@ -464,8 +503,7 @@
RewriteCond %{REQUEST_URI} !^/php5-fcgi/
RewriteCond %{REQUEST_URI} !^
-
- RewriteRule ^/(.*)$ $1
+ RewriteRule /(.*) $1
@@ -484,36 +522,24 @@
AssignUserId
-
- # Do not execute PHP files in webdav directory
-
-
- SecRuleRemoveById 960015
- SecRuleRemoveById 960032
-
-
- SetHandler None
-
-
- DavLockDB {tmpl_var name='document_root'}/tmp/DavLock
- # DO NOT REMOVE THE COMMENTS!
- # IF YOU REMOVE THEM, WEBDAV WILL NOT WORK ANYMORE!
- # WEBDAV BEGIN
- # WEBDAV END
+
+
+
+ SecRuleRemoveById 960015
+ SecRuleRemoveById 960032
+ DirectoryIndex disabled
+ SetHandler None
+
+ DavLockDB {tmpl_var name='document_root'}/tmp/DavLock
+ # needed by apache2_plugin.inc.php
+ # WEBDAV BEGIN
+ # WEBDAV END
+
-
-
-
-
- SSLStaplingCache shmcb:/var/run/ocsp(128000)
-
-
-
-
diff --git a/server/cron.sh b/server/cron.sh
index 98f0ddfd30d4443382e0b77a5d1a9145bb503544..58ddc67ff253394e2ec0608248b15d9f6bd581ed 100644
--- a/server/cron.sh
+++ b/server/cron.sh
@@ -10,8 +10,9 @@ if [ -f /usr/local/ispconfig/server/lib/php.ini ]; then
fi
cd /usr/local/ispconfig/server
-/usr/bin/php -q \
+$(which php) -q \
-d disable_classes= \
-d disable_functions= \
-d open_basedir= \
/usr/local/ispconfig/server/cron.php
+
\ No newline at end of file
diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php
old mode 100755
new mode 100644
index dd8be5aa68791472b47fa90e76a32f6e4335b5e5..117af30b8a0c7ec3599b3abe2b05d30b697648dd
--- a/server/lib/app.inc.php
+++ b/server/lib/app.inc.php
@@ -51,7 +51,7 @@ class app {
*/
if($conf['dbmaster_host'] != '' && ($conf['dbmaster_host'] != $conf['db_host'] || ($conf['dbmaster_host'] == $conf['db_host'] && $conf['dbmaster_database'] != $conf['db_database']))) {
- $this->dbmaster = new db($conf['dbmaster_host'], $conf['dbmaster_user'], $conf['dbmaster_password'], $conf['dbmaster_database'], $conf['dbmaster_port']);
+ $this->dbmaster = new db($conf['dbmaster_host'], $conf['dbmaster_user'], $conf['dbmaster_password'], $conf['dbmaster_database'], $conf['dbmaster_port'], $conf['dbmaster_client_flags']);
} else {
$this->dbmaster = $this->db;
}
diff --git a/server/lib/classes/aps_installer.inc.php b/server/lib/classes/aps_installer.inc.php
index 9b601d90b341d5f7722da5468a55e74d1961da24..b2be236fa15313adb06343fd9471bb60cc0d48a4 100644
--- a/server/lib/classes/aps_installer.inc.php
+++ b/server/lib/classes/aps_installer.inc.php
@@ -559,7 +559,7 @@ class ApsInstaller extends ApsBase
$shell_ret_str = implode("\n", $shell_ret);
// Although $shell_retcode might be 0, there can be PHP errors. Filter them:
- if(substr_count($shell_ret_str, 'Warning: ') > 0) $shell_retcode = 1;
+ if(stripos($shell_ret_str,'error: ')!==false)$shell_retcode=1;
// If an error has occurred, the return code is != 0
if($shell_retcode != 0) throw new Exception($shell_ret_str);
diff --git a/server/lib/classes/cron.d/100-monitor_openvz.inc.php b/server/lib/classes/cron.d/100-monitor_openvz.inc.php
index 30b51b4b5fb50242648f9b66be66c08d9a01ea6e..adc092ec95eb72d96b563202c5607f47c5f0ef64 100644
--- a/server/lib/classes/cron.d/100-monitor_openvz.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_openvz.inc.php
@@ -69,7 +69,7 @@ class cronjob_monitor_openvz extends cronjob {
/*
Fetch the data into a array
*/
- $app->load(openvz_tools);
+ $app->load('openvz_tools');
$openVzTools = new openvz_tools();
$data = $openVzTools->getOpenVzVeInfo();
@@ -98,7 +98,7 @@ class cronjob_monitor_openvz extends cronjob {
/*
Fetch the data into a array
*/
- $app->load(openvz_tools);
+ $app->load('openvz_tools');
$openVzTools = new openvz_tools();
$data = $openVzTools->getOpenVzVeBeanCounter();
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 bc4f521073ff3d3813ad286af70c16945121fe09..f2faeeb551b3ed93c068f2ecf9119c1817cfc355 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
@@ -70,8 +70,8 @@ class cronjob_monitor_system_update extends cronjob {
$type = 'system_update';
- /* This monitoring is only available on Debian or Ubuntu */
- if (file_exists('/etc/debian_version')) {
+ /* This monitoring is only available on Debian, Devuan or Ubuntu */
+ if (file_exists('/etc/debian_version') || file_exists('/etc/devuan_version')) {
/*
* first update the "apt database"
@@ -159,6 +159,18 @@ class cronjob_monitor_system_update extends cronjob {
* Fetch the output
*/
$data['output'] = shell_exec('zypper lu');
+ } else if (file_exists('/etc/redhat-release')) {
+
+ if(shell_exec("yum list updates | awk 'p; /Updated Packages/ {p=1}'") == '') {
+ // There is nothing to update
+ $state = 'ok';
+ }
+ else {
+ $state = 'info';
+ }
+ // Fetch the output
+ $yumData = shell_exec('yum check-update');
+ $data['output'] = $yumData;
} else {
/*
* It is not Debian/Ubuntu, so there is no data and no state
diff --git a/server/lib/classes/cron.inc.php b/server/lib/classes/cron.inc.php
index 48ca09373901eb3c1cfaf977bdfcf1248531db64..3a8ba2c6a63fd5010d87007b84e2d26bf52e5494 100644
--- a/server/lib/classes/cron.inc.php
+++ b/server/lib/classes/cron.inc.php
@@ -264,9 +264,10 @@ class cron {
if(!array_key_exists($sField, $this->_aValidValues)) return false;
reset($this->_aValidValues[$sField]);
- while(($cur = each($this->_aValidValues[$sField])) !== false) {
- if($bIncludeCurrent == true && $cur['value'] >= $iValue) return $cur['value'];
- elseif($cur['value'] > $iValue) return $cur['value'];
+
+ foreach($this->_aValidValues[$sField] as $key => $value) {
+ if($bIncludeCurrent == true && $value >= $iValue) return $value;
+ elseif($value > $iValue) return $value;
}
return reset($this->_aValidValues[$sField]);
}
diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php
index 9b34dc4c1f3f4d3953fcd42ea8db9ec028dbee14..9a7968caea5ef3e004a7727c0b81ba1acc2c30eb 100644
--- a/server/lib/classes/db_mysql.inc.php
+++ b/server/lib/classes/db_mysql.inc.php
@@ -64,7 +64,7 @@ class db
*/
// constructor
- public function __construct($host = NULL , $user = NULL, $pass = NULL, $database = NULL, $port = NULL) {
+ public function __construct($host = NULL , $user = NULL, $pass = NULL, $database = NULL, $port = NULL, $flags = NULL) {
global $app, $conf;
$this->dbHost = $host ? $host : $conf['db_host'];
@@ -74,15 +74,13 @@ class db
$this->dbPass = $pass ? $pass : $conf['db_password'];
$this->dbCharset = $conf['db_charset'];
$this->dbNewLink = $conf['db_new_link'];
- $this->dbClientFlags = $conf['db_client_flags'];
+ $this->dbClientFlags = $flags ? $flags : $conf['db_client_flags'];
+ $this->_iConnId = mysqli_init();
- $this->_iConnId = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort);
- $try = 0;
- while((!is_object($this->_iConnId) || mysqli_connect_error()) && $try < 5) {
- if($try > 0) sleep(1);
-
- $try++;
- $this->_iConnId = mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort);
+ mysqli_real_connect($this->_iConnId, $this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort, NULL, $this->dbClientFlags);
+ for($try=0;(!is_object($this->_iConnId) || mysqli_connect_error()) && $try < 5;++$try) {
+ sleep($try);
+ mysqli_real_connect($this->_iConnId, $this->dbHost, $this->dbUser, $this->dbPass, '', (int)$this->dbPort, NULL, $this->dbClientFlags);
}
if(!is_object($this->_iConnId) || mysqli_connect_error()) {
@@ -197,7 +195,7 @@ class db
$try++;
$ok = mysqli_ping($this->_iConnId);
if(!$ok) {
- if(!mysqli_connect($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName, (int)$this->dbPort)) {
+ if(!mysqli_real_connect(mysqli_init(), $this->dbHost, $this->dbUser, $this->dbPass, $this->dbName, (int)$this->dbPort, NULL, $this->dbClientFlags)) {
if($this->errorNumber == '111') {
// server is not available
if($try > 9) {
diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php
index 9f7580fee1e105bb752799c37592ddff073b7410..577fd4eb2bdb6d66026d3b482410e4f9fe6817b4 100644
--- a/server/lib/classes/monitor_tools.inc.php
+++ b/server/lib/classes/monitor_tools.inc.php
@@ -221,6 +221,21 @@ class monitor_tools {
}
}
+ //** Devuan
+ elseif(file_exists('/etc/devuan_version')) {
+ if(false !== strpos(trim(file_get_contents('/etc/devuan_version')), 'jessie')) {
+ $distname = 'Devuan';
+ $distver = 'Jessie';
+ $distid = 'debian60';
+ $distbaseid = 'debian';
+ } elseif(false !== strpos(trim(file_get_contents('/etc/devuan_version')), 'ceres')) {
+ $distname = 'Devuan';
+ $distver = 'Testing';
+ $distid = 'debiantesting';
+ $distbaseid = 'debian';
+ }
+ }
+
//** OpenSuSE
elseif(file_exists('/etc/SuSE-release')) {
if(stristr(file_get_contents('/etc/SuSE-release'), '11.0')) {
@@ -279,12 +294,12 @@ class monitor_tools {
$distbaseid = 'fedora';
} elseif(stristr($content, 'CentOS release 5')) {
$distname = 'CentOS';
- $distver = 'Unknown';
+ $distver = '5';
$distid = 'centos53';
$distbaseid = 'fedora';
} elseif(stristr($content, 'CentOS Linux release 6') || stristr($content, 'CentOS release 6')) {
$distname = 'CentOS';
- $distver = 'Unknown';
+ $distver = '6';
$distid = 'centos53';
$distbaseid = 'fedora';
} elseif(stristr($content, 'CentOS Linux release 7')) {
@@ -464,6 +479,8 @@ class monitor_tools {
if (@is_file('/etc/debian_version')) {
$dist = 'debian';
+ } elseif (@is_file('/etc/devuan_version')) {
+ $dist = 'devuan';
} elseif (@is_file('/etc/redhat-release')) {
$dist = 'redhat';
} elseif (@is_file('/etc/SuSE-release')) {
@@ -476,6 +493,8 @@ class monitor_tools {
case 'log_mail':
if ($dist == 'debian') {
$logfile = '/var/log/mail.log';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/mail.log';
} elseif ($dist == 'redhat') {
$logfile = '/var/log/maillog';
} elseif ($dist == 'suse') {
@@ -487,6 +506,8 @@ class monitor_tools {
case 'log_mail_warn':
if ($dist == 'debian') {
$logfile = '/var/log/mail.warn';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/mail.warn';
} elseif ($dist == 'redhat') {
$logfile = '/var/log/maillog';
} elseif ($dist == 'suse') {
@@ -498,6 +519,8 @@ class monitor_tools {
case 'log_mail_err':
if ($dist == 'debian') {
$logfile = '/var/log/mail.err';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/mail.err';
} elseif ($dist == 'redhat') {
$logfile = '/var/log/maillog';
} elseif ($dist == 'suse') {
@@ -509,6 +532,8 @@ class monitor_tools {
case 'log_messages':
if ($dist == 'debian') {
$logfile = '/var/log/syslog';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/syslog';
} elseif ($dist == 'redhat') {
$logfile = '/var/log/messages';
} elseif ($dist == 'suse') {
@@ -520,6 +545,8 @@ class monitor_tools {
case 'log_ispc_cron':
if ($dist == 'debian') {
$logfile = $conf['ispconfig_log_dir'] . '/cron.log';
+ } elseif ($dist == 'devuan') {
+ $logfile = $conf['ispconfig_log_dir'] . '/cron.log';
} elseif ($dist == 'redhat') {
$logfile = $conf['ispconfig_log_dir'] . '/cron.log';
} elseif ($dist == 'suse') {
@@ -531,6 +558,8 @@ class monitor_tools {
case 'log_freshclam':
if ($dist == 'debian') {
$logfile = '/var/log/clamav/freshclam.log';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/clamav/freshclam.log';
} elseif ($dist == 'redhat') {
$logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log');
} elseif ($dist == 'suse') {
@@ -542,6 +571,8 @@ class monitor_tools {
case 'log_clamav':
if ($dist == 'debian') {
$logfile = '/var/log/clamav/clamav.log';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/clamav/clamav.log';
} elseif ($dist == 'redhat') {
$logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog');
} elseif ($dist == 'suse') {
@@ -553,6 +584,8 @@ class monitor_tools {
case 'log_fail2ban':
if ($dist == 'debian') {
$logfile = '/var/log/fail2ban.log';
+ } elseif ($dist == 'devuan') {
+ $logfile = '/var/log/fail2ban.log';
} elseif ($dist == 'redhat') {
$logfile = '/var/log/fail2ban.log';
} elseif ($dist == 'suse') {
@@ -567,6 +600,8 @@ class monitor_tools {
case 'log_ispconfig':
if ($dist == 'debian') {
$logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log';
+ } elseif ($dist == 'devuan') {
+ $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log';
} elseif ($dist == 'redhat') {
$logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log';
} elseif ($dist == 'suse') {
diff --git a/server/mods-available/dns_module.inc.php b/server/mods-available/dns_module.inc.php
index d3c13031c0829e3899fc4cf3f7c973483a4af263..2983a06755a0514edfa71d7c244b22a6e142a36f 100644
--- a/server/mods-available/dns_module.inc.php
+++ b/server/mods-available/dns_module.inc.php
@@ -126,6 +126,10 @@ class dns_module {
$daemon = '';
if(is_file($conf['init_scripts'] . '/' . 'bind9')) {
$daemon = 'bind9';
+ }elseif(is_file($conf['init_scripts'] . '/' . 'named-chroot')) {
+ $daemon = 'named-chroot';
+ }elseif(is_file('/usr/lib/systemd/system/named-chroot.service')) {
+ $daemon = 'named-chroot';
} else {
$daemon = 'named';
}
diff --git a/server/mods-available/mail_module.inc.php b/server/mods-available/mail_module.inc.php
index bc6d2901457169db191ef871c8acbabff74c03a1..8460d5d96a6f1a7b58cdee2837840f72378e5038 100644
--- a/server/mods-available/mail_module.inc.php
+++ b/server/mods-available/mail_module.inc.php
@@ -55,7 +55,10 @@ class mail_module {
'mail_content_filter_delete',
'mail_mailinglist_insert',
'mail_mailinglist_update',
- 'mail_mailinglist_delete');
+ 'mail_mailinglist_delete',
+ 'mail_ml_member_insert',
+ 'mail_ml_member_update',
+ 'mail_ml_member_delete');
//* This function is called during ispconfig installation to determine
// if a symlink shall be created for this plugin.
@@ -102,6 +105,7 @@ class mail_module {
$app->modules->registerTableHook('mail_get', 'mail_module', 'process');
$app->modules->registerTableHook('mail_content_filter', 'mail_module', 'process');
$app->modules->registerTableHook('mail_mailinglist', 'mail_module', 'process');
+ $app->modules->registerTableHook('mail_ml_membership', 'mail_module', 'process');
}
@@ -154,6 +158,11 @@ class mail_module {
if($action == 'u') $app->plugins->raiseEvent('mail_mailinglist_update', $data);
if($action == 'd') $app->plugins->raiseEvent('mail_mailinglist_delete', $data);
break;
+ case 'mail_ml_membership':
+ if($action == 'i') $app->plugins->raiseEvent('mail_ml_member_insert', $data);
+ if($action == 'u') $app->plugins->raiseEvent('mail_ml_member_update', $data);
+ if($action == 'd') $app->plugins->raiseEvent('mail_ml_member_delete', $data);
+ break;
} // end switch
} // end function
diff --git a/server/mods-available/remoteaction_core_module.inc.php b/server/mods-available/remoteaction_core_module.inc.php
index 807de5060ab28bfbee5257760b812e60ba65a655..15e9d279e9e4952a405e937859a60add020afe3e 100644
--- a/server/mods-available/remoteaction_core_module.inc.php
+++ b/server/mods-available/remoteaction_core_module.inc.php
@@ -172,16 +172,17 @@ class remoteaction_core_module {
/*
* Do the update
*/
- exec("aptitude update");
- exec("aptitude safe-upgrade -y");
+ //Guess this is not wanted here?
+ //exec("aptitude update");
+ //exec("aptitude safe-upgrade -y");
//TODO : change this when distribution information has been integrated into server record
if(file_exists('/etc/gentoo-release')) {
exec("glsa-check -f --nocolor affected");
}
else {
- exec("aptitude update");
- exec("aptitude safe-upgrade -y");
+ exec("apt-get update");
+ exec("apt-get -y upgrade");
}
/*
diff --git a/server/mods-available/web_module.inc.php b/server/mods-available/web_module.inc.php
index aecec10579e37e1b4160dc2ac57d924f12936f49..e085c28a947804a22ad3e0c0b97fd6ecf41c3017 100644
--- a/server/mods-available/web_module.inc.php
+++ b/server/mods-available/web_module.inc.php
@@ -203,7 +203,9 @@ class web_module {
$daemon = $web_config['server_type'];
break;
default:
- if(is_file($conf['init_scripts'] . '/' . 'httpd') || is_dir('/etc/httpd')) {
+ if(is_file($conf['init_scripts'] . '/' . 'httpd24-httpd') || is_dir('/opt/rh/httpd24/root/etc/httpd')) {
+ $daemon = 'httpd24-httpd';
+ } elseif(is_file($conf['init_scripts'] . '/' . 'httpd') || is_dir('/etc/httpd')) {
$daemon = 'httpd';
} else {
$daemon = 'apache2';
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 1a802bcf96dd8078f62c7df8032dd5dc49e3da90..e7718b0c1c855e060f9cbe7dc2818b61f6632b4f 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -643,7 +643,7 @@ class apache2_plugin {
//* Unmount the old log directory bfore we move the log dir
//exec('fuser -km '.escapeshellcmd($old_dir.'/log'));
- exec('umount '.escapeshellcmd($data['old']['document_root'].'/log'));
+ exec('umount -l '.escapeshellcmd($data['old']['document_root'].'/log'));
//* Create new base directory, if it does not exist yet
if(!is_dir($new_dir)) $app->system->mkdirpath($new_dir);
@@ -733,7 +733,7 @@ class apache2_plugin {
//* Unmount log directory
//exec('fuser -km '.escapeshellarg($data['old']['document_root'].'/'.$old_log_folder));
- exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$old_log_folder));
+ exec('umount -l '.escapeshellarg($data['old']['document_root'].'/'.$old_log_folder));
}
//* Create the log dir if nescessary and mount it
@@ -1173,6 +1173,7 @@ class apache2_plugin {
|| ($data['old']['subdomain'] != $data['new']['subdomain']) // we have new or update on "auto" subdomain
|| $this->update_letsencrypt == true
)) {
+
$success = $app->letsencrypt->request_certificates($data);
if($success) {
/* we don't need to store it.
@@ -1189,7 +1190,7 @@ class apache2_plugin {
$app->db->query("UPDATE web_domain SET `ssl` = ?, `ssl_letsencrypt` = ? WHERE `domain` = ?", $data['new']['ssl'], 'n', $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
$app->dbmaster->query("UPDATE web_domain SET `ssl` = ?, `ssl_letsencrypt` = ? WHERE `domain` = ?", $data['new']['ssl'], 'n', $data['new']['domain']);
- }
+ }
}
if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1;
@@ -1211,6 +1212,7 @@ class apache2_plugin {
$tpl->setVar($vhost_data);
$tpl->setVar('apache_version', $app->system->getapacheversion());
+ $tpl->setVar('apache_full_version', $app->system->getapacheversion(true));
// Rewrite rules
$rewrite_rules = array();
@@ -1276,7 +1278,7 @@ class apache2_plugin {
unset($client);
unset($aa_search);
unset($aa_replace);
- $server_alias[] .= $auto_alias.' ';
+ $server_alias[] .= $auto_alias;
}
// get alias domains (co-domains and subdomains)
@@ -1284,23 +1286,23 @@ class apache2_plugin {
$alias_seo_redirects = array();
switch($data['new']['subdomain']) {
case 'www':
- $server_alias[] = 'www.'.$data['new']['domain'].' ';
+ $server_alias[] = 'www.'.$data['new']['domain'];
break;
case '*':
- $server_alias[] = '*.'.$data['new']['domain'].' ';
+ $server_alias[] = '*.'.$data['new']['domain'];
break;
}
if(is_array($aliases)) {
foreach($aliases as $alias) {
switch($alias['subdomain']) {
case 'www':
- $server_alias[] .= 'www.'.$alias['domain'].' '.$alias['domain'].' ';
+ $server_alias[] .= 'www.'.$alias['domain'].' '.$alias['domain'];
break;
case '*':
- $server_alias[] .= '*.'.$alias['domain'].' '.$alias['domain'].' ';
+ $server_alias[] .= '*.'.$alias['domain'].' '.$alias['domain'];
break;
default:
- $server_alias[] .= $alias['domain'].' ';
+ $server_alias[] .= $alias['domain'];
break;
}
$app->log('Add server alias: '.$alias['domain'], LOGLEVEL_DEBUG);
@@ -1367,22 +1369,18 @@ class apache2_plugin {
}
//* If we have some alias records
- if(count($server_alias) > 0) {
- $server_alias_str = '';
- $n = 0;
-
- // begin a new ServerAlias line after 30 alias domains
- foreach($server_alias as $tmp_alias) {
- if($n % 30 == 0) $server_alias_str .= "\n ServerAlias ";
- $server_alias_str .= $tmp_alias;
- }
- unset($tmp_alias);
-
- $tpl->setVar('alias', trim($server_alias_str));
+ if($server_alias) {
+ //* begin a new ServerAlias line after 32 alias domains to avoid apache bugs
+ $server_alias_str = 'ServerAlias '.$server_alias[0];
+ for($n=1;$nsetVar('alias', $server_alias_str);
+ unset($server_alias_str);
+ unset($n);
} else {
$tpl->setVar('alias', '');
}
-
+
if (count($rewrite_wildcard_rules) > 0) $rewrite_rules = array_merge($rewrite_rules, $rewrite_wildcard_rules); // Append wildcard rules to the end of rules
if(count($rewrite_rules) > 0 || $vhost_data['seo_redirect_enabled'] > 0 || count($alias_seo_redirects) > 0 || $data['new']['rewrite_to_https'] == 'y') {
@@ -1422,6 +1420,7 @@ class apache2_plugin {
$fcgi_tpl = new tpl();
$fcgi_tpl->newTemplate('php-fcgi-starter.master');
$fcgi_tpl->setVar('apache_version', $app->system->getapacheversion());
+ $fcgi_tpl->setVar('apache_full_version', $app->system->getapacheversion(true));
// Support for multiple PHP versions (FastCGI)
if(trim($data['new']['fastcgi_php_version']) != ''){
@@ -1561,6 +1560,7 @@ class apache2_plugin {
$cgi_tpl = new tpl();
$cgi_tpl->newTemplate('php-cgi-starter.master');
$cgi_tpl->setVar('apache_version', $app->system->getapacheversion());
+ $cgi_tpl->setVar('apache_full_version', $app->system->getapacheversion(true));
// This works because PHP "rewrites" a symlink to the physical path
$php_open_basedir = ($data['new']['php_open_basedir'] == '')?$data['new']['document_root']:$data['new']['php_open_basedir'];
@@ -1792,33 +1792,9 @@ class apache2_plugin {
} else {
// if no output is given, check again
$webserver_binary = '';
- exec('which apache2ctl', $webserver_check_output, $webserver_check_retval);
+ exec('which apache2ctl apache2 httpd2 httpd apache 2>/dev/null', $webserver_check_output, $webserver_check_retval);
if($webserver_check_retval == 0){
- $webserver_binary = 'apache2ctl';
- } else {
- unset($webserver_check_output, $webserver_check_retval);
- exec('which apache2', $webserver_check_output, $webserver_check_retval);
- if($webserver_check_retval == 0){
- $webserver_binary = 'apache2';
- } else {
- unset($webserver_check_output, $webserver_check_retval);
- exec('which httpd2', $webserver_check_output, $webserver_check_retval);
- if($webserver_check_retval == 0){
- $webserver_binary = 'httpd2';
- } else {
- unset($webserver_check_output, $webserver_check_retval);
- exec('which httpd', $webserver_check_output, $webserver_check_retval);
- if($webserver_check_retval == 0){
- $webserver_binary = 'httpd';
- } else {
- unset($webserver_check_output, $webserver_check_retval);
- exec('which apache', $webserver_check_output, $webserver_check_retval);
- if($webserver_check_retval == 0){
- $webserver_binary = 'apache';
- }
- }
- }
- }
+ $webserver_binary = reset($webserver_check_output);
}
if($webserver_binary != ''){
exec($webserver_binary.' -t 2>&1', $tmp_output, $tmp_retval);
@@ -1962,12 +1938,12 @@ class apache2_plugin {
foreach($log_folders as $log_folder){
//if($app->system->is_mounted($data['old']['document_root'].'/'.$log_folder)) exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
//exec('fuser -km '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
- exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
+ exec('umount -l '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
}
} else {
//if($app->system->is_mounted($data['old']['document_root'].'/'.$log_folder)) exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
//exec('fuser -km '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
- exec('umount '.escapeshellarg($data['old']['document_root'].'/'.$log_folder).' 2>/dev/null');
+ exec('umount -l '.escapeshellarg($data['old']['document_root'].'/'.$log_folder));
}
// remove letsencrypt if it exists (renew will always fail otherwise)
@@ -2222,6 +2198,7 @@ class apache2_plugin {
$tpl = new tpl();
$tpl->newTemplate('apache_ispconfig.conf.master');
$tpl->setVar('apache_version', $app->system->getapacheversion());
+ $tpl->setVar('apache_full_version', $app->system->getapacheversion(true));
$records = $app->db->queryAllRecords("SELECT * FROM server_ip WHERE server_id = ? AND virtualhost = 'y'", $conf['server_id']);
$records_out= array();
@@ -2755,80 +2732,54 @@ class apache2_plugin {
$in = fopen($fileName, 'r');
$output = '';
$inWebdavSection = false;
-
- /*
- * read line by line and search for the username and authname
- */
+ //* read line by line and search for the username and authname
while ($line = fgets($in)) {
- /*
- * is the "replace-comment" found...
- */
+ //* is the "replace-comment" found...
if (trim($line) == '# WEBDAV BEGIN') {
- /*
- * The begin of the webdav - section is found, so ignore all lines til the end is found
- */
+ //* The begin of the webdav - section is found, so ignore all lines til the end is found
$inWebdavSection = true;
-
- $output .= " # WEBDAV BEGIN\n";
-
- /*
- * add all the webdav-dirs to the webdav-section
- */
+ $output .= "# WEBDAV BEGIN\n";
+ //* add all the webdav-dirs to the webdav-section
$files = @scandir($webdavRoot);
if(is_array($files)) {
foreach($files as $file) {
if (substr($file, strlen($file) - strlen('.htdigest')) == '.htdigest' && preg_match("/^[a-zA-Z0-9\-_\.]*$/", $file)) {
- /*
- * found a htdigest - file, so add it to webdav
- */
+ //* found a htdigest - file, so add it to webdav
$fn = substr($file, 0, strlen($file) - strlen('.htdigest'));
$output .= "\n";
- // $output .= " Alias /" . $fn . ' ' . $webdavRoot . '/' . $fn . "\n";
- // $output .= " \n";
- $output .= " Alias /webdav/" . $fn . ' ' . $webdavRoot . '/' . $fn . "\n";
- $output .= " \n";
- $output .= " DAV On\n";
- $output .= ' BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On'."\n";
- $output .= " AuthType Digest\n";
+ $output .= "Alias /webdav/$fn $webdavRoot/$fn\n";
+ $output .= "\n";
+ $output .= "DAV On\n";
+ $output .= "BrowserMatch MSIE AuthDigestEnableQueryStringHack=On\n";
+ $output .= "AuthType Digest\n";
if($fn != '' && $fn != '/') {
$output .= " AuthName \"" . $fn . "\"\n";
} else {
$output .= " AuthName \"Restricted Area\"\n";
}
- $output .= " AuthUserFile " . $webdavRoot . '/' . $file . "\n";
- $output .= " Require valid-user \n";
- $output .= " Options +Indexes \n";
- $output .= " Order allow,deny \n";
- $output .= " Allow from all \n";
- $output .= " \n";
+ $output .= "AuthUserFile $webdavRoot/$file\n";
+ $output .= "Require valid-user\n";
+ $output .= "Options +Indexes\n";
+ if($app->system->getapacheversion()<=2.2)
+ $output .= "Order allow,deny\nAllow from all\n";
+ $output .= "\n";
}
}
}
}
- /*
- * is the "replace-comment-end" found...
- */
+ //* is the "replace-comment-end" found...
if (trim($line) == '# WEBDAV END') {
- /*
- * The end of the webdav - section is found, so stop ignoring
- */
+ //* The end of the webdav - section is found, so stop ignoring
$inWebdavSection = false;
}
-
- /*
- * Write the line to the output, if it is not in the section
- */
+ //* Write the line to the output, if it is not in the section
if (!$inWebdavSection) {
$output .= $line;
}
}
fclose($in);
-
- /*
- * Now lets write the new file
- */
+ //* Now lets write the new file
$app->system->file_put_contents($fileName, $output);
-
}
//* Update the awstats configuration file
@@ -3009,6 +2960,7 @@ class apache2_plugin {
$tpl = new tpl();
$tpl->newTemplate('php_fpm_pool.conf.master');
$tpl->setVar('apache_version', $app->system->getapacheversion());
+ $tpl->setVar('apache_full_version', $app->system->getapacheversion(true));
if($data['new']['php_fpm_use_socket'] == 'y'){
$use_tcp = 0;
@@ -3279,37 +3231,35 @@ class apache2_plugin {
if(substr($web['domain'], 0, 2) === '*.') $web['subdomain'] = '*';
if($web['subdomain'] == 'www' || $web['subdomain'] == '*'){
+ $domain = str_replace('.', '\.', $web['domain']);
if($web['seo_redirect'] == 'non_www_to_www'){
- $seo_redirects[$prefix.'seo_redirect_origin_domain'] = str_replace('.', '\.', $web['domain']);
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = $domain;
$seo_redirects[$prefix.'seo_redirect_target_domain'] = 'www.'.$web['domain'];
$seo_redirects[$prefix.'seo_redirect_operator'] = '';
}
if($web['seo_redirect'] == '*_domain_tld_to_www_domain_tld'){
- // ^(example\.com|(?!\bwww\b)\.example\.com)$
- // ^(example\.com|((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.example\.com))$
- $seo_redirects[$prefix.'seo_redirect_origin_domain'] = '('.str_replace('.', '\.', $web['domain']).'|((?:\w+(?:-\w+)*\.)*)((?!www\.)\w+(?:-\w+)*)(\.'.str_replace('.', '\.', $web['domain']).'))';
+ $seo_redirects[$prefix.'seo_redirect_origin_domain'] = $domain.'|.*\.'.$domain.'(?
-
+?>
\ No newline at end of file
diff --git a/server/plugins-available/bind_plugin.inc.php b/server/plugins-available/bind_plugin.inc.php
index 23856f0c8661f3317f4beaa91f2fb20c92ac93c2..edf7b93d9f1ea62f8b314a62b73c77f15e5ca678 100644
--- a/server/plugins-available/bind_plugin.inc.php
+++ b/server/plugins-available/bind_plugin.inc.php
@@ -236,6 +236,17 @@ class bind_plugin {
//* load the server configuration options
$dns_config = $app->getconf->get_server_config($conf["server_id"], 'dns');
+ //* Get the bind version
+ $bind_caa = false;
+ $bind = explode("\n", shell_exec('which named bind'));
+ $bind = reset($bind);
+ if(is_executable($bind)) {
+ exec($bind . ' -v 2>&1', $tmp);
+ $bind_caa = @(version_compare($tmp[0],"BIND 9.9.6", '>='))?true:false;
+ unset($tmp);
+ }
+ unset($bind);
+
//* Write the domain file
if(!empty($data['new']['id'])) {
$tpl = new tpl();
@@ -253,6 +264,19 @@ class bind_plugin {
if($records[$i]['type'] == 'TXT' && strlen($records[$i]['data']) > 255) {
$records[$i]['data'] = implode('" "',str_split( $records[$i]['data'], 255));
}
+ //* CAA-Records - Type257 for older bind-versions
+ if($records[$i]['type'] == 'CAA' && !$bind_caa) {
+ $records[$i]['type'] = 'TYPE257';
+ $temp = explode(' ', $records[$i]['data']);
+ unset($temp[0]);
+ $records[$i]['data'] = implode(' ', $temp);
+ $data_new = str_replace(array('"', ' '), '', $records[$i]['data']);
+ $hex = unpack('H*', $data_new);
+ $hex[1] = '0005'.strtoupper($hex[1]);
+ $length = strlen($hex[1])/2;
+ $data_new = "\# $length $hex[1]";
+ $records[$i]['data'] = $data_new;
+ }
}
}
$tpl->setLoop('zones', $records);
diff --git a/server/plugins-available/firewall_plugin.inc.php b/server/plugins-available/firewall_plugin.inc.php
index 67ed2379fbbe554b595efceef048c761cbff2667..a12292495190c9ec1d8fe1f4c94d40216e18e188 100644
--- a/server/plugins-available/firewall_plugin.inc.php
+++ b/server/plugins-available/firewall_plugin.inc.php
@@ -205,7 +205,7 @@ class firewall_plugin {
} else {
//* Ensure that bastille firewall is stopped
exec($conf['init_scripts'] . '/' . 'bastille-firewall stop 2>/dev/null');
- if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove');
+ if(@is_file('/etc/debian_version') || @is_file('/etc/devuan_version')) exec('update-rc.d -f bastille-firewall remove');
//* Start ufw firewall
exec('ufw --force enable');
@@ -258,12 +258,12 @@ class firewall_plugin {
exec('ufw disable');
}
exec($conf['init_scripts'] . '/' . 'bastille-firewall restart 2>/dev/null');
- if(@is_file('/etc/debian_version')) exec('update-rc.d bastille-firewall defaults');
+ if(@is_file('/etc/debian_version') || @is_file('/etc/devuan_version')) exec('update-rc.d bastille-firewall defaults');
if(@is_file('/sbin/insserv')) exec('insserv -d bastille-firewall');
$app->log('Restarting the firewall', LOGLEVEL_DEBUG);
} else {
exec($conf['init_scripts'] . '/' . 'bastille-firewall stop 2>/dev/null');
- if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove');
+ if(@is_file('/etc/debian_version') || @is_file('/etc/devuan_version')) exec('update-rc.d -f bastille-firewall remove');
if(@is_file('/sbin/insserv')) exec('insserv -r -f bastille-firewall');
$app->log('Stopping the firewall', LOGLEVEL_DEBUG);
}
@@ -275,7 +275,7 @@ class firewall_plugin {
global $app, $conf;
exec($conf['init_scripts'] . '/' . 'bastille-firewall stop 2>/dev/null');
- if(@is_file('/etc/debian_version')) exec('update-rc.d -f bastille-firewall remove');
+ if(@is_file('/etc/debian_version') || @is_file('/etc/devuan_version')) exec('update-rc.d -f bastille-firewall remove');
if(@is_file('/sbin/insserv')) exec('insserv -r -f bastille-firewall');
$app->log('Stopping the firewall', LOGLEVEL_DEBUG);
diff --git a/server/plugins-available/mail_plugin.inc.php b/server/plugins-available/mail_plugin.inc.php
index 8275696620fbe1612aa78c816f9a9deaf1f11c7d..17f48efe26cfc1d16cd27082f352289b8e5b4182 100644
--- a/server/plugins-available/mail_plugin.inc.php
+++ b/server/plugins-available/mail_plugin.inc.php
@@ -213,11 +213,11 @@ class mail_plugin {
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_'.$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'].'.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')) {
diff --git a/server/plugins-available/mail_plugin_dkim.inc.php b/server/plugins-available/mail_plugin_dkim.inc.php
index 6f042e9070c0a53be51d99e7f7029a3558e5e332..26de6ca4af3b8aebc832d9ee8476b7fd363a1be5 100755
--- a/server/plugins-available/mail_plugin_dkim.inc.php
+++ b/server/plugins-available/mail_plugin_dkim.inc.php
@@ -196,8 +196,21 @@ class mail_plugin_dkim {
$public_key='';
foreach($pubkey as $values) $public_key=$public_key.$values."\n";
/* save the DKIM Public-key in dkim-dir */
- if ( $app->system->file_put_contents($key_file.'.public', $public_key) )
+ if ( $app->system->file_put_contents($key_file.'.public', $public_key) ) {
$app->log('Saved DKIM Public to '.$key_domain.'.', LOGLEVEL_DEBUG);
+ if($app->system->is_user('amavis')) {
+ $amavis_user='amavis';
+ } elseif ($app->system->is_user('vscan')) {
+ $amavis_user='vscan';
+ }
+ else {
+ $amavis_user='';
+ }
+ if($amavis_user!='') {
+ $app->system->chown($key_file.'.private', $amavis_user);
+ $app->system->chmod($key_file.'.private', 0440);
+ }
+ }
else $app->log('Unable to save DKIM Public to '.$key_domain.'.', LOGLEVEL_DEBUG);
} else {
$app->log('Unable to save DKIM Private-key to '.$key_file.'.private', LOGLEVEL_ERROR);
diff --git a/server/plugins-available/mlmmj_plugin.inc.php b/server/plugins-available/mlmmj_plugin.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f1130e01c7455cbf9957ed68060109f2550326d
--- /dev/null
+++ b/server/plugins-available/mlmmj_plugin.inc.php
@@ -0,0 +1,406 @@
+ 10100 Srl
+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.
+*/
+
+/*
+templates/mail_mailinglist_list.htm
+templates/mail_mailinglist_edit.htm
+
+list/mail_mailinglist.list.php
+
+form/mail_mailinglist.tform.php
+
+mailinglist.php
+mail_mailinglist_list.php
+mail_mailinglist_edit.php
+mail_mailinglist_del.php
+*/
+
+class mlmmj_plugin {
+ const ML_ALIAS = 0;
+ const ML_TRANSPORT = 1;
+ const ML_VIRTUAL = 2;
+ const SECONDS_IN_DAY = 86400;
+
+ private $plugin_name = 'mlmmj_plugin';
+ private $class_name = 'mlmmj_plugin';
+ private $mlmmj_config_dir = '/etc/mlmmj/';
+
+ /*
+ This function is called during ispconfig installation to determine
+ if a symlink shall be created for this plugin.
+ */
+ function onInstall() {
+ global $conf;
+
+ if($conf['services']['mail'] == true) return true;
+ else return false;
+ }
+
+ //This function is called when the plugin is loaded
+ function onLoad() {
+ global $app;
+
+ // Register for the events
+ $app->plugins->registerEvent('mail_mailinglist_insert', $this->plugin_name, 'list_insert');
+ $app->plugins->registerEvent('mail_mailinglist_update', $this->plugin_name, 'list_update');
+ $app->plugins->registerEvent('mail_mailinglist_delete', $this->plugin_name, 'list_delete');
+
+ $app->plugins->registerEvent('mail_ml_member_insert', $this->plugin_name, 'member_insert');
+ $app->plugins->registerEvent('mail_ml_member_update', $this->plugin_name, 'member_update');
+ $app->plugins->registerEvent('mail_ml_member_delete', $this->plugin_name, 'member_delete');
+
+ }
+
+ function list_insert($event_name, $data) {
+ global $app, $conf;
+
+ $mlManager = $app->getconf->get_server_config($conf['server_id'], 'mail')['mailinglist_manager'];
+
+ if($mlManager == 'mlmmj') {
+ $mlConf = $this->getMlConfig();
+ $rec = $data['new'];
+ $listDomain = $rec['domain'];
+ $listName = $rec['listname'];
+ $listDir = $mlConf['spool_dir']."/$listDomain/$listName";
+ $lang = 'en';
+ $owner = $rec['email'];
+
+ // Creating ML directories structure
+ mkdir("$listDir/incoming", 0755, true);
+ mkdir("$listDir/queue/discarded", 0755, true);
+ mkdir("$listDir/archive", 0755, true);
+ mkdir("$listDir/text", 0755, true);
+ mkdir("$listDir/subconf", 0755, true);
+ mkdir("$listDir/unsubconf", 0755, true);
+ mkdir("$listDir/bounce", 0755, true);
+ mkdir("$listDir/control", 0755, true);
+ mkdir("$listDir/moderation", 0755, true);
+ mkdir("$listDir/subscribers.d", 0755, true);
+ mkdir("$listDir/digesters.d", 0755, true);
+ mkdir("$listDir/requeue", 0755, true);
+ mkdir("$listDir/nomailsubs.d", 0755, true);
+
+ // Creating ML index file
+ touch("$listDir/index");
+
+ // Creating default control files
+ // WARNING: Edit this section if default DB values will be modified!
+ touch("$listDir/control/nodigestsub");
+ touch("$listDir/control/noarchive");
+ file_put_contents("$listDir/control/owner", $owner);
+ file_put_contents("$listDir/control/listaddress", "$listName@$listDomain");
+ file_put_contents("$listDir/control/prefix", "[$listName]");
+
+ // Copying language translations
+ if(!is_dir("/usr/share/mlmmj/text.skel/$lang")) $lang = 'en';
+ foreach (glob("/usr/share/mlmmj/text.skel/$lang/*") as $filename)
+ copy($filename, "$listDir/text/".basename($filename));
+
+ // The mailinglist directory have to be owned by the user running the mailserver
+ $this->changeOwnership($listDir);
+
+ // Creating alias entry
+ $this->addMapEntry("$listName: \"|/usr/bin/mlmmj-recieve -L $listDir/\"", self::ML_ALIAS);
+
+ // Creating transport entry
+ $this->addMapEntry("$listDomain--$listName@localhost.mlmmj mlmmj:$listDomain/$listName", self::ML_TRANSPORT);
+
+ // Creating virtual entry
+ $this->addMapEntry("$listName@$listDomain $listDomain--$listName@localhost.mlmmj", self::ML_VIRTUAL);
+ }
+ }
+
+ // The purpose of this plugin is to rewrite the main.cf file
+ function list_update($event_name, $data) {
+ global $app, $conf;
+
+ $mlManager = $app->getconf->get_server_config($conf['server_id'], 'mail')['mailinglist_manager'];
+
+ if($mlManager == 'mlmmj') {
+ $rec = $data['new'];
+ $mlConf = $this->getMlConfig();
+
+ $controlDir = "{$mlConf['spool_dir']}/{$rec['domain']}/{$rec['listname']}/control";
+
+ // Doesn't matter if the list is open or close, members can ALWAYS unsubscribe
+ if($rec['list_type'] == 'open') {
+ switch($rec['subscribe_policy']) {
+ case 'disabled':
+ touch("$controlDir/closedlistsub");
+ @unlink("$controlDir/submod");
+ @unlink("$controlDir/nosubconfirm");
+ break;
+ case 'both':
+ touch("$controlDir/submod");
+ case 'approval':
+ touch("$controlDir/nosubconfirm");
+ @unlink("$controlDir/closedlistsub");
+ break;
+ case 'none':
+ touch("$controlDir/nosubconfirm");
+ @unlink("$controlDir/closedlistsub");
+ break;
+ case 'confirm':
+ @unlink("$controlDir/nosubconfirm");
+ @unlink("$controlDir/closedlistsub");
+ @unlink("$controlDir/submod");
+ break;
+ }
+
+ switch($rec['posting_policy']) {
+ case 'closed':
+ touch("$controlDir/subonlypost");
+ break;
+ case 'moderated':
+ touch("$controlDir/modnonsubposts");
+ break;
+ case 'free':
+ @unlink("$controlDir/modnonsubposts");
+ @unlink("$controlDir/subonlypost");
+ break;
+ }
+ } elseif($rec['list_type'] == 'closed') {
+ touch("$controlDir/closedlistsub");
+ touch("$controlDir/subonlypost");
+ @unlink("$controlDir/modnonsubposts");
+ @unlink("$controlDir/submod");
+ @unlink("$controlDir/nosubconfirm");
+ }
+
+ if($rec['digestsub'] == 'y') {
+ @unlink("$controlDir/nodigestsub");
+ if($rec['digesttext'] == 'y') @unlink("$controlDir/nodigesttext");
+ else touch("$controlDir/nodigesttext");
+ file_put_contents("$controlDir/digestinterval", $rec['digestinterval']*self::SECONDS_IN_DAY);
+ file_put_contents("$controlDir/digestmaxmails", $rec['digestmaxmails']);
+ } else {
+ touch("$controlDir/nodigestsub");
+ @unlink("$controlDir/nodigesttext");
+ @unlink("$controlDir/digestinterval");
+ @unlink("$controlDir/digestmaxmails");
+ }
+
+ if($rec['subject_prefix'])
+ file_put_contents("$controlDir/prefix", $rec['subject_prefix']);
+ else @unlink("$controlDir/prefix");
+
+ if($rec['mail_footer'])
+ file_put_contents("$controlDir/footer", $rec['mail_footer']);
+ else @unlink("$controlDir/footer");
+
+ if($rec['archive'] == 'y')
+ @unlink("$controlDir/noarchive");
+ else
+ touch("$controlDir/noarchive");
+
+ $this->changeOwnership("$controlDir/*");
+ }
+ }
+
+ function list_delete($event_name, $data) {
+ global $app, $conf;
+
+ $mlManager = $app->getconf->get_server_config($conf['server_id'], 'mail')['mailinglist_manager'];
+
+ if($mlManager == 'mlmmj') {
+ $mlConf = $this->getMlConfig();
+ $rec = $data['old'];
+ $listDomain = $rec['domain'];
+ $listName = $rec['listname'];
+ $listDir = $mlConf['spool_dir']."/$listDomain/$listName";
+
+ // Remove ML directory structure
+ $this->rmdirR($listDir);
+ @rmdir($mlConf['spool_dir']."/$listDomain");
+
+ // Removing alias entry
+ $this->delMapEntry("$listName: \"|/usr/bin/mlmmj-recieve -L $listDir/\"", self::ML_ALIAS);
+
+ // Removing transport entry
+ $this->delMapEntry("$listDomain--$listName@localhost.mlmmj mlmmj:$listDomain/$listName", self::ML_TRANSPORT);
+
+ // Removing virtual entry
+ $this->delMapEntry("$listName@$listDomain $listDomain--$listName@localhost.mlmmj", self::ML_VIRTUAL);
+ }
+ }
+
+ function member_insert($event_name, $data) {
+ global $app, $conf;
+
+ $mlManager = $app->getconf->get_server_config($conf['server_id'], 'mail')['mailinglist_manager'];
+
+ if($mlManager == 'mlmmj') {
+ $mlConf = $this->getMlConfig();
+
+ $rec = $data['new'];
+
+ $sql = "SELECT * FROM mail_mailinglist WHERE mailinglist_id = ?";
+ $ml = $app->db->queryOneRecord($sql, $rec['mailinglist_id']);
+ if($ml['mailinglist_id']) {
+ $listDomain = $ml['domain'];
+ $listName = $ml['listname'];
+ $listDir = $mlConf['spool_dir']."/$listDomain/$listName";
+ }
+
+ $welcome = ($rec['welcome_msg'] == 'y')?'-c':'';
+ $command = "/usr/bin/mlmmj-sub -q -s -L $listDir $welcome -a ".$rec['email'];
+ exec("nohup $command>/dev/null 2>&1");
+ }
+ }
+
+ function member_update($event_name, $data) {
+ //TODO: Implement something usefull on update event (e.g. change to digest subscription)
+ }
+
+ function member_delete($event_name, $data) {
+ global $app, $conf;
+
+ $mlManager = $app->getconf->get_server_config($conf['server_id'], 'mail')['mailinglist_manager'];
+
+ if($mlManager == 'mlmmj') {
+ $mlConf = $this->getMlConfig();
+
+ $rec = $data['old'];
+
+ $sql = "SELECT * FROM mail_mailinglist WHERE mailinglist_id = ?";
+ $ml = $app->db->queryOneRecord($sql, $rec['mailinglist_id']);
+ if($ml['mailinglist_id']) {
+ $listDomain = $ml['domain'];
+ $listName = $ml['listname'];
+ $listDir = $mlConf['spool_dir']."/$listDomain/$listName";
+ }
+
+ $goodbye = ($rec['goodbye_msg'] == 'y')?'-c':'';
+ $command = "/usr/bin/mlmmj-unsub -q -s -L $listDir $goodbye -a ".$rec['email'];
+ exec("nohup $command>/dev/null 2>&1");
+ }
+ }
+
+ private function getMlConfig() {
+ $mlConfig = @parse_ini_file($this->mlmmj_config_dir.'mlmmj.conf');
+
+ // Force PHP7 to use # to mark comments
+ if(PHP_MAJOR_VERSION >= 7 && is_array($mlConfig))
+ $mlConfig = array_filter($mlConfig, function($v){return(substr($v,0,1)!=='#');}, ARRAY_FILTER_USE_KEY);
+
+ return $mlConfig;
+ }
+
+ private function changeOwnership($path, $recursive=true) {
+ if(basename($path) == '*') $path = dirname($path);
+
+ if(is_dir($path)) {
+ if($objs = glob($path."/*")) {
+ foreach($objs as $obj) {
+ chown($obj, 'mlmmj');
+ chgrp($obj, 'mlmmj');
+ if(is_dir($obj) && $recursive) $this->changeOwnership($obj);
+ }
+ }
+ }
+
+ return chown($path, 'mlmmj') && chgrp($path, 'mlmmj');
+ }
+
+ private function rmdirR($path) {
+ if(is_dir($path) === true) {
+ $files = array_diff(scandir($path), array('.', '..'));
+ foreach($files as $file) $this->rmdirR(realpath($path) . '/' . $file);
+
+ return rmdir($path);
+ } elseif(is_file($path) === true) return unlink($path);
+
+ return false;
+ }
+
+ private function addMapEntry($directive, $type) {
+
+ $destFile = $this->mlmmj_config_dir;
+ switch($type) {
+ case self::ML_ALIAS:
+ $destFile .= 'aliases';
+ $command = 'postalias';
+ break;
+ case self::ML_TRANSPORT:
+ $destFile .= 'transport';
+ $command = 'postmap';
+ break;
+ case self::ML_VIRTUAL:
+ $destFile .= 'virtual';
+ $command = 'postmap';
+ break;
+ }
+
+ $lines = file($destFile, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
+ $lines[] = $directive;
+
+ file_put_contents($destFile, implode("\n", array_unique($lines)));
+ exec("nohup /usr/sbin/$command $destFile >/dev/null 2>&1 &");
+ }
+
+ private function delMapEntry($directive, $type) {
+
+ $destFile = $this->mlmmj_config_dir;
+ switch($type) {
+ case self::ML_ALIAS:
+ $destFile .= 'aliases';
+ $command = 'postalias';
+ break;
+ case self::ML_TRANSPORT:
+ $destFile .= 'transport';
+ $command = 'postmap';
+ break;
+ case self::ML_VIRTUAL:
+ $destFile .= 'virtual';
+ $command = 'postmap';
+ break;
+ }
+
+ $lines = file($destFile, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
+
+ foreach(array_keys($lines, $directive) as $key) unset($lines[$key]);
+
+ file_put_contents($destFile, implode("\n", array_unique($lines)));
+ exec("nohup /usr/sbin/$command $destFile >/dev/null 2>&1 &");
+ }
+
+ private function checkSys() {
+ if(!is_dir($this->mlmmj_config_dir)) mkdir($this->mlmmj_config_dir, 0755);
+ if(!file_exists($this->mlmmj_config_dir.'mlmmj.conf')) {
+ file_put_contents($this->mlmmj_config_dir.'mlmmj.conf', 'skel_dir = /usr/share/mlmmj/text.skel');
+ file_put_contents($this->mlmmj_config_dir.'mlmmj.conf', 'spool_dir = /var/spool/mlmmj', FILE_APPEND);
+ }
+ if(!file_exists($this->mlmmj_config_dir.'aliases')) touch($this->mlmmj_config_dir.'aliases');
+ if(!file_exists($this->mlmmj_config_dir.'transport')) touch($this->mlmmj_config_dir.'transport');
+ if(!file_exists($this->mlmmj_config_dir.'virtual')) touch($this->mlmmj_config_dir.'virtual');
+ }
+} // end class
+
+?>
diff --git a/server/plugins-available/network_settings_plugin.inc.php b/server/plugins-available/network_settings_plugin.inc.php
index 5ce6f934b810c64148b997690f57fc4263b41f9c..56a2512d4022bbc927a4d1f6ff0808620125cb55 100644
--- a/server/plugins-available/network_settings_plugin.inc.php
+++ b/server/plugins-available/network_settings_plugin.inc.php
@@ -86,7 +86,7 @@ class network_settings_plugin {
$server_config['ip_address'] != '0.0.0.0' &&
$server_config['gateway'] != '0.0.0.0') {
- if (is_file('/etc/debian_version'))
+ if (is_file('/etc/debian_version') || is_file('/etc/devuan_version'))
{
copy('/etc/network/interfaces', '/etc/network/interfaces~');
diff --git a/server/plugins-available/nginx_plugin.inc.php b/server/plugins-available/nginx_plugin.inc.php
index daf953e2650063799c2f52e6642ab9c90183c06e..477eeaace0d54f261b2ef5f3a31464fccb944556 100644
--- a/server/plugins-available/nginx_plugin.inc.php
+++ b/server/plugins-available/nginx_plugin.inc.php
@@ -1250,7 +1250,7 @@ class nginx_plugin {
/* we don't need to store it.
/* Update the DB of the (local) Server */
$app->db->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '', ssl_key = '' WHERE domain = ?", $data['new']['domain']);
- $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
+ $app->db->query("UPDATE web_domain SET ssl_action = '' WHERE domain_id = ?", $data['new']['domain']);
/* Update also the master-DB of the Server-Farm */
$app->dbmaster->query("UPDATE web_domain SET ssl_request = '', ssl_cert = '', ssl_key = '' WHERE domain = ?", $data['new']['domain']);
$app->dbmaster->query("UPDATE web_domain SET ssl_action = '' WHERE domain = ?", $data['new']['domain']);
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 0000000000000000000000000000000000000000..29710a72852376cf3bb0d4b34676f506787447ae
--- /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
+
+
+
+?>
diff --git a/server/plugins-available/software_update_plugin.inc.php b/server/plugins-available/software_update_plugin.inc.php
index 587bd4f09a610c3ec496e1fa1edffe1e17e76b94..3f6ae3d8d195fdb11b9636966a4eb80dce4d8053 100644
--- a/server/plugins-available/software_update_plugin.inc.php
+++ b/server/plugins-available/software_update_plugin.inc.php
@@ -278,10 +278,10 @@ class software_update_plugin {
global $app;
//** Debian and compatible Linux distributions
- if(file_exists('/etc/debian_version')) {
- exec("apt-get update");
- exec("apt-get upgrade -y");
- $app->log('Execeuted Debian / Ubuntu update', LOGLEVEL_DEBUG);
+ if(file_exists('/etc/debian_version') || file_exists('/etc/devuan_version')) {
+ exec("aptitude update");
+ exec("aptitude safe-upgrade -y");
+ $app->log('Execeuted Debian / Devuan / Ubuntu update', LOGLEVEL_DEBUG);
}
//** Gentoo Linux