From 2847715f76b5c5acc38c449e769a0d59cceac1e3 Mon Sep 17 00:00:00 2001 From: mdecimus Date: Wed, 30 Aug 2023 16:34:07 +0200 Subject: [PATCH] Fixed Sieve redirect of unmodified messages --- crates/smtp/src/scripts/event_loop.rs | 7 +++++- tests/resources/smtp/sieve/stage_data.sieve | 5 ++++ tests/src/smtp/inbound/scripts.rs | 26 ++++++++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/crates/smtp/src/scripts/event_loop.rs b/crates/smtp/src/scripts/event_loop.rs index 20f7cc5b..fa71d9a9 100644 --- a/crates/smtp/src/scripts/event_loop.rs +++ b/crates/smtp/src/scripts/event_loop.rs @@ -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 { diff --git a/tests/resources/smtp/sieve/stage_data.sieve b/tests/resources/smtp/sieve/stage_data.sieve index 195182c1..6ab2b28a 100644 --- a/tests/resources/smtp/sieve/stage_data.sieve +++ b/tests/resources/smtp/sieve/stage_data.sieve @@ -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; diff --git a/tests/src/smtp/inbound/scripts.rs b/tests/src/smtp/inbound/scripts.rs index 8283b198..b4426083 100644 --- a/tests/src/smtp/inbound/scripts.rs +++ b/tests/src/smtp/inbound/scripts.rs @@ -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 "); 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 ") + .assert_contains("Subject: Is dinner ready?") + .assert_contains("Message-ID: <20030712040037.46341.5F8J@football.example.com>") + .assert_contains("From: Joe SixPack "); + qr.assert_empty_queue(); + // Test pipes session.data.remote_ip = "10.0.0.123".parse().unwrap(); session