From b42061c4e677823e7214c8ba467a9babbab2e93b Mon Sep 17 00:00:00 2001 From: iequidoo Date: Sun, 28 Sep 2025 13:41:35 -0300 Subject: [PATCH 1/2] fix: Only omit group changes messages if SELF is really added (#7220) If a self-addition message is received, but we're already in the group, there must be no hidden member changes. --- src/receive_imf.rs | 4 +++- src/tests/verified_chats.rs | 7 ++++++- test-data/golden/verified_chats_editor_reordering | 11 +++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 test-data/golden/verified_chats_editor_reordering diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 86ae562d2a..77c6b34dd6 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -3080,7 +3080,9 @@ async fn apply_group_changes( if let Some(removed_id) = removed_id { removed_ids.remove(&removed_id); } - let group_changes_msgs = if self_added { + let group_changes_msgs = if !chat_contacts.contains(&ContactId::SELF) + && new_chat_contacts.contains(&ContactId::SELF) + { Vec::new() } else { group_changes_msgs(context, &added_ids, &removed_ids, chat.id).await? diff --git a/src/tests/verified_chats.rs b/src/tests/verified_chats.rs index 2a85dbc026..ebfb85ce07 100644 --- a/src/tests/verified_chats.rs +++ b/src/tests/verified_chats.rs @@ -799,7 +799,12 @@ async fn test_verified_chat_editor_reordering() -> Result<()> { tcm.section("Charlie receives member added message"); charlie.recv_msg(&sent_member_added_msg).await; - + charlie + .golden_test_chat( + charlie_received_xdc.chat_id, + "verified_chats_editor_reordering", + ) + .await; Ok(()) } diff --git a/test-data/golden/verified_chats_editor_reordering b/test-data/golden/verified_chats_editor_reordering new file mode 100644 index 0000000000..21b949fb2b --- /dev/null +++ b/test-data/golden/verified_chats_editor_reordering @@ -0,0 +1,11 @@ +Group#Chat#11: Group [3 member(s)] 🛡️ +-------------------------------------------------------------------------------- +Msg#11: info (Contact#Contact#Info): alice@example.org invited you to join this group. + +Waiting for the device of alice@example.org to reply… [NOTICED][INFO] +Msg#13: info (Contact#Contact#Info): alice@example.org replied, waiting for being added to the group… [NOTICED][INFO] +Msg#16🔒: (Contact#Contact#11): [FRESH] +Msg#18: info (Contact#Contact#Info): Messages are end-to-end encrypted. [NOTICED][INFO 🛡️] +Msg#19: info (Contact#Contact#Info): Member bob@example.net added. [NOTICED][INFO] +Msg#20🔒: (Contact#Contact#10): Member Me added by alice@example.org. [FRESH][INFO] +-------------------------------------------------------------------------------- From abc0c000206becdfe9f6cdd05bd6adcca2804a75 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Sun, 28 Sep 2025 14:15:17 -0300 Subject: [PATCH 2/2] feat: No implicit member changes from old Delta Chat clients (#7220) Old Delta Chat clients don't provide timestamps for added and removed members in messages, so at least implicit member changes may be ignored as it's not clear if they are newer than explicit member changes from modern clients. Lost messages aren't so frequent anyway, and overall compatibility with old versions may be limited already. --- src/receive_imf.rs | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 77c6b34dd6..89714b22d5 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -2866,15 +2866,6 @@ async fn apply_group_changes( let (mut removed_id, mut added_id) = (None, None); let mut better_msg = None; let mut silent = false; - - // True if a Delta Chat client has explicitly added our current primary address. - let self_added = - if let Some(added_addr) = mime_parser.get_header(HeaderDef::ChatGroupMemberAdded) { - addr_cmp(&context.get_primary_self_addr().await?, added_addr) - } else { - false - }; - let chat_contacts = HashSet::::from_iter(chat::get_chat_contacts(context, chat.id).await?); let is_from_in_chat = @@ -3004,6 +2995,15 @@ async fn apply_group_changes( .await?; } else { let mut new_members: HashSet; + // True if a Delta Chat client has explicitly and really added our primary address to an + // already existing group. + let self_added = + if let Some(added_addr) = mime_parser.get_header(HeaderDef::ChatGroupMemberAdded) { + addr_cmp(&context.get_primary_self_addr().await?, added_addr) + && !chat_contacts.contains(&ContactId::SELF) + } else { + false + }; if self_added { new_members = HashSet::from_iter(to_ids_flat.iter().copied()); new_members.insert(ContactId::SELF); @@ -3070,10 +3070,9 @@ async fn apply_group_changes( .collect(); if let Some(added_id) = added_id { - if !added_ids.remove(&added_id) && !self_added { - // No-op "Member added" message. - // - // Trash it. + if !added_ids.remove(&added_id) && added_id != ContactId::SELF { + // No-op "Member added" message. An exception is self-addition messages because they at + // least must be shown when a chat is created on our side. better_msg = Some(String::new()); } }