Skip to content

Commit 447d0d2

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

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::{
@@ -144,7 +144,7 @@ pub mod sync {
144144
}
145145

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

0 commit comments

Comments
 (0)