Improve X-Spam-Flag handling
This commit is contained in:
parent
8ca8701be2
commit
a2e9bb1acc
2 changed files with 12 additions and 14 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -77,9 +77,9 @@ checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.86"
|
version = "0.2.94"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c"
|
checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "milter"
|
name = "milter"
|
||||||
|
@ -148,9 +148,9 @@ checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.24"
|
version = "1.0.26"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
@ -184,9 +184,9 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.60"
|
version = "1.0.70"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"
|
checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
14
src/email.rs
14
src/email.rs
|
@ -145,6 +145,7 @@ pub static REPORT_HEADERS: Lazy<HeaderSet<'static>> = Lazy::new(|| {
|
||||||
pub struct HeaderRewriter<'a> {
|
pub struct HeaderRewriter<'a> {
|
||||||
original: HeaderMap,
|
original: HeaderMap,
|
||||||
processed: HeaderSet<'a>,
|
processed: HeaderSet<'a>,
|
||||||
|
spam: Option<bool>,
|
||||||
spam_assassin_mods: Vec<HeaderMod<'a>>,
|
spam_assassin_mods: Vec<HeaderMod<'a>>,
|
||||||
rewrite_mods: Vec<HeaderMod<'a>>,
|
rewrite_mods: Vec<HeaderMod<'a>>,
|
||||||
report_mods: Vec<HeaderMod<'a>>,
|
report_mods: Vec<HeaderMod<'a>>,
|
||||||
|
@ -156,6 +157,7 @@ impl<'a> HeaderRewriter<'a> {
|
||||||
Self {
|
Self {
|
||||||
original,
|
original,
|
||||||
processed: HeaderSet::new(),
|
processed: HeaderSet::new(),
|
||||||
|
spam: None,
|
||||||
spam_assassin_mods: vec![],
|
spam_assassin_mods: vec![],
|
||||||
rewrite_mods: vec![],
|
rewrite_mods: vec![],
|
||||||
report_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) {
|
pub fn process_header(&mut self, name: &'a str, value: &'a str) {
|
||||||
// Assumes that the value is normalised to using CRLF line breaks, and
|
// Assumes that the value is normalised to using CRLF line breaks, and
|
||||||
// includes leading whitespace.
|
// 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 is_spam_assassin_header(name) {
|
||||||
if let Some(m) = self.convert_to_header_mod(name, value) {
|
if let Some(m) = self.convert_to_header_mod(name, value) {
|
||||||
self.spam_assassin_mods.push(m);
|
self.spam_assassin_mods.push(m);
|
||||||
|
@ -199,14 +204,7 @@ impl<'a> HeaderRewriter<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_flagged_spam(&self) -> bool {
|
pub fn is_flagged_spam(&self) -> bool {
|
||||||
use HeaderMod::*;
|
self.spam == Some(true)
|
||||||
|
|
||||||
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,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rewrite_spam_assassin_headers(
|
pub fn rewrite_spam_assassin_headers(
|
||||||
|
|
Loading…
Reference in a new issue