@@ -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 :: {
@@ -144,7 +144,7 @@ pub mod sync {
144
144
}
145
145
146
146
#[ cfg( feature = "e2e-encryption" ) ]
147
- AnySyncStateEvent :: RoomEncrypted ( _ ) => {
147
+ AnySyncStateEvent :: RoomEncrypted ( outer ) => {
148
148
if let Some ( olm_machine) = e2ee. olm_machine {
149
149
let decrypted_event = olm_machine
150
150
. try_decrypt_room_event (
@@ -155,14 +155,52 @@ pub mod sync {
155
155
. await
156
156
. unwrap ( ) ;
157
157
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) ;
166
204
}
167
205
}
168
206
}
0 commit comments