From 7f12001a9b8fd4924973e529d3ba4b378b8fbfb3 Mon Sep 17 00:00:00 2001 From: Taras Smakula <tarassmakula@gmail.com> Date: Wed, 1 Nov 2023 17:14:09 +0200 Subject: [PATCH] Add change password UIA --- .../internal/session/account/AccountAPI.kt | 4 ++ .../internal/session/account/AccountModule.kt | 3 + .../account/ChangePasswordUIAParams.kt | 41 ++++++++++++ .../session/account/ChangePasswordUIATask.kt | 62 +++++++++++++++++++ .../session/account/DefaultAccountService.kt | 8 ++- 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIAParams.kt create mode 100644 matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIATask.kt diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountAPI.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountAPI.kt index 4bd3b636..e932189e 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountAPI.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountAPI.kt @@ -36,4 +36,8 @@ internal interface AccountAPI { */ @POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/deactivate") suspend fun deactivate(@Body params: DeactivateAccountParams) + + //Added to handle reAuth uia stages + @POST(NetworkConstants.URI_API_PREFIX_PATH_R0 + "account/auth") + suspend fun changePasswordUIA(@Body params: ChangePasswordUIAParams) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountModule.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountModule.kt index 7cf4f53a..8c2f9e01 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountModule.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/AccountModule.kt @@ -44,4 +44,7 @@ internal abstract class AccountModule { @Binds abstract fun bindAccountService(service: DefaultAccountService): AccountService + + @Binds + abstract fun bindChangePasswordUIATask(task: DefaultChangePasswordUIATask): ChangePasswordUIATask } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIAParams.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIAParams.kt new file mode 100644 index 00000000..1666ba7e --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIAParams.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2020 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.internal.session.account + +import com.squareup.moshi.Json +import com.squareup.moshi.JsonClass +import org.matrix.android.sdk.api.auth.UIABaseAuth + +//Created for Circles +@JsonClass(generateAdapter = true) +internal data class ChangePasswordUIAParams( + + @Json(name = "logout_devices") + val logoutDevices: Boolean = true, + + @Json(name = "auth") + val auth: Map<String, *>? = null +) { + companion object { + fun create(auth: UIABaseAuth?, logoutDevices: Boolean): ChangePasswordUIAParams { + return ChangePasswordUIAParams( + auth = auth?.asMap(), + logoutDevices = logoutDevices + ) + } + } +} \ No newline at end of file diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIATask.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIATask.kt new file mode 100644 index 00000000..93c611fb --- /dev/null +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/ChangePasswordUIATask.kt @@ -0,0 +1,62 @@ +/* + * Copyright 2020 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.internal.session.account + +import org.matrix.android.sdk.api.auth.UIABaseAuth +import org.matrix.android.sdk.api.auth.UserInteractiveAuthInterceptor +import org.matrix.android.sdk.api.session.uia.UiaResult +import org.matrix.android.sdk.internal.auth.registration.handleUIA +import org.matrix.android.sdk.internal.network.GlobalErrorReceiver +import org.matrix.android.sdk.internal.network.executeRequest +import org.matrix.android.sdk.internal.task.Task +import javax.inject.Inject + +//Created for Circles +internal interface ChangePasswordUIATask : Task<ChangePasswordUIATask.Params, Unit> { + data class Params( + val logoutAllDevices: Boolean, + val userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, + val userAuthParam: UIABaseAuth? = null + ) +} + +//Created for Circles +internal class DefaultChangePasswordUIATask @Inject constructor( + private val accountAPI: AccountAPI, + private val globalErrorReceiver: GlobalErrorReceiver +) : ChangePasswordUIATask { + + override suspend fun execute(params: ChangePasswordUIATask.Params) { + val changePasswordParams = ChangePasswordUIAParams.create(params.userAuthParam, params.logoutAllDevices) + try { + executeRequest(globalErrorReceiver) { + accountAPI.changePasswordUIA(changePasswordParams) + } + } catch (throwable: Throwable) { + if (handleUIA( + failure = throwable, + interceptor = params.userInteractiveAuthInterceptor, + retryBlock = { authUpdate -> + execute(params.copy(userAuthParam = authUpdate)) + } + ) != UiaResult.SUCCESS + ) { + throw throwable + } + } + } +} diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/DefaultAccountService.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/DefaultAccountService.kt index 9d03ec47..0d7f4732 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/DefaultAccountService.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/session/account/DefaultAccountService.kt @@ -22,7 +22,8 @@ import javax.inject.Inject internal class DefaultAccountService @Inject constructor( private val changePasswordTask: ChangePasswordTask, - private val deactivateAccountTask: DeactivateAccountTask + private val deactivateAccountTask: DeactivateAccountTask, + private val changePasswordUIATask: ChangePasswordUIATask ) : AccountService { override suspend fun changePassword(password: String, newPassword: String, logoutAllDevices: Boolean) { @@ -32,4 +33,9 @@ internal class DefaultAccountService @Inject constructor( override suspend fun deactivateAccount(eraseAllData: Boolean, userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor) { deactivateAccountTask.execute(DeactivateAccountTask.Params(eraseAllData, userInteractiveAuthInterceptor)) } + + //Added for password UIA stages + override suspend fun changePasswordStages(userInteractiveAuthInterceptor: UserInteractiveAuthInterceptor, logoutAllDevices: Boolean) { + changePasswordUIATask.execute(ChangePasswordUIATask.Params(logoutAllDevices, userInteractiveAuthInterceptor)) + } } -- GitLab