mirror of
https://github.com/chatmail/core.git
synced 2026-05-08 17:36:29 +03:00
fix: Keep tombstones for two days before deleting (#3685)
This is a way to prevent redownloading locally deleted messages. Otherwise if a message is deleted quickly after sending and `bcc_self` is configured, the BCC copy is downloaded and appears as a new message as it happens for messages sent from another device.
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
import deltachat as dc
|
import deltachat as dc
|
||||||
@@ -675,3 +676,16 @@ def test_verified_group_vs_delete_server_after(acfactory, tmp_path, lp):
|
|||||||
assert msg_in.chat == chat2_offl
|
assert msg_in.chat == chat2_offl
|
||||||
assert msg_in.get_sender_contact().addr == ac2.get_config("addr")
|
assert msg_in.get_sender_contact().addr == ac2.get_config("addr")
|
||||||
assert ac2_offl_ac1_contact.is_verified()
|
assert ac2_offl_ac1_contact.is_verified()
|
||||||
|
|
||||||
|
|
||||||
|
def test_deleted_msgs_dont_reappear(acfactory):
|
||||||
|
ac1 = acfactory.new_online_configuring_account()
|
||||||
|
acfactory.bring_accounts_online()
|
||||||
|
ac1.set_config("bcc_self", "1")
|
||||||
|
chat = ac1.get_self_contact().create_chat()
|
||||||
|
msg = chat.send_text("hello")
|
||||||
|
ac1._evtracker.get_matching("DC_EVENT_SMTP_MESSAGE_SENT")
|
||||||
|
ac1.delete_messages([msg])
|
||||||
|
ac1._evtracker.get_matching("DC_EVENT_MSG_DELETED")
|
||||||
|
time.sleep(5)
|
||||||
|
assert len(chat.get_messages()) == 0
|
||||||
|
|||||||
@@ -990,16 +990,19 @@ async fn maybe_add_from_param(
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Removes from the database locally deleted messages that also don't
|
/// Removes from the database stale locally deleted messages that also don't
|
||||||
/// have a server UID.
|
/// have a server UID.
|
||||||
async fn prune_tombstones(sql: &Sql) -> Result<()> {
|
async fn prune_tombstones(sql: &Sql) -> Result<()> {
|
||||||
|
// Keep tombstones for the last two days to prevent redownloading locally deleted messages.
|
||||||
|
let timestamp_max = time().saturating_sub(2 * 24 * 3600);
|
||||||
sql.execute(
|
sql.execute(
|
||||||
"DELETE FROM msgs
|
"DELETE FROM msgs
|
||||||
WHERE chat_id=?
|
WHERE chat_id=?
|
||||||
|
AND timestamp<=?
|
||||||
AND NOT EXISTS (
|
AND NOT EXISTS (
|
||||||
SELECT * FROM imap WHERE msgs.rfc724_mid=rfc724_mid AND target!=''
|
SELECT * FROM imap WHERE msgs.rfc724_mid=rfc724_mid AND target!=''
|
||||||
)",
|
)",
|
||||||
(DC_CHAT_ID_TRASH,),
|
(DC_CHAT_ID_TRASH, timestamp_max),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
Reference in New Issue
Block a user