@@ -41,7 +41,7 @@ pub mod sync {
41
41
room:: member:: { MembershipState , RoomMemberEventContent } ,
42
42
} ,
43
43
} ;
44
- use tracing:: { error, instrument} ;
44
+ use tracing:: { error, instrument, warn } ;
45
45
46
46
use super :: { super :: profiles, AnySyncStateEvent , Context , Raw } ;
47
47
use crate :: {
@@ -152,7 +152,7 @@ pub mod sync {
152
152
}
153
153
154
154
#[ cfg( feature = "e2e-encryption" ) ]
155
- AnySyncStateEvent :: RoomEncrypted ( _ ) => {
155
+ AnySyncStateEvent :: RoomEncrypted ( outer ) => {
156
156
if let Some ( olm_machine) = e2ee. olm_machine {
157
157
let decrypted_event = olm_machine
158
158
. try_decrypt_room_event (
@@ -163,14 +163,52 @@ pub mod sync {
163
163
. await
164
164
. unwrap ( ) ;
165
165
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) ;
174
212
}
175
213
}
176
214
}
0 commit comments