diff --git a/src/dc_receive_imf.rs b/src/dc_receive_imf.rs index e6ceb87d6..bb06c3d75 100644 --- a/src/dc_receive_imf.rs +++ b/src/dc_receive_imf.rs @@ -25,6 +25,7 @@ use crate::ephemeral::{stock_ephemeral_timer_changed, Timer as EphemeralTimer}; use crate::events::EventType; use crate::headerdef::{HeaderDef, HeaderDefMap}; use crate::job::{self, Action}; +use crate::log::LogExt; use crate::message::{self, rfc724_mid_exists, Message, MessageState, MessengerMessage, MsgId}; use crate::mimeparser::{ parse_message_ids, AvatarAction, MailinglistType, MimeMessage, SystemMessage, @@ -626,6 +627,15 @@ async fn add_parts( // a new user won't find the contact request in the menu state = MessageState::InFresh; } + + let is_spam = (chat_id_blocked == Blocked::Deaddrop) + && !incoming_origin.is_known() + && (is_dc_message == MessengerMessage::No) + && context.is_spam_folder(&server_folder).await?; + if is_spam { + *chat_id = DC_CHAT_ID_TRASH; + info!(context, "Message is probably spam (TRASH)"); + } } else { // Outgoing @@ -1059,13 +1069,7 @@ INSERT INTO msgs if !is_mdn { update_last_subject(context, *chat_id, mime_parser) .await - .unwrap_or_else(|e| { - warn!( - context, - "Could not update LastSubject of chat: {}", - e.to_string() - ) - }); + .ok_or_log_msg(context, "Could not update LastSubject of chat"); } Ok(()) @@ -2033,6 +2037,8 @@ fn dc_create_incoming_rfc724_mid( #[cfg(test)] mod tests { + use mailparse::MailHeaderMap; + use super::*; use crate::chat::{get_chat_msgs, ChatItem, ChatVisibility}; @@ -3578,4 +3584,86 @@ YEAAAAAA!. assert!(mime.contains("From:")); Ok(()) } + + #[async_std::test] + async fn test_dont_show_spam() { + async fn is_shown( + t: &TestContext, + raw: &[u8], + server_folder: &str, + server_uid: u32, + ) -> bool { + let mail = mailparse::parse_mail(raw).unwrap(); + dc_receive_imf(t, raw, server_folder, server_uid, false) + .await + .unwrap(); + t.get_last_msg().await.rfc724_mid + == mail.get_headers().get_first_value("Message-Id").unwrap() + } + + let t = TestContext::new_alice().await; + t.set_config(Config::ConfiguredSpamFolder, Some("Spam")) + .await + .unwrap(); + t.set_config(Config::ShowEmails, Some("2")).await.unwrap(); + + assert!( + is_shown( + &t, + b"Message-Id: abcd1@exmaple.com\n\ + From: bob@example.org\n\ + Chat-Version: 1.0\n", + "Inbox", + 1 + ) + .await, + ); + + assert!( + is_shown( + &t, + b"Message-Id: abcd2@exmaple.com\n\ + From: bob@example.org\n", + "Inbox", + 2 + ) + .await, + ); + + assert!( + is_shown( + &t, + b"Message-Id: abcd3@exmaple.com\n\ + From: bob@example.org\n\ + Chat-Version: 1.0\n", + "Spam", + 3 + ) + .await, + ); + + assert!( + // Note the `!`: + !is_shown( + &t, + b"Message-Id: abcd4@exmaple.com\n\ + From: bob@example.org\n", + "Spam", + 4 + ) + .await, + ); + + Contact::create(&t, "", "bob@example.org").await.unwrap(); + assert!( + is_shown( + &t, + b"Message-Id: abcd5@exmaple.com\n\ + From: bob@example.org\n", + "Spam", + 5 + ) + .await, + ); + } } diff --git a/src/imap/mod.rs b/src/imap/mod.rs index cc3b0ec37..d9a429b8f 100644 --- a/src/imap/mod.rs +++ b/src/imap/mod.rs @@ -1623,7 +1623,7 @@ pub(crate) async fn prefetch_should_download( let is_chat_message = headers.get_header_value(HeaderDef::ChatVersion).is_some(); let parent = get_prefetch_parent_message(context, headers).await?; let is_reply_to_chat_message = parent.is_some(); - if let Some(parent) = parent { + if let Some(parent) = &parent { let chat = chat::Chat::load_from_db(context, parent.get_chat_id()).await?; if chat.typ == Chattype::Group { // This might be a group command, like removing a group member. @@ -1669,6 +1669,7 @@ pub(crate) async fn prefetch_should_download( } ShowEmails::All => true, }; + let should_download = (show && !blocked_contact) || maybe_ndn; Ok(should_download) } diff --git a/src/message.rs b/src/message.rs index ea8e48c51..d4fcc07b4 100644 --- a/src/message.rs +++ b/src/message.rs @@ -114,7 +114,9 @@ impl MsgId { let msg = Message::load_from_db(context, self).await?; if context.is_spam_folder(folder).await? { - return if msg.chat_blocked == Blocked::Not { + let msg_unblocked = msg.chat_id != DC_CHAT_ID_TRASH && msg.chat_blocked == Blocked::Not; + + return if msg_unblocked { if self.needs_move_to_mvbox(context, &msg).await? { Ok(Some(ConfiguredMvboxFolder)) } else { @@ -2217,7 +2219,7 @@ mod tests { "Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\ {}\ Subject: foo\n\ - Message-ID: \n\ + Message-ID: \n\ {}\ Date: Sun, 22 Mar 2020 22:37:57 +0000\n\ \n\ @@ -2238,8 +2240,10 @@ mod tests { .await .unwrap(); - let msg = t.get_last_msg().await; - let actual = if let Some(config) = msg.id.needs_move(&t.ctx, folder).await.unwrap() { + let exists = rfc724_mid_exists(&t, "abc@example.com").await.unwrap(); + let (folder_1, _, msg_id) = exists.unwrap(); + assert_eq!(folder, folder_1); + let actual = if let Some(config) = msg_id.needs_move(&t.ctx, folder).await.unwrap() { t.ctx.get_config(config).await.unwrap() } else { None @@ -2249,7 +2253,7 @@ mod tests { } else { Some(expected_destination) }; - assert_eq!(expected, actual.as_deref(), "For folder {}, mvbox_move {}, chat_msg {}, accepted {}, outgoing {}, setupmessage {}: expected {:?} , got {:?}", + assert_eq!(expected, actual.as_deref(), "For folder {}, mvbox_move {}, chat_msg {}, accepted {}, outgoing {}, setupmessage {}: expected {:?}, got {:?}", folder, mvbox_move, chat_msg, accepted_chat, outgoing, setupmessage, expected, actual); } diff --git a/test-data/message/AutocryptSetupMessage.eml b/test-data/message/AutocryptSetupMessage.eml index 5cef7b9b5..97d0b33ef 100644 --- a/test-data/message/AutocryptSetupMessage.eml +++ b/test-data/message/AutocryptSetupMessage.eml @@ -20,7 +20,7 @@ MIME-Version: 1.0 Date: Tue, 24 Nov 2020 09:34:48 +0000 Chat-Version: 1.0 Autocrypt-Setup-Message: v1 -Message-ID: +Message-ID: To: From: Content-Type: multipart/mixed; boundary="dKhu3bbmBniQsT8W8w58YRCCiBK2YY"