diff --git a/crates/matrix-sdk-crypto/CHANGELOG.md b/crates/matrix-sdk-crypto/CHANGELOG.md index e91073be4..ffe8aa289 100644 --- a/crates/matrix-sdk-crypto/CHANGELOG.md +++ b/crates/matrix-sdk-crypto/CHANGELOG.md @@ -8,8 +8,9 @@ All notable changes to this project will be documented in this file. ### Features -- [**breaking**] Change to the stable identifiers for `m.room_key_bundle` and - `m.history_not_shared`. We still support reading the unstable identifiers. +- [**breaking**] Change to the stable identifiers for `m.room_key_bundle`, + `m.history_not_shared` and `m.shared_history`. We still support reading the + unstable identifiers. ([#6467](https://github.com/matrix-org/matrix-rust-sdk/pull/6467)) - Add support for MSC4385. ([#6164](https://github.com/matrix-org/matrix-rust-sdk/pull/6164)) diff --git a/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs b/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs index f529b869d..a5ee1f5e8 100644 --- a/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs +++ b/crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs @@ -1223,12 +1223,14 @@ mod tests { .unwrap() } - #[async_test] - async fn test_shared_history_from_m_room_key_content() { - let content = json!({ + fn key_json(stable: bool) -> serde_json::Value { + let shared_history = + if stable { "m.shared_history" } else { "org.matrix.msc3061.shared_history" }; + + json!({ "algorithm": "m.megolm.v1.aes-sha2", "room_id": "!Cuyf34gef24t:localhost", - "org.matrix.msc3061.shared_history": true, + shared_history: true, "session_id": "ZFD6+OmV7fVCsJ7Gap8UnORH8EnmiAkes8FAvQuCw/I", "session_key": "AgAAAADNp1EbxXYOGmJtyX4AkD1bvJvAUyPkbIaKxtnGKjv\ SQ3E/4mnuqdM4vsmNzpO1EeWzz1rDkUpYhYE9kP7sJhgLXi\ @@ -1237,7 +1239,12 @@ mod tests { QrCexmqfFJzkR/BJ5ogJHrPBQL0LgsPyglIbMTLg7qygIaY\ U5Fe2QdKMH7nTZPNIRHh1RaMfHVETAUJBax88EWZBoifk80\ gdHUwHSgMk77vCc2a5KHKLDA", - }); + }) + } + + #[async_test] + async fn test_shared_history_from_m_room_key_content_stable() { + let content = key_json(true); let sender_key = Curve25519PublicKey::from_bytes([0; 32]); let signing_key = Ed25519PublicKey::from_slice(&[0; 32]).expect(""); @@ -1267,20 +1274,57 @@ mod tests { } #[async_test] - async fn test_shared_history_from_exported_room_key() { - let content = json!({ - "algorithm": "m.megolm.v1.aes-sha2", - "room_id": "!room:id", - "sender_key": "FOvlmz18LLI3k/llCpqRoKT90+gFF8YhuL+v1YBXHlw", - "session_id": "/2K+V777vipCxPZ0gpY9qcpz1DYaXwuMRIu0UEP0Wa0", - "session_key": "AQAAAAAclzWVMeWBKH+B/WMowa3rb4ma3jEl6n5W4GCs9ue65CruzD3ihX+85pZ9hsV9Bf6fvhjp76WNRajoJYX0UIt7aosjmu0i+H+07hEQ0zqTKpVoSH0ykJ6stAMhdr6Q4uW5crBmdTTBIsqmoWsNJZKKoE2+ldYrZ1lrFeaJbjBIY/9ivle++74qQsT2dIKWPanKc9Q2Gl8LjESLtFBD9Fmt", - "sender_claimed_keys": { - "ed25519": "F4P7f1Z0RjbiZMgHk1xBCG3KC4/Ng9PmxLJ4hQ13sHA" - }, - "forwarding_curve25519_key_chain": [], - "org.matrix.msc3061.shared_history": true + async fn test_shared_history_from_m_room_key_content_unstable() { + let content = key_json(false); - }); + let sender_key = Curve25519PublicKey::from_bytes([0; 32]); + let signing_key = Ed25519PublicKey::from_slice(&[0; 32]).expect(""); + let mut content: room_key::MegolmV1AesSha2Content = serde_json::from_value(content) + .expect("We should be able to deserialize the m.room_key content"); + + let session = InboundGroupSession::from_room_key_content(sender_key, signing_key, &content) + .expect( + "We should be able to create an inbound group session from the room key content", + ); + + assert!( + session.shared_history, + "The shared history flag should be set as it was set in the m.room_key content" + ); + + content.shared_history = false; + let session = InboundGroupSession::from_room_key_content(sender_key, signing_key, &content) + .expect( + "We should be able to create an inbound group session from the room key content", + ); + + assert!( + !session.shared_history, + "The shared history flag should not be set as it was not set in the m.room_key content" + ); + } + + fn exported_key_json(stable: bool) -> serde_json::Value { + let shared_history = + if stable { "m.shared_history" } else { "org.matrix.msc3061.shared_history" }; + + json!({ + "algorithm": "m.megolm.v1.aes-sha2", + "room_id": "!room:id", + "sender_key": "FOvlmz18LLI3k/llCpqRoKT90+gFF8YhuL+v1YBXHlw", + "session_id": "/2K+V777vipCxPZ0gpY9qcpz1DYaXwuMRIu0UEP0Wa0", + "session_key": "AQAAAAAclzWVMeWBKH+B/WMowa3rb4ma3jEl6n5W4GCs9ue65CruzD3ihX+85pZ9hsV9Bf6fvhjp76WNRajoJYX0UIt7aosjmu0i+H+07hEQ0zqTKpVoSH0ykJ6stAMhdr6Q4uW5crBmdTTBIsqmoWsNJZKKoE2+ldYrZ1lrFeaJbjBIY/9ivle++74qQsT2dIKWPanKc9Q2Gl8LjESLtFBD9Fmt", + "sender_claimed_keys": { + "ed25519": "F4P7f1Z0RjbiZMgHk1xBCG3KC4/Ng9PmxLJ4hQ13sHA" + }, + "forwarding_curve25519_key_chain": [], + shared_history: true + }) + } + + #[async_test] + async fn test_shared_history_from_exported_room_key_stable() { + let content = exported_key_json(true); let mut content: ExportedRoomKey = serde_json::from_value(content) .expect("We should be able to deserialize the m.room_key content"); @@ -1305,8 +1349,36 @@ mod tests { } #[async_test] - async fn test_shared_history_from_backed_up_room_key() { - let content = json!({ + async fn test_shared_history_from_exported_room_key_unstable() { + let content = exported_key_json(false); + + let mut content: ExportedRoomKey = serde_json::from_value(content) + .expect("We should be able to deserialize the m.room_key content"); + + let session = InboundGroupSession::from_export(&content).expect( + "We should be able to create an inbound group session from the room key export", + ); + assert!( + session.shared_history, + "The shared history flag should be set as it was set in the exported room key" + ); + + content.shared_history = false; + + let session = InboundGroupSession::from_export(&content).expect( + "We should be able to create an inbound group session from the room key export", + ); + assert!( + !session.shared_history, + "The shared history flag should not be set as it was not set in the exported room key" + ); + } + + fn backed_up_room_key(stable: bool) -> serde_json::Value { + let shared_history = + if stable { "m.shared_history" } else { "org.matrix.msc3061.shared_history" }; + + json!({ "algorithm": "m.megolm.v1.aes-sha2", "sender_key": "FOvlmz18LLI3k/llCpqRoKT90+gFF8YhuL+v1YBXHlw", "session_key": "AQAAAAAclzWVMeWBKH+B/WMowa3rb4ma3jEl6n5W4GCs9ue65CruzD3ihX+85pZ9hsV9Bf6fvhjp76WNRajoJYX0UIt7aosjmu0i+H+07hEQ0zqTKpVoSH0ykJ6stAMhdr6Q4uW5crBmdTTBIsqmoWsNJZKKoE2+ldYrZ1lrFeaJbjBIY/9ivle++74qQsT2dIKWPanKc9Q2Gl8LjESLtFBD9Fmt", @@ -1314,9 +1386,34 @@ mod tests { "ed25519": "F4P7f1Z0RjbiZMgHk1xBCG3KC4/Ng9PmxLJ4hQ13sHA" }, "forwarding_curve25519_key_chain": [], - "org.matrix.msc3061.shared_history": true + shared_history: true + }) + } - }); + #[async_test] + async fn test_shared_history_from_backed_up_room_key_stable() { + let content = backed_up_room_key(true); + + let session_id = "/2K+V777vipCxPZ0gpY9qcpz1DYaXwuMRIu0UEP0Wa0"; + let room_id = owned_room_id!("!room:id"); + let room_key: BackedUpRoomKey = serde_json::from_value(content) + .expect("We should be able to deserialize the backed up room key"); + + let room_key = + ExportedRoomKey::from_backed_up_room_key(room_id, session_id.to_owned(), room_key); + + let session = InboundGroupSession::from_export(&room_key).expect( + "We should be able to create an inbound group session from the room key export", + ); + assert!( + session.shared_history, + "The shared history flag should be set as it was set in the backed up room key" + ); + } + + #[async_test] + async fn test_shared_history_from_backed_up_room_key_unstable() { + let content = backed_up_room_key(false); let session_id = "/2K+V777vipCxPZ0gpY9qcpz1DYaXwuMRIu0UEP0Wa0"; let room_id = owned_room_id!("!room:id"); diff --git a/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs b/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs index a1dec499d..e9e01ed8b 100644 --- a/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs +++ b/crates/matrix-sdk-crypto/src/olm/group_sessions/mod.rs @@ -109,7 +109,7 @@ pub struct ExportedRoomKey { /// defined in [MSC3061]. /// /// [MSC3061]: https://github.com/matrix-org/matrix-spec-proposals/pull/3061 - #[serde(default, rename = "org.matrix.msc3061.shared_history")] + #[serde(default, rename = "m.shared_history", alias = "org.matrix.msc3061.shared_history")] pub shared_history: bool, } @@ -196,7 +196,7 @@ pub struct BackedUpRoomKey { /// defined in [MSC3061]. /// /// [MSC3061]: https://github.com/matrix-org/matrix-spec-proposals/pull/3061 - #[serde(default, rename = "org.matrix.msc3061.shared_history")] + #[serde(default, rename = "m.shared_history", alias = "org.matrix.msc3061.shared_history")] pub shared_history: bool, } diff --git a/crates/matrix-sdk-crypto/src/types/events/olm_v1.rs b/crates/matrix-sdk-crypto/src/types/events/olm_v1.rs index 3c240ddfb..2415c214a 100644 --- a/crates/matrix-sdk-crypto/src/types/events/olm_v1.rs +++ b/crates/matrix-sdk-crypto/src/types/events/olm_v1.rs @@ -721,7 +721,7 @@ mod tests { "content": { "algorithm": "m.megolm.v1.aes-sha2", "room_id": "!Cuyf34gef24t:localhost", - "org.matrix.msc3061.shared_history": true, + "m.shared_history": true, "session_id": "ZFD6+OmV7fVCsJ7Gap8UnORH8EnmiAkes8FAvQuCw/I", "session_key": "AgAAAADNp1EbxXYOGmJtyX4AkD1bvJvAUyPkbIaKxtnGKjv\ SQ3E/4mnuqdM4vsmNzpO1EeWzz1rDkUpYhYE9kP7sJhgLXi\ diff --git a/crates/matrix-sdk-crypto/src/types/events/room_key.rs b/crates/matrix-sdk-crypto/src/types/events/room_key.rs index dbf9a82e2..15968f142 100644 --- a/crates/matrix-sdk-crypto/src/types/events/room_key.rs +++ b/crates/matrix-sdk-crypto/src/types/events/room_key.rs @@ -124,7 +124,7 @@ pub struct MegolmV1AesSha2Content { /// [MSC3061]. /// /// [MSC3061]: https://github.com/matrix-org/matrix-spec-proposals/pull/3061 - #[serde(default, rename = "org.matrix.msc3061.shared_history")] + #[serde(default, rename = "m.shared_history", alias = "org.matrix.msc3061.shared_history")] pub shared_history: bool, /// Any other, custom and non-specced fields of the content. #[serde(flatten)] @@ -229,14 +229,22 @@ pub(super) mod tests { use super::RoomKeyEvent; use crate::types::events::room_key::RoomKeyContent; - pub fn json() -> Value { + pub fn json_stable() -> Value { + json(true) + } + + pub fn json_unstable() -> Value { + json(false) + } + + pub fn json(stable: bool) -> Value { json!({ "sender": "@alice:example.org", "content": { "m.custom": "something custom", "algorithm": "m.megolm.v1.aes-sha2", "room_id": "!Cuyf34gef24t:localhost", - "org.matrix.msc3061.shared_history": false, + if stable { "m.shared_history" } else { "org.matrix.msc3061.shared_history" }: false, "session_id": "ZFD6+OmV7fVCsJ7Gap8UnORH8EnmiAkes8FAvQuCw/I", "session_key": "AgAAAADNp1EbxXYOGmJtyX4AkD1bvJvAUyPkbIaKxtnGKjv\ SQ3E/4mnuqdM4vsmNzpO1EeWzz1rDkUpYhYE9kP7sJhgLXi\ @@ -252,8 +260,8 @@ pub(super) mod tests { } #[test] - fn deserialization() -> Result<(), serde_json::Error> { - let json = json(); + fn deserialization_stable() -> Result<(), serde_json::Error> { + let json = json_stable(); let event: RoomKeyEvent = serde_json::from_value(json.clone())?; assert_matches!(event.content, RoomKeyContent::MegolmV1AesSha2(_)); @@ -262,4 +270,14 @@ pub(super) mod tests { Ok(()) } + + #[test] + fn deserialization_unstable() -> Result<(), serde_json::Error> { + let json = json_unstable(); + let event: RoomKeyEvent = serde_json::from_value(json)?; + + assert_matches!(event.content, RoomKeyContent::MegolmV1AesSha2(_)); + + Ok(()) + } } diff --git a/crates/matrix-sdk-crypto/src/types/events/snapshots/decrypted_to_device_event_snapshot.snap b/crates/matrix-sdk-crypto/src/types/events/snapshots/decrypted_to_device_event_snapshot.snap index c6b9e1766..13a660618 100644 --- a/crates/matrix-sdk-crypto/src/types/events/snapshots/decrypted_to_device_event_snapshot.snap +++ b/crates/matrix-sdk-crypto/src/types/events/snapshots/decrypted_to_device_event_snapshot.snap @@ -13,7 +13,7 @@ expression: event }, "content": { "algorithm": "m.megolm.v1.aes-sha2", - "org.matrix.msc3061.shared_history": false, + "m.shared_history": false, "room_id": "!Cuyf34gef24t:localhost", "session_id": "ZFD6+OmV7fVCsJ7Gap8UnORH8EnmiAkes8FAvQuCw/I", "session_key": "AgAAAADNp1EbxXYOGmJtyX4AkD1bvJvAUyPkbIaKxtnGKjvSQ3E/4mnuqdM4vsmNzpO1EeWzz1rDkUpYhYE9kP7sJhgLXijVv80fMPHfGc49hPdu8A+xnwD4SQiYdFmSWJOIqsxeo/fiHtino//CDQENtcKuEt0I9s0+Kk4YSH310Szse2RQ+vjple31QrCexmqfFJzkR/BJ5ogJHrPBQL0LgsPyglIbMTLg7qygIaYU5Fe2QdKMH7nTZPNIRHh1RaMfHVETAUJBax88EWZBoifk80gdHUwHSgMk77vCc2a5KHKLDA" diff --git a/crates/matrix-sdk-crypto/src/types/events/snapshots/sender_device_keys_are_deserialized.snap b/crates/matrix-sdk-crypto/src/types/events/snapshots/sender_device_keys_are_deserialized.snap index 16ec7c7fb..5ab44a23c 100644 --- a/crates/matrix-sdk-crypto/src/types/events/snapshots/sender_device_keys_are_deserialized.snap +++ b/crates/matrix-sdk-crypto/src/types/events/snapshots/sender_device_keys_are_deserialized.snap @@ -30,7 +30,7 @@ expression: event }, "content": { "algorithm": "m.megolm.v1.aes-sha2", - "org.matrix.msc3061.shared_history": false, + "m.shared_history": false, "room_id": "!Cuyf34gef24t:localhost", "session_id": "ZFD6+OmV7fVCsJ7Gap8UnORH8EnmiAkes8FAvQuCw/I", "session_key": "AgAAAADNp1EbxXYOGmJtyX4AkD1bvJvAUyPkbIaKxtnGKjvSQ3E/4mnuqdM4vsmNzpO1EeWzz1rDkUpYhYE9kP7sJhgLXijVv80fMPHfGc49hPdu8A+xnwD4SQiYdFmSWJOIqsxeo/fiHtino//CDQENtcKuEt0I9s0+Kk4YSH310Szse2RQ+vjple31QrCexmqfFJzkR/BJ5ogJHrPBQL0LgsPyglIbMTLg7qygIaYU5Fe2QdKMH7nTZPNIRHh1RaMfHVETAUJBax88EWZBoifk80gdHUwHSgMk77vCc2a5KHKLDA" diff --git a/crates/matrix-sdk-crypto/src/types/events/to_device.rs b/crates/matrix-sdk-crypto/src/types/events/to_device.rs index d69af1842..860cdc15e 100644 --- a/crates/matrix-sdk-crypto/src/types/events/to_device.rs +++ b/crates/matrix-sdk-crypto/src/types/events/to_device.rs @@ -520,7 +520,7 @@ mod tests { assert_serialization_roundtrip!( // `m.room_key - crate::types::events::room_key::tests::json => RoomKey, + crate::types::events::room_key::tests::json_stable => RoomKey, // `m.forwarded_room_key` forwarded_room_key_event => ForwardedRoomKey, @@ -570,7 +570,7 @@ mod tests { assert_serialization_roundtrip!( // `m.room_key - crate::types::events::room_key::tests::json => RoomKey, + crate::types::events::room_key::tests::json_stable => RoomKey, // `m.forwarded_room_key` forwarded_room_key_event => ForwardedRoomKey,