diff --git a/src/config.rs b/src/config.rs index 856944aa0..96f633278 100644 --- a/src/config.rs +++ b/src/config.rs @@ -10,7 +10,7 @@ use strum::{EnumProperty, IntoEnumIterator}; use strum_macros::{AsRefStr, Display, EnumIter, EnumProperty, EnumString}; use crate::blob::BlobObject; -use crate::constants::DC_VERSION_STR; +use crate::constants::{self, DC_VERSION_STR}; use crate::contact::addr_cmp; use crate::context::Context; use crate::events::EventType; @@ -596,6 +596,12 @@ impl Context { .set_raw_config(key.as_ref(), value.map(|s| s.to_lowercase()).as_deref()) .await?; } + Config::MvboxMove => { + self.sql.set_raw_config(key.as_ref(), value).await?; + self.sql + .set_raw_config(constants::DC_FOLDERS_CONFIGURED_KEY, None) + .await?; + } _ => { self.sql.set_raw_config(key.as_ref(), value).await?; } diff --git a/src/constants.rs b/src/constants.rs index 61bc4909c..e5bd61286 100644 --- a/src/constants.rs +++ b/src/constants.rs @@ -206,6 +206,8 @@ pub(crate) const WORSE_AVATAR_SIZE: u32 = 128; pub const BALANCED_IMAGE_SIZE: u32 = 1280; pub const WORSE_IMAGE_SIZE: u32 = 640; +// Key for the folder configuration version (see below). +pub(crate) const DC_FOLDERS_CONFIGURED_KEY: &str = "folders_configured"; // this value can be increased if the folder configuration is changed and must be redone on next program start pub(crate) const DC_FOLDERS_CONFIGURED_VERSION: i32 = 4; diff --git a/src/context.rs b/src/context.rs index 1832ae2de..bdd11a548 100644 --- a/src/context.rs +++ b/src/context.rs @@ -18,7 +18,7 @@ use crate::aheader::EncryptPreference; use crate::chat::{get_chat_cnt, ChatId, ProtectionStatus}; use crate::config::Config; use crate::constants::{ - DC_BACKGROUND_FETCH_QUOTA_CHECK_RATELIMIT, DC_CHAT_ID_TRASH, DC_VERSION_STR, + self, DC_BACKGROUND_FETCH_QUOTA_CHECK_RATELIMIT, DC_CHAT_ID_TRASH, DC_VERSION_STR, }; use crate::contact::Contact; use crate::debug_logging::DebugLogging; @@ -672,7 +672,7 @@ impl Context { let only_fetch_mvbox = self.get_config_int(Config::OnlyFetchMvbox).await?; let folders_configured = self .sql - .get_raw_config_int("folders_configured") + .get_raw_config_int(constants::DC_FOLDERS_CONFIGURED_KEY) .await? .unwrap_or_default(); @@ -764,7 +764,10 @@ impl Context { res.insert("sentbox_watch", sentbox_watch.to_string()); res.insert("mvbox_move", mvbox_move.to_string()); res.insert("only_fetch_mvbox", only_fetch_mvbox.to_string()); - res.insert("folders_configured", folders_configured.to_string()); + res.insert( + constants::DC_FOLDERS_CONFIGURED_KEY, + folders_configured.to_string(), + ); res.insert("configured_inbox_folder", configured_inbox_folder); res.insert("configured_sentbox_folder", configured_sentbox_folder); res.insert("configured_mvbox_folder", configured_mvbox_folder); diff --git a/src/imap.rs b/src/imap.rs index 3fe64b15f..a97c2db2f 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -22,9 +22,7 @@ use tokio::sync::RwLock; use crate::chat::{self, ChatId, ChatIdBlocked}; use crate::config::Config; -use crate::constants::{ - Blocked, Chattype, ShowEmails, DC_FETCH_EXISTING_MSGS_COUNT, DC_FOLDERS_CONFIGURED_VERSION, -}; +use crate::constants::{self, Blocked, Chattype, ShowEmails, DC_FETCH_EXISTING_MSGS_COUNT}; use crate::contact::{normalize_name, Contact, ContactAddress, ContactId, Modifier, Origin}; use crate::context::Context; use crate::events::EventType; @@ -1767,11 +1765,17 @@ impl Imap { context: &Context, create_mvbox: bool, ) -> Result<()> { - let folders_configured = context.sql.get_raw_config_int("folders_configured").await?; - if folders_configured.unwrap_or_default() >= DC_FOLDERS_CONFIGURED_VERSION { + let folders_configured = context + .sql + .get_raw_config_int(constants::DC_FOLDERS_CONFIGURED_KEY) + .await?; + if folders_configured.unwrap_or_default() >= constants::DC_FOLDERS_CONFIGURED_VERSION { return Ok(()); } - + if let Err(err) = self.connect(context).await { + self.connectivity.set_err(context, &err).await; + return Err(err); + } self.configure_folders(context, create_mvbox).await } @@ -1893,7 +1897,10 @@ impl Imap { } context .sql - .set_raw_config_int("folders_configured", DC_FOLDERS_CONFIGURED_VERSION) + .set_raw_config_int( + constants::DC_FOLDERS_CONFIGURED_KEY, + constants::DC_FOLDERS_CONFIGURED_VERSION, + ) .await?; info!(context, "FINISHED configuring IMAP-folders."); diff --git a/src/scheduler.rs b/src/scheduler.rs index ed50b504e..6a00fb5ce 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -521,6 +521,20 @@ pub async fn convert_folder_meaning( /// critical operation fails such as fetching new messages fails, connection is reset via /// `trigger_reconnect`, so a fresh one can be opened. async fn fetch_idle(ctx: &Context, connection: &mut Imap, folder_meaning: FolderMeaning) { + let create_mvbox = true; + if let Err(err) = connection + .ensure_configured_folders(ctx, create_mvbox) + .await + { + warn!( + ctx, + "Cannot watch {folder_meaning}, ensure_configured_folders() failed: {:#}", err, + ); + connection + .fake_idle(ctx, None, FolderMeaning::Unknown) + .await; + return; + } let (folder_config, watch_folder) = match convert_folder_meaning(ctx, folder_meaning).await { Ok(meaning) => meaning, Err(error) => {