From 08cbc54c00a2ee9d1f0ddbbd6d86b20163782ce3 Mon Sep 17 00:00:00 2001 From: link2xt Date: Thu, 11 Apr 2024 05:39:51 +0000 Subject: [PATCH] fix: assign messages to chats based on not fully downloaded references --- deltachat-rpc-client/tests/test_something.py | 37 ++++++++++++++++++++ src/chat.rs | 15 +------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/deltachat-rpc-client/tests/test_something.py b/deltachat-rpc-client/tests/test_something.py index fbf869d1a..8ca9abad6 100644 --- a/deltachat-rpc-client/tests/test_something.py +++ b/deltachat-rpc-client/tests/test_something.py @@ -538,3 +538,40 @@ def test_reactions_for_a_reordering_move(acfactory): assert len(contacts) == 1 assert contacts[0].get_snapshot().address == ac1.get_config("addr") assert list(reactions.reactions_by_contact.values())[0] == [react_str] + + +def test_download_limit_chat_assignment(acfactory, tmp_path): + download_limit = 300000 + alice, bob, carol = acfactory.get_online_accounts(3) + + for account in bob, carol: + chat = account.create_chat(alice) + chat.send_text("Hello Alice!") + assert alice.get_message_by_id(alice.wait_for_incoming_msg_event().msg_id).get_snapshot().text == "Hello Alice!" + + bob_addr = bob.get_config("addr") + alice_contact_bob = alice.create_contact(bob_addr, "Bob") + + carol_addr = carol.get_config("addr") + alice_contact_carol = alice.create_contact(carol_addr, "Carol") + + alice_group = alice.create_group("test group") + alice_group.add_contact(alice_contact_bob) + alice_group.add_contact(alice_contact_carol) + + bob.set_config("download_limit", str(download_limit)) + + alice_group.send_text("hi") + snapshot = bob.get_message_by_id(bob.wait_for_incoming_msg_event().msg_id).get_snapshot() + assert snapshot.text == "hi" + bob_group = snapshot.chat + + path = tmp_path / "large" + path.write_bytes(os.urandom(download_limit + 1)) + + for i in range(10): + logging.info("Sending message %s", i) + alice_group.send_file(str(path)) + snapshot = bob.get_message_by_id(bob.wait_for_incoming_msg_event().msg_id).get_snapshot() + assert snapshot.download_state == DownloadState.AVAILABLE + assert snapshot.chat == bob_group diff --git a/src/chat.rs b/src/chat.rs index edb7d8209..b3616753d 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -209,24 +209,11 @@ impl ChatId { } /// Returns [`ChatId`] of a chat that `msg` belongs to. - /// - /// Checks that `msg` is assigned to the right chat. pub(crate) fn lookup_by_message(msg: &Message) -> Option { if msg.chat_id == DC_CHAT_ID_TRASH { return None; } - if msg.download_state != DownloadState::Done - // TODO (2023-09-12): Added for backward compatibility with versions that did not have - // `DownloadState::Undecipherable`. Remove eventually with the comment in - // `MimeMessage::from_bytes()`. - || msg - .error - .as_ref() - .filter(|e| e.starts_with("Decrypting failed:")) - .is_some() - { - // If `msg` is not fully downloaded or undecipherable, it may have been assigned to the - // wrong chat (they often get assigned to the 1:1 chat with the sender). + if msg.download_state == DownloadState::Undecipherable { return None; } Some(msg.chat_id)