mirror of
https://github.com/stalwartlabs/mail-server.git
synced 2025-12-17 12:59:01 +08:00
Normalize INBOX name when creating/renaming folders (fixes #1636)
This commit is contained in:
parent
10e932a43a
commit
d4ec6e32b3
3 changed files with 45 additions and 36 deletions
|
|
@ -20,7 +20,7 @@ fn main() {
|
||||||
|
|
||||||
fs::write(&dest_path, generated_code).expect("Failed to write generated locales");
|
fs::write(&dest_path, generated_code).expect("Failed to write generated locales");
|
||||||
|
|
||||||
println!("cargo:rerun-if-changed={yaml_path:?}");
|
println!("cargo:rerun-if-changed={}", yaml_path.display());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_yaml(content: &str) -> HashMap<String, HashMap<String, String>> {
|
fn parse_yaml(content: &str) -> HashMap<String, HashMap<String, String>> {
|
||||||
|
|
|
||||||
|
|
@ -175,12 +175,12 @@ impl<T: SessionStream> SessionData<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate special folders
|
// Validate special folders
|
||||||
let full_path: String = path.join("/");
|
|
||||||
let mut parent_mailbox_id = None;
|
let mut parent_mailbox_id = None;
|
||||||
let mut parent_mailbox_name = None;
|
let mut parent_mailbox_name = None;
|
||||||
let (account_id, path) = {
|
let (account_id, path) = {
|
||||||
let mailboxes = self.mailboxes.lock();
|
let mailboxes = self.mailboxes.lock();
|
||||||
let account = if path.first() == Some(&self.server.core.jmap.shared_folder.as_str()) {
|
let (account, full_path) =
|
||||||
|
if path.first() == Some(&self.server.core.jmap.shared_folder.as_str()) {
|
||||||
// Shared Folders/<username>/<folder>
|
// Shared Folders/<username>/<folder>
|
||||||
if path.len() < 3 {
|
if path.len() < 3 {
|
||||||
return Err(trc::ImapEvent::Error
|
return Err(trc::ImapEvent::Error
|
||||||
|
|
@ -188,6 +188,12 @@ impl<T: SessionStream> SessionData<T> {
|
||||||
.details("Mailboxes under root shared folders are not allowed.")
|
.details("Mailboxes under root shared folders are not allowed.")
|
||||||
.code(ResponseCode::Cannot));
|
.code(ResponseCode::Cannot));
|
||||||
}
|
}
|
||||||
|
// Build path
|
||||||
|
let root = &mut path[2];
|
||||||
|
if root.eq_ignore_ascii_case("INBOX") {
|
||||||
|
*root = "INBOX";
|
||||||
|
}
|
||||||
|
let full_path = path.join("/");
|
||||||
let prefix = Some(format!("{}/{}", path.remove(0), path.remove(0)));
|
let prefix = Some(format!("{}/{}", path.remove(0), path.remove(0)));
|
||||||
|
|
||||||
// Locate account
|
// Locate account
|
||||||
|
|
@ -196,7 +202,7 @@ impl<T: SessionStream> SessionData<T> {
|
||||||
.skip(1)
|
.skip(1)
|
||||||
.find(|account| account.prefix == prefix)
|
.find(|account| account.prefix == prefix)
|
||||||
{
|
{
|
||||||
account
|
(account, full_path)
|
||||||
} else {
|
} else {
|
||||||
#[allow(clippy::unnecessary_literal_unwrap)]
|
#[allow(clippy::unnecessary_literal_unwrap)]
|
||||||
return Err(trc::ImapEvent::Error.into_err().details(format!(
|
return Err(trc::ImapEvent::Error.into_err().details(format!(
|
||||||
|
|
@ -205,7 +211,12 @@ impl<T: SessionStream> SessionData<T> {
|
||||||
)));
|
)));
|
||||||
}
|
}
|
||||||
} else if let Some(account) = mailboxes.first() {
|
} else if let Some(account) = mailboxes.first() {
|
||||||
account
|
let root = &mut path[0];
|
||||||
|
if root.eq_ignore_ascii_case("INBOX") {
|
||||||
|
*root = "INBOX";
|
||||||
|
}
|
||||||
|
|
||||||
|
(account, path.join("/"))
|
||||||
} else {
|
} else {
|
||||||
return Err(trc::ImapEvent::Error
|
return Err(trc::ImapEvent::Error
|
||||||
.into_err()
|
.into_err()
|
||||||
|
|
@ -270,7 +281,6 @@ impl<T: SessionStream> SessionData<T> {
|
||||||
Ok(CreateParams {
|
Ok(CreateParams {
|
||||||
account_id,
|
account_id,
|
||||||
path,
|
path,
|
||||||
full_path,
|
|
||||||
parent_mailbox_id,
|
parent_mailbox_id,
|
||||||
parent_mailbox_name,
|
parent_mailbox_name,
|
||||||
special_use: if let Some(mailbox_role) = mailbox_role {
|
special_use: if let Some(mailbox_role) = mailbox_role {
|
||||||
|
|
@ -305,7 +315,6 @@ impl<T: SessionStream> SessionData<T> {
|
||||||
pub struct CreateParams<'x> {
|
pub struct CreateParams<'x> {
|
||||||
pub account_id: u32,
|
pub account_id: u32,
|
||||||
pub path: Vec<&'x str>,
|
pub path: Vec<&'x str>,
|
||||||
pub full_path: String,
|
|
||||||
pub parent_mailbox_id: Option<u32>,
|
pub parent_mailbox_id: Option<u32>,
|
||||||
pub parent_mailbox_name: Option<String>,
|
pub parent_mailbox_name: Option<String>,
|
||||||
pub special_use: Option<Attribute>,
|
pub special_use: Option<Attribute>,
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ pub async fn test(mut imap: &mut ImapConnection, mut imap_check: &mut ImapConnec
|
||||||
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||||
imap.send("RENAME \"Tofu\" \"INBOX\"").await;
|
imap.send("RENAME \"Tofu\" \"INBOX\"").await;
|
||||||
imap.assert_read(Type::Tagged, ResponseType::No).await;
|
imap.assert_read(Type::Tagged, ResponseType::No).await;
|
||||||
imap.send("RENAME \"Tofu\" \"INBOX/Tofu\"").await;
|
imap.send("RENAME \"Tofu\" \"Inbox/Tofu\"").await;
|
||||||
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||||
imap.send("RENAME \"Deleted Items\" \"Recycle Bin\"").await;
|
imap.send("RENAME \"Deleted Items\" \"Recycle Bin\"").await;
|
||||||
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
imap.assert_read(Type::Tagged, ResponseType::Ok).await;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue