Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 8 additions & 15 deletions python/tests/test_1_online.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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")
Expand All @@ -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:
Expand Down
6 changes: 3 additions & 3 deletions src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
14 changes: 7 additions & 7 deletions src/imap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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?;
}
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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))
}

Expand Down
3 changes: 2 additions & 1 deletion src/imap/imap_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
7 changes: 5 additions & 2 deletions src/imap/scan_folders.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
28 changes: 28 additions & 0 deletions src/sql/migrations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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?
Expand Down
Loading