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 }