diff --git a/core/src/main/java/bisq/core/filter/Filter.java b/core/src/main/java/bisq/core/filter/Filter.java index a22ecda78af..41bc9521ae8 100644 --- a/core/src/main/java/bisq/core/filter/Filter.java +++ b/core/src/main/java/bisq/core/filter/Filter.java @@ -48,6 +48,7 @@ public final class Filter implements ProtectedStoragePayload, ExpirablePayload { private final List bannedOfferIds; private final List bannedNodeAddress; + private final List bannedAutoConfExplorers; private final List bannedPaymentAccounts; private final List bannedCurrencies; private final List bannedPaymentMethods; @@ -115,7 +116,8 @@ static Filter cloneWithSig(Filter filter, String signatureAsBase64) { signatureAsBase64, filter.getSignerPubKeyAsHex(), filter.getBannedPrivilegedDevPubKeys(), - filter.isDisableAutoConf()); + filter.isDisableAutoConf(), + filter.getBannedAutoConfExplorers()); } // Used for signature verification as we created the sig without the signatureAsBase64 field we set it to null again @@ -143,7 +145,8 @@ static Filter cloneWithoutSig(Filter filter) { null, filter.getSignerPubKeyAsHex(), filter.getBannedPrivilegedDevPubKeys(), - filter.isDisableAutoConf()); + filter.isDisableAutoConf(), + filter.getBannedAutoConfExplorers()); } public Filter(List bannedOfferIds, @@ -166,7 +169,8 @@ public Filter(List bannedOfferIds, PublicKey ownerPubKey, String signerPubKeyAsHex, List bannedPrivilegedDevPubKeys, - boolean disableAutoConf) { + boolean disableAutoConf, + List bannedAutoConfExplorers) { this(bannedOfferIds, bannedNodeAddress, bannedPaymentAccounts, @@ -190,7 +194,8 @@ public Filter(List bannedOfferIds, null, signerPubKeyAsHex, bannedPrivilegedDevPubKeys, - disableAutoConf); + disableAutoConf, + bannedAutoConfExplorers); } @@ -222,7 +227,8 @@ public Filter(List bannedOfferIds, @Nullable String signatureAsBase64, String signerPubKeyAsHex, List bannedPrivilegedDevPubKeys, - boolean disableAutoConf) { + boolean disableAutoConf, + List bannedAutoConfExplorers) { this.bannedOfferIds = bannedOfferIds; this.bannedNodeAddress = bannedNodeAddress; this.bannedPaymentAccounts = bannedPaymentAccounts; @@ -247,6 +253,7 @@ public Filter(List bannedOfferIds, this.signerPubKeyAsHex = signerPubKeyAsHex; this.bannedPrivilegedDevPubKeys = bannedPrivilegedDevPubKeys; this.disableAutoConf = disableAutoConf; + this.bannedAutoConfExplorers = bannedAutoConfExplorers; // ownerPubKeyBytes can be null when called from tests if (ownerPubKeyBytes != null) { @@ -283,7 +290,8 @@ public protobuf.StoragePayload toProtoMessage() { .setSignerPubKeyAsHex(signerPubKeyAsHex) .setCreationDate(creationDate) .addAllBannedPrivilegedDevPubKeys(bannedPrivilegedDevPubKeys) - .setDisableAutoConf(disableAutoConf); + .setDisableAutoConf(disableAutoConf) + .addAllBannedAutoConfExplorers(bannedAutoConfExplorers); Optional.ofNullable(signatureAsBase64).ifPresent(builder::setSignatureAsBase64); Optional.ofNullable(extraDataMap).ifPresent(builder::putAllExtraData); @@ -320,7 +328,8 @@ public static Filter fromProto(protobuf.Filter proto) { proto.getSignatureAsBase64(), proto.getSignerPubKeyAsHex(), ProtoUtil.protocolStringListToList(proto.getBannedPrivilegedDevPubKeysList()), - proto.getDisableAutoConf() + proto.getDisableAutoConf(), + ProtoUtil.protocolStringListToList(proto.getBannedAutoConfExplorersList()) ); } @@ -361,6 +370,7 @@ public String toString() { ",\n creationDate=" + creationDate + ",\n extraDataMap=" + extraDataMap + ",\n disableAutoConf=" + disableAutoConf + + ",\n bannedAutoConfExplorers=" + bannedAutoConfExplorers + "\n}"; } } diff --git a/core/src/main/java/bisq/core/filter/FilterManager.java b/core/src/main/java/bisq/core/filter/FilterManager.java index 1c8edc478f4..8b5c2bd9b1e 100644 --- a/core/src/main/java/bisq/core/filter/FilterManager.java +++ b/core/src/main/java/bisq/core/filter/FilterManager.java @@ -398,6 +398,12 @@ public boolean isNodeAddressBanned(NodeAddress nodeAddress) { .anyMatch(e -> e.equals(nodeAddress.getFullAddress())); } + public boolean isAutoConfExplorerBanned(String address) { + return getFilter() != null && + getFilter().getBannedAutoConfExplorers().stream() + .anyMatch(e -> e.equals(address)); + } + public boolean requireUpdateToNewVersionForTrading() { if (getFilter() == null) { return false; diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java index d7a1e84bc1f..2d0efe887d4 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofRequestsPerTrade.java @@ -17,6 +17,7 @@ package bisq.core.trade.txproof.xmr; +import bisq.core.filter.FilterManager; import bisq.core.locale.Res; import bisq.core.support.dispute.Dispute; import bisq.core.support.dispute.mediation.MediationManager; @@ -54,6 +55,7 @@ class XmrTxProofRequestsPerTrade implements AssetTxProofRequestsPerTrade { private final Trade trade; private final AutoConfirmSettings autoConfirmSettings; private final MediationManager mediationManager; + private final FilterManager filterManager; private final RefundManager refundManager; private final Socks5ProxyProvider socks5ProxyProvider; @@ -74,11 +76,13 @@ class XmrTxProofRequestsPerTrade implements AssetTxProofRequestsPerTrade { Trade trade, AutoConfirmSettings autoConfirmSettings, MediationManager mediationManager, + FilterManager filterManager, RefundManager refundManager) { this.socks5ProxyProvider = socks5ProxyProvider; this.trade = trade; this.autoConfirmSettings = autoConfirmSettings; this.mediationManager = mediationManager; + this.filterManager = filterManager; this.refundManager = refundManager; } @@ -140,6 +144,10 @@ public void requestFromAllServices(Consumer resultHandler, F numRequiredSuccessResults = serviceAddresses.size(); for (String serviceAddress : serviceAddresses) { + if (filterManager.isAutoConfExplorerBanned(serviceAddress)) { + log.warn("Filtered out auto-confirmation address: {}", serviceAddress); + continue; // #4683: filter for auto-confirm explorers + } XmrTxProofModel model = new XmrTxProofModel(trade, serviceAddress, autoConfirmSettings); XmrTxProofRequest request = new XmrTxProofRequest(socks5ProxyProvider, model); diff --git a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java index 30349d3f784..9e9ca4c9087 100644 --- a/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java +++ b/core/src/main/java/bisq/core/trade/txproof/xmr/XmrTxProofService.java @@ -257,6 +257,7 @@ private void startRequests(SellerTrade trade) { trade, autoConfirmSettings, mediationManager, + filterManager, refundManager); servicesByTradeId.put(trade.getId(), service); service.requestFromAllServices( diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 9c3e4fc792c..c6d7e058936 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -2594,6 +2594,7 @@ filterWindow.btcNode=Filtered Bitcoin nodes (comma sep. addresses + port) filterWindow.preventPublicBtcNetwork=Prevent usage of public Bitcoin network filterWindow.disableDao=Disable DAO filterWindow.disableAutoConf=Disable auto-confirm +filterWindow.autoConfExplorers=Filtered auto-confirm explorers (comma sep. addresses) filterWindow.disableDaoBelowVersion=Min. version required for DAO filterWindow.disableTradeBelowVersion=Min. version required for trading filterWindow.add=Add filter diff --git a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java index 6fc717b263c..144e299181c 100644 --- a/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java +++ b/core/src/test/java/bisq/core/user/UserPayloadModelVOTest.java @@ -63,7 +63,8 @@ public void testRoundtripFull() { null, null, null, - false)); + false, + Lists.newArrayList())); vo.setRegisteredArbitrator(ArbitratorTest.getArbitratorMock()); vo.setRegisteredMediator(MediatorTest.getMediatorMock()); diff --git a/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java b/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java index ce2f3f6f838..ca7b77bcffb 100644 --- a/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java +++ b/core/src/test/java/bisq/core/util/FeeReceiverSelectorTest.java @@ -122,6 +122,7 @@ private static Filter filterWithReceivers(List btcFeeReceiverAddresses) null, null, null, - false); + false, + Lists.newArrayList()); } } 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 74748a0d820..b56b317090e 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 @@ -161,6 +161,8 @@ private void addContent() { Res.get("filterWindow.disableTradeBelowVersion")); InputTextField bannedPrivilegedDevPubKeysTF = addTopLabelInputTextField(gridPane, ++rowIndex, Res.get("filterWindow.bannedPrivilegedDevPubKeys")).second; + InputTextField autoConfExplorersTF = addTopLabelInputTextField(gridPane, ++rowIndex, + Res.get("filterWindow.autoConfExplorers")).second; Filter filter = filterManager.getDevFilter(); if (filter != null) { @@ -178,6 +180,7 @@ private void addContent() { setupFieldFromList(priceRelayNodesTF, filter.getPriceRelayNodes()); setupFieldFromList(btcNodesTF, filter.getBtcNodes()); setupFieldFromList(bannedPrivilegedDevPubKeysTF, filter.getBannedPrivilegedDevPubKeys()); + setupFieldFromList(autoConfExplorersTF, filter.getBannedAutoConfExplorers()); preventPublicBtcNetworkCheckBox.setSelected(filter.isPreventPublicBtcNetwork()); disableDaoCheckBox.setSelected(filter.isDisableDao()); @@ -215,7 +218,8 @@ private void addContent() { filterManager.getOwnerPubKey(), signerPubKeyAsHex, readAsList(bannedPrivilegedDevPubKeysTF), - disableAutoConfCheckBox.isSelected() + disableAutoConfCheckBox.isSelected(), + readAsList(autoConfExplorersTF) ); // We remove first the old filter diff --git a/proto/src/main/proto/pb.proto b/proto/src/main/proto/pb.proto index 199918b8f47..ad50a7d641d 100644 --- a/proto/src/main/proto/pb.proto +++ b/proto/src/main/proto/pb.proto @@ -660,6 +660,7 @@ message Filter { string signer_pub_key_as_hex = 22; repeated string bannedPrivilegedDevPubKeys = 23; bool disable_auto_conf = 24; + repeated string banned_auto_conf_explorers = 25; } // Deprecated