diff --git a/lib/core/backup_service.dart b/lib/core/backup_service.dart index 6a0f668792..1c24f6c115 100644 --- a/lib/core/backup_service.dart +++ b/lib/core/backup_service.dart @@ -22,6 +22,7 @@ import 'package:cw_core/wallet_info.dart'; import 'package:cake_wallet/.secrets.g.dart' as secrets; import 'package:cake_wallet/wallet_types.g.dart'; import 'package:cake_backup/backup.dart' as cake_backup; +import 'package:path/path.dart' as path; class $BackupService { $BackupService(this._secureStorage, this.transactionDescriptionBox, @@ -338,4 +339,11 @@ class $BackupService { Future decryptV2(Uint8List data, String passphrase) async => cake_backup.decrypt(passphrase, data); + + Future getRestoreTempDir() async { + final appDir = await getAppDir(); + final dir = Directory(path.join(appDir.path, '~_RESTORE_TMP')); + if (!dir.existsSync()) dir.createSync(recursive: true); + return dir; + } } diff --git a/lib/core/backup_service_v3.dart b/lib/core/backup_service_v3.dart index ac73f9b3ad..cf1c5685a3 100644 --- a/lib/core/backup_service_v3.dart +++ b/lib/core/backup_service_v3.dart @@ -236,11 +236,16 @@ class BackupServiceV3 extends $BackupService { throw Exception('Invalid v3 backup: missing data.bin'); } final dataStream = dataFile.rawContent!.getStream(); - - final decryptedData = File('${file.path}_decrypted'); // decrypted zip file - if (decryptedData.existsSync()) { - decryptedData.deleteSync(); - } + + final tmpDir = await getRestoreTempDir(); + if (!tmpDir.existsSync()) tmpDir.createSync(recursive: true); + + final decryptedData = File('${tmpDir.path}/data_decrypted.zip'); + + // pre-clean + if (decryptedData.existsSync()) decryptedData.deleteSync(); + + try { decryptedData.createSync(recursive: true); decryptedData.writeAsBytesSync(Uint8List(0), mode: FileMode.write, flush: true); @@ -314,6 +319,12 @@ class BackupServiceV3 extends $BackupService { // Delete decrypted data file decryptedData.deleteSync(); + } finally { + // always clean, even on exception + if (decryptedData.existsSync()) { + decryptedData.deleteSync(); + } + } } Future verifyHardwareWallets(String password,