fix: Unbans and kicks incorrectly checked creatorship in !v12

This commit is contained in:
nexy7574
2025-10-27 14:34:50 +00:00
committed by Tom Foster
parent ec3564e8aa
commit b17b4235f3
+37 -11
View File
@@ -615,15 +615,21 @@ where
Ok(true) Ok(true)
} }
fn is_creator<EV>(v: &RoomVersion, c: &BTreeSet<OwnedUserId>, ce: &EV, user_id: &UserId) -> bool fn is_creator<EV>(
v: &RoomVersion,
c: &BTreeSet<OwnedUserId>,
ce: &EV,
user_id: &UserId,
have_pls: bool,
) -> bool
where where
EV: Event + Send + Sync, EV: Event + Send + Sync,
{ {
if v.explicitly_privilege_room_creators { if v.explicitly_privilege_room_creators {
c.contains(user_id) c.contains(user_id)
} else if v.use_room_create_sender { } else if v.use_room_create_sender && have_pls {
ce.sender() == user_id ce.sender() == user_id
} else { } else if have_pls {
#[allow(deprecated)] #[allow(deprecated)]
let creator = from_json_str::<RoomCreateEventContent>(ce.content().get()) let creator = from_json_str::<RoomCreateEventContent>(ce.content().get())
.unwrap() .unwrap()
@@ -632,6 +638,8 @@ where
.unwrap(); .unwrap();
creator == user_id creator == user_id
} else {
false
} }
} }
@@ -724,10 +732,11 @@ where
} }
trace!(?creators, "creators for room"); trace!(?creators, "creators for room");
let mut join_rules = JoinRule::Invite; let join_rules = if let Some(jr) = &join_rules_event {
if let Some(jr) = &join_rules_event { from_json_str::<RoomJoinRulesEventContent>(jr.content().get())?.join_rule
join_rules = from_json_str::<RoomJoinRulesEventContent>(jr.content().get())?.join_rule; } else {
} JoinRule::Invite
};
let power_levels_event_id = power_levels_event.as_ref().map(Event::event_id); let power_levels_event_id = power_levels_event.as_ref().map(Event::event_id);
let sender_membership_event_id = sender_membership_event.as_ref().map(Event::event_id); let sender_membership_event_id = sender_membership_event.as_ref().map(Event::event_id);
@@ -753,8 +762,13 @@ where
(int!(0), int!(0)) (int!(0), int!(0))
}; };
let user_joined = user_for_join_auth_membership == &MembershipState::Join; let user_joined = user_for_join_auth_membership == &MembershipState::Join;
let okay_power = is_creator(room_version, &creators, create_room, user_for_join_auth) let okay_power = is_creator(
|| auth_user_pl >= invite_level; room_version,
&creators,
create_room,
user_for_join_auth,
power_levels_event.as_ref().is_some(),
) || auth_user_pl >= invite_level;
trace!( trace!(
auth_user_pl=?auth_user_pl, auth_user_pl=?auth_user_pl,
invite_level=?invite_level, invite_level=?invite_level,
@@ -769,8 +783,20 @@ where
trace!("No auth user given for join auth"); trace!("No auth user given for join auth");
false false
}; };
let sender_creator = is_creator(room_version, &creators, create_room, sender); let sender_creator = is_creator(
let target_creator = is_creator(room_version, &creators, create_room, target_user); room_version,
&creators,
create_room,
sender,
power_levels_event.as_ref().is_some(),
);
let target_creator = is_creator(
room_version,
&creators,
create_room,
target_user,
power_levels_event.as_ref().is_some(),
);
Ok(match target_membership { Ok(match target_membership {
| MembershipState::Join => { | MembershipState::Join => {