RawService.getWellknown() now takes a domain instead of a matrixId as parameter
This commit is contained in:
parent
edd24de4c3
commit
984b1dd6a8
|
@ -38,6 +38,7 @@
|
|||
<w>unpublish</w>
|
||||
<w>unwedging</w>
|
||||
<w>vctr</w>
|
||||
<w>wellknown</w>
|
||||
</words>
|
||||
</dictionary>
|
||||
</component>
|
|
@ -0,0 +1 @@
|
|||
RawService.getWellknown() now takes a domain instead of a matrixId as parameter
|
|
@ -22,11 +22,6 @@ import org.matrix.android.sdk.api.auth.data.WellKnown
|
|||
* Ref: https://matrix.org/docs/spec/client_server/latest#well-known-uri
|
||||
*/
|
||||
sealed class WellknownResult {
|
||||
/**
|
||||
* The provided matrixId is no valid. Unable to extract a domain name.
|
||||
*/
|
||||
object InvalidMatrixId : WellknownResult()
|
||||
|
||||
/**
|
||||
* Retrieve the specific piece of information from the user in a way which fits within the existing client user experience,
|
||||
* if the client is inclined to do so. Failure can take place instead if no good user experience for this is possible at this point.
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* Copyright (c) 2021 The Matrix.org Foundation C.I.C.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.matrix.android.sdk.api.failure
|
||||
|
||||
sealed class MatrixIdFailure : Failure.FeatureFailure() {
|
||||
object InvalidMatrixId : MatrixIdFailure()
|
||||
}
|
|
@ -29,8 +29,10 @@ interface RawService {
|
|||
|
||||
/**
|
||||
* Specific case for the well-known file. Cache validity is 8 hours
|
||||
* @param domain the domain to get the .well-known file, for instance "matrix.org".
|
||||
* The URL will be "https://{domain}/.well-known/matrix/client"
|
||||
*/
|
||||
suspend fun getWellknown(userId: String): String
|
||||
suspend fun getWellknown(domain: String): String
|
||||
|
||||
/**
|
||||
* Clear all the cache data
|
||||
|
|
|
@ -19,6 +19,7 @@ package org.matrix.android.sdk.internal.auth
|
|||
import android.net.Uri
|
||||
import dagger.Lazy
|
||||
import okhttp3.OkHttpClient
|
||||
import org.matrix.android.sdk.api.MatrixPatterns
|
||||
import org.matrix.android.sdk.api.auth.AuthenticationService
|
||||
import org.matrix.android.sdk.api.auth.data.Credentials
|
||||
import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig
|
||||
|
@ -28,6 +29,7 @@ import org.matrix.android.sdk.api.auth.login.LoginWizard
|
|||
import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
|
||||
import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
|
||||
import org.matrix.android.sdk.api.failure.Failure
|
||||
import org.matrix.android.sdk.api.failure.MatrixIdFailure
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import org.matrix.android.sdk.api.util.appendParamToUrl
|
||||
import org.matrix.android.sdk.internal.SessionManager
|
||||
|
@ -275,9 +277,7 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
val domain = homeServerConnectionConfig.homeServerUri.host
|
||||
?: throw Failure.OtherServerError("", HttpsURLConnection.HTTP_NOT_FOUND /* 404 */)
|
||||
|
||||
// Create a fake userId, for the getWellknown task
|
||||
val fakeUserId = "@alice:$domain"
|
||||
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(fakeUserId, homeServerConnectionConfig))
|
||||
val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(domain, homeServerConnectionConfig))
|
||||
|
||||
return when (wellknownResult) {
|
||||
is WellknownResult.Prompt -> {
|
||||
|
@ -379,7 +379,14 @@ internal class DefaultAuthenticationService @Inject constructor(
|
|||
|
||||
override suspend fun getWellKnownData(matrixId: String,
|
||||
homeServerConnectionConfig: HomeServerConnectionConfig?): WellknownResult {
|
||||
return getWellknownTask.execute(GetWellknownTask.Params(matrixId, homeServerConnectionConfig))
|
||||
if (!MatrixPatterns.isUserId(matrixId)) {
|
||||
throw MatrixIdFailure.InvalidMatrixId
|
||||
}
|
||||
|
||||
return getWellknownTask.execute(GetWellknownTask.Params(
|
||||
domain = matrixId.substringAfter(":"),
|
||||
homeServerConnectionConfig = homeServerConnectionConfig)
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun directAuthentication(homeServerConnectionConfig: HomeServerConnectionConfig,
|
||||
|
|
|
@ -29,10 +29,9 @@ internal class DefaultRawService @Inject constructor(
|
|||
return getUrlTask.execute(GetUrlTask.Params(url, cacheStrategy))
|
||||
}
|
||||
|
||||
override suspend fun getWellknown(userId: String): String {
|
||||
val homeServerDomain = userId.substringAfter(":")
|
||||
override suspend fun getWellknown(domain: String): String {
|
||||
return getUrl(
|
||||
"https://$homeServerDomain/.well-known/matrix/client",
|
||||
"https://$domain/.well-known/matrix/client",
|
||||
CacheStrategy.TtlCache(TimeUnit.HOURS.toMillis(8), false)
|
||||
)
|
||||
}
|
||||
|
|
|
@ -89,7 +89,10 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor(
|
|||
}.getOrNull()
|
||||
|
||||
val wellknownResult = runCatching {
|
||||
getWellknownTask.execute(GetWellknownTask.Params(userId, homeServerConnectionConfig))
|
||||
getWellknownTask.execute(GetWellknownTask.Params(
|
||||
domain = userId.substringAfter(":"),
|
||||
homeServerConnectionConfig = homeServerConnectionConfig
|
||||
))
|
||||
}.getOrNull()
|
||||
|
||||
insertInDb(capabilities, mediaConfig, versions, wellknownResult)
|
||||
|
|
|
@ -39,7 +39,11 @@ import javax.net.ssl.HttpsURLConnection
|
|||
|
||||
internal interface GetWellknownTask : Task<GetWellknownTask.Params, WellknownResult> {
|
||||
data class Params(
|
||||
val matrixId: String,
|
||||
/**
|
||||
* domain, for instance "matrix.org"
|
||||
* the URL will be https://{domain}/.well-known/matrix/client
|
||||
*/
|
||||
val domain: String,
|
||||
val homeServerConnectionConfig: HomeServerConnectionConfig?
|
||||
)
|
||||
}
|
||||
|
@ -54,14 +58,8 @@ internal class DefaultGetWellknownTask @Inject constructor(
|
|||
) : GetWellknownTask {
|
||||
|
||||
override suspend fun execute(params: GetWellknownTask.Params): WellknownResult {
|
||||
if (!MatrixPatterns.isUserId(params.matrixId)) {
|
||||
return WellknownResult.InvalidMatrixId
|
||||
}
|
||||
|
||||
val homeServerDomain = params.matrixId.substringAfter(":")
|
||||
|
||||
val client = buildClient(params.homeServerConnectionConfig)
|
||||
return findClientConfig(homeServerDomain, client)
|
||||
return findClientConfig(params.domain, client)
|
||||
}
|
||||
|
||||
private fun buildClient(homeServerConnectionConfig: HomeServerConnectionConfig?): OkHttpClient {
|
||||
|
|
|
@ -21,6 +21,7 @@ import im.vector.app.core.resources.StringProvider
|
|||
import im.vector.app.features.call.dialpad.DialPadLookup
|
||||
import org.matrix.android.sdk.api.failure.Failure
|
||||
import org.matrix.android.sdk.api.failure.MatrixError
|
||||
import org.matrix.android.sdk.api.failure.MatrixIdFailure
|
||||
import org.matrix.android.sdk.api.failure.isInvalidPassword
|
||||
import org.matrix.android.sdk.api.session.identity.IdentityServiceError
|
||||
import java.net.HttpURLConnection
|
||||
|
@ -39,9 +40,9 @@ class DefaultErrorFormatter @Inject constructor(
|
|||
|
||||
override fun toHumanReadable(throwable: Throwable?): String {
|
||||
return when (throwable) {
|
||||
null -> null
|
||||
is IdentityServiceError -> identityServerError(throwable)
|
||||
is Failure.NetworkConnection -> {
|
||||
null -> null
|
||||
is IdentityServiceError -> identityServerError(throwable)
|
||||
is Failure.NetworkConnection -> {
|
||||
when (throwable.ioException) {
|
||||
is SocketTimeoutException ->
|
||||
stringProvider.getString(R.string.error_network_timeout)
|
||||
|
@ -54,7 +55,7 @@ class DefaultErrorFormatter @Inject constructor(
|
|||
stringProvider.getString(R.string.error_no_network)
|
||||
}
|
||||
}
|
||||
is Failure.ServerError -> {
|
||||
is Failure.ServerError -> {
|
||||
when {
|
||||
throwable.error.code == MatrixError.M_CONSENT_NOT_GIVEN -> {
|
||||
// Special case for terms and conditions
|
||||
|
@ -104,23 +105,25 @@ class DefaultErrorFormatter @Inject constructor(
|
|||
}
|
||||
}
|
||||
}
|
||||
is Failure.OtherServerError -> {
|
||||
is Failure.OtherServerError -> {
|
||||
when (throwable.httpCode) {
|
||||
HttpURLConnection.HTTP_NOT_FOUND ->
|
||||
HttpURLConnection.HTTP_NOT_FOUND ->
|
||||
// homeserver not found
|
||||
stringProvider.getString(R.string.login_error_no_homeserver_found)
|
||||
HttpURLConnection.HTTP_UNAUTHORIZED ->
|
||||
// uia errors?
|
||||
stringProvider.getString(R.string.error_unauthorized)
|
||||
else ->
|
||||
else ->
|
||||
throwable.localizedMessage
|
||||
}
|
||||
}
|
||||
is DialPadLookup.Failure.NumberIsYours ->
|
||||
is DialPadLookup.Failure.NumberIsYours ->
|
||||
stringProvider.getString(R.string.cannot_call_yourself)
|
||||
is DialPadLookup.Failure.NoResult ->
|
||||
is DialPadLookup.Failure.NoResult ->
|
||||
stringProvider.getString(R.string.call_dial_pad_lookup_error)
|
||||
else -> throwable.localizedMessage
|
||||
is MatrixIdFailure.InvalidMatrixId ->
|
||||
stringProvider.getString(R.string.login_signin_matrix_id_error_invalid_matrix_id)
|
||||
else -> throwable.localizedMessage
|
||||
}
|
||||
?: stringProvider.getString(R.string.unknown_error)
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@ import org.matrix.android.sdk.api.auth.registration.RegistrationWizard
|
|||
import org.matrix.android.sdk.api.auth.registration.Stage
|
||||
import org.matrix.android.sdk.api.auth.wellknown.WellknownResult
|
||||
import org.matrix.android.sdk.api.failure.Failure
|
||||
import org.matrix.android.sdk.api.failure.MatrixIdFailure
|
||||
import org.matrix.android.sdk.api.session.Session
|
||||
import timber.log.Timber
|
||||
import java.util.concurrent.CancellationException
|
||||
|
@ -569,14 +570,6 @@ class LoginViewModel @AssistedInject constructor(
|
|||
} else {
|
||||
onWellKnownError()
|
||||
}
|
||||
is WellknownResult.InvalidMatrixId -> {
|
||||
setState {
|
||||
copy(
|
||||
asyncLoginAction = Uninitialized
|
||||
)
|
||||
}
|
||||
_viewEvents.post(LoginViewEvents.Failure(Exception(stringProvider.getString(R.string.login_signin_matrix_id_error_invalid_matrix_id))))
|
||||
}
|
||||
else -> {
|
||||
onWellKnownError()
|
||||
}
|
||||
|
@ -620,19 +613,23 @@ class LoginViewModel @AssistedInject constructor(
|
|||
}
|
||||
|
||||
private fun onDirectLoginError(failure: Throwable) {
|
||||
if (failure is Failure.UnrecognizedCertificateFailure) {
|
||||
// Display this error in a dialog
|
||||
_viewEvents.post(LoginViewEvents.Failure(failure))
|
||||
setState {
|
||||
copy(
|
||||
asyncLoginAction = Uninitialized
|
||||
)
|
||||
when (failure) {
|
||||
is MatrixIdFailure.InvalidMatrixId,
|
||||
is Failure.UnrecognizedCertificateFailure -> {
|
||||
// Display this error in a dialog
|
||||
_viewEvents.post(LoginViewEvents.Failure(failure))
|
||||
setState {
|
||||
copy(
|
||||
asyncLoginAction = Uninitialized
|
||||
)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
setState {
|
||||
copy(
|
||||
asyncLoginAction = Fail(failure)
|
||||
)
|
||||
else -> {
|
||||
setState {
|
||||
copy(
|
||||
asyncLoginAction = Fail(failure)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -595,10 +595,6 @@ class LoginViewModel2 @AssistedInject constructor(
|
|||
} else {
|
||||
onWellKnownError()
|
||||
}
|
||||
is WellknownResult.InvalidMatrixId -> {
|
||||
setState { copy(isLoading = false) }
|
||||
_viewEvents.post(LoginViewEvents2.Failure(Exception(stringProvider.getString(R.string.login_signin_matrix_id_error_invalid_matrix_id))))
|
||||
}
|
||||
else -> {
|
||||
onWellKnownError()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue