diff --git a/src/mimefactory.rs b/src/mimefactory.rs index c37aecdc4..907e4877d 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -316,7 +316,15 @@ impl<'a> MimeFactory<'a> { match &self.loaded { Loaded::Message { chat } => { if chat.is_protected() { - PeerstateVerifiedStatus::BidirectVerified + if self.msg.get_info_type() == SystemMessage::SecurejoinMessage { + // Securejoin messages are supposed to verify a key. + // In order to do this, it is necessary that they can be sent + // to a key that is not yet verified. + // This has to work independently of whether the chat is protected right now. + PeerstateVerifiedStatus::Unverified + } else { + PeerstateVerifiedStatus::BidirectVerified + } } else { PeerstateVerifiedStatus::Unverified } diff --git a/src/tests/verified_chats.rs b/src/tests/verified_chats.rs index 36429567b..ca75a11e9 100644 --- a/src/tests/verified_chats.rs +++ b/src/tests/verified_chats.rs @@ -712,6 +712,39 @@ async fn test_break_protection_then_verify_again() -> Result<()> { Ok(()) } +/// Regression test for the following bug: +/// +/// - Scan your chat partner's QR Code +/// - They change devices +/// - Scan their QR code again +/// +/// -> The re-verification fails. +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn test_verify_then_verify_again() -> Result<()> { + let mut tcm = TestContextManager::new(); + let alice = tcm.alice().await; + let bob = tcm.bob().await; + enable_verified_oneonone_chats(&[&alice, &bob]).await; + + mark_as_verified(&alice, &bob).await; + mark_as_verified(&bob, &alice).await; + + alice.create_chat(&bob).await; + assert_verified(&alice, &bob, ProtectionStatus::Protected).await; + + tcm.section("Bob reinstalls DC"); + drop(bob); + let bob_new = tcm.unconfigured().await; + enable_verified_oneonone_chats(&[&bob_new]).await; + bob_new.configure_addr("bob@example.net").await; + e2ee::ensure_secret_key_exists(&bob_new).await?; + + tcm.execute_securejoin(&bob_new, &alice).await; + assert_verified(&alice, &bob_new, ProtectionStatus::Protected).await; + + Ok(()) +} + /// Regression test: /// - Verify a contact /// - The contact stops using DC and sends a message from a classical MUA instead