From 3f2704af6c7684acfe8db55a0c5d3d803abd1dad Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 10 Mar 2021 14:29:12 +0100 Subject: [PATCH 1/4] - add chekc whether to delete rspamd conf file for user --- server/plugins-available/rspamd_plugin.inc.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index 09ed09a436..c9bfedf322 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -220,7 +220,17 @@ class rspamd_plugin { $settings_file = $this->users_config_dir . str_replace('@', '_', $settings_name) . '.conf'; //$app->log('Settings file for rspamd is ' . $settings_file, LOGLEVEL_WARN); if($mode === 'delete') { - if(is_file($settings_file)) { + $delete_file = true; + if($type === 'spamfilter_user') { + $search_for_policy[] = $email_address; + $search_for_policy[] = substr($email_address, strpos($email_address, '@')); + + $policy = $app->db->queryOneRecord("SELECT p.* FROM spamfilter_users as u INNER JOIN spamfilter_policy as p ON (p.id = u.policy_id) WHERE u.server_id = ? AND u.email IN ? ORDER BY u.priority DESC", $conf['server_id'], $search_for_policy); + if($policy) { + $delete_file = false; + } + } + if($delete_file === true && is_file($settings_file)) { unlink($settings_file); } } else { -- GitLab From 0c3e00e722fb0cb75554fe81b2fa9e89ce21793b Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 10 Mar 2021 15:13:27 +0100 Subject: [PATCH 2/4] - update all depending entries on domain update --- interface/web/mail/mail_domain_edit.php | 40 +++++++++---------- .../plugins-available/rspamd_plugin.inc.php | 28 ++++++++++++- 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/interface/web/mail/mail_domain_edit.php b/interface/web/mail/mail_domain_edit.php index 3ea60c08f9..7794023255 100644 --- a/interface/web/mail/mail_domain_edit.php +++ b/interface/web/mail/mail_domain_edit.php @@ -226,13 +226,13 @@ class page_action extends tform_actions { $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); @@ -296,7 +296,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 +305,7 @@ class page_action extends tform_actions { function onAfterInsert() { global $app, $conf; - + $domain = $app->functions->idn_encode($this->dataRecord["domain"]); // Spamfilter policy @@ -319,10 +319,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 +350,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 +381,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 +393,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, @@ -422,7 +422,7 @@ class page_action extends tform_actions { //* Update the mailboxes $mailusers = $app->db->queryAllRecords("SELECT * FROM mail_user WHERE email like ?", '%@' . $this->oldDataRecord['domain']); $sys_groupid = $app->functions->intval((isset($this->dataRecord['client_group_id']))?$this->dataRecord['client_group_id']:$this->oldDataRecord['sys_groupid']); - $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = ?", $client_group_id); + $tmp = $app->db->queryOneRecord("SELECT userid FROM sys_user WHERE default_group = ?", $sys_groupid); $client_user_id = $app->functions->intval(($tmp['userid'] > 0)?$tmp['userid']:1); if(is_array($mailusers)) { foreach($mailusers as $rec) { @@ -447,7 +447,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 +456,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 +467,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 +493,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 +510,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/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index c9bfedf322..d9b62f858a 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -139,7 +139,7 @@ class rspamd_plugin { $app->plugins->registerEvent('mail_forwarding_delete', $this->plugin_name, 'user_settings_update'); } - function user_settings_update($event_name, $data) { + function user_settings_update($event_name, $data, $internal = false) { global $app, $conf; if(!is_dir('/etc/rspamd')) { @@ -206,6 +206,23 @@ class rspamd_plugin { return; } + $entries_to_update = [ + 'mail_user' => [], + 'mail_forwarding' => [] + ]; + if($is_domain === true) { + // get all child records to update / delete + $mailusers = $app->db->queryAllRecords("SELECT mu.* FROM mail_user as mu LEFT JOIN spamfilter_users as su ON (su.email = mu.email) WHERE mu.email LIKE ? AND su.id IS NULL", '%' . $email_address); + if(is_array($mailusers) && !empty($mailusers)) { + $entries_to_update['mail_user'] = $mailusers; + } + + $forwardings = $app->db->queryAllRecords("SELECT mf.* FROM mail_forwarding as mf LEFT JOIN spamfilter_users as su ON (su.email = mf.source) WHERE mf.source LIKE ? AND su.id IS NULL", '%' . $email_address); + if(is_array($forwardings) && !empty($forwardings)) { + $entries_to_update['mail_forwarding'] = $forwardings; + } + } + $old_settings_name = $settings_name; $settings_name = $app->functions->idn_encode($settings_name); @@ -328,7 +345,14 @@ class rspamd_plugin { } } - if($mail_config['content_filter'] == 'rspamd'){ + foreach($entries_to_update['mail_user'] as $entry) { + $this->user_settings_update('mail_user_' . $mode, $entry, true); + } + foreach($entries_to_update['mail_forwarding'] as $entry) { + $this->user_settings_update('mail_forwarding_' . $mode, $entry, true); + } + + if($internal !== true && $mail_config['content_filter'] == 'rspamd'){ $app->services->restartServiceDelayed('rspamd', 'reload'); } } -- GitLab From 0362bafa2f1b3b939cf72f2347b7f38ba27f361e Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Wed, 10 Mar 2021 15:14:12 +0100 Subject: [PATCH 3/4] - added check --- server/plugins-available/rspamd_plugin.inc.php | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index d9b62f858a..e369f5cdaf 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -345,11 +345,13 @@ class rspamd_plugin { } } - foreach($entries_to_update['mail_user'] as $entry) { - $this->user_settings_update('mail_user_' . $mode, $entry, true); - } - foreach($entries_to_update['mail_forwarding'] as $entry) { - $this->user_settings_update('mail_forwarding_' . $mode, $entry, true); + if($is_domain === true) { + foreach($entries_to_update['mail_user'] as $entry) { + $this->user_settings_update('mail_user_' . $mode, $entry, true); + } + foreach($entries_to_update['mail_forwarding'] as $entry) { + $this->user_settings_update('mail_forwarding_' . $mode, $entry, true); + } } if($internal !== true && $mail_config['content_filter'] == 'rspamd'){ -- GitLab From 1deb325d85edb4f95157c9f9e3acde21297aa841 Mon Sep 17 00:00:00 2001 From: Marius Burkard Date: Thu, 11 Mar 2021 13:54:43 +0100 Subject: [PATCH 4/4] - fixed update of entries --- server/plugins-available/rspamd_plugin.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/plugins-available/rspamd_plugin.inc.php b/server/plugins-available/rspamd_plugin.inc.php index e369f5cdaf..41f6b08f40 100644 --- a/server/plugins-available/rspamd_plugin.inc.php +++ b/server/plugins-available/rspamd_plugin.inc.php @@ -347,10 +347,10 @@ class rspamd_plugin { if($is_domain === true) { foreach($entries_to_update['mail_user'] as $entry) { - $this->user_settings_update('mail_user_' . $mode, $entry, true); + $this->user_settings_update('mail_user_' . $mode, ['old' => $entry, 'new' => $entry], true); } foreach($entries_to_update['mail_forwarding'] as $entry) { - $this->user_settings_update('mail_forwarding_' . $mode, $entry, true); + $this->user_settings_update('mail_forwarding_' . $mode, ['old' => $entry, 'new' => $entry], true); } } -- GitLab