diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt index cf810de733..5b8d2328c7 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/api/auth/login/LoginWizard.kt @@ -65,18 +65,14 @@ interface LoginWizard { * [resetPasswordMailConfirmed] is successfully called. * * @param email an email previously associated to the account the user wants the password to be reset. - * @param newPassword the desired new password, can be optionally set here or as part of [resetPasswordMailConfirmed] */ - suspend fun resetPassword( - email: String, - newPassword: String? = null - ) + suspend fun resetPassword(email: String) /** * Confirm the new password, once the user has checked their email * When this method succeed, tha account password will be effectively modified. * - * @param newPassword the desired new password, required if a password was not supplied to [resetPassword] + * @param newPassword the desired new password */ - suspend fun resetPasswordMailConfirmed(newPassword: String? = null) + suspend fun resetPasswordMailConfirmed(newPassword: String) } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt index f949e793df..f947d76b95 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/DefaultLoginWizard.kt @@ -104,7 +104,7 @@ internal class DefaultLoginWizard( return sessionCreator.createSession(credentials, pendingSessionData.homeServerConnectionConfig) } - override suspend fun resetPassword(email: String, newPassword: String?) { + override suspend fun resetPassword(email: String) { val param = RegisterAddThreePidTask.Params( RegisterThreePid.Email(email), pendingSessionData.clientSecret, @@ -118,18 +118,17 @@ internal class DefaultLoginWizard( authAPI.resetPassword(AddThreePidRegistrationParams.from(param)) } - pendingSessionData = pendingSessionData.copy(resetPasswordData = ResetPasswordData(newPassword, result)) + pendingSessionData = pendingSessionData.copy(resetPasswordData = ResetPasswordData(result)) .also { pendingSessionStore.savePendingSessionData(it) } } - override suspend fun resetPasswordMailConfirmed(newPassword: String?) { - val param = pendingSessionData.readResetPasswordDataOrThrow(newPassword).let { (response, password) -> - ResetPasswordMailConfirmed.create( - pendingSessionData.clientSecret, - response.sid, - password - ) - } + override suspend fun resetPasswordMailConfirmed(newPassword: String) { + val resetPasswordData = pendingSessionData.resetPasswordData ?: throw IllegalStateException("Developer error - Must call resetPassword first") + val param = ResetPasswordMailConfirmed.create( + pendingSessionData.clientSecret, + resetPasswordData.addThreePidRegistrationResponse.sid, + newPassword + ) executeRequest(null) { authAPI.resetPasswordMailConfirmed(param) @@ -138,14 +137,4 @@ internal class DefaultLoginWizard( // Set to null? // resetPasswordData = null } - - private fun PendingSessionData.readResetPasswordDataOrThrow(newPassword: String?): Pair { - return when (resetPasswordData) { - null -> throw IllegalStateException("developer error, no reset password in progress") - else -> { - val password = newPassword ?: resetPasswordData.newPassword ?: throw IllegalStateException("developer error, no new password set") - resetPasswordData.addThreePidRegistrationResponse to password - } - } - } } diff --git a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/ResetPasswordData.kt b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/ResetPasswordData.kt index 0e31d2bf13..87a7b346dc 100644 --- a/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/ResetPasswordData.kt +++ b/matrix-sdk-android/src/main/java/org/matrix/android/sdk/internal/auth/login/ResetPasswordData.kt @@ -24,6 +24,5 @@ import org.matrix.android.sdk.internal.auth.registration.AddThreePidRegistration */ @JsonClass(generateAdapter = true) internal data class ResetPasswordData( - val newPassword: String?, val addThreePidRegistrationResponse: AddThreePidRegistrationResponse ) 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 5e9a95083e..c13372cbe4 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 @@ -413,7 +413,8 @@ class LoginViewModel @AssistedInject constructor( copy( asyncResetPassword = Uninitialized, asyncResetMailConfirmed = Uninitialized, - resetPasswordEmail = null + resetPasswordEmail = null, + resetPasswordNewPassword = null ) } } @@ -488,7 +489,7 @@ class LoginViewModel @AssistedInject constructor( currentJob = viewModelScope.launch { try { - safeLoginWizard.resetPassword(action.email, action.newPassword) + safeLoginWizard.resetPassword(action.email) } catch (failure: Throwable) { setState { copy( @@ -501,7 +502,8 @@ class LoginViewModel @AssistedInject constructor( setState { copy( asyncResetPassword = Success(Unit), - resetPasswordEmail = action.email + resetPasswordEmail = action.email, + resetPasswordNewPassword = action.newPassword ) } @@ -530,7 +532,8 @@ class LoginViewModel @AssistedInject constructor( currentJob = viewModelScope.launch { try { - safeLoginWizard.resetPasswordMailConfirmed() + val state = awaitState() + safeLoginWizard.resetPasswordMailConfirmed(state.resetPasswordNewPassword!!) } catch (failure: Throwable) { setState { copy( @@ -542,7 +545,8 @@ class LoginViewModel @AssistedInject constructor( setState { copy( asyncResetMailConfirmed = Success(Unit), - resetPasswordEmail = null + resetPasswordEmail = null, + resetPasswordNewPassword = null ) } 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 23689225b5..83540d6205 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,6 +38,8 @@ data class LoginViewState( @PersistState val resetPasswordEmail: String? = null, @PersistState + val resetPasswordNewPassword: String? = null, + @PersistState val homeServerUrlFromUser: String? = null, // Can be modified after a Wellknown request 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 81601e6b59..2120d2997c 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 @@ -392,7 +392,8 @@ class LoginViewModel2 @AssistedInject constructor( LoginAction2.ResetResetPassword -> { setState { copy( - resetPasswordEmail = null + resetPasswordEmail = null, + resetPasswordNewPassword = null ) } } @@ -443,7 +444,7 @@ class LoginViewModel2 @AssistedInject constructor( currentJob = viewModelScope.launch { try { - safeLoginWizard.resetPassword(action.email, action.newPassword) + safeLoginWizard.resetPassword(action.email) } catch (failure: Throwable) { _viewEvents.post(LoginViewEvents2.Failure(failure)) setState { copy(isLoading = false) } @@ -453,7 +454,8 @@ class LoginViewModel2 @AssistedInject constructor( setState { copy( isLoading = false, - resetPasswordEmail = action.email + resetPasswordEmail = action.email, + resetPasswordNewPassword = action.newPassword ) } @@ -472,7 +474,8 @@ class LoginViewModel2 @AssistedInject constructor( currentJob = viewModelScope.launch { try { - safeLoginWizard.resetPasswordMailConfirmed() + val state = awaitState() + safeLoginWizard.resetPasswordMailConfirmed(state.resetPasswordNewPassword!!) } catch (failure: Throwable) { _viewEvents.post(LoginViewEvents2.Failure(failure)) setState { copy(isLoading = false) } @@ -481,7 +484,8 @@ class LoginViewModel2 @AssistedInject constructor( setState { copy( isLoading = false, - resetPasswordEmail = null + resetPasswordEmail = null, + resetPasswordNewPassword = null ) } diff --git a/vector/src/main/java/im/vector/app/features/login2/LoginViewState2.kt b/vector/src/main/java/im/vector/app/features/login2/LoginViewState2.kt index 276d1111bb..8405381c4f 100644 --- a/vector/src/main/java/im/vector/app/features/login2/LoginViewState2.kt +++ b/vector/src/main/java/im/vector/app/features/login2/LoginViewState2.kt @@ -36,6 +36,8 @@ data class LoginViewState2( @PersistState val resetPasswordEmail: String? = null, @PersistState + val resetPasswordNewPassword: String? = null, + @PersistState val homeServerUrlFromUser: String? = null, // Can be modified after a Wellknown request diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt index 39c5b9f3c1..71093a6600 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewModel.kt @@ -456,7 +456,7 @@ class OnboardingViewModel @AssistedInject constructor( currentJob = viewModelScope.launch { try { - safeLoginWizard.resetPassword(action.email, action.newPassword) + safeLoginWizard.resetPassword(action.email) } catch (failure: Throwable) { setState { copy(isLoading = false) } _viewEvents.post(OnboardingViewEvents.Failure(failure)) @@ -466,7 +466,7 @@ class OnboardingViewModel @AssistedInject constructor( setState { copy( isLoading = false, - resetState = ResetState(email = action.email) + resetState = ResetState(email = action.email, newPassword = action.newPassword) ) } @@ -486,7 +486,8 @@ class OnboardingViewModel @AssistedInject constructor( currentJob = viewModelScope.launch { try { - safeLoginWizard.resetPasswordMailConfirmed() + val state = awaitState() + safeLoginWizard.resetPasswordMailConfirmed(state.resetState.newPassword!!) } catch (failure: Throwable) { setState { copy(isLoading = false) } _viewEvents.post(OnboardingViewEvents.Failure(failure)) diff --git a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt index 761d9a4472..268b1e7d49 100644 --- a/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt +++ b/vector/src/main/java/im/vector/app/features/onboarding/OnboardingViewState.kt @@ -86,7 +86,8 @@ data class PersonalizationState( @Parcelize data class ResetState( - val email: String? = null + val email: String? = null, + val newPassword: String? = null, ) : Parcelable @Parcelize