Skip to content

Commit b62348f

Browse files
authored
Merge pull request #3298 from element-hq/feat/jme/3268-crypto-identity-reset
Feature: identity reset
2 parents ca81e46 + 99efdb6 commit b62348f

File tree

95 files changed

+2092
-172
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

95 files changed

+2092
-172
lines changed

appnav/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ dependencies {
4242
implementation(projects.libraries.architecture)
4343
implementation(projects.libraries.deeplink)
4444
implementation(projects.libraries.matrix.api)
45+
implementation(projects.libraries.oidc.api)
4546
implementation(projects.libraries.preferences.api)
4647
implementation(projects.libraries.push.api)
4748
implementation(projects.libraries.pushproviders.api)
@@ -66,6 +67,7 @@ dependencies {
6667
testImplementation(libs.test.truth)
6768
testImplementation(libs.test.turbine)
6869
testImplementation(projects.libraries.matrix.test)
70+
testImplementation(projects.libraries.oidc.impl)
6971
testImplementation(projects.libraries.push.test)
7072
testImplementation(projects.libraries.pushproviders.test)
7173
testImplementation(projects.features.networkmonitor.test)

appnav/src/main/kotlin/io/element/android/appnav/RootFlowNode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,6 @@ import io.element.android.appnav.intent.ResolvedIntent
4242
import io.element.android.appnav.root.RootNavStateFlowFactory
4343
import io.element.android.appnav.root.RootPresenter
4444
import io.element.android.appnav.root.RootView
45-
import io.element.android.features.login.api.oidc.OidcAction
46-
import io.element.android.features.login.api.oidc.OidcActionFlow
4745
import io.element.android.features.rageshake.api.bugreport.BugReportEntryPoint
4846
import io.element.android.features.signedout.api.SignedOutEntryPoint
4947
import io.element.android.features.viewfolder.api.ViewFolderEntryPoint
@@ -58,6 +56,8 @@ import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
5856
import io.element.android.libraries.matrix.api.core.SessionId
5957
import io.element.android.libraries.matrix.api.core.toRoomIdOrAlias
6058
import io.element.android.libraries.matrix.api.permalink.PermalinkData
59+
import io.element.android.libraries.oidc.api.OidcAction
60+
import io.element.android.libraries.oidc.api.OidcActionFlow
6161
import io.element.android.libraries.sessionstorage.api.LoggedInState
6262
import kotlinx.coroutines.flow.distinctUntilChanged
6363
import kotlinx.coroutines.flow.launchIn

appnav/src/main/kotlin/io/element/android/appnav/intent/IntentResolver.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
package io.element.android.appnav.intent
1818

1919
import android.content.Intent
20-
import io.element.android.features.login.api.oidc.OidcAction
21-
import io.element.android.features.login.api.oidc.OidcIntentResolver
2220
import io.element.android.libraries.deeplink.DeeplinkData
2321
import io.element.android.libraries.deeplink.DeeplinkParser
2422
import io.element.android.libraries.matrix.api.permalink.PermalinkData
2523
import io.element.android.libraries.matrix.api.permalink.PermalinkParser
24+
import io.element.android.libraries.oidc.api.OidcAction
25+
import io.element.android.libraries.oidc.api.OidcIntentResolver
2626
import timber.log.Timber
2727
import javax.inject.Inject
2828

appnav/src/test/kotlin/io/element/android/appnav/intent/IntentResolverTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ import android.content.Intent
2121
import android.net.Uri
2222
import androidx.core.net.toUri
2323
import com.google.common.truth.Truth.assertThat
24-
import io.element.android.features.login.api.oidc.OidcAction
25-
import io.element.android.features.login.impl.oidc.DefaultOidcIntentResolver
26-
import io.element.android.features.login.impl.oidc.OidcUrlParser
2724
import io.element.android.libraries.deeplink.DeepLinkCreator
2825
import io.element.android.libraries.deeplink.DeeplinkData
2926
import io.element.android.libraries.deeplink.DeeplinkParser
@@ -33,6 +30,9 @@ import io.element.android.libraries.matrix.test.A_ROOM_ID
3330
import io.element.android.libraries.matrix.test.A_SESSION_ID
3431
import io.element.android.libraries.matrix.test.A_THREAD_ID
3532
import io.element.android.libraries.matrix.test.permalink.FakePermalinkParser
33+
import io.element.android.libraries.oidc.api.OidcAction
34+
import io.element.android.libraries.oidc.impl.DefaultOidcIntentResolver
35+
import io.element.android.libraries.oidc.impl.OidcUrlParser
3636
import io.element.android.tests.testutils.lambda.lambdaError
3737
import org.junit.Assert.assertThrows
3838
import org.junit.Test

features/ftue/impl/src/main/kotlin/io/element/android/features/ftue/impl/sessionverification/FtueSessionVerificationFlowNode.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class FtueSessionVerificationFlowNode @AssistedInject constructor(
5858

5959
@Parcelize
6060
data object EnterRecoveryKey : NavTarget
61+
62+
@Parcelize
63+
data object ResetIdentity : NavTarget
6164
}
6265

6366
interface Callback : Plugin {
@@ -85,6 +88,10 @@ class FtueSessionVerificationFlowNode @AssistedInject constructor(
8588
override fun onDone() {
8689
plugins<Callback>().forEach { it.onDone() }
8790
}
91+
92+
override fun onResetKey() {
93+
backstack.push(NavTarget.ResetIdentity)
94+
}
8895
})
8996
.build()
9097
}
@@ -94,6 +101,16 @@ class FtueSessionVerificationFlowNode @AssistedInject constructor(
94101
.callback(secureBackupEntryPointCallback)
95102
.build()
96103
}
104+
is NavTarget.ResetIdentity -> {
105+
secureBackupEntryPoint.nodeBuilder(this, buildContext)
106+
.params(SecureBackupEntryPoint.Params(SecureBackupEntryPoint.InitialTarget.ResetIdentity))
107+
.callback(object : SecureBackupEntryPoint.Callback {
108+
override fun onDone() {
109+
plugins<Callback>().forEach { it.onDone() }
110+
}
111+
})
112+
.build()
113+
}
97114
}
98115
}
99116

features/login/impl/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ dependencies {
5050
implementation(projects.libraries.uiStrings)
5151
implementation(projects.libraries.permissions.api)
5252
implementation(projects.libraries.qrcode)
53+
implementation(projects.libraries.oidc.api)
5354
implementation(libs.androidx.browser)
5455
implementation(platform(libs.network.retrofit.bom))
5556
implementation(libs.network.retrofit)
@@ -65,6 +66,7 @@ dependencies {
6566
testImplementation(libs.test.truth)
6667
testImplementation(libs.test.turbine)
6768
testImplementation(projects.libraries.matrix.test)
69+
testImplementation(projects.libraries.oidc.impl)
6870
testImplementation(projects.libraries.permissions.test)
6971
testImplementation(projects.tests.testutils)
7072
testReleaseImplementation(libs.androidx.compose.ui.test.manifest)

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/LoginFlowNode.kt

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,7 @@ import dagger.assisted.AssistedInject
3636
import io.element.android.anvilannotations.ContributesNode
3737
import io.element.android.compound.theme.ElementTheme
3838
import io.element.android.features.login.api.LoginFlowType
39-
import io.element.android.features.login.api.oidc.OidcAction
40-
import io.element.android.features.login.api.oidc.OidcActionFlow
4139
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
42-
import io.element.android.features.login.impl.oidc.CustomTabAvailabilityChecker
43-
import io.element.android.features.login.impl.oidc.customtab.CustomTabHandler
44-
import io.element.android.features.login.impl.oidc.webview.OidcNode
4540
import io.element.android.features.login.impl.qrcode.QrCodeLoginFlowNode
4641
import io.element.android.features.login.impl.screens.changeaccountprovider.ChangeAccountProviderNode
4742
import io.element.android.features.login.impl.screens.confirmaccountprovider.ConfirmAccountProviderNode
@@ -56,6 +51,9 @@ import io.element.android.libraries.architecture.createNode
5651
import io.element.android.libraries.architecture.inputs
5752
import io.element.android.libraries.di.AppScope
5853
import io.element.android.libraries.matrix.api.auth.OidcDetails
54+
import io.element.android.libraries.oidc.api.OidcAction
55+
import io.element.android.libraries.oidc.api.OidcActionFlow
56+
import io.element.android.libraries.oidc.api.OidcEntryPoint
5957
import kotlinx.coroutines.delay
6058
import kotlinx.coroutines.launch
6159
import kotlinx.parcelize.Parcelize
@@ -64,11 +62,10 @@ import kotlinx.parcelize.Parcelize
6462
class LoginFlowNode @AssistedInject constructor(
6563
@Assisted buildContext: BuildContext,
6664
@Assisted plugins: List<Plugin>,
67-
private val customTabAvailabilityChecker: CustomTabAvailabilityChecker,
68-
private val customTabHandler: CustomTabHandler,
6965
private val accountProviderDataSource: AccountProviderDataSource,
7066
private val defaultLoginUserStory: DefaultLoginUserStory,
7167
private val oidcActionFlow: OidcActionFlow,
68+
private val oidcEntryPoint: OidcEntryPoint,
7269
) : BaseFlowNode<LoginFlowNode.NavTarget>(
7370
backstack = BackStack(
7471
initialElement = NavTarget.Root,
@@ -146,11 +143,11 @@ class LoginFlowNode @AssistedInject constructor(
146143
)
147144
val callback = object : ConfirmAccountProviderNode.Callback {
148145
override fun onOidcDetails(oidcDetails: OidcDetails) {
149-
if (customTabAvailabilityChecker.supportCustomTab()) {
146+
if (oidcEntryPoint.canUseCustomTab()) {
150147
// In this case open a Chrome Custom tab
151148
activity?.let {
152149
customChromeTabStarted = true
153-
customTabHandler.open(it, darkTheme, oidcDetails.url)
150+
oidcEntryPoint.openUrlInCustomTab(it, darkTheme, oidcDetails.url)
154151
}
155152
} else {
156153
// Fallback to WebView mode
@@ -201,8 +198,7 @@ class LoginFlowNode @AssistedInject constructor(
201198
createNode<LoginPasswordNode>(buildContext, plugins = listOf(callback))
202199
}
203200
is NavTarget.OidcView -> {
204-
val input = OidcNode.Inputs(navTarget.oidcDetails)
205-
createNode<OidcNode>(buildContext, plugins = listOf(input))
201+
oidcEntryPoint.createFallbackWebViewNode(this, buildContext, navTarget.oidcDetails.url)
206202
}
207203
is NavTarget.WaitList -> {
208204
val inputs = WaitListNode.Inputs(

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenter.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,23 @@ import androidx.compose.runtime.rememberCoroutineScope
2727
import dagger.assisted.Assisted
2828
import dagger.assisted.AssistedFactory
2929
import dagger.assisted.AssistedInject
30-
import io.element.android.features.login.api.oidc.OidcAction
3130
import io.element.android.features.login.impl.DefaultLoginUserStory
3231
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
3332
import io.element.android.features.login.impl.error.ChangeServerError
34-
import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow
3533
import io.element.android.libraries.architecture.AsyncData
3634
import io.element.android.libraries.architecture.Presenter
3735
import io.element.android.libraries.architecture.runCatchingUpdatingState
3836
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
37+
import io.element.android.libraries.oidc.api.OidcAction
38+
import io.element.android.libraries.oidc.api.OidcActionFlow
3939
import kotlinx.coroutines.CoroutineScope
4040
import kotlinx.coroutines.launch
4141

4242
class ConfirmAccountProviderPresenter @AssistedInject constructor(
4343
@Assisted private val params: Params,
4444
private val accountProviderDataSource: AccountProviderDataSource,
4545
private val authenticationService: MatrixAuthenticationService,
46-
private val defaultOidcActionFlow: DefaultOidcActionFlow,
46+
private val oidcActionFlow: OidcActionFlow,
4747
private val defaultLoginUserStory: DefaultLoginUserStory,
4848
) : Presenter<ConfirmAccountProviderState> {
4949
data class Params(
@@ -65,7 +65,7 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor(
6565
}
6666

6767
LaunchedEffect(Unit) {
68-
defaultOidcActionFlow.collect { oidcAction ->
68+
oidcActionFlow.collect { oidcAction ->
6969
if (oidcAction != null) {
7070
onOidcAction(oidcAction, loginFlowAction)
7171
}
@@ -133,6 +133,6 @@ class ConfirmAccountProviderPresenter @AssistedInject constructor(
133133
}
134134
}
135135
}
136-
defaultOidcActionFlow.reset()
136+
oidcActionFlow.reset()
137137
}
138138
}

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/confirmaccountprovider/ConfirmAccountProviderPresenterTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ import app.cash.molecule.RecompositionMode
2020
import app.cash.molecule.moleculeFlow
2121
import app.cash.turbine.test
2222
import com.google.common.truth.Truth.assertThat
23-
import io.element.android.features.login.api.oidc.OidcAction
2423
import io.element.android.features.login.impl.DefaultLoginUserStory
2524
import io.element.android.features.login.impl.accountprovider.AccountProviderDataSource
26-
import io.element.android.features.login.impl.oidc.customtab.DefaultOidcActionFlow
2725
import io.element.android.features.login.impl.util.defaultAccountProvider
2826
import io.element.android.libraries.architecture.AsyncData
2927
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
3028
import io.element.android.libraries.matrix.test.A_HOMESERVER
3129
import io.element.android.libraries.matrix.test.A_HOMESERVER_OIDC
3230
import io.element.android.libraries.matrix.test.A_THROWABLE
3331
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
32+
import io.element.android.libraries.oidc.api.OidcAction
33+
import io.element.android.libraries.oidc.impl.customtab.DefaultOidcActionFlow
3434
import io.element.android.tests.testutils.WarmUpRule
3535
import io.element.android.tests.testutils.waitForPredicate
3636
import kotlinx.coroutines.test.runTest
@@ -274,7 +274,7 @@ class ConfirmAccountProviderPresenterTest {
274274
params = params,
275275
accountProviderDataSource = accountProviderDataSource,
276276
authenticationService = matrixAuthenticationService,
277-
defaultOidcActionFlow = defaultOidcActionFlow,
277+
oidcActionFlow = defaultOidcActionFlow,
278278
defaultLoginUserStory = defaultLoginUserStory,
279279
)
280280
}

features/securebackup/api/src/main/kotlin/io/element/android/features/securebackup/api/SecureBackupEntryPoint.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ interface SecureBackupEntryPoint : FeatureEntryPoint {
3434

3535
@Parcelize
3636
data object CreateNewRecoveryKey : InitialTarget
37+
38+
@Parcelize
39+
data object ResetIdentity : InitialTarget
3740
}
3841

3942
data class Params(val initialElement: InitialTarget) : NodeInputs

0 commit comments

Comments
 (0)