From bca3f5806287e8a5fa99dda02e4aaef6fa517179 Mon Sep 17 00:00:00 2001 From: ganfra Date: Thu, 8 Jun 2023 17:02:14 +0200 Subject: [PATCH] Matrix rust sdk : update SessionVerificationService to suspend (Async-Uniffi) --- .../impl/VerifySelfSessionStateMachine.kt | 47 +++++++++++++++---- .../SessionVerificationService.kt | 12 ++--- .../RustSessionVerificationService.kt | 16 +++---- .../FakeSessionVerificationService.kt | 10 ++-- 4 files changed, 57 insertions(+), 28 deletions(-) diff --git a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt index 8006a0b24f..310721d0f2 100644 --- a/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt +++ b/features/verifysession/impl/src/main/kotlin/io/element/android/features/verifysession/impl/VerifySelfSessionStateMachine.kt @@ -15,16 +15,18 @@ */ @file:Suppress("WildcardImport") + package io.element.android.features.verifysession.impl -import io.element.android.libraries.statemachine.createStateMachine import io.element.android.libraries.matrix.api.verification.SessionVerificationService import io.element.android.libraries.matrix.api.verification.VerificationEmoji import io.element.android.libraries.matrix.api.verification.VerificationFlowState +import io.element.android.libraries.statemachine.createStateMachine import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch class VerifySelfSessionStateMachine( coroutineScope: CoroutineScope, @@ -37,13 +39,20 @@ class VerifySelfSessionStateMachine( on(State.StartingSasVerification) } addState { - onEnter { sessionVerificationService.requestVerification() } - + onEnter { + coroutineScope.launch { + sessionVerificationService.requestVerification() + } + } on(State.VerificationRequestAccepted) on(State.Initial) } addState { - onEnter { sessionVerificationService.startVerification() } + onEnter { + coroutineScope.launch { + sessionVerificationService.startVerification() + } + } } addState { on(State.StartingSasVerification) @@ -60,16 +69,22 @@ class VerifySelfSessionStateMachine( } addState { onEnter { state -> - if (state.accept) { - sessionVerificationService.approveVerification() - } else { - sessionVerificationService.declineVerification() + coroutineScope.launch { + if (state.accept) { + sessionVerificationService.approveVerification() + } else { + sessionVerificationService.declineVerification() + } } } on(State.Completed) } addState { - onEnter { sessionVerificationService.cancelVerification() } + onEnter { + coroutineScope.launch { + sessionVerificationService.cancelVerification() + } + } } on(State.SasVerificationStarted) on(State.Canceling) @@ -134,10 +149,13 @@ class VerifySelfSessionStateMachine( /** Replying to a verification challenge. */ data class Replying(override val emojis: List, val accept: Boolean) : Verifying(emojis) } + /** The verification is being canceled. */ object Canceling : State + /** The verification has been canceled, remotely or locally. */ object Canceled : State + /** Verification successful. */ object Completed : State } @@ -145,26 +163,37 @@ class VerifySelfSessionStateMachine( sealed interface Event { /** Request verification. */ object RequestVerification : Event + /** The current verification request has been accepted. */ object DidAcceptVerificationRequest : Event + /** Start a SaS verification flow. */ object StartSasVerification : Event + /** Started a SaS verification flow. */ object DidStartSasVerification : Event + /** Has received emojis. */ data class DidReceiveChallenge(val emojis: List) : Event + /** Emojis match. */ object AcceptChallenge : Event + /** Emojis do not match. */ object DeclineChallenge : Event + /** Remote accepted challenge. */ object DidAcceptChallenge : Event + /** Request cancellation. */ object Cancel : Event + /** Verification cancelled. */ object DidCancel : Event + /** Request failed. */ object DidFail : Event + /** Restart the verification flow. */ object Restart : Event } diff --git a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationService.kt b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationService.kt index 82c90efae9..b2f79c0750 100644 --- a/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationService.kt +++ b/libraries/matrix/api/src/main/kotlin/io/element/android/libraries/matrix/api/verification/SessionVerificationService.kt @@ -40,32 +40,32 @@ interface SessionVerificationService { /** * Request verification of the current session. */ - fun requestVerification() + suspend fun requestVerification() /** * Cancels the current verification attempt. */ - fun cancelVerification() + suspend fun cancelVerification() /** * Approves the current verification. This must happen on both devices to successfully verify a session. */ - fun approveVerification() + suspend fun approveVerification() /** * Declines the verification attempt because the user could not verify or does not trust the other side of the verification. */ - fun declineVerification() + suspend fun declineVerification() /** * Starts the verification of the unverified session from another device. */ - fun startVerification() + suspend fun startVerification() /** * Returns the verification service state to the initial step. */ - fun reset() + suspend fun reset() } /** Verification status of the current session. */ diff --git a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt index 50fbf6f232..dc65bb74a6 100644 --- a/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt +++ b/libraries/matrix/impl/src/main/kotlin/io/element/android/libraries/matrix/impl/verification/RustSessionVerificationService.kt @@ -18,9 +18,9 @@ package io.element.android.libraries.matrix.impl.verification import io.element.android.libraries.core.data.tryOrNull import io.element.android.libraries.matrix.api.verification.SessionVerificationService -import io.element.android.libraries.matrix.api.verification.VerificationFlowState import io.element.android.libraries.matrix.api.verification.SessionVerifiedStatus import io.element.android.libraries.matrix.api.verification.VerificationEmoji +import io.element.android.libraries.matrix.api.verification.VerificationFlowState import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow @@ -52,21 +52,21 @@ class RustSessionVerificationService @Inject constructor() : SessionVerification private val _sessionVerifiedStatus = MutableStateFlow(SessionVerifiedStatus.Unknown) override val sessionVerifiedStatus: StateFlow = _sessionVerifiedStatus.asStateFlow() - override fun requestVerification() = tryOrFail { + override suspend fun requestVerification() = tryOrFail { verificationController?.requestVerification() } - override fun cancelVerification() = tryOrFail { verificationController?.cancelVerification() } + override suspend fun cancelVerification() = tryOrFail { verificationController?.cancelVerification() } - override fun approveVerification() = tryOrFail { verificationController?.approveVerification() } + override suspend fun approveVerification() = tryOrFail { verificationController?.approveVerification() } - override fun declineVerification() = tryOrFail { verificationController?.declineVerification() } + override suspend fun declineVerification() = tryOrFail { verificationController?.declineVerification() } - override fun startVerification() = tryOrFail { + override suspend fun startVerification() = tryOrFail { verificationController?.startSasVerification() } - private fun tryOrFail(block: () -> Unit) { + private suspend fun tryOrFail(block: suspend () -> Unit) { runCatching { block() }.onFailure { didFail() } @@ -107,7 +107,7 @@ class RustSessionVerificationService @Inject constructor() : SessionVerification // end-region - override fun reset() { + override suspend fun reset() { if (isReady.value) { // Cancel any pending verification attempt tryOrNull { verificationController?.cancelVerification() } diff --git a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/verification/FakeSessionVerificationService.kt b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/verification/FakeSessionVerificationService.kt index 4b885cee8c..62e34d0c7c 100644 --- a/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/verification/FakeSessionVerificationService.kt +++ b/libraries/matrix/test/src/main/kotlin/io/element/android/libraries/matrix/test/verification/FakeSessionVerificationService.kt @@ -37,17 +37,17 @@ class FakeSessionVerificationService : SessionVerificationService { override val isReady: StateFlow = _isReady - override fun requestVerification() { + override suspend fun requestVerification() { _verificationFlowState.value = VerificationFlowState.AcceptedVerificationRequest _verificationFlowState.value = VerificationFlowState.StartedSasVerification _verificationFlowState.value = VerificationFlowState.ReceivedVerificationData(emojiList) } - override fun cancelVerification() { + override suspend fun cancelVerification() { _verificationFlowState.value = VerificationFlowState.Canceled } - override fun approveVerification() { + override suspend fun approveVerification() { if (!shouldFail) { _verificationFlowState.value = VerificationFlowState.Finished } else { @@ -55,7 +55,7 @@ class FakeSessionVerificationService : SessionVerificationService { } } - override fun declineVerification() { + override suspend fun declineVerification() { if (!shouldFail) { _verificationFlowState.value = VerificationFlowState.Canceled } else { @@ -63,7 +63,7 @@ class FakeSessionVerificationService : SessionVerificationService { } } - override fun startVerification() { + override suspend fun startVerification() { _verificationFlowState.value = VerificationFlowState.StartedSasVerification _verificationFlowState.value = VerificationFlowState.ReceivedVerificationData(emojiList) }