dev
dart 88 lines 2.27 KB
Raw
1 import 'package:cake_wallet/core/auth_service.dart';
2 import 'package:cake_wallet/entities/encrypt.dart';
3 import 'package:cake_wallet/entities/secret_store_key.dart';
4 import 'package:cake_wallet/store/settings_store.dart';
5
6 class SetupPinCodeViewModel {
7 SetupPinCodeViewModel(this._authService, this._settingsStore, {this.isDuressPin = false})
8 : _pinCodeLength = _settingsStore.pinCodeLength;
9
10 String originalPinCode = '';
11
12 String repeatedPinCode = '';
13
14 Future<void> setPinCode(String pinCode) async {
15 if (!isOriginalPinCodeFull) {
16 await setOriginalPinCode(pinCode);
17 return;
18 }
19
20 repeatedPinCode = pinCode;
21 }
22
23 int get pinCodeLength => _pinCodeLength;
24
25 set pinCodeLength(int length) {
26 _pinCodeLength = length;
27 reset();
28 }
29
30 bool get isOriginalPinCodeFull => originalPinCode.length == pinCodeLength;
31
32 bool get isRepeatedPinCodeFull => repeatedPinCode.length == pinCodeLength;
33
34 bool get isPinCodeCorrect =>
35 originalPinCode.length == pinCodeLength &&
36 repeatedPinCode.length == pinCodeLength &&
37 originalPinCode == repeatedPinCode;
38
39 final SettingsStore _settingsStore;
40 final AuthService _authService;
41 final bool isDuressPin;
42 int _pinCodeLength;
43
44 Future<void> setOriginalPinCode(String pin) async {
45 originalPinCode = pin;
46
47 if (isDuressPin && pin.length == pinCodeLength) {
48 final regularKey = generateStoreKeyFor(key: SecretStoreKey.pinCodePassword);
49 final encodedRegularPin = await _authService.secureStorage.read(key: regularKey);
50
51 if (encodedRegularPin != null && encodedRegularPin.isNotEmpty) {
52 final realPin = decodedPinCode(pin: encodedRegularPin);
53
54 if (pin == realPin) {
55 reset();
56 throw Exception('Duress PIN cannot be the same as regular PIN');
57 }
58 }
59 }
60 }
61
62 void setRepeatedPinCode(String pinCode) {
63 if (isRepeatedPinCodeFull) {
64 return;
65 }
66
67 repeatedPinCode = pinCode;
68 }
69
70 void reset() {
71 originalPinCode = '';
72 repeatedPinCode = '';
73 }
74
75 Future<void> setupPinCode() async {
76 if (!isPinCodeCorrect) {
77 return;
78 }
79
80 if (isDuressPin) {
81 await _authService.setDuressPin(repeatedPinCode);
82 return;
83 }
84
85 await _authService.setPassword(repeatedPinCode);
86 _settingsStore.pinCodeLength = pinCodeLength;
87 }
88 }