Improve SPOOF_DISPLAY_NAME detection (fixes #982)

This commit is contained in:
mdecimus 2024-12-23 12:22:42 +01:00
parent 7cca6fc298
commit 1726d68018
2 changed files with 49 additions and 12 deletions

View file

@ -8,6 +8,7 @@ use std::future::Future;
use common::Server; use common::Server;
use mail_parser::HeaderName; use mail_parser::HeaderName;
use nlp::tokenizers::types::{TokenType, TypesTokenizer};
use smtp_proto::{MAIL_BODY_8BITMIME, MAIL_BODY_BINARYMIME, MAIL_SMTPUTF8}; use smtp_proto::{MAIL_BODY_8BITMIME, MAIL_BODY_BINARYMIME, MAIL_SMTPUTF8};
use crate::{Email, SpamFilterContext}; use crate::{Email, SpamFilterContext};
@ -81,11 +82,25 @@ impl SpamFilterAnalyzeFrom for Server {
} else if from_name_trimmed == from_addr.address { } else if from_name_trimmed == from_addr.address {
ctx.result.add_tag("FROM_DN_EQ_ADDR"); ctx.result.add_tag("FROM_DN_EQ_ADDR");
} else { } else {
let from_name_addr = Email::new(from_name_trimmed);
if from_addr_is_valid { if from_addr_is_valid {
ctx.result.add_tag("FROM_HAS_DN"); ctx.result.add_tag("FROM_HAS_DN");
} }
if from_name_addr.is_valid() {
if from_name_trimmed.contains('@') {
if let Some(from_name_addr) = TypesTokenizer::new(from_name_trimmed)
.tokenize_numbers(false)
.tokenize_urls(false)
.tokenize_urls_without_scheme(false)
.tokenize_emails(true)
.filter_map(|t| match t.word {
TokenType::Email(email) => {
let email = Email::new(email);
email.is_valid().then_some(email)
}
_ => None,
})
.next()
{
if (from_addr_is_valid if (from_addr_is_valid
&& from_name_addr.domain_part.sld != from_addr.domain_part.sld) && from_name_addr.domain_part.sld != from_addr.domain_part.sld)
|| (!env_from_empty || (!env_from_empty
@ -100,6 +115,7 @@ impl SpamFilterAnalyzeFrom for Server {
} }
} }
} }
}
// Check sender // Check sender
if ctx.output.env_from_postmaster { if ctx.output.env_from_postmaster {

View file

@ -178,3 +178,24 @@ expect FROMHOST_NORES_A_OR_MX FROM_EQ_ENVFROM FROM_NO_DN
From: hello@nomx.org From: hello@nomx.org
Test Test
<!-- NEXT TEST -->
envelope_from baz@domain.org
expect SPOOF_DISPLAY_NAME FROM_HAS_DN FROM_EQ_ENVFROM
From: "Foo (foo@bar.com)" <baz@domain.org>
Test
<!-- NEXT TEST -->
envelope_from baz@domain.org
expect SPOOF_DISPLAY_NAME FROM_HAS_DN FROM_EQ_ENVFROM
From: "Foo foo@bar.com" <baz@domain.org>
Test
<!-- NEXT TEST -->
envelope_from baz@domain.org
expect SPOOF_DISPLAY_NAME FROM_HAS_DN FROM_EQ_ENVFROM
From: "Foo 'foo@bar.com'" <baz@domain.org>
Test