Make sure that we can have multiple addresses in the future

This commit is contained in:
Hocuri
2026-06-23 11:38:21 +02:00
parent d8c70dab7a
commit 8fd602bed9
4 changed files with 33 additions and 28 deletions

View File

@@ -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<String>,
/// 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<String>,
/// 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<String>,
/// Invite number.
invitenumber: String,
@@ -572,7 +572,7 @@ async fn decode_openpgp(context: &Context, qr: &str) -> Result<Qr> {
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<Qr> {
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<Qr> {
Ok(Qr::AskVerifyContact {
contact_id,
fingerprint,
addr,
addrs: vec![addr.to_string()],
invitenumber,
authcode,
is_v3,

View File

@@ -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(())

View File

@@ -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 {

View File

@@ -18,7 +18,8 @@ pub enum QrInvite {
Contact {
contact_id: ContactId,
fingerprint: Fingerprint,
addr: String,
#[serde(default)]
addrs: Vec<String>,
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<String>,
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<String>,
name: String,
grpid: String,
invitenumber: String,
@@ -96,11 +99,11 @@ impl QrInvite {
}
}
pub(crate) fn addr(&self) -> &str {
pub(crate) fn addrs(&self) -> &Vec<String> {
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<Qr> 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<Qr> 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<Qr> for QrInvite {
grpid,
contact_id,
fingerprint,
addr,
addrs,
authcode,
invitenumber,
is_v3,
@@ -158,7 +161,7 @@ impl TryFrom<Qr> for QrInvite {
grpid,
contact_id,
fingerprint,
addr: addr.to_string(),
addrs,
authcode,
invitenumber,
is_v3,