Fix issue of QR not being offered where domain is entered instead of homeserver

This commit is contained in:
Hugh Nimmo-Smith 2022-12-07 15:15:18 +00:00
parent c523e144b8
commit 1930047ce1
6 changed files with 13 additions and 28 deletions

View File

@ -125,12 +125,6 @@ interface AuthenticationService {
deviceId: String? = null deviceId: String? = null
): Session ): Session
/**
* @param homeServerConnectionConfig the information about the homeserver and other configuration
* Return true if qr code login is supported by the server, false otherwise.
*/
suspend fun isQrLoginSupported(homeServerConnectionConfig: HomeServerConnectionConfig): Boolean
/** /**
* Authenticate using m.login.token method during sign in with QR code. * Authenticate using m.login.token method during sign in with QR code.
* @param homeServerConnectionConfig the information about the homeserver and other configuration * @param homeServerConnectionConfig the information about the homeserver and other configuration

View File

@ -22,5 +22,6 @@ data class LoginFlowResult(
val isLoginAndRegistrationSupported: Boolean, val isLoginAndRegistrationSupported: Boolean,
val homeServerUrl: String, val homeServerUrl: String,
val isOutdatedHomeserver: Boolean, val isOutdatedHomeserver: Boolean,
val isLogoutDevicesSupported: Boolean val isLogoutDevicesSupported: Boolean,
val isLoginWithQrSupported: Boolean,
) )

View File

@ -299,7 +299,8 @@ internal class DefaultAuthenticationService @Inject constructor(
isLoginAndRegistrationSupported = versions.isLoginAndRegistrationSupportedBySdk(), isLoginAndRegistrationSupported = versions.isLoginAndRegistrationSupportedBySdk(),
homeServerUrl = homeServerUrl, homeServerUrl = homeServerUrl,
isOutdatedHomeserver = !versions.isSupportedBySdk(), isOutdatedHomeserver = !versions.isSupportedBySdk(),
isLogoutDevicesSupported = versions.doesServerSupportLogoutDevices() isLogoutDevicesSupported = versions.doesServerSupportLogoutDevices(),
isLoginWithQrSupported = versions.doesServerSupportQrCodeLogin(),
) )
} }
@ -408,20 +409,6 @@ internal class DefaultAuthenticationService @Inject constructor(
) )
} }
override suspend fun isQrLoginSupported(homeServerConnectionConfig: HomeServerConnectionConfig): Boolean {
val authAPI = buildAuthAPI(homeServerConnectionConfig)
val versions = runCatching {
executeRequest(null) {
authAPI.versions()
}
}
return if (versions.isSuccess) {
versions.getOrNull()?.doesServerSupportQrCodeLogin().orFalse()
} else {
false
}
}
override suspend fun loginUsingQrLoginToken( override suspend fun loginUsingQrLoginToken(
homeServerConnectionConfig: HomeServerConnectionConfig, homeServerConnectionConfig: HomeServerConnectionConfig,
loginToken: String, loginToken: String,

View File

@ -118,7 +118,7 @@ class OnboardingViewModel @AssistedInject constructor(
} }
} }
private suspend fun checkQrCodeLoginCapability(config: HomeServerConnectionConfig) { private fun checkQrCodeLoginCapability() {
if (!vectorFeatures.isQrCodeLoginEnabled()) { if (!vectorFeatures.isQrCodeLoginEnabled()) {
setState { setState {
copy( copy(
@ -133,11 +133,9 @@ class OnboardingViewModel @AssistedInject constructor(
) )
} }
} else { } else {
// check if selected server supports MSC3882 first
val canLoginWithQrCode = authenticationService.isQrLoginSupported(config)
setState { setState {
copy( copy(
canLoginWithQrCode = canLoginWithQrCode canLoginWithQrCode = selectedHomeserver.isLoginWithQrSupported
) )
} }
} }
@ -705,7 +703,10 @@ class OnboardingViewModel @AssistedInject constructor(
// This is invalid // This is invalid
_viewEvents.post(OnboardingViewEvents.Failure(Throwable("Unable to create a HomeServerConnectionConfig"))) _viewEvents.post(OnboardingViewEvents.Failure(Throwable("Unable to create a HomeServerConnectionConfig")))
} else { } else {
startAuthenticationFlow(action, homeServerConnectionConfig, serverTypeOverride, postAction) startAuthenticationFlow(action, homeServerConnectionConfig, serverTypeOverride, suspend {
checkQrCodeLoginCapability()
postAction()
})
} }
} }

View File

@ -76,6 +76,7 @@ data class SelectedHomeserverState(
val preferredLoginMode: LoginMode = LoginMode.Unknown, val preferredLoginMode: LoginMode = LoginMode.Unknown,
val supportedLoginTypes: List<String> = emptyList(), val supportedLoginTypes: List<String> = emptyList(),
val isLogoutDevicesSupported: Boolean = false, val isLogoutDevicesSupported: Boolean = false,
val isLoginWithQrSupported: Boolean = false,
) : Parcelable ) : Parcelable
@Parcelize @Parcelize

View File

@ -47,7 +47,8 @@ class StartAuthenticationFlowUseCase @Inject constructor(
upstreamUrl = authFlow.homeServerUrl, upstreamUrl = authFlow.homeServerUrl,
preferredLoginMode = preferredLoginMode, preferredLoginMode = preferredLoginMode,
supportedLoginTypes = authFlow.supportedLoginTypes, supportedLoginTypes = authFlow.supportedLoginTypes,
isLogoutDevicesSupported = authFlow.isLogoutDevicesSupported isLogoutDevicesSupported = authFlow.isLogoutDevicesSupported,
isLoginWithQrSupported = authFlow.isLoginWithQrSupported,
) )
private fun LoginFlowResult.findPreferredLoginMode() = when { private fun LoginFlowResult.findPreferredLoginMode() = when {