diff --git a/src/chat/chat_tests.rs b/src/chat/chat_tests.rs index 793db819b..162768059 100644 --- a/src/chat/chat_tests.rs +++ b/src/chat/chat_tests.rs @@ -5816,7 +5816,7 @@ async fn test_send_delete_request() -> Result<()> { let sent2 = alice.pop_sent_msg().await; assert_eq!(alice_chat.id.get_msg_cnt(alice).await?, E2EE_INFO_MSGS + 1); - // Bob receives both messages and has nothing the end + // Bob receives both messages and has nothing at the end let bob_msg = bob.recv_msg(&sent1).await; assert_eq!(bob_msg.text, "wtf"); assert_eq!(bob_msg.chat_id.get_msg_cnt(bob).await?, E2EE_INFO_MSGS + 2); @@ -5824,6 +5824,11 @@ async fn test_send_delete_request() -> Result<()> { bob.recv_msg_opt(&sent2).await; assert_eq!(bob_msg.chat_id.get_msg_cnt(bob).await?, E2EE_INFO_MSGS + 1); + // ... even if he receives messages in reverse order. + let bob2 = &tcm.bob().await; + bob2.recv_msg_opt(&sent2).await; + assert!(bob2.recv_msg_opt(&sent1).await.is_none()); + // Alice has another device, and there is also nothing at the end let alice2 = &tcm.alice().await; alice2.recv_msg(&sent0).await; diff --git a/src/message.rs b/src/message.rs index 1a0d134ac..a9bcff9bb 100644 --- a/src/message.rs +++ b/src/message.rs @@ -529,7 +529,7 @@ impl Message { FROM msgs m LEFT JOIN chats c ON c.id=m.chat_id LEFT JOIN msgs_mdns mdns ON mdns.msg_id=m.id - WHERE m.id=? AND chat_id!=3 + WHERE m.id=? AND chat_id!=3 -- DC_CHAT_ID_TRASH LIMIT 1", (id,), |row| { diff --git a/src/receive_imf.rs b/src/receive_imf.rs index 443c9dc37..807d57ac1 100644 --- a/src/receive_imf.rs +++ b/src/receive_imf.rs @@ -533,15 +533,14 @@ pub(crate) async fn receive_imf_inner( replace_msg_id = None; replace_chat_id = None; } else if let Some(old_msg_id) = message::rfc724_mid_exists(context, rfc724_mid).await? { - // This code handles the download of old partial download stub messages - // It will be removed after a transitioning period, - // after we have released a few versions with pre-messages replace_msg_id = Some(old_msg_id); replace_chat_id = if let Some(msg) = Message::load_from_db_optional(context, old_msg_id) .await? .filter(|msg| msg.download_state() != DownloadState::Done) { - // The message was partially downloaded before. + // This code handles the download of old partial download stub messages + // It will be removed after a transitioning period, + // after we have released a few versions with pre-messages match mime_parser.pre_message { PreMessageMode::Post | PreMessageMode::None => { info!(context, "Message already partly in DB, replacing."); @@ -553,8 +552,10 @@ pub(crate) async fn receive_imf_inner( } } } else { - // The message was already fully downloaded - // or cannot be loaded because it is deleted. + info!( + context, + "Message {rfc724_mid} is fully downloaded or deleted." + ); None }; } else { @@ -2454,6 +2455,7 @@ async fn handle_edit_delete( let rfc724_mid_vec: Vec<&str> = rfc724_mid_list.split_whitespace().collect(); for rfc724_mid in rfc724_mid_vec { + let rfc724_mid = rfc724_mid.trim_start_matches('<').trim_end_matches('>'); if let Some(msg_id) = message::rfc724_mid_exists(context, rfc724_mid).await? { if let Some(msg) = Message::load_from_db_optional(context, msg_id).await? { if msg.from_id == from_id { @@ -2468,6 +2470,8 @@ async fn handle_edit_delete( } } else { warn!(context, "Delete message: {rfc724_mid:?} not found."); + // Insert a tombstone so that the message will be ignored if it arrives later within a period specified in prune_tombstones(). + insert_tombstone(context, rfc724_mid).await?; } } message::delete_msgs_locally_done(context, &msg_ids, modified_chat_ids).await?;