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 3d153f77e100233ba1f1cb2036769344a04dcd1f..18e15f0b9a8bbb96ca439f8d494a3544f42fcf71 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 3342b4dc3d11e56ab0a348ff4cc717d461196da9..88e9b5630e6ea69a197f7e5f6738897abaabc1b3 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 6cbca7f00d986569b9932dc58a090485a3a35da9..725b891fb6847cb1913edfd388395a7b4c780a33 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>