From a2e9bb1acc3a526ee2c9f7dcfae6122532577063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BCrgin?= Date: Wed, 28 Apr 2021 17:03:26 +0200 Subject: [PATCH] Improve X-Spam-Flag handling --- Cargo.lock | 12 ++++++------ src/email.rs | 14 ++++++-------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c498450..07b446e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", diff --git a/src/email.rs b/src/email.rs index c1b414a..86539f3 100644 --- a/src/email.rs +++ b/src/email.rs @@ -145,6 +145,7 @@ pub static REPORT_HEADERS: Lazy> = Lazy::new(|| { pub struct HeaderRewriter<'a> { original: HeaderMap, processed: HeaderSet<'a>, + spam: Option, spam_assassin_mods: Vec>, rewrite_mods: Vec>, report_mods: Vec>, @@ -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(