Skip to content

Commit 9ed2e13

Browse files
committed
feat(base): state key unpacking
Signed-off-by: Skye Elliot <[email protected]>
1 parent a739287 commit 9ed2e13

File tree

1 file changed

+48
-10
lines changed

1 file changed

+48
-10
lines changed

crates/matrix-sdk-base/src/response_processors/state_events.rs

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ pub mod sync {
4141
room::member::{MembershipState, RoomMemberEventContent},
4242
},
4343
};
44-
use tracing::{error, instrument};
44+
use tracing::{error, instrument, warn};
4545

4646
use super::{super::profiles, AnySyncStateEvent, Context, Raw};
4747
use crate::{
@@ -152,7 +152,7 @@ pub mod sync {
152152
}
153153

154154
#[cfg(feature = "e2e-encryption")]
155-
AnySyncStateEvent::RoomEncrypted(_) => {
155+
AnySyncStateEvent::RoomEncrypted(outer) => {
156156
if let Some(olm_machine) = e2ee.olm_machine {
157157
let decrypted_event = olm_machine
158158
.try_decrypt_room_event(
@@ -163,14 +163,52 @@ pub mod sync {
163163
.await
164164
.unwrap();
165165
if let RoomEventDecryptionResult::Decrypted(room_event) = decrypted_event {
166-
room_info.handle_state_event(
167-
&room_event
168-
.event
169-
// TODO: UNSAFE CAST - someone evil could encrypt something that
170-
// isn't a state event.
171-
.deserialize_as_unchecked::<AnySyncStateEvent>()
172-
.unwrap(),
173-
);
166+
// Unpack event type and state key from outer.
167+
let (outer_event_type, outer_state_key) =
168+
match outer.state_key().split_once(":") {
169+
None => {
170+
warn!(
171+
event_id = outer.event_id().as_str(),
172+
state_key = event.state_key(),
173+
"Malformed state key"
174+
);
175+
// Discard the event entirely.
176+
continue;
177+
}
178+
Some(result) => result,
179+
};
180+
181+
let inner = &room_event
182+
.event
183+
// TODO: UNSAFE CAST - someone evil could encrypt something that
184+
// isn't a state event.
185+
.deserialize_as_unchecked::<AnySyncStateEvent>()
186+
.unwrap();
187+
188+
// Check event types match, discard if not.
189+
let inner_event_type = inner.event_type().to_string();
190+
if outer_event_type != inner_event_type {
191+
warn!(
192+
event_id = outer.event_id().as_str(),
193+
expected = outer_event_type,
194+
found = inner_event_type,
195+
"Mismatched event type"
196+
);
197+
continue;
198+
}
199+
200+
// Check state keys match, discard if not.
201+
if outer_state_key != inner.state_key() {
202+
warn!(
203+
event_id = outer.event_id().as_str(),
204+
expected = outer_state_key,
205+
found = inner.state_key(),
206+
"Mismatched state key"
207+
);
208+
continue;
209+
}
210+
211+
room_info.handle_state_event(inner);
174212
}
175213
}
176214
}

0 commit comments

Comments
 (0)