fix: Unreliability in kicks & bans

This commit is contained in:
timedout 2026-02-14 15:23:22 +00:00
parent 2919c8e636
commit 93b9007e1d
No known key found for this signature in database
GPG key ID: 0FA334385D0B689F

View file

@ -650,6 +650,7 @@ async fn takeover(&self, force: bool, room: OwnedRoomOrAliasId) -> Result {
.unwrap_or(power_levels.state_default);
let mut ordered_users = local_users
.iter()
.chain(local_creators.iter().map(|user_id| (user_id, &Int::MAX)))
.map(|(user_id, level)| {
if local_creators.contains(user_id) {
(user_id, Int::MAX)
@ -856,16 +857,10 @@ async fn shutdown_room(
.filter(|(user_id, _)| self.services.globals.user_is_local(user_id))
.map(|(user_id, level)| (user_id.clone(), *level))
.collect::<BTreeMap<_, _>>();
let join_rules_pl = power_levels
.events
.get(&StateEventType::RoomJoinRules.into())
.copied()
.unwrap_or(power_levels.state_default);
let kick_pl = power_levels.kick;
let ban_pl = power_levels.ban;
let min_pl = join_rules_pl.min(kick_pl).min(ban_pl);
let mut ordered_users = local_users
.iter()
.chain(local_creators.iter().map(|user_id| (user_id, &Int::MAX)))
.map(|(user_id, level)| {
if local_creators.contains(user_id) {
(user_id, Int::MAX)
@ -873,7 +868,6 @@ async fn shutdown_room(
(user_id, *level)
}
})
.filter(|(user_id, level)| *level >= min_pl || local_creators.contains(*user_id))
.collect::<Vec<_>>();
ordered_users.sort_by_key(|(_, level)| level.saturating_mul(Int::from(-1)));
@ -884,11 +878,6 @@ async fn shutdown_room(
let mut removed_ok: u32 = 0;
for (user_id, powerlevel) in ordered_users {
let new_membership = if powerlevel >= ban_pl {
MembershipState::Ban
} else {
MembershipState::Leave
};
if !self
.services
.rooms
@ -1025,6 +1014,16 @@ async fn shutdown_room(
if remove_user == user_id || self.services.admin.user_is_admin(user_id).await {
continue;
}
let user_pl = power_levels
.users
.get(remove_user)
.copied()
.unwrap_or(power_levels.users_default);
let new_membership = if power_levels.ban <= powerlevel && user_pl < powerlevel {
MembershipState::Ban
} else {
MembershipState::Leave
};
debug!("Removing {remove_user} via {user_id}");
if let Err(e) = self
.services