From ccd358ece5b2ef55ac01ffe0d90cd3d0d40a5f5b Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 19 Jan 2026 10:54:33 +0100 Subject: [PATCH] Tweak the power levels when creating a space (#6012) * Tweak the power levels when creating a space * Also tweak the `invite` power levels for public access rooms --- .../libraries/matrix/impl/RustMatrixClient.kt | 26 ++++++++++++------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt index b24f4b90d8..6eee6ee7cc 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClient.kt @@ -370,6 +370,9 @@ class RustMatrixClient( override suspend fun createRoom(createRoomParams: CreateRoomParameters): Result = withContext(sessionDispatcher) { runCatchingExceptions { + val hasPublicAccess = createRoomParams.preset == RoomPreset.PUBLIC_CHAT || createRoomParams.joinRuleOverride == JoinRule.Public + val powerLevels = defaultRoomCreationPowerLevels(isSpace = createRoomParams.isSpace, isPublic = hasPublicAccess) + val rustParams = RustCreateRoomParameters( name = createRoomParams.name, topic = createRoomParams.topic, @@ -383,12 +386,12 @@ class RustMatrixClient( }, invite = createRoomParams.invite?.map { it.value }, avatar = createRoomParams.avatar, - powerLevelContentOverride = defaultRoomCreationPowerLevels.copy( + powerLevelContentOverride = powerLevels.copy( invite = if (createRoomParams.joinRuleOverride == JoinRule.Knock) { // override the invite power level so it's the same as kick. RoomMember.Role.Moderator.powerLevel.toInt() } else { - null + powerLevels.invite } ), joinRuleOverride = createRoomParams.joinRuleOverride?.map(), @@ -833,18 +836,23 @@ class RustMatrixClient( } } -private val defaultRoomCreationPowerLevels = PowerLevels( +private fun defaultRoomCreationPowerLevels(isPublic: Boolean, isSpace: Boolean) = PowerLevels( usersDefault = null, - eventsDefault = null, + // Only admins should be able to send events in general + eventsDefault = if (isSpace) 100 else null, stateDefault = null, ban = null, kick = null, redact = null, - invite = null, + invite = if (isPublic) 0 else 50, notifications = null, users = mapOf(), - events = mapOf( - "m.call.member" to 0, - "org.matrix.msc3401.call.member" to 0, - ) + events = if (!isSpace) { + mapOf( + "m.call.member" to 0, + "org.matrix.msc3401.call.member" to 0, + ) + } else { + mapOf() + } )