Skip to content

Commit 5e64898

Browse files
authored
Fix 'unverified session' flow displayed when creating account (#4467)
* Fix 'unverified session' after creating an account: when creating an account, wait until the session is verified before marking the authentication flow as completed.
1 parent b9e286d commit 5e64898

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

features/login/impl/src/main/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountPresenter.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@ import dagger.assisted.AssistedInject
1919
import io.element.android.features.login.impl.DefaultLoginUserStory
2020
import io.element.android.libraries.architecture.AsyncAction
2121
import io.element.android.libraries.architecture.Presenter
22+
import io.element.android.libraries.core.data.tryOrNull
2223
import io.element.android.libraries.core.extensions.flatMap
2324
import io.element.android.libraries.core.meta.BuildMeta
25+
import io.element.android.libraries.matrix.api.MatrixClientProvider
2426
import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
2527
import io.element.android.libraries.matrix.api.core.SessionId
2628
import kotlinx.coroutines.CoroutineScope
29+
import kotlinx.coroutines.flow.first
2730
import kotlinx.coroutines.launch
31+
import kotlinx.coroutines.withTimeout
32+
import kotlin.time.Duration.Companion.seconds
2833

2934
class CreateAccountPresenter @AssistedInject constructor(
3035
@Assisted private val url: String,
3136
private val authenticationService: MatrixAuthenticationService,
37+
private val clientProvider: MatrixClientProvider,
3238
private val defaultLoginUserStory: DefaultLoginUserStory,
3339
private val messageParser: MessageParser,
3440
private val buildMeta: BuildMeta,
@@ -73,6 +79,12 @@ class CreateAccountPresenter @AssistedInject constructor(
7379
}.flatMap { externalSession ->
7480
authenticationService.importCreatedSession(externalSession)
7581
}.onSuccess { sessionId ->
82+
tryOrNull {
83+
// Wait until the session is verified
84+
val client = clientProvider.getOrRestore(sessionId).getOrThrow()
85+
val sessionVerificationService = client.sessionVerificationService()
86+
withTimeout(10.seconds) { sessionVerificationService.sessionVerifiedStatus.first { it.isVerified() } }
87+
}
7688
// We will not navigate to the WaitList screen, so the login user story is done
7789
defaultLoginUserStory.setLoginFlowIsDone(true)
7890
loggedInState.value = AsyncAction.Success(sessionId)

features/login/impl/src/test/kotlin/io/element/android/features/login/impl/screens/createaccount/CreateAccountPresenterTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import io.element.android.libraries.matrix.api.auth.MatrixAuthenticationService
1818
import io.element.android.libraries.matrix.api.auth.external.ExternalSession
1919
import io.element.android.libraries.matrix.test.AN_EXCEPTION
2020
import io.element.android.libraries.matrix.test.A_SESSION_ID
21+
import io.element.android.libraries.matrix.test.FakeMatrixClientProvider
2122
import io.element.android.libraries.matrix.test.auth.FakeMatrixAuthenticationService
2223
import io.element.android.libraries.matrix.test.core.aBuildMeta
2324
import io.element.android.tests.testutils.WarmUpRule
@@ -135,11 +136,13 @@ class CreateAccountPresenterTest {
135136
defaultLoginUserStory: DefaultLoginUserStory = DefaultLoginUserStory(),
136137
messageParser: MessageParser = FakeMessageParser(),
137138
buildMeta: BuildMeta = aBuildMeta(),
139+
clientProvider: FakeMatrixClientProvider = FakeMatrixClientProvider(),
138140
) = CreateAccountPresenter(
139141
url = url,
140142
authenticationService = authenticationService,
141143
defaultLoginUserStory = defaultLoginUserStory,
142144
messageParser = messageParser,
143145
buildMeta = buildMeta,
146+
clientProvider = clientProvider,
144147
)
145148
}

0 commit comments

Comments
 (0)