From 708431effe6a770cde4b044396daa1bc1ad9fab7 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Thu, 29 Feb 2024 14:17:26 +0200
Subject: [PATCH] Add isVerifyStages for bsspeke

---
 .../circles/auth/feature/uia/UIADataSource.kt   |  6 ++++++
 .../stages/password/BsSpekeStageDataSource.kt   | 17 +++++++++--------
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt
index 741c1161a..83bf5a80c 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/UIADataSource.kt
@@ -9,6 +9,7 @@ import org.futo.circles.auth.model.UIANavigationEvent
 import org.futo.circles.core.base.SingleEventLiveData
 import org.futo.circles.core.extensions.Response
 import org.matrix.android.sdk.api.auth.UIABaseAuth
+import org.matrix.android.sdk.api.auth.data.LoginFlowTypes
 import org.matrix.android.sdk.api.auth.registration.RegistrationFlowResponse
 import org.matrix.android.sdk.api.auth.registration.RegistrationResult
 import org.matrix.android.sdk.api.auth.registration.Stage
@@ -89,6 +90,11 @@ abstract class UIADataSource {
         } ?: navigateToNextStage()
     }
 
+    fun getCurrentStageKey() = when (currentStage) {
+        is Stage.Other -> (currentStage as Stage.Other).type
+        else -> LoginFlowTypes.TERMS
+    }
+
     private fun isStageRetry(result: RegistrationResult?): Boolean {
         val nextStageType =
             ((result as? RegistrationResult.FlowResponse)?.flowResult?.missingStages?.firstOrNull() as? Stage.Other)?.type
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/BsSpekeStageDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/BsSpekeStageDataSource.kt
index 1c710998a..fb2a8b928 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/BsSpekeStageDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/uia/stages/password/BsSpekeStageDataSource.kt
@@ -6,13 +6,12 @@ import dagger.hilt.android.qualifiers.ApplicationContext
 import org.futo.circles.auth.R
 import org.futo.circles.auth.bsspeke.BSSpekeClient
 import org.futo.circles.auth.bsspeke.BSSpekeClientProvider
-import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_BSSPEKE_OPRF_TYPE
-import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_BSSPEKE_VERIFY_TYPE
 import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_BSSPEKE_OPRF_TYPE
 import org.futo.circles.auth.feature.uia.UIADataSource.Companion.ENROLL_BSSPEKE_SAVE_TYPE
+import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_BSSPEKE_OPRF_TYPE
+import org.futo.circles.auth.feature.uia.UIADataSource.Companion.LOGIN_BSSPEKE_VERIFY_TYPE
 import org.futo.circles.auth.feature.uia.UIADataSource.Companion.TYPE_PARAM_KEY
 import org.futo.circles.auth.feature.uia.UIADataSourceProvider
-import org.futo.circles.auth.model.UIAFlowType
 import org.futo.circles.core.extensions.Response
 import org.matrix.android.sdk.api.auth.registration.RegistrationResult
 import org.matrix.android.sdk.api.auth.registration.Stage
@@ -24,7 +23,11 @@ class BsSpekeStageDataSource @Inject constructor(
 
     private val uiaDataSource = UIADataSourceProvider.getDataSourceOrThrow()
 
+    private var isVerifyStages = true
+
     suspend fun processPasswordStage(password: String): Response<Unit> {
+        val currentStageKey = uiaDataSource.getCurrentStageKey()
+        isVerifyStages = currentStageKey == LOGIN_BSSPEKE_OPRF_TYPE || currentStageKey== LOGIN_BSSPEKE_VERIFY_TYPE
         BSSpekeClientProvider.initClient(uiaDataSource.userName, uiaDataSource.domain, password)
         val bsSpekeClient = BSSpekeClientProvider.getClientOrThrow()
         return when (val oprfResult = performOprfStage(bsSpekeClient)) {
@@ -36,10 +39,8 @@ class BsSpekeStageDataSource @Inject constructor(
         }
     }
 
-    private fun isLoginMode() = UIADataSourceProvider.activeFlowType == UIAFlowType.Login
-
-    private fun getOprfTypeKey() =
-        if (isLoginMode()) LOGIN_BSSPEKE_OPRF_TYPE else ENROLL_BSSPEKE_OPRF_TYPE
+    private fun getOprfTypeKey() = if (isVerifyStages) LOGIN_BSSPEKE_OPRF_TYPE
+    else ENROLL_BSSPEKE_OPRF_TYPE
 
     private suspend fun performOprfStage(
         bsSpekeClient: BSSpekeClient
@@ -66,7 +67,7 @@ class BsSpekeStageDataSource @Inject constructor(
             return Response.Error(e.message ?: "")
         }
         return when (val result =
-            if (isLoginMode()) performVerifyStage(
+            if (isVerifyStages) performVerifyStage(
                 oprfResult, bsSpekeClient, password, blocks, iterations
             )
             else performSaveStage(
-- 
GitLab