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 4bd3b6360d91f7e9f54a1e68014309f96f16248b..e932189ef167e5059db6b9cf6ba688347980d62f 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 7cf4f53adb33ff32889a1da1c7c3cfd0063a4919..8c2f9e01ead3b5406b9d267bf84eb69d2f47b6cf 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 0000000000000000000000000000000000000000..1666ba7ed6402514f5215f39fe6adcf33e9d054d --- /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 0000000000000000000000000000000000000000..93c611fbd647b029a3096fe567c97fabc9f8f055 --- /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 9d03ec479b3a5c8d16a9e6ae82ed4840af332639..0d7f4732edf5345eaa83a4d9188449039b6c73af 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)) + } }