From 86f8f38c7664eaa9d4cd0b748ccda8a9fcc3f085 Mon Sep 17 00:00:00 2001 From: Thom Pol <> Date: Sun, 7 Mar 2021 22:26:08 +0100 Subject: [PATCH] Add client limits for SMTP relay settings (#6088) --- interface/web/client/form/client.tform.php | 7 +++ .../web/client/form/client_template.tform.php | 10 +++- interface/web/client/form/reseller.tform.php | 6 +++ .../client/templates/client_edit_limits.htm | 6 +++ .../templates/client_template_edit_limits.htm | 6 +++ .../client/templates/reseller_edit_limits.htm | 6 +++ interface/web/mail/mail_domain_edit.php | 52 ++++++++++--------- .../web/mail/templates/mail_domain_edit.htm | 28 +++++----- 8 files changed, 81 insertions(+), 40 deletions(-) diff --git a/interface/web/client/form/client.tform.php b/interface/web/client/form/client.tform.php index 7ad9aecac6..83464112d5 100644 --- a/interface/web/client/form/client.tform.php +++ b/interface/web/client/form/client.tform.php @@ -938,6 +938,13 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'valuelimit' => 'client:limit_relayhost', + 'value' => array(0 => 'n', 1 => 'y') + ), 'default_xmppserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', diff --git a/interface/web/client/form/client_template.tform.php b/interface/web/client/form/client_template.tform.php index 5883cce56c..ea8fb7d27e 100644 --- a/interface/web/client/form/client_template.tform.php +++ b/interface/web/client/form/client_template.tform.php @@ -353,7 +353,15 @@ $form["tabs"]['limits'] = array ( 'maxlength' => '10', 'rows' => '', 'cols' => '' - ),/* + ), + 'limit_relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'valuelimit' => 'client:limit_relayhost', + 'value' => array(0 => 'n', 1 => 'y') + ), + /* 'default_xmppserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', diff --git a/interface/web/client/form/reseller.tform.php b/interface/web/client/form/reseller.tform.php index 8c94132b3b..f2f88343bf 100644 --- a/interface/web/client/form/reseller.tform.php +++ b/interface/web/client/form/reseller.tform.php @@ -936,6 +936,12 @@ $form["tabs"]['limits'] = array ( 'rows' => '', 'cols' => '' ), + 'limit_relayhost' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'n', + 'value' => array(0 => 'n', 1 => 'y') + ), 'default_xmppserver' => array ( 'datatype' => 'INTEGER', 'formtype' => 'SELECT', diff --git a/interface/web/client/templates/client_edit_limits.htm b/interface/web/client/templates/client_edit_limits.htm index 39512208b4..2b4b134a5a 100644 --- a/interface/web/client/templates/client_edit_limits.htm +++ b/interface/web/client/templates/client_edit_limits.htm @@ -235,6 +235,12 @@ <label for="limit_spamfilter_policy" class="col-sm-3 control-label">{tmpl_var name='limit_spamfilter_policy_txt'}</label> <div class="col-sm-9"><input type="text" name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" class="form-control" /></div> </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='limit_relayhost_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='limit_relayhost'} + </div> + </div> </div> </div> </div> diff --git a/interface/web/client/templates/client_template_edit_limits.htm b/interface/web/client/templates/client_template_edit_limits.htm index 4573e4b0d6..680bc427d8 100644 --- a/interface/web/client/templates/client_template_edit_limits.htm +++ b/interface/web/client/templates/client_template_edit_limits.htm @@ -192,6 +192,12 @@ <label for="limit_spamfilter_policy" class="col-sm-3 control-label">{tmpl_var name='limit_spamfilter_policy_txt'}</label> <div class="col-sm-9"><input type="text" name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" class="form-control" /></div> </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='limit_relayhost_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='limit_relayhost'} + </div> + </div> </div> </div> </div> diff --git a/interface/web/client/templates/reseller_edit_limits.htm b/interface/web/client/templates/reseller_edit_limits.htm index ff185ce9a4..fa2c3705c9 100644 --- a/interface/web/client/templates/reseller_edit_limits.htm +++ b/interface/web/client/templates/reseller_edit_limits.htm @@ -236,6 +236,12 @@ <label for="limit_spamfilter_policy" class="col-sm-3 control-label">{tmpl_var name='limit_spamfilter_policy_txt'}</label> <div class="col-sm-9"><input type="text" name="limit_spamfilter_policy" id="limit_spamfilter_policy" value="{tmpl_var name='limit_spamfilter_policy'}" class="form-control" /></div> </div> + <div class="form-group"> + <label class="col-sm-3 control-label">{tmpl_var name='limit_relayhost_txt'}</label> + <div class="col-sm-9"> + {tmpl_var name='limit_relayhost'} + </div> + </div> </div> </div> </div> diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 3ea60c08f9..e74a60ed94 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -216,23 +216,25 @@ class page_action extends tform_actions { } // load relayhost-values - $sql = "SELECT relay_host, relay_user, relay_pass FROM mail_domain WHERE domain_id = ?"; - $rec = $app->db->queryOneRecord($sql, $app->functions->intval($_GET['id'])); - $app->tpl->setVar('relay_host', $rec['relay_host'], true); - $app->tpl->setVar('relay_user', $rec['relay_user'], true); - $app->tpl->setVar('relay_pass', $rec['relay_pass'], true); + if ($client["limit_relayhost"] == 'y') { + $sql = "SELECT relay_host, relay_user, relay_pass FROM mail_domain WHERE domain_id = ?"; + $rec = $app->db->queryOneRecord($sql, $app->functions->intval($_GET['id'])); + $app->tpl->setVar('relay_host', $rec['relay_host'], true); + $app->tpl->setVar('relay_user', $rec['relay_user'], true); + $app->tpl->setVar('relay_pass', $rec['relay_pass'], true); + } // load dkim-values $sql = "SELECT domain, dkim_private, dkim_public, dkim_selector FROM mail_domain WHERE domain_id = ?"; $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']); - + $keyparts = str_split('v=DKIM1; t=s; p=' . $dns_key, 200); array_walk($keyparts, function(&$value, $key) { $value = '"'.$value.'"'; } ); $dkim_txt = implode('', $keyparts); $dns_record = $rec['dkim_selector'] . '._domainkey.' . $rec['domain'] . '. 3600 IN TXT '.$dkim_txt; - + $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); @@ -263,7 +265,7 @@ class page_action extends tform_actions { if($_SESSION["s"]["user"]["typ"] != 'admin') { // Get the limits of the client $client_group_id = $app->functions->intval($_SESSION["s"]["user"]["default_group"]); - $client = $app->db->queryOneRecord("SELECT client.mail_servers, limit_maildomain, default_mailserver FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); + $client = $app->db->queryOneRecord("SELECT client.mail_servers, limit_maildomain, default_mailserver, limit_relayhost FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id); // When the record is updated if($this->id > 0) { // restore the server ID if the user is not admin and record is edited @@ -296,7 +298,7 @@ class page_action extends tform_actions { $this->dataRecord["domain"] = $app->functions->idn_encode($this->dataRecord["domain"]); $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); } - + //* server_id must be > 0 if(isset($this->dataRecord["server_id"]) && $this->dataRecord["server_id"] < 1) $app->tform->errorMessage .= $app->lng("server_id_0_error_txt"); @@ -305,7 +307,7 @@ class page_action extends tform_actions { function onAfterInsert() { global $app, $conf; - + $domain = $app->functions->idn_encode($this->dataRecord["domain"]); // Spamfilter policy @@ -319,10 +321,10 @@ class page_action extends tform_actions { $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); // We create a new record $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_userid" => $_SESSION["s"]["user"]["userid"], "sys_groupid" => $tmp_domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', "sys_perm_other" => '', "server_id" => $this->dataRecord["server_id"], "priority" => 5, @@ -350,7 +352,7 @@ class page_action extends tform_actions { function onBeforeUpdate() { global $app, $conf; - + $domain = $app->functions->idn_encode($this->dataRecord["domain"]); //* Check if the server has been changed @@ -381,7 +383,7 @@ class page_action extends tform_actions { global $app, $conf; $domain = $app->functions->idn_encode($this->dataRecord["domain"]); - + // Spamfilter policy $policy_id = $app->functions->intval($this->dataRecord["policy"]); $tmp_user = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $domain); @@ -393,10 +395,10 @@ class page_action extends tform_actions { $tmp_domain = $app->db->queryOneRecord("SELECT sys_groupid FROM mail_domain WHERE domain_id = ?", $this->id); // We create a new record $insert_data = array( - "sys_userid" => $_SESSION["s"]["user"]["userid"], + "sys_userid" => $_SESSION["s"]["user"]["userid"], "sys_groupid" => $tmp_domain["sys_groupid"], - "sys_perm_user" => 'riud', - "sys_perm_group" => 'riud', + "sys_perm_user" => 'riud', + "sys_perm_group" => 'riud', "sys_perm_other" => '', "server_id" => $this->dataRecord["server_id"], "priority" => 5, @@ -447,7 +449,7 @@ class page_action extends tform_actions { //* Update the mailinglist $app->db->query("UPDATE mail_mailinglist SET sys_userid = ?, sys_groupid = ? WHERE domain = ?", $client_user_id, $sys_groupid, $this->oldDataRecord['domain']); - + //* Update fetchmail accounts $fetchmail = $app->db->queryAllRecords("SELECT * FROM mail_get WHERE destination like ?", '%@' . $this->oldDataRecord['domain']); if(is_array($fetchmail)) { @@ -456,7 +458,7 @@ class page_action extends tform_actions { $app->db->datalogUpdate('mail_get', array("destination" => $destination, "sys_userid" => $client_user_id, "sys_groupid" => $sys_groupid), 'mailget_id', $rec['mailget_id']); } } - + //* Delete the old spamfilter record $tmp = $app->db->queryOneRecord("SELECT id FROM spamfilter_users WHERE email = ?", '@' . $this->oldDataRecord["domain"]); $app->db->datalogDelete('spamfilter_users', 'id', $tmp["id"]); @@ -467,10 +469,10 @@ class page_action extends tform_actions { //* update dns-record when the dkim record was changed // NOTE: only if the domain-name was not changed if ( $this->dataRecord['active'] == 'y' && $domain == $this->oldDataRecord['domain'] ) { - $dkim_active = @($this->dataRecord['dkim'] == 'y') ? true : false; + $dkim_active = @($this->dataRecord['dkim'] == 'y') ? true : false; $selector = @($this->dataRecord['dkim_selector'] != $this->oldDataRecord['dkim_selector']) ? true : false; $dkim_private = @($this->dataRecord['dkim_private'] != $this->oldDataRecord['dkim_private']) ? true : false; - + $soaDomain = $domain.'.'; while ((!isset($soa) && (substr_count($soaDomain,'.') > 1))) { $soa = $app->db->queryOneRecord("SELECT id AS zone, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other, server_id, ttl, serial FROM dns_soa WHERE active = 'Y' AND origin = ?", $soaDomain); @@ -493,7 +495,7 @@ class page_action extends tform_actions { $soa_id = $app->functions->intval($soa['zone']); $serial = $app->validate_dns->increase_serial($soa["serial"]); $app->db->datalogUpdate('dns_soa', array("serial" => $serial), 'id', $soa_id); - } + } } } @@ -510,8 +512,8 @@ class page_action extends tform_actions { $app->db->datalogDelete('dns_rr', 'id', $r['id']); } } - - // also delete a dsn-records with same selector + + // also delete a dsn-records with same selector $sql = "SELECT * from dns_rr WHERE name ? AND data LIKE 'v=DKIM1%' AND " . $app->tform->getAuthSQL('r'); $rec = $app->db->queryAllRecords($sql, '._domainkey.'.$dataRecord['dkim_selector'].'.', $dataRecord['domain']); if (is_array($rec)) diff --git a/interface/web/mail/templates/mail_domain_edit.htm b/interface/web/mail/templates/mail_domain_edit.htm index 676e55f9dc..c024fa023b 100644 --- a/interface/web/mail/templates/mail_domain_edit.htm +++ b/interface/web/mail/templates/mail_domain_edit.htm @@ -75,24 +75,26 @@ {tmpl_var name='policy'} </select></div> </div> - <div class="form-group"> + <tmpl_if name="limit_relayhost" op="==" value="y"> + <div class="form-group"> <label for="relay_host" class="col-sm-3 control-label">{tmpl_var name='relayhost_txt'}</label> <div class="col-sm-9"> - <input type="text" name="relay_host" id="relay_host" value="{tmpl_var name='relay_host'}" class="form-control" /> + <input type="text" name="relay_host" id="relay_host" value="{tmpl_var name='relay_host'}" class="form-control" /> </div> - </div> - <div class="form-group"> + </div> + <div class="form-group"> <label for="relay_user" class="col-sm-3 control-label">{tmpl_var name='relayhost_user_txt'}</label> <div class="col-sm-9"> - <input type="text" name="relay_user" id="relay_user" value="{tmpl_var name='relay_user'}" class="form-control" /> + <input type="text" name="relay_user" id="relay_user" value="{tmpl_var name='relay_user'}" class="form-control" /> </div> - </div> - <div class="form-group"> + </div> + <div class="form-group"> <label for="relay_pass" class="col-sm-3 control-label">{tmpl_var name='relayhost_password_txt'}</label> <div class="col-sm-9"> - <input type="text" name="relay_pass" id="relay_pass" value="{tmpl_var name='relay_pass'}" class="form-control" /> + <input type="text" name="relay_pass" id="relay_pass" value="{tmpl_var name='relay_pass'}" class="form-control" /> </div> - </div> + </div> + </tmpl_if> <div class="form-group"> <label class="col-sm-3 control-label">{tmpl_var name='active_txt'}</label> <div class="col-sm-9"> @@ -131,7 +133,7 @@ </div> - + <input type="hidden" name="id" value="{tmpl_var name='id'}"> <input type="hidden" name="type" value="local"> @@ -150,11 +152,11 @@ domain_id : domain_id, dkim_public : dkim_public, dkim_selector : dkim_selector, - type : "create_dkim" + type : "create_dkim" }, function(data) { var dkim_txt = 'v=DKIM1; t=s; p=' + data['dns_record'].replace(/(\r\n|\n|\r)/gm, ""); var dns=data['dkim_selector'] + '._domainkey.' + data['domain'] + '. 3600 IN TXT ' + dkim_txt.match(new RegExp('.{1,' + '200' + '}', 'g')).map(chunk => '"' + chunk + '"').join(''); - + $("#dkim_selector").val(data.dkim_selector); $("#dkim_public").val(data.dkim_public); $("#dkim_private").val(data.dkim_private); @@ -162,5 +164,3 @@ }); }; </script> - - -- GitLab