Fixed Sieve redirect of unmodified messages

This commit is contained in:
mdecimus
2023-08-30 16:34:07 +02:00
parent 4238c1409e
commit 2847715f76
3 changed files with 36 additions and 2 deletions

View File

@@ -278,7 +278,12 @@ impl SMTP {
}
// Queue message
if let Some(raw_message) = messages.get(message_id - 1) {
let raw_message = if message_id > 0 {
messages.get(message_id - 1).map(|m| m.as_slice())
} else {
instance.message().raw_message().into()
};
if let Some(raw_message) = raw_message {
let headers = if !self.sieve.config.sign.is_empty() {
let mut headers = Vec::new();
for dkim in &self.sieve.config.sign {

View File

@@ -7,6 +7,11 @@ if envelope :localpart :is "to" "thomas" {
discard;
}
if envelope :localpart :is "to" "bob" {
redirect "redirect@somewhere.email";
discard;
}
if envelope :localpart :is "to" "bill" {
reject "Bill cannot receive messages.";
stop;

View File

@@ -320,7 +320,6 @@ async fn sieve_scripts() {
redirect.recipients.first().unwrap().address,
"redirect@here.email"
);
redirect
.read_lines()
.assert_contains("From: no-reply@my.domain")
@@ -330,6 +329,31 @@ async fn sieve_scripts() {
.assert_not_contains("From: Joe SixPack <joe@football.example.com>");
qr.assert_empty_queue();
// Expect an intact redirected message
session
.send_message(
"test@example.net",
&["bob@foobar.gov"],
"test:no_dkim",
"250",
)
.await;
let redirect = qr.read_event().await.unwrap_message();
assert_eq!(redirect.return_path, "");
assert_eq!(redirect.recipients.len(), 1);
assert_eq!(
redirect.recipients.first().unwrap().address,
"redirect@somewhere.email"
);
redirect
.read_lines()
.assert_not_contains("From: no-reply@my.domain")
.assert_contains("To: Suzie Q <suzie@shopping.example.net>")
.assert_contains("Subject: Is dinner ready?")
.assert_contains("Message-ID: <20030712040037.46341.5F8J@football.example.com>")
.assert_contains("From: Joe SixPack <joe@football.example.com>");
qr.assert_empty_queue();
// Test pipes
session.data.remote_ip = "10.0.0.123".parse().unwrap();
session