Skip to content

Commit 0da22ab

Browse files
committed
BtcNodeProvider: Fix BTC node banning
The FederatedBtcNodeProvider compared the list of banned nodes with each BtcNode's hostname instead of checking a BtcNode's hostname, ip address, and onion address.
1 parent c4ac0b1 commit 0da22ab

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

core/src/main/java/bisq/core/btc/nodes/FederatedBtcNodeProvider.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,13 @@ static List<BtcNodes.BtcNode> getNodes(List<BtcNodes.BtcNode> hardcodedBtcNodes,
3131
.filter(Objects::nonNull)
3232
.map(NodeAddress::getHostName)
3333
.collect(Collectors.toSet());
34+
3435
return hardcodedBtcNodes.stream()
35-
.filter(e -> !bannedBtcNodeHostNames.contains(e.getHostName()))
36+
.filter(btcNode -> {
37+
String nodeAddress = btcNode.hasOnionAddress() ? btcNode.getOnionAddress() :
38+
btcNode.getHostNameOrAddress();
39+
return !bannedBtcNodeHostNames.contains(nodeAddress);
40+
})
3641
.collect(Collectors.toList());
3742
}
3843

core/src/test/java/bisq/core/btc/nodes/FederatedBtcNodeProviderTest.java

+114
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,118 @@ void onlyHardcodedNodes() {
2929

3030
assertIterableEquals(hardcodedNodes, selectedNodes);
3131
}
32+
33+
@Test
34+
void bannedIpV4Node() {
35+
String bannedAddress = "123.456.890.123";
36+
int port = 4567;
37+
38+
var hardcodedNodes = List.of(
39+
new BtcNodes.BtcNode(null, "alice.onion", null,
40+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
41+
new BtcNodes.BtcNode(null, null, bannedAddress, port, "@bob"),
42+
new BtcNodes.BtcNode(null, "charlie.onion", null,
43+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
44+
);
45+
46+
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
47+
List<String> filterProvidedBtcNodes = Collections.emptyList();
48+
String bannedFullAddress = bannedAddress + ":" + port;
49+
List<String> bannedBtcNodes = List.of(bannedFullAddress);
50+
51+
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
52+
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
53+
54+
var expected = List.of(
55+
new BtcNodes.BtcNode(null, "alice.onion", null,
56+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
57+
new BtcNodes.BtcNode(null, "charlie.onion", null,
58+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
59+
);
60+
assertIterableEquals(expected, selectedNodes);
61+
}
62+
63+
@Test
64+
void bannedIpV6Node() {
65+
String bannedAddress = "2001:db8:85a3:8d3:1319:8a2e:370";
66+
int port = 7348;
67+
68+
var hardcodedNodes = List.of(
69+
new BtcNodes.BtcNode(null, "alice.onion", null,
70+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
71+
new BtcNodes.BtcNode(null, null, bannedAddress, port, "@bob"),
72+
new BtcNodes.BtcNode(null, "charlie.onion", null,
73+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
74+
);
75+
76+
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
77+
List<String> filterProvidedBtcNodes = Collections.emptyList();
78+
String bannedFullAddress = "[" + bannedAddress + "]" + ":" + port;
79+
List<String> bannedBtcNodes = List.of(bannedFullAddress);
80+
81+
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
82+
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
83+
84+
var expected = List.of(
85+
new BtcNodes.BtcNode(null, "alice.onion", null,
86+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
87+
new BtcNodes.BtcNode(null, "charlie.onion", null,
88+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
89+
);
90+
assertIterableEquals(expected, selectedNodes);
91+
}
92+
93+
@Test
94+
void bannedHostNameNode() {
95+
var hardcodedNodes = List.of(
96+
new BtcNodes.BtcNode(null, "alice.onion", null,
97+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
98+
new BtcNodes.BtcNode(null, "btc1.dnsalias.net", null,
99+
5678, "@bob"),
100+
new BtcNodes.BtcNode(null, "charlie.onion", null,
101+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
102+
);
103+
104+
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
105+
List<String> filterProvidedBtcNodes = Collections.emptyList();
106+
List<String> bannedBtcNodes = List.of("btc1.dnsalias.net:5678");
107+
108+
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
109+
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
110+
111+
var expected = List.of(
112+
new BtcNodes.BtcNode(null, "alice.onion", null,
113+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
114+
new BtcNodes.BtcNode(null, "charlie.onion", null,
115+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
116+
);
117+
assertIterableEquals(expected, selectedNodes);
118+
}
119+
120+
@Test
121+
void bannedOnionNode() {
122+
var hardcodedNodes = List.of(
123+
new BtcNodes.BtcNode(null, "alice.onion", null,
124+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
125+
new BtcNodes.BtcNode(null, "bob.onion", null,
126+
BtcNodes.BtcNode.DEFAULT_PORT, "@bob"),
127+
new BtcNodes.BtcNode(null, "charlie.onion", null,
128+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
129+
);
130+
131+
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
132+
List<String> filterProvidedBtcNodes = Collections.emptyList();
133+
List<String> bannedBtcNodes = List.of("bob.onion:8333");
134+
135+
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
136+
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
137+
138+
var expected = List.of(
139+
new BtcNodes.BtcNode(null, "alice.onion", null,
140+
BtcNodes.BtcNode.DEFAULT_PORT, "@alice"),
141+
new BtcNodes.BtcNode(null, "charlie.onion", null,
142+
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
143+
);
144+
assertIterableEquals(expected, selectedNodes);
145+
}
32146
}

0 commit comments

Comments
 (0)