From 984b1dd6a8cd3a2d58d15ec83053ce1635a848bf Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Tue, 29 Jun 2021 18:08:02 +0200 Subject: [PATCH 01/12] RawService.getWellknown() now takes a domain instead of a matrixId as parameter --- .idea/dictionaries/bmarty.xml | 1 + changelog.d/3572.misc | 1 + .../sdk/api/auth/wellknown/WellknownResult.kt | 5 --- .../sdk/api/failure/MatrixIdFailure.kt | 21 +++++++++++ .../matrix/android/sdk/api/raw/RawService.kt | 4 +- .../auth/DefaultAuthenticationService.kt | 15 ++++++-- .../sdk/internal/raw/DefaultRawService.kt | 5 +-- .../GetHomeServerCapabilitiesTask.kt | 5 ++- .../internal/wellknown/GetWellknownTask.kt | 14 +++---- .../vector/app/core/error/ErrorFormatter.kt | 23 +++++++----- .../app/features/login/LoginViewModel.kt | 37 +++++++++---------- .../app/features/login2/LoginViewModel2.kt | 4 -- 12 files changed, 79 insertions(+), 56 deletions(-) create mode 100644 changelog.d/3572.misc create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt diff --git a/.idea/dictionaries/bmarty.xml b/.idea/dictionaries/bmarty.xml index 8299f1c4de..e143720aa9 100644 --- a/.idea/dictionaries/bmarty.xml +++ b/.idea/dictionaries/bmarty.xml @@ -38,6 +38,7 @@ unpublish unwedging vctr + wellknown \ No newline at end of file diff --git a/changelog.d/3572.misc b/changelog.d/3572.misc new file mode 100644 index 0000000000..384b8e69c7 --- /dev/null +++ b/changelog.d/3572.misc @@ -0,0 +1 @@ +RawService.getWellknown() now takes a domain instead of a matrixId as parameter \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt index c68a9e9699..56257db79c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/wellknown/WellknownResult.kt @@ -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. diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt new file mode 100644 index 0000000000..8f7bca803d --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/failure/MatrixIdFailure.kt @@ -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() +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt index f1722b2189..3366d040f7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/raw/RawService.kt @@ -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 diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt index 20ce438d8e..7077453aae 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt @@ -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, diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/raw/DefaultRawService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/raw/DefaultRawService.kt index 42b826de16..bca1e498de 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/raw/DefaultRawService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/raw/DefaultRawService.kt @@ -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) ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt index 740370123f..7b9a304c96 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt @@ -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) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt index 7a9beac8c0..0cdb6c999b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt @@ -39,7 +39,11 @@ import javax.net.ssl.HttpsURLConnection internal interface GetWellknownTask : Task { 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 { diff --git a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt index c0219b26e2..e7602e5cfe 100644 --- a/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt +++ b/vector/src/main/java/im/vector/app/core/error/ErrorFormatter.kt @@ -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) } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index ce68ff4f38..c9b571dca1 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -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) + ) + } } } } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt index 2e457551dc..110e4f7fe4 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt @@ -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() } From 0f25e2986f03c02c53b223eb91245bef2d4d1bf8 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 09:27:11 +0200 Subject: [PATCH 02/12] fun RawService.getElementWellknown() now takes a SessionParams for parameter to be able to use something else than the userId's domain --- .../im/vector/app/features/call/conference/JitsiService.kt | 2 +- .../app/features/createdirect/CreateDirectRoomViewModel.kt | 2 +- .../vector/app/features/createdirect/DirectRoomHelper.kt | 2 +- .../features/homeserver/HomeServerCapabilitiesViewModel.kt | 2 +- .../app/features/raw/wellknown/ElementWellKnownExt.kt | 7 +++++-- .../roomdirectory/createroom/CreateRoomViewModel.kt | 2 +- .../settings/VectorSettingsSecurityPrivacyFragment.kt | 2 +- .../app/features/spaces/create/CreateSpaceViewModelTask.kt | 2 +- .../app/features/spaces/people/SpacePeopleViewModel.kt | 2 +- 9 files changed, 13 insertions(+), 10 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt index c9fb8fbccd..7b01824c6c 100644 --- a/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt +++ b/vector/src/main/java/im/vector/app/features/call/conference/JitsiService.kt @@ -56,7 +56,7 @@ class JitsiService @Inject constructor( // Build data for a jitsi widget val widgetId: String = WidgetType.Jitsi.preferred + "_" + session.myUserId + "_" + System.currentTimeMillis() val preferredJitsiDomain = tryOrNull { - rawService.getElementWellknown(session.myUserId) + rawService.getElementWellknown(session.sessionParams) ?.jitsiServer ?.preferredDomain } diff --git a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt index 2f0b6e5ec9..88e8d68155 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/CreateDirectRoomViewModel.kt @@ -86,7 +86,7 @@ class CreateDirectRoomViewModel @AssistedInject constructor(@Assisted setState { copy(createAndInviteState = Loading()) } viewModelScope.launch(Dispatchers.IO) { - val adminE2EByDefault = rawService.getElementWellknown(session.myUserId) + val adminE2EByDefault = rawService.getElementWellknown(session.sessionParams) ?.isE2EByDefault() ?: true diff --git a/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt b/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt index bfa56cfb9e..cf75bdf1b6 100644 --- a/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt +++ b/vector/src/main/java/im/vector/app/features/createdirect/DirectRoomHelper.kt @@ -35,7 +35,7 @@ class DirectRoomHelper @Inject constructor( if (existingRoomId != null) { roomId = existingRoomId } else { - val adminE2EByDefault = rawService.getElementWellknown(session.myUserId) + val adminE2EByDefault = rawService.getElementWellknown(session.sessionParams) ?.isE2EByDefault() ?: true diff --git a/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt b/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt index 05fd825558..083b843b33 100644 --- a/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/homeserver/HomeServerCapabilitiesViewModel.kt @@ -70,7 +70,7 @@ class HomeServerCapabilitiesViewModel @AssistedInject constructor( private fun initAdminE2eByDefault() { viewModelScope.launch(Dispatchers.IO) { val adminE2EByDefault = tryOrNull { - rawService.getElementWellknown(session.myUserId) + rawService.getElementWellknown(session.sessionParams) ?.isE2EByDefault() ?: true } ?: true diff --git a/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt b/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt index c1118e40cb..a6959ff116 100644 --- a/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt +++ b/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt @@ -16,11 +16,14 @@ package im.vector.app.features.raw.wellknown +import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService -suspend fun RawService.getElementWellknown(userId: String): ElementWellKnown? { - return tryOrNull { getWellknown(userId) } +suspend fun RawService.getElementWellknown(sessionParams: SessionParams): ElementWellKnown? { + // By default we use the domain of the userId to retrieve the .well-known data + val domain = sessionParams.userId.substringAfter(":") + return tryOrNull { getWellknown(domain) } ?.let { ElementWellKnownMapper.from(it) } } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index 8c8d17dd46..bd7e176247 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -72,7 +72,7 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted private val init private fun initAdminE2eByDefault() { viewModelScope.launch(Dispatchers.IO) { adminE2EByDefault = tryOrNull { - rawService.getElementWellknown(session.myUserId) + rawService.getElementWellknown(session.sessionParams) ?.isE2EByDefault() ?: true } ?: true diff --git a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt index 0897e1c01d..0075be6e25 100644 --- a/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt +++ b/vector/src/main/java/im/vector/app/features/settings/VectorSettingsSecurityPrivacyFragment.kt @@ -157,7 +157,7 @@ class VectorSettingsSecurityPrivacyFragment @Inject constructor( findPreference(VectorPreferences.SETTINGS_CRYPTOGRAPHY_HS_ADMIN_DISABLED_E2E_DEFAULT)?.isVisible = vectorActivity.getVectorComponent() .rawService() - .getElementWellknown(session.myUserId) + .getElementWellknown(session.sessionParams) ?.isE2EByDefault() == false } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt index f1731caf76..198e188723 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModelTask.kt @@ -75,7 +75,7 @@ class CreateSpaceViewModelTask @Inject constructor( val childIds = mutableListOf() val e2eByDefault = tryOrNull { - rawService.getElementWellknown(session.myUserId) + rawService.getElementWellknown(session.sessionParams) ?.isE2EByDefault() ?: true } ?: true diff --git a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt index 13944adfc8..95cf5fb461 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/people/SpacePeopleViewModel.kt @@ -81,7 +81,7 @@ class SpacePeopleViewModel @AssistedInject constructor( setState { copy(createAndInviteState = Loading()) } viewModelScope.launch(Dispatchers.IO) { - val adminE2EByDefault = rawService.getElementWellknown(session.myUserId) + val adminE2EByDefault = rawService.getElementWellknown(session.sessionParams) ?.isE2EByDefault() ?: true From 38cb8bd33ef63e102c5a1b3e24f39f410ebabcb0 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 10:56:15 +0200 Subject: [PATCH 03/12] Store homeServerUriBase independently that the base URL for client-server API Also handle the migration for the specific matrix-client.matrix.org URL --- .../auth/data/HomeServerConnectionConfig.kt | 28 +++++++------ .../sdk/api/auth/data/SessionParams.kt | 11 +++-- .../auth/DefaultAuthenticationService.kt | 18 ++++---- .../auth/IsValidClientServerApiTask.kt | 2 +- .../sdk/internal/auth/SessionCreator.kt | 4 +- .../internal/auth/db/AuthRealmMigration.kt | 41 +++++++++++++++++-- .../internal/auth/login/DirectLoginTask.kt | 2 +- .../sdk/internal/network/ssl/CertUtil.kt | 2 +- .../sdk/internal/session/DefaultSession.kt | 2 +- .../sdk/internal/session/SessionModule.kt | 2 +- .../content/DefaultContentUrlResolver.kt | 2 +- .../queue/HomeServerAvailabilityChecker.kt | 4 +- .../dialogs/UnrecognizedCertificateDialog.kt | 2 +- .../app/features/login/LoginViewModel.kt | 4 +- .../app/features/login2/LoginViewModel2.kt | 4 +- 15 files changed, 85 insertions(+), 43 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt index e1c5171bfc..be29a880e5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt @@ -30,8 +30,13 @@ import okhttp3.TlsVersion * You should use the [Builder] to create one. */ @JsonClass(generateAdapter = true) -data class HomeServerConnectionConfig( +data class HomeServerConnectionConfig constructor( + // This is the homeserver URL entered by the user val homeServerUri: Uri, + // This is the homeserver base URL for the client-server API. Default to homeServerUri, + // but can be updated with data from .Well-Known before login, and/or with the data + // included in the login response + val homeServerUriBase: Uri = homeServerUri, val identityServerUri: Uri? = null, val antiVirusServerUri: Uri? = null, val allowedFingerprints: List = emptyList(), @@ -47,7 +52,6 @@ data class HomeServerConnectionConfig( * This builder should be use to create a [HomeServerConnectionConfig] instance. */ class Builder { - private lateinit var homeServerUri: Uri private var identityServerUri: Uri? = null private var antiVirusServerUri: Uri? = null @@ -234,16 +238,16 @@ data class HomeServerConnectionConfig( */ fun build(): HomeServerConnectionConfig { return HomeServerConnectionConfig( - homeServerUri, - identityServerUri, - antiVirusServerUri, - allowedFingerprints, - shouldPin, - tlsVersions, - tlsCipherSuites, - shouldAcceptTlsExtensions, - allowHttpExtension, - forceUsageTlsVersions + homeServerUri = homeServerUri, + identityServerUri = identityServerUri, + antiVirusServerUri = antiVirusServerUri, + allowedFingerprints = allowedFingerprints, + shouldPin = shouldPin, + tlsVersions = tlsVersions, + tlsCipherSuites = tlsCipherSuites, + shouldAcceptTlsExtensions = shouldAcceptTlsExtensions, + allowHttpExtension = allowHttpExtension, + forceUsageTlsVersions = forceUsageTlsVersions ) } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt index b2a57c7f5c..b490ac877e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/SessionParams.kt @@ -51,13 +51,18 @@ data class SessionParams( val deviceId = credentials.deviceId /** - * The current homeserver Url. It can be different that the homeserver url entered - * during login phase, because a redirection may have occurred + * The homeserver Url entered by the user during the login phase. */ val homeServerUrl = homeServerConnectionConfig.homeServerUri.toString() /** - * The current homeserver host + * The current homeserver Url for client-server API. It can be different that the homeserver url entered + * during login phase, because a redirection may have occurred + */ + val homeServerUrlBase = homeServerConnectionConfig.homeServerUriBase.toString() + + /** + * The current homeserver host, using what has been entered by the user during login phase */ val homeServerHost = homeServerConnectionConfig.homeServerUri.host diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt index 7077453aae..b86964837b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt @@ -124,7 +124,7 @@ internal class DefaultAuthenticationService @Inject constructor( private fun getHomeServerUrlBase(): String? { return pendingSessionData ?.homeServerConnectionConfig - ?.homeServerUri + ?.homeServerUriBase ?.toString() ?.trim { it == '/' } } @@ -147,7 +147,7 @@ internal class DefaultAuthenticationService @Inject constructor( // The homeserver exists and up to date, keep the config // Homeserver url may have been changed, if it was a Riot url val alteredHomeServerConnectionConfig = homeServerConnectionConfig.copy( - homeServerUri = Uri.parse(it.homeServerUrl) + homeServerUriBase = Uri.parse(it.homeServerUrl) ) pendingSessionData = PendingSessionData(alteredHomeServerConnectionConfig) @@ -156,7 +156,7 @@ internal class DefaultAuthenticationService @Inject constructor( }, { if (it is UnrecognizedCertificateException) { - throw Failure.UnrecognizedCertificateFailure(homeServerConnectionConfig.homeServerUri.toString(), it.fingerprint) + throw Failure.UnrecognizedCertificateFailure(homeServerConnectionConfig.homeServerUriBase.toString(), it.fingerprint) } else { throw it } @@ -175,7 +175,7 @@ internal class DefaultAuthenticationService @Inject constructor( } .map { versions -> // Ok, it seems that the homeserver url is valid - getLoginFlowResult(authAPI, versions, homeServerConnectionConfig.homeServerUri.toString()) + getLoginFlowResult(authAPI, versions, homeServerConnectionConfig.homeServerUriBase.toString()) } .fold( { @@ -196,7 +196,7 @@ internal class DefaultAuthenticationService @Inject constructor( private suspend fun getRiotDomainLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult { val authAPI = buildAuthAPI(homeServerConnectionConfig) - val domain = homeServerConnectionConfig.homeServerUri.host + val domain = homeServerConnectionConfig.homeServerUriBase.host ?: return getRiotLoginFlowInternal(homeServerConnectionConfig) // Ok, try to get the config.domain.json file of a RiotWeb client @@ -257,7 +257,7 @@ internal class DefaultAuthenticationService @Inject constructor( if (defaultHomeServerUrl?.isNotEmpty() == true) { // Ok, good sign, we got a default hs url val newHomeServerConnectionConfig = homeServerConnectionConfig.copy( - homeServerUri = Uri.parse(defaultHomeServerUrl) + homeServerUriBase = Uri.parse(defaultHomeServerUrl) ) val newAuthAPI = buildAuthAPI(newHomeServerConnectionConfig) @@ -274,7 +274,7 @@ internal class DefaultAuthenticationService @Inject constructor( } private suspend fun getWellknownLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult { - val domain = homeServerConnectionConfig.homeServerUri.host + val domain = homeServerConnectionConfig.homeServerUriBase.host ?: throw Failure.OtherServerError("", HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) val wellknownResult = getWellknownTask.execute(GetWellknownTask.Params(domain, homeServerConnectionConfig)) @@ -282,7 +282,7 @@ internal class DefaultAuthenticationService @Inject constructor( return when (wellknownResult) { is WellknownResult.Prompt -> { val newHomeServerConnectionConfig = homeServerConnectionConfig.copy( - homeServerUri = Uri.parse(wellknownResult.homeServerUrl), + homeServerUriBase = Uri.parse(wellknownResult.homeServerUrl), identityServerUri = wellknownResult.identityServerUrl?.let { Uri.parse(it) } ) @@ -397,7 +397,7 @@ internal class DefaultAuthenticationService @Inject constructor( } private fun buildAuthAPI(homeServerConnectionConfig: HomeServerConnectionConfig): AuthAPI { - val retrofit = retrofitFactory.create(buildClient(homeServerConnectionConfig), homeServerConnectionConfig.homeServerUri.toString()) + val retrofit = retrofitFactory.create(buildClient(homeServerConnectionConfig), homeServerConnectionConfig.homeServerUriBase.toString()) return retrofit.create(AuthAPI::class.java) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/IsValidClientServerApiTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/IsValidClientServerApiTask.kt index 867cf46b8d..bc3d887000 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/IsValidClientServerApiTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/IsValidClientServerApiTask.kt @@ -42,7 +42,7 @@ internal class DefaultIsValidClientServerApiTask @Inject constructor( override suspend fun execute(params: IsValidClientServerApiTask.Params): Boolean { val client = buildClient(params.homeServerConnectionConfig) - val homeServerUrl = params.homeServerConnectionConfig.homeServerUri.toString() + val homeServerUrl = params.homeServerConnectionConfig.homeServerUriBase.toString() val authAPI = retrofitFactory.create(client, homeServerUrl) .create(AuthAPI::class.java) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/SessionCreator.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/SessionCreator.kt index 7c4a0c38ec..51ecc68d62 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/SessionCreator.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/SessionCreator.kt @@ -56,7 +56,7 @@ internal class DefaultSessionCreator @Inject constructor( tryOrNull { isValidClientServerApiTask.execute( IsValidClientServerApiTask.Params( - homeServerConnectionConfig.copy(homeServerUri = it) + homeServerConnectionConfig.copy(homeServerUriBase = it) ) ) .also { Timber.d("Overriding homeserver url: $it") } @@ -66,7 +66,7 @@ internal class DefaultSessionCreator @Inject constructor( val sessionParams = SessionParams( credentials = credentials, homeServerConnectionConfig = homeServerConnectionConfig.copy( - homeServerUri = overriddenUrl ?: homeServerConnectionConfig.homeServerUri, + homeServerUriBase = overriddenUrl ?: homeServerConnectionConfig.homeServerUriBase, identityServerUri = credentials.discoveryInformation?.identityServer?.baseURL // remove trailing "/" ?.trim { it == '/' } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/db/AuthRealmMigration.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/db/AuthRealmMigration.kt index bb2667228b..c2104690b3 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/db/AuthRealmMigration.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/db/AuthRealmMigration.kt @@ -16,17 +16,19 @@ package org.matrix.android.sdk.internal.auth.db -import org.matrix.android.sdk.api.auth.data.Credentials -import org.matrix.android.sdk.api.auth.data.sessionId -import org.matrix.android.sdk.internal.di.MoshiProvider +import android.net.Uri import io.realm.DynamicRealm import io.realm.RealmMigration +import org.matrix.android.sdk.api.auth.data.Credentials +import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig +import org.matrix.android.sdk.api.auth.data.sessionId +import org.matrix.android.sdk.internal.di.MoshiProvider import timber.log.Timber internal object AuthRealmMigration : RealmMigration { // Current schema version - const val SCHEMA_VERSION = 3L + const val SCHEMA_VERSION = 4L override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) { Timber.d("Migrating Auth Realm from $oldVersion to $newVersion") @@ -34,6 +36,7 @@ internal object AuthRealmMigration : RealmMigration { if (oldVersion <= 0) migrateTo1(realm) if (oldVersion <= 1) migrateTo2(realm) if (oldVersion <= 2) migrateTo3(realm) + if (oldVersion <= 3) migrateTo4(realm) } private fun migrateTo1(realm: DynamicRealm) { @@ -81,4 +84,34 @@ internal object AuthRealmMigration : RealmMigration { } ?.addPrimaryKey(SessionParamsEntityFields.SESSION_ID) } + + private fun migrateTo4(realm: DynamicRealm) { + Timber.d("Step 3 -> 4") + Timber.d("Update SessionParamsEntity to add HomeServerConnectionConfig.homeServerUriBase value") + + val adapter = MoshiProvider.providesMoshi() + .adapter(HomeServerConnectionConfig::class.java) + + realm.schema.get("SessionParamsEntity") + ?.transform { + val homeserverConnectionConfigJson = it.getString(SessionParamsEntityFields.HOME_SERVER_CONNECTION_CONFIG_JSON) + + val homeserverConnectionConfig = adapter + .fromJson(homeserverConnectionConfigJson) + + val homeserverUrl = homeserverConnectionConfig?.homeServerUri?.toString() + // Special case for matrix.org. Old session may use "https://matrix.org", newer one may use + // "https://matrix-client.matrix.org". So fix that here + val alteredHomeserverConnectionConfig = + if (homeserverUrl == "https://matrix.org" || homeserverUrl == "https://matrix-client.matrix.org") { + homeserverConnectionConfig.copy( + homeServerUri = Uri.parse("https://matrix.org"), + homeServerUriBase = Uri.parse("https://matrix-client.matrix.org") + ) + } else { + homeserverConnectionConfig + } + it.set(SessionParamsEntityFields.HOME_SERVER_CONNECTION_CONFIG_JSON, adapter.toJson(alteredHomeserverConnectionConfig)) + } + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DirectLoginTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DirectLoginTask.kt index 77bbb8096f..3888633723 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DirectLoginTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DirectLoginTask.kt @@ -50,7 +50,7 @@ internal class DefaultDirectLoginTask @Inject constructor( override suspend fun execute(params: DirectLoginTask.Params): Session { val client = buildClient(params.homeServerConnectionConfig) - val homeServerUrl = params.homeServerConnectionConfig.homeServerUri.toString() + val homeServerUrl = params.homeServerConnectionConfig.homeServerUriBase.toString() val authAPI = retrofitFactory.create(client, homeServerUrl) .create(AuthAPI::class.java) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ssl/CertUtil.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ssl/CertUtil.kt index 9d7263f56a..976751446b 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ssl/CertUtil.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/network/ssl/CertUtil.kt @@ -253,7 +253,7 @@ internal object CertUtil { val list = ArrayList() list.add(builder.build()) // TODO: we should display a warning if user enter an http url - if (hsConfig.allowHttpExtension || hsConfig.homeServerUri.toString().startsWith("http://")) { + if (hsConfig.allowHttpExtension || hsConfig.homeServerUriBase.toString().startsWith("http://")) { list.add(ConnectionSpec.CLEARTEXT) } return list diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt index 1cf99bbbd7..c2bd1e24ed 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/DefaultSession.kt @@ -313,7 +313,7 @@ internal class DefaultSession @Inject constructor( override fun getUiaSsoFallbackUrl(authenticationSessionId: String): String { val hsBas = sessionParams.homeServerConnectionConfig - .homeServerUri + .homeServerUriBase .toString() .trim { it == '/' } return buildString { diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt index e6da21315b..cb29cb4819 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/SessionModule.kt @@ -261,7 +261,7 @@ internal abstract class SessionModule { sessionParams: SessionParams, retrofitFactory: RetrofitFactory): Retrofit { return retrofitFactory - .create(okHttpClient, sessionParams.homeServerConnectionConfig.homeServerUri.toString()) + .create(okHttpClient, sessionParams.homeServerConnectionConfig.homeServerUriBase.toString()) } @JvmStatic diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt index f765056496..e4efdaa254 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/content/DefaultContentUrlResolver.kt @@ -26,7 +26,7 @@ private const val MATRIX_CONTENT_URI_SCHEME = "mxc://" internal class DefaultContentUrlResolver @Inject constructor(homeServerConnectionConfig: HomeServerConnectionConfig) : ContentUrlResolver { - private val baseUrl = homeServerConnectionConfig.homeServerUri.toString().ensureTrailingSlash() + private val baseUrl = homeServerConnectionConfig.homeServerUriBase.toString().ensureTrailingSlash() override val uploadUrl = baseUrl + NetworkConstants.URI_API_MEDIA_PREFIX_PATH_R0 + "upload" diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt index 2d53699917..1d7ce587f9 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/send/queue/HomeServerAvailabilityChecker.kt @@ -26,8 +26,8 @@ import java.net.Socket internal class HomeServerAvailabilityChecker(val sessionParams: SessionParams) { fun check(): Boolean { - val host = sessionParams.homeServerConnectionConfig.homeServerUri.host ?: return false - val port = sessionParams.homeServerConnectionConfig.homeServerUri.port.takeIf { it != -1 } ?: 80 + val host = sessionParams.homeServerConnectionConfig.homeServerUriBase.host ?: return false + val port = sessionParams.homeServerConnectionConfig.homeServerUriBase.port.takeIf { it != -1 } ?: 80 val timeout = 30_000 try { Socket().use { socket -> diff --git a/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt index ca92e6aa75..c1efc72ba7 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt @@ -50,7 +50,7 @@ class UnrecognizedCertificateDialog @Inject constructor( val userId = activeSessionHolder.getSafeActiveSession()?.myUserId val hsConfig = activeSessionHolder.getSafeActiveSession()?.sessionParams?.homeServerConnectionConfig ?: return - internalShow(activity, unrecognizedFingerprint, true, callback, userId, hsConfig.homeServerUri.toString(), hsConfig.allowedFingerprints.isNotEmpty()) + internalShow(activity, unrecognizedFingerprint, true, callback, userId, hsConfig.homeServerUriBase.toString(), hsConfig.allowedFingerprints.isNotEmpty()) } /** diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index c9b571dca1..440220882a 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -591,7 +591,7 @@ class LoginViewModel @AssistedInject constructor( homeServerConnectionConfig: HomeServerConnectionConfig?) { val alteredHomeServerConnectionConfig = homeServerConnectionConfig ?.copy( - homeServerUri = Uri.parse(wellKnownPrompt.homeServerUrl), + homeServerUriBase = Uri.parse(wellKnownPrompt.homeServerUrl), identityServerUri = wellKnownPrompt.identityServerUrl?.let { Uri.parse(it) } ) ?: HomeServerConnectionConfig( @@ -772,7 +772,7 @@ class LoginViewModel @AssistedInject constructor( data ?: return@launch // Valid Homeserver, add it to the history. - // Note: we add what the user has input, data.homeServerUrl can be different + // Note: we add what the user has input, data.homeServerUrlBase can be different rememberHomeServer(homeServerConnectionConfig.homeServerUri.toString()) val loginMode = when { diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt index 110e4f7fe4..d0da12e6ed 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt @@ -612,7 +612,7 @@ class LoginViewModel2 @AssistedInject constructor( homeServerConnectionConfig: HomeServerConnectionConfig?) { val alteredHomeServerConnectionConfig = homeServerConnectionConfig ?.copy( - homeServerUri = Uri.parse(wellKnownPrompt.homeServerUrl), + homeServerUriBase = Uri.parse(wellKnownPrompt.homeServerUrl), identityServerUri = wellKnownPrompt.identityServerUrl?.let { Uri.parse(it) } ) ?: HomeServerConnectionConfig( @@ -752,7 +752,7 @@ class LoginViewModel2 @AssistedInject constructor( } ?: return@launch // Valid Homeserver, add it to the history. - // Note: we add what the user has input, data.homeServerUrl can be different + // Note: we add what the user has input, data.homeServerUrlBase can be different rememberHomeServer(homeServerConnectionConfig.homeServerUri.toString()) val loginMode = when { From 08000dce55005a4ee64d77f6b693de25fa670b67 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 11:14:44 +0200 Subject: [PATCH 04/12] Update the UI showing the homeserver API url in developer mode --- .../homeserver/HomeServerSettingsViewState.kt | 3 ++- .../homeserver/HomeserverSettingsController.kt | 16 ++++++++++++++-- .../homeserver/HomeserverSettingsViewModel.kt | 3 ++- vector/src/main/res/values/strings.xml | 1 + 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt index abd823fa99..87ad637ca5 100644 --- a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeServerSettingsViewState.kt @@ -23,7 +23,8 @@ import org.matrix.android.sdk.api.federation.FederationVersion import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities data class HomeServerSettingsViewState( - val baseUrl: String = "", + val homeserverUrl: String = "", + val homeserverClientServerApiUrl: String = "", val homeServerCapabilities: HomeServerCapabilities = HomeServerCapabilities(), val federationVersion: Async = Uninitialized ) : MvRxState diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt index 3217756a82..f13240a74e 100644 --- a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsController.kt @@ -29,13 +29,15 @@ import im.vector.app.core.resources.StringProvider import im.vector.app.features.discovery.settingsCenteredImageItem import im.vector.app.features.discovery.settingsInfoItem import im.vector.app.features.discovery.settingsSectionTitleItem +import im.vector.app.features.settings.VectorPreferences import org.matrix.android.sdk.api.federation.FederationVersion import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities import javax.inject.Inject class HomeserverSettingsController @Inject constructor( private val stringProvider: StringProvider, - private val errorFormatter: ErrorFormatter + private val errorFormatter: ErrorFormatter, + private val vectorPreferences: VectorPreferences ) : TypedEpoxyController() { var callback: Callback? = null @@ -78,7 +80,17 @@ class HomeserverSettingsController @Inject constructor( } settingsInfoItem { id("urlValue") - helperText(state.baseUrl) + helperText(state.homeserverUrl) + } + if (vectorPreferences.developerMode()) { + settingsSectionTitleItem { + id("urlApiTitle") + titleResId(R.string.hs_client_url) + } + settingsInfoItem { + id("urlApiValue") + helperText(state.homeserverClientServerApiUrl) + } } } diff --git a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt index 17f03a3456..623ac37aa4 100644 --- a/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/settings/homeserver/HomeserverSettingsViewModel.kt @@ -53,7 +53,8 @@ class HomeserverSettingsViewModel @AssistedInject constructor( init { setState { copy( - baseUrl = session.sessionParams.homeServerUrl, + homeserverUrl = session.sessionParams.homeServerUrl, + homeserverClientServerApiUrl = session.sessionParams.homeServerUrlBase, homeServerCapabilities = session.getHomeServerCapabilities() ) } diff --git a/vector/src/main/res/values/strings.xml b/vector/src/main/res/values/strings.xml index 6908fe5d79..88d79450dc 100644 --- a/vector/src/main/res/values/strings.xml +++ b/vector/src/main/res/values/strings.xml @@ -538,6 +538,7 @@ Log in Sign out Homeserver URL + Homeserver API URL Identity Server URL Search From a61917f2b492c9a5c64182d20c8f67425ee6a1a1 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 11:19:22 +0200 Subject: [PATCH 05/12] Also change base URL for federationAPI --- .../matrix/android/sdk/internal/federation/FederationModule.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt index 320bf1d445..a4eef80c58 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/federation/FederationModule.kt @@ -37,7 +37,8 @@ internal abstract class FederationModule { fun providesFederationAPI(@Unauthenticated okHttpClient: Lazy, sessionParams: SessionParams, retrofitFactory: RetrofitFactory): FederationAPI { - return retrofitFactory.create(okHttpClient, sessionParams.homeServerUrl).create(FederationAPI::class.java) + return retrofitFactory.create(okHttpClient, sessionParams.homeServerUrlBase) + .create(FederationAPI::class.java) } } From 8f3db11693977cefe8756b7257827f224fe9cc26 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 11:52:04 +0200 Subject: [PATCH 06/12] Perform .well-known request first, even if the entered URL is a valid homeserver base url --- changelog.d/2843.bugfix | 1 + .../auth/DefaultAuthenticationService.kt | 83 +++++++++---------- 2 files changed, 40 insertions(+), 44 deletions(-) create mode 100644 changelog.d/2843.bugfix diff --git a/changelog.d/2843.bugfix b/changelog.d/2843.bugfix new file mode 100644 index 0000000000..881d6d4f90 --- /dev/null +++ b/changelog.d/2843.bugfix @@ -0,0 +1 @@ +Perform .well-known request first, even if the entered URL is a valid homeserver base url \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt index b86964837b..1d794b53c5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt @@ -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) From 24d2669255721de865aeb2d11d85bdac663548ce Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 12:07:24 +0200 Subject: [PATCH 07/12] Keep the data entered by the user for the UI Actually import what has been done in Login V2... --- .../main/java/im/vector/app/features/login/LoginFragment.kt | 4 ++-- .../vector/app/features/login/LoginResetPasswordFragment.kt | 2 +- .../features/login/LoginSignUpSignInSelectionFragment.kt | 6 +++--- .../java/im/vector/app/features/login/LoginViewModel.kt | 3 +++ .../java/im/vector/app/features/login/LoginViewState.kt | 5 +++++ .../vector/app/features/login/terms/LoginTermsFragment.kt | 2 +- 6 files changed, 15 insertions(+), 7 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt index cf799681ac..016e4ca0c7 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginFragment.kt @@ -174,7 +174,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment { views.loginServerIcon.isVisible = true views.loginServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) - views.loginTitle.text = getString(resId, state.homeServerUrl.toReducedUrl()) + views.loginTitle.text = getString(resId, state.homeServerUrlFromUser.toReducedUrl()) views.loginNotice.text = getString(R.string.login_server_matrix_org_text) } ServerType.EMS -> { @@ -185,7 +185,7 @@ class LoginFragment @Inject constructor() : AbstractSSOLoginFragment { views.loginServerIcon.isVisible = false - views.loginTitle.text = getString(resId, state.homeServerUrl.toReducedUrl()) + views.loginTitle.text = getString(resId, state.homeServerUrlFromUser.toReducedUrl()) views.loginNotice.text = getString(R.string.login_server_other_text) } ServerType.Unknown -> Unit /* Should not happen */ diff --git a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt index d08d81d98a..07c27ab296 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginResetPasswordFragment.kt @@ -55,7 +55,7 @@ class LoginResetPasswordFragment @Inject constructor() : AbstractLoginFragment { views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_matrix_org) views.loginSignupSigninServerIcon.isVisible = true - views.loginSignupSigninTitle.text = getString(R.string.login_connect_to, state.homeServerUrl.toReducedUrl()) + views.loginSignupSigninTitle.text = getString(R.string.login_connect_to, state.homeServerUrlFromUser.toReducedUrl()) views.loginSignupSigninText.text = getString(R.string.login_server_matrix_org_text) } ServerType.EMS -> { views.loginSignupSigninServerIcon.setImageResource(R.drawable.ic_logo_element_matrix_services) views.loginSignupSigninServerIcon.isVisible = true views.loginSignupSigninTitle.text = getString(R.string.login_connect_to_modular) - views.loginSignupSigninText.text = state.homeServerUrl.toReducedUrl() + views.loginSignupSigninText.text = state.homeServerUrlFromUser.toReducedUrl() } ServerType.Other -> { views.loginSignupSigninServerIcon.isVisible = false views.loginSignupSigninTitle.text = getString(R.string.login_server_other_title) - views.loginSignupSigninText.text = getString(R.string.login_connect_to, state.homeServerUrl.toReducedUrl()) + views.loginSignupSigninText.text = getString(R.string.login_connect_to, state.homeServerUrlFromUser.toReducedUrl()) } ServerType.Unknown -> Unit /* Should not happen */ } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index 440220882a..8d4e600980 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -214,6 +214,7 @@ class LoginViewModel @AssistedInject constructor( copy( signMode = SignMode.SignIn, loginMode = LoginMode.Sso(action.ssoIdentityProviders), + homeServerUrlFromUser = action.homeServerUrl, homeServerUrl = action.homeServerUrl, deviceId = action.deviceId ) @@ -365,6 +366,7 @@ class LoginViewModel @AssistedInject constructor( setState { copy( asyncHomeServerLoginFlowRequest = Uninitialized, + homeServerUrlFromUser = null, homeServerUrl = null, loginMode = LoginMode.Unknown, serverType = ServerType.Unknown, @@ -788,6 +790,7 @@ class LoginViewModel @AssistedInject constructor( setState { copy( asyncHomeServerLoginFlowRequest = Uninitialized, + homeServerUrlFromUser = homeServerConnectionConfig.homeServerUri.toString(), homeServerUrl = data.homeServerUrl, loginMode = loginMode, loginModeSupportedTypes = data.supportedLoginTypes.toList() diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewState.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewState.kt index 37ac89794f..187d39d9eb 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewState.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewState.kt @@ -38,7 +38,12 @@ data class LoginViewState( @PersistState val resetPasswordEmail: String? = null, @PersistState + val homeServerUrlFromUser: String? = null, + + // Can be modified after a Wellknown request + @PersistState val homeServerUrl: String? = null, + // For SSO session recovery @PersistState val deviceId: String? = null, diff --git a/vector/src/main/java/im/vector/app/features/login/terms/LoginTermsFragment.kt b/vector/src/main/java/im/vector/app/features/login/terms/LoginTermsFragment.kt index 3227bb7371..6f033b0294 100755 --- a/vector/src/main/java/im/vector/app/features/login/terms/LoginTermsFragment.kt +++ b/vector/src/main/java/im/vector/app/features/login/terms/LoginTermsFragment.kt @@ -112,7 +112,7 @@ class LoginTermsFragment @Inject constructor( } override fun updateWithState(state: LoginViewState) { - policyController.homeServer = state.homeServerUrl.toReducedUrl() + policyController.homeServer = state.homeServerUrlFromUser.toReducedUrl() renderState() } From 14ac5a292c064a1011f0fd1379991c121d5800a9 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 12:32:43 +0200 Subject: [PATCH 08/12] Auto review --- .../android/sdk/api/auth/data/HomeServerConnectionConfig.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt index be29a880e5..dfe899ea4a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/data/HomeServerConnectionConfig.kt @@ -18,11 +18,11 @@ package org.matrix.android.sdk.api.auth.data import android.net.Uri import com.squareup.moshi.JsonClass +import okhttp3.CipherSuite +import okhttp3.TlsVersion import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig.Builder import org.matrix.android.sdk.internal.network.ssl.Fingerprint import org.matrix.android.sdk.internal.util.ensureTrailingSlash -import okhttp3.CipherSuite -import okhttp3.TlsVersion /** * This data class holds how to connect to a specific Homeserver. @@ -30,7 +30,7 @@ import okhttp3.TlsVersion * You should use the [Builder] to create one. */ @JsonClass(generateAdapter = true) -data class HomeServerConnectionConfig constructor( +data class HomeServerConnectionConfig( // This is the homeserver URL entered by the user val homeServerUri: Uri, // This is the homeserver base URL for the client-server API. Default to homeServerUri, From ea6b0b6a434621c777d12524f49e176a9065a6fb Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 12:53:37 +0200 Subject: [PATCH 09/12] Fix issue when sign-in using matrixId --- .../java/im/vector/app/features/login/LoginViewModel.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index 8d4e600980..4629106519 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -563,16 +563,16 @@ class LoginViewModel @AssistedInject constructor( return@launch } when (data) { - is WellknownResult.Prompt -> + is WellknownResult.Prompt -> onWellknownSuccess(action, data, homeServerConnectionConfig) - is WellknownResult.FailPrompt -> + is WellknownResult.FailPrompt -> // Relax on IS discovery if home server is valid if (data.homeServerUrl != null && data.wellKnown != null) { onWellknownSuccess(action, WellknownResult.Prompt(data.homeServerUrl!!, null, data.wellKnown!!), homeServerConnectionConfig) } else { onWellKnownError() } - else -> { + else -> { onWellKnownError() } }.exhaustive @@ -597,7 +597,8 @@ class LoginViewModel @AssistedInject constructor( identityServerUri = wellKnownPrompt.identityServerUrl?.let { Uri.parse(it) } ) ?: HomeServerConnectionConfig( - homeServerUri = Uri.parse(wellKnownPrompt.homeServerUrl), + homeServerUri = Uri.parse("https://${action.username.substringAfter(":")}"), + homeServerUriBase = Uri.parse(wellKnownPrompt.homeServerUrl), identityServerUri = wellKnownPrompt.identityServerUrl?.let { Uri.parse(it) } ) From 7292c4e13d2c02c52883732aee957d4e656f4952 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Wed, 30 Jun 2021 13:57:42 +0200 Subject: [PATCH 10/12] Code quality --- .../internal/wellknown/GetWellknownTask.kt | 1 - .../dialogs/UnrecognizedCertificateDialog.kt | 20 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt index 0cdb6c999b..fdeb8c1ca5 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/wellknown/GetWellknownTask.kt @@ -18,7 +18,6 @@ package org.matrix.android.sdk.internal.wellknown import android.util.MalformedJsonException import dagger.Lazy -import org.matrix.android.sdk.api.MatrixPatterns import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.auth.data.WellKnown import org.matrix.android.sdk.api.auth.wellknown.WellknownResult diff --git a/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt b/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt index c1efc72ba7..39458a054a 100644 --- a/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt +++ b/vector/src/main/java/im/vector/app/core/dialogs/UnrecognizedCertificateDialog.kt @@ -50,7 +50,15 @@ class UnrecognizedCertificateDialog @Inject constructor( val userId = activeSessionHolder.getSafeActiveSession()?.myUserId val hsConfig = activeSessionHolder.getSafeActiveSession()?.sessionParams?.homeServerConnectionConfig ?: return - internalShow(activity, unrecognizedFingerprint, true, callback, userId, hsConfig.homeServerUriBase.toString(), hsConfig.allowedFingerprints.isNotEmpty()) + internalShow( + activity = activity, + unrecognizedFingerprint = unrecognizedFingerprint, + existing = true, + callback = callback, + userId = userId, + homeServerUrl = hsConfig.homeServerUriBase.toString(), + homeServerConnectionConfigHasFingerprints = hsConfig.allowedFingerprints.isNotEmpty() + ) } /** @@ -60,7 +68,15 @@ class UnrecognizedCertificateDialog @Inject constructor( unrecognizedFingerprint: Fingerprint, homeServerUrl: String, callback: Callback) { - internalShow(activity, unrecognizedFingerprint, false, callback, null, homeServerUrl, false) + internalShow( + activity = activity, + unrecognizedFingerprint = unrecognizedFingerprint, + existing = false, + callback = callback, + userId = null, + homeServerUrl = homeServerUrl, + homeServerConnectionConfigHasFingerprints = false + ) } /** From 67f41028ff47fae209a17a39049851e05e86365c Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 5 Jul 2021 16:41:26 +0200 Subject: [PATCH 11/12] Remove Riot ref: Riot -> Web client --- .../android/sdk/internal/auth/AuthAPI.kt | 10 +++--- .../auth/DefaultAuthenticationService.kt | 36 +++++++++---------- .../{RiotConfig.kt => WebClientConfig.kt} | 10 +++--- 3 files changed, 28 insertions(+), 28 deletions(-) rename matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/{RiotConfig.kt => WebClientConfig.kt} (84%) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt index 5a9fa9edf6..50d9e5a06c 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/AuthAPI.kt @@ -21,8 +21,8 @@ import org.matrix.android.sdk.api.util.JsonDict import org.matrix.android.sdk.internal.auth.data.Availability import org.matrix.android.sdk.internal.auth.data.LoginFlowResponse import org.matrix.android.sdk.internal.auth.data.PasswordLoginParams -import org.matrix.android.sdk.internal.auth.data.RiotConfig import org.matrix.android.sdk.internal.auth.data.TokenLoginParams +import org.matrix.android.sdk.internal.auth.data.WebClientConfig import org.matrix.android.sdk.internal.auth.login.ResetPasswordMailConfirmed import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistrationParams import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistrationResponse @@ -44,16 +44,16 @@ import retrofit2.http.Url */ internal interface AuthAPI { /** - * Get a Riot config file, using the name including the domain + * Get a Web client config file, using the name including the domain */ @GET("config.{domain}.json") - suspend fun getRiotConfigDomain(@Path("domain") domain: String): RiotConfig + suspend fun getWebClientConfigDomain(@Path("domain") domain: String): WebClientConfig /** - * Get a Riot config file + * Get a Web client default config file */ @GET("config.json") - suspend fun getRiotConfig(): RiotConfig + suspend fun getWebClientConfig(): WebClientConfig /** * Get the version information of the homeserver diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt index 1d794b53c5..1a743ff12a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt @@ -33,7 +33,7 @@ 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 -import org.matrix.android.sdk.internal.auth.data.RiotConfig +import org.matrix.android.sdk.internal.auth.data.WebClientConfig import org.matrix.android.sdk.internal.auth.db.PendingSessionData import org.matrix.android.sdk.internal.auth.login.DefaultLoginWizard import org.matrix.android.sdk.internal.auth.login.DirectLoginTask @@ -145,7 +145,7 @@ internal class DefaultAuthenticationService @Inject constructor( return result.fold( { // The homeserver exists and up to date, keep the config - // Homeserver url may have been changed, if it was a Riot url + // Homeserver url may have been changed, if it was a Web client url val alteredHomeServerConnectionConfig = homeServerConnectionConfig.copy( homeServerUriBase = Uri.parse(it.homeServerUrl) ) @@ -191,8 +191,8 @@ internal class DefaultAuthenticationService @Inject constructor( { if (it is Failure.OtherServerError && it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) { - // It's maybe a Riot url? - getRiotDomainLoginFlowInternal(homeServerConnectionConfig) + // It's maybe a Web client url? + getWebClientDomainLoginFlowInternal(homeServerConnectionConfig) } else { throw it } @@ -204,20 +204,20 @@ internal class DefaultAuthenticationService @Inject constructor( } } - private suspend fun getRiotDomainLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult { + private suspend fun getWebClientDomainLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult { val authAPI = buildAuthAPI(homeServerConnectionConfig) val domain = homeServerConnectionConfig.homeServerUri.host - ?: return getRiotLoginFlowInternal(homeServerConnectionConfig) + ?: return getWebClientLoginFlowInternal(homeServerConnectionConfig) - // Ok, try to get the config.domain.json file of a RiotWeb client + // Ok, try to get the config.domain.json file of a Web client return runCatching { executeRequest(null) { - authAPI.getRiotConfigDomain(domain) + authAPI.getWebClientConfigDomain(domain) } } - .map { riotConfig -> - onRiotConfigRetrieved(homeServerConnectionConfig, riotConfig) + .map { webClientConfig -> + onWebClientConfigRetrieved(homeServerConnectionConfig, webClientConfig) } .fold( { @@ -227,7 +227,7 @@ internal class DefaultAuthenticationService @Inject constructor( if (it is Failure.OtherServerError && it.httpCode == HttpsURLConnection.HTTP_NOT_FOUND /* 404 */) { // Try with config.json - getRiotLoginFlowInternal(homeServerConnectionConfig) + getWebClientLoginFlowInternal(homeServerConnectionConfig) } else { throw it } @@ -235,20 +235,20 @@ internal class DefaultAuthenticationService @Inject constructor( ) } - private suspend fun getRiotLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult { + private suspend fun getWebClientLoginFlowInternal(homeServerConnectionConfig: HomeServerConnectionConfig): LoginFlowResult { val authAPI = buildAuthAPI(homeServerConnectionConfig) - // Ok, try to get the config.json file of a RiotWeb client + // Ok, try to get the config.json file of a Web client return executeRequest(null) { - authAPI.getRiotConfig() + authAPI.getWebClientConfig() } - .let { riotConfig -> - onRiotConfigRetrieved(homeServerConnectionConfig, riotConfig) + .let { webClientConfig -> + onWebClientConfigRetrieved(homeServerConnectionConfig, webClientConfig) } } - private suspend fun onRiotConfigRetrieved(homeServerConnectionConfig: HomeServerConnectionConfig, riotConfig: RiotConfig): LoginFlowResult { - val defaultHomeServerUrl = riotConfig.getPreferredHomeServerUrl() + private suspend fun onWebClientConfigRetrieved(homeServerConnectionConfig: HomeServerConnectionConfig, webClientConfig: WebClientConfig): LoginFlowResult { + val defaultHomeServerUrl = webClientConfig.getPreferredHomeServerUrl() if (defaultHomeServerUrl?.isNotEmpty() == true) { // Ok, good sign, we got a default hs url val newHomeServerConnectionConfig = homeServerConnectionConfig.copy( diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/RiotConfig.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/WebClientConfig.kt similarity index 84% rename from matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/RiotConfig.kt rename to matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/WebClientConfig.kt index e61358a67b..65c3dc64a6 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/RiotConfig.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/data/WebClientConfig.kt @@ -20,7 +20,7 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -internal data class RiotConfig( +internal data class WebClientConfig( /** * This is now deprecated, but still used first, rather than value from "default_server_config" */ @@ -28,7 +28,7 @@ internal data class RiotConfig( val defaultHomeServerUrl: String?, @Json(name = "default_server_config") - val defaultServerConfig: RiotConfigDefaultServerConfig? + val defaultServerConfig: WebClientConfigDefaultServerConfig? ) { fun getPreferredHomeServerUrl(): String? { return defaultHomeServerUrl @@ -38,13 +38,13 @@ internal data class RiotConfig( } @JsonClass(generateAdapter = true) -internal data class RiotConfigDefaultServerConfig( +internal data class WebClientConfigDefaultServerConfig( @Json(name = "m.homeserver") - val homeServer: RiotConfigBaseConfig? = null + val homeServer: WebClientConfigBaseConfig? = null ) @JsonClass(generateAdapter = true) -internal data class RiotConfigBaseConfig( +internal data class WebClientConfigBaseConfig( @Json(name = "base_url") val baseURL: String? = null ) From d29e04f16c0b3bcf0f5eca94550cc190b260fb22 Mon Sep 17 00:00:00 2001 From: Benoit Marty Date: Mon, 5 Jul 2021 16:49:09 +0200 Subject: [PATCH 12/12] Create fun String.getDomain(): String to avoid duplicated code --- .../matrix/android/sdk/api/MatrixPatterns.kt | 17 ++++++++++++++++- .../auth/DefaultAuthenticationService.kt | 3 ++- .../homeserver/GetHomeServerCapabilitiesTask.kt | 3 ++- .../session/permalinks/ViaParameterFinder.kt | 5 +++-- .../room/alias/RoomAliasAvailabilityChecker.kt | 3 ++- .../vector/app/features/login/LoginViewModel.kt | 3 ++- .../app/features/login2/LoginViewModel2.kt | 3 ++- .../raw/wellknown/ElementWellKnownExt.kt | 3 ++- .../createroom/CreateRoomViewModel.kt | 3 ++- .../picker/RoomDirectoryListCreator.kt | 3 ++- .../roomprofile/alias/RoomAliasViewModel.kt | 3 ++- .../spaces/create/CreateSpaceViewModel.kt | 3 ++- 12 files changed, 39 insertions(+), 13 deletions(-) diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt index 7f5f3f54ef..3af1a22779 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/MatrixPatterns.kt @@ -16,6 +16,8 @@ package org.matrix.android.sdk.api +import org.matrix.android.sdk.BuildConfig + /** * This class contains pattern to match the different Matrix ids */ @@ -154,7 +156,7 @@ object MatrixPatterns { * Orders which are not strings, or do not consist solely of ascii characters in the range \x20 (space) to \x7E (~), * or consist of more than 50 characters, are forbidden and the field should be ignored if received. */ - fun isValidOrderString(order: String?) : Boolean { + fun isValidOrderString(order: String?): Boolean { return order != null && order.length < 50 && order matches ORDER_STRING_REGEX } @@ -163,4 +165,17 @@ object MatrixPatterns { "[^a-z0-9._%#@=+-]".toRegex().replace(it, "") } } + + /** + * Return the domain form a userId + * Examples: + * - "@alice:domain.org".getDomain() will return "domain.org" + * - "@bob:domain.org:3455".getDomain() will return "domain.org:3455" + */ + fun String.getDomain(): String { + if (BuildConfig.DEBUG) { + assert(isUserId(this)) + } + return substringAfter(":") + } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt index 1a743ff12a..e76dc28734 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/DefaultAuthenticationService.kt @@ -20,6 +20,7 @@ import android.net.Uri import dagger.Lazy import okhttp3.OkHttpClient import org.matrix.android.sdk.api.MatrixPatterns +import org.matrix.android.sdk.api.MatrixPatterns.getDomain 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 @@ -379,7 +380,7 @@ internal class DefaultAuthenticationService @Inject constructor( } return getWellknownTask.execute(GetWellknownTask.Params( - domain = matrixId.substringAfter(":"), + domain = matrixId.getDomain(), homeServerConnectionConfig = homeServerConnectionConfig) ) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt index 7b9a304c96..712099d68a 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/homeserver/GetHomeServerCapabilitiesTask.kt @@ -17,6 +17,7 @@ package org.matrix.android.sdk.internal.session.homeserver import com.zhuinden.monarchy.Monarchy +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig import org.matrix.android.sdk.api.auth.wellknown.WellknownResult import org.matrix.android.sdk.api.session.homeserver.HomeServerCapabilities @@ -90,7 +91,7 @@ internal class DefaultGetHomeServerCapabilitiesTask @Inject constructor( val wellknownResult = runCatching { getWellknownTask.execute(GetWellknownTask.Params( - domain = userId.substringAfter(":"), + domain = userId.getDomain(), homeServerConnectionConfig = homeServerConnectionConfig )) }.getOrNull() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/permalinks/ViaParameterFinder.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/permalinks/ViaParameterFinder.kt index 72fbfcced5..82565d8118 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/permalinks/ViaParameterFinder.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/permalinks/ViaParameterFinder.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.session.permalinks +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.session.room.members.roomMemberQueryParams import org.matrix.android.sdk.api.session.room.model.Membership import org.matrix.android.sdk.internal.di.UserId @@ -47,9 +48,9 @@ internal class ViaParameterFinder @Inject constructor( } fun computeViaParams(userId: String, roomId: String, max: Int): List { - val userHomeserver = userId.substringAfter(":") + val userHomeserver = userId.getDomain() return getUserIdsOfJoinedMembers(roomId) - .map { it.substringAfter(":") } + .map { it.getDomain() } .groupBy { it } .mapValues { it.value.size } .toMutableMap() diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt index 66164c5280..7c137a8102 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/room/alias/RoomAliasAvailabilityChecker.kt @@ -16,6 +16,7 @@ package org.matrix.android.sdk.internal.session.room.alias +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.failure.Failure import org.matrix.android.sdk.api.session.room.alias.RoomAliasError import org.matrix.android.sdk.internal.di.UserId @@ -64,6 +65,6 @@ internal class RoomAliasAvailabilityChecker @Inject constructor( } companion object { - internal fun String.toFullLocalAlias(userId: String) = "#" + this + ":" + userId.substringAfter(":") + internal fun String.toFullLocalAlias(userId: String) = "#" + this + ":" + userId.getDomain() } } diff --git a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt index 4629106519..2c4ad8b40d 100644 --- a/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/login/LoginViewModel.kt @@ -40,6 +40,7 @@ import im.vector.app.core.utils.ensureTrailingSlash import im.vector.app.features.signout.soft.SoftLogoutActivity import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.auth.AuthenticationService import org.matrix.android.sdk.api.auth.HomeServerHistoryService import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig @@ -597,7 +598,7 @@ class LoginViewModel @AssistedInject constructor( identityServerUri = wellKnownPrompt.identityServerUrl?.let { Uri.parse(it) } ) ?: HomeServerConnectionConfig( - homeServerUri = Uri.parse("https://${action.username.substringAfter(":")}"), + homeServerUri = Uri.parse("https://${action.username.getDomain()}"), homeServerUriBase = Uri.parse(wellKnownPrompt.homeServerUrl), identityServerUri = wellKnownPrompt.identityServerUrl?.let { Uri.parse(it) } ) diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt index d0da12e6ed..13d819c284 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginViewModel2.kt @@ -41,6 +41,7 @@ import im.vector.app.features.login.LoginMode import im.vector.app.features.login.ReAuthHelper import kotlinx.coroutines.Job import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.auth.AuthenticationService import org.matrix.android.sdk.api.auth.HomeServerHistoryService import org.matrix.android.sdk.api.auth.data.HomeServerConnectionConfig @@ -651,7 +652,7 @@ class LoginViewModel2 @AssistedInject constructor( } viewEvent?.let { _viewEvents.post(it) } - val urlFromUser = action.username.substringAfter(":") + val urlFromUser = action.username.getDomain() setState { copy( isLoading = false, diff --git a/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt b/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt index a6959ff116..4dd5a68673 100644 --- a/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt +++ b/vector/src/main/java/im/vector/app/features/raw/wellknown/ElementWellKnownExt.kt @@ -16,13 +16,14 @@ package im.vector.app.features.raw.wellknown +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.auth.data.SessionParams import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService suspend fun RawService.getElementWellknown(sessionParams: SessionParams): ElementWellKnown? { // By default we use the domain of the userId to retrieve the .well-known data - val domain = sessionParams.userId.substringAfter(":") + val domain = sessionParams.userId.getDomain() return tryOrNull { getWellknown(domain) } ?.let { ElementWellKnownMapper.from(it) } } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt index bd7e176247..ff62136267 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/createroom/CreateRoomViewModel.kt @@ -34,6 +34,7 @@ import im.vector.app.features.raw.wellknown.getElementWellknown import im.vector.app.features.raw.wellknown.isE2EByDefault import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.extensions.tryOrNull import org.matrix.android.sdk.api.raw.RawService import org.matrix.android.sdk.api.session.Session @@ -62,7 +63,7 @@ class CreateRoomViewModel @AssistedInject constructor(@Assisted private val init private fun initHomeServerName() { setState { copy( - homeServerName = session.myUserId.substringAfter(":") + homeServerName = session.myUserId.getDomain() ) } } diff --git a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryListCreator.kt b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryListCreator.kt index 65d8f2d1cb..90283de77c 100644 --- a/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryListCreator.kt +++ b/vector/src/main/java/im/vector/app/features/roomdirectory/picker/RoomDirectoryListCreator.kt @@ -20,6 +20,7 @@ import im.vector.app.R import im.vector.app.core.resources.StringArrayProvider import im.vector.app.features.roomdirectory.RoomDirectoryData import im.vector.app.features.roomdirectory.RoomDirectoryServer +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.model.thirdparty.ThirdPartyProtocol import javax.inject.Inject @@ -36,7 +37,7 @@ class RoomDirectoryListCreator @Inject constructor( val protocols = ArrayList() // Add user homeserver name - val userHsName = session.myUserId.substringAfter(":") + val userHsName = session.myUserId.getDomain() // Add default protocol protocols.add( diff --git a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt index 8832c9f7d8..b8a0149198 100644 --- a/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/roomprofile/alias/RoomAliasViewModel.kt @@ -31,6 +31,7 @@ import im.vector.app.core.extensions.exhaustive import im.vector.app.core.platform.VectorViewModel import im.vector.app.features.powerlevel.PowerLevelsObservableFactory import kotlinx.coroutines.launch +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.query.QueryStringValue import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.events.model.EventType @@ -101,7 +102,7 @@ class RoomAliasViewModel @AssistedInject constructor(@Assisted initialState: Roo private fun initHomeServerName() { setState { copy( - homeServerName = session.myUserId.substringAfter(":") + homeServerName = session.myUserId.getDomain() ) } } diff --git a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt index 60110b7dd5..2537a3a592 100644 --- a/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/spaces/create/CreateSpaceViewModel.kt @@ -36,6 +36,7 @@ import im.vector.app.core.resources.StringProvider import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.matrix.android.sdk.api.MatrixPatterns +import org.matrix.android.sdk.api.MatrixPatterns.getDomain import org.matrix.android.sdk.api.session.Session import org.matrix.android.sdk.api.session.room.AliasAvailabilityResult import org.matrix.android.sdk.api.session.room.failure.CreateRoomFailure @@ -51,7 +52,7 @@ class CreateSpaceViewModel @AssistedInject constructor( init { setState { copy( - homeServerName = session.myUserId.substringAfter(":") + homeServerName = session.myUserId.getDomain() ) } }