From bdeb5aa96afab05bb68c88d573349cd890b4f6a8 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 31 Jul 2025 13:11:36 -0300 Subject: [PATCH] Retry deletion job on verification failure. --- .../securesms/jobs/BackupDeleteJob.kt | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupDeleteJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupDeleteJob.kt index 078b650071..f291bc01e4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupDeleteJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/BackupDeleteJob.kt @@ -52,6 +52,16 @@ class BackupDeleteJob private constructor( override fun getFactoryKey(): String = KEY override fun run(): Result { + val result = doRun() + + if (result.isFailure) { + clearLocalBackupStateOnFailure() + } + + return result + } + + private fun doRun(): Result { if (SignalStore.backup.deletionState.isIdle()) { Log.w(TAG, "Invalid state ${SignalStore.backup.deletionState}. Exiting.") return Result.failure() @@ -212,7 +222,7 @@ class BackupDeleteJob private constructor( private fun deleteLocalState(): Result { if (backupDeleteJobData.completed.contains(BackupDeleteJobData.Stage.CLEAR_LOCAL_STATE)) { - Log.d(TAG, "Already deleted messages.") + Log.d(TAG, "Already cleared local backup state.") return Result.success() } @@ -232,13 +242,27 @@ class BackupDeleteJob private constructor( ).build() Log.d(TAG, "Clearing local backup state.") + clearLocalBackupState() + addStageToCompletions(BackupDeleteJobData.Stage.CLEAR_LOCAL_STATE) + return Result.success() + } + + private fun clearLocalBackupStateOnFailure() { + if (backupDeleteJobData.completed.contains(BackupDeleteJobData.Stage.CLEAR_LOCAL_STATE)) { + Log.d(TAG, "[onFailure] Already cleared local backup state.") + return + } + + Log.d(TAG, "[onFailure] Clearing local backup state.") + clearLocalBackupState() + } + + private fun clearLocalBackupState() { SignalStore.backup.disableBackups() SignalDatabase.recipients.markNeedsSync(Recipient.self().id) StorageSyncHelper.scheduleSyncForDataChange() SignalDatabase.attachments.clearAllArchiveData() SignalStore.backup.optimizeStorage = false - addStageToCompletions(BackupDeleteJobData.Stage.CLEAR_LOCAL_STATE) - return Result.success() } private fun addStageToCompletions(stage: BackupDeleteJobData.Stage) { @@ -250,6 +274,11 @@ class BackupDeleteJob private constructor( private fun handleNetworkError(networkResult: NetworkResult): Result { Log.d(TAG, "An error occurred.", networkResult.getCause()) + if (networkResult.getCause() is org.signal.libsignal.zkgroup.VerificationFailedException) { + Log.i(TAG, "ZK Verification failed. Retrying.") + return Result.retry(defaultBackoff()) + } + return when (networkResult) { is NetworkResult.ApplicationError<*> -> (networkResult.getCause() as? RuntimeException)?.let { Result.fatalFailure(it) } ?: Result.failure() is NetworkResult.NetworkError<*> -> Result.retry(defaultBackoff())