Merge pull request #7343 from alvasw/fix_crash_due_to_broken_filter_provided_nodes_merge

Fix crash due to broken filter provided nodes merge
This commit is contained in:
Alejandro García 2025-01-15 20:23:55 +00:00 committed by GitHub
commit 65f64fc80e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 41 additions and 50 deletions

View file

@ -26,6 +26,7 @@ import bisq.common.util.Utilities;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -66,9 +67,9 @@ public class BtcNodesSetupPreferences {
break; break;
case PROVIDED: case PROVIDED:
default: default:
List<BtcNode> hardcodedBtcNodes = btcNodes.getProvidedBtcNodes(); Stream<BtcNode> hardcodedBtcNodes = btcNodes.getProvidedBtcNodes().stream();
List<String> filterProvidedBtcNodes = config.filterProvidedBtcNodes; Stream<String> filterProvidedBtcNodes = config.filterProvidedBtcNodes.stream();
List<String> bannedBtcNodes = config.bannedBtcNodes; Stream<String> bannedBtcNodes = config.bannedBtcNodes.stream();
result = FederatedBtcNodeProvider.getNodes(hardcodedBtcNodes, filterProvidedBtcNodes, bannedBtcNodes); result = FederatedBtcNodeProvider.getNodes(hardcodedBtcNodes, filterProvidedBtcNodes, bannedBtcNodes);
break; break;
} }

View file

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -14,24 +15,23 @@ import org.jetbrains.annotations.Nullable;
@Slf4j @Slf4j
public class FederatedBtcNodeProvider { public class FederatedBtcNodeProvider {
static List<BtcNodes.BtcNode> getNodes(List<BtcNodes.BtcNode> hardcodedBtcNodes, static List<BtcNodes.BtcNode> getNodes(Stream<BtcNodes.BtcNode> hardcodedBtcNodes,
List<String> filterProvidedBtcNodesConfig, Stream<String> filterProvidedBtcNodesConfig,
List<String> bannedBtcNodesConfig) { Stream<String> bannedBtcNodesConfig) {
Set<BtcNodes.BtcNode> filterProvidedBtcNodes = filterProvidedBtcNodesConfig.stream() Stream<BtcNodes.BtcNode> filterProvidedBtcNodes = filterProvidedBtcNodesConfig
.filter(n -> !n.isEmpty()) .filter(n -> !n.isEmpty())
.map(FederatedBtcNodeProvider::getNodeAddress) .map(FederatedBtcNodeProvider::getNodeAddress)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.map(nodeAddress -> new BtcNodes.BtcNode(null, nodeAddress.getHostName(), null, nodeAddress.getPort(), "Provided by filter")) .map(nodeAddress -> new BtcNodes.BtcNode(null, nodeAddress.getHostName(), null,
.collect(Collectors.toSet()); nodeAddress.getPort(), "Provided by filter"));
hardcodedBtcNodes.addAll(filterProvidedBtcNodes);
Set<NodeAddress> bannedBtcNodeHostNames = bannedBtcNodesConfig.stream() Set<NodeAddress> bannedBtcNodeHostNames = bannedBtcNodesConfig
.filter(n -> !n.isEmpty()) .filter(n -> !n.isEmpty())
.map(FederatedBtcNodeProvider::getNodeAddress) .map(FederatedBtcNodeProvider::getNodeAddress)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
return hardcodedBtcNodes.stream() return Stream.concat(hardcodedBtcNodes, filterProvidedBtcNodes)
.filter(btcNode -> { .filter(btcNode -> {
String nodeAddress = btcNode.hasOnionAddress() ? btcNode.getOnionAddress() : String nodeAddress = btcNode.hasOnionAddress() ? btcNode.getOnionAddress() :
btcNode.getHostNameOrAddress(); btcNode.getHostNameOrAddress();

View file

@ -1,8 +1,7 @@
package bisq.core.btc.nodes; package bisq.core.btc.nodes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -20,12 +19,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList(); Stream<String> bannedBtcNodes = Stream.empty();
List<String> bannedBtcNodes = Collections.emptyList();
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes); assertIterableEquals(hardcodedNodes, selectedNodes);
} }
@ -43,13 +41,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList();
String bannedFullAddress = bannedAddress + ":" + port; String bannedFullAddress = bannedAddress + ":" + port;
List<String> bannedBtcNodes = List.of(bannedFullAddress); Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of( var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null, new BtcNodes.BtcNode(null, "alice.onion", null,
@ -72,13 +69,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList();
String bannedFullAddress = bannedAddress + ":" + 1234; String bannedFullAddress = bannedAddress + ":" + 1234;
List<String> bannedBtcNodes = List.of(bannedFullAddress); Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes); assertIterableEquals(hardcodedNodes, selectedNodes);
} }
@ -96,13 +92,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList();
String bannedFullAddress = "[" + bannedAddress + "]" + ":" + port; String bannedFullAddress = "[" + bannedAddress + "]" + ":" + port;
List<String> bannedBtcNodes = List.of(bannedFullAddress); Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of( var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null, new BtcNodes.BtcNode(null, "alice.onion", null,
@ -125,13 +120,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList();
String bannedFullAddress = "[" + bannedAddress + "]" + ":" + 1234; String bannedFullAddress = "[" + bannedAddress + "]" + ":" + 1234;
List<String> bannedBtcNodes = List.of(bannedFullAddress); Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes); assertIterableEquals(hardcodedNodes, selectedNodes);
} }
@ -149,12 +143,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList(); Stream<String> bannedBtcNodes = Stream.of(bannedHostName + ":" + port);
List<String> bannedBtcNodes = List.of(bannedHostName + ":" + port);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of( var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null, new BtcNodes.BtcNode(null, "alice.onion", null,
@ -177,12 +170,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList(); Stream<String> bannedBtcNodes = Stream.of(bannedHostName + ":" + 1234);
List<String> bannedBtcNodes = List.of(bannedHostName + ":" + 1234);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes); assertIterableEquals(hardcodedNodes, selectedNodes);
} }
@ -200,12 +192,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList(); Stream<String> bannedBtcNodes = Stream.of(bannedOnionAddress + ":" + BtcNodes.BtcNode.DEFAULT_PORT);
List<String> bannedBtcNodes = List.of(bannedOnionAddress + ":" + BtcNodes.BtcNode.DEFAULT_PORT);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of( var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null, new BtcNodes.BtcNode(null, "alice.onion", null,
@ -229,12 +220,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie") BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
); );
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes); Stream<String> filterProvidedBtcNodes = Stream.empty();
List<String> filterProvidedBtcNodes = Collections.emptyList(); Stream<String> bannedBtcNodes = Stream.of(bannedOnionAddress + ":" + 1234);
List<String> bannedBtcNodes = List.of(bannedOnionAddress + ":" + 1234);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes); .getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes); assertIterableEquals(hardcodedNodes, selectedNodes);
} }