mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 09:26:29 +03:00
Check for MOVE capability before using MOVE command
This commit is contained in:
@@ -182,6 +182,10 @@ struct ImapConfig {
|
|||||||
pub selected_mailbox: Option<Mailbox>,
|
pub selected_mailbox: Option<Mailbox>,
|
||||||
pub selected_folder_needs_expunge: bool,
|
pub selected_folder_needs_expunge: bool,
|
||||||
pub can_idle: bool,
|
pub can_idle: bool,
|
||||||
|
|
||||||
|
/// True if the server has MOVE capability as defined in
|
||||||
|
/// https://tools.ietf.org/html/rfc6851
|
||||||
|
pub can_move: bool,
|
||||||
pub imap_delimiter: char,
|
pub imap_delimiter: char,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,6 +203,7 @@ impl Default for ImapConfig {
|
|||||||
selected_mailbox: None,
|
selected_mailbox: None,
|
||||||
selected_folder_needs_expunge: false,
|
selected_folder_needs_expunge: false,
|
||||||
can_idle: false,
|
can_idle: false,
|
||||||
|
can_move: false,
|
||||||
imap_delimiter: '.',
|
imap_delimiter: '.',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -352,6 +357,7 @@ impl Imap {
|
|||||||
cfg.imap_port = 0;
|
cfg.imap_port = 0;
|
||||||
|
|
||||||
cfg.can_idle = false;
|
cfg.can_idle = false;
|
||||||
|
cfg.can_move = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Connects to imap account using already-configured parameters.
|
/// Connects to imap account using already-configured parameters.
|
||||||
@@ -412,6 +418,7 @@ impl Imap {
|
|||||||
true
|
true
|
||||||
} else {
|
} else {
|
||||||
let can_idle = caps.has_str("IDLE");
|
let can_idle = caps.has_str("IDLE");
|
||||||
|
let can_move = caps.has_str("MOVE");
|
||||||
let caps_list = caps.iter().fold(String::new(), |s, c| {
|
let caps_list = caps.iter().fold(String::new(), |s, c| {
|
||||||
if let Capability::Atom(x) = c {
|
if let Capability::Atom(x) = c {
|
||||||
s + &format!(" {}", x)
|
s + &format!(" {}", x)
|
||||||
@@ -421,6 +428,7 @@ impl Imap {
|
|||||||
});
|
});
|
||||||
|
|
||||||
self.config.write().await.can_idle = can_idle;
|
self.config.write().await.can_idle = can_idle;
|
||||||
|
self.config.write().await.can_move = can_move;
|
||||||
*self.connected.lock().await = true;
|
*self.connected.lock().await = true;
|
||||||
emit_event!(
|
emit_event!(
|
||||||
context,
|
context,
|
||||||
@@ -786,6 +794,10 @@ impl Imap {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn can_move(&self) -> bool {
|
||||||
|
task::block_on(async move { self.config.read().await.can_move })
|
||||||
|
}
|
||||||
|
|
||||||
pub fn mv(
|
pub fn mv(
|
||||||
&self,
|
&self,
|
||||||
context: &Context,
|
context: &Context,
|
||||||
@@ -815,6 +827,8 @@ impl Imap {
|
|||||||
|
|
||||||
let set = format!("{}", uid);
|
let set = format!("{}", uid);
|
||||||
let display_folder_id = format!("{}/{}", folder, uid);
|
let display_folder_id = format!("{}/{}", folder, uid);
|
||||||
|
|
||||||
|
if self.can_move() {
|
||||||
if let Some(ref mut session) = &mut *self.session.lock().await {
|
if let Some(ref mut session) = &mut *self.session.lock().await {
|
||||||
match session.uid_mv(&set, &dest_folder).await {
|
match session.uid_mv(&set, &dest_folder).await {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
@@ -841,6 +855,15 @@ impl Imap {
|
|||||||
} else {
|
} else {
|
||||||
unreachable!();
|
unreachable!();
|
||||||
};
|
};
|
||||||
|
} else {
|
||||||
|
info!(
|
||||||
|
context,
|
||||||
|
"Server does not support MOVE, fallback to COPY/DELETE {}/{} to {}",
|
||||||
|
folder,
|
||||||
|
uid,
|
||||||
|
dest_folder
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(ref mut session) = &mut *self.session.lock().await {
|
if let Some(ref mut session) = &mut *self.session.lock().await {
|
||||||
match session.uid_copy(&set, &dest_folder).await {
|
match session.uid_copy(&set, &dest_folder).await {
|
||||||
|
|||||||
Reference in New Issue
Block a user