Skip to content

Commit 1c72472

Browse files
committed
Send Done message when confirming in MacReceived state
Being in MacReceived state means that the other party has confirmed that emojis/numbers match and the sent mac messages has been successfully checked. When now confirming ourselves this means that the verification was successful and thus the Done message can be sent to the other party.
1 parent 0e4057f commit 1c72472

File tree

5 files changed

+47
-44
lines changed

5 files changed

+47
-44
lines changed

crates/matrix-sdk-crypto/src/machine.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2147,25 +2147,17 @@ pub(crate) mod test {
21472147
assert_eq!(alice_sas.emoji(), bob_sas.emoji());
21482148
assert_eq!(alice_sas.decimals(), bob_sas.decimals());
21492149

2150-
let event = bob_sas
2151-
.confirm()
2152-
.await
2153-
.unwrap()
2154-
.0
2155-
.map(|r| request_to_event(bob.user_id(), &r))
2156-
.unwrap();
2150+
let contents = bob_sas.confirm().await.unwrap().0;
2151+
assert!(contents.len() == 1);
2152+
let event = request_to_event(bob.user_id(), &contents[0]);
21572153
alice.handle_verification_event(&event).await;
21582154

21592155
assert!(!alice_sas.is_done());
21602156
assert!(!bob_sas.is_done());
21612157

2162-
let event = alice_sas
2163-
.confirm()
2164-
.await
2165-
.unwrap()
2166-
.0
2167-
.map(|r| request_to_event(alice.user_id(), &r))
2168-
.unwrap();
2158+
let contents = alice_sas.confirm().await.unwrap().0;
2159+
assert!(contents.len() == 1);
2160+
let event = request_to_event(alice.user_id(), &contents[0]);
21692161

21702162
assert!(alice_sas.is_done());
21712163
assert!(bob_device.verified());

crates/matrix-sdk-crypto/src/verification/machine.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,12 +642,16 @@ mod test {
642642
assert!(bob.emoji().is_some());
643643
assert_eq!(alice.emoji(), bob.emoji());
644644

645-
let request = alice.confirm().await.unwrap().0.unwrap();
645+
let mut requests = alice.confirm().await.unwrap().0;
646+
assert!(requests.len() == 1);
647+
let request = requests.pop().unwrap();
646648
let content = OutgoingContent::try_from(request).unwrap();
647649
let content = MacContent::try_from(&content).unwrap().into();
648650
bob.receive_any_event(alice.user_id(), &content);
649651

650-
let request = bob.confirm().await.unwrap().0.unwrap();
652+
let mut requests = bob.confirm().await.unwrap().0;
653+
assert!(requests.len() == 1);
654+
let request = requests.pop().unwrap();
651655
let content = OutgoingContent::try_from(request).unwrap();
652656
let content = MacContent::try_from(&content).unwrap().into();
653657
alice.receive_any_event(bob.user_id(), &content);

crates/matrix-sdk-crypto/src/verification/sas/inner_sas.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,27 +228,27 @@ impl InnerSas {
228228
(InnerSas::Cancelled(sas), Some(content))
229229
}
230230

231-
pub fn confirm(self) -> (InnerSas, Option<OutgoingContent>) {
231+
pub fn confirm(self) -> (InnerSas, Vec<OutgoingContent>) {
232232
match self {
233233
InnerSas::KeyReceived(s) => {
234234
let sas = s.confirm();
235235
let content = sas.as_content();
236-
(InnerSas::Confirmed(sas), Some(content))
236+
(InnerSas::Confirmed(sas), vec![content])
237237
}
238238
InnerSas::MacReceived(s) => {
239239
if s.started_from_request {
240240
let sas = s.confirm_and_wait_for_done();
241-
let content = sas.as_content();
241+
let contents = vec![sas.as_content(), sas.done_content()];
242242

243-
(InnerSas::WaitingForDone(sas), Some(content))
243+
(InnerSas::WaitingForDone(sas), contents)
244244
} else {
245245
let sas = s.confirm();
246246
let content = sas.as_content();
247247

248-
(InnerSas::Done(sas), Some(content))
248+
(InnerSas::Done(sas), vec![content])
249249
}
250250
}
251-
_ => (self, None),
251+
_ => (self, Vec::new()),
252252
}
253253
}
254254

crates/matrix-sdk-crypto/src/verification/sas/mod.rs

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -355,27 +355,28 @@ impl Sas {
355355
/// the server.
356356
pub async fn confirm(
357357
&self,
358-
) -> Result<
359-
(Option<OutgoingVerificationRequest>, Option<SignatureUploadRequest>),
360-
CryptoStoreError,
361-
> {
362-
let (content, done) = {
358+
) -> Result<(Vec<OutgoingVerificationRequest>, Option<SignatureUploadRequest>), CryptoStoreError>
359+
{
360+
let (contents, done) = {
363361
let mut guard = self.inner.lock().unwrap();
364362
let sas: InnerSas = (*guard).clone();
365-
let (sas, content) = sas.confirm();
363+
let (sas, contents) = sas.confirm();
366364

367365
*guard = sas;
368-
(content, guard.is_done())
366+
(contents, guard.is_done())
369367
};
370368

371-
let mac_request = content.map(|c| match c {
372-
OutgoingContent::ToDevice(c) => self.content_to_request(c).into(),
373-
OutgoingContent::Room(r, c) => {
374-
RoomMessageRequest { room_id: r, txn_id: Uuid::new_v4(), content: c }.into()
375-
}
376-
});
369+
let mac_requests = contents
370+
.into_iter()
371+
.map(|c| match c {
372+
OutgoingContent::ToDevice(c) => self.content_to_request(c).into(),
373+
OutgoingContent::Room(r, c) => {
374+
RoomMessageRequest { room_id: r, txn_id: Uuid::new_v4(), content: c }.into()
375+
}
376+
})
377+
.collect::<Vec<_>>();
377378

378-
if mac_request.is_some() {
379+
if !mac_requests.is_empty() {
379380
trace!(
380381
user_id = self.other_user_id().as_str(),
381382
device_id = self.other_device_id().as_str(),
@@ -385,12 +386,14 @@ impl Sas {
385386

386387
if done {
387388
match self.mark_as_done().await? {
388-
VerificationResult::Cancel(c) => Ok((self.cancel_with_code(c), None)),
389-
VerificationResult::Ok => Ok((mac_request, None)),
390-
VerificationResult::SignatureUpload(r) => Ok((mac_request, Some(r))),
389+
VerificationResult::Cancel(c) => {
390+
Ok((self.cancel_with_code(c).into_iter().collect(), None))
391+
}
392+
VerificationResult::Ok => Ok((mac_requests, None)),
393+
VerificationResult::SignatureUpload(r) => Ok((mac_requests, Some(r))),
391394
}
392395
} else {
393-
Ok((mac_request, None))
396+
Ok((mac_requests, None))
394397
}
395398
}
396399

@@ -650,12 +653,16 @@ mod test {
650653
assert_eq!(alice.emoji().unwrap(), bob.emoji().unwrap());
651654
assert_eq!(alice.decimals().unwrap(), bob.decimals().unwrap());
652655

653-
let request = alice.confirm().await.unwrap().0.unwrap();
656+
let mut requests = alice.confirm().await.unwrap().0;
657+
assert!(requests.len() == 1);
658+
let request = requests.pop().unwrap();
654659
let content = OutgoingContent::try_from(request).unwrap();
655660
let content = MacContent::try_from(&content).unwrap();
656661
bob.receive_any_event(alice.user_id(), &content.into());
657662

658-
let request = bob.confirm().await.unwrap().0.unwrap();
663+
let mut requests = bob.confirm().await.unwrap().0;
664+
assert!(requests.len() == 1);
665+
let request = requests.pop().unwrap();
659666
let content = OutgoingContent::try_from(request).unwrap();
660667
let content = MacContent::try_from(&content).unwrap();
661668
alice.receive_any_event(bob.user_id(), &content.into());

crates/matrix-sdk/src/encryption/verification/sas.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ impl SasVerification {
7676

7777
/// Confirm that the short auth strings match on both sides.
7878
pub async fn confirm(&self) -> Result<()> {
79-
let (request, signature) = self.inner.confirm().await?;
79+
let (requests, signature) = self.inner.confirm().await?;
8080

81-
if let Some(request) = request {
81+
for request in requests {
8282
self.client.send_verification_request(request).await?;
8383
}
8484

0 commit comments

Comments
 (0)