mirror of
https://github.com/vector-im/element-android.git
synced 2024-11-15 01:35:07 +08:00
Perform .well-known request first, even if the entered URL is a valid homeserver base url
This commit is contained in:
parent
a61917f2b4
commit
8f3db11693
1
changelog.d/2843.bugfix
Normal file
1
changelog.d/2843.bugfix
Normal file
@ -0,0 +1 @@
|
||||
Perform .well-known request first, even if the entered URL is a valid homeserver base url
|
@ -167,36 +167,47 @@ internal class DefaultAuthenticationService @Inject constructor(
|
||||
private suspend fun getLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
val authAPI = buildAuthAPI(homeServerConnectionConfig)
|
||||
|
||||
// First check the homeserver version
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.versions()
|
||||
// First check if there is a well-known file
|
||||
return try {
|
||||
getWellknownLoginFlowInternal(homeServerConnectionConfig)
|
||||
} catch (failure: Throwable) {
|
||||
if (failure is Failure.OtherServerError
|
||||
&& failure.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// 404, no well-known data, try direct access to the API
|
||||
// First check the homeserver version
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.versions()
|
||||
}
|
||||
}
|
||||
.map { versions ->
|
||||
// Ok, it seems that the homeserver url is valid
|
||||
getLoginFlowResult(authAPI, versions, homeServerConnectionConfig.homeServerUriBase.toString())
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
it
|
||||
},
|
||||
{
|
||||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// It's maybe a Riot url?
|
||||
getRiotDomainLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
}
|
||||
)
|
||||
} else {
|
||||
throw failure
|
||||
}
|
||||
}
|
||||
.map { versions ->
|
||||
// Ok, it seems that the homeserver url is valid
|
||||
getLoginFlowResult(authAPI, versions, homeServerConnectionConfig.homeServerUriBase.toString())
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
it
|
||||
},
|
||||
{
|
||||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// It's maybe a Riot url?
|
||||
getRiotDomainLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun getRiotDomainLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
val authAPI = buildAuthAPI(homeServerConnectionConfig)
|
||||
|
||||
val domain = homeServerConnectionConfig.homeServerUriBase.host
|
||||
val domain = homeServerConnectionConfig.homeServerUri.host
|
||||
?: return getRiotLoginFlowInternal(homeServerConnectionConfig)
|
||||
|
||||
// Ok, try to get the config.domain.json file of a RiotWeb client
|
||||
@ -228,28 +239,12 @@ internal class DefaultAuthenticationService @Inject constructor(
|
||||
val authAPI = buildAuthAPI(homeServerConnectionConfig)
|
||||
|
||||
// Ok, try to get the config.json file of a RiotWeb client
|
||||
return runCatching {
|
||||
executeRequest(null) {
|
||||
authAPI.getRiotConfig()
|
||||
}
|
||||
return executeRequest(null) {
|
||||
authAPI.getRiotConfig()
|
||||
}
|
||||
.map { riotConfig ->
|
||||
.let { riotConfig ->
|
||||
onRiotConfigRetrieved(homeServerConnectionConfig, riotConfig)
|
||||
}
|
||||
.fold(
|
||||
{
|
||||
it
|
||||
},
|
||||
{
|
||||
if (it is Failure.OtherServerError
|
||||
&& it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) {
|
||||
// Try with wellknown
|
||||
getWellknownLoginFlowInternal(homeServerConnectionConfig)
|
||||
} else {
|
||||
throw it
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
private suspend fun onRiotConfigRetrieved(homeServerConnectionConfig: HomeServerConnectionConfig, riotConfig: RiotConfig): LoginFlowResult {
|
||||
@ -274,7 +269,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
||||
}
|
||||
|
||||
private suspend fun getWellknownLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult {
|
||||
val domain = homeServerConnectionConfig.homeServerUriBase.host
|
||||
val domain = homeServerConnectionConfig.homeServerUri.host
|
||||
?: throw Failure.OtherServerError("", HttpsURLConnection.HTTP_NOT_FOUND /* 404 */)
|
||||
|
||||
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(domain, homeServerConnectionConfig))
|
||||
@ -283,7 +278,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
||||
is WellknownResult.Prompt -> {
|
||||
val newHomeServerConnectionConfig = homeServerConnectionConfig.copy(
|
||||
homeServerUriBase = Uri.parse(wellknownResult.homeServerUrl),
|
||||
identityServerUri = wellknownResult.identityServerUrl?.let { Uri.parse(it) }
|
||||
identityServerUri = wellknownResult.identityServerUrl?.let { Uri.parse(it) } ?: homeServerConnectionConfig.identityServerUri
|
||||
)
|
||||
|
||||
val newAuthAPI = buildAuthAPI(newHomeServerConnectionConfig)
|
||||
|
Loading…
Reference in New Issue
Block a user