fix invalid wallet pointer getting set even when we throw (#1556)
* fix invalid wallet pointer getting set even when we throw * Hide "wallet seeds" field if there is no seeds (cases of restore from keys) --------- Co-authored-by: OmarHatem <omarh.ismail1@gmail.com>
cyan committed
Jul 26, 2024 at 17:36 UTC
eb8158e9963b6dc518fbb24ba5bd36251e5c47f7
3 files changed
+53
-37
cw_monero/lib/api/wallet_manager.dart
+22
-15
@@ -32,13 +32,14 @@ void createWalletSync(
32
required String language,
33
int nettype = 0}) {
34
txhistory = null;
35
- wptr = monero.WalletManager_createWallet(wmPtr,
35
+ final newWptr = monero.WalletManager_createWallet(wmPtr,
36
path: path, password: password, language: language, networkType: 0);
37
38
- final status = monero.Wallet_status(wptr!);
38
+ final status = monero.Wallet_status(newWptr);
39
if (status != 0) {
40
- throw WalletCreationException(message: monero.Wallet_errorString(wptr!));
40
+ throw WalletCreationException(message: monero.Wallet_errorString(newWptr));
41
}
42
+ wptr = newWptr;
43
monero.Wallet_store(wptr!, path: path);
44
openedWalletsByPath[path] = wptr!;
45
@@ -57,7 +58,7 @@ void restoreWalletFromSeedSync(
58
int nettype = 0,
59
int restoreHeight = 0}) {
60
txhistory = null;
60
- wptr = monero.WalletManager_recoveryWallet(
61
+ final newWptr = monero.WalletManager_recoveryWallet(
62
wmPtr,
63
path: path,
64
password: password,
@@ -67,12 +68,13 @@ void restoreWalletFromSeedSync(
68
networkType: 0,
69
);
70
70
- final status = monero.Wallet_status(wptr!);
71
+ final status = monero.Wallet_status(newWptr);
72
73
if (status != 0) {
73
- final error = monero.Wallet_errorString(wptr!);
74
+ final error = monero.Wallet_errorString(newWptr);
75
throw WalletRestoreFromSeedException(message: error);
76
}
77
+ wptr = newWptr;
78
79
openedWalletsByPath[path] = wptr!;
80
}
@@ -87,7 +89,7 @@ void restoreWalletFromKeysSync(
89
int nettype = 0,
90
int restoreHeight = 0}) {
91
txhistory = null;
90
- wptr = monero.WalletManager_createWalletFromKeys(
92
+ final newWptr = monero.WalletManager_createWalletFromKeys(
93
wmPtr,
94
path: path,
95
password: password,
@@ -98,12 +100,14 @@ void restoreWalletFromKeysSync(
100
nettype: 0,
101
);
102
101
- final status = monero.Wallet_status(wptr!);
103
+ final status = monero.Wallet_status(newWptr);
104
if (status != 0) {
105
throw WalletRestoreFromKeysException(
104
- message: monero.Wallet_errorString(wptr!));
106
+ message: monero.Wallet_errorString(newWptr));
107
}
108
109
+ wptr = newWptr;
110
+
111
openedWalletsByPath[path] = wptr!;
112
}
113
@@ -128,7 +132,7 @@ void restoreWalletFromSpendKeySync(
132
// );
133
134
txhistory = null;
131
- wptr = monero.WalletManager_createDeterministicWalletFromSpendKey(
135
+ final newWptr = monero.WalletManager_createDeterministicWalletFromSpendKey(
136
wmPtr,
137
path: path,
138
password: password,
@@ -138,14 +142,16 @@ void restoreWalletFromSpendKeySync(
142
restoreHeight: restoreHeight,
143
);
144
141
- final status = monero.Wallet_status(wptr!);
145
+ final status = monero.Wallet_status(newWptr);
146
147
if (status != 0) {
144
- final err = monero.Wallet_errorString(wptr!);
148
+ final err = monero.Wallet_errorString(newWptr);
149
print("err: $err");
150
throw WalletRestoreFromKeysException(message: err);
151
}
152
153
+ wptr = newWptr;
154
+
155
monero.Wallet_setCacheAttribute(wptr!, key: "cakewallet.seed", value: seed);
156
157
storeSync();
@@ -203,15 +209,16 @@ void loadWallet(
209
});
210
}
211
txhistory = null;
206
- wptr = monero.WalletManager_openWallet(wmPtr,
212
+ final newWptr = monero.WalletManager_openWallet(wmPtr,
213
path: path, password: password);
214
_lastOpenedWallet = path;
209
- final status = monero.Wallet_status(wptr!);
215
+ final status = monero.Wallet_status(newWptr);
216
if (status != 0) {
211
- final err = monero.Wallet_errorString(wptr!);
217
+ final err = monero.Wallet_errorString(newWptr);
218
print(err);
219
throw WalletOpeningException(message: err);
220
}
221
+ wptr = newWptr;
222
openedWalletsByPath[path] = wptr!;
223
}
224
}
cw_wownero/lib/api/wallet_manager.dart
+25
-16
@@ -32,13 +32,14 @@ void createWalletSync(
32
required String language,
33
int nettype = 0}) {
34
txhistory = null;
35
- wptr = wownero.WalletManager_createWallet(wmPtr,
35
+ final newWptr = wownero.WalletManager_createWallet(wmPtr,
36
path: path, password: password, language: language, networkType: 0);
37
38
- final status = wownero.Wallet_status(wptr!);
38
+ final status = wownero.Wallet_status(newWptr);
39
if (status != 0) {
40
- throw WalletCreationException(message: wownero.Wallet_errorString(wptr!));
40
+ throw WalletCreationException(message: wownero.Wallet_errorString(newWptr));
41
}
42
+ wptr = newWptr;
43
wownero.Wallet_store(wptr!, path: path);
44
openedWalletsByPath[path] = wptr!;
45
@@ -56,9 +57,10 @@ void restoreWalletFromSeedSync(
57
required String seed,
58
int nettype = 0,
59
int restoreHeight = 0}) {
60
+ var newWptr;
61
if (seed.split(" ").length == 14) {
62
txhistory = null;
61
- wptr = wownero.WOWNERO_deprecated_restore14WordSeed(
63
+ newWptr = wownero.WOWNERO_deprecated_restore14WordSeed(
64
path: path,
65
password: password,
66
language: seed, // I KNOW - this is supposed to be called seed
@@ -70,7 +72,7 @@ void restoreWalletFromSeedSync(
72
);
73
} else {
74
txhistory = null;
73
- wptr = wownero.WalletManager_recoveryWallet(
75
+ newWptr = wownero.WalletManager_recoveryWallet(
76
wmPtr,
77
path: path,
78
password: password,
@@ -81,13 +83,15 @@ void restoreWalletFromSeedSync(
83
);
84
}
85
84
- final status = wownero.Wallet_status(wptr!);
86
+ final status = wownero.Wallet_status(newWptr);
87
88
if (status != 0) {
87
- final error = wownero.Wallet_errorString(wptr!);
89
+ final error = wownero.Wallet_errorString(newWptr);
90
throw WalletRestoreFromSeedException(message: error);
91
}
92
93
+ wptr = newWptr;
94
+
95
openedWalletsByPath[path] = wptr!;
96
}
97
@@ -101,7 +105,7 @@ void restoreWalletFromKeysSync(
105
int nettype = 0,
106
int restoreHeight = 0}) {
107
txhistory = null;
104
- wptr = wownero.WalletManager_createWalletFromKeys(
108
+ final newWptr = wownero.WalletManager_createWalletFromKeys(
109
wmPtr,
110
path: path,
111
password: password,
@@ -112,12 +116,14 @@ void restoreWalletFromKeysSync(
116
nettype: 0,
117
);
118
115
- final status = wownero.Wallet_status(wptr!);
119
+ final status = wownero.Wallet_status(newWptr);
120
if (status != 0) {
121
throw WalletRestoreFromKeysException(
118
- message: wownero.Wallet_errorString(wptr!));
122
+ message: wownero.Wallet_errorString(newWptr));
123
}
124
125
+ wptr = newWptr;
126
+
127
openedWalletsByPath[path] = wptr!;
128
}
129
@@ -142,7 +148,7 @@ void restoreWalletFromSpendKeySync(
148
// );
149
150
txhistory = null;
145
- wptr = wownero.WalletManager_createDeterministicWalletFromSpendKey(
151
+ final newWptr = wownero.WalletManager_createDeterministicWalletFromSpendKey(
152
wmPtr,
153
path: path,
154
password: password,
@@ -152,14 +158,16 @@ void restoreWalletFromSpendKeySync(
158
restoreHeight: restoreHeight,
159
);
160
155
- final status = wownero.Wallet_status(wptr!);
161
+ final status = wownero.Wallet_status(newWptr);
162
163
if (status != 0) {
158
- final err = wownero.Wallet_errorString(wptr!);
164
+ final err = wownero.Wallet_errorString(newWptr);
165
print("err: $err");
166
throw WalletRestoreFromKeysException(message: err);
167
}
168
169
+ wptr = newWptr;
170
+
171
wownero.Wallet_setCacheAttribute(wptr!, key: "cakewallet.seed", value: seed);
172
173
storeSync();
@@ -217,15 +225,16 @@ void loadWallet(
225
});
226
}
227
txhistory = null;
220
- wptr = wownero.WalletManager_openWallet(wmPtr,
228
+ final newWptr = wownero.WalletManager_openWallet(wmPtr,
229
path: path, password: password);
230
_lastOpenedWallet = path;
223
- final status = wownero.Wallet_status(wptr!);
231
+ final status = wownero.Wallet_status(newWptr);
232
if (status != 0) {
225
- final err = wownero.Wallet_errorString(wptr!);
233
+ final err = wownero.Wallet_errorString(newWptr);
234
print(err);
235
throw WalletOpeningException(message: err);
236
}
237
+ wptr = newWptr;
238
openedWalletsByPath[path] = wptr!;
239
}
240
}
lib/view_model/wallet_keys_view_model.dart
+6
-6
@@ -83,8 +83,8 @@ abstract class WalletKeysViewModelBase with Store {
83
StandartListItem(
84
title: S.current.view_key_private,
85
value: keys['privateViewKey']!),
86
- StandartListItem(
87
- title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
86
+ if (_appStore.wallet!.seed!.isNotEmpty)
87
+ StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
88
]);
89
90
if (_appStore.wallet?.seed != null &&
@@ -123,8 +123,8 @@ abstract class WalletKeysViewModelBase with Store {
123
StandartListItem(
124
title: S.current.view_key_private,
125
value: keys['privateViewKey']!),
126
- StandartListItem(
127
- title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
126
+ if (_appStore.wallet!.seed!.isNotEmpty)
127
+ StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
128
]);
129
}
130
@@ -147,8 +147,8 @@ abstract class WalletKeysViewModelBase with Store {
147
StandartListItem(
148
title: S.current.view_key_private,
149
value: keys['privateViewKey']!),
150
- StandartListItem(
151
- title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
150
+ if (_appStore.wallet!.seed!.isNotEmpty)
151
+ StandartListItem(title: S.current.wallet_seed, value: _appStore.wallet!.seed!),
152
]);
153
154
if (_appStore.wallet?.seed != null &&