From e37920ed4edcc6215a348d57fdc3503bfff03397 Mon Sep 17 00:00:00 2001 From: iequidoo Date: Sun, 28 Sep 2025 14:15:17 -0300 Subject: [PATCH] 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 bfe4e21a1..9ddcfed0b 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -2864,15 +2864,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 = @@ -3002,6 +2993,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); @@ -3068,10 +3068,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()); } }