Skip to content

Commit 712b83e

Browse files
committed
feat: Add forwarder and forwarder_device to EncryptionInfo.
Signed-off-by: Skye Elliot <[email protected]>
1 parent b3f6df9 commit 712b83e

File tree

7 files changed

+61
-3
lines changed

7 files changed

+61
-3
lines changed

crates/matrix-sdk-base/src/event_cache/store/integration_tests.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ pub fn make_test_event_with_event_id(
7979
let encryption_info = Arc::new(EncryptionInfo {
8080
sender: (*ALICE).into(),
8181
sender_device: None,
82+
forwarder: None,
83+
forwarder_device: None,
8284
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
8385
curve25519_key: "1337".to_owned(),
8486
sender_claimed_keys: Default::default(),

crates/matrix-sdk-common/src/deserialized_responses.rs

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,17 @@ pub struct EncryptionInfo {
328328
/// The device ID of the device that sent us the event, note this is
329329
/// untrusted data unless `verification_state` is `Verified` as well.
330330
pub sender_device: Option<OwnedDeviceId>,
331+
/// If the keys for this message shared-on-invite as part of an
332+
/// [MSC4268] key bundle, the ID of the user who sent them to us.
333+
///
334+
/// [MSC4268]: https://github.com/matrix-org/matrix-spec-proposals/pull/4268
335+
pub forwarder: Option<OwnedUserId>,
336+
/// If the keys for this message were shared-on-invite as part of an
337+
/// [MSC4268] key bundle, the ID of the device from which they were
338+
/// sent.
339+
///
340+
/// [MSC4268]: https://github.com/matrix-org/matrix-spec-proposals/pull/4268
341+
pub forwarder_device: Option<OwnedDeviceId>,
331342
/// Information about the algorithm that was used to encrypt the event.
332343
pub algorithm_info: AlgorithmInfo,
333344
/// The verification state of the device that sent us the event, note this
@@ -361,14 +372,23 @@ impl<'de> Deserialize<'de> for EncryptionInfo {
361372
struct Helper {
362373
pub sender: OwnedUserId,
363374
pub sender_device: Option<OwnedDeviceId>,
375+
pub forwarder: Option<OwnedUserId>,
376+
pub forwarder_device: Option<OwnedDeviceId>,
364377
pub algorithm_info: AlgorithmInfo,
365378
pub verification_state: VerificationState,
366379
#[serde(rename = "session_id")]
367380
pub old_session_id: Option<String>,
368381
}
369382

370-
let Helper { sender, sender_device, algorithm_info, verification_state, old_session_id } =
371-
Helper::deserialize(deserializer)?;
383+
let Helper {
384+
sender,
385+
sender_device,
386+
forwarder,
387+
forwarder_device,
388+
algorithm_info,
389+
verification_state,
390+
old_session_id,
391+
} = Helper::deserialize(deserializer)?;
372392

373393
let algorithm_info = match algorithm_info {
374394
AlgorithmInfo::MegolmV1AesSha2 { curve25519_key, sender_claimed_keys, session_id } => {
@@ -382,7 +402,14 @@ impl<'de> Deserialize<'de> for EncryptionInfo {
382402
other => other,
383403
};
384404

385-
Ok(EncryptionInfo { sender, sender_device, algorithm_info, verification_state })
405+
Ok(EncryptionInfo {
406+
sender,
407+
sender_device,
408+
forwarder,
409+
forwarder_device,
410+
algorithm_info,
411+
verification_state,
412+
})
386413
}
387414
}
388415

@@ -1617,6 +1644,8 @@ mod tests {
16171644
encryption_info: Arc::new(EncryptionInfo {
16181645
sender: user_id!("@sender:example.com").to_owned(),
16191646
sender_device: None,
1647+
forwarder: None,
1648+
forwarder_device: None,
16201649
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
16211650
curve25519_key: "xxx".to_owned(),
16221651
sender_claimed_keys: Default::default(),
@@ -2041,6 +2070,8 @@ mod tests {
20412070
let info = EncryptionInfo {
20422071
sender: user_id!("@alice:localhost").to_owned(),
20432072
sender_device: Some(device_id!("ABCDEFGH").to_owned()),
2073+
forwarder: None,
2074+
forwarder_device: None,
20442075
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
20452076
curve25519_key: "curvecurvecurve".into(),
20462077
sender_claimed_keys: Default::default(),
@@ -2062,6 +2093,8 @@ mod tests {
20622093
encryption_info: Arc::new(EncryptionInfo {
20632094
sender: user_id!("@sender:example.com").to_owned(),
20642095
sender_device: Some(device_id!("ABCDEFGHIJ").to_owned()),
2096+
forwarder: None,
2097+
forwarder_device: None,
20652098
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
20662099
curve25519_key: "xxx".to_owned(),
20672100
sender_claimed_keys: BTreeMap::from([

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,8 @@ impl OlmMachine {
11361136
EncryptionInfo {
11371137
sender: self.inner.user_id.clone(),
11381138
sender_device: Some(self.inner.device_id.clone()),
1139+
forwarder: None,
1140+
forwarder_device: None,
11391141
algorithm_info,
11401142
verification_state: VerificationState::Verified,
11411143
}
@@ -2021,6 +2023,15 @@ impl OlmMachine {
20212023
Ok(Arc::new(EncryptionInfo {
20222024
sender,
20232025
sender_device: device_id,
2026+
forwarder: session.forwarder_data.as_ref().and_then(|data| data.user_id()),
2027+
forwarder_device: session.forwarder_data.as_ref().and_then(|data| match data {
2028+
SenderData::SenderUnverified(known_sender_data)
2029+
| SenderData::SenderVerified(known_sender_data) => {
2030+
known_sender_data.device_id.clone()
2031+
}
2032+
// TODO: This should never happen.
2033+
_ => None,
2034+
}),
20242035
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
20252036
curve25519_key: session.sender_key().to_base64(),
20262037
sender_claimed_keys: session

crates/matrix-sdk-crypto/src/olm/account.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,6 +1704,8 @@ impl Account {
17041704
EncryptionInfo {
17051705
sender: sender_id.to_owned(),
17061706
sender_device: sender_device.as_ref().map(|d| d.device_id().to_owned()),
1707+
forwarder: None,
1708+
forwarder_device: None,
17071709
algorithm_info: AlgorithmInfo::OlmV1Curve25519AesSha2 {
17081710
curve25519_public_key_base64: sender_key.to_base64(),
17091711
},

crates/matrix-sdk-ui/src/timeline/controller/decryption_retry_task.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ mod tests {
296296
encryption_info: Some(Arc::new(EncryptionInfo {
297297
sender: owned_user_id!("@u:s.co"),
298298
sender_device: None,
299+
forwarder: None,
300+
forwarder_device: None,
299301
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
300302
curve25519_key: "".to_owned(),
301303
sender_claimed_keys: BTreeMap::new(),

crates/matrix-sdk-ui/src/timeline/tests/edit.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ async fn test_edit_updates_encryption_info() {
163163
let mut encryption_info = Arc::new(EncryptionInfo {
164164
sender: (*ALICE).into(),
165165
sender_device: None,
166+
forwarder: None,
167+
forwarder_device: None,
166168
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
167169
curve25519_key: "123".to_owned(),
168170
sender_claimed_keys: BTreeMap::new(),

crates/matrix-sdk/tests/integration/encryption/shared_history.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,12 @@ async fn test_shared_history_out_of_order() {
195195
.await
196196
.expect("Bob should be able to fetch the event Alice has sent");
197197

198+
let encryption_info = event.encryption_info().expect("Event did not have encryption info");
199+
200+
// Check Bob stored information about the key forwarder.
201+
assert_eq!(encryption_info.forwarder, Some(alice_user_id.to_owned()));
202+
assert_eq!(encryption_info.forwarder_device, Some(alice_device_id.to_owned()));
203+
198204
assert_decrypted_message_eq!(
199205
event,
200206
"It's a secret to everybody",

0 commit comments

Comments
 (0)