Skip to content

Commit f4249c5

Browse files
committed
Return RoomEvents from decryption methods
Previously, these methods returned `SyncRoomEvent`s instead, even though the decrypted events are required to contain a room_id field (in order for the server to not to be able to change these). As a side effect, glue code which adds a room_id to the `SyncRoomEvent` to convert it to a `RoomEvent` is be removed in some places. When a `SyncRoomEvent` is required (such as in code handling sync responses), the `From` implementation of `SyncRoomEvent` can be used.
1 parent 37cadc7 commit f4249c5

File tree

6 files changed

+19
-32
lines changed

6 files changed

+19
-32
lines changed

crates/matrix-sdk-base/src/client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -422,7 +422,7 @@ impl BaseClient {
422422
if let Ok(decrypted) =
423423
olm.decrypt_room_event(encrypted, room_id).await
424424
{
425-
event = decrypted;
425+
event = decrypted.into();
426426
}
427427
}
428428
}

crates/matrix-sdk-crypto/src/machine.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use std::{
2222

2323
use dashmap::DashMap;
2424
use matrix_sdk_common::{
25-
deserialized_responses::{AlgorithmInfo, EncryptionInfo, SyncRoomEvent, VerificationState},
25+
deserialized_responses::{AlgorithmInfo, EncryptionInfo, RoomEvent, VerificationState},
2626
locks::Mutex,
2727
uuid::Uuid,
2828
};
@@ -1100,7 +1100,7 @@ impl OlmMachine {
11001100
room_id: &RoomId,
11011101
event: &SyncRoomEncryptedEvent,
11021102
content: &MegolmV1AesSha2Content,
1103-
) -> MegolmResult<SyncRoomEvent> {
1103+
) -> MegolmResult<RoomEvent> {
11041104
if let Some(session) = self
11051105
.store
11061106
.get_inbound_group_session(room_id, &content.sender_key, &content.session_id)
@@ -1120,9 +1120,8 @@ impl OlmMachine {
11201120
sender_key = session.sender_key(),
11211121
"Successfully decrypted a room event"
11221122
);
1123-
let event = e.into_full_event(room_id.to_owned());
11241123

1125-
if let AnyRoomEvent::Message(e) = event {
1124+
if let AnyRoomEvent::Message(e) = e {
11261125
self.verification_machine.receive_any_event(&e).await?;
11271126
}
11281127
}
@@ -1141,7 +1140,7 @@ impl OlmMachine {
11411140
let encryption_info =
11421141
self.get_encryption_info(&session, &event.sender, &content.device_id).await?;
11431142

1144-
Ok(SyncRoomEvent { encryption_info: Some(encryption_info), event: decrypted_event })
1143+
Ok(RoomEvent { encryption_info: Some(encryption_info), event: decrypted_event })
11451144
} else {
11461145
self.key_request_machine
11471146
.create_outgoing_key_request(room_id, &content.sender_key, &content.session_id)
@@ -1162,7 +1161,7 @@ impl OlmMachine {
11621161
&self,
11631162
event: &SyncRoomEncryptedEvent,
11641163
room_id: &RoomId,
1165-
) -> MegolmResult<SyncRoomEvent> {
1164+
) -> MegolmResult<RoomEvent> {
11661165
match &event.content.scheme {
11671166
EncryptedEventScheme::MegolmV1AesSha2(c) => {
11681167
match self.decrypt_megolm_v1_event(room_id, event, c).await {
@@ -1577,8 +1576,8 @@ pub(crate) mod test {
15771576
encrypted::ToDeviceRoomEncryptedEventContent,
15781577
message::{MessageType, RoomMessageEventContent},
15791578
},
1580-
AnyMessageEventContent, AnySyncMessageEvent, AnySyncRoomEvent, AnyToDeviceEvent,
1581-
AnyToDeviceEventContent, SyncMessageEvent, ToDeviceEvent, Unsigned,
1579+
AnyMessageEvent, AnyMessageEventContent, AnyRoomEvent, AnyToDeviceEvent,
1580+
AnyToDeviceEventContent, MessageEvent, SyncMessageEvent, ToDeviceEvent, Unsigned,
15821581
},
15831582
room_id,
15841583
serde::Raw,
@@ -2045,7 +2044,7 @@ pub(crate) mod test {
20452044
let decrypted_event =
20462045
bob.decrypt_room_event(&event, room_id).await.unwrap().event.deserialize().unwrap();
20472046

2048-
if let AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomMessage(SyncMessageEvent {
2047+
if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(MessageEvent {
20492048
sender,
20502049
content,
20512050
..

crates/matrix-sdk-crypto/src/olm/group_sessions/inbound.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ use ruma::{
3838
encrypted::{EncryptedEventScheme, SyncRoomEncryptedEvent},
3939
history_visibility::HistoryVisibility,
4040
},
41-
AnySyncRoomEvent,
41+
AnyRoomEvent,
4242
},
4343
serde::Raw,
4444
DeviceKeyAlgorithm, EventEncryptionAlgorithm, RoomId,
@@ -346,7 +346,7 @@ impl InboundGroupSession {
346346
pub(crate) async fn decrypt(
347347
&self,
348348
event: &SyncRoomEncryptedEvent,
349-
) -> MegolmResult<(Raw<AnySyncRoomEvent>, u32)> {
349+
) -> MegolmResult<(Raw<AnyRoomEvent>, u32)> {
350350
let content = match &event.content.scheme {
351351
EncryptedEventScheme::MegolmV1AesSha2(c) => c,
352352
_ => return Err(EventError::UnsupportedAlgorithm.into()),
@@ -389,7 +389,7 @@ impl InboundGroupSession {
389389
}
390390
}
391391

392-
Ok((serde_json::from_value::<Raw<AnySyncRoomEvent>>(decrypted_value)?, message_index))
392+
Ok((serde_json::from_value::<Raw<AnyRoomEvent>>(decrypted_value)?, message_index))
393393
}
394394
}
395395

crates/matrix-sdk-crypto/src/olm/mod.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ pub(crate) mod test {
7070
events::{
7171
forwarded_room_key::ToDeviceForwardedRoomKeyEventContent,
7272
room::message::{Relation, Replacement, RoomMessageEventContent},
73-
AnySyncMessageEvent, AnySyncRoomEvent,
73+
AnyMessageEvent, AnyRoomEvent, AnySyncMessageEvent, AnySyncRoomEvent,
7474
},
7575
room_id, user_id, DeviceId, UserId,
7676
};
@@ -281,9 +281,7 @@ pub(crate) mod test {
281281

282282
let decrypted = inbound.decrypt(&event).await?.0;
283283

284-
if let AnySyncRoomEvent::Message(AnySyncMessageEvent::RoomMessage(e)) =
285-
decrypted.deserialize()?
286-
{
284+
if let AnyRoomEvent::Message(AnyMessageEvent::RoomMessage(e)) = decrypted.deserialize()? {
287285
assert_matches!(e.content.relates_to, Some(Relation::Replacement(_)));
288286
} else {
289287
panic!("Invalid event type")

crates/matrix-sdk/src/encryption/mod.rs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -687,9 +687,7 @@ impl Client {
687687
pub(crate) async fn decrypt_room_event(
688688
&self,
689689
event: &AnyRoomEvent,
690-
) -> serde_json::Result<RoomEvent> {
691-
use ruma::serde::JsonObject;
692-
690+
) -> RoomEvent {
693691
if let Some(machine) = self.olm_machine().await {
694692
if let AnyRoomEvent::Message(event) = event {
695693
if let AnyMessageEvent::RoomEncrypted(_) = event {
@@ -699,23 +697,15 @@ impl Client {
699697

700698
if let AnySyncMessageEvent::RoomEncrypted(e) = event {
701699
if let Ok(decrypted) = machine.decrypt_room_event(&e, room_id).await {
702-
let mut full_event = decrypted.event.deserialize_as::<JsonObject>()?;
703-
full_event.insert("room_id".to_owned(), serde_json::to_value(room_id)?);
704-
705-
let event =
706-
Raw::from_json(serde_json::value::to_raw_value(&full_event)?);
707-
let encryption_info = decrypted.encryption_info;
708-
709-
// Return decrypted room event
710-
return Ok(RoomEvent { event, encryption_info });
700+
return decrypted;
711701
}
712702
}
713703
}
714704
}
715705
}
716706

717707
// Fallback to still-encrypted room event
718-
Ok(RoomEvent { event: Raw::new(event)?, encryption_info: None })
708+
RoomEvent { event: Raw::new(event).expect("AnyRoomEvent serialization should not fail"), encryption_info: None }
719709
}
720710

721711
/// Query the server for users device keys.

crates/matrix-sdk/src/room/common.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ impl Common {
182182
for event in http_response.chunk {
183183
#[cfg(feature = "encryption")]
184184
let event = match event.deserialize() {
185-
Ok(event) => self.client.decrypt_room_event(&event).await?,
185+
Ok(event) => self.client.decrypt_room_event(&event).await,
186186
Err(_) => {
187187
// "Broken" messages (i.e., those that cannot be deserialized) are
188188
// returned unchanged so that the caller can handle them individually.
@@ -205,7 +205,7 @@ impl Common {
205205
let event = self.client.send(request, None).await?.event.deserialize()?;
206206

207207
#[cfg(feature = "encryption")]
208-
return Ok(self.client.decrypt_room_event(&event).await?);
208+
return Ok(self.client.decrypt_room_event(&event).await);
209209

210210
#[cfg(not(feature = "encryption"))]
211211
return Ok(RoomEvent { event: Raw::new(&event)?, encryption_info: None });

0 commit comments

Comments
 (0)