Skip to content

Commit fcb2935

Browse files
authored
Merge pull request #309 from cypherstack/trusted-node
Add trusted node setting to Monero and Wownero
2 parents b3d5000 + 7da4bc7 commit fcb2935

File tree

8 files changed

+122
-22
lines changed

8 files changed

+122
-22
lines changed

lib/models/node_model.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class NodeModel {
2626
final bool isFailover;
2727
// @HiveField(9)
2828
final bool isDown;
29+
// @HiveField(10)
30+
final bool? trusted;
2931

3032
NodeModel({
3133
required this.host,
@@ -38,6 +40,7 @@ class NodeModel {
3840
required this.isFailover,
3941
required this.isDown,
4042
this.loginName,
43+
this.trusted,
4144
});
4245

4346
NodeModel copyWith({
@@ -50,6 +53,7 @@ class NodeModel {
5053
String? coinName,
5154
bool? isFailover,
5255
bool? isDown,
56+
bool? trusted,
5357
}) {
5458
return NodeModel(
5559
host: host ?? this.host,
@@ -62,6 +66,7 @@ class NodeModel {
6266
coinName: coinName ?? this.coinName,
6367
isFailover: isFailover ?? this.isFailover,
6468
isDown: isDown ?? this.isDown,
69+
trusted: trusted ?? this.trusted,
6570
);
6671
}
6772

@@ -82,6 +87,7 @@ class NodeModel {
8287
map['coinName'] = coinName;
8388
map['isFailover'] = isFailover;
8489
map['isDown'] = isDown;
90+
map['trusted'] = trusted;
8591
return map;
8692
}
8793

lib/models/type_adaptors/node_model.g.dart

Lines changed: 6 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,7 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
328328
enabled: true,
329329
coinName: coin.name,
330330
isFailover: formData.isFailover!,
331+
trusted: formData.trusted!,
331332
isDown: false,
332333
);
333334

@@ -352,6 +353,7 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
352353
enabled: true,
353354
coinName: coin.name,
354355
isFailover: formData.isFailover!,
356+
trusted: formData.trusted!,
355357
isDown: false,
356358
);
357359

@@ -621,11 +623,11 @@ class _AddEditNodeViewState extends ConsumerState<AddEditNodeView> {
621623
class NodeFormData {
622624
String? name, host, login, password;
623625
int? port;
624-
bool? useSSL, isFailover;
626+
bool? useSSL, isFailover, trusted;
625627

626628
@override
627629
String toString() {
628-
return "{ name: $name, host: $host, port: $port, useSSL: $useSSL }";
630+
return "{ name: $name, host: $host, port: $port, useSSL: $useSSL, trusted: $trusted }";
629631
}
630632
}
631633

@@ -666,8 +668,10 @@ class _NodeFormState extends ConsumerState<NodeForm> {
666668

667669
bool _useSSL = false;
668670
bool _isFailover = false;
671+
bool _trusted = false;
669672
int? port;
670673
late bool enableSSLCheckbox;
674+
late bool trustedCheckbox;
671675

672676
late final bool enableAuthFields;
673677

@@ -733,6 +737,7 @@ class _NodeFormState extends ConsumerState<NodeForm> {
733737
ref.read(nodeFormDataProvider).port = port;
734738
ref.read(nodeFormDataProvider).useSSL = _useSSL;
735739
ref.read(nodeFormDataProvider).isFailover = _isFailover;
740+
ref.read(nodeFormDataProvider).trusted = _trusted;
736741
}
737742

738743
@override
@@ -764,12 +769,17 @@ class _NodeFormState extends ConsumerState<NodeForm> {
764769
_usernameController.text = node.loginName ?? "";
765770
_useSSL = node.useSSL;
766771
_isFailover = node.isFailover;
772+
_trusted = node.trusted ?? false;
767773
if (widget.coin == Coin.epicCash) {
768774
enableSSLCheckbox = !node.host.startsWith("http");
769775
} else {
770776
enableSSLCheckbox = true;
771777
}
772-
print("enableSSLCheckbox: $enableSSLCheckbox");
778+
if (widget.coin == Coin.monero || widget.coin == Coin.wownero) {
779+
trustedCheckbox = node.trusted ?? false;
780+
} else {
781+
trustedCheckbox = false;
782+
}
773783

774784
WidgetsBinding.instance.addPostFrameCallback((_) {
775785
// update provider state object so test connection works without having to modify a field in the ui first
@@ -1106,6 +1116,57 @@ class _NodeFormState extends ConsumerState<NodeForm> {
11061116
),
11071117
],
11081118
),
1119+
if (widget.coin == Coin.monero || widget.coin == Coin.wownero)
1120+
Row(
1121+
children: [
1122+
GestureDetector(
1123+
onTap: !widget.readOnly /*&& trustedCheckbox*/
1124+
? () {
1125+
setState(() {
1126+
_trusted = !_trusted;
1127+
});
1128+
_updateState();
1129+
}
1130+
: null,
1131+
child: Container(
1132+
color: Colors.transparent,
1133+
child: Row(
1134+
children: [
1135+
SizedBox(
1136+
width: 20,
1137+
height: 20,
1138+
child: Checkbox(
1139+
fillColor: !widget.readOnly /*&& trustedCheckbox*/
1140+
? null
1141+
: MaterialStateProperty.all(Theme.of(context)
1142+
.extension<StackColors>()!
1143+
.checkboxBGDisabled),
1144+
materialTapTargetSize:
1145+
MaterialTapTargetSize.shrinkWrap,
1146+
value: _trusted,
1147+
onChanged: !widget.readOnly /*&& trustedCheckbox*/
1148+
? (newValue) {
1149+
setState(() {
1150+
_trusted = newValue!;
1151+
});
1152+
_updateState();
1153+
}
1154+
: null,
1155+
),
1156+
),
1157+
const SizedBox(
1158+
width: 12,
1159+
),
1160+
Text(
1161+
"Trusted",
1162+
style: STextStyles.itemSubtitle12(context),
1163+
)
1164+
],
1165+
),
1166+
),
1167+
),
1168+
],
1169+
),
11091170
if (widget.coin != Coin.monero &&
11101171
widget.coin != Coin.wownero &&
11111172
widget.coin != Coin.epicCash)

lib/pages/settings_views/global_settings_view/manage_nodes_views/node_details_view.dart

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,13 @@ class _NodeDetailsViewState extends ConsumerState<NodeDetailsView> {
7070
switch (coin) {
7171
case Coin.epicCash:
7272
try {
73-
74-
testPassed = await testEpicNodeConnection(
75-
NodeFormData()
76-
..host = node!.host
77-
..useSSL = node.useSSL
78-
..port = node.port,
79-
) !=
80-
null;
81-
73+
testPassed = await testEpicNodeConnection(
74+
NodeFormData()
75+
..host = node!.host
76+
..useSSL = node.useSSL
77+
..port = node.port,
78+
) !=
79+
null;
8280
} catch (e, s) {
8381
Logging.instance.log("$e\n$s", level: LogLevel.Warning);
8482
testPassed = false;
@@ -388,6 +386,7 @@ class _NodeDetailsViewState extends ConsumerState<NodeDetailsView> {
388386
port: ref.read(nodeFormDataProvider).port,
389387
name: ref.read(nodeFormDataProvider).name,
390388
useSSL: ref.read(nodeFormDataProvider).useSSL,
389+
trusted: ref.read(nodeFormDataProvider).trusted,
391390
loginName: ref.read(nodeFormDataProvider).login,
392391
isFailover:
393392
ref.read(nodeFormDataProvider).isFailover,

lib/services/coins/monero/monero_wallet.dart

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,10 @@ class MoneroWallet extends CoinServiceAPI {
398398
final node = await _getCurrentNode();
399399
final host = Uri.parse(node.host).host;
400400
await walletBase!.connectToNode(
401-
node: Node(uri: "$host:${node.port}", type: WalletType.monero));
401+
node: Node(
402+
uri: "$host:${node.port}",
403+
type: WalletType.monero,
404+
trusted: node.trusted ?? false));
402405
await walletBase!.startSync();
403406
await DB.instance
404407
.put<dynamic>(boxName: walletId, key: "id", value: _walletId);
@@ -666,7 +669,10 @@ class MoneroWallet extends CoinServiceAPI {
666669
final node = await _getCurrentNode();
667670
final host = Uri.parse(node.host).host;
668671
await walletBase!.connectToNode(
669-
node: Node(uri: "$host:${node.port}", type: WalletType.monero));
672+
node: Node(
673+
uri: "$host:${node.port}",
674+
type: WalletType.monero,
675+
trusted: node.trusted ?? false));
670676
await walletBase!.rescan(height: credentials.height);
671677
walletBase!.close();
672678
} catch (e, s) {
@@ -775,7 +781,10 @@ class MoneroWallet extends CoinServiceAPI {
775781
final node = await _getCurrentNode();
776782
final host = Uri.parse(node.host).host;
777783
await walletBase?.connectToNode(
778-
node: Node(uri: "$host:${node.port}", type: WalletType.monero));
784+
node: Node(
785+
uri: "$host:${node.port}",
786+
type: WalletType.monero,
787+
trusted: node.trusted ?? false));
779788
}
780789
await walletBase?.startSync();
781790
await refresh();
@@ -851,7 +860,10 @@ class MoneroWallet extends CoinServiceAPI {
851860

852861
final host = Uri.parse(node.host).host;
853862
await walletBase?.connectToNode(
854-
node: Node(uri: "$host:${node.port}", type: WalletType.monero));
863+
node: Node(
864+
uri: "$host:${node.port}",
865+
type: WalletType.monero,
866+
trusted: node.trusted ?? false));
855867

856868
// TODO: is this sync call needed? Do we need to notify ui here?
857869
await walletBase?.startSync();

lib/services/node_service.dart

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,15 @@ class NodeService extends ChangeNotifier {
3333
);
3434
}
3535
} else {
36-
// update all fields but copy over previously set enabled state
36+
// update all fields but copy over previously set enabled and trusted states
3737
await DB.instance.put<NodeModel>(
3838
boxName: DB.boxNameNodeModels,
3939
key: savedNode.id,
40-
value: defaultNode.copyWith(enabled: savedNode.enabled));
40+
value: defaultNode.copyWith(
41+
enabled: savedNode.enabled,
42+
isFailover: savedNode.isFailover,
43+
trusted: savedNode.trusted,
44+
));
4145
}
4246

4347
// check if a default node is the primary node for the crypto currency
@@ -49,6 +53,8 @@ class NodeService extends ChangeNotifier {
4953
coin: coin,
5054
node: defaultNode.copyWith(
5155
enabled: primaryNode.enabled,
56+
isFailover: primaryNode.isFailover,
57+
trusted: primaryNode.trusted,
5258
),
5359
);
5460
}
@@ -161,6 +167,17 @@ class NodeService extends ChangeNotifier {
161167
String? password,
162168
bool shouldNotifyListeners,
163169
) async {
170+
// check if the node being edited is the primary one; if it is, setPrimaryNodeFor coin
171+
final coin = coinFromPrettyName(editedNode.coinName);
172+
var primaryNode = getPrimaryNodeFor(coin: coin);
173+
if (primaryNode?.id == editedNode.id) {
174+
await setPrimaryNodeFor(
175+
coin: coin,
176+
node: editedNode,
177+
shouldNotifyListeners: true,
178+
);
179+
}
180+
164181
return add(editedNode, password, shouldNotifyListeners);
165182
}
166183

lib/utilities/default_nodes.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ abstract class DefaultNodes {
108108
coinName: Coin.monero.name,
109109
isFailover: true,
110110
isDown: false,
111+
trusted: true,
111112
);
112113

113114
static NodeModel get wownero => NodeModel(
@@ -120,6 +121,7 @@ abstract class DefaultNodes {
120121
coinName: Coin.wownero.name,
121122
isFailover: true,
122123
isDown: false,
124+
trusted: true,
123125
);
124126

125127
static NodeModel get epicCash => NodeModel(

0 commit comments

Comments
 (0)