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