Skip to content

Commit bb50d3e

Browse files
BillCarsonFrganfra
authored andcommitted
crypto: Add configuration flag to enable invisible crypto
1 parent d059474 commit bb50d3e

File tree

5 files changed

+45
-32
lines changed

5 files changed

+45
-32
lines changed

libraries/featureflag/api/src/main/kotlin/io/element/android/libraries/featureflag/api/FeatureFlags.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,13 @@ enum class FeatureFlags(
123123
defaultValue = { true },
124124
isFinished = false,
125125
),
126+
InvisibleCrypto(
127+
key = "feature.invisibleCrypto",
128+
title = "Invisible Crypto",
129+
description = "This setting controls how end-to-end encryption (E2E) keys are shared." +
130+
" Enabling it will prevent the inclusion of devices that have not been explicitly verified by their owners." +
131+
" You'll have to stop and re-open the app manually for that setting to take effect.",
132+
defaultValue = { false },
133+
isFinished = false,
134+
),
126135
}

libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/RustMatrixClientFactory.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ package io.element.android.libraries.matrix.impl
1010
import io.element.android.appconfig.AuthenticationConfig
1111
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
1212
import io.element.android.libraries.di.CacheDirectory
13+
import io.element.android.libraries.featureflag.api.FeatureFlagService
14+
import io.element.android.libraries.featureflag.api.FeatureFlags
1315
import io.element.android.libraries.matrix.impl.analytics.UtdTracker
1416
import io.element.android.libraries.matrix.impl.certificates.UserCertificatesProvider
1517
import io.element.android.libraries.matrix.impl.paths.SessionPaths
@@ -30,6 +32,7 @@ import org.matrix.rustcomponents.sdk.SlidingSyncVersion
3032
import org.matrix.rustcomponents.sdk.SlidingSyncVersionBuilder
3133
import org.matrix.rustcomponents.sdk.use
3234
import timber.log.Timber
35+
import uniffi.matrix_sdk_crypto.CollectStrategy
3336
import java.io.File
3437
import javax.inject.Inject
3538

@@ -45,6 +48,7 @@ class RustMatrixClientFactory @Inject constructor(
4548
private val clock: SystemClock,
4649
private val utdTracker: UtdTracker,
4750
private val appPreferencesStore: AppPreferencesStore,
51+
private val featureFlagService: FeatureFlagService,
4852
) {
4953
suspend fun create(sessionData: SessionData): RustMatrixClient = withContext(coroutineDispatchers.io) {
5054
val sessionDelegate = RustClientSessionDelegate(sessionStore, appCoroutineScope, coroutineDispatchers)
@@ -104,6 +108,13 @@ class RustMatrixClientFactory @Inject constructor(
104108
.addRootCertificates(userCertificatesProvider.provides())
105109
.autoEnableBackups(true)
106110
.autoEnableCrossSigning(true)
111+
.roomKeyRecipientStrategy(
112+
strategy = if (featureFlagService.isFeatureEnabled(FeatureFlags.InvisibleCrypto)) {
113+
CollectStrategy.IdentityBasedStrategy
114+
} else {
115+
CollectStrategy.DeviceBasedStrategy(onlyAllowTrustedDevices = false, errorOnVerifiedUserProblem = false)
116+
}
117+
)
107118
.run {
108119
// Apply sliding sync version settings
109120
when (slidingSync) {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright 2024 New Vector Ltd.
3+
*
4+
* SPDX-License-Identifier: AGPL-3.0-only
5+
* Please see LICENSE in the repository root for full details.
6+
*/
7+
8+
package io.element.android.samples.minimal
9+
10+
import io.element.android.libraries.featureflag.api.Feature
11+
import io.element.android.libraries.featureflag.api.FeatureFlagService
12+
import kotlinx.coroutines.flow.Flow
13+
import kotlinx.coroutines.flow.flowOf
14+
15+
class AlwaysEnabledFeatureFlagService : FeatureFlagService {
16+
override fun isFeatureEnabledFlow(feature: Feature): Flow<Boolean> {
17+
return flowOf(true)
18+
}
19+
20+
override suspend fun setFeatureEnabled(feature: Feature, enabled: Boolean): Boolean {
21+
return true
22+
}
23+
}

samples/minimal/src/main/kotlin/io/element/android/samples/minimal/MainActivity.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class MainActivity : ComponentActivity() {
5656
clock = DefaultSystemClock(),
5757
utdTracker = UtdTracker(NoopAnalyticsService()),
5858
appPreferencesStore = InMemoryAppPreferencesStore(),
59+
featureFlagService = AlwaysEnabledFeatureFlagService(),
5960
),
6061
passphraseGenerator = NullPassphraseGenerator(),
6162
oidcConfigurationProvider = OidcConfigurationProvider(baseDirectory),

samples/minimal/src/main/kotlin/io/element/android/samples/minimal/RoomListScreen.kt

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ import io.element.android.features.roomlist.impl.filters.selection.DefaultFilter
2525
import io.element.android.features.roomlist.impl.search.RoomListSearchDataSource
2626
import io.element.android.features.roomlist.impl.search.RoomListSearchPresenter
2727
import io.element.android.libraries.core.coroutine.CoroutineDispatchers
28-
import io.element.android.libraries.core.meta.BuildMeta
29-
import io.element.android.libraries.core.meta.BuildType
3028
import io.element.android.libraries.dateformatter.impl.DateFormatters
3129
import io.element.android.libraries.dateformatter.impl.DefaultLastMessageTimestampFormatter
3230
import io.element.android.libraries.dateformatter.impl.LocalDateTimeProvider
@@ -35,8 +33,6 @@ import io.element.android.libraries.eventformatter.impl.DefaultRoomLastMessageFo
3533
import io.element.android.libraries.eventformatter.impl.ProfileChangeContentFormatter
3634
import io.element.android.libraries.eventformatter.impl.RoomMembershipContentFormatter
3735
import io.element.android.libraries.eventformatter.impl.StateContentFormatter
38-
import io.element.android.libraries.featureflag.impl.DefaultFeatureFlagService
39-
import io.element.android.libraries.featureflag.impl.PreferencesFeatureFlagProvider
4036
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsPresenter
4137
import io.element.android.libraries.fullscreenintent.api.FullScreenIntentPermissionsState
4238
import io.element.android.libraries.indicator.impl.DefaultIndicatorService
@@ -70,13 +66,7 @@ class RoomListScreen(
7066
private val sessionVerificationService = matrixClient.sessionVerificationService()
7167
private val encryptionService = matrixClient.encryptionService()
7268
private val stringProvider = AndroidStringProvider(context.resources)
73-
private val buildMeta = getBuildMeta(context)
74-
private val featureFlagService = DefaultFeatureFlagService(
75-
providers = setOf(
76-
PreferencesFeatureFlagProvider(context = context, buildMeta = buildMeta)
77-
),
78-
buildMeta = buildMeta,
79-
)
69+
private val featureFlagService = AlwaysEnabledFeatureFlagService()
8070
private val roomListRoomSummaryFactory = RoomListRoomSummaryFactory(
8171
lastMessageTimestampFormatter = DefaultLastMessageTimestampFormatter(
8272
localDateTimeProvider = dateTimeProvider,
@@ -191,25 +181,4 @@ class RoomListScreen(
191181
}
192182
}
193183
}
194-
195-
private fun getBuildMeta(context: Context): BuildMeta {
196-
val buildType = BuildType.valueOf(BuildConfig.BUILD_TYPE.uppercase())
197-
val name = context.getString(R.string.app_name)
198-
return BuildMeta(
199-
isDebuggable = BuildConfig.DEBUG,
200-
buildType = buildType,
201-
applicationName = name,
202-
productionApplicationName = name,
203-
desktopApplicationName = name,
204-
applicationId = BuildConfig.APPLICATION_ID,
205-
lowPrivacyLoggingEnabled = false,
206-
versionName = BuildConfig.VERSION_NAME,
207-
versionCode = BuildConfig.VERSION_CODE.toLong(),
208-
gitRevision = "",
209-
gitBranchName = "",
210-
flavorDescription = "",
211-
flavorShortDescription = "",
212-
isEnterpriseBuild = false,
213-
)
214-
}
215184
}

0 commit comments

Comments
 (0)