From 72515f440d83d681a71c504039c7e27f2bd41793 Mon Sep 17 00:00:00 2001 From: holger krekel Date: Tue, 31 Oct 2023 14:43:55 +0100 Subject: [PATCH] write a failing test --- python/tests/test_1_online.py | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/python/tests/test_1_online.py b/python/tests/test_1_online.py index 915c87916..39200c6a2 100644 --- a/python/tests/test_1_online.py +++ b/python/tests/test_1_online.py @@ -1699,6 +1699,68 @@ def test_qr_join_chat(acfactory, lp, verified_one_on_one_chats): assert not ch.is_protected() +def test_qr_join_chat_with_pending_bobstate_issue4894(acfactory, lp): + ac1, ac2, ac3, ac4 = acfactory.get_online_accounts(4) + + lp.sec("ac3: verify with ac2") + ac3.qr_setup_contact(ac2.get_setup_contact_qr()) + ac2._evtracker.wait_securejoin_inviter_progress(1000) + + # in order for ac2 to have pending botstate with a verified group + # we first create a fully joined verified group, and then start + # joining a second time but interrupt it, to create pending bob state + + lp.sec("ac1: create verified group that ac2 fully joins") + ch1 = ac1.create_group_chat("ac1-shutoff group", verified=True) + ac2.qr_join_chat(ch1.get_join_qr()) + ac1._evtracker.wait_securejoin_inviter_progress(1000) + + # ensure ac1 can write and ac2 receives messages in verified chat + ch1.send_text("ac1 says hello") + while 1: + msg = ac2.wait_next_incoming_message() + if msg.text == "ac1 says hello": + assert msg.chat.is_protected() + break + + lp.sec("ac1: let ac2 join again but shutoff ac1 in the middle of securejoin") + ch1b = ac2.qr_join_chat(ch1.get_join_qr()) + while 1: + ev = ac2._evtracker.get_matching("DC_EVENT_SECUREJOIN_JOINER_PROGRESS") + if ev.data2 == 400: # prevent ac1 from answering request_with_auth + ac1.shutdown() + break + + lp.sec("ac2 now has pending bobstate but ac1 is shutoff") + + # we meanwhile expect ac3/ac2 verification started in the beginning to have completed + assert ac3.get_contact(ac2).is_verified() + assert ac2.get_contact(ac3).is_verified() + + lp.sec("ac3: create a verified group VG with ac2") + vg = ac3.create_group_chat("ac3-created", [ac2], verified=True) + + # ensure ac2 receives message in VG + vg.send_text("hello") + while 1: + msg = ac2.wait_next_incoming_message() + if msg.text == "hello": + assert msg.chat.is_protected() + break + + lp.sec("ac3: create a join-code for group VG and let ac4 join, check that ac2 got it") + ac4.qr_join_chat(vg.get_join_qr()) + ac3._evtracker.wait_securejoin_inviter_progress(1000) + while 1: + ev = ac2._evtracker.get() + if "Message does not match expected" in str(ev): + pytest.fail("ac2 wrongly used a pending bobstate when seeing a member-added message") + break + + import pdb + pdb.set_trace() + + def test_qr_new_group_unblocked(acfactory, lp): """Regression test for a bug intoduced in core v1.113.0. ac2 scans a verified group QR code created by ac1.