mirror of
https://github.com/chatmail/core.git
synced 2026-04-01 21:12:13 +03:00
Compare commits
4 Commits
fd6dcca192
...
link2xt/co
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bce13b3bfd | ||
|
|
32b6a14c71 | ||
|
|
0754638417 | ||
|
|
37462b3801 |
@@ -436,10 +436,10 @@ char* dc_get_blobdir (const dc_context_t* context);
|
||||
* 0=watch all folders normally (default)
|
||||
* - `show_emails` = DC_SHOW_EMAILS_OFF (0)=
|
||||
* show direct replies to chats only,
|
||||
* DC_SHOW_EMAILS_ACCEPTED_CONTACTS (1)=
|
||||
* also show all mails of confirmed contacts,
|
||||
* DC_SHOW_EMAILS_ALL1 (1)=
|
||||
* deprecated, same as DC_SHOW_EMAILS_ALL,
|
||||
* DC_SHOW_EMAILS_ALL (2)=
|
||||
* also show mails of unconfirmed contacts (default).
|
||||
* show all mails (default).
|
||||
* - `delete_device_after` = 0=do not delete messages from device automatically (default),
|
||||
* >=1=seconds, after which messages are deleted automatically from the device.
|
||||
* Messages in the "saved messages" chat (see dc_chat_is_self_talk()) are skipped.
|
||||
@@ -6582,7 +6582,7 @@ void dc_event_unref(dc_event_t* event);
|
||||
* Values for dc_get|set_config("show_emails")
|
||||
*/
|
||||
#define DC_SHOW_EMAILS_OFF 0
|
||||
#define DC_SHOW_EMAILS_ACCEPTED_CONTACTS 1
|
||||
#define DC_SHOW_EMAILS_ALL1 1
|
||||
#define DC_SHOW_EMAILS_ALL 2
|
||||
|
||||
|
||||
|
||||
@@ -234,7 +234,6 @@ class ShowEmails(IntEnum):
|
||||
"""Show emails mode."""
|
||||
|
||||
OFF = 0
|
||||
ACCEPTED_CONTACTS = 1
|
||||
ALL = 2
|
||||
|
||||
|
||||
|
||||
@@ -45,8 +45,12 @@ pub enum Blocked {
|
||||
#[repr(u8)]
|
||||
pub enum ShowEmails {
|
||||
Off = 0,
|
||||
AcceptedContacts = 1,
|
||||
#[default] // also change Config.ShowEmails props(default) on changes
|
||||
|
||||
/// Deprecated 2025-04-16, same as All.
|
||||
All1 = 1,
|
||||
|
||||
// also change Config.ShowEmails props(default) on changes
|
||||
#[default]
|
||||
All = 2,
|
||||
}
|
||||
|
||||
@@ -253,10 +257,7 @@ mod tests {
|
||||
// values may be written to disk and must not change
|
||||
assert_eq!(ShowEmails::All, ShowEmails::default());
|
||||
assert_eq!(ShowEmails::Off, ShowEmails::from_i32(0).unwrap());
|
||||
assert_eq!(
|
||||
ShowEmails::AcceptedContacts,
|
||||
ShowEmails::from_i32(1).unwrap()
|
||||
);
|
||||
assert_eq!(ShowEmails::All1, ShowEmails::from_i32(1).unwrap());
|
||||
assert_eq!(ShowEmails::All, ShowEmails::from_i32(2).unwrap());
|
||||
}
|
||||
|
||||
|
||||
@@ -501,14 +501,12 @@ pub enum Origin {
|
||||
MailinglistAddress = 0x2,
|
||||
|
||||
/// Hidden on purpose, e.g. addresses with the word "noreply" in it
|
||||
/// or past members of the groups.
|
||||
Hidden = 0x8,
|
||||
|
||||
/// From: of incoming messages of unknown sender
|
||||
IncomingUnknownFrom = 0x10,
|
||||
|
||||
/// Cc: of incoming messages of unknown sender
|
||||
IncomingUnknownCc = 0x20,
|
||||
|
||||
/// To: of incoming messages of unknown sender
|
||||
IncomingUnknownTo = 0x40,
|
||||
|
||||
@@ -522,21 +520,9 @@ pub enum Origin {
|
||||
/// Contacts with at least this origin value are shown in the contact list.
|
||||
IncomingReplyTo = 0x100,
|
||||
|
||||
/// Cc: of incoming message of known sender
|
||||
IncomingCc = 0x200,
|
||||
|
||||
/// additional To:'s of incoming message of known sender
|
||||
IncomingTo = 0x400,
|
||||
|
||||
/// a chat was manually created for this user, but no message yet sent
|
||||
CreateChat = 0x800,
|
||||
|
||||
/// message sent by us
|
||||
OutgoingBcc = 0x1000,
|
||||
|
||||
/// message sent by us
|
||||
OutgoingCc = 0x2000,
|
||||
|
||||
/// message sent by us
|
||||
OutgoingTo = 0x4000,
|
||||
|
||||
|
||||
@@ -522,7 +522,7 @@ test some special html-characters as < > and & but also " and &#x
|
||||
async fn test_html_forwarding_encrypted() {
|
||||
let mut tcm = TestContextManager::new();
|
||||
// Alice receives a non-delta html-message
|
||||
// (`ShowEmails=AcceptedContacts` lets Alice actually receive non-delta messages for known
|
||||
// (`ShowEmails=All` lets Alice actually receive non-delta messages for known
|
||||
// contacts, the contact is marked as known by creating a chat using `chat_with_contact()`)
|
||||
let alice = &tcm.alice().await;
|
||||
alice
|
||||
|
||||
42
src/imap.rs
42
src/imap.rs
@@ -1885,20 +1885,19 @@ async fn should_move_out_of_spam(
|
||||
None => return Ok(false),
|
||||
};
|
||||
// No chat found.
|
||||
let (from_id, blocked_contact, _origin) =
|
||||
match from_field_to_contact_id(context, &from, true)
|
||||
.await
|
||||
.context("from_field_to_contact_id")?
|
||||
{
|
||||
Some(res) => res,
|
||||
None => {
|
||||
warn!(
|
||||
context,
|
||||
"Contact with From address {:?} cannot exist, not moving out of spam", from
|
||||
);
|
||||
return Ok(false);
|
||||
}
|
||||
};
|
||||
let (from_id, blocked_contact) = match from_field_to_contact_id(context, &from, true)
|
||||
.await
|
||||
.context("from_field_to_contact_id")?
|
||||
{
|
||||
Some(res) => res,
|
||||
None => {
|
||||
warn!(
|
||||
context,
|
||||
"Contact with From address {:?} cannot exist, not moving out of spam", from
|
||||
);
|
||||
return Ok(false);
|
||||
}
|
||||
};
|
||||
if blocked_contact {
|
||||
// Contact is blocked, leave the message in spam.
|
||||
return Ok(false);
|
||||
@@ -2243,11 +2242,10 @@ pub(crate) async fn prefetch_should_download(
|
||||
Some(f) => f,
|
||||
None => return Ok(false),
|
||||
};
|
||||
let (_from_id, blocked_contact, origin) =
|
||||
match from_field_to_contact_id(context, &from, true).await? {
|
||||
Some(res) => res,
|
||||
None => return Ok(false),
|
||||
};
|
||||
let (_from_id, blocked_contact) = match from_field_to_contact_id(context, &from, true).await? {
|
||||
Some(res) => res,
|
||||
None => return Ok(false),
|
||||
};
|
||||
// prevent_rename=true as this might be a mailing list message and in this case it would be bad if we rename the contact.
|
||||
// (prevent_rename is the last argument of from_field_to_contact_id())
|
||||
|
||||
@@ -2257,7 +2255,6 @@ pub(crate) async fn prefetch_should_download(
|
||||
}
|
||||
|
||||
let is_chat_message = headers.get_header_value(HeaderDef::ChatVersion).is_some();
|
||||
let accepted_contact = origin.is_known();
|
||||
let is_reply_to_chat_message = get_prefetch_parent_message(context, headers)
|
||||
.await?
|
||||
.map(|parent| match parent.is_dc_message {
|
||||
@@ -2272,10 +2269,7 @@ pub(crate) async fn prefetch_should_download(
|
||||
let show = is_autocrypt_setup_message
|
||||
|| match show_emails {
|
||||
ShowEmails::Off => is_chat_message || is_reply_to_chat_message,
|
||||
ShowEmails::AcceptedContacts => {
|
||||
is_chat_message || is_reply_to_chat_message || accepted_contact
|
||||
}
|
||||
ShowEmails::All => true,
|
||||
ShowEmails::All | ShowEmails::All1 => true,
|
||||
};
|
||||
|
||||
let should_download = (show && !blocked_contact) || maybe_ndn;
|
||||
|
||||
@@ -322,7 +322,7 @@ pub(crate) async fn receive_imf_inner(
|
||||
// For example, GitHub sends messages from `notifications@github.com`,
|
||||
// but uses display name of the user whose action generated the notification
|
||||
// as the display name.
|
||||
let (from_id, _from_id_blocked, incoming_origin) =
|
||||
let (from_id, _from_id_blocked) =
|
||||
match from_field_to_contact_id(context, &mime_parser.from, prevent_rename).await? {
|
||||
Some(contact_id_res) => contact_id_res,
|
||||
None => {
|
||||
@@ -337,27 +337,16 @@ pub(crate) async fn receive_imf_inner(
|
||||
let to_ids = add_or_lookup_contacts_by_address_list(
|
||||
context,
|
||||
&mime_parser.recipients,
|
||||
if !mime_parser.incoming {
|
||||
Origin::OutgoingTo
|
||||
} else if incoming_origin.is_known() {
|
||||
Origin::IncomingTo
|
||||
} else {
|
||||
Origin::IncomingUnknownTo
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
let past_ids = add_or_lookup_contacts_by_address_list(
|
||||
context,
|
||||
&mime_parser.past_members,
|
||||
if !mime_parser.incoming {
|
||||
Origin::OutgoingTo
|
||||
} else if incoming_origin.is_known() {
|
||||
Origin::IncomingTo
|
||||
} else {
|
||||
if mime_parser.incoming {
|
||||
Origin::IncomingUnknownTo
|
||||
} else {
|
||||
Origin::OutgoingTo
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
let past_ids =
|
||||
add_or_lookup_contacts_by_address_list(context, &mime_parser.past_members, Origin::Hidden)
|
||||
.await?;
|
||||
|
||||
update_verified_keys(context, &mut mime_parser, from_id).await?;
|
||||
|
||||
@@ -655,7 +644,7 @@ pub(crate) async fn receive_imf_inner(
|
||||
|
||||
/// Converts "From" field to contact id.
|
||||
///
|
||||
/// Also returns whether it is blocked or not and its origin.
|
||||
/// Also returns whether it is blocked or not.
|
||||
///
|
||||
/// * `prevent_rename`: if true, the display_name of this contact will not be changed. Useful for
|
||||
/// mailing lists: In some mailing lists, many users write from the same address but with different
|
||||
@@ -667,7 +656,7 @@ pub async fn from_field_to_contact_id(
|
||||
context: &Context,
|
||||
from: &SingleInfo,
|
||||
prevent_rename: bool,
|
||||
) -> Result<Option<(ContactId, bool, Origin)>> {
|
||||
) -> Result<Option<(ContactId, bool)>> {
|
||||
let display_name = if prevent_rename {
|
||||
Some("")
|
||||
} else {
|
||||
@@ -693,12 +682,11 @@ pub async fn from_field_to_contact_id(
|
||||
.await?;
|
||||
|
||||
if from_id == ContactId::SELF {
|
||||
Ok(Some((ContactId::SELF, false, Origin::OutgoingBcc)))
|
||||
Ok(Some((ContactId::SELF, false)))
|
||||
} else {
|
||||
let contact = Contact::get_by_id(context, from_id).await?;
|
||||
let from_id_blocked = contact.blocked;
|
||||
let incoming_origin = contact.origin;
|
||||
Ok(Some((from_id, from_id_blocked, incoming_origin)))
|
||||
Ok(Some((from_id, from_id_blocked)))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -775,8 +763,7 @@ async fn add_parts(
|
||||
chat_id = Some(DC_CHAT_ID_TRASH);
|
||||
allow_creation = false;
|
||||
}
|
||||
ShowEmails::AcceptedContacts => allow_creation = false,
|
||||
ShowEmails::All => allow_creation = !is_mdn,
|
||||
ShowEmails::All | ShowEmails::All1 => allow_creation = !is_mdn,
|
||||
}
|
||||
} else {
|
||||
allow_creation = !is_mdn && !is_reaction;
|
||||
@@ -880,7 +867,7 @@ async fn add_parts(
|
||||
&parent,
|
||||
to_ids,
|
||||
from_id,
|
||||
allow_creation || test_normal_chat.is_some(),
|
||||
allow_creation,
|
||||
create_blocked,
|
||||
is_partial_download.is_some(),
|
||||
)
|
||||
|
||||
@@ -113,11 +113,8 @@ async fn test_adhoc_group_outgoing_show_accepted_contact_unaccepted() -> Result<
|
||||
let mut tcm = TestContextManager::new();
|
||||
let alice = &tcm.alice().await;
|
||||
let bob = &tcm.bob().await;
|
||||
bob.set_config(
|
||||
Config::ShowEmails,
|
||||
Some(&ShowEmails::AcceptedContacts.to_string()),
|
||||
)
|
||||
.await?;
|
||||
bob.set_config(Config::ShowEmails, Some(&ShowEmails::All.to_string()))
|
||||
.await?;
|
||||
tcm.send_recv(alice, bob, "hi").await;
|
||||
receive_imf(
|
||||
bob,
|
||||
@@ -140,7 +137,7 @@ async fn test_adhoc_group_outgoing_show_accepted_contact_unaccepted() -> Result<
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn test_adhoc_group_show_accepted_contact_known() {
|
||||
let t = TestContext::new_alice().await;
|
||||
t.set_config(Config::ShowEmails, Some("1")).await.unwrap();
|
||||
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
||||
Contact::create(&t, "Bob", "bob@example.com").await.unwrap();
|
||||
receive_imf(&t, GRP_MAIL, false).await.unwrap();
|
||||
|
||||
@@ -153,7 +150,7 @@ async fn test_adhoc_group_show_accepted_contact_known() {
|
||||
#[tokio::test(flavor = "multi_thread", worker_threads = 2)]
|
||||
async fn test_adhoc_group_show_accepted_contact_accepted() {
|
||||
let t = TestContext::new_alice().await;
|
||||
t.set_config(Config::ShowEmails, Some("1")).await.unwrap();
|
||||
t.set_config(Config::ShowEmails, Some("2")).await.unwrap();
|
||||
|
||||
// accept Bob by accepting a delta-message from Bob
|
||||
receive_imf(&t, MSGRMSG, false).await.unwrap();
|
||||
@@ -2322,7 +2319,7 @@ async fn test_ignore_footer_status_from_mailinglist() -> Result<()> {
|
||||
&t,
|
||||
"",
|
||||
&ContactAddress::new("bob@example.net").unwrap(),
|
||||
Origin::IncomingUnknownCc,
|
||||
Origin::IncomingUnknownTo,
|
||||
)
|
||||
.await?
|
||||
.0;
|
||||
@@ -3988,7 +3985,7 @@ async fn test_mua_user_adds_recipient_to_single_chat() -> Result<()> {
|
||||
chat::get_chat_contacts(&alice, group_chat.id).await?.len(),
|
||||
4
|
||||
);
|
||||
let fiona = Contact::lookup_id_by_addr(&alice, "fiona@example.net", Origin::IncomingTo)
|
||||
let fiona = Contact::lookup_id_by_addr(&alice, "fiona@example.net", Origin::IncomingUnknownTo)
|
||||
.await?
|
||||
.unwrap();
|
||||
assert!(chat::is_contact_in_chat(&alice, group_chat.id, fiona).await?);
|
||||
|
||||
Reference in New Issue
Block a user