Fix local backup v2 restore pre-registration in regV5.

This commit is contained in:
Greyson Parrelli
2026-07-15 13:00:08 -04:00
parent 4f6c1c4647
commit 7a07a96fba
24 changed files with 855 additions and 90 deletions
@@ -26,6 +26,7 @@ import org.signal.core.util.toJson
import org.signal.libsignal.crypto.Aes256Ctr32
import org.thoughtcrime.securesms.backup.LocalExportProgress
import org.thoughtcrime.securesms.backup.v2.BackupRepository
import org.thoughtcrime.securesms.backup.v2.ImportResult
import org.thoughtcrime.securesms.database.AttachmentTable
import org.thoughtcrime.securesms.database.SignalDatabase
import org.thoughtcrime.securesms.keyvalue.SignalStore
@@ -269,13 +270,18 @@ object LocalArchiver {
val mainStreamLength = snapshotFileSystem.mainLength() ?: return ArchiveResult.failure(RestoreFailure.MainStream)
BackupRepository.importLocal(
val importResult = BackupRepository.importLocal(
mainStreamFactory = { snapshotFileSystem.mainInputStream()!! },
mainStreamLength = mainStreamLength,
selfData = selfData,
backupId = backupId,
messageBackupKey = messageBackupKey
)
if (importResult is ImportResult.Failure) {
Log.w(TAG, "Local backup import failed")
return RestoreResult.failure(RestoreFailure.ImportFailed)
}
} finally {
metadataStream?.close()
}
@@ -350,6 +356,7 @@ object LocalArchiver {
data object MainStream : RestoreFailure
data object Cancelled : RestoreFailure
data object BackupIdMissing : RestoreFailure
data object ImportFailed : RestoreFailure
data class VersionMismatch(val backupVersion: Int, val supportedVersion: Int) : RestoreFailure
}
@@ -353,6 +353,16 @@ class AppRegistrationStorageController(private val context: Context) : StorageCo
}
}
override suspend fun verifyLocalBackupKey(backupUri: Uri, aep: AccountEntropyPool): Boolean = withContext(Dispatchers.IO) {
val backupDir = DocumentFile.fromTreeUri(context, backupUri)
if (backupDir == null || !backupDir.canRead()) {
Log.w(TAG, "[verifyLocalBackupKey] Could not open backup directory.")
return@withContext false
}
LocalArchiver.canDecryptMainArchive(SnapshotFileSystem(context, backupDir), aep.deriveMessageBackupKey())
}
override fun restoreLocalBackupV2(rootUri: Uri, backupUri: Uri, aep: AccountEntropyPool): Flow<LocalBackupRestoreProgress> = callbackFlow {
Log.d(TAG, "Starting V2 local backup restore from backup=$backupUri, root=$rootUri")