-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 {
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();
}
}
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 {
// 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()));
+ }
+ }
+
+ if line.contains("OK") {
+ if let Some(tag) = line.split("OK").next() {
+ return Some(format!("{} OK MAILBOX Completed.\r", tag.trim()).to_string());
}
}
- return Some(line.to_string());
+ Some(line.to_string())
})
.collect();
- return lines.join("\n").into_bytes();
+ lines.join("\n").into_bytes()
}
}