summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormdecimus <mauro@stalw.art>2024-09-20 09:28:04 +0200
committermdecimus <mauro@stalw.art>2024-09-20 09:28:04 +0200
commit39d0a168d480eb5b94bd031dd28fc4ba03d9a42e (patch)
treed1ea81449daaa066566c93c95cea769d9f11b290
parent51c8f7b2796892bb3e365e725ccde9ad89b6103f (diff)
Case insensitive INBOX on fileinto (fixes #763)
-rw-r--r--crates/jmap/src/mailbox/get.rs25
-rw-r--r--tests/resources/jmap/sieve/test_mailbox.sieve2
2 files changed, 20 insertions, 7 deletions
diff --git a/crates/jmap/src/mailbox/get.rs b/crates/jmap/src/mailbox/get.rs
index 7b7ac2ed..069b678d 100644
--- a/crates/jmap/src/mailbox/get.rs
+++ b/crates/jmap/src/mailbox/get.rs
@@ -15,6 +15,8 @@ use trc::AddContext;
use crate::{auth::acl::EffectiveAcl, JMAP};
+use super::INBOX_ID;
+
impl JMAP {
pub async fn mailbox_get(
&self,
@@ -317,16 +319,27 @@ impl JMAP {
}
let mut filter = Vec::with_capacity(path.len() + 2);
+ let mut has_inbox = false;
filter.push(Filter::Or);
- for &item in &path {
- filter.push(Filter::eq(Property::Name, item));
+ for (pos, item) in path.iter().enumerate() {
+ if pos == 0 && item.eq_ignore_ascii_case("inbox") {
+ has_inbox = true;
+ } else {
+ filter.push(Filter::eq(Property::Name, *item));
+ }
}
filter.push(Filter::End);
- let document_ids = self
- .filter(account_id, Collection::Mailbox, filter)
- .await?
- .results;
+ let mut document_ids = if filter.len() > 2 {
+ self.filter(account_id, Collection::Mailbox, filter)
+ .await?
+ .results
+ } else {
+ RoaringBitmap::new()
+ };
+ if has_inbox {
+ document_ids.insert(INBOX_ID);
+ }
if exact_match && (document_ids.len() as usize) < path.len() {
return Ok(None);
}
diff --git a/tests/resources/jmap/sieve/test_mailbox.sieve b/tests/resources/jmap/sieve/test_mailbox.sieve
index 2bd9ddba..4b8a975e 100644
--- a/tests/resources/jmap/sieve/test_mailbox.sieve
+++ b/tests/resources/jmap/sieve/test_mailbox.sieve
@@ -37,7 +37,7 @@ if not mailboxexists ["Drafts", "Sent Items"] {
}
# File into new mailboxes using flags
-fileinto :create "Inbox / Folder ";
+fileinto :create "INBOX / Folder ";
fileinto :flags ["$important", "$seen"] :create "My/Nested/Mailbox/with/multiple/levels";
# Make sure all mailboxes were created