diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index 33909b8dbf..c8526e68d6 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -1755,12 +1755,12 @@ def test_group_quote(acfactory, lp): "xyz", False, "xyz", - ), # Test that emails aren't found in a random folder + ), # Test that emails are recognized in a random folder but not moved ( - "Spam", + "xyz", True, "DeltaChat", - ), # ...emails are moved from the spam folder to "DeltaChat" + ), # ...emails are found in a random folder and moved to DeltaChat ( "Spam", False, @@ -1785,7 +1785,7 @@ def test_scan_folders(acfactory, lp, folder, move, expected_destination): ac1.stop_io() assert folder in ac1.direct_imap.list_folders() - lp.sec("Send a message to from ac2 to ac1 and manually move it to `folder`") + lp.sec("Send a message to from ac2 to ac1 and manually move it to the mvbox") ac1.direct_imap.select_config_folder("inbox") with ac1.direct_imap.idle() as idle1: acfactory.get_accepted_chat(ac2, ac1).send_text("hello") @@ -1795,17 +1795,10 @@ def test_scan_folders(acfactory, lp, folder, move, expected_destination): lp.sec("start_io() and see if DeltaChat finds the message (" + variant + ")") ac1.set_config("scan_all_folders_debounce_secs", "0") ac1.start_io() - chat = ac1.create_chat(ac2) - n_msgs = 1 # "Messages are end-to-end encrypted." - if folder == "Spam": - msg = ac1._evtracker.wait_next_incoming_message() - assert msg.text == "hello" - n_msgs += 1 - else: - ac1._evtracker.wait_idle_inbox_ready() - assert len(chat.get_messages()) == n_msgs - - # The message has reached its destination. + msg = ac1._evtracker.wait_next_incoming_message() + assert msg.text == "hello" + + # The message has been downloaded, which means it has reached its destination. ac1.direct_imap.select_folder(expected_destination) assert len(ac1.direct_imap.get_all_messages()) == 1 if folder != expected_destination: diff --git a/src/config.rs b/src/config.rs index fa5acc0bd8..11d7d92d58 100644 --- a/src/config.rs +++ b/src/config.rs @@ -165,11 +165,11 @@ pub enum Config { #[strum(props(default = "1"))] MvboxMove, - /// Watch for new messages in the "Mvbox" (aka DeltaChat folder) only. + /// Only watch the mvbox (aka DeltaChat folder) and, if `MvboxMove` is set, Inbox. /// /// This will not entirely disable other folders, e.g. the spam folder will also still - /// be watched for new messages. - #[strum(props(default = "0"))] + /// be scanned for new messages. + #[strum(props(default = "1"))] OnlyFetchMvbox, /// Whether to show classic emails or only chat messages. diff --git a/src/imap.rs b/src/imap.rs index e10be9e4ae..2a6cc218e0 100644 --- a/src/imap.rs +++ b/src/imap.rs @@ -825,10 +825,7 @@ impl Session { .context("listing folders for resync")?; for folder in all_folders { let folder_meaning = get_folder_meaning(&folder); - if !matches!( - folder_meaning, - FolderMeaning::Virtual | FolderMeaning::Unknown - ) { + if folder_meaning != FolderMeaning::Virtual { self.resync_folder_uids(context, folder.name(), folder_meaning) .await?; } @@ -2056,9 +2053,9 @@ async fn spam_target_folder_cfg( } if needs_move_to_mvbox(context, headers).await? - // If OnlyFetchMvbox is set, we don't want to move the message to - // the inbox or sentbox where we wouldn't fetch it again: - || context.get_config_bool(Config::OnlyFetchMvbox).await? + // Don't move the message to Inbox if we won't fetch the message again there. + || (context.get_config_bool(Config::OnlyFetchMvbox).await? + && !context.get_config_bool(Config::MvboxMove).await?) { Ok(Some(Config::ConfiguredMvboxFolder)) } else { @@ -2590,6 +2587,9 @@ async fn should_ignore_folder( // Still respect the SentboxWatch setting. return Ok(!context.get_config_bool(Config::SentboxWatch).await?); } + if context.is_inbox(folder).await? { + return Ok(!context.get_config_bool(Config::MvboxMove).await?); + } Ok(!(context.is_mvbox(folder).await? || folder_meaning == FolderMeaning::Spam)) } diff --git a/src/imap/imap_tests.rs b/src/imap/imap_tests.rs index 60637045de..1f191091e0 100644 --- a/src/imap/imap_tests.rs +++ b/src/imap/imap_tests.rs @@ -122,8 +122,9 @@ async fn check_target_folder_combination( t.ctx .set_config(Config::ConfiguredSentboxFolder, Some("Sent")) .await?; + t.ctx.set_config_bool(Config::MvboxMove, mvbox_move).await?; t.ctx - .set_config(Config::MvboxMove, Some(if mvbox_move { "1" } else { "0" })) + .set_config_bool(Config::OnlyFetchMvbox, mvbox_move) .await?; if accepted_chat { diff --git a/src/imap/scan_folders.rs b/src/imap/scan_folders.rs index 9b22c613af..3e496cff37 100644 --- a/src/imap/scan_folders.rs +++ b/src/imap/scan_folders.rs @@ -71,10 +71,13 @@ impl Imap { _ => folder_meaning, }; - // Don't scan folders that are watched anyway if !watched_folders.contains(&folder.name().to_string()) + // Inbox shouldn't be scanned, getting messages from Inbox delayed doesn't make + // sense, the user should enable watching it instead. + && folder_meaning != FolderMeaning::Inbox && folder_meaning != FolderMeaning::Trash - && folder_meaning != FolderMeaning::Unknown + && (folder_meaning != FolderMeaning::Unknown + || !context.get_config_bool(Config::OnlyFetchMvbox).await?) { self.fetch_move_delete(context, session, folder.name(), folder_meaning) .await diff --git a/src/sql/migrations.rs b/src/sql/migrations.rs index 4a7c40e911..b61c2e28a0 100644 --- a/src/sql/migrations.rs +++ b/src/sql/migrations.rs @@ -1261,6 +1261,34 @@ CREATE INDEX gossip_timestamp_index ON gossip_timestamp (chat_id, fingerprint); .await?; } + inc_and_check(&mut migration_version, 134)?; + if dbversion < migration_version { + // `MvboxMove` now means "watch Inbox also and move chat messages from it". Preserve the old + // behavior for `OnlyFetchMvbox` users. + sql.execute_migration( + "INSERT OR REPLACE INTO config (keyname, value) + SELECT 'mvbox_move', '0' + FROM config WHERE keyname='only_fetch_mvbox' AND value!='0' + ", + migration_version, + ) + .await?; + } + + inc_and_check(&mut migration_version, 135)?; + if dbversion < migration_version { + // `OnlyFetchMvbox` is now 1 by default to avoid scanning unknown folders. But if the user + // disabled `MvboxMove`, we have to keep `OnlyFetchMvbox` unset so that Inbox is watched. + sql.execute_migration( + "INSERT OR IGNORE INTO config (keyname, value) + SELECT 'only_fetch_mvbox', '0' + FROM config WHERE keyname='mvbox_move' AND value='0' + ", + migration_version, + ) + .await?; + } + let new_version = sql .get_raw_config_int(VERSION_CFG) .await?