From 3821acffab288c90457c693286dc40cfda6546d6 Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Thu, 11 Jan 2024 16:08:59 +0200
Subject: [PATCH] Fix bad request on login

---
 .../auth/feature/log_in/LoginDataSource.kt    | 43 +++++++++----------
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt
index f5ab8093f..02f3ad988 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/log_in/LoginDataSource.kt
@@ -12,7 +12,6 @@ import org.futo.circles.auth.feature.log_in.stages.LoginStagesDataSource
 import org.futo.circles.core.extensions.createResult
 import org.futo.circles.core.provider.MatrixInstanceProvider
 import org.futo.circles.core.utils.HomeServerUtils.buildHomeServerConfigFromDomain
-import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
 import org.matrix.android.sdk.api.auth.registration.Stage
 import javax.inject.Inject
 
@@ -28,38 +27,36 @@ class LoginDataSource @Inject constructor(
         domain: String
     ) = createResult {
         authService.cancelPendingLoginOrRegistration()
-        val homeServerConfig = buildHomeServerConfigFromDomain(domain)
-        authService.initiateAuth(homeServerConfig)
-        val stages = prepareLoginStages(homeServerConfig, userName, domain)
+        val stages = prepareLoginStages(userName, domain)
         loginStagesDataSource.startLoginStages(stages, userName, domain)
     }
 
     private suspend fun prepareLoginStages(
-        homeServerConfig: HomeServerConnectionConfig,
         userName: String,
         domain: String
     ): List<Stage> {
+        val homeServerConfig = buildHomeServerConfigFromDomain(domain)
+        val supportedLoginMethods = authService.getLoginFlow(homeServerConfig).supportedLoginTypes
+
+        return if (supportedLoginMethods.isEmpty()) {
+            getCircleLoginStages(userName, domain)
+        } else if (isPasswordLogin(supportedLoginMethods)) {
+            listOf(Stage.Other(true, DIRECT_LOGIN_PASSWORD_TYPE, null))
+        } else {
+            throw IllegalArgumentException(context.getString(R.string.unsupported_login_method))
+        }
+    }
+
+    private fun isPasswordLogin(methods: List<String>) = methods.contains(LOGIN_PASSWORD_TYPE)
+
+    private suspend fun getCircleLoginStages(userName: String, domain: String): List<Stage> {
         val identifierParams = mapOf(
             USER_PARAM_KEY to "@$userName:$domain",
             TYPE_PARAM_KEY to LOGIN_PASSWORD_USER_ID_TYPE
         )
-        val flows =
-            authService.getLoginWizard()
-                .getAllLoginFlows(identifierParams, context.getString(R.string.initial_device_name))
-        val stages = if (flows.isEmpty()) {
-            val supportedLoginMethods = try {
-                authService.getLoginFlow(homeServerConfig).supportedLoginTypes
-            } catch (e: Throwable) {
-                throw IllegalArgumentException(context.getString(R.string.not_found_login_flow_for_user))
-            }
-            if (supportedLoginMethods.contains(LOGIN_PASSWORD_TYPE))
-                listOf(Stage.Other(true, DIRECT_LOGIN_PASSWORD_TYPE, null))
-            else
-                throw IllegalArgumentException(context.getString(R.string.unsupported_login_method))
-        } else {
-            flows.firstOrNull()
-                ?: throw IllegalArgumentException(context.getString(R.string.unsupported_login_method))
-        }
-        return stages
+        val flows = authService.getLoginWizard()
+            .getAllLoginFlows(identifierParams, context.getString(R.string.initial_device_name))
+        return flows.firstOrNull()
+            ?: throw IllegalArgumentException(context.getString(R.string.unsupported_login_method))
     }
 }
\ No newline at end of file
-- 
GitLab