diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d4da59dd..25e769371 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,10 @@ ### Changes - refactorings #3373 #3345 + +### Fixes - delete outgoing MDNs found in the Sent folder on Gmail #3372 +- fix searching one-to-one chats #3377 ## 1.84.0 diff --git a/src/chat.rs b/src/chat.rs index 2a9687fca..a7f0b2f62 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -1041,7 +1041,9 @@ impl Chat { if chat.id.is_archived_link() { chat.name = stock_str::archived_chats(context).await; } else { - if chat.typ == Chattype::Single { + if chat.typ == Chattype::Single && chat.name.is_empty() { + // chat.name is set to contact.display_name on changes, + // however, if things went wrong somehow, we do this here explicitly. let mut chat_name = "Err [Name not found]".to_owned(); match get_chat_contacts(context, chat.id).await { Ok(contacts) => { diff --git a/src/contact.rs b/src/contact.rs index 210cd1be3..8153c50d7 100644 --- a/src/contact.rs +++ b/src/contact.rs @@ -562,7 +562,7 @@ impl Contact { .await .ok(); - if update_name { + if update_name || update_authname { // Update the contact name also if it is used as a group name. // This is one of the few duplicated data, however, getting the chat list is easier this way. let chat_id: Option = context.sql.query_get_value( @@ -1443,7 +1443,8 @@ mod tests { use super::*; - use crate::chat::send_text_msg; + use crate::chat::{get_chat_contacts, send_text_msg, Chat}; + use crate::chatlist::Chatlist; use crate::dc_receive_imf::dc_receive_imf; use crate::message::Message; use crate::test_utils::{self, TestContext}; @@ -1684,6 +1685,118 @@ mod tests { assert!(!contact.is_blocked()); } + #[async_std::test] + async fn test_contact_name_changes() -> Result<()> { + let t = TestContext::new_alice().await; + + // first message creates contact and one-to-one-chat without name set + dc_receive_imf( + &t, + b"From: f@example.org\n\ + To: alice@example.org\n\ + Subject: foo\n\ + Message-ID: <1234-1@example.org>\n\ + Chat-Version: 1.0\n\ + Date: Sun, 29 May 2022 08:37:57 +0000\n\ + \n\ + hello one\n", + false, + ) + .await?; + let chat_id = t.get_last_msg().await.get_chat_id(); + chat_id.accept(&t).await?; + assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "f@example.org"); + let chatlist = Chatlist::try_load(&t, 0, Some("f@example.org"), None).await?; + assert_eq!(chatlist.len(), 1); + let contacts = get_chat_contacts(&t, chat_id).await?; + let contact_id = contacts.first().unwrap(); + let contact = Contact::load_from_db(&t, *contact_id).await?; + assert_eq!(contact.get_authname(), ""); + assert_eq!(contact.get_name(), ""); + assert_eq!(contact.get_display_name(), "f@example.org"); + assert_eq!(contact.get_name_n_addr(), "f@example.org"); + let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?; + assert_eq!(contacts.len(), 1); + + // second message inits the name + dc_receive_imf( + &t, + b"From: Flobbyfoo \n\ + To: alice@example.org\n\ + Subject: foo\n\ + Message-ID: <1234-2@example.org>\n\ + Chat-Version: 1.0\n\ + Date: Sun, 29 May 2022 08:38:57 +0000\n\ + \n\ + hello two\n", + false, + ) + .await?; + let chat_id = t.get_last_msg().await.get_chat_id(); + assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Flobbyfoo"); + let chatlist = Chatlist::try_load(&t, 0, Some("flobbyfoo"), None).await?; + assert_eq!(chatlist.len(), 1); + let contact = Contact::load_from_db(&t, *contact_id).await?; + assert_eq!(contact.get_authname(), "Flobbyfoo"); + assert_eq!(contact.get_name(), ""); + assert_eq!(contact.get_display_name(), "Flobbyfoo"); + assert_eq!(contact.get_name_n_addr(), "Flobbyfoo (f@example.org)"); + let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?; + assert_eq!(contacts.len(), 1); + let contacts = Contact::get_all(&t, 0, Some("flobbyfoo")).await?; + assert_eq!(contacts.len(), 1); + + // third message changes the name + dc_receive_imf( + &t, + b"From: Foo Flobby \n\ + To: alice@example.org\n\ + Subject: foo\n\ + Message-ID: <1234-3@example.org>\n\ + Chat-Version: 1.0\n\ + Date: Sun, 29 May 2022 08:39:57 +0000\n\ + \n\ + hello three\n", + false, + ) + .await?; + let chat_id = t.get_last_msg().await.get_chat_id(); + assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Foo Flobby"); + let chatlist = Chatlist::try_load(&t, 0, Some("Flobbyfoo"), None).await?; + assert_eq!(chatlist.len(), 0); + let chatlist = Chatlist::try_load(&t, 0, Some("Foo Flobby"), None).await?; + assert_eq!(chatlist.len(), 1); + let contact = Contact::load_from_db(&t, *contact_id).await?; + assert_eq!(contact.get_authname(), "Foo Flobby"); + assert_eq!(contact.get_name(), ""); + assert_eq!(contact.get_display_name(), "Foo Flobby"); + assert_eq!(contact.get_name_n_addr(), "Foo Flobby (f@example.org)"); + let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?; + assert_eq!(contacts.len(), 1); + let contacts = Contact::get_all(&t, 0, Some("flobbyfoo")).await?; + assert_eq!(contacts.len(), 0); + let contacts = Contact::get_all(&t, 0, Some("Foo Flobby")).await?; + assert_eq!(contacts.len(), 1); + + // change name manually + let test_id = Contact::create(&t, "Falk", "f@example.org").await?; + assert_eq!(*contact_id, test_id); + assert_eq!(Chat::load_from_db(&t, chat_id).await?.name, "Falk"); + let chatlist = Chatlist::try_load(&t, 0, Some("Falk"), None).await?; + assert_eq!(chatlist.len(), 1); + let contact = Contact::load_from_db(&t, *contact_id).await?; + assert_eq!(contact.get_authname(), "Foo Flobby"); + assert_eq!(contact.get_name(), "Falk"); + assert_eq!(contact.get_display_name(), "Falk"); + assert_eq!(contact.get_name_n_addr(), "Falk (f@example.org)"); + let contacts = Contact::get_all(&t, 0, Some("f@example.org")).await?; + assert_eq!(contacts.len(), 1); + let contacts = Contact::get_all(&t, 0, Some("falk")).await?; + assert_eq!(contacts.len(), 1); + + Ok(()) + } + #[async_std::test] async fn test_delete() -> Result<()> { let alice = TestContext::new_alice().await;