From d99509e8849c779864bd177df59fea7797aad9f1 Mon Sep 17 00:00:00 2001 From: Valere Date: Thu, 12 Sep 2024 11:52:59 +0200 Subject: [PATCH] crypto: Add configuration flag to enable invisible crypto --- .../libraries/featureflag/api/FeatureFlags.kt | 9 +++++ .../matrix/impl/RustMatrixClientFactory.kt | 11 +++++++ .../AlwaysEnabledFeatureFlagService.kt | 23 +++++++++++++ .../android/samples/minimal/MainActivity.kt | 1 + .../android/samples/minimal/RoomListScreen.kt | 33 +------------------ 5 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 samples/minimal/src/main/kotlin/io/element/android/samples/minimal/AlwaysEnabledFeatureFlagService.kt diff --git a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt index d8ab4bb176..d71c0de360 100644 --- a/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt +++ b/libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt @@ -123,4 +123,13 @@ enum class FeatureFlags( defaultValue = { true }, isFinished = false, ), + InvisibleCrypto( + key = "feature.invisibleCrypto", + title = "Invisible Crypto", + description = "This setting controls how end-to-end encryption (E2E) keys are shared." + + " Enabling it will prevent the inclusion of devices that have not been explicitly verified by their owners." + + " You'll have to stop and re-open the app manually for that setting to take effect.", + defaultValue = { false }, + isFinished = false, + ), } diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt index 2fe4284f98..7681dda6f0 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt @@ -10,6 +10,8 @@ package io.element.android.libraries.matrix.impl import io.element.android.appconfig.AuthenticationConfig import io.element.android.libraries.core.coroutine.CoroutineDispatchers import io.element.android.libraries.di.CacheDirectory +import io.element.android.libraries.featureflag.api.FeatureFlagService +import io.element.android.libraries.featureflag.api.FeatureFlags import io.element.android.libraries.matrix.impl.analytics.UtdTracker import io.element.android.libraries.matrix.impl.certificates.UserCertificatesProvider import io.element.android.libraries.matrix.impl.paths.SessionPaths @@ -30,6 +32,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersion import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder import org.matrix.rustcomponents.sdk.use import timber.log.Timber +import uniffi.matrix_sdk_crypto.CollectStrategy import java.io.File import javax.inject.Inject @@ -45,6 +48,7 @@ class RustMatrixClientFactory @Inject constructor( private val clock: SystemClock, private val utdTracker: UtdTracker, private val appPreferencesStore: AppPreferencesStore, + private val featureFlagService: FeatureFlagService, ) { suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) { val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers) @@ -104,6 +108,13 @@ class RustMatrixClientFactory @Inject constructor( .addRootCertificates(userCertificatesProvider.provides()) .autoEnableBackups(true) .autoEnableCrossSigning(true) + .roomKeyRecipientStrategy( + strategy = if (featureFlagService.isFeatureEnabled(FeatureFlags.InvisibleCrypto)) { + CollectStrategy.IdentityBasedStrategy + } else { + CollectStrategy.DeviceBasedStrategy(onlyAllowTrustedDevices = false, errorOnVerifiedUserProblem = false) + } + ) .run { // Apply sliding sync version settings when (slidingSync) { diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/AlwaysEnabledFeatureFlagService.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/AlwaysEnabledFeatureFlagService.kt new file mode 100644 index 0000000000..67151d5aa4 --- /dev/null +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/AlwaysEnabledFeatureFlagService.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2024 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only + * Please see LICENSE in the repository root for full details. + */ + +package io.element.android.samples.minimal + +import io.element.android.libraries.featureflag.api.Feature +import io.element.android.libraries.featureflag.api.FeatureFlagService +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +class AlwaysEnabledFeatureFlagService : FeatureFlagService { + override fun isFeatureEnabledFlow(feature: Feature): Flow { + return flowOf(true) + } + + override suspend fun setFeatureEnabled(feature: Feature, enabled: Boolean): Boolean { + return true + } +} diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt index e1654a8fb7..5319baf10e 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt @@ -56,6 +56,7 @@ class MainActivity : ComponentActivity() { clock = DefaultSystemClock(), utdTracker = UtdTracker(NoopAnalyticsService()), appPreferencesStore = InMemoryAppPreferencesStore(), + featureFlagService = AlwaysEnabledFeatureFlagService(), ), passphraseGenerator = NullPassphraseGenerator(), oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory), diff --git a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt index 70f2a1f8a4..c6a2d49c89 100644 --- a/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt +++ b/samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt @@ -25,8 +25,6 @@ import io.element.android.features.roomlist.impl.filters.selection.DefaultFilter import io.element.android.features.roomlist.impl.search.RoomListSearchDataSource import io.element.android.features.roomlist.impl.search.RoomListSearchPresenter import io.element.android.libraries.core.coroutine.CoroutineDispatchers -import io.element.android.libraries.core.meta.BuildMeta -import io.element.android.libraries.core.meta.BuildType import io.element.android.libraries.dateformatter.impl.DateFormatters import io.element.android.libraries.dateformatter.impl.DefaultLastMessageTimestampFormatter import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider @@ -35,8 +33,6 @@ import io.element.android.libraries.eventformatter.impl.DefaultRoomLastMessageFo import io.element.android.libraries.eventformatter.impl.ProfileChangeContentFormatter import io.element.android.libraries.eventformatter.impl.RoomMembershipContentFormatter import io.element.android.libraries.eventformatter.impl.StateContentFormatter -import io.element.android.libraries.featureflag.impl.DefaultFeatureFlagService -import io.element.android.libraries.featureflag.impl.PreferencesFeatureFlagProvider import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsPresenter import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState import io.element.android.libraries.indicator.impl.DefaultIndicatorService @@ -70,13 +66,7 @@ class RoomListScreen( private val sessionVerificationService = matrixClient.sessionVerificationService() private val encryptionService = matrixClient.encryptionService() private val stringProvider = AndroidStringProvider(context.resources) - private val buildMeta = getBuildMeta(context) - private val featureFlagService = DefaultFeatureFlagService( - providers = setOf( - PreferencesFeatureFlagProvider(context = context, buildMeta = buildMeta) - ), - buildMeta = buildMeta, - ) + private val featureFlagService = AlwaysEnabledFeatureFlagService() private val roomListRoomSummaryFactory = RoomListRoomSummaryFactory( lastMessageTimestampFormatter = DefaultLastMessageTimestampFormatter( localDateTimeProvider = dateTimeProvider, @@ -191,25 +181,4 @@ class RoomListScreen( } } } - - private fun getBuildMeta(context: Context): BuildMeta { - val buildType = BuildType.valueOf(BuildConfig.BUILD_TYPE.uppercase()) - val name = context.getString(R.string.app_name) - return BuildMeta( - isDebuggable = BuildConfig.DEBUG, - buildType = buildType, - applicationName = name, - productionApplicationName = name, - desktopApplicationName = name, - applicationId = BuildConfig.APPLICATION_ID, - lowPrivacyLoggingEnabled = false, - versionName = BuildConfig.VERSION_NAME, - versionCode = BuildConfig.VERSION_CODE.toLong(), - gitRevision = "", - gitBranchName = "", - flavorDescription = "", - flavorShortDescription = "", - isEnterpriseBuild = false, - ) - } }