X-Git-Url: https://git.r.bdr.sh/rbdr/olden-mail/blobdiff_plain/8ab8739c55711caa07b8d7540309cb48cc892369..5bc877d3fa9025180020d0b25104cc22333e6252:/src/middleware/find_mailboxes_compatibility.rs?ds=sidebyside diff --git a/src/middleware/find_mailboxes_compatibility.rs b/src/middleware/find_mailboxes_compatibility.rs index a1ddda2..42db396 100644 --- a/src/middleware/find_mailboxes_compatibility.rs +++ b/src/middleware/find_mailboxes_compatibility.rs @@ -1,9 +1,7 @@ -use log::debug; - use super::Middleware; -/// `MailDrop` can't find folders to sync because it implements IMAPv3 and -/// sends FIND MAILBOXES /*, which does not exist in IMAPv4. +/// `MailDrop` can't find folders to sync because it implements `IMAPv3` and +/// sends FIND MAILBOXES /*, which does not exist in `IMAPv4`. /// which is not understood by modern servers. It instead replaces it with /// a LIST command. pub struct FindMailboxesCompatibility { @@ -22,9 +20,8 @@ impl Middleware for FindMailboxesCompatibility { if command.contains("FIND MAILBOXES /*") { if let Some(tag) = command.split("FIND MAILBOXES /*").next() { // We'll need to convert the LIST to a FIND - self.tags.push(tag.to_string()); + self.tags.push(tag.trim().to_string()); let replacement = format!("{} LIST \"\" \"*\"\r\n", tag.trim()); - debug!("### {replacement}"); return replacement.into_bytes(); } } @@ -36,7 +33,7 @@ impl Middleware for FindMailboxesCompatibility { let contains_ok_completed = self .tags .iter() - .any(|tag| command.contains(&format!("{} OK Completed", tag))); + .any(|tag| command.contains(&format!("{tag} OK Completed"))); // We want to only modify responses that were a result of a MAILBOX call. if !contains_ok_completed { @@ -53,16 +50,20 @@ impl Middleware for FindMailboxesCompatibility { // Transform IMAPv4 "* LIST" lines to IMAPv3 "* MAILBOX" if line.starts_with("* LIST") { - if let Some(last_slash_pos) = line.rfind('/') { - let mailbox_name = line[(last_slash_pos + 1)..].trim(); - return Some(format!("* MAILBOX {}\r", mailbox_name)); + if let Some(last_slash_pos) = line.rfind("\"/\"") { + let mailbox_name = line[(last_slash_pos + 3)..].replace('"', ""); + return Some(format!("* MAILBOX {}\r", mailbox_name.trim())); } } - return Some(line.to_string()); + if line.contains("OK") { + return Some("{tag} OK MAILBOX Completed.".to_string()); + } + + Some(line.to_string()) }) .collect(); - return lines.join("\n").into_bytes(); + lines.join("\n").into_bytes() } }