fix: Do not panic on invalid membership event content

This commit is contained in:
Jade Ellis 2025-04-25 23:01:05 +01:00 committed by Jacob Taylor
parent 0c5e4fdc20
commit 0c09c3651b

View file

@ -38,7 +38,7 @@ struct GetMembership {
membership: MembershipState, membership: MembershipState,
} }
#[derive(Deserialize)] #[derive(Deserialize, Debug)]
struct RoomMemberContentFields { struct RoomMemberContentFields {
membership: Option<Raw<MembershipState>>, membership: Option<Raw<MembershipState>>,
join_authorised_via_users_server: Option<Raw<OwnedUserId>>, join_authorised_via_users_server: Option<Raw<OwnedUserId>>,
@ -149,9 +149,9 @@ where
Incoming: Event + Send + Sync, Incoming: Event + Send + Sync,
{ {
debug!( debug!(
"auth_check beginning for {} ({})", event_id = format!("{}", incoming_event.event_id()),
incoming_event.event_id(), event_type = format!("{}", incoming_event.event_type()),
incoming_event.event_type() "auth_check beginning"
); );
// [synapse] check that all the events are in the same room as `incoming_event` // [synapse] check that all the events are in the same room as `incoming_event`
@ -383,10 +383,15 @@ where
let sender_membership_event_content: RoomMemberContentFields = let sender_membership_event_content: RoomMemberContentFields =
from_json_str(sender_member_event.content().get())?; from_json_str(sender_member_event.content().get())?;
let membership_state = sender_membership_event_content let Some(membership_state) = sender_membership_event_content.membership else {
.membership warn!(
.expect("we should test before that this field exists") sender_membership_event_content = format!("{sender_membership_event_content:?}"),
.deserialize()?; event_id = format!("{}", incoming_event.event_id()),
"Sender membership event content missing membership field"
);
return Err(Error::InvalidPdu("Missing membership field".to_owned()));
};
let membership_state = membership_state.deserialize()?;
if !matches!(membership_state, MembershipState::Join) { if !matches!(membership_state, MembershipState::Join) {
warn!("sender's membership is not join"); warn!("sender's membership is not join");