MTA: Do not convert e-mail local parts to lowercase (fixes #1916)

This commit is contained in:
mdecimus
2025-07-27 11:26:02 +02:00
parent ce98e6d0ff
commit a2ea0f6cee
23 changed files with 161 additions and 117 deletions

View File

@@ -175,7 +175,7 @@ async fn dmarc() {
// Expect SPF auth failure report
let message = qr.expect_message().await;
assert_eq!(
message.message.recipients.last().unwrap().address,
message.message.recipients.last().unwrap().address(),
"spf-failures@example.com"
);
message
@@ -206,7 +206,7 @@ async fn dmarc() {
// Expect DKIM auth failure report
let message = qr.expect_message().await;
assert_eq!(
message.message.recipients.last().unwrap().address,
message.message.recipients.last().unwrap().address(),
"dkim-failures@example.com"
);
message
@@ -257,7 +257,7 @@ async fn dmarc() {
// Expect DMARC auth failure report
let message = qr.expect_message().await;
assert_eq!(
message.message.recipients.last().unwrap().address,
message.message.recipients.last().unwrap().address(),
"dmarc-failures@example.com"
);
message

View File

@@ -246,11 +246,11 @@ async fn sieve_scripts() {
assert_eq!(notification.message.return_path, "");
assert_eq!(notification.message.recipients.len(), 2);
assert_eq!(
notification.message.recipients.first().unwrap().address,
notification.message.recipients.first().unwrap().address(),
"john@example.net"
);
assert_eq!(
notification.message.recipients.last().unwrap().address,
notification.message.recipients.last().unwrap().address(),
"jane@example.org"
);
notification
@@ -326,7 +326,7 @@ async fn sieve_scripts() {
assert_eq!(redirect.message.return_path, "");
assert_eq!(redirect.message.recipients.len(), 1);
assert_eq!(
redirect.message.recipients.first().unwrap().address,
redirect.message.recipients.first().unwrap().address(),
"redirect@here.email"
);
redirect
@@ -354,7 +354,7 @@ async fn sieve_scripts() {
assert_eq!(redirect.message.return_path, "");
assert_eq!(redirect.message.recipients.len(), 1);
assert_eq!(
redirect.message.recipients.first().unwrap().address,
redirect.message.recipients.first().unwrap().address(),
"redirect@somewhere.email"
);
redirect

View File

@@ -170,9 +170,9 @@ async fn manage_queue() {
.message
.recipients
.into_iter()
.map(|r| r.address)
.map(|r| r.address().to_string())
.collect::<Vec<_>>(),
vec!["success@foobar.org".to_string()]
vec!["success@foobar.org"]
);
// Fetch and validate messages
@@ -322,7 +322,7 @@ async fn manage_queue() {
.message
.recipients
.into_iter()
.map(|r| r.address)
.map(|r| r.address().to_string())
.collect::<Vec<_>>(),
vec!["john@foobar.org".to_string()]
);

View File

@@ -193,7 +193,7 @@ async fn lmtp_delivery() {
.message
.recipients
.into_iter()
.map(|r| r.address)
.map(|r| r.address().to_string())
.collect::<Vec<_>>(),
vec![
"bill@foobar.org".to_string(),

View File

@@ -260,7 +260,7 @@ async fn smtp_delivery() {
.message
.recipients
.into_iter()
.map(|r| r.address)
.map(|r| r.address().to_string())
.collect::<Vec<_>>();
recipients.extend(
remote
@@ -270,7 +270,7 @@ async fn smtp_delivery() {
.message
.recipients
.into_iter()
.map(|r| r.address),
.map(|r| r.address().to_string()),
);
recipients.sort();
assert_eq!(

View File

@@ -11,7 +11,7 @@ use crate::smtp::{
session::TestSession,
};
use mail_auth::MX;
use smtp::queue::{DomainPart, Message, QueueEnvelope, Recipient, throttle::IsAllowed};
use smtp::queue::{Message, QueueEnvelope, Recipient, throttle::IsAllowed};
use std::{
net::{IpAddr, Ipv4Addr},
time::{Duration, Instant},
@@ -286,7 +286,7 @@ impl<'x> TestQueueEnvelope<'x> for QueueEnvelope<'x> {
mx,
remote_ip: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
local_ip: IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)),
domain: rcpt.address.domain_part(),
domain: rcpt.domain_part(),
rcpt,
}
}

View File

@@ -220,14 +220,14 @@ impl TestMessage for Message {
fn rcpt(&self, name: &str) -> &Recipient {
self.recipients
.iter()
.find(|d| d.address == name)
.find(|d| d.address() == name)
.unwrap_or_else(|| panic!("Expected rcpt {name} not found in {:?}", self.recipients))
}
fn rcpt_mut(&mut self, name: &str) -> &mut Recipient {
self.recipients
.iter_mut()
.find(|d| d.address == name)
.find(|d| d.address() == name)
.unwrap()
}
}

View File

@@ -75,7 +75,7 @@ async fn queue_retry() {
let message = qr.expect_message().await;
assert_eq!(message.message.return_path, "");
assert_eq!(
message.message.recipients.first().unwrap().address,
message.message.recipients.first().unwrap().address(),
"john@test.org"
);
message

View File

@@ -113,7 +113,7 @@ async fn report_dmarc() {
qr.assert_no_events();
assert_eq!(message.message.recipients.len(), 1);
assert_eq!(
message.message.recipients.last().unwrap().address,
message.message.recipients.last().unwrap().address(),
"reports@foobar.net"
);
assert_eq!(message.message.return_path, "reports@example.org");

View File

@@ -112,7 +112,7 @@ async fn report_tls() {
// Expect report
let message = qr.expect_message().await;
assert_eq!(
message.message.recipients.last().unwrap().address,
message.message.recipients.last().unwrap().address(),
"reports@foobar.org"
);
assert_eq!(message.message.return_path, "reports@example.org");

View File

@@ -267,7 +267,7 @@ impl TestSession for Session<DummyIo> {
let rcpts = ["a@foobar.org", "b@test.net", "c@foobar.org", "d@test.net"];
for rcpt in &message.message.recipients {
let idx = (rcpt.flags - 1) as usize;
assert_eq!(rcpts[idx], rcpt.address);
assert_eq!(rcpts[idx], rcpt.address());
}
}
}