From 721b70b7b7a6283a9711f07c1d0718a336519bbf Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Thu, 10 Apr 2025 09:34:07 -0400 Subject: [PATCH] Fallback to local reglock data if available when registering a previously verified session. --- .../registration/ui/RegistrationViewModel.kt | 33 ++++++++++++------- .../ui/RegistrationViewModel.kt | 33 ++++++++++++------- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt index bcdfa5c5cb..bc5c528b37 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/ui/RegistrationViewModel.kt @@ -833,22 +833,31 @@ class RegistrationViewModel : ViewModel() { private suspend fun registerVerifiedSession(context: Context, sessionId: String) { Log.v(TAG, "registerVerifiedSession()") val registrationData = getRegistrationData() - val registrationResult: RegisterAccountResult = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData, recoveryPassword = null) + var result: RegisterAccountResult = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData, recoveryPassword = null) - val reglockEnabled = if (registrationResult is RegisterAccountResult.RegistrationLocked) { - Log.i(TAG, "Received a registration lock response when trying to register verified session. Retrying with master key.") - store.update { - it.copy( - svr2AuthCredentials = registrationResult.svr2Credentials, - svr3AuthCredentials = registrationResult.svr3Credentials - ) + val reglockEnabled = result is RegisterAccountResult.RegistrationLocked + + if (reglockEnabled) { + Log.i(TAG, "Registration lock response received.") + store.update { it.copy(lockedTimeRemaining = result.timeRemaining) } + + if (SignalStore.svr.registrationLockToken != null) { + Log.d(TAG, "Retrying registration with stored credentials.") + result = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData, recoveryPassword = null, pin = SignalStore.svr.pin) { SignalStore.svr.masterKey } + } + + if (result is RegisterAccountResult.RegistrationLocked && (result.svr2Credentials != null || result.svr3Credentials != null)) { + Log.i(TAG, "Saving registration lock received credentials (svr2: ${result.svr2Credentials != null}, svr3: ${result.svr3Credentials != null}).") + store.update { + it.copy( + svr2AuthCredentials = result.svr2Credentials, + svr3AuthCredentials = result.svr3Credentials + ) + } } - true - } else { - false } - handleRegistrationResult(context, registrationData, registrationResult, reglockEnabled) + handleRegistrationResult(context, registrationData, result, reglockEnabled) } private suspend fun onSuccessfulRegistration(context: Context, registrationData: RegistrationData, remoteResult: AccountRegistrationResult, reglockEnabled: Boolean) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/RegistrationViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/RegistrationViewModel.kt index 56602a7d93..3cce5a5dd1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/RegistrationViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registrationv3/ui/RegistrationViewModel.kt @@ -855,22 +855,31 @@ class RegistrationViewModel : ViewModel() { private suspend fun registerVerifiedSession(context: Context, sessionId: String) { Log.v(TAG, "registerVerifiedSession()") val registrationData = getRegistrationData() - val registrationResult: RegisterAccountResult = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData) + var result: RegisterAccountResult = RegistrationRepository.registerAccount(context = context, sessionId = sessionId, registrationData = registrationData) - val reglockEnabled = if (registrationResult is RegisterAccountResult.RegistrationLocked) { - Log.i(TAG, "Received a registration lock response when trying to register verified session. Retrying with master key.") - store.update { - it.copy( - svr2AuthCredentials = registrationResult.svr2Credentials, - svr3AuthCredentials = registrationResult.svr3Credentials - ) + val reglockEnabled = result is RegisterAccountResult.RegistrationLocked + + if (reglockEnabled) { + Log.i(TAG, "Registration lock response received.") + store.update { it.copy(lockedTimeRemaining = result.timeRemaining) } + + if (SignalStore.svr.registrationLockToken != null) { + Log.d(TAG, "Retrying registration with stored credentials.") + result = RegistrationRepository.registerAccount(context, sessionId, registrationData, SignalStore.svr.pin) { SignalStore.svr.masterKey } + } + + if (result is RegisterAccountResult.RegistrationLocked && (result.svr2Credentials != null || result.svr3Credentials != null)) { + Log.i(TAG, "Saving registration lock received credentials (svr2: ${result.svr2Credentials != null}, svr3: ${result.svr3Credentials != null}).") + store.update { + it.copy( + svr2AuthCredentials = result.svr2Credentials, + svr3AuthCredentials = result.svr3Credentials + ) + } } - true - } else { - false } - handleRegistrationResult(context, registrationData, registrationResult, reglockEnabled) + handleRegistrationResult(context, registrationData, result, reglockEnabled) } private suspend fun onSuccessfulRegistration(context: Context, registrationData: RegistrationData, remoteResult: AccountRegistrationResult, reglockEnabled: Boolean) = withContext(Dispatchers.IO) {