Skip to content

Commit 78a9811

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

File tree

7 files changed

+58
-3
lines changed

7 files changed

+58
-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: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,14 @@ 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+
/// The ID of the user who sent us the keys with which we decrypted this
332+
/// event as part of an MSC4268 key bundle, if present. Only applicable for
333+
/// room events.
334+
pub forwarder: Option<OwnedUserId>,
335+
/// The device ID of the user who sent us the keys with which we decrypted
336+
/// this event as part of an MSC4268 key bundle, if present. Only applicable
337+
/// for room events.
338+
pub forwarder_device: Option<OwnedDeviceId>,
331339
/// Information about the algorithm that was used to encrypt the event.
332340
pub algorithm_info: AlgorithmInfo,
333341
/// The verification state of the device that sent us the event, note this
@@ -361,14 +369,23 @@ impl<'de> Deserialize<'de> for EncryptionInfo {
361369
struct Helper {
362370
pub sender: OwnedUserId,
363371
pub sender_device: Option<OwnedDeviceId>,
372+
pub forwarder: Option<OwnedUserId>,
373+
pub forwarder_device: Option<OwnedDeviceId>,
364374
pub algorithm_info: AlgorithmInfo,
365375
pub verification_state: VerificationState,
366376
#[serde(rename = "session_id")]
367377
pub old_session_id: Option<String>,
368378
}
369379

370-
let Helper { sender, sender_device, algorithm_info, verification_state, old_session_id } =
371-
Helper::deserialize(deserializer)?;
380+
let Helper {
381+
sender,
382+
sender_device,
383+
forwarder,
384+
forwarder_device,
385+
algorithm_info,
386+
verification_state,
387+
old_session_id,
388+
} = Helper::deserialize(deserializer)?;
372389

373390
let algorithm_info = match algorithm_info {
374391
AlgorithmInfo::MegolmV1AesSha2 { curve25519_key, sender_claimed_keys, session_id } => {
@@ -382,7 +399,14 @@ impl<'de> Deserialize<'de> for EncryptionInfo {
382399
other => other,
383400
};
384401

385-
Ok(EncryptionInfo { sender, sender_device, algorithm_info, verification_state })
402+
Ok(EncryptionInfo {
403+
sender,
404+
sender_device,
405+
forwarder,
406+
forwarder_device,
407+
algorithm_info,
408+
verification_state,
409+
})
386410
}
387411
}
388412

@@ -1608,6 +1632,8 @@ mod tests {
16081632
encryption_info: Arc::new(EncryptionInfo {
16091633
sender: user_id!("@sender:example.com").to_owned(),
16101634
sender_device: None,
1635+
forwarder: None,
1636+
forwarder_device: None,
16111637
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
16121638
curve25519_key: "xxx".to_owned(),
16131639
sender_claimed_keys: Default::default(),
@@ -2032,6 +2058,8 @@ mod tests {
20322058
let info = EncryptionInfo {
20332059
sender: user_id!("@alice:localhost").to_owned(),
20342060
sender_device: Some(device_id!("ABCDEFGH").to_owned()),
2061+
forwarder: None,
2062+
forwarder_device: None,
20352063
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
20362064
curve25519_key: "curvecurvecurve".into(),
20372065
sender_claimed_keys: Default::default(),
@@ -2053,6 +2081,8 @@ mod tests {
20532081
encryption_info: Arc::new(EncryptionInfo {
20542082
sender: user_id!("@sender:example.com").to_owned(),
20552083
sender_device: Some(device_id!("ABCDEFGHIJ").to_owned()),
2084+
forwarder: None,
2085+
forwarder_device: None,
20562086
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
20572087
curve25519_key: "xxx".to_owned(),
20582088
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
@@ -341,6 +341,8 @@ mod tests {
341341
encryption_info: Some(Arc::new(EncryptionInfo {
342342
sender: owned_user_id!("@u:s.co"),
343343
sender_device: None,
344+
forwarder: None,
345+
forwarder_device: None,
344346
algorithm_info: AlgorithmInfo::MegolmV1AesSha2 {
345347
curve25519_key: "".to_owned(),
346348
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)