Don't panic if serialization of user-provided events fails

This commit is contained in:
Jonas Platte
2021-09-27 20:43:03 +02:00
parent 0f52cd8039
commit 39d6ebdd53
2 changed files with 14 additions and 17 deletions

View File

@@ -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<RoomEvent> {
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::<serde_json::Value>().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::<JsonObject>()?;
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.

View File

@@ -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<Option<MembersResponse>> {