mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-08-06 05:14:50 +01:00
Fix restoration of PIN during remote restore in regV5.
This commit is contained in:
committed by
Michelle Tang
parent
c4faafa9ae
commit
4a0325ea55
@@ -1250,6 +1250,7 @@ object BackupRepository {
|
||||
return ImportResult.Failure
|
||||
}
|
||||
SignalStore.backup.hasInvalidBackupVersion = false
|
||||
val selfId: RecipientId
|
||||
|
||||
var transactionSuccessful = false
|
||||
try {
|
||||
@@ -1321,7 +1322,7 @@ object BackupRepository {
|
||||
SignalStore.backup.mediaRootBackupKey = mediaRootBackupKey
|
||||
|
||||
// Add back self after clearing data
|
||||
val selfId: RecipientId = SignalDatabase.recipients.getAndPossiblyMerge(selfData.aci, selfData.pni, selfData.e164, pniVerified = true, changeSelf = true)
|
||||
selfId = SignalDatabase.recipients.getAndPossiblyMerge(selfData.aci, selfData.pni, selfData.e164, pniVerified = true, changeSelf = true)
|
||||
SignalDatabase.recipients.setProfileKey(selfId, selfData.profileKey)
|
||||
SignalDatabase.recipients.setProfileSharing(selfId, true)
|
||||
|
||||
@@ -1532,7 +1533,7 @@ object BackupRepository {
|
||||
Log.d(TAG, "[import] Finished! ${eventTimer.stop().summary}")
|
||||
stopwatch.stop(TAG)
|
||||
|
||||
return ImportResult.Success(backupTime = header.backupTimeMs)
|
||||
return ImportResult.Success(backupTime = header.backupTimeMs, selfRecipientId = selfId)
|
||||
}
|
||||
|
||||
fun listRemoteMediaObjects(limit: Int, cursor: String? = null): NetworkResult<ArchiveGetMediaItemsResponse> {
|
||||
@@ -2310,16 +2311,20 @@ object BackupRepository {
|
||||
forwardSecrecyToken = forwardSecrecyToken,
|
||||
cancellationSignal = cancellationSignal
|
||||
)
|
||||
if (result == ImportResult.Failure) {
|
||||
Log.w(TAG, "[remoteRestore] Failed to import backup")
|
||||
return RemoteRestoreResult.Failure
|
||||
|
||||
return when (result) {
|
||||
is ImportResult.Failure -> {
|
||||
Log.w(TAG, "[remoteRestore] Failed to import backup")
|
||||
RemoteRestoreResult.Failure
|
||||
}
|
||||
|
||||
is ImportResult.Success -> {
|
||||
Log.i(TAG, "[remoteRestore] Restore successful")
|
||||
BackupMediaRestoreService.resetTimeout()
|
||||
AppDependencies.jobManager.add(BackupRestoreMediaJob())
|
||||
RemoteRestoreResult.Success(result.selfRecipientId)
|
||||
}
|
||||
}
|
||||
|
||||
BackupMediaRestoreService.resetTimeout()
|
||||
AppDependencies.jobManager.add(BackupRestoreMediaJob())
|
||||
|
||||
Log.i(TAG, "[remoteRestore] Restore successful")
|
||||
return RemoteRestoreResult.Success
|
||||
}
|
||||
|
||||
suspend fun restoreLinkAndSyncBackup(response: TransferArchiveResponse, ephemeralBackupKey: MessageBackupKey): RemoteRestoreResult {
|
||||
@@ -2392,16 +2397,19 @@ object BackupRepository {
|
||||
cancellationSignal = cancellationSignal
|
||||
)
|
||||
|
||||
if (result == ImportResult.Failure) {
|
||||
Log.w(TAG, "[restoreLinkAndSyncBackup] Failed to import backup")
|
||||
return RemoteRestoreResult.Failure
|
||||
return when (result) {
|
||||
is ImportResult.Failure -> {
|
||||
Log.w(TAG, "[restoreLinkAndSyncBackup] Failed to import backup")
|
||||
RemoteRestoreResult.Failure
|
||||
}
|
||||
|
||||
is ImportResult.Success -> {
|
||||
Log.i(TAG, "[restoreLinkAndSyncBackup] Restore successful")
|
||||
BackupMediaRestoreService.resetTimeout()
|
||||
AppDependencies.jobManager.add(BackupRestoreMediaJob())
|
||||
RemoteRestoreResult.Success(result.selfRecipientId)
|
||||
}
|
||||
}
|
||||
|
||||
BackupMediaRestoreService.resetTimeout()
|
||||
AppDependencies.jobManager.add(BackupRestoreMediaJob())
|
||||
|
||||
Log.i(TAG, "[restoreLinkAndSyncBackup] Restore successful")
|
||||
return RemoteRestoreResult.Success
|
||||
}
|
||||
|
||||
private fun buildDebugInfo(): ByteString {
|
||||
@@ -2531,12 +2539,12 @@ data class StagedBackupKeyRotations(
|
||||
)
|
||||
|
||||
sealed class ImportResult {
|
||||
data class Success(val backupTime: Long) : ImportResult()
|
||||
data class Success(val backupTime: Long, val selfRecipientId: RecipientId) : ImportResult()
|
||||
data object Failure : ImportResult()
|
||||
}
|
||||
|
||||
sealed interface RemoteRestoreResult {
|
||||
data object Success : RemoteRestoreResult
|
||||
data class Success(val selfRecipientId: RecipientId) : RemoteRestoreResult
|
||||
data object NetworkError : RemoteRestoreResult
|
||||
data object Canceled : RemoteRestoreResult
|
||||
data object Failure : RemoteRestoreResult
|
||||
|
||||
+1
-1
@@ -336,7 +336,7 @@ class InternalBackupPlaygroundViewModel : ViewModel() {
|
||||
|
||||
viewModelScope.launch {
|
||||
when (val result = BackupRepository.restoreRemoteBackup()) {
|
||||
RemoteRestoreResult.Success -> {
|
||||
is RemoteRestoreResult.Success -> {
|
||||
_state.value = _state.value.copy(statusMessage = "Import complete!")
|
||||
ThreadUtil.runOnMain { afterDbRestoreCallback() }
|
||||
}
|
||||
|
||||
+1
-1
@@ -118,7 +118,7 @@ class RemoteRestoreViewModel(isOnlyRestoreOption: Boolean) : ViewModel() {
|
||||
QuickRegistrationRepository.setRestoreMethodForOldDevice(RestoreMethod.REMOTE_BACKUP)
|
||||
|
||||
when (val result = BackupRepository.restoreRemoteBackup()) {
|
||||
RemoteRestoreResult.Success -> {
|
||||
is RemoteRestoreResult.Success -> {
|
||||
Log.i(TAG, "Restore successful", true)
|
||||
SignalStore.registration.restoreDecisionState = RestoreDecisionState.Completed
|
||||
|
||||
|
||||
+10
-4
@@ -30,6 +30,7 @@ import org.signal.core.util.Result
|
||||
import org.signal.core.util.StreamUtil
|
||||
import org.signal.core.util.crypto.AttachmentSecretProvider
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.libsignal.zkgroup.profiles.ProfileKey
|
||||
import org.signal.registration.PreExistingRegistrationData
|
||||
import org.signal.registration.RestoreDecision
|
||||
import org.signal.registration.StorageController
|
||||
@@ -446,9 +447,14 @@ class AppRegistrationStorageController(private val context: Context) : StorageCo
|
||||
|
||||
launch(Dispatchers.IO) {
|
||||
try {
|
||||
when (BackupRepository.restoreRemoteBackup()) {
|
||||
RemoteRestoreResult.Success -> {
|
||||
send(RemoteBackupRestoreProgress.Complete)
|
||||
when (val result = BackupRepository.restoreRemoteBackup()) {
|
||||
is RemoteRestoreResult.Success -> {
|
||||
send(
|
||||
RemoteBackupRestoreProgress.Complete(
|
||||
restoredSvrPin = SignalStore.svr.pin,
|
||||
restoredProfileKey = SignalDatabase.recipients.getRecord(result.selfRecipientId).profileKey?.let { ProfileKey(it) }
|
||||
)
|
||||
)
|
||||
}
|
||||
RemoteRestoreResult.NetworkError -> {
|
||||
send(RemoteBackupRestoreProgress.NetworkError())
|
||||
@@ -507,7 +513,7 @@ class AppRegistrationStorageController(private val context: Context) : StorageCo
|
||||
launch(Dispatchers.IO) {
|
||||
try {
|
||||
when (val result = BackupRepository.restoreLinkAndSyncBackup(TransferArchiveResponse(cdn = cdn, key = key), MessageBackupKey(ephemeralBackupKeyBytes))) {
|
||||
RemoteRestoreResult.Success -> send(LinkAndSyncProgress.Complete)
|
||||
is RemoteRestoreResult.Success -> send(LinkAndSyncProgress.Complete)
|
||||
RemoteRestoreResult.Canceled -> Log.i(TAG, "[restoreLinkAndSyncBackup] Restore canceled.")
|
||||
else -> {
|
||||
Log.w(TAG, "[restoreLinkAndSyncBackup] Link-and-sync restore did not succeed: $result")
|
||||
|
||||
Reference in New Issue
Block a user