diff --git a/src/chat.rs b/src/chat.rs index 8a0ea1cc9f..0fd5ffca4f 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2851,11 +2851,6 @@ pub(crate) async fn create_send_msg_jobs(context: &Context, msg: &mut Message) - let attach_selfavatar = mimefactory.attach_selfavatar; let mut recipients = mimefactory.recipients(); - let from = context.get_primary_self_addr().await?; - let lowercase_from = from.to_lowercase(); - - recipients.retain(|x| x.to_lowercase() != lowercase_from); - // Default Webxdc integrations are hidden messages and must not be sent out: if (msg.param.get_int(Param::WebxdcIntegration).is_some() && msg.hidden) // This may happen eg. for groups with only SELF and bcc_self disabled: diff --git a/src/chat/chat_tests.rs b/src/chat/chat_tests.rs index c54e107b9f..6a8e753267 100644 --- a/src/chat/chat_tests.rs +++ b/src/chat/chat_tests.rs @@ -3957,7 +3957,7 @@ async fn test_leave_broadcast_multidevice() -> Result<()> { let leave_msg = bob0.pop_sent_msg().await; let parsed = MimeMessage::from_bytes(bob1, leave_msg.payload().as_bytes()).await?; - assert_eq!(parsed.parts[0].msg, "bob@example.net left the group."); + assert_eq!(parsed.parts[0].msg, "Member bob@example.net was removed."); let rcvd = bob1.recv_msg(&leave_msg).await; diff --git a/src/contact.rs b/src/contact.rs index 47bc5c3073..728c5ed498 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -1230,17 +1230,13 @@ ORDER BY c.origin>=? DESC, c.last_seen DESC, c.id DESC .await?; if let Some(query) = query { - let self_addr = context - .get_config(Config::ConfiguredAddr) - .await? - .unwrap_or_default(); let self_name = context .get_config(Config::Displayname) .await? .unwrap_or_default(); let self_name2 = stock_str::self_msg(context); - if self_addr.contains(query) + if self_addrs.iter().any(|a| a.contains(query)) || self_name.contains(query) || self_name2.contains(query) { diff --git a/src/contact/contact_tests.rs b/src/contact/contact_tests.rs index 44a62253fd..d7442f0465 100644 --- a/src/contact/contact_tests.rs +++ b/src/contact/contact_tests.rs @@ -152,6 +152,20 @@ async fn test_get_contacts() -> Result<()> { assert_eq!(contacts.len(), 1); let contacts = Contact::get_all(&context, 0, Some("δ")).await?; assert_eq!(contacts.len(), 1); + + // Searching for a secondary self address finds "Me", + // even if the transport is unpublished. + crate::transport::add_pseudo_transport(&context, "bob@second.example").await?; + context + .set_transport_unpublished("bob@second.example", true) + .await?; + let contacts = Contact::get_all( + &context, + constants::DC_GCL_ADD_SELF, + Some("bob@second.example"), + ) + .await?; + assert_eq!(contacts, vec![ContactId::SELF]); Ok(()) } diff --git a/src/mimefactory.rs b/src/mimefactory.rs index 7abae86212..169a474424 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -1421,16 +1421,9 @@ impl MimeFactory { let email_to_remove = msg.param.get(Param::Arg).unwrap_or_default(); let fingerprint_to_remove = msg.param.get(Param::Arg4).unwrap_or_default(); - if email_to_remove - == context - .get_config(Config::ConfiguredAddr) - .await? - .unwrap_or_default() - { - placeholdertext = Some(format!("{email_to_remove} left the group.")); - } else { - placeholdertext = Some(format!("Member {email_to_remove} was removed.")); - }; + // Only visible in classic email clients, + // Delta Chat renders removals from the headers. + placeholdertext = Some(format!("Member {email_to_remove} was removed.")); if !email_to_remove.is_empty() { headers.push(( diff --git a/src/mimefactory/mimefactory_tests.rs b/src/mimefactory/mimefactory_tests.rs index 937fdacbd6..5825234611 100644 --- a/src/mimefactory/mimefactory_tests.rs +++ b/src/mimefactory/mimefactory_tests.rs @@ -887,6 +887,30 @@ async fn test_new_member_is_first_recipient() -> Result<()> { Ok(()) } +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_bcc_self() -> Result<()> { + let mut tcm = TestContextManager::new(); + let alice = &tcm.alice().await; + let bob = &tcm.bob().await; + + for bcc_self in [false, true] { + alice.set_config_bool(Config::BccSelf, bcc_self).await?; + + let group = alice.create_group_with_members("Group", &[bob]).await; + let single_chat = alice.create_chat_id(bob).await; + + for chat_id in [group, single_chat] { + let sent = alice.send_text(chat_id, "Heyho!").await; + if bcc_self { + assert_eq!(sent.recipients, "bob@example.net alice@example.org"); + } else { + assert_eq!(sent.recipients, "bob@example.net"); + } + } + } + Ok(()) +} + /// Regression test: mimefactory should never create an empty to header, /// also not if the Selftalk parameter is missing #[tokio::test(flavor = "multi_thread", worker_threads = 2)] diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 8d8144e48f..dfd0b7cef4 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -3177,15 +3177,13 @@ async fn apply_group_changes( .await?; } else { let mut new_members: BTreeSet; - // 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 - }; + let self_added = if let Some(added_addr) = + mime_parser.get_header(HeaderDef::ChatGroupMemberAdded) + { + context.is_self_addr(added_addr).await? && !chat_contacts.contains(&ContactId::SELF) + } else { + false + }; if self_added { new_members = BTreeSet::from_iter(to_ids_flat.iter().copied()); new_members.insert(ContactId::SELF);