From 984b941fec2fc38b8247c82b3c445d9a19fa8294 Mon Sep 17 00:00:00 2001 From: Michael Seevogel Date: Wed, 17 Jan 2018 16:24:32 +0100 Subject: [PATCH 01/23] by default megacli is generating a MegaSAS.log file which grows further with every cron execution. The logfile can be disabled by using -NoLog --- server/lib/classes/cron.d/100-monitor_raid.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/lib/classes/cron.d/100-monitor_raid.inc.php b/server/lib/classes/cron.d/100-monitor_raid.inc.php index 3349ffbf4..d1a9a5345 100644 --- a/server/lib/classes/cron.d/100-monitor_raid.inc.php +++ b/server/lib/classes/cron.d/100-monitor_raid.inc.php @@ -283,7 +283,7 @@ class cronjob_monitor_raid extends cronjob { if($retval === 0 || $retval64 === 0) { $binary=@($retval === 0)?'megacli':'megacli64'; $state = 'ok'; - $data['output'] = shell_exec($binary.' -LDInfo -Lall -aAll'); + $data['output'] = shell_exec($binary.' -LDInfo -Lall -aAll -NoLog'); if (strpos($data['output'], 'Optimal') !== false) { $this->_tools->_setState($state, 'ok'); } else if (strpos($data['output'], 'Degraded') !== false) { -- GitLab From 0dd73c60b80f81aff229efa16459b3571b012415 Mon Sep 17 00:00:00 2001 From: Anton Avramov Date: Fri, 26 Jan 2018 13:13:14 +0200 Subject: [PATCH 02/23] Fix #4934 When deleting client delete its cronjobs also --- interface/web/client/client_del.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/web/client/client_del.php b/interface/web/client/client_del.php index 8bef6e9d6..dfb4e7464 100644 --- a/interface/web/client/client_del.php +++ b/interface/web/client/client_del.php @@ -128,7 +128,7 @@ class page_action extends tform_actions { $app->db->query("DELETE FROM sys_user WHERE client_id = ?", $client_id); // Delete all records (sub-clients, mail, web, etc....) of this client. - $tables = 'client,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_folder,web_folder_user,domain,mail_mailinglist,spamfilter_wblist'; + $tables = 'cron,client,dns_rr,dns_soa,dns_slave,ftp_user,mail_access,mail_content_filter,mail_domain,mail_forwarding,mail_get,mail_user,mail_user_filter,shell_user,spamfilter_users,support_message,web_database,web_database_user,web_domain,web_folder,web_folder_user,domain,mail_mailinglist,spamfilter_wblist'; $tables_array = explode(',', $tables); $client_group_id = $app->functions->intval($client_group['groupid']); if($client_group_id > 1) { -- GitLab From e519302daf4c840ea70087a3653973c8b5159a4c Mon Sep 17 00:00:00 2001 From: Florian Schaal Date: Fri, 26 Jan 2018 13:50:07 +0100 Subject: [PATCH 03/23] fixed interface/lib/classes/remoting.inc.php with no IPs set for remote-access --- interface/lib/classes/remoting.inc.php | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/interface/lib/classes/remoting.inc.php b/interface/lib/classes/remoting.inc.php index a3bb192d9..2aaf1930f 100644 --- a/interface/lib/classes/remoting.inc.php +++ b/interface/lib/classes/remoting.inc.php @@ -144,17 +144,19 @@ class remoting { $sql = "SELECT * FROM remote_user WHERE remote_username = ? and remote_password = md5(?)"; $remote_user = $app->db->queryOneRecord($sql, $username, $password); if($remote_user['remote_userid'] > 0) { - $allowed_ips = explode(',',$remote_user['remote_ips']); - foreach($allowed_ips as $i => $allowed) { - if(!filter_var($allowed, FILTER_VALIDATE_IP)) { - // get the ip for a hostname - unset($allowed_ips[$i]); - $temp=dns_get_record($allowed, DNS_A+DNS_AAAA); - foreach($temp as $t) { - if(isset($t['ip'])) $allowed_ips[] = $t['ip']; - if(isset($t['ipv6'])) $allowed_ips[] = $t['ipv6']; + if (trim($remote_user['remote_ips']) != '') { + $allowed_ips = explode(',',$remote_user['remote_ips']); + foreach($allowed_ips as $i => $allowed) { + if(!filter_var($allowed, FILTER_VALIDATE_IP)) { + // get the ip for a hostname + unset($allowed_ips[$i]); + $temp=dns_get_record($allowed, DNS_A+DNS_AAAA); + foreach($temp as $t) { + if(isset($t['ip'])) $allowed_ips[] = $t['ip']; + if(isset($t['ipv6'])) $allowed_ips[] = $t['ipv6']; + } + unset($temp); } - unset($temp); } } $allowed_ips[] = '127.0.0.1'; -- GitLab From cd3b3a72be82c89894cb65fb74dbc442472d799e Mon Sep 17 00:00:00 2001 From: florian030 Date: Mon, 29 Jan 2018 07:21:58 +0100 Subject: [PATCH 04/23] update iterate_query for dovecot2 --- install/tpl/debian6_dovecot-sql.conf.master | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install/tpl/debian6_dovecot-sql.conf.master b/install/tpl/debian6_dovecot-sql.conf.master index 496e9965d..e05330dc2 100644 --- a/install/tpl/debian6_dovecot-sql.conf.master +++ b/install/tpl/debian6_dovecot-sql.conf.master @@ -19,4 +19,4 @@ user_query = SELECT email as user, maildir as home, CONCAT( maildir_format, ':', # The iterate_query is required for the doveadm command only and works only on dovecot 2 servers. # Do not enable it on Dovecot 1.x servers -# iterate_query = SELECT email as user FROM mail_user WHERE `disable%Ls` = 'n' AND server_id = '{server_id}' +# iterate_query = SELECT email as user FROM mail_user WHERE server_id = '{server_id}' -- GitLab From 29c96a7495814edcf3c3b52707a1edf3ca743eb5 Mon Sep 17 00:00:00 2001 From: florian030 Date: Sat, 3 Feb 2018 09:44:19 +0100 Subject: [PATCH 05/23] new dkim-key generator (Fixes #4941) --- install/patches/upd_0086.php | 46 +++++ interface/web/js/mail_domain_dkim.js | 99 ----------- interface/web/mail/ajax_get_json.php | 115 ++++++++++++ .../web/mail/mail_domain_dkim_create.php | 163 ------------------ interface/web/mail/mail_domain_edit.php | 21 +-- .../web/mail/templates/mail_domain_edit.htm | 31 +++- 6 files changed, 200 insertions(+), 275 deletions(-) create mode 100644 install/patches/upd_0086.php delete mode 100755 interface/web/js/mail_domain_dkim.js create mode 100644 interface/web/mail/ajax_get_json.php delete mode 100644 interface/web/mail/mail_domain_dkim_create.php diff --git a/install/patches/upd_0086.php b/install/patches/upd_0086.php new file mode 100644 index 000000000..045c48b2f --- /dev/null +++ b/install/patches/upd_0086.php @@ -0,0 +1,46 @@ +simple_query('Delete obsolete file ' . $file . '?', array('y', 'n', 'a', 'all', 'none'), 'y'); + if($answer == 'n') continue; + elseif($answer == 'a' || $answer == 'all') $del_all = true; + elseif($answer == 'none') break; + } + if(@is_file('/usr/local/ispconfig/' . $file) && !@is_file($curpath . '/' . $file)) { + // be sure this is not a file contained in installation! + @unlink('/usr/local/ispconfig/' . $file); + ilog('Deleted obsolete file /usr/local/ispconfig/' . $file); + $c++; + } + } + ilog($c . 'obsolete files deleted.'); + } +} + +?> diff --git a/interface/web/js/mail_domain_dkim.js b/interface/web/js/mail_domain_dkim.js deleted file mode 100755 index 0e9be0aec..000000000 --- a/interface/web/js/mail_domain_dkim.js +++ /dev/null @@ -1,99 +0,0 @@ -/* -Copyright (c) 2007 - 2013, Till Brehm, projektfarm Gmbh -Copyright (c) 2013, Florian Schaal, info@schaal-24.de -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. - - - -This Javascript is invoked by - * mail/templates/mail_domain_edit.htm to show and/or create the key-pair -*/ - -var request = false; - -//function setRequest(action) { -function setRequest() { - if (window.XMLHttpRequest) { - request = new XMLHttpRequest(); - } else if (window.ActiveXObject) { - try { - request = new ActiveXObject('Msxml2.XMLHTTP'); - } - catch (e) { - try { - request = new ActiveXObject('Microsoft.XMLHTTP'); - } - catch (e) {} - } - } - if (!request) { - alert("Error creating XMLHTTP-instance"); - return false; - } else { - // jQuery depends on domain-module active / inactive - var check = jQuery('#domain_module').val(); - if ( check == "1" ) { - var skillsSelect = document.getElementById("domain"); - var domain = skillsSelect.options[skillsSelect.selectedIndex].text; - } else { - var domain = jQuery('#domain').val(); - } - - // we nedd the client-id to get the dkim-strength of the right mail-server - try { - var clientid = document.getElementById("client_group_id").selectedIndex; // admin and reseller - } - catch (e) { - var clientid = jQuery('#client_id').val();; // user - } - - var selector=jQuery('#dkim_selector').val(); - var publickey=jQuery('#dkim_public').val(); - request.open('POST', 'mail/mail_domain_dkim_create.php', true); - request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - request.send('domain='+domain+'&dkim_selector='+selector+'&dkim_public='+publickey+'&client_id='+clientid); - request.onreadystatechange = interpretRequest; - } -} - -function interpretRequest() { - switch (request.readyState) { - case 4: - if ( request.status != 200 ) { - alert("Request done but NOK\nError:"+request.status); - } else { - document.getElementsByName('dkim_selector')[0].value = request.responseXML.getElementsByTagName('selector')[0].firstChild.nodeValue; - document.getElementsByName('dkim_private')[0].value = request.responseXML.getElementsByTagName('privatekey')[0].firstChild.nodeValue; - document.getElementsByName('dkim_public')[0].value = request.responseXML.getElementsByTagName('publickey')[0].firstChild.nodeValue; - document.getElementsByName('dns_record')[0].value = request.responseXML.getElementsByTagName('dns_record')[0].firstChild.nodeValue; - } - break; - default: - break; - } -} - -//setRequest('show'); diff --git a/interface/web/mail/ajax_get_json.php b/interface/web/mail/ajax_get_json.php new file mode 100644 index 000000000..153b3e87e --- /dev/null +++ b/interface/web/mail/ajax_get_json.php @@ -0,0 +1,115 @@ +auth->check_module_permissions('mail'); + +$type = $_GET['type']; +$domain_id = $_GET['domain_id']; + +if($type == 'create_dkim' && $domain_id != ''){ + $dkim_public = $_GET['dkim_public']; + $dkim_selector = $_GET['dkim_selector']; + $client_id = $_GET['client_group_id']; + $server_id = $_GET['server_id']; + + $domain=@(is_numeric($domain_id))?$app->db->queryOneRecord("SELECT domain FROM domain WHERE domain_id = ?", $domain_id)['domain']:$domain_id; + $maildomain = $app->db->queryOneRecord("SELECT domain FROM mail_domain WHERE domain = ?", $domain)['domain']; + + $mail_config = $app->getconf->get_server_config($server_id, 'mail'); + $dkim_strength = $app->functions->intval($mail_config['dkim_strength']); + if ($dkim_strength=='') $dkim_strength = 2048; + + $rnd_val = $dkim_strength * 10; + exec('openssl rand -out ../../temp/random-data.bin '.$rnd_val.' 2> /dev/null', $output, $result); + exec('openssl genrsa -rand ../../temp/random-data.bin '.$dkim_strength.' 2> /dev/null', $privkey, $result); + unlink("../../temp/random-data.bin"); + $dkim_private=''; + foreach($privkey as $values) $dkim_private=$dkim_private.$values."\n"; + + if ($dkim_public != '' && $maildomain != '') { + if (validate_domain($domain) && validate_selector($dkim_selector) ) { + //* get active selectors from dns + $soa_rec = $app->db->queryOneRecord("SELECT origin FROM dns_soa WHERE active = 'Y' AND origin = ?", $domain.'.'); + if (isset($soa_rec) && !empty($soa_rec)) { + //* check for a dkim-record in the dns? + $dns_data = $app->db->queryOneRecord("SELECT name FROM dns_rr WHERE name = ? AND active = 'Y'", $dkim_selector.'._domainkey.'.$domain.'.'); + if (!empty($dns_data)){ + $selector = str_replace( '._domainkey.'.$domain.'.', '', $dns_data['name']); + } else { + } + } + if ($dkim_selector == $selector || !isset($selector)) { + $selector = substr($old_selector,0,53).time(); //* add unix-timestamp to delimiter to allow old and new key in the dns + } + } else { + $selector = 'invalid domain or selector'; + } + } else { + unset($dkim_public); + exec('echo '.escapeshellarg($dkim_private).'|openssl rsa -pubout -outform PEM 2> /dev/null',$pubkey,$result); + foreach($pubkey as $values) $dkim_public=$dkim_public.$values."\n"; + $selector = $dkim_selector; + } + + $dns_record=str_replace(array('-----BEGIN PUBLIC KEY-----','-----END PUBLIC KEY-----',"\r","\n"),'',$dkim_public); + $dns_record = str_replace(array("\r\n", "\n", "\r"),'',$dns_record); + + $dkim_private=json_encode($dkim_private); + $dkim_private=substr($dkim_private, 1, -1); + + $dkim_public=json_encode($dkim_public); + $dkim_public=substr($dkim_public, 1, -1); + + $json = '{'; + $json .= '"dkim_private":"'.$dkim_private.'"'; + $json .= ',"dkim_public":"'.$dkim_public.'"'; + $json .= ',"dkim_selector":"'.$selector.'"'; + $json .= ',"dns_record":"'.$dns_record.'"'; + $json .= ',"domain":"'.$domain.'"'; + $json .= '}'; +} +header('Content-type: application/json'); +echo $json; + +function validate_domain($domain) { + $regex = '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/'; + if ( preg_match($regex, $domain) === 1 ) return true; else return false; +} + +function validate_selector($selector) { + $regex = '/^[a-z0-9]{0,63}$/'; + if ( preg_match($regex, $selector) === 1 ) return true; else return false; +} + +?> diff --git a/interface/web/mail/mail_domain_dkim_create.php b/interface/web/mail/mail_domain_dkim_create.php deleted file mode 100644 index 940c11024..000000000 --- a/interface/web/mail/mail_domain_dkim_create.php +++ /dev/null @@ -1,163 +0,0 @@ -auth->check_module_permissions('mail'); - -header('Content-Type: text/xml; charset=utf-8'); -header('Cache-Control: must-revalidate, pre-check=0, no-store, no-cache, max-age=0, post-check=0'); - -function validate_domain($domain) { - $regex = '/^[\w\.\-]{2,255}\.[a-zA-Z0-9\-]{2,30}$/'; - if ( preg_match($regex, $domain) === 1 ) return true; else return false; -} - -function validate_selector($selector) { - $regex = '/^[a-z0-9]{0,63}$/'; - if ( preg_match($regex, $selector) === 1 ) return true; else return false; -} - -/** - * This function formats the public-key - * @param array $pubkey - * @return string public-key - */ -function pub_key($pubkey) { - $public_key=''; - foreach($pubkey as $values) $public_key=$public_key.$values."\n"; - return $public_key; -} - -function get_public_key($private_key, $dkim_strength) { - $validate_dkim=new validate_dkim (); - if($validate_dkim->validate_post('private', $private_key, $dkim_strength)) { /* validate the $_POST-value */ - exec('echo '.escapeshellarg($private_key).'|openssl rsa -pubout -outform PEM 2> /dev/null',$pubkey,$result); - $public_key=pub_key($pubkey); - } else { - $public_key='invalid key'; - } - return $public_key; -} - -/** - * This function updates the selector if a new key-pair was created - * and the selector is already used in the dns-record - * @param string $old_selector - * @return string selector - */ -function new_selector ($old_selector, $domain, $client_id = -1) { - global $app; - //* validate post-values - if ( validate_domain($domain) && validate_selector($old_selector) ) { - //* get active selectors from dns - $soa_rec = $app->db->queryOneRecord("SELECT * FROM dns_soa WHERE active = 'Y' AND origin = ?", $domain.'.'); - if ( isset($soa_rec) && !empty($soa_rec) ) { - //* check for a dkim-record in the dns? - $dns_data = $app->db->queryOneRecord("SELECT name FROM dns_rr WHERE name = ? AND active = 'Y'", $old_selector.'._domainkey.'.$domain.'.'); - if ( !empty($dns_data) ){ - $selector = str_replace( '._domainkey.'.$domain.'.', '', $dns_data['name']); - } else { - } - } else { //* no dns-zone found - check for existing mail-domain to create a new selector (we need this if a external dns is used) - if ( $client_id >= 0 ) { - $sql = "SELECT * from mail_domain WHERE dkim = 'y' AND domain = ? AND dkim_selector = ?"; - $maildomain = $app->db->queryOneRecord($sql, $domain, $old_selector); - if ( !empty($maildomain) ) { - $selector = $maildomain['selector']; - } - } - } - if ( $old_selector == $selector) { - $selector = substr($old_selector, 0, 53) . time(); //* add unix-timestamp to delimiter to allow old and new key in the dns - } else { - $selector = $old_selector; - } - } else { - $selector = 'invalid domain or selector'; - } - return $selector; -} - -$client_id = $app->functions->intval($_POST['client_id']); - -//* get dkim-strength for server_id -$sql = "SELECT server_id from mail_domain WHERE domain = ?"; -$mail_server = $app->db->queryOneRecord($sql, $_POST['domain']); -if ( is_array($mail_server) ) { //* we are adding an existing mail-domain - $mail_server_id = $app->functions->intval( $mail_server['server_id'] ); -} else { - $sql = "SELECT default_mailserver FROM client WHERE client_id = ?"; - $mail_server = $app->db->queryOneRecord($sql, $client_id); - $mail_server_id = $app->functions->intval( $mail_server['default_mailserver'] ); -} -unset($mail_server); -$mail_config = $app->getconf->get_server_config($mail_server_id, 'mail'); -$dkim_strength = $app->functions->intval($mail_config['dkim_strength']); -unset($mail_config); - -if ( empty($dkim_strength) ) $dkim_strength = 2048; - -$rnd_val = $dkim_strength * 10; -exec('openssl rand -out ../../temp/random-data.bin '.$rnd_val.' 2> /dev/null', $output, $result); -exec('openssl genrsa -rand ../../temp/random-data.bin '.$dkim_strength.' 2> /dev/null', $privkey, $result); -unlink("../../temp/random-data.bin"); -foreach($privkey as $values) $private_key=$private_key.$values."\n"; -//* check the selector for updated dkim-settings only -if ( isset($_POST['dkim_public']) && !empty($_POST['dkim_public']) ) $selector = new_selector($_POST['dkim_selector'], $_POST['domain'], $client_id); - -if ( !isset($public_key) ) $public_key=get_public_key($private_key, $dkim_strength); - -$dns_record=str_replace(array('-----BEGIN PUBLIC KEY-----','-----END PUBLIC KEY-----',"\r","\n"),'',$public_key); - -if ( !isset($selector) ) { - if ( validate_selector($_POST['dkim_selector']) ) $selector=$_POST['dkim_selector']; -} -echo "\n"; -echo "\n"; -echo "".$selector."\n"; -echo "".$private_key."\n"; -echo "".$public_key."\n"; -if ( validate_domain($_POST['domain']) ) { - echo ''.$selector.'._domainkey.'.$_POST['domain'].'. 3600 TXT "v=DKIM1; t=s; p='.$dns_record.'"'; -} -echo "\n"; -?> diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index d7d6ea4c6..ad383c474 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -80,7 +80,6 @@ class page_action extends tform_actions { $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY client.company_name, client.contact_name, sys_group.name"; $clients = $app->db->queryAllRecords($sql); - $clients = $app->functions->htmlentities($clients); $client_select = ''; if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; //$tmp_data_record = $app->tform->getDataRecord($this->id); @@ -97,18 +96,16 @@ class page_action extends tform_actions { // Get the limits of the client $client_group_id = $_SESSION["s"]["user"]["default_group"]; $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.default_mailserver, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ? order by client.contact_name", $client_group_id); - $client = $app->functions->htmlentities($client); // Set the mailserver to the default server of the client $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = ?", $client['default_mailserver']); - $app->tpl->setVar("server_id", ""); + $app->tpl->setVar("server_id", ""); unset($tmp); if ($settings['use_domain_module'] != 'y') { // Fill the client select field $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ? ORDER BY client.company_name, client.contact_name, sys_group.name"; $clients = $app->db->queryAllRecords($sql, $client['client_id']); - $clients = $app->functions->htmlentities($clients); $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $client['client_id']); $client_select = ''; //$tmp_data_record = $app->tform->getDataRecord($this->id); @@ -142,7 +139,7 @@ class page_action extends tform_actions { $options_mail_servers = ""; foreach ($mail_servers as $mail_server) { - $options_mail_servers .= ''; + $options_mail_servers .= ''; } $app->tpl->setVar("client_server_id", $options_mail_servers); @@ -167,7 +164,7 @@ class page_action extends tform_actions { if ($domain['domain'] == $this->dataRecord["domain"]) { $domain_select .= " selected"; } - $domain_select .= ">" . $app->functions->htmlentities($app->functions->idn_decode($domain['domain'])) . "\r\n"; + $domain_select .= ">" . $app->functions->idn_decode($domain['domain']) . "\r\n"; } } else { @@ -193,7 +190,7 @@ class page_action extends tform_actions { if(is_array($policys)) { foreach( $policys as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; - $policy_select .= "\r\n"; + $policy_select .= "\r\n"; } } $app->tpl->setVar("policy", $policy_select); @@ -204,7 +201,7 @@ class page_action extends tform_actions { if($this->id > 0) { //* we are editing a existing record $app->tpl->setVar("edit_disabled", 1); - $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"], true); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); } else { $app->tpl->setVar("edit_disabled", 0); } @@ -214,10 +211,10 @@ class page_action extends tform_actions { $rec = $app->db->queryOneRecord($sql, $app->functions->intval($_GET['id'])); $dns_key = str_replace(array('-----BEGIN PUBLIC KEY-----','-----END PUBLIC KEY-----',"\r","\n"),'',$rec['dkim_public']); $dns_record = $rec['dkim_selector'] . '._domainkey.' . $rec['domain'] . '. 3600 TXT v=DKIM1; t=s; p=' . $dns_key; - $app->tpl->setVar('dkim_selector', $rec['dkim_selector'], true); - $app->tpl->setVar('dkim_private', $rec['dkim_private'], true); - $app->tpl->setVar('dkim_public', $rec['dkim_public'], true); - if (!empty($rec['dkim_public'])) $app->tpl->setVar('dns_record', $dns_record, true); + $app->tpl->setVar('dkim_selector', $rec['dkim_selector']); + $app->tpl->setVar('dkim_private', $rec['dkim_private']); + $app->tpl->setVar('dkim_public', $rec['dkim_public']); + if (!empty($rec['dkim_public'])) $app->tpl->setVar('dns_record', $dns_record); parent::onShowEnd(); } diff --git a/interface/web/mail/templates/mail_domain_edit.htm b/interface/web/mail/templates/mail_domain_edit.htm index 960f4462b..ab02aa2ce 100644 --- a/interface/web/mail/templates/mail_domain_edit.htm +++ b/interface/web/mail/templates/mail_domain_edit.htm @@ -101,7 +101,10 @@
+ + {tmpl_var name='dkim_generate_txt'}
@@ -121,4 +124,30 @@ - + + + -- GitLab From adbf18a99577bd237401d2ce71cd6da0e9c9a49d Mon Sep 17 00:00:00 2001 From: florian030 Date: Sat, 3 Feb 2018 09:58:48 +0100 Subject: [PATCH 06/23] re-add changes to last commit --- interface/web/mail/mail_domain_edit.php | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index ad383c474..d7d6ea4c6 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -80,6 +80,7 @@ class page_action extends tform_actions { $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND sys_group.client_id > 0 ORDER BY client.company_name, client.contact_name, sys_group.name"; $clients = $app->db->queryAllRecords($sql); + $clients = $app->functions->htmlentities($clients); $client_select = ''; if($_SESSION["s"]["user"]["typ"] == 'admin') $client_select .= ""; //$tmp_data_record = $app->tform->getDataRecord($this->id); @@ -96,16 +97,18 @@ class page_action extends tform_actions { // Get the limits of the client $client_group_id = $_SESSION["s"]["user"]["default_group"]; $client = $app->db->queryOneRecord("SELECT client.client_id, client.contact_name, client.default_mailserver, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname, sys_group.name FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ? order by client.contact_name", $client_group_id); + $client = $app->functions->htmlentities($client); // Set the mailserver to the default server of the client $tmp = $app->db->queryOneRecord("SELECT server_name FROM server WHERE server_id = ?", $client['default_mailserver']); - $app->tpl->setVar("server_id", ""); + $app->tpl->setVar("server_id", ""); unset($tmp); if ($settings['use_domain_module'] != 'y') { // Fill the client select field $sql = "SELECT sys_group.groupid, sys_group.name, CONCAT(IF(client.company_name != '', CONCAT(client.company_name, ' :: '), ''), client.contact_name, ' (', client.username, IF(client.customer_no != '', CONCAT(', ', client.customer_no), ''), ')') as contactname FROM sys_group, client WHERE sys_group.client_id = client.client_id AND client.parent_client_id = ? ORDER BY client.company_name, client.contact_name, sys_group.name"; $clients = $app->db->queryAllRecords($sql, $client['client_id']); + $clients = $app->functions->htmlentities($clients); $tmp = $app->db->queryOneRecord("SELECT groupid FROM sys_group WHERE client_id = ?", $client['client_id']); $client_select = ''; //$tmp_data_record = $app->tform->getDataRecord($this->id); @@ -139,7 +142,7 @@ class page_action extends tform_actions { $options_mail_servers = ""; foreach ($mail_servers as $mail_server) { - $options_mail_servers .= ''; + $options_mail_servers .= ''; } $app->tpl->setVar("client_server_id", $options_mail_servers); @@ -164,7 +167,7 @@ class page_action extends tform_actions { if ($domain['domain'] == $this->dataRecord["domain"]) { $domain_select .= " selected"; } - $domain_select .= ">" . $app->functions->idn_decode($domain['domain']) . "\r\n"; + $domain_select .= ">" . $app->functions->htmlentities($app->functions->idn_decode($domain['domain'])) . "\r\n"; } } else { @@ -190,7 +193,7 @@ class page_action extends tform_actions { if(is_array($policys)) { foreach( $policys as $p) { $selected = ($p["id"] == $tmp_user["policy_id"])?'SELECTED':''; - $policy_select .= "\r\n"; + $policy_select .= "\r\n"; } } $app->tpl->setVar("policy", $policy_select); @@ -201,7 +204,7 @@ class page_action extends tform_actions { if($this->id > 0) { //* we are editing a existing record $app->tpl->setVar("edit_disabled", 1); - $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"]); + $app->tpl->setVar("server_id_value", $this->dataRecord["server_id"], true); } else { $app->tpl->setVar("edit_disabled", 0); } @@ -211,10 +214,10 @@ class page_action extends tform_actions { $rec = $app->db->queryOneRecord($sql, $app->functions->intval($_GET['id'])); $dns_key = str_replace(array('-----BEGIN PUBLIC KEY-----','-----END PUBLIC KEY-----',"\r","\n"),'',$rec['dkim_public']); $dns_record = $rec['dkim_selector'] . '._domainkey.' . $rec['domain'] . '. 3600 TXT v=DKIM1; t=s; p=' . $dns_key; - $app->tpl->setVar('dkim_selector', $rec['dkim_selector']); - $app->tpl->setVar('dkim_private', $rec['dkim_private']); - $app->tpl->setVar('dkim_public', $rec['dkim_public']); - if (!empty($rec['dkim_public'])) $app->tpl->setVar('dns_record', $dns_record); + $app->tpl->setVar('dkim_selector', $rec['dkim_selector'], true); + $app->tpl->setVar('dkim_private', $rec['dkim_private'], true); + $app->tpl->setVar('dkim_public', $rec['dkim_public'], true); + if (!empty($rec['dkim_public'])) $app->tpl->setVar('dns_record', $dns_record, true); parent::onShowEnd(); } -- GitLab From 55b82883b832055e94ac860b28678b50d2c6db11 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 5 Feb 2018 13:48:17 +0100 Subject: [PATCH 07/23] Implemented #4947 request: not forward spam to external mailbox --- server/conf/sieve_filter_1.2.master | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server/conf/sieve_filter_1.2.master b/server/conf/sieve_filter_1.2.master index 0dd9e62e6..b1f7fcb87 100644 --- a/server/conf/sieve_filter_1.2.master +++ b/server/conf/sieve_filter_1.2.master @@ -1,12 +1,5 @@ require ["fileinto", "regex", "date", "relational", "vacation"]; - -# Send a copy of email to - -redirect ""; - - - # Move spam to spam folder if header :contains "X-Spam-Flag" "YES" { @@ -16,6 +9,13 @@ if header :contains "X-Spam-Flag" "YES" { } + +# Send a copy of email to + +redirect ""; + + + keep; -- GitLab From fe1f21db16c64c72273bb0c126587f9b02bb0f0d Mon Sep 17 00:00:00 2001 From: iMZ Date: Wed, 7 Feb 2018 20:59:29 +0100 Subject: [PATCH 08/23] Update limits.php - show assigned and total quota of web, mail, database --- interface/web/dashboard/dashlets/limits.php | 34 ++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/interface/web/dashboard/dashlets/limits.php b/interface/web/dashboard/dashlets/limits.php index d58c3eb8e..62cd2db35 100644 --- a/interface/web/dashboard/dashlets/limits.php +++ b/interface/web/dashboard/dashlets/limits.php @@ -8,6 +8,11 @@ class dashlet_limits { $limits = array(); /* Limits to be shown*/ + + $limits[] = array('field' => 'limit_mailquota', + 'db_table' => 'mail_user', + 'db_where' => 'quota > 0', /* Count only posive value of quota, negative value -1 is unlimited */ + 'q_type' => 'quota'); $limits[] = array('field' => 'limit_maildomain', 'db_table' => 'mail_domain', @@ -61,6 +66,11 @@ class dashlet_limits { 'db_table' => 'spamfilter_policy', 'db_where' => ""); + $limits[] = array('field' => 'limit_web_quota', + 'db_table' => 'web_domain', + 'db_where' => 'hd_quota > 0', /* Count only posive value of quota, negative value -1 is unlimited */ + 'q_type' => 'hd_quota'); + $limits[] = array('field' => 'limit_web_domain', 'db_table' => 'web_domain', 'db_where' => "type = 'vhost'"); @@ -93,6 +103,11 @@ class dashlet_limits { 'db_table' => 'dns_rr', 'db_where' => ""); + $limits[] = array('field' => 'limit_database_quota', + 'db_table' => 'web_database', + 'db_where' => 'database_quota > 0', /* Count only posive value of quota, negative value -1 is unlimited */ + 'q_type' => 'database_quota'); + $limits[] = array('field' => 'limit_database', 'db_table' => 'web_database', 'db_where' => ""); @@ -143,7 +158,11 @@ class dashlet_limits { } if($value != 0 || $value == $wb['unlimited_txt']) { $value_formatted = ($value == '-1')?$wb['unlimited_txt']:$value; - $usage = $this->_get_limit_usage($limit); + if($limit['q_type']!=''){ + $usage = $this->_get_assigned_quota($limit) . " MB"; + $value_formatted = ($value == '-1')?$wb['unlimited_txt']:$value . " MB"; + } + else $usage = $this->_get_limit_usage($limit); $percentage = ($value == '-1' || $value == 0 ? 0 : round(100 * $usage / $value)); $rows[] = array('field' => $field, 'field_txt' => $wb[$field.'_txt'], @@ -172,6 +191,19 @@ class dashlet_limits { return $rec['number']; } + + function _get_assigned_quota($limit) { + global $app; + + $sql = "SELECT sum(??) as number FROM ?? WHERE "; + if($limit['db_where'] != '') $sql .= $limit['db_where']." AND "; + $sql .= $app->tform->getAuthSQL('r'); + $rec = $app->db->queryOneRecord($sql, $limit['q_type'], $limit['db_table']); + if($limit['db_table']=='mail_user') $quotaMB = $rec['number'] / 1048576; // Mail quota is in bytes, must be converted to MB + else $quotaMB = $rec['number']; + return $quotaMB; + + } } -- GitLab From 8fb9f4d88963c69a46697ea6e752f506bc400a1d Mon Sep 17 00:00:00 2001 From: iMZ Date: Wed, 7 Feb 2018 21:01:15 +0100 Subject: [PATCH 09/23] Update en_dashlet_limits.lng --- interface/web/dashboard/lib/lang/en_dashlet_limits.lng | 3 +++ 1 file changed, 3 insertions(+) diff --git a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng index 3f0ce2f43..5d504c8e9 100644 --- a/interface/web/dashboard/lib/lang/en_dashlet_limits.lng +++ b/interface/web/dashboard/lib/lang/en_dashlet_limits.lng @@ -28,4 +28,7 @@ $wb["limit_webdav_user_txt"] = 'Number of Webdav users'; $wb["limit_client_txt"] = 'Number of Clients'; $wb["limit_database_txt"] = 'Number of Databases'; $wb['limit_domain_txt'] = 'Number of Domains'; +$wb['limit_mailquota_txt'] = 'Assigned mailbox quota'; +$wb['limit_web_quota_txt'] = 'Assigned web quota'; +$wb['limit_database_quota_txt'] = 'Assigned database quota'; ?> -- GitLab From 71adfd203bf4f3e0b5e7a21141c475491ee07b23 Mon Sep 17 00:00:00 2001 From: florian030 Date: Thu, 8 Feb 2018 12:51:18 +0100 Subject: [PATCH 10/23] catch ipv6-connection errors for ec.europa.eu --- interface/lib/classes/validate_client.inc.php | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/interface/lib/classes/validate_client.inc.php b/interface/lib/classes/validate_client.inc.php index 256b483c4..4652e2a07 100644 --- a/interface/lib/classes/validate_client.inc.php +++ b/interface/lib/classes/validate_client.inc.php @@ -174,10 +174,8 @@ class validate_client { } } } - - $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); - - if($client){ + try { + $client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"); $params = array('countryCode' => $cc, 'vatNumber' => $vn); try{ $r = $client->checkVat($params); @@ -191,12 +189,12 @@ class validate_client { } } - // This foreach shows every single line of the returned information - /* - foreach($r as $k=>$prop){ - echo $k . ': ' . $prop; - } - */ + // This foreach shows every single line of the returned information + /* + foreach($r as $k=>$prop){ + echo $k . ': ' . $prop; + } + */ } catch(SoapFault $e) { //echo 'Error, see message: '.$e->faultstring; @@ -217,7 +215,7 @@ class validate_client { break; } } - } else { + } catch(SoapFault $e){ // Connection to host not possible, europe.eu down? // this shouldn't be the user's fault, so we return no error } -- GitLab From f81f3ec8ffe88cb8f5e2d44b0767e6a4ece4d8d3 Mon Sep 17 00:00:00 2001 From: Till Brehm Date: Mon, 12 Feb 2018 12:25:02 +0100 Subject: [PATCH 11/23] Corrected some remote api examples. --- remoting_client/examples/mail_user_add.php | 4 ++-- remoting_client/examples/sites_database_add.php | 2 +- remoting_client/examples/sites_database_user_add.php | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/remoting_client/examples/mail_user_add.php b/remoting_client/examples/mail_user_add.php index 25e3590af..3b7d240ec 100644 --- a/remoting_client/examples/mail_user_add.php +++ b/remoting_client/examples/mail_user_add.php @@ -29,8 +29,8 @@ try { 'cc' => '', 'homedir' => '/var/vmail', 'autoresponder' => 'n', - 'autoresponder_start_date' => array('day' => 1, 'month' => 7, 'year' => 2012, 'hour' => 0, 'minute' => 0), - 'autoresponder_end_date' => array('day' => 20, 'month' => 7, 'year' => 2012, 'hour' => 0, 'minute' => 0), + 'autoresponder_start_date' => '', + 'autoresponder_end_date' => '', 'autoresponder_text' => 'hallo', 'move_junk' => 'n', 'custom_mailfilter' => 'spam', diff --git a/remoting_client/examples/sites_database_add.php b/remoting_client/examples/sites_database_add.php index 3c8277699..c63ad551e 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 108163340..d59b66d9e 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."
"; -- GitLab From 1f59ad5268d8d28d355675ad12317a350a4561b0 Mon Sep 17 00:00:00 2001 From: Costin Date: Tue, 13 Feb 2018 09:41:54 +0100 Subject: [PATCH 12/23] Fix typo in parent user related variable when creating new jailkit shell user. This bug was interfering with the correct functioning of the plugin. --- server/plugins-available/shelluser_jailkit_plugin.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/plugins-available/shelluser_jailkit_plugin.inc.php b/server/plugins-available/shelluser_jailkit_plugin.inc.php index 295112d42..9a29a10a6 100755 --- a/server/plugins-available/shelluser_jailkit_plugin.inc.php +++ b/server/plugins-available/shelluser_jailkit_plugin.inc.php @@ -399,7 +399,7 @@ class shelluser_jailkit_plugin { if($this->data['new']['active'] != 'y') $shell = '/bin/false'; $app->system->usermod($this->data['new']['username'], 0, 0, $this->data['new']['dir'].'/.'.$jailkit_chroot_userhome, $shell); - $app->system->usermod($this->data['new']['puser'], 0, 0, $this->data['new']['dir'].'/.'.$jailkit_chroot_userhome, '/usr/sbin/jk_chrootsh'); + $app->system->usermod($this->data['new']['puser'], 0, 0, $this->data['new']['dir'].'/.'.$jailkit_chroot_puserhome, '/usr/sbin/jk_chrootsh'); $this->app->log("Added jailkit user to chroot with command: ".$command, LOGLEVEL_DEBUG); -- GitLab From 8079c4243f55f08741963a67831ff88380b97034 Mon Sep 17 00:00:00 2001 From: florian030 Date: Tue, 13 Feb 2018 16:10:50 +0100 Subject: [PATCH 13/23] use pigz if available for tar-backups and add definable tmp-dir for zip-backups --- install/tpl/server.ini.master | 1 + .../web/admin/form/server_config.tform.php | 14 +++++++++++ .../web/admin/lib/lang/de_server_config.lng | 3 +++ .../web/admin/lib/lang/en_server_config.lng | 3 +++ .../templates/server_config_server_edit.htm | 4 ++++ server/lib/classes/cron.d/500-backup.inc.php | 24 +++++++++++++++---- .../classes/cron.d/500-backup_mail.inc.php | 24 +++++++++++++++---- 7 files changed, 63 insertions(+), 10 deletions(-) diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 2f4d7db3a..41cb03c4f 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -16,6 +16,7 @@ firewall=bastille loglevel=2 admin_notify_events=1 backup_dir=/var/backup +backup_tmp=/tmp backup_dir_is_mount=n backup_mode=rootgz backup_time=0:00 diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 70aac48e0..93094629a 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -183,6 +183,20 @@ $form["tabs"]['server'] = array( 'width' => '40', 'maxlength' => '255' ), + 'backup_tmp' => array( + 'datatype' => 'VARCHAR', + 'formtype' => 'TEXT', + 'default' => '/tmp/', + 'validators' => array( 0 => array('type' => 'NOTEMPTY', + 'errmsg' => 'tmpdir_path_error_empty'), + 1 => array ( 'type' => 'REGEX', + 'regex' => '/^\/[a-zA-Z0-9\.\-\_\/]{5,128}$/', + 'errmsg'=> 'tmpdir_path_error_regex'), + ), + 'value' => '', + 'width' => '40', + 'maxlength' => '255' + ), 'backup_dir_is_mount' => array( 'datatype' => 'VARCHAR', 'formtype' => 'CHECKBOX', diff --git a/interface/web/admin/lib/lang/de_server_config.lng b/interface/web/admin/lib/lang/de_server_config.lng index 2656243d6..ee55d43bb 100644 --- a/interface/web/admin/lib/lang/de_server_config.lng +++ b/interface/web/admin/lib/lang/de_server_config.lng @@ -81,6 +81,7 @@ $wb['awstats_data_dir_txt'] = 'AWStats Datenverzeichnis'; $wb['awstats_pl_txt'] = 'AWStats awstats.pl Script'; $wb['awstats_buildstaticpages_pl_txt'] = 'AWStats awstats_buildstaticpages.pl Script'; $wb['backup_dir_txt'] = 'Backupverzeichnis'; +$wb['backup_tmp_txt'] = 'Backup tmp-Dir (zip)'; $wb['named_conf_local_path_txt'] = 'BIND named.conf.local Pfad'; $wb['php_ini_path_cgi_txt'] = 'CGI php.ini Pfad'; $wb['php_ini_path_apache_txt'] = 'Apache php.ini Pfad'; @@ -103,6 +104,8 @@ $wb['nginx_user_txt'] = 'Nginx Benutzer'; $wb['nginx_group_txt'] = 'Nginx Gruppe'; $wb['nginx_cgi_socket_txt'] = 'Nginx CGI Socket'; $wb['backup_dir_error_empty'] = 'Backup Verzeichnis ist leer.'; +$wb['tmpdir_path_error_empty'] = 'Tmp-Dir Pfad ist leer.'; +$wb['tmpdir_path_error_regex'] = 'Invalid Tmp-Dir Pfad.'; $wb['maildir_path_error_empty'] = 'Maildir Pfad ist leer.'; $wb['homedir_path_error_empty'] = 'Homedir Pfad ist leer.'; $wb['mailuser_uid_error_empty'] = 'Mail Benutzer UID ist leer.'; diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index 80849cb5a..7f7e2c8f8 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -90,6 +90,7 @@ $wb["awstats_data_dir_txt"] = 'awstats data folder'; $wb["awstats_pl_txt"] = 'awstats.pl script'; $wb["awstats_buildstaticpages_pl_txt"] = 'awstats_buildstaticpages.pl script'; $wb["backup_dir_txt"] = 'Backup directory'; +$wb["backup_tmp_txt"] = 'Backup tmp directory for zip'; $wb["named_conf_local_path_txt"] = 'BIND named.conf.local path'; $wb["php_ini_path_cgi_txt"] = 'CGI php.ini path'; $wb["php_ini_path_apache_txt"] = 'Apache php.ini path'; @@ -101,6 +102,8 @@ $wb["fastcgi_config_syntax_txt"] = 'FastCGI config syntax'; $wb["backup_mode_txt"] = 'Backup mode'; $wb["backup_mode_userzip"] = 'Backup web files owned by web user as zip'; $wb["backup_mode_rootgz"] = 'Backup all files in web directory as root user'; +$wb['tmpdir_path_error_empty'] = 'tmp-dir Path is empty.'; +$wb['tmpdir_path_error_regex'] = 'Invalid tmp-dir path.'; $wb["backup_time_txt"] = 'Backup time'; $wb["server_type_txt"] = 'Server Type'; $wb["nginx_vhost_conf_dir_txt"] = 'Nginx Vhost config dir'; diff --git a/interface/web/admin/templates/server_config_server_edit.htm b/interface/web/admin/templates/server_config_server_edit.htm index 7868e8756..e034fa53b 100644 --- a/interface/web/admin/templates/server_config_server_edit.htm +++ b/interface/web/admin/templates/server_config_server_edit.htm @@ -63,6 +63,10 @@ {tmpl_var name='backup_mode'} +
+ +
+