Skip to content

Remove "Accepted contacts" option for downloading emails #6807

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft
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
8 changes: 4 additions & 4 deletions deltachat-ffi/deltachat.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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


Expand Down
1 change: 0 additions & 1 deletion deltachat-rpc-client/src/deltachat_rpc_client/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,6 @@ class ShowEmails(IntEnum):
"""Show emails mode"""

OFF = 0
ACCEPTED_CONTACTS = 1
ALL = 2


Expand Down
13 changes: 7 additions & 6 deletions src/constants.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}

Expand Down Expand Up @@ -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());
}

Expand Down
16 changes: 1 addition & 15 deletions src/contact.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Copy link
Collaborator

@Hocuri Hocuri Apr 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was the case before this PR already, but, for my understanding: The order here determines which authnames are used, i.e. "better" origins overwrite the names of "worse" origins, with an exception that IncomingUnknownFrom may overwrite any other authname. (The origin also determines that contacts with at least IncomingReplyTo origin are shown in the contact list.)

I find the order super weird:

  • IncomingUnknownFrom has the lowest priority of all. I would expect it to have a high priority, because this is obviously the name that comes directly from this contact.
  • I would expect IncomingUnkwnownTo to have a lower priority, because it's a "gossiped" name - the displayname was in the "To" header in a message coming from some other contact.
  • Same for IncomingReplyTo, because it's not guaranteed that this message actually came from the contact who controls the IncomingReplyTo address.

Is there something I'm missing?

In any case, I'm not saying we have to change this now, can come after multi-transport.


Expand All @@ -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,

Expand Down
2 changes: 1 addition & 1 deletion src/html.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
42 changes: 18 additions & 24 deletions src/imap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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())

Expand All @@ -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 {
Expand All @@ -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;
Expand Down
35 changes: 11 additions & 24 deletions src/receive_imf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ pub(crate) async fn receive_imf_inner(
// For example, GitHub sends messages from `[email protected]`,
// 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 => {
Expand All @@ -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 {
if mime_parser.incoming {
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 {
Origin::IncomingUnknownTo
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?;

Expand Down Expand Up @@ -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
Expand All @@ -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 {
Expand All @@ -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)))
}
}

Expand Down Expand Up @@ -773,8 +761,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;
Expand Down
15 changes: 6 additions & 9 deletions src/receive_imf/receive_imf_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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", "[email protected]").await.unwrap();
receive_imf(&t, GRP_MAIL, false).await.unwrap();

Expand All @@ -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();
Expand Down Expand Up @@ -2322,7 +2319,7 @@ async fn test_ignore_footer_status_from_mailinglist() -> Result<()> {
&t,
"",
&ContactAddress::new("[email protected]").unwrap(),
Origin::IncomingUnknownCc,
Origin::IncomingUnknownTo,
)
.await?
.0;
Expand Down Expand Up @@ -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, "[email protected]", Origin::IncomingTo)
let fiona = Contact::lookup_id_by_addr(&alice, "[email protected]", Origin::IncomingUnknownTo)
.await?
.unwrap();
assert!(chat::is_contact_in_chat(&alice, group_chat.id, fiona).await?);
Expand Down
Loading