Improve X-Spam-Flag handling

This commit is contained in:
David Bürgin 2021-04-28 17:03:26 +02:00
parent 8ca8701be2
commit a2e9bb1acc
2 changed files with 12 additions and 14 deletions

12
Cargo.lock generated
View file

@ -77,9 +77,9 @@ checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135"
[[package]]
name = "libc"
version = "0.2.86"
version = "0.2.94"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
[[package]]
name = "milter"
@ -148,9 +148,9 @@ checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
[[package]]
name = "proc-macro2"
version = "1.0.24"
version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
dependencies = [
"unicode-xid",
]
@ -184,9 +184,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
[[package]]
name = "syn"
version = "1.0.60"
version = "1.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883"
dependencies = [
"proc-macro2",
"quote",

View file

@ -145,6 +145,7 @@ pub static REPORT_HEADERS: Lazy<HeaderSet<'static>> = Lazy::new(|| {
pub struct HeaderRewriter<'a> {
original: HeaderMap,
processed: HeaderSet<'a>,
spam: Option<bool>,
spam_assassin_mods: Vec<HeaderMod<'a>>,
rewrite_mods: Vec<HeaderMod<'a>>,
report_mods: Vec<HeaderMod<'a>>,
@ -156,6 +157,7 @@ impl<'a> HeaderRewriter<'a> {
Self {
original,
processed: HeaderSet::new(),
spam: None,
spam_assassin_mods: vec![],
rewrite_mods: vec![],
report_mods: vec![],
@ -166,6 +168,9 @@ impl<'a> HeaderRewriter<'a> {
pub fn process_header(&mut self, name: &'a str, value: &'a str) {
// Assumes that the value is normalised to using CRLF line breaks, and
// includes leading whitespace.
if name.eq_ignore_ascii_case("X-Spam-Flag") {
self.spam.get_or_insert_with(|| value.trim().eq_ignore_ascii_case("YES"));
}
if is_spam_assassin_header(name) {
if let Some(m) = self.convert_to_header_mod(name, value) {
self.spam_assassin_mods.push(m);
@ -199,14 +204,7 @@ impl<'a> HeaderRewriter<'a> {
}
pub fn is_flagged_spam(&self) -> bool {
use HeaderMod::*;
self.spam_assassin_mods.iter().any(|m| match m {
Add { name, value } | Replace { name, value } => {
name.eq_ignore_ascii_case("X-Spam-Flag") && value.trim().eq_ignore_ascii_case("YES")
}
_ => false,
})
self.spam == Some(true)
}
pub fn rewrite_spam_assassin_headers(