IMAP: Fix shared folder double nesting (test suite credits to @ochnygosch) (fixes #2358 closes #2525)
This commit is contained in:
@@ -177,7 +177,7 @@ impl<T: SessionStream> SessionData<T> {
|
||||
let mut parent_mailbox_name = None;
|
||||
let (account_id, path) = {
|
||||
let mailboxes = self.mailboxes.lock();
|
||||
let (account, full_path) =
|
||||
let (account, full_path, prefix) =
|
||||
if path.first() == Some(&self.server.core.jmap.shared_folder.as_str()) {
|
||||
// Shared Folders/<username>/<folder>
|
||||
if path.len() < 3 {
|
||||
@@ -201,7 +201,7 @@ impl<T: SessionStream> SessionData<T> {
|
||||
.skip(1)
|
||||
.find(|account| account.prefix == prefix)
|
||||
{
|
||||
(account, full_path)
|
||||
(account, full_path, prefix)
|
||||
} else {
|
||||
#[allow(clippy::unnecessary_literal_unwrap)]
|
||||
return Err(trc::ImapEvent::Error.into_err().details(format!(
|
||||
@@ -215,7 +215,7 @@ impl<T: SessionStream> SessionData<T> {
|
||||
*root = "INBOX";
|
||||
}
|
||||
|
||||
(account, path.join("/"))
|
||||
(account, path.join("/"), None)
|
||||
} else {
|
||||
return Err(trc::ImapEvent::Error
|
||||
.into_err()
|
||||
@@ -241,6 +241,11 @@ impl<T: SessionStream> SessionData<T> {
|
||||
parent_mailbox_id = mailbox_id.into();
|
||||
parent_mailbox_name = mailbox_name.into();
|
||||
break;
|
||||
} else if prefix
|
||||
.as_ref()
|
||||
.is_some_and(|prefix| prefix == &mailbox_name)
|
||||
{
|
||||
break;
|
||||
} else {
|
||||
create_path.push(path.pop().unwrap());
|
||||
}
|
||||
|
||||
@@ -324,6 +324,53 @@ pub async fn test(mut imap: &mut ImapConnection, mut imap_check: &mut ImapConnec
|
||||
// Restore Trash folder's original name
|
||||
imap.send("RENAME \"Recycle Bin\" \"Deleted Items\"").await;
|
||||
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||
|
||||
// Shared folder creation tests
|
||||
let mut imap_jane = ImapConnection::connect(b"_z ").await;
|
||||
imap_jane
|
||||
.authenticate("jane.smith@example.com", "secret")
|
||||
.await;
|
||||
imap_jane
|
||||
.send("CREATE \"Shared Folders/support@example.com/INBOX/Test\"")
|
||||
.await;
|
||||
imap_jane.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||
|
||||
imap_jane
|
||||
.send("CREATE \"Shared Folders/support@example.com/Test\"")
|
||||
.await;
|
||||
imap_jane.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||
|
||||
imap_jane
|
||||
.send("CREATE \"Shared Folders/support@example.com/Test/TestSubfolder\"")
|
||||
.await;
|
||||
imap_jane.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||
imap_jane.send("LIST \"\" \"*\"").await;
|
||||
imap_jane
|
||||
.assert_read(Type::Tagged, ResponseType::Ok)
|
||||
.await
|
||||
.assert_folders(
|
||||
[
|
||||
("INBOX", [""]),
|
||||
("Deleted Items", [""]),
|
||||
("Drafts", [""]),
|
||||
("Junk Mail", [""]),
|
||||
("Sent Items", [""]),
|
||||
("Shared Folders", [""]),
|
||||
("Shared Folders/support@example.com", [""]),
|
||||
("Shared Folders/support@example.com/Deleted Items", [""]),
|
||||
("Shared Folders/support@example.com/Drafts", [""]),
|
||||
("Shared Folders/support@example.com/INBOX", [""]),
|
||||
("Shared Folders/support@example.com/INBOX/Test", [""]),
|
||||
("Shared Folders/support@example.com/Junk Mail", [""]),
|
||||
("Shared Folders/support@example.com/Sent Items", [""]),
|
||||
("Shared Folders/support@example.com/Test", [""]),
|
||||
(
|
||||
"Shared Folders/support@example.com/Test/TestSubfolder",
|
||||
[""],
|
||||
),
|
||||
],
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
||||
fn mailbox_matches_pattern() {
|
||||
|
||||
Reference in New Issue
Block a user