From 60fa76a9b98e3f6b895ca60a17591ab6ee082b37 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 23 Dec 2025 11:44:16 +0100 Subject: [PATCH 1/3] Revert "fix: display banned member list if permissions.canKick or permissions.canBan" This reverts commit f7248b87f0dd7e5aa8f7c30b98115dad8e2402c2. --- .../features/roomdetails/impl/members/RoomMemberListState.kt | 2 +- .../roommembermoderation/api/RoomMemberModerationPermissions.kt | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt index 5a113bc3b2..7c928fb27a 100644 --- a/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt +++ b/features/roomdetails/impl/src/main/kotlin/io/element/android/features/roomdetails/impl/members/RoomMemberListState.kt @@ -26,7 +26,7 @@ data class RoomMemberListState( val moderationState: RoomMemberModerationState, val eventSink: (RoomMemberListEvents) -> Unit, ) { - val showBannedSection: Boolean = moderationState.permissions.hasAny && roomMembers.dataOrNull()?.banned?.isNotEmpty() == true + val showBannedSection: Boolean = moderationState.permissions.canBan && roomMembers.dataOrNull()?.banned?.isNotEmpty() == true } enum class SelectedSection { diff --git a/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt b/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt index 10ea6c4451..223456de69 100644 --- a/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt +++ b/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt @@ -13,8 +13,6 @@ data class RoomMemberModerationPermissions( val canKick: Boolean, val canBan: Boolean, ) { - val hasAny = canKick || canBan - companion object { val DEFAULT = RoomMemberModerationPermissions( canKick = false, From f732aa18a87fec2a1478c37ef9af5b5c9d381aa0 Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 23 Dec 2025 14:36:19 +0100 Subject: [PATCH 2/3] fix: unban action requires both ban and kick permissions --- .../impl/RoomMemberModerationPresenter.kt | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt index cfb9412394..3a5c364b31 100644 --- a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt +++ b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt @@ -161,16 +161,28 @@ class RoomMemberModerationPresenter( val canModerateThisUser = currentUserPowerLevel > targetMemberPowerLevel // Assume the member is joined when it's unknown val membership = member?.membership ?: RoomMembershipState.JOIN - if (permissions.canKick) { - // Unban requires kick permission instead of a dedicated unban permission - if (membership == RoomMembershipState.BAN) { - add(ModerationActionState(action = ModerationAction.UnbanUser, isEnabled = canModerateThisUser)) - } else if (membership != RoomMembershipState.LEAVE) { - add(ModerationActionState(action = ModerationAction.KickUser, isEnabled = canModerateThisUser)) + when (membership) { + RoomMembershipState.BAN -> { + // Unban requires both kick and ban permission instead of a dedicated unban permission + if (permissions.canBan && permissions.canKick) { + add(ModerationActionState(action = ModerationAction.UnbanUser, isEnabled = canModerateThisUser)) + } + } + RoomMembershipState.INVITE, + RoomMembershipState.JOIN, + RoomMembershipState.KNOCK -> { + if (permissions.canKick) { + add(ModerationActionState(action = ModerationAction.KickUser, isEnabled = canModerateThisUser)) + } + if (permissions.canBan) { + add(ModerationActionState(action = ModerationAction.BanUser, isEnabled = canModerateThisUser)) + } + } + RoomMembershipState.LEAVE -> { + if (permissions.canBan) { + add(ModerationActionState(action = ModerationAction.BanUser, isEnabled = canModerateThisUser)) + } } - } - if (permissions.canBan && membership != RoomMembershipState.BAN) { - add(ModerationActionState(action = ModerationAction.BanUser, isEnabled = canModerateThisUser)) } }.toImmutableList() } From ad0b1e33f919635d80cb3a1be45c05d2b496a98e Mon Sep 17 00:00:00 2001 From: ganfra Date: Tue, 30 Dec 2025 15:59:04 +0100 Subject: [PATCH 3/3] quality : move canUnban logic to the permission class --- .../api/RoomMemberModerationPermissions.kt | 3 +++ .../roommembermoderation/impl/RoomMemberModerationPresenter.kt | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt b/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt index 223456de69..87414b836e 100644 --- a/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt +++ b/features/roommembermoderation/api/src/main/kotlin/io/element/android/features/roommembermoderation/api/RoomMemberModerationPermissions.kt @@ -13,6 +13,9 @@ data class RoomMemberModerationPermissions( val canKick: Boolean, val canBan: Boolean, ) { + // Unban requires both kick and ban permission instead of a dedicated unban permission + val canUnban = canBan && canKick + companion object { val DEFAULT = RoomMemberModerationPermissions( canKick = false, diff --git a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt index 3a5c364b31..2a876fc484 100644 --- a/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt +++ b/features/roommembermoderation/impl/src/main/kotlin/io/element/android/features/roommembermoderation/impl/RoomMemberModerationPresenter.kt @@ -163,8 +163,7 @@ class RoomMemberModerationPresenter( val membership = member?.membership ?: RoomMembershipState.JOIN when (membership) { RoomMembershipState.BAN -> { - // Unban requires both kick and ban permission instead of a dedicated unban permission - if (permissions.canBan && permissions.canKick) { + if (permissions.canUnban) { add(ModerationActionState(action = ModerationAction.UnbanUser, isEnabled = canModerateThisUser)) } }