diff --git a/deltachat-ffi/deltachat.h b/deltachat-ffi/deltachat.h index 47452f6ac..507fbe76c 100644 --- a/deltachat-ffi/deltachat.h +++ b/deltachat-ffi/deltachat.h @@ -5811,7 +5811,7 @@ void dc_event_unref(dc_event_t* event); * @param data2 (int) The progress as: * 300=vg-/vc-request received, typically shown as "bob@addr joins". * 600=vg-/vc-request-with-auth received, vg-member-added/vc-contact-confirm sent, typically shown as "bob@addr verified". - * 800=vg-member-added-received received, shown as "bob@addr securely joined GROUP", only sent for the verified-group-protocol. + * 800=contact added to chat, shown as "bob@addr securely joined GROUP". Only for the verified-group-protocol. * 1000=Protocol finished for this contact. */ #define DC_EVENT_SECUREJOIN_INVITER_PROGRESS 2060 diff --git a/python/tests/test_0_complex_or_slow.py b/python/tests/test_0_complex_or_slow.py index 48e4467fc..43e2b16c7 100644 --- a/python/tests/test_0_complex_or_slow.py +++ b/python/tests/test_0_complex_or_slow.py @@ -521,6 +521,9 @@ def test_see_new_verified_member_after_going_online(acfactory, tmpdir, lp): ac1._evtracker.wait_securejoin_inviter_progress(1000) lp.sec("ac2: sending message") + # Message can be sent only after a receipt of "vg-member-added" message. Just wait for + # "Member Me () added by ." message. + ac2._evtracker.wait_next_incoming_message() msg_out = chat2.send_text("hello") lp.sec("ac1: receiving message") diff --git a/src/events.rs b/src/events.rs index b2744f4d5..6d2962341 100644 --- a/src/events.rs +++ b/src/events.rs @@ -283,7 +283,7 @@ pub enum EventType { /// @param data2 (int) Progress as: /// 300=vg-/vc-request received, typically shown as "bob@addr joins". /// 600=vg-/vc-request-with-auth received, vg-member-added/vc-contact-confirm sent, typically shown as "bob@addr verified". - /// 800=vg-member-added-received received, shown as "bob@addr securely joined GROUP", only sent for the verified-group-protocol. + /// 800=contact added to chat, shown as "bob@addr securely joined GROUP". Only for the verified-group-protocol. /// 1000=Protocol finished for this contact. SecurejoinInviterProgress { contact_id: ContactId, diff --git a/src/mimefactory.rs b/src/mimefactory.rs index b0918d484..7f1f7b5d2 100644 --- a/src/mimefactory.rs +++ b/src/mimefactory.rs @@ -917,6 +917,17 @@ impl<'a> MimeFactory<'a> { "Secure-Join".to_string(), "vg-member-added".to_string(), )); + // FIXME: Old clients require Secure-Join-Fingerprint header. Remove this + // eventually. + let fingerprint = Peerstate::from_addr(context, email_to_add) + .await? + .context("No peerstate found in db")? + .public_key_fingerprint + .context("No public key fingerprint in db for the member to add")?; + headers.protected.push(Header::new( + "Secure-Join-Fingerprint".into(), + fingerprint.hex(), + )); } } SystemMessage::GroupNameChanged => { diff --git a/src/securejoin.rs b/src/securejoin.rs index eff6abd56..4da710ac4 100644 --- a/src/securejoin.rs +++ b/src/securejoin.rs @@ -455,6 +455,8 @@ pub(crate) async fn handle_securejoin_handshake( } None => bail!("Chat {} not found", &field_grpid), } + inviter_progress!(context, contact_id, 800); + inviter_progress!(context, contact_id, 1000); } else { // Alice -> Bob secure_connection_established( @@ -503,9 +505,6 @@ pub(crate) async fn handle_securejoin_handshake( return Ok(HandshakeMessage::Ignore); } if join_vg { - // Responsible for showing "$Bob securely joined $group" message - inviter_progress!(context, contact_id, 800); - inviter_progress!(context, contact_id, 1000); let field_grpid = mime_message .get_header(HeaderDef::SecureJoinGroup) .map(|s| s.as_str()) @@ -670,6 +669,12 @@ pub(crate) async fn observe_securejoin_on_other_device( .await?; return Ok(HandshakeMessage::Ignore); } + if step.as_str() == "vg-member-added" { + inviter_progress!(context, contact_id, 800); + } + if step.as_str() == "vg-member-added" || step.as_str() == "vc-contact-confirm" { + inviter_progress!(context, contact_id, 1000); + } Ok(if step.as_str() == "vg-member-added" { HandshakeMessage::Propagate } else { @@ -768,6 +773,7 @@ mod tests { use crate::chatlist::Chatlist; use crate::constants::{Chattype, DC_GCM_ADDDAYMARKER}; use crate::contact::ContactAddress; + use crate::contact::VerifiedStatus; use crate::peerstate::Peerstate; use crate::receive_imf::receive_imf; use crate::test_utils::{TestContext, TestContextManager};