diff --git a/CHANGELOG.md b/CHANGELOG.md index 605e5f59..de1a36dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If - `VacationResponse/set`: incorrect singleton handling. - OIDC: Add default domain name to groups that are not email addresses. - RocksDB: Enable blob garbage collection to reclaim disk space from deleted blobs. +- Sieve: `include` statements ignore capitalisation of sub-script names (#1643) ## [0.16.9] - 2026-06-15 diff --git a/crates/email/src/sieve/ingest.rs b/crates/email/src/sieve/ingest.rs index 6d85bb4d..80f36fcb 100644 --- a/crates/email/src/sieve/ingest.rs +++ b/crates/email/src/sieve/ingest.rs @@ -611,7 +611,7 @@ impl SieveScriptIngest for Server { account_id, Collection::SieveScript, SieveField::Name, - name.as_bytes(), + name.to_lowercase().as_bytes(), ) .await .caused_by(trc::location!())? diff --git a/tests/resources/jmap/sieve/test_include_case.sieve b/tests/resources/jmap/sieve/test_include_case.sieve new file mode 100644 index 00000000..27c10c01 --- /dev/null +++ b/tests/resources/jmap/sieve/test_include_case.sieve @@ -0,0 +1,5 @@ +require ["include", "ihave"]; + +include :personal "Test Script"; + +error "'stop' within included script ignored or mixed-case include failed."; diff --git a/tests/src/jmap/mail/sieve_script.rs b/tests/src/jmap/mail/sieve_script.rs index bb20681f..ff232899 100644 --- a/tests/src/jmap/mail/sieve_script.rs +++ b/tests/src/jmap/mail/sieve_script.rs @@ -339,6 +339,49 @@ pub async fn test(test: &TestServer) { ) .await; + client + .sieve_script_create( + "Test Script", + concat!( + "require \"reject\";\n", + "reject \"Rejected from a mixed-case included script.\";\n", + "stop;\n" + ) + .as_bytes() + .to_vec(), + false, + ) + .await + .unwrap(); + client + .sieve_script_create("test_include_case", get_script("test_include_case"), true) + .await + .unwrap(); + lmtp.ingest( + "bill@remote.org", + &["jdoe@example.com"], + concat!( + "From: bill@remote.org\r\n", + "Bcc: Undisclosed recipients;\r\n", + "Message-ID: <5678@example.com>\r\n", + "Subject: Holidays\r\n", + "\r\n", + "Remember to file your T.P.S. reports before ", + "going on holidays." + ), + ) + .await; + + assert_message_delivery( + &mut smtp_rx, + MockMessage::new( + "<>", + [""], + "@Rejected from a mixed-case included script", + ), + ) + .await; + // Run include global tests client .sieve_script_create(