Enforce HS disabling E2EE in DM creation too (Element Pro) (#7292)

This part was missing from the implementation of this Element Pro feature, which incorrectly only applied to rooms.
This commit is contained in:
Jorge Martin Espinosa
2026-07-29 11:17:41 +02:00
committed by GitHub
parent 00dcf48f28
commit 674354b1a6
8 changed files with 50 additions and 10 deletions
+2
View File
@@ -43,6 +43,7 @@ dependencies {
implementation(libs.coil.compose)
implementation(projects.libraries.featureflag.api)
implementation(projects.features.createroom.api)
implementation(projects.features.enterprise.api)
api(projects.features.startchat.api)
testCommonDependencies(libs, true)
@@ -55,4 +56,5 @@ dependencies {
testImplementation(projects.features.createroom.test)
testImplementation(projects.features.startchat.test)
testImplementation(projects.libraries.featureflag.test)
testImplementation(projects.features.enterprise.test)
}
@@ -11,6 +11,7 @@ package io.element.android.features.startchat.impl
import androidx.compose.runtime.MutableState
import dev.zacsweers.metro.ContributesBinding
import im.vector.app.features.analytics.plan.CreatedRoom
import io.element.android.features.enterprise.api.SessionEnterpriseService
import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser
import io.element.android.features.startchat.api.StartDMAction
import io.element.android.libraries.architecture.AsyncAction
@@ -26,6 +27,7 @@ import io.element.android.services.analytics.api.AnalyticsService
class DefaultStartDMAction(
private val matrixClient: MatrixClient,
private val analyticsService: AnalyticsService,
private val sessionEnterpriseService: SessionEnterpriseService,
) : StartDMAction {
override suspend fun execute(
matrixUser: MatrixUser,
@@ -33,7 +35,11 @@ class DefaultStartDMAction(
actionState: MutableState<AsyncAction<RoomId>>,
) {
actionState.value = AsyncAction.Loading
when (val result = matrixClient.startDM(matrixUser.userId, createIfDmDoesNotExist)) {
when (val result = matrixClient.startDM(
userId = matrixUser.userId,
createIfDmDoesNotExist = createIfDmDoesNotExist,
isEncryped = !sessionEnterpriseService.isEncryptionDisabledByHomeserver(),
)) {
is StartDMResult.Success -> {
if (result.isNew) {
analyticsService.capture(CreatedRoom(isDM = true))
@@ -11,6 +11,8 @@ package io.element.android.features.startchat.impl
import androidx.compose.runtime.mutableStateOf
import com.google.common.truth.Truth.assertThat
import im.vector.app.features.analytics.plan.CreatedRoom
import io.element.android.features.enterprise.api.SessionEnterpriseService
import io.element.android.features.enterprise.test.FakeSessionEnterpriseService
import io.element.android.features.startchat.api.ConfirmingStartDmWithMatrixUser
import io.element.android.libraries.architecture.AsyncAction
import io.element.android.libraries.matrix.api.MatrixClient
@@ -25,6 +27,7 @@ import io.element.android.libraries.matrix.ui.components.aMatrixUser
import io.element.android.services.analytics.api.AnalyticsService
import io.element.android.services.analytics.test.FakeAnalyticsService
import io.element.android.tests.testutils.lambda.lambdaRecorder
import io.element.android.tests.testutils.lambda.value
import kotlinx.coroutines.test.runTest
import org.junit.Test
@@ -122,13 +125,41 @@ class DefaultStartDMActionTest {
assertThat(state.value).isEqualTo(ConfirmingStartDmWithMatrixUser(aMatrixUser(), isUserIdentityUnknown = true))
}
@Test
fun `when SessionEnterpriseService disables encryption the DM is created without encryption`() = runTest {
val createDmLambda = lambdaRecorder<UserId, Boolean, Result<RoomId>> { _, _ -> Result.success(A_ROOM_ID) }
val matrixClient = FakeMatrixClient().apply {
givenFindDmResult(Result.success(null))
createDmResult = createDmLambda
}
val action = createStartDMAction(
matrixClient = matrixClient,
sessionEnterpriseService = FakeSessionEnterpriseService(isEncryptionDisabledResult = { true })
)
val state = mutableStateOf<AsyncAction<RoomId>>(AsyncAction.Uninitialized)
val matrixUser = aMatrixUser()
action.execute(matrixUser = matrixUser, createIfDmDoesNotExist = true, actionState = state)
createDmLambda.assertions().isCalledOnce().with(
value(matrixUser.userId),
// isEncrypted should be false because encryption is disabled
value(false),
)
assertThat(state.value).isEqualTo(AsyncAction.Success(A_ROOM_ID))
}
private fun createStartDMAction(
matrixClient: MatrixClient = FakeMatrixClient(),
analyticsService: AnalyticsService = FakeAnalyticsService(),
sessionEnterpriseService: SessionEnterpriseService = FakeSessionEnterpriseService(isEncryptionDisabledResult = { false }),
): DefaultStartDMAction {
return DefaultStartDMAction(
matrixClient = matrixClient,
analyticsService = analyticsService,
sessionEnterpriseService = sessionEnterpriseService,
)
}
}