From 74342765bb2c865ca403eaff0decf0005d6d0ffa Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Tue, 6 Apr 2021 01:12:51 +0200 Subject: [PATCH] events: Make ForwardedRoomKeyToDeviceEventContent non-exhaustive --- ruma-events/src/forwarded_room_key.rs | 55 +++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/ruma-events/src/forwarded_room_key.rs b/ruma-events/src/forwarded_room_key.rs index f0afdf87..3e03258b 100644 --- a/ruma-events/src/forwarded_room_key.rs +++ b/ruma-events/src/forwarded_room_key.rs @@ -5,7 +5,11 @@ use ruma_identifiers::{EventEncryptionAlgorithm, RoomId}; use serde::{Deserialize, Serialize}; /// The payload for `ForwardedRoomKeyEvent`. +/// +/// To create an instance of this type, first create a `ForwardedRoomKeyToDeviceEventContentInit` +/// and convert it via `ForwardedRoomKeyToDeviceEventContent::from` / `.into()`. #[derive(Clone, Debug, Deserialize, Serialize, BasicEventContent)] +#[cfg_attr(not(feature = "unstable-exhaustive-types"), non_exhaustive)] #[ruma_event(type = "m.forwarded_room_key")] pub struct ForwardedRoomKeyToDeviceEventContent { /// The encryption algorithm the key in this event is to be used with. @@ -38,3 +42,54 @@ pub struct ForwardedRoomKeyToDeviceEventContent { /// A's Curve25519 key between B and C. pub forwarding_curve25519_key_chain: Vec, } + +/// Initial set of fields of `ForwardedRoomKeyToDeviceEventContent`. +/// +/// This struct will not be updated even if additional fields are added to `ConditionalPushRule` in +/// a new (non-breaking) release of the Matrix specification. +#[derive(Debug)] +pub struct ForwardedRoomKeyToDeviceEventContentInit { + /// The encryption algorithm the key in this event is to be used with. + pub algorithm: EventEncryptionAlgorithm, + + /// The room where the key is used. + pub room_id: RoomId, + + /// The Curve25519 key of the device which initiated the session originally. + pub sender_key: String, + + /// The ID of the session that the key is for. + pub session_id: String, + + /// The key to be exchanged. + pub session_key: String, + + /// The Ed25519 key of the device which initiated the session originally. + /// + /// It is "claimed" because the receiving device has no way to tell that the original + /// room_key actually came from a device which owns the private part of this key unless + /// they have done device verification. + pub sender_claimed_ed25519_key: String, + + /// Chain of Curve25519 keys. + /// + /// It starts out empty, but each time the key is forwarded to another device, the + /// previous sender in the chain is added to the end of the list. For example, if the + /// key is forwarded from A to B to C, this field is empty between A and B, and contains + /// A's Curve25519 key between B and C. + pub forwarding_curve25519_key_chain: Vec, +} + +impl From for ForwardedRoomKeyToDeviceEventContent { + fn from(init: ForwardedRoomKeyToDeviceEventContentInit) -> Self { + Self { + algorithm: init.algorithm, + room_id: init.room_id, + sender_key: init.sender_key, + session_id: init.session_id, + session_key: init.session_key, + sender_claimed_ed25519_key: init.sender_claimed_ed25519_key, + forwarding_curve25519_key_chain: init.forwarding_curve25519_key_chain, + } + } +}