Added backups for monero wallet files.

M committed Jul 6, 2021 at 13:51 UTC 1e3b53d2cf2dcaf3f2786d430d2497dcb25a2637
3 files changed +94 -12
lib/monero/monero_wallet.dart
+2
@@ -3,6 +3,7 @@ import 'package:cake_wallet/entities/transaction_priority.dart';
3 import 'package:cake_wallet/monero/monero_amount_format.dart';
4 import 'package:cake_wallet/monero/monero_transaction_creation_exception.dart';
5 import 'package:cake_wallet/monero/monero_transaction_info.dart';
6 +import 'package:cake_wallet/monero/monero_wallet_utils.dart';
7 import 'package:flutter/foundation.dart';
8 import 'package:mobx/mobx.dart';
9 import 'package:cw_monero/transaction_history.dart'
@@ -246,6 +247,7 @@ abstract class MoneroWalletBase extends WalletBase<MoneroBalance,
247
248 _lastSaveTimestamp = now;
249 await monero_wallet.store();
250 + await backupWalletFiles(name);
251 }
252
253 Future<int> getNodeHeight() async => monero_wallet.getNodeHeight();
lib/monero/monero_wallet_service.dart
+4 -12
@@ -1,5 +1,6 @@
1 import 'dart:io';
2 import 'package:cake_wallet/core/wallet_base.dart';
3 +import 'package:cake_wallet/monero/monero_wallet_utils.dart';
4 import 'package:hive/hive.dart';
5 import 'package:cw_monero/wallet_manager.dart' as monero_wallet_manager;
6 import 'package:cw_monero/wallet.dart' as monero_wallet;
@@ -55,16 +56,7 @@ class MoneroWalletService extends WalletService<
56 MoneroWalletService(this.walletInfoSource);
57
58 final Box<WalletInfo> walletInfoSource;
58 -
59 - static Future<void> _removeCache(String name) async {
60 - final path = await pathForWallet(name: name, type: WalletType.monero);
61 - final cacheFile = File(path);
62 -
63 - if (cacheFile.existsSync()) {
64 - cacheFile.deleteSync();
65 - }
66 - }
67 -
59 +
60 static bool walletFilesExist(String path) =>
61 !File(path).existsSync() && !File('$path.keys').existsSync();
62
@@ -120,7 +112,7 @@ class MoneroWalletService extends WalletService<
112 final isValid = wallet.validate();
113
114 if (!isValid) {
123 - await _removeCache(name);
115 + await restoreOrResetWalletFiles(name);
116 wallet.close();
117 return openWallet(name, password);
118 }
@@ -135,7 +127,7 @@ class MoneroWalletService extends WalletService<
127 (e is WalletOpeningException &&
128 (e.message == 'std::bad_alloc' ||
129 e.message.contains('bad_alloc')))) {
138 - await _removeCache(name);
130 + await restoreOrResetWalletFiles(name);
131 return openWallet(name, password);
132 }
133
lib/monero/monero_wallet_utils.dart new
+88
@@ -0,0 +1,88 @@
1 +import 'dart:io';
2 +import 'package:cake_wallet/entities/pathForWallet.dart';
3 +import 'package:cake_wallet/entities/wallet_type.dart';
4 +
5 +String backupFileName(String originalPath) {
6 + final pathParts = originalPath.split('/');
7 + final newName = '#_${pathParts.last}';
8 + pathParts.removeLast();
9 + pathParts.add(newName);
10 + return pathParts.join('/');
11 +}
12 +
13 +Future<void> backupWalletFiles(String name) async {
14 + final path = await pathForWallet(name: name, type: WalletType.monero);
15 + final cacheFile = File(path);
16 + final keysFile = File('$path.keys');
17 + final addressListFile = File('$path.address.txt');
18 + final newCacheFilePath = backupFileName(cacheFile.path);
19 + final newKeysFilePath = backupFileName(keysFile.path);
20 + final newAddressListFilePath = backupFileName(addressListFile.path);
21 +
22 + if (cacheFile.existsSync()) {
23 + await cacheFile.copy(newCacheFilePath);
24 + }
25 +
26 + if (keysFile.existsSync()) {
27 + await keysFile.copy(newKeysFilePath);
28 + }
29 +
30 + if (addressListFile.existsSync()) {
31 + await addressListFile.copy(newAddressListFilePath);
32 + }
33 +}
34 +
35 +Future<void> restoreWalletFiles(String name) async {
36 + final walletDirPath = await pathForWalletDir(name: name, type: WalletType.monero);
37 + final cacheFilePath = '$walletDirPath/$name';
38 + final keysFilePath = '$walletDirPath/$name.keys';
39 + final addressListFilePath = '$walletDirPath/$name.address.txt';
40 + final backupCacheFile = File(backupFileName(cacheFilePath));
41 + final backupKeysFile = File(backupFileName(keysFilePath));
42 + final backupAddressListFile = File(backupFileName(addressListFilePath));
43 +
44 + if (backupCacheFile.existsSync()) {
45 + await backupCacheFile.copy(cacheFilePath);
46 + }
47 +
48 + if (backupKeysFile.existsSync()) {
49 + await backupKeysFile.copy(keysFilePath);
50 + }
51 +
52 + if (backupAddressListFile.existsSync()) {
53 + await backupAddressListFile.copy(addressListFilePath);
54 + }
55 +}
56 +
57 +Future<bool> backupWalletFilesExists(String name) async {
58 + final walletDirPath = await pathForWalletDir(name: name, type: WalletType.monero);
59 + final cacheFilePath = '$walletDirPath/$name';
60 + final keysFilePath = '$walletDirPath/$name.keys';
61 + final addressListFilePath = '$walletDirPath/$name.address.txt';
62 + final backupCacheFile = File(backupFileName(cacheFilePath));
63 + final backupKeysFile = File(backupFileName(keysFilePath));
64 + final backupAddressListFile = File(backupFileName(addressListFilePath));
65 +
66 + return backupCacheFile.existsSync()
67 + && backupKeysFile.existsSync()
68 + && backupAddressListFile.existsSync();
69 +}
70 +
71 +Future<void> removeCache(String name) async {
72 + final path = await pathForWallet(name: name, type: WalletType.monero);
73 + final cacheFile = File(path);
74 +
75 + if (cacheFile.existsSync()) {
76 + cacheFile.deleteSync();
77 + }
78 +}
79 +
80 +Future<void> restoreOrResetWalletFiles(String name) async {
81 + final backupsExists = await backupWalletFilesExists(name);
82 +
83 + if (backupsExists) {
84 + await restoreWalletFiles(name);
85 + }
86 +
87 + removeCache(name);
88 +}
\ No newline at end of file