[Rspamd] Add SOGo contacts to whitelist

master
andryyy 2018-11-12 09:56:54 +01:00
parent 2210201c76
commit 4f7f493490
1 changed files with 81 additions and 8 deletions

View File

@ -26,13 +26,32 @@ catch (PDOException $e) {
} }
function parse_email($email) { function parse_email($email) {
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) return false; if (!filter_var($email, FILTER_VALIDATE_EMAIL)) return false;
$a = strrpos($email, '@'); $a = strrpos($email, '@');
return array('local' => substr($email, 0, $a), 'domain' => substr($email, $a)); return array('local' => substr($email, 0, $a), 'domain' => substr($email, $a));
} }
function wl_by_sogo() {
global $pdo;
$rcpt = array();
$stmt = $pdo->query("SELECT DISTINCT(`sogo_folder_info`.`c_path2`) AS `user`, GROUP_CONCAT(`sogo_quick_contact`.`c_mail`) AS `contacts` FROM `sogo_folder_info`
INNER JOIN `sogo_quick_contact` ON `sogo_quick_contact`.`c_folder_id` = `sogo_folder_info`.`c_folder_id`
GROUP BY `c_path2`");
$sogo_contacts = $stmt->fetchAll(PDO::FETCH_ASSOC);
while ($row = array_shift($sogo_contacts)) {
foreach (explode(',', $row['contacts']) as $contact) {
if (!filter_var($contact, FILTER_VALIDATE_EMAIL)) {
continue;
}
$rcpt[$row['user']][] = '/^' . str_replace('/', '\/', $contact) . '$/i';
}
}
return $rcpt;
}
function ucl_rcpts($object, $type) { function ucl_rcpts($object, $type) {
global $pdo; global $pdo;
$rcpt = array();
if ($type == 'mailbox') { if ($type == 'mailbox') {
// Standard aliases // Standard aliases
$stmt = $pdo->prepare("SELECT `address` FROM `alias` $stmt = $pdo->prepare("SELECT `address` FROM `alias`
@ -82,10 +101,7 @@ function ucl_rcpts($object, $type) {
$rcpt[] = '/.*@' . $row['alias_domain'] . '/i'; $rcpt[] = '/.*@' . $row['alias_domain'] . '/i';
} }
} }
if (!empty($rcpt)) { return $rcpt;
return $rcpt;
}
return false;
} }
?> ?>
settings { settings {
@ -138,6 +154,65 @@ while ($row = array_shift($rows)) {
<?php <?php
} }
/*
// Start SOGo contacts whitelist
// Priority 4, lower than a domain whitelist (5) and lower than a mailbox whitelist (6)
*/
foreach (wl_by_sogo() as $user => $contacts) {
$username_sane = preg_replace("/[^a-zA-Z0-9]+/", "", $user);
?>
whitelist_sogo_<?=$username_sane;?> {
<?php
foreach ($contacts as $contact) {
?>
from = <?=json_encode($contact, JSON_UNESCAPED_SLASHES);?>;
<?php
}
?>
priority = 4;
<?php
foreach (ucl_rcpts($user, 'mailbox') as $rcpt) {
?>
rcpt = <?=json_encode($rcpt, JSON_UNESCAPED_SLASHES);?>;
<?php
}
?>
apply "default" {
SOGO_CONTACT = -999.0;
}
symbols [
"SOGO_CONTACT"
]
}
whitelist_sogo_<?=$username_sane;?>_header {
header = {
<?php
foreach ($contacts as $contact) {
?>
"From" = <?=json_encode(str_replace('/^', '/(', str_replace('$/i', ')/i', $contact)), JSON_UNESCAPED_SLASHES);?>;
<?php
}
?>
}
priority = 4;
<?php
foreach (ucl_rcpts($user, 'mailbox') as $rcpt) {
?>
rcpt = <?=json_encode($rcpt, JSON_UNESCAPED_SLASHES);?>;
<?php
}
?>
apply "default" {
SOGO_CONTACT = -999.0;
}
symbols [
"SOGO_CONTACT"
]
}
<?php
}
/* /*
// Start whitelist // Start whitelist
*/ */
@ -343,7 +418,6 @@ while ($row = array_shift($rows)) {
priority = 9; priority = 9;
want_spam = yes; want_spam = yes;
} }
<?php <?php
// Start additional content // Start additional content
@ -363,5 +437,4 @@ while ($row = array_shift($rows)) {
<?php <?php
} }
?> ?>
} }