mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
Ignore unknown classical emails from spam folder (#2311)
This commit is contained in:
@@ -25,6 +25,7 @@ use crate::ephemeral::{stock_ephemeral_timer_changed, Timer as EphemeralTimer};
|
|||||||
use crate::events::EventType;
|
use crate::events::EventType;
|
||||||
use crate::headerdef::{HeaderDef, HeaderDefMap};
|
use crate::headerdef::{HeaderDef, HeaderDefMap};
|
||||||
use crate::job::{self, Action};
|
use crate::job::{self, Action};
|
||||||
|
use crate::log::LogExt;
|
||||||
use crate::message::{self, rfc724_mid_exists, Message, MessageState, MessengerMessage, MsgId};
|
use crate::message::{self, rfc724_mid_exists, Message, MessageState, MessengerMessage, MsgId};
|
||||||
use crate::mimeparser::{
|
use crate::mimeparser::{
|
||||||
parse_message_ids, AvatarAction, MailinglistType, MimeMessage, SystemMessage,
|
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
|
// a new user won't find the contact request in the menu
|
||||||
state = MessageState::InFresh;
|
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 {
|
} else {
|
||||||
// Outgoing
|
// Outgoing
|
||||||
|
|
||||||
@@ -1059,13 +1069,7 @@ INSERT INTO msgs
|
|||||||
if !is_mdn {
|
if !is_mdn {
|
||||||
update_last_subject(context, *chat_id, mime_parser)
|
update_last_subject(context, *chat_id, mime_parser)
|
||||||
.await
|
.await
|
||||||
.unwrap_or_else(|e| {
|
.ok_or_log_msg(context, "Could not update LastSubject of chat");
|
||||||
warn!(
|
|
||||||
context,
|
|
||||||
"Could not update LastSubject of chat: {}",
|
|
||||||
e.to_string()
|
|
||||||
)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -2033,6 +2037,8 @@ fn dc_create_incoming_rfc724_mid(
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
|
use mailparse::MailHeaderMap;
|
||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
use crate::chat::{get_chat_msgs, ChatItem, ChatVisibility};
|
use crate::chat::{get_chat_msgs, ChatItem, ChatVisibility};
|
||||||
@@ -3578,4 +3584,86 @@ YEAAAAAA!.
|
|||||||
assert!(mime.contains("From:"));
|
assert!(mime.contains("From:"));
|
||||||
Ok(())
|
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,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1623,7 +1623,7 @@ pub(crate) async fn prefetch_should_download(
|
|||||||
let is_chat_message = headers.get_header_value(HeaderDef::ChatVersion).is_some();
|
let is_chat_message = headers.get_header_value(HeaderDef::ChatVersion).is_some();
|
||||||
let parent = get_prefetch_parent_message(context, headers).await?;
|
let parent = get_prefetch_parent_message(context, headers).await?;
|
||||||
let is_reply_to_chat_message = parent.is_some();
|
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?;
|
let chat = chat::Chat::load_from_db(context, parent.get_chat_id()).await?;
|
||||||
if chat.typ == Chattype::Group {
|
if chat.typ == Chattype::Group {
|
||||||
// This might be a group command, like removing a group member.
|
// 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,
|
ShowEmails::All => true,
|
||||||
};
|
};
|
||||||
|
|
||||||
let should_download = (show && !blocked_contact) || maybe_ndn;
|
let should_download = (show && !blocked_contact) || maybe_ndn;
|
||||||
Ok(should_download)
|
Ok(should_download)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,7 +114,9 @@ impl MsgId {
|
|||||||
let msg = Message::load_from_db(context, self).await?;
|
let msg = Message::load_from_db(context, self).await?;
|
||||||
|
|
||||||
if context.is_spam_folder(folder).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? {
|
if self.needs_move_to_mvbox(context, &msg).await? {
|
||||||
Ok(Some(ConfiguredMvboxFolder))
|
Ok(Some(ConfiguredMvboxFolder))
|
||||||
} else {
|
} else {
|
||||||
@@ -2217,7 +2219,7 @@ mod tests {
|
|||||||
"Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\
|
"Received: (Postfix, from userid 1000); Mon, 4 Dec 2006 14:51:39 +0100 (CET)\n\
|
||||||
{}\
|
{}\
|
||||||
Subject: foo\n\
|
Subject: foo\n\
|
||||||
Message-ID: <aehtri@example.com>\n\
|
Message-ID: <abc@example.com>\n\
|
||||||
{}\
|
{}\
|
||||||
Date: Sun, 22 Mar 2020 22:37:57 +0000\n\
|
Date: Sun, 22 Mar 2020 22:37:57 +0000\n\
|
||||||
\n\
|
\n\
|
||||||
@@ -2238,8 +2240,10 @@ mod tests {
|
|||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
let msg = t.get_last_msg().await;
|
let exists = rfc724_mid_exists(&t, "abc@example.com").await.unwrap();
|
||||||
let actual = if let Some(config) = msg.id.needs_move(&t.ctx, folder).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()
|
t.ctx.get_config(config).await.unwrap()
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@@ -2249,7 +2253,7 @@ mod tests {
|
|||||||
} else {
|
} else {
|
||||||
Some(expected_destination)
|
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);
|
folder, mvbox_move, chat_msg, accepted_chat, outgoing, setupmessage, expected, actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ MIME-Version: 1.0
|
|||||||
Date: Tue, 24 Nov 2020 09:34:48 +0000
|
Date: Tue, 24 Nov 2020 09:34:48 +0000
|
||||||
Chat-Version: 1.0
|
Chat-Version: 1.0
|
||||||
Autocrypt-Setup-Message: v1
|
Autocrypt-Setup-Message: v1
|
||||||
Message-ID: <Mr._G2UTiTkgfk.HWf5RnFC2xy@testrun.org>
|
Message-ID: <abc@example.com>
|
||||||
To: <alice@example.com>
|
To: <alice@example.com>
|
||||||
From: <alice@example.com>
|
From: <alice@example.com>
|
||||||
Content-Type: multipart/mixed; boundary="dKhu3bbmBniQsT8W8w58YRCCiBK2YY"
|
Content-Type: multipart/mixed; boundary="dKhu3bbmBniQsT8W8w58YRCCiBK2YY"
|
||||||
|
|||||||
Reference in New Issue
Block a user