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