From e4cc7f518100b7c417d4ce251564515e998690eb Mon Sep 17 00:00:00 2001 From: Nicholas Date: Fri, 6 Jan 2023 19:04:29 -0500 Subject: [PATCH] Attempt to Skip PIN Entry on Re-Registration. --- .../registration/VerifyAccountRepository.kt | 16 ++++++++---- .../viewmodel/BaseRegistrationViewModel.java | 8 ++++-- .../viewmodel/RegistrationViewModel.java | 26 +++++++++++++++++-- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt index 4399afb0e1..f92638ea80 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt @@ -7,9 +7,7 @@ import org.signal.core.util.logging.Log import org.thoughtcrime.securesms.AppCapabilities import org.thoughtcrime.securesms.gcm.FcmUtil import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.pin.KbsRepository import org.thoughtcrime.securesms.pin.KeyBackupSystemWrongPinException -import org.thoughtcrime.securesms.pin.TokenData import org.thoughtcrime.securesms.push.AccountManagerFactory import org.thoughtcrime.securesms.util.TextSecurePreferences import org.whispersystems.signalservice.api.KbsPinData @@ -77,7 +75,11 @@ class VerifyAccountRepository(private val context: Application) { }.subscribeOn(Schedulers.io()) } - fun verifyAccountWithPin(registrationData: RegistrationData, pin: String, tokenData: TokenData): Single> { + fun verifyAccountWithReregistrationData(registrationData: RegistrationData, kbsPinDataProducer: KbsPinDataProducer): Single> { + return verifyAccountWithPin(registrationData, "", kbsPinDataProducer) + } + + fun verifyAccountWithPin(registrationData: RegistrationData, pin: String, kbsPinDataProducer: KbsPinDataProducer): Single> { val universalUnidentifiedAccess: Boolean = TextSecurePreferences.isUniversalUnidentifiedAccess(context) val unidentifiedAccessKey: ByteArray = UnidentifiedAccess.deriveAccessKeyFrom(registrationData.profileKey) @@ -90,7 +92,7 @@ class VerifyAccountRepository(private val context: Application) { return Single.fromCallable { try { - val kbsData: KbsPinData = KbsRepository.restoreMasterKey(pin, tokenData.enclave, tokenData.basicAuth, tokenData.tokenResponse)!! + val kbsData = kbsPinDataProducer.produceKbsPinData() val registrationLockV2: String = kbsData.masterKey.deriveRegistrationLock() val response: ServiceResponse = accountManager.verifyAccountWithRegistrationLockPin( @@ -115,6 +117,11 @@ class VerifyAccountRepository(private val context: Application) { }.subscribeOn(Schedulers.io()) } + interface KbsPinDataProducer { + @Throws(IOException::class, KeyBackupSystemWrongPinException::class, KeyBackupSystemNoDataException::class) + fun produceKbsPinData(): KbsPinData + } + enum class Mode(val isSmsRetrieverSupported: Boolean) { SMS_WITH_LISTENER(true), SMS_WITHOUT_LISTENER(false), @@ -125,5 +132,4 @@ class VerifyAccountRepository(private val context: Application) { private val TAG = Log.tag(VerifyAccountRepository::class.java) private val PUSH_REQUEST_TIMEOUT = TimeUnit.SECONDS.toMillis(5) } - } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java index 08a18ffa12..055c80fa87 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/viewmodel/BaseRegistrationViewModel.java @@ -205,8 +205,12 @@ public abstract class BaseRegistrationViewModel extends ViewModel { onVerificationCodeEntered(code); return verifyAccountWithoutRegistrationLock() - .map(VerifyResponseWithoutKbs::new) - .flatMap(processor -> { + .flatMap(response -> { + if (response.getResult().isPresent() && response.getResult().get().getKbsData() != null) { + return onVerifySuccessWithRegistrationLock(new VerifyResponseWithRegistrationLockProcessor(response, null), response.getResult().get().getPin()); + } + + VerifyResponseProcessor processor = new VerifyResponseWithoutKbs(response); if (processor.hasResult()) { return onVerifySuccess(processor); } else if (processor.registrationLock() && !processor.isKbsLocked()) { 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 9c57eb136f..0d4396c279 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 @@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModel; import androidx.savedstate.SavedStateRegistryOwner; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.pin.KbsRepository; import org.thoughtcrime.securesms.pin.TokenData; import org.thoughtcrime.securesms.registration.RegistrationData; @@ -20,8 +21,11 @@ import org.thoughtcrime.securesms.registration.VerifyResponseProcessor; import org.thoughtcrime.securesms.registration.VerifyResponseWithRegistrationLockProcessor; import org.thoughtcrime.securesms.registration.VerifyResponseWithoutKbs; import org.thoughtcrime.securesms.util.Util; +import org.whispersystems.signalservice.api.KbsPinData; import org.whispersystems.signalservice.internal.ServiceResponse; +import java.util.Objects; + import io.reactivex.rxjava3.core.Single; public final class RegistrationViewModel extends BaseRegistrationViewModel { @@ -104,12 +108,30 @@ public final class RegistrationViewModel extends BaseRegistrationViewModel { @Override protected Single> verifyAccountWithoutRegistrationLock() { - return verifyAccountRepository.verifyAccount(getRegistrationData()); + return verifyAccountRepository.verifyAccount(getRegistrationData()) + .flatMap(verifyAccountWithoutKbsResponse -> { + VerifyResponseProcessor processor = new VerifyResponseWithoutKbs(verifyAccountWithoutKbsResponse); + + if (processor.registrationLock() && SignalStore.kbsValues().getRegistrationLockToken() != null) { + KbsPinData pinData = new KbsPinData(SignalStore.kbsValues().getOrCreateMasterKey(), SignalStore.kbsValues().getRegistrationLockTokenResponse()); + + return verifyAccountRepository.verifyAccountWithReregistrationData(getRegistrationData(), () -> pinData) + .map(verifyAccountWithPinResponse -> { + if (verifyAccountWithPinResponse.getResult().isPresent() && verifyAccountWithPinResponse.getResult().get().getKbsData() != null) { + return verifyAccountWithPinResponse; + } else { + return verifyAccountWithoutKbsResponse; + } + }); + } else { + return Single.just(verifyAccountWithoutKbsResponse); + } + }); } @Override protected Single> verifyAccountWithRegistrationLock(@NonNull String pin, @NonNull TokenData kbsTokenData) { - return verifyAccountRepository.verifyAccountWithPin(getRegistrationData(), pin, kbsTokenData); + return verifyAccountRepository.verifyAccountWithPin(getRegistrationData(), pin, () -> Objects.requireNonNull(KbsRepository.restoreMasterKey(pin, kbsTokenData.getEnclave(), kbsTokenData.getBasicAuth(), kbsTokenData.getTokenResponse()))); } @Override