Add aditional check if wallet exists with special name
M committed
Jul 14, 2022 at 12:48 UTC
a63c099f26d77c021e843a786fa20b2071230e7e
7 files changed
+45
-28
lib/core/wallet_creation_service.dart
+21
-1
@@ -1,6 +1,8 @@
1
import 'package:cake_wallet/di.dart';
2
+import 'package:cw_core/wallet_info.dart';
3
import 'package:flutter/foundation.dart';
4
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
5
+import 'package:hive/hive.dart';
6
import 'package:shared_preferences/shared_preferences.dart';
7
import 'package:cake_wallet/core/key_service.dart';
8
import 'package:cw_core/wallet_base.dart';
@@ -14,7 +16,8 @@ class WalletCreationService {
16
{WalletType initialType,
17
this.secureStorage,
18
this.keyService,
17
- this.sharedPreferences})
19
+ this.sharedPreferences,
20
+ this.walletInfoSource})
21
: type = initialType {
22
if (type != null) {
23
changeWalletType(type: type);
@@ -25,6 +28,7 @@ class WalletCreationService {
28
final FlutterSecureStorage secureStorage;
29
final SharedPreferences sharedPreferences;
30
final KeyService keyService;
31
+ final Box<WalletInfo> walletInfoSource;
32
WalletService _service;
33
34
void changeWalletType({@required WalletType type}) {
@@ -32,7 +36,21 @@ class WalletCreationService {
36
_service = getIt.get<WalletService>(param1: type);
37
}
38
39
+ bool exists(String name) {
40
+ final walletName = name.toLowerCase();
41
+ return walletInfoSource
42
+ .values
43
+ .any((walletInfo) => walletInfo.name.toLowerCase() == walletName);
44
+ }
45
+
46
+ void checkIfExists(String name) {
47
+ if (exists(name)) {
48
+ throw Exception('Wallet with name ${name} already exists!');
49
+ }
50
+ }
51
+
52
Future<WalletBase> create(WalletCredentials credentials) async {
53
+ checkIfExists(credentials.name);
54
final password = generateWalletPassword(type);
55
credentials.password = password;
56
await keyService.saveWalletPassword(
@@ -41,6 +59,7 @@ class WalletCreationService {
59
}
60
61
Future<WalletBase> restoreFromKeys(WalletCredentials credentials) async {
62
+ checkIfExists(credentials.name);
63
final password = generateWalletPassword(type);
64
credentials.password = password;
65
await keyService.saveWalletPassword(
@@ -49,6 +68,7 @@ class WalletCreationService {
68
}
69
70
Future<WalletBase> restoreFromSeed(WalletCredentials credentials) async {
71
+ checkIfExists(credentials.name);
72
final password = generateWalletPassword(type);
73
credentials.password = password;
74
await keyService.saveWalletPassword(
lib/di.dart
+2
-1
@@ -215,7 +215,8 @@ Future setup(
215
initialType: type,
216
keyService: getIt.get<KeyService>(),
217
secureStorage: getIt.get<FlutterSecureStorage>(),
218
- sharedPreferences: getIt.get<SharedPreferences>()));
218
+ sharedPreferences: getIt.get<SharedPreferences>(),
219
+ walletInfoSource: _walletInfoSource));
220
221
getIt.registerFactoryParam<WalletNewVM, WalletType, void>((type, _) =>
222
WalletNewVM(getIt.get<AppStore>(),
lib/view_model/wallet_creation_vm.dart
+7
-6
@@ -1,3 +1,4 @@
1
+import 'package:cake_wallet/core/wallet_creation_service.dart';
2
import 'package:flutter/foundation.dart';
3
import 'package:hive/hive.dart';
4
import 'package:mobx/mobx.dart';
@@ -15,7 +16,7 @@ part 'wallet_creation_vm.g.dart';
16
class WalletCreationVM = WalletCreationVMBase with _$WalletCreationVM;
17
18
abstract class WalletCreationVMBase with Store {
18
- WalletCreationVMBase(this._appStore, this._walletInfoSource,
19
+ WalletCreationVMBase(this._appStore, this._walletInfoSource, this.walletCreationService,
20
{@required this.type, @required this.isRecovery}) {
21
state = InitialExecutionState();
22
name = '';
@@ -29,14 +30,12 @@ abstract class WalletCreationVMBase with Store {
30
31
WalletType type;
32
final bool isRecovery;
33
+ final WalletCreationService walletCreationService;
34
final Box<WalletInfo> _walletInfoSource;
35
final AppStore _appStore;
36
35
- bool nameExists(String name) {
36
- final walletNameList = _walletInfoSource.values.map((e) => e.name.toLowerCase()).toList();
37
-
38
- return walletNameList.contains(name.toLowerCase());
39
- }
37
+ bool nameExists(String name)
38
+ => walletCreationService.exists(name);
39
40
Future<void> create({dynamic options}) async {
41
try {
@@ -44,6 +43,8 @@ abstract class WalletCreationVMBase with Store {
43
if (name?.isEmpty ?? true) {
44
name = await generateName();
45
}
46
+
47
+ walletCreationService.checkIfExists(name);
48
final dirPath = await pathForWalletDir(name: name, type: type);
49
final path = await pathForWallet(name: name, type: type);
50
final credentials = getCredentials(options);
lib/view_model/wallet_new_vm.dart
+4
-6
@@ -17,19 +17,17 @@ part 'wallet_new_vm.g.dart';
17
class WalletNewVM = WalletNewVMBase with _$WalletNewVM;
18
19
abstract class WalletNewVMBase extends WalletCreationVM with Store {
20
- WalletNewVMBase(AppStore appStore, this._walletCreationService,
20
+ WalletNewVMBase(AppStore appStore, WalletCreationService walletCreationService,
21
Box<WalletInfo> walletInfoSource,
22
{@required WalletType type})
23
: selectedMnemonicLanguage = '',
24
- super(appStore, walletInfoSource, type: type, isRecovery: false);
24
+ super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: false);
25
26
@observable
27
String selectedMnemonicLanguage;
28
29
bool get hasLanguageSelector => type == WalletType.monero || type == WalletType.haven;
30
31
- final WalletCreationService _walletCreationService;
32
-
31
@override
32
WalletCredentials getCredentials(dynamic options) {
33
switch (type) {
@@ -50,7 +48,7 @@ abstract class WalletNewVMBase extends WalletCreationVM with Store {
48
49
@override
50
Future<WalletBase> process(WalletCredentials credentials) async {
53
- _walletCreationService.changeWalletType(type: type);
54
- return _walletCreationService.create(credentials);
51
+ walletCreationService.changeWalletType(type: type);
52
+ return walletCreationService.create(credentials);
53
}
54
}
lib/view_model/wallet_restoration_from_keys_vm.dart
+3
-4
@@ -20,9 +20,9 @@ class WalletRestorationFromKeysVM = WalletRestorationFromKeysVMBase
20
abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM
21
with Store {
22
WalletRestorationFromKeysVMBase(AppStore appStore,
23
- this._walletCreationService, Box<WalletInfo> walletInfoSource,
23
+ WalletCreationService walletCreationService, Box<WalletInfo> walletInfoSource,
24
{@required WalletType type, @required this.language})
25
- : super(appStore, walletInfoSource, type: type, isRecovery: true);
25
+ : super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true);
26
27
@observable
28
int height;
@@ -42,7 +42,6 @@ abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM
42
bool get hasRestorationHeight => type == WalletType.monero;
43
44
final String language;
45
- final WalletCreationService _walletCreationService;
45
46
@override
47
WalletCredentials getCredentials(dynamic options) {
@@ -68,5 +67,5 @@ abstract class WalletRestorationFromKeysVMBase extends WalletCreationVM
67
68
@override
69
Future<WalletBase> process(WalletCredentials credentials) async =>
71
- _walletCreationService.restoreFromKeys(credentials);
70
+ walletCreationService.restoreFromKeys(credentials);
71
}
lib/view_model/wallet_restoration_from_seed_vm.dart
+3
-4
@@ -20,9 +20,9 @@ class WalletRestorationFromSeedVM = WalletRestorationFromSeedVMBase
20
abstract class WalletRestorationFromSeedVMBase extends WalletCreationVM
21
with Store {
22
WalletRestorationFromSeedVMBase(AppStore appStore,
23
- this._walletCreationService, Box<WalletInfo> walletInfoSource,
23
+ WalletCreationService walletCreationService, Box<WalletInfo> walletInfoSource,
24
{@required WalletType type, @required this.language, this.seed})
25
- : super(appStore, walletInfoSource, type: type, isRecovery: true);
25
+ : super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true);
26
27
@observable
28
String seed;
@@ -33,7 +33,6 @@ abstract class WalletRestorationFromSeedVMBase extends WalletCreationVM
33
bool get hasRestorationHeight => type == WalletType.monero;
34
35
final String language;
36
- final WalletCreationService _walletCreationService;
36
37
@override
38
WalletCredentials getCredentials(dynamic options) {
@@ -53,5 +52,5 @@ abstract class WalletRestorationFromSeedVMBase extends WalletCreationVM
52
53
@override
54
Future<WalletBase> process(WalletCredentials credentials) async =>
56
- _walletCreationService.restoreFromSeed(credentials);
55
+ walletCreationService.restoreFromSeed(credentials);
56
}
lib/view_model/wallet_restore_view_model.dart
+5
-6
@@ -22,7 +22,7 @@ class WalletRestoreViewModel = WalletRestoreViewModelBase
22
with _$WalletRestoreViewModel;
23
24
abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
25
- WalletRestoreViewModelBase(AppStore appStore, this._walletCreationService,
25
+ WalletRestoreViewModelBase(AppStore appStore, WalletCreationService walletCreationService,
26
Box<WalletInfo> walletInfoSource,
27
{@required WalletType type})
28
: availableModes = (type == WalletType.monero || type == WalletType.haven)
@@ -30,11 +30,11 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
30
: [WalletRestoreMode.seed],
31
hasSeedLanguageSelector = type == WalletType.monero || type == WalletType.haven,
32
hasBlockchainHeightLanguageSelector = type == WalletType.monero || type == WalletType.haven,
33
- super(appStore, walletInfoSource, type: type, isRecovery: true) {
33
+ super(appStore, walletInfoSource, walletCreationService, type: type, isRecovery: true) {
34
isButtonEnabled =
35
!hasSeedLanguageSelector && !hasBlockchainHeightLanguageSelector;
36
mode = WalletRestoreMode.seed;
37
- _walletCreationService.changeWalletType(type: type);
37
+ walletCreationService.changeWalletType(type: type);
38
}
39
40
static const moneroSeedMnemonicLength = 25;
@@ -44,7 +44,6 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
44
final List<WalletRestoreMode> availableModes;
45
final bool hasSeedLanguageSelector;
46
final bool hasBlockchainHeightLanguageSelector;
47
- final WalletCreationService _walletCreationService;
47
48
@observable
49
WalletRestoreMode mode;
@@ -123,9 +122,9 @@ abstract class WalletRestoreViewModelBase extends WalletCreationVM with Store {
122
@override
123
Future<WalletBase> process(WalletCredentials credentials) async {
124
if (mode == WalletRestoreMode.keys) {
126
- return _walletCreationService.restoreFromKeys(credentials);
125
+ return walletCreationService.restoreFromKeys(credentials);
126
}
127
129
- return _walletCreationService.restoreFromSeed(credentials);
128
+ return walletCreationService.restoreFromSeed(credentials);
129
}
130
}