mirror of
https://github.com/stalwartlabs/mail-server.git
synced 2025-12-19 22:09:26 +08:00
Improve SPOOF_DISPLAY_NAME detection (fixes #982)
This commit is contained in:
parent
7cca6fc298
commit
1726d68018
2 changed files with 49 additions and 12 deletions
|
|
@ -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,22 +82,37 @@ 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_addr_is_valid
|
if from_name_trimmed.contains('@') {
|
||||||
&& from_name_addr.domain_part.sld != from_addr.domain_part.sld)
|
if let Some(from_name_addr) = TypesTokenizer::new(from_name_trimmed)
|
||||||
|| (!env_from_empty
|
.tokenize_numbers(false)
|
||||||
&& ctx.output.env_from_addr.domain_part.sld
|
.tokenize_urls(false)
|
||||||
!= from_name_addr.domain_part.sld)
|
.tokenize_urls_without_scheme(false)
|
||||||
|| (env_from_empty
|
.tokenize_emails(true)
|
||||||
&& ctx.output.ehlo_host.sld != from_name_addr.domain_part.sld)
|
.filter_map(|t| match t.word {
|
||||||
|
TokenType::Email(email) => {
|
||||||
|
let email = Email::new(email);
|
||||||
|
email.is_valid().then_some(email)
|
||||||
|
}
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
.next()
|
||||||
{
|
{
|
||||||
ctx.result.add_tag("SPOOF_DISPLAY_NAME");
|
if (from_addr_is_valid
|
||||||
} else {
|
&& from_name_addr.domain_part.sld != from_addr.domain_part.sld)
|
||||||
ctx.result.add_tag("FROM_NEQ_DISPLAY_NAME");
|
|| (!env_from_empty
|
||||||
|
&& ctx.output.env_from_addr.domain_part.sld
|
||||||
|
!= from_name_addr.domain_part.sld)
|
||||||
|
|| (env_from_empty
|
||||||
|
&& ctx.output.ehlo_host.sld != from_name_addr.domain_part.sld)
|
||||||
|
{
|
||||||
|
ctx.result.add_tag("SPOOF_DISPLAY_NAME");
|
||||||
|
} else {
|
||||||
|
ctx.result.add_tag("FROM_NEQ_DISPLAY_NAME");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue