From 5390e7512e43d2ea59d16d39ab329143d95b303f Mon Sep 17 00:00:00 2001
From: Taras Smakula <tarassmakula@gmail.com>
Date: Wed, 1 Nov 2023 16:53:20 +0200
Subject: [PATCH] Change restore backup

---
 .../restore/RestoreBackupDataSource.kt        | 48 +++++++++----------
 .../pass_phrase/restore/SSSSDataSource.kt     |  2 +-
 auth/src/main/res/values/strings.xml          |  1 +
 3 files changed, 24 insertions(+), 27 deletions(-)

diff --git a/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/RestoreBackupDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/RestoreBackupDataSource.kt
index 3d153f77e..18e15f0b9 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/RestoreBackupDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/RestoreBackupDataSource.kt
@@ -10,12 +10,11 @@ import org.futo.circles.auth.feature.cross_signing.CrossSigningDataSource
 import org.futo.circles.auth.model.KeyData
 import org.futo.circles.core.model.LoadingData
 import org.futo.circles.core.provider.MatrixSessionProvider
+import org.matrix.android.sdk.api.extensions.tryOrNull
 import org.matrix.android.sdk.api.listeners.StepProgressListener
-import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupLastVersionResult
+import org.matrix.android.sdk.api.session.crypto.keysbackup.BackupRecoveryKey
 import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysBackupService
-import org.matrix.android.sdk.api.session.crypto.keysbackup.KeysVersionResult
 import org.matrix.android.sdk.api.session.crypto.keysbackup.toKeysVersionResult
-import org.matrix.android.sdk.api.util.awaitCallback
 import javax.inject.Inject
 
 class RestoreBackupDataSource @Inject constructor(
@@ -59,6 +58,17 @@ class RestoreBackupDataSource @Inject constructor(
                         )
                     )
                 }
+
+                is StepProgressListener.Step.DecryptingKey -> {
+                    loadingLiveData.postValue(
+                        LoadingData(
+                            R.string.decrypting_key,
+                            step.progress,
+                            step.total,
+                            true
+                        )
+                    )
+                }
             }
         }
     }
@@ -102,18 +112,15 @@ class RestoreBackupDataSource @Inject constructor(
         val keysBackupService = getKeysBackupService()
         try {
             val keyVersion = getKeysVersion(keysBackupService)
-            awaitCallback {
-                keysBackupService.restoreKeysWithRecoveryKey(
-                    keyVersion,
-                    keyData.recoveryKey,
-                    null,
-                    MatrixSessionProvider.currentSession?.myUserId,
-                    progressObserver,
-                    it
-                )
-            }
+            keysBackupService.restoreKeysWithRecoveryKey(
+                keyVersion,
+                BackupRecoveryKey.fromBase64(keyData.recoveryKey),
+                null,
+                MatrixSessionProvider.currentSession?.myUserId,
+                progressObserver
+            )
             crossSigningDataSource.configureCrossSigning(keyData.keySpec)
-            trustOnDecrypt(keysBackupService, keyVersion)
+            keysBackupService.trustKeysBackupVersion(keyVersion, true)
         } catch (e: Throwable) {
             loadingLiveData.postValue(LoadingData(isLoading = false))
             throw e
@@ -155,21 +162,10 @@ class RestoreBackupDataSource @Inject constructor(
             ?: throw Exception(context.getString(R.string.backup_could_not_be_decrypted_with_key))
     }
 
-    private suspend fun trustOnDecrypt(
-        keysBackup: KeysBackupService,
-        keysVersionResult: KeysVersionResult
-    ) {
-        awaitCallback {
-            keysBackup.trustKeysBackupVersion(keysVersionResult, true, it)
-        }
-    }
-
     private fun getKeysBackupService() =
         MatrixSessionProvider.getSessionOrThrow().cryptoService().keysBackupService()
 
     private suspend fun getKeysVersion(keysBackupService: KeysBackupService) =
-        awaitCallback<KeysBackupLastVersionResult> {
-            keysBackupService.getCurrentVersion(it)
-        }.toKeysVersionResult()
+        tryOrNull { keysBackupService.getCurrentVersion() }?.toKeysVersionResult()
             ?: throw Exception(context.getString(R.string.failed_to_get_restore_keys_version))
 }
\ No newline at end of file
diff --git a/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/SSSSDataSource.kt b/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/SSSSDataSource.kt
index 3342b4dc3..88e9b5630 100644
--- a/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/SSSSDataSource.kt
+++ b/auth/src/main/java/org/futo/circles/auth/feature/pass_phrase/restore/SSSSDataSource.kt
@@ -48,7 +48,7 @@ class SSSSDataSource @Inject constructor() {
 
     suspend fun replaceBsSpeke4SKey() {
         val recoveryKey = MatrixSessionProvider.getSessionOrThrow()
-            .cryptoService().keysBackupService().getKeyBackupRecoveryKeyInfo()?.recoveryKey
+            .cryptoService().keysBackupService().getKeyBackupRecoveryKeyInfo()?.recoveryKey?.toBase64()
             ?: throw Exception("Recovery Key not found")
         val secret = extractCurveKeyFromRecoveryKey(recoveryKey)
             ?: throw Exception("Can not get secret from recovery key")
diff --git a/auth/src/main/res/values/strings.xml b/auth/src/main/res/values/strings.xml
index 6cbca7f00..725b891fb 100644
--- a/auth/src/main/res/values/strings.xml
+++ b/auth/src/main/res/values/strings.xml
@@ -48,6 +48,7 @@
     <string name="computing_recovery_key">Computing recovery key.</string>
     <string name="downloading_keys">Downloading keys.</string>
     <string name="importing_keys">Importing keys.</string>
+    <string name="decrypting_key">Decrypting key.</string>
     <string name="failed_to_get_restore_keys_version">Failed to get latest restore keys version.</string>
     <string name="discard_current_registration_progress">Discard current registration progress?</string>
     <string name="domain">Domain</string>
-- 
GitLab