From 01355fdc54996bcf479b6a9047a6bb54a51c56a8 Mon Sep 17 00:00:00 2001 From: HenrikJannsen Date: Fri, 7 Jun 2024 18:11:23 +0700 Subject: [PATCH 1/3] Add addedBtcNodes and addedSeedNodes fields to Filter. Signed-off-by: HenrikJannsen --- .../main/java/bisq/core/filter/Filter.java | 36 +++++++++++++++---- .../java/bisq/core/filter/FilterManager.java | 6 ++++ .../resources/i18n/displayStrings.properties | 4 ++- .../main/overlays/windows/FilterWindow.java | 14 ++++++-- proto/src/main/proto/pb.proto | 2 ++ 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/bisq/core/filter/Filter.java b/core/src/main/java/bisq/core/filter/Filter.java index 3cd45bb55ca..069cc91dbf4 100644 --- a/core/src/main/java/bisq/core/filter/Filter.java +++ b/core/src/main/java/bisq/core/filter/Filter.java @@ -123,6 +123,10 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { // Added at v1.9.13 private final List delayedPayoutPaymentAccounts; + // Added at v 1.9.16 + private final List addedBtcNodes; + private final List addedSeedNodes; + // After we have created the signature from the filter data we clone it and apply the signature static Filter cloneWithSig(Filter filter, String signatureAsBase64) { return new Filter(filter.getBannedOfferIds(), @@ -160,7 +164,9 @@ static Filter cloneWithSig(Filter filter, String signatureAsBase64) { filter.getTakerFeeBtc(), filter.getMakerFeeBsq(), filter.getTakerFeeBsq(), - filter.getDelayedPayoutPaymentAccounts()); + filter.getDelayedPayoutPaymentAccounts(), + filter.getAddedBtcNodes(), + filter.getAddedSeedNodes()); } // Used for signature verification as we created the sig without the signatureAsBase64 field we set it to null again @@ -200,7 +206,9 @@ static Filter cloneWithoutSig(Filter filter) { filter.getTakerFeeBtc(), filter.getMakerFeeBsq(), filter.getTakerFeeBsq(), - filter.getDelayedPayoutPaymentAccounts()); + filter.getDelayedPayoutPaymentAccounts(), + filter.getAddedBtcNodes(), + filter.getAddedSeedNodes()); } public Filter(List bannedOfferIds, @@ -235,7 +243,9 @@ public Filter(List bannedOfferIds, long takerFeeBtc, long makerFeeBsq, long takerFeeBsq, - List delayedPayoutPaymentAccounts) { + List delayedPayoutPaymentAccounts, + List addedBtcNodes, + List addedSeedNodes) { this(bannedOfferIds, nodeAddressesBannedFromTrading, bannedPaymentAccounts, @@ -271,7 +281,9 @@ public Filter(List bannedOfferIds, takerFeeBtc, makerFeeBsq, takerFeeBsq, - delayedPayoutPaymentAccounts); + delayedPayoutPaymentAccounts, + addedBtcNodes, + addedSeedNodes); } @@ -315,7 +327,9 @@ public Filter(List bannedOfferIds, long takerFeeBtc, long makerFeeBsq, long takerFeeBsq, - List delayedPayoutPaymentAccounts) { + List delayedPayoutPaymentAccounts, + List addedBtcNodes, + List addedSeedNodes) { this.bannedOfferIds = bannedOfferIds; this.nodeAddressesBannedFromTrading = nodeAddressesBannedFromTrading; this.bannedPaymentAccounts = bannedPaymentAccounts; @@ -352,6 +366,8 @@ public Filter(List bannedOfferIds, this.makerFeeBsq = makerFeeBsq; this.takerFeeBsq = takerFeeBsq; this.delayedPayoutPaymentAccounts = delayedPayoutPaymentAccounts; + this.addedBtcNodes = addedBtcNodes; + this.addedSeedNodes = addedSeedNodes; // ownerPubKeyBytes can be null when called from tests if (ownerPubKeyBytes != null) { @@ -403,7 +419,9 @@ public protobuf.StoragePayload toProtoMessage() { .setTakerFeeBtc(takerFeeBtc) .setMakerFeeBsq(makerFeeBsq) .setTakerFeeBsq(takerFeeBsq) - .addAllDelayedPayoutPaymentAccounts(delayedPayoutPaymentAccountList); + .addAllDelayedPayoutPaymentAccounts(delayedPayoutPaymentAccountList) + .addAllAddedBtcNodes(addedBtcNodes) + .addAllAddedSeedNodes(addedSeedNodes); Optional.ofNullable(signatureAsBase64).ifPresent(builder::setSignatureAsBase64); Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData); @@ -454,7 +472,9 @@ public static Filter fromProto(protobuf.Filter proto) { proto.getTakerFeeBtc(), proto.getMakerFeeBsq(), proto.getTakerFeeBsq(), - delayedPayoutPaymentAccounts + delayedPayoutPaymentAccounts, + ProtoUtil.protocolStringListToList(proto.getAddedBtcNodesList()), + ProtoUtil.protocolStringListToList(proto.getAddedSeedNodesList()) ); } @@ -512,6 +532,8 @@ public String toString() { ",\n takerFeeBtc=" + takerFeeBtc + ",\n makerFeeBsq=" + makerFeeBsq + ",\n takerFeeBsq=" + takerFeeBsq + + ",\n addedBtcNodes=" + addedBtcNodes + + ",\n addedSeedNodes=" + addedSeedNodes + "\n}"; } } diff --git a/core/src/main/java/bisq/core/filter/FilterManager.java b/core/src/main/java/bisq/core/filter/FilterManager.java index 6384e2c659a..8d531fe530e 100644 --- a/core/src/main/java/bisq/core/filter/FilterManager.java +++ b/core/src/main/java/bisq/core/filter/FilterManager.java @@ -85,6 +85,8 @@ public class FilterManager { private static final String BANNED_PRICE_RELAY_NODES = "bannedPriceRelayNodes"; private static final String BANNED_SEED_NODES = "bannedSeedNodes"; private static final String BANNED_BTC_NODES = "bannedBtcNodes"; + private static final String FILTER_PROVIDED_SEED_NODES = "filterProvidedSeedNodes"; + private static final String FILTER_PROVIDED_BTC_NODES = "filterProvidedBtcNodes"; /////////////////////////////////////////////////////////////////////////////////////////// // Listener @@ -570,6 +572,8 @@ private void onFilterAddedFromNetwork(Filter newFilter) { // We persist it to the property file which is read before any other initialisation. saveBannedNodes(BANNED_SEED_NODES, newFilter.getSeedNodes()); saveBannedNodes(BANNED_BTC_NODES, newFilter.getBtcNodes()); + saveBannedNodes(FILTER_PROVIDED_BTC_NODES, newFilter.getAddedBtcNodes()); + saveBannedNodes(FILTER_PROVIDED_SEED_NODES, newFilter.getAddedSeedNodes()); // Banned price relay nodes we can apply at runtime List priceRelayNodes = newFilter.getPriceRelayNodes(); @@ -614,7 +618,9 @@ private void onFilterRemovedFromNetwork(Filter filter) { // Clears options files from banned nodes private void clearBannedNodes() { saveBannedNodes(BANNED_BTC_NODES, null); + saveBannedNodes(FILTER_PROVIDED_BTC_NODES, null); saveBannedNodes(BANNED_SEED_NODES, null); + saveBannedNodes(FILTER_PROVIDED_SEED_NODES, null); saveBannedNodes(BANNED_PRICE_RELAY_NODES, null); if (providersRepository.getBannedNodes() != null) { diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 05d2b5f6662..6c74cb1a5f0 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -3057,8 +3057,10 @@ filterWindow.arbitrators=Filtered arbitrators (comma sep. onion addresses) filterWindow.mediators=Filtered mediators (comma sep. onion addresses) filterWindow.refundAgents=Filtered refund agents (comma sep. onion addresses) filterWindow.seedNode=Filtered seed nodes (comma sep. onion addresses) +filterWindow.addedSeedNodes=Added Seed nodes (comma sep. addresses + port) filterWindow.priceRelayNode=Filtered price relay nodes (comma sep. onion addresses) -filterWindow.btcNode=Filtered Bitcoin nodes (comma sep. addresses + port) +filterWindow.btcNode=Banned Bitcoin nodes (comma sep. addresses + port) +filterWindow.addedBtcNodes=Added Bitcoin nodes (comma sep. addresses + port) filterWindow.preventPublicBtcNetwork=Prevent usage of public Bitcoin network filterWindow.disableDao=Disable DAO filterWindow.disableAutoConf=Disable auto-confirm diff --git a/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java b/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java index d89a94e2508..c997271d66f 100644 --- a/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java +++ b/desktop/src/main/java/bisq/desktop/main/overlays/windows/FilterWindow.java @@ -168,12 +168,16 @@ private void addContent() { Res.get("filterWindow.btcFeeReceiverAddresses")); InputTextField seedNodesTF = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.seedNode")); + InputTextField addedSeedNodesTF = addInputTextField(gridPane, ++rowIndex, + Res.get("filterWindow.addedSeedNodes")); InputTextField priceRelayNodesTF = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.priceRelayNode")); InputTextField btcNodesTF = addInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.btcNode")); + InputTextField addedBtcNodesTF = addInputTextField(gridPane, ++rowIndex, + Res.get("filterWindow.addedBtcNodes")); CheckBox preventPublicBtcNetworkCheckBox = addLabelCheckBox(gridPane, ++rowIndex, - Res.get("filterWindow.preventPublicBtcNetwork")); + Res.get("filterWindow.preventPublicBtcNetwork"), 15); CheckBox disableDaoCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.disableDao")); CheckBox disableAutoConfCheckBox = addLabelCheckBox(gridPane, ++rowIndex, @@ -187,7 +191,7 @@ private void addContent() { InputTextField autoConfExplorersTF = addTopLabelInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.autoConfExplorers")).second; CheckBox disableMempoolValidationCheckBox = addLabelCheckBox(gridPane, ++rowIndex, - Res.get("filterWindow.disableMempoolValidation")); + Res.get("filterWindow.disableMempoolValidation"), 15); CheckBox disableApiCheckBox = addLabelCheckBox(gridPane, ++rowIndex, Res.get("filterWindow.disableApi")); CheckBox disablePowMessage = addLabelCheckBox(gridPane, ++rowIndex, @@ -220,8 +224,10 @@ private void addContent() { setupFieldFromList(refundAgentsTF, filter.getRefundAgents()); setupFieldFromList(btcFeeReceiverAddressesTF, filter.getBtcFeeReceiverAddresses()); setupFieldFromList(seedNodesTF, filter.getSeedNodes()); + setupFieldFromList(addedSeedNodesTF, filter.getAddedSeedNodes()); setupFieldFromList(priceRelayNodesTF, filter.getPriceRelayNodes()); setupFieldFromList(btcNodesTF, filter.getBtcNodes()); + setupFieldFromList(addedBtcNodesTF, filter.getAddedBtcNodes()); setupFieldFromList(bannedPrivilegedDevPubKeysTF, filter.getBannedPrivilegedDevPubKeys()); setupFieldFromList(autoConfExplorersTF, filter.getBannedAutoConfExplorers()); setupFieldFromList(enabledPowVersionsTF, filter.getEnabledPowVersions()); @@ -284,7 +290,9 @@ private void addContent() { ParsingUtils.parseToCoin(takerFeeBtcTF.getText(), btcFormatter).value, ParsingUtils.parseToCoin(makerFeeBsqTF.getText(), bsqFormatter).value, ParsingUtils.parseToCoin(takerFeeBsqTF.getText(), bsqFormatter).value, - readAsPaymentAccountFiltersList(delayedPayoutTF) + readAsPaymentAccountFiltersList(delayedPayoutTF), + readAsList(addedBtcNodesTF), + readAsList(addedSeedNodesTF) ); // We remove first the old filter diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index cef0de17ee5..f5be6a1f66b 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -767,6 +767,8 @@ message Filter { int64 taker_fee_bsq = 34; repeated int32 enabled_pow_versions = 35; repeated PaymentAccountFilter delayedPayoutPaymentAccounts = 36; + repeated string addedBtcNodes = 37; + repeated string addedSeedNodes = 38; } /* Deprecated */ From ddf073a6ffcaecbacce3cb4d10380a5cc32a0944 Mon Sep 17 00:00:00 2001 From: HenrikJannsen Date: Fri, 7 Jun 2024 18:14:51 +0700 Subject: [PATCH 2/3] Add filterProvidedBtcNodes and filterProvidedSeedNodes fields to Config. Signed-off-by: HenrikJannsen --- .../main/java/bisq/common/config/Config.java | 24 ++++++++- .../btc/nodes/BtcNodesSetupPreferences.java | 54 ++++++++++++++++--- .../bisq/core/btc/setup/WalletsSetup.java | 3 +- .../p2p/seed/DefaultSeedNodeRepository.java | 23 +++++--- 4 files changed, 84 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/bisq/common/config/Config.java b/common/src/main/java/bisq/common/config/Config.java index c1153f0467d..8402fb94f62 100644 --- a/common/src/main/java/bisq/common/config/Config.java +++ b/common/src/main/java/bisq/common/config/Config.java @@ -66,8 +66,10 @@ public class Config { public static final String MAX_MEMORY = "maxMemory"; public static final String LOG_LEVEL = "logLevel"; public static final String BANNED_BTC_NODES = "bannedBtcNodes"; + private static final String FILTER_PROVIDED_BTC_NODES = "filterProvidedBtcNodes"; public static final String BANNED_PRICE_RELAY_NODES = "bannedPriceRelayNodes"; public static final String BANNED_SEED_NODES = "bannedSeedNodes"; + private static final String FILTER_PROVIDED_SEED_NODES = "filterProvidedSeedNodes"; public static final String BASE_CURRENCY_NETWORK = "baseCurrencyNetwork"; public static final String REFERRAL_ID = "referralId"; public static final String USE_DEV_MODE = "useDevMode"; @@ -170,8 +172,10 @@ public class Config { public final int maxMemory; public final String logLevel; public final List bannedBtcNodes; + public final List filterProvidedBtcNodes; public final List bannedPriceRelayNodes; public final List bannedSeedNodes; + public final List filterProvidedSeedNodes; public final BaseCurrencyNetwork baseCurrencyNetwork; public final NetworkParameters networkParameters; public final boolean ignoreLocalBtcNode; @@ -336,6 +340,12 @@ public Config(String defaultAppName, File defaultUserDataDir, String... args) { .ofType(String.class) .withValuesSeparatedBy(',') .describedAs("host:port[,...]"); + ArgumentAcceptingOptionSpec filterProvidedBtcNodesOpt = + parser.accepts(FILTER_PROVIDED_BTC_NODES, "List of filter provided Bitcoin nodes") + .withRequiredArg() + .ofType(String.class) + .withValuesSeparatedBy(',') + .describedAs("host:port[,...]"); ArgumentAcceptingOptionSpec bannedPriceRelayNodesOpt = parser.accepts(BANNED_PRICE_RELAY_NODES, "List Bisq price nodes to ban") @@ -350,6 +360,12 @@ public Config(String defaultAppName, File defaultUserDataDir, String... args) { .ofType(String.class) .withValuesSeparatedBy(',') .describedAs("host:port[,...]"); + ArgumentAcceptingOptionSpec filterProvidedSeedNodesOpt = + parser.accepts(FILTER_PROVIDED_SEED_NODES, "List of filer provided seed nodes") + .withRequiredArg() + .ofType(String.class) + .withValuesSeparatedBy(',') + .describedAs("host:port[,...]"); //noinspection rawtypes ArgumentAcceptingOptionSpec baseCurrencyNetworkOpt = @@ -539,9 +555,11 @@ public Config(String defaultAppName, File defaultUserDataDir, String... args) { .defaultsTo(50); // Pause in ms to sleep if we get too many messages to send ArgumentAcceptingOptionSpec btcNodesOpt = - parser.accepts(BTC_NODES, "Custom nodes used for BitcoinJ as comma separated IP addresses.") + parser.accepts(BTC_NODES, "Override provided Bitcoin nodes as comma separated list e.g. " + + "'rxdkppp3vicnbgqt.onion:8002,mfla72c4igh5ta2t.onion:8002'") .withRequiredArg() - .describedAs("ip[,...]") + .withValuesSeparatedBy(',') + .describedAs("host:port[,...]") .defaultsTo(""); ArgumentAcceptingOptionSpec useTorForBtcOpt = @@ -780,8 +798,10 @@ public Config(String defaultAppName, File defaultUserDataDir, String... args) { this.maxMemory = options.valueOf(maxMemoryOpt); this.logLevel = options.valueOf(logLevelOpt); this.bannedBtcNodes = options.valuesOf(bannedBtcNodesOpt); + this.filterProvidedBtcNodes = options.valuesOf(filterProvidedBtcNodesOpt); this.bannedPriceRelayNodes = options.valuesOf(bannedPriceRelayNodesOpt); this.bannedSeedNodes = options.valuesOf(bannedSeedNodesOpt); + this.filterProvidedSeedNodes = options.valuesOf(filterProvidedSeedNodesOpt); this.baseCurrencyNetwork = (BaseCurrencyNetwork) options.valueOf(baseCurrencyNetworkOpt); this.networkParameters = baseCurrencyNetwork.getParameters(); this.ignoreLocalBtcNode = options.valueOf(ignoreLocalBtcNodeOpt); diff --git a/core/src/main/java/bisq/core/btc/nodes/BtcNodesSetupPreferences.java b/core/src/main/java/bisq/core/btc/nodes/BtcNodesSetupPreferences.java index 874a06b4b00..7bc9050fc9f 100644 --- a/core/src/main/java/bisq/core/btc/nodes/BtcNodesSetupPreferences.java +++ b/core/src/main/java/bisq/core/btc/nodes/BtcNodesSetupPreferences.java @@ -17,32 +17,44 @@ package bisq.core.btc.nodes; +import bisq.core.btc.nodes.BtcNodes.BtcNode; import bisq.core.user.Preferences; +import bisq.network.p2p.NodeAddress; + +import bisq.common.config.Config; import bisq.common.util.Utilities; import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.jetbrains.annotations.Nullable; + public class BtcNodesSetupPreferences { private static final Logger log = LoggerFactory.getLogger(BtcNodesSetupPreferences.class); private final Preferences preferences; private final int numConnectionsForBtc; + private final Config config; public BtcNodesSetupPreferences(Preferences preferences, - int numConnectionsForBtc) { + int numConnectionsForBtc, + Config config) { this.preferences = preferences; this.numConnectionsForBtc = numConnectionsForBtc; + this.config = config; } - public List selectPreferredNodes(BtcNodes nodes) { - List result; + public List selectPreferredNodes(BtcNodes btcNodes) { + List result; BtcNodes.BitcoinNodesOption nodesOption = BtcNodes.BitcoinNodesOption.values()[preferences.getBitcoinNodesOptionOrdinal()]; switch (nodesOption) { @@ -51,10 +63,10 @@ public List selectPreferredNodes(BtcNodes nodes) { Set distinctNodes = Utilities.commaSeparatedListToSet(bitcoinNodes, false); result = BtcNodes.toBtcNodesList(distinctNodes); if (result.isEmpty()) { - log.warn("Custom nodes is set but no valid nodes are provided. " + - "We fall back to provided nodes option."); + log.warn("Custom btcNodes is set but no valid btcNodes are provided. " + + "We fall back to provided btcNodes option."); preferences.setBitcoinNodesOptionOrdinal(BtcNodes.BitcoinNodesOption.PROVIDED.ordinal()); - result = nodes.getProvidedBtcNodes(); + result = btcNodes.getProvidedBtcNodes(); } break; case PUBLIC: @@ -62,7 +74,24 @@ public List selectPreferredNodes(BtcNodes nodes) { break; case PROVIDED: default: - result = nodes.getProvidedBtcNodes(); + Set providedBtcNodes = new HashSet<>(btcNodes.getProvidedBtcNodes()); + Set filterProvidedBtcNodes = config.filterProvidedBtcNodes.stream() + .filter(n -> !n.isEmpty()) + .map(this::getNodeAddress) + .filter(Objects::nonNull) + .map(nodeAddress -> new BtcNode(null, nodeAddress.getHostName(), null, nodeAddress.getPort(), "Provided by filter")) + .collect(Collectors.toSet()); + providedBtcNodes.addAll(filterProvidedBtcNodes); + + Set bannedBtcNodeHostNames = config.bannedBtcNodes.stream() + .filter(n -> !n.isEmpty()) + .map(this::getNodeAddress) + .filter(Objects::nonNull) + .map(NodeAddress::getHostName) + .collect(Collectors.toSet()); + result = providedBtcNodes.stream() + .filter(e -> !bannedBtcNodeHostNames.contains(e.getHostName())) + .collect(Collectors.toList()); break; } @@ -73,7 +102,7 @@ public boolean isUseCustomNodes() { return BtcNodes.BitcoinNodesOption.CUSTOM.ordinal() == preferences.getBitcoinNodesOptionOrdinal(); } - public int calculateMinBroadcastConnections(List nodes) { + public int calculateMinBroadcastConnections(List nodes) { BtcNodes.BitcoinNodesOption nodesOption = BtcNodes.BitcoinNodesOption.values()[preferences.getBitcoinNodesOptionOrdinal()]; int result; switch (nodesOption) { @@ -97,4 +126,13 @@ public int calculateMinBroadcastConnections(List nodes) { return result; } + @Nullable + private NodeAddress getNodeAddress(String address) { + try { + return new NodeAddress(address); + } catch (Throwable t) { + log.error("exception when filtering banned seednodes", t); + } + return null; + } } diff --git a/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java b/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java index 2cde4c3b1ad..7e63554a059 100644 --- a/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java +++ b/core/src/main/java/bisq/core/btc/setup/WalletsSetup.java @@ -396,8 +396,7 @@ private void configPeerNodesForRegTestServer() { } private void configPeerNodes(@Nullable Socks5Proxy proxy) { - BtcNodesSetupPreferences btcNodesSetupPreferences = new BtcNodesSetupPreferences(preferences, - numConnectionsForBtc); + BtcNodesSetupPreferences btcNodesSetupPreferences = new BtcNodesSetupPreferences(preferences, numConnectionsForBtc, config); List nodes = btcNodesSetupPreferences.selectPreferredNodes(btcNodes); int minBroadcastConnections = btcNodesSetupPreferences.calculateMinBroadcastConnections(nodes); diff --git a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java index a79203c4fce..0ed50628450 100644 --- a/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java +++ b/core/src/main/java/bisq/core/network/p2p/seed/DefaultSeedNodeRepository.java @@ -36,6 +36,7 @@ import java.util.Locale; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -51,7 +52,7 @@ public class DefaultSeedNodeRepository implements SeedNodeRepository { //TODO add support for localhost addresses private static final Pattern pattern = Pattern.compile("^([a-z0-9]+\\.onion:\\d+)"); private static final String ENDING = ".seednodes"; - private final Collection cache = new HashSet<>(); + private final Set cache = new HashSet<>(); private final Config config; @Inject @@ -73,13 +74,19 @@ private void reload() { List result = getSeedNodeAddressesFromPropertyFile(config.baseCurrencyNetwork.name().toLowerCase(Locale.ENGLISH)); cache.addAll(result); - // let values configured by filter fail more gracefully - cache.removeAll( - config.bannedSeedNodes.stream() - .filter(n -> !n.isEmpty()) - .map(this::getNodeAddress) - .filter(Objects::nonNull) - .collect(Collectors.toSet())); + Set filterProvidedSeedNodes = config.filterProvidedSeedNodes.stream() + .filter(n -> !n.isEmpty()) + .map(this::getNodeAddress) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + cache.addAll(filterProvidedSeedNodes); + + Set bannedSeedNodes = config.bannedSeedNodes.stream() + .filter(n -> !n.isEmpty()) + .map(this::getNodeAddress) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + cache.removeAll(bannedSeedNodes); log.info("Seed nodes: {}", cache); } catch (Throwable t) { From 15a68ec70cdc46779d58fb686cab423b61b0511d Mon Sep 17 00:00:00 2001 From: HenrikJannsen Date: Fri, 7 Jun 2024 22:57:51 +0700 Subject: [PATCH 3/3] Fix tests Signed-off-by: HenrikJannsen --- .../bisq/core/btc/nodes/BtcNodesSetupPreferencesTest.java | 4 ++-- core/src/test/java/bisq/core/filter/TestFilter.java | 2 ++ core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/test/java/bisq/core/btc/nodes/BtcNodesSetupPreferencesTest.java b/core/src/test/java/bisq/core/btc/nodes/BtcNodesSetupPreferencesTest.java index 8444dcc1a37..55a1ec5aec9 100644 --- a/core/src/test/java/bisq/core/btc/nodes/BtcNodesSetupPreferencesTest.java +++ b/core/src/test/java/bisq/core/btc/nodes/BtcNodesSetupPreferencesTest.java @@ -39,7 +39,7 @@ public void testSelectPreferredNodesWhenPublicOption() { Preferences delegate = mock(Preferences.class); when(delegate.getBitcoinNodesOptionOrdinal()).thenReturn(PUBLIC.ordinal()); - BtcNodesSetupPreferences preferences = new BtcNodesSetupPreferences(delegate, Config.DEFAULT_NUM_CONNECTIONS_FOR_BTC_PUBLIC); + BtcNodesSetupPreferences preferences = new BtcNodesSetupPreferences(delegate, Config.DEFAULT_NUM_CONNECTIONS_FOR_BTC_PUBLIC, null); List nodes = preferences.selectPreferredNodes(mock(BtcNodes.class)); assertTrue(nodes.isEmpty()); @@ -51,7 +51,7 @@ public void testSelectPreferredNodesWhenCustomOption() { when(delegate.getBitcoinNodesOptionOrdinal()).thenReturn(CUSTOM.ordinal()); when(delegate.getBitcoinNodes()).thenReturn("aaa.onion,bbb.onion"); - BtcNodesSetupPreferences preferences = new BtcNodesSetupPreferences(delegate, Config.DEFAULT_NUM_CONNECTIONS_FOR_BTC_PUBLIC); + BtcNodesSetupPreferences preferences = new BtcNodesSetupPreferences(delegate, Config.DEFAULT_NUM_CONNECTIONS_FOR_BTC_PUBLIC, null); List nodes = preferences.selectPreferredNodes(mock(BtcNodes.class)); assertEquals(2, nodes.size()); diff --git a/core/src/test/java/bisq/core/filter/TestFilter.java b/core/src/test/java/bisq/core/filter/TestFilter.java index 1037c0a597a..f9343c04647 100644 --- a/core/src/test/java/bisq/core/filter/TestFilter.java +++ b/core/src/test/java/bisq/core/filter/TestFilter.java @@ -102,6 +102,8 @@ public static Filter createFilter(PublicKey ownerPublicKey, String signerPubKeyA 1, 1, 1, + Collections.emptyList(), + Collections.emptyList(), Collections.emptyList() ); } diff --git a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java index 50397cd7ae0..930bedadb72 100644 --- a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java +++ b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java @@ -77,6 +77,8 @@ public void testRoundtripFull() { 0, 0, 0, + Lists.newArrayList(), + Lists.newArrayList(), Lists.newArrayList())); vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock());