From 8fd602bed9bcadbf17fa5f5cc4c0398aee533524 Mon Sep 17 00:00:00 2001 From: Hocuri Date: Tue, 23 Jun 2026 11:38:21 +0200 Subject: [PATCH] Make sure that we can have multiple addresses in the future --- src/qr.rs | 18 +++++++++--------- src/securejoin.rs | 4 ++-- src/securejoin/bob.rs | 10 ++++++---- src/securejoin/qrinvite.rs | 29 ++++++++++++++++------------- 4 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/qr.rs b/src/qr.rs index 54baa525a..9a0724955 100644 --- a/src/qr.rs +++ b/src/qr.rs @@ -56,8 +56,8 @@ pub enum Qr { /// Fingerprint of the contact key as scanned from the QR code. fingerprint: Fingerprint, - /// The inviter's address. - addr: ContactAddress, + /// The inviter's addresses. + addrs: Vec, /// Invite number. invitenumber: String, @@ -83,8 +83,8 @@ pub enum Qr { /// Fingerprint of the contact key as scanned from the QR code. fingerprint: Fingerprint, - /// The inviter's address. - addr: ContactAddress, + /// The inviter's addresses. + addrs: Vec, /// Invite number. invitenumber: String, @@ -114,8 +114,8 @@ pub enum Qr { /// Fingerprint of the contact's key as scanned from the QR code. fingerprint: Fingerprint, - /// The inviter's address. - addr: ContactAddress, + /// The inviter's addresses. + addrs: Vec, /// Invite number. invitenumber: String, @@ -572,7 +572,7 @@ async fn decode_openpgp(context: &Context, qr: &str) -> Result { grpid, contact_id, fingerprint, - addr, + addrs: vec![addr.to_string()], invitenumber, authcode, is_v3, @@ -609,7 +609,7 @@ async fn decode_openpgp(context: &Context, qr: &str) -> Result { grpid, contact_id, fingerprint, - addr, + addrs: vec![addr.to_string()], invitenumber, authcode, is_v3, @@ -635,7 +635,7 @@ async fn decode_openpgp(context: &Context, qr: &str) -> Result { Ok(Qr::AskVerifyContact { contact_id, fingerprint, - addr, + addrs: vec![addr.to_string()], invitenumber, authcode, is_v3, diff --git a/src/securejoin.rs b/src/securejoin.rs index 068bf0fa1..98442cd08 100644 --- a/src/securejoin.rs +++ b/src/securejoin.rs @@ -741,7 +741,7 @@ pub(crate) async fn handle_securejoin_handshake( async fn insert_into_smtp( context: &Context, rfc724_mid: &str, - recipient: &str, + recipients: &str, rendered_message: String, msg_id: MsgId, ) -> Result<(), Error> { @@ -750,7 +750,7 @@ async fn insert_into_smtp( .execute( "INSERT INTO smtp (rfc724_mid, recipients, mime, msg_id) VALUES (?1, ?2, ?3, ?4)", - (&rfc724_mid, &recipient, &rendered_message, msg_id), + (&rfc724_mid, &recipients, &rendered_message, msg_id), ) .await?; Ok(()) diff --git a/src/securejoin/bob.rs b/src/securejoin/bob.rs index 40e9a9c72..34083c143 100644 --- a/src/securejoin/bob.rs +++ b/src/securejoin/bob.rs @@ -69,8 +69,10 @@ pub(super) async fn start_protocol(context: &Context, invite: QrInvite) -> Resul .await?; let has_up_to_date_key = if let Some(public_key_bytes) = public_key_bytes { let public_key = SignedPublicKey::from_slice(&public_key_bytes)?; - let addrs = addresses_from_public_key(&public_key); - addrs.is_some_and(|addrs| addrs.iter().any(|a| a == invite.addr())) + let addrs_in_key = addresses_from_public_key(&public_key); + // The key is up to date if it contains all the addresses from the QR code: + addrs_in_key + .is_some_and(|addrs_in_key| invite.addrs().iter().all(|a| addrs_in_key.contains(a))) } else { false }; @@ -319,7 +321,7 @@ pub(crate) async fn send_handshake_message( if invite.is_v3() && matches!(step, BobHandshakeMsg::Request) { // Send a minimal symmetrically-encrypted vc-request-pubkey message let rfc724_mid = create_outgoing_rfc724_mid(); - let recipient = invite.addr(); + let recipients = invite.addrs().join(" "); let alice_fp = invite.fingerprint().hex(); let auth = invite.authcode(); let shared_secret = format!("securejoin/{alice_fp}/{auth}"); @@ -335,7 +337,7 @@ pub(crate) async fn send_handshake_message( .await?; let msg_id = message::insert_tombstone(context, &rfc724_mid).await?; - insert_into_smtp(context, &rfc724_mid, recipient, rendered_message, msg_id).await?; + insert_into_smtp(context, &rfc724_mid, &recipients, rendered_message, msg_id).await?; context.scheduler.interrupt_smtp().await; } else { let mut msg = Message { diff --git a/src/securejoin/qrinvite.rs b/src/securejoin/qrinvite.rs index 2ca057ff6..a912a4d38 100644 --- a/src/securejoin/qrinvite.rs +++ b/src/securejoin/qrinvite.rs @@ -18,7 +18,8 @@ pub enum QrInvite { Contact { contact_id: ContactId, fingerprint: Fingerprint, - addr: String, + #[serde(default)] + addrs: Vec, invitenumber: String, authcode: String, #[serde(default)] @@ -27,7 +28,8 @@ pub enum QrInvite { Group { contact_id: ContactId, fingerprint: Fingerprint, - addr: String, + #[serde(default)] + addrs: Vec, name: String, grpid: String, invitenumber: String, @@ -38,7 +40,8 @@ pub enum QrInvite { Broadcast { contact_id: ContactId, fingerprint: Fingerprint, - addr: String, + #[serde(default)] + addrs: Vec, name: String, grpid: String, invitenumber: String, @@ -96,11 +99,11 @@ impl QrInvite { } } - pub(crate) fn addr(&self) -> &str { + pub(crate) fn addrs(&self) -> &Vec { match self { - QrInvite::Contact { addr, .. } => addr, - QrInvite::Group { addr, .. } => addr, - QrInvite::Broadcast { addr, .. } => addr, + QrInvite::Contact { addrs, .. } => addrs, + QrInvite::Group { addrs, .. } => addrs, + QrInvite::Broadcast { addrs, .. } => addrs, } } } @@ -113,14 +116,14 @@ impl TryFrom for QrInvite { Qr::AskVerifyContact { contact_id, fingerprint, - addr, + addrs, invitenumber, authcode, is_v3, } => Ok(QrInvite::Contact { contact_id, fingerprint, - addr: addr.to_string(), + addrs, invitenumber, authcode, is_v3, @@ -130,14 +133,14 @@ impl TryFrom for QrInvite { grpid, contact_id, fingerprint, - addr, + addrs, invitenumber, authcode, is_v3, } => Ok(QrInvite::Group { contact_id, fingerprint, - addr: addr.to_string(), + addrs, name: grpname, grpid, invitenumber, @@ -149,7 +152,7 @@ impl TryFrom for QrInvite { grpid, contact_id, fingerprint, - addr, + addrs, authcode, invitenumber, is_v3, @@ -158,7 +161,7 @@ impl TryFrom for QrInvite { grpid, contact_id, fingerprint, - addr: addr.to_string(), + addrs, authcode, invitenumber, is_v3,