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