From 39d6ebdd53311af51fca07d9653f04f27a347963 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Mon, 27 Sep 2021 20:43:03 +0200 Subject: [PATCH] Don't panic if serialization of user-provided events fails --- crates/matrix-sdk/src/encryption/mod.rs | 24 ++++++++++++------------ crates/matrix-sdk/src/room/common.rs | 7 ++----- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/crates/matrix-sdk/src/encryption/mod.rs b/crates/matrix-sdk/src/encryption/mod.rs index cd13dc28f..2e8b4a416 100644 --- a/crates/matrix-sdk/src/encryption/mod.rs +++ b/crates/matrix-sdk/src/encryption/mod.rs @@ -459,7 +459,12 @@ impl Client { /// decryption fails. #[cfg(feature = "encryption")] #[cfg_attr(feature = "docs", doc(cfg(encryption)))] - pub(crate) async fn decrypt_room_event(&self, event: &AnyRoomEvent) -> RoomEvent { + pub(crate) async fn decrypt_room_event( + &self, + event: &AnyRoomEvent, + ) -> serde_json::Result { + use ruma::serde::JsonObject; + if let Some(machine) = self.base_client.olm_machine().await { if let AnyRoomEvent::Message(event) = event { if let AnyMessageEvent::RoomEncrypted(_) = event { @@ -469,20 +474,15 @@ impl Client { if let AnySyncMessageEvent::RoomEncrypted(e) = event { if let Ok(decrypted) = machine.decrypt_room_event(&e, room_id).await { - let mut full_event = - decrypted.event.deserialize_as::().unwrap(); - full_event.as_object_mut().unwrap().insert( - "room_id".to_owned(), - serde_json::to_value(room_id).unwrap(), - ); - let event = Raw::from_json( - serde_json::value::to_raw_value(&full_event).unwrap(), - ); + let mut full_event = decrypted.event.deserialize_as::()?; + full_event.insert("room_id".to_owned(), serde_json::to_value(room_id)?); + let event = + Raw::from_json(serde_json::value::to_raw_value(&full_event)?); let encryption_info = decrypted.encryption_info; // Return decrypted room event - return RoomEvent { event, encryption_info }; + return Ok(RoomEvent { event, encryption_info }); } } } @@ -490,7 +490,7 @@ impl Client { } // Fallback to still-encrypted room event - RoomEvent { event: Raw::new(event).expect("Failed to serialize "), encryption_info: None } + Ok(RoomEvent { event: Raw::new(event)?, encryption_info: None }) } /// Query the server for users device keys. diff --git a/crates/matrix-sdk/src/room/common.rs b/crates/matrix-sdk/src/room/common.rs index 54600e212..3770305d9 100644 --- a/crates/matrix-sdk/src/room/common.rs +++ b/crates/matrix-sdk/src/room/common.rs @@ -160,13 +160,10 @@ impl Common { let event = self.client.send(request, None).await?.event.deserialize()?; #[cfg(feature = "encryption")] - return Ok(self.client.decrypt_room_event(&event).await); + return Ok(self.client.decrypt_room_event(&event).await?); #[cfg(not(feature = "encryption"))] - return Ok(RoomEvent { - event: Raw::new(&event).expect("Failed to serialize room event"), - encryption_info: None, - }); + return Ok(RoomEvent { event: Raw::new(&event)?, encryption_info: None }); } pub(crate) async fn request_members(&self) -> Result> {