From 5c538c78656ba65947b7bde3c906c2aa052d3eeb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 8 Jun 2020 09:11:23 +0200 Subject: [PATCH] Clarify type when retrieving supported login flow (be conform to the spec) --- docs/signin.md | 2 +- .../android/api/auth/data/LoginFlowResult.kt | 4 ++-- .../android/api/auth/registration/Stage.kt | 3 --- .../matrix/android/internal/auth/AuthAPI.kt | 2 +- .../auth/DefaultAuthenticationService.kt | 2 +- .../internal/auth/data/LoginFlowResponse.kt | 16 ++++++++++++++-- .../riotx/features/login/LoginViewModel.kt | 8 ++++---- .../features/signout/soft/SoftLogoutViewModel.kt | 6 +++--- 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/docs/signin.md b/docs/signin.md index 6a52b2d83c..7d3a4f819b 100644 --- a/docs/signin.md +++ b/docs/signin.md @@ -2,7 +2,7 @@ This document describes the flow of signin to a homeserver, and also the flow when user want to reset his password. Examples come from the `matrix.org` homeserver. -## Sign up flows +## Sign in flows ### Get the flow diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt index dd0c93a41c..abc1b83c9f 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/data/LoginFlowResult.kt @@ -18,10 +18,10 @@ package im.vector.matrix.android.api.auth.data import im.vector.matrix.android.internal.auth.data.LoginFlowResponse -// Either a LoginFlowResponse, or an error if the homeserver is outdated +// Either a list of supported login types, or an error if the homeserver is outdated sealed class LoginFlowResult { data class Success( - val loginFlowResponse: LoginFlowResponse, + val supportedLoginTypes: List, val isLoginAndRegistrationSupported: Boolean, val homeServerUrl: String ) : LoginFlowResult() diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/registration/Stage.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/registration/Stage.kt index c3f4864232..ccc5908911 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/registration/Stage.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/api/auth/registration/Stage.kt @@ -21,15 +21,12 @@ sealed class Stage(open val mandatory: Boolean) { // m.login.recaptcha data class ReCaptcha(override val mandatory: Boolean, val publicKey: String) : Stage(mandatory) - // m.login.oauth2 // m.login.email.identity data class Email(override val mandatory: Boolean) : Stage(mandatory) // m.login.msisdn data class Msisdn(override val mandatory: Boolean) : Stage(mandatory) - // m.login.token - // m.login.dummy, can be mandatory if there is no other stages. In this case the account cannot be created by just sending a username // and a password, the dummy stage has to be done data class Dummy(override val mandatory: Boolean) : Stage(mandatory) diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthAPI.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthAPI.kt index 5363e15d6d..cbd6658c44 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthAPI.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/AuthAPI.kt @@ -55,7 +55,7 @@ internal interface AuthAPI { fun versions(): Call /** - * Register to the homeserver + * Register to the homeserver, or get error 401 with a RegistrationFlowResponse object if registration is incomplete * Ref: https://matrix.org/docs/spec/client_server/latest#account-registration-and-management */ @POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "register") diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt index b543fa7507..90d62e619c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/DefaultAuthenticationService.kt @@ -236,7 +236,7 @@ internal class DefaultAuthenticationService @Inject constructor( val loginFlowResponse = executeRequest(null) { apiCall = authAPI.getLoginFlows() } - LoginFlowResult.Success(loginFlowResponse, versions.isLoginAndRegistrationSupportedBySdk(), homeServerUrl) + LoginFlowResult.Success(loginFlowResponse.flows.orEmpty().mapNotNull { it.type }, versions.isLoginAndRegistrationSupportedBySdk(), homeServerUrl) } else { // Not supported LoginFlowResult.OutdatedHomeserver diff --git a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/data/LoginFlowResponse.kt b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/data/LoginFlowResponse.kt index 598506d0a7..ca57a3aa0c 100644 --- a/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/data/LoginFlowResponse.kt +++ b/matrix-sdk-android/src/main/java/im/vector/matrix/android/internal/auth/data/LoginFlowResponse.kt @@ -20,7 +20,19 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -data class LoginFlowResponse( +internal data class LoginFlowResponse( + /** + * The homeserver's supported login types + */ @Json(name = "flows") - val flows: List + val flows: List? +) + +@JsonClass(generateAdapter = true) +internal data class LoginFlow( + /** + * The login type. This is supplied as the type when logging in. + */ + @Json(name = "type") + val type: String? ) diff --git a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt index 12dfd06b37..3530733ace 100644 --- a/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/login/LoginViewModel.kt @@ -671,9 +671,9 @@ class LoginViewModel @AssistedInject constructor( is LoginFlowResult.Success -> { val loginMode = when { // SSO login is taken first - data.loginFlowResponse.flows.any { it.type == LoginFlowTypes.SSO } -> LoginMode.Sso - data.loginFlowResponse.flows.any { it.type == LoginFlowTypes.PASSWORD } -> LoginMode.Password - else -> LoginMode.Unsupported + data.supportedLoginTypes.contains(LoginFlowTypes.SSO) -> LoginMode.Sso + data.supportedLoginTypes.contains(LoginFlowTypes.PASSWORD) -> LoginMode.Password + else -> LoginMode.Unsupported } if (loginMode == LoginMode.Password && !data.isLoginAndRegistrationSupported) { @@ -684,7 +684,7 @@ class LoginViewModel @AssistedInject constructor( asyncHomeServerLoginFlowRequest = Uninitialized, homeServerUrl = data.homeServerUrl, loginMode = loginMode, - loginModeSupportedTypes = data.loginFlowResponse.flows.mapNotNull { it.type }.toList() + loginModeSupportedTypes = data.supportedLoginTypes.toList() ) } } diff --git a/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutViewModel.kt b/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutViewModel.kt index e2fe17b461..c4d776e158 100644 --- a/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutViewModel.kt +++ b/vector/src/main/java/im/vector/riotx/features/signout/soft/SoftLogoutViewModel.kt @@ -105,9 +105,9 @@ class SoftLogoutViewModel @AssistedInject constructor( is LoginFlowResult.Success -> { val loginMode = when { // SSO login is taken first - data.loginFlowResponse.flows.any { it.type == LoginFlowTypes.SSO } -> LoginMode.Sso - data.loginFlowResponse.flows.any { it.type == LoginFlowTypes.PASSWORD } -> LoginMode.Password - else -> LoginMode.Unsupported + data.supportedLoginTypes.contains(LoginFlowTypes.SSO) -> LoginMode.Sso + data.supportedLoginTypes.contains(LoginFlowTypes.PASSWORD) -> LoginMode.Password + else -> LoginMode.Unsupported } if (loginMode == LoginMode.Password && !data.isLoginAndRegistrationSupported) {