From 1cffd88af28c827f7ada08e5becf0062845e8c5a Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 23 Feb 2023 08:18:08 -0500 Subject: [PATCH] Fix crashes during skip SMS flow. --- .../securesms/registration/VerifyResponseProcessor.kt | 5 +++++ .../registration/fragments/ReRegisterWithPinFragment.kt | 3 +++ .../registration/viewmodel/RegistrationViewModel.java | 2 +- .../IncorrectRegistrationRecoveryPasswordException.kt | 3 +++ .../signalservice/internal/push/PushServiceSocket.java | 3 +++ 5 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/IncorrectRegistrationRecoveryPasswordException.kt diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyResponseProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyResponseProcessor.kt index 5697b9a4e..e98ced965 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyResponseProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyResponseProcessor.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.registration import org.thoughtcrime.securesms.pin.KeyBackupSystemWrongPinException import org.thoughtcrime.securesms.pin.TokenData import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException +import org.whispersystems.signalservice.api.push.exceptions.IncorrectRegistrationRecoveryPasswordException import org.whispersystems.signalservice.api.push.exceptions.NoSuchSessionException import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulResponseCodeException import org.whispersystems.signalservice.internal.ServiceResponse @@ -45,6 +46,10 @@ sealed class VerifyResponseProcessor(response: ServiceResponse) return error is NonSuccessfulResponseCodeException } + fun isIncorrectRegistrationRecoveryPassword(): Boolean { + return error is IncorrectRegistrationRecoveryPasswordException + } + abstract fun isKbsLocked(): Boolean } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/ReRegisterWithPinFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/ReRegisterWithPinFragment.kt index 5ed2aee70..5e38ac43e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/ReRegisterWithPinFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/fragments/ReRegisterWithPinFragment.kt @@ -137,6 +137,9 @@ class ReRegisterWithPinFragment : LoggingFragment(R.layout.pin_restore_entry_fra } else if (processor.isKbsLocked()) { Log.w(TAG, "Unable to continue skip flow, KBS is locked") onAccountLocked() + } else if (processor.isIncorrectRegistrationRecoveryPassword()) { + Log.w(TAG, "Registration recovery password was incorrect. Moving to SMS verification.") + onSkipPinEntry() } else if (processor.isServerSentError()) { Log.i(TAG, "Error from server, not likely recoverable", processor.error) Toast.makeText(requireContext(), R.string.RegistrationActivity_error_connecting_to_service, Toast.LENGTH_LONG).show() diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java index 87f9c78f5..f4e92a3cd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/RegistrationViewModel.java @@ -225,7 +225,7 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel { registrationRepository.getProfileKey(getNumber().getE164Number()), getFcmToken(), registrationRepository.getPniRegistrationId(), - getRecoveryPassword()); + getSessionId() != null ? null : getRecoveryPassword()); } public @NonNull Single verifyReRegisterWithPin(@NonNull String pin) { diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/IncorrectRegistrationRecoveryPasswordException.kt b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/IncorrectRegistrationRecoveryPasswordException.kt new file mode 100644 index 000000000..1d34d6465 --- /dev/null +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/push/exceptions/IncorrectRegistrationRecoveryPasswordException.kt @@ -0,0 +1,3 @@ +package org.whispersystems.signalservice.api.push.exceptions + +class IncorrectRegistrationRecoveryPasswordException : NonSuccessfulResponseCodeException(403) diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java index 81c550288..00f60733d 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/internal/push/PushServiceSocket.java @@ -68,6 +68,7 @@ import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionExc import org.whispersystems.signalservice.api.push.exceptions.ExpectationFailedException; import org.whispersystems.signalservice.api.push.exceptions.ExternalServiceFailureException; import org.whispersystems.signalservice.api.push.exceptions.HttpConflictException; +import org.whispersystems.signalservice.api.push.exceptions.IncorrectRegistrationRecoveryPasswordException; import org.whispersystems.signalservice.api.push.exceptions.InvalidTransportModeException; import org.whispersystems.signalservice.api.push.exceptions.MalformedResponseException; import org.whispersystems.signalservice.api.push.exceptions.MissingConfigurationException; @@ -2519,6 +2520,8 @@ public class PushServiceSocket { @Override public void handle(int responseCode, ResponseBody body) throws NonSuccessfulResponseCodeException, PushNetworkException { switch (responseCode) { + case 403: + throw new IncorrectRegistrationRecoveryPasswordException(); case 404: throw new NoSuchSessionException(); case 409: