From 58100fda6a23d34ac882097024d2cb03ba9c0713 Mon Sep 17 00:00:00 2001 From: ghubstan <36207203+ghubstan@users.noreply.github.com> Date: Wed, 10 Mar 2021 08:26:14 -0300 Subject: [PATCH] Fix singleton CoreContext usage After GrpcServer builds a gRPC server instance, it calls injected CoreContext#setApiUser(true). The same, singleton CoreContext object is injected into CoreService constructors, which use the coreContext# isApiUser value (set true by the server builder) to set their own class level boolean isApiUser fields. When CoreContext was added, I was fooled by the correct behavior I saw while stepping through the server debugger. But now I see that the correct boolean value in CoreContext is only available after CoreService constructors have finished instantiating themselves - - not in time. In this change, the CoreContext becomes a class level final field in CoreServices, and the correct coreContex.isApiUser value is available in the CoreService methods. --- core/src/main/java/bisq/core/api/CoreOffersService.java | 8 ++++---- core/src/main/java/bisq/core/api/CoreTradesService.java | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/bisq/core/api/CoreOffersService.java b/core/src/main/java/bisq/core/api/CoreOffersService.java index 9942380abc..4a8d8c72b1 100644 --- a/core/src/main/java/bisq/core/api/CoreOffersService.java +++ b/core/src/main/java/bisq/core/api/CoreOffersService.java @@ -65,6 +65,7 @@ class CoreOffersService { private final Supplier> priceComparator = () -> comparing(Offer::getPrice); private final Supplier> reversePriceComparator = () -> comparing(Offer::getPrice).reversed(); + private final CoreContext coreContext; private final KeyRing keyRing; // Dependencies on core api services in this package must be kept to an absolute // minimum, but some trading functions require an unlocked wallet's key, so an @@ -76,7 +77,6 @@ class CoreOffersService { private final OpenOfferManager openOfferManager; private final OfferUtil offerUtil; private final User user; - private final boolean isApiUser; @Inject public CoreOffersService(CoreContext coreContext, @@ -88,6 +88,7 @@ class CoreOffersService { OpenOfferManager openOfferManager, OfferUtil offerUtil, User user) { + this.coreContext = coreContext; this.keyRing = keyRing; this.coreWalletsService = coreWalletsService; this.createOfferService = createOfferService; @@ -96,14 +97,13 @@ class CoreOffersService { this.openOfferManager = openOfferManager; this.offerUtil = offerUtil; this.user = user; - this.isApiUser = coreContext.isApiUser(); } Offer getOffer(String id) { return offerBookService.getOffers().stream() .filter(o -> o.getId().equals(id)) .filter(o -> !o.isMyOffer(keyRing)) - .filter(o -> offerFilter.canTakeOffer(o, isApiUser).isValid()) + .filter(o -> offerFilter.canTakeOffer(o, coreContext.isApiUser()).isValid()) .findAny().orElseThrow(() -> new IllegalStateException(format("offer with id '%s' not found", id))); } @@ -120,7 +120,7 @@ class CoreOffersService { return offerBookService.getOffers().stream() .filter(o -> !o.isMyOffer(keyRing)) .filter(o -> offerMatchesDirectionAndCurrency(o, direction, currencyCode)) - .filter(o -> offerFilter.canTakeOffer(o, isApiUser).isValid()) + .filter(o -> offerFilter.canTakeOffer(o, coreContext.isApiUser()).isValid()) .sorted(priceComparator(direction)) .collect(Collectors.toList()); } diff --git a/core/src/main/java/bisq/core/api/CoreTradesService.java b/core/src/main/java/bisq/core/api/CoreTradesService.java index 83fc421bbf..35251e6538 100644 --- a/core/src/main/java/bisq/core/api/CoreTradesService.java +++ b/core/src/main/java/bisq/core/api/CoreTradesService.java @@ -49,11 +49,11 @@ import static java.lang.String.format; @Slf4j class CoreTradesService { + private final CoreContext coreContext; // Dependencies on core api services in this package must be kept to an absolute // minimum, but some trading functions require an unlocked wallet's key, so an // exception is made in this case. private final CoreWalletsService coreWalletsService; - private final BtcWalletService btcWalletService; private final OfferUtil offerUtil; private final ClosedTradableManager closedTradableManager; @@ -61,7 +61,6 @@ class CoreTradesService { private final TradeManager tradeManager; private final TradeUtil tradeUtil; private final User user; - private final boolean isApiUser; @Inject public CoreTradesService(CoreContext coreContext, @@ -73,6 +72,7 @@ class CoreTradesService { TradeManager tradeManager, TradeUtil tradeUtil, User user) { + this.coreContext = coreContext; this.coreWalletsService = coreWalletsService; this.btcWalletService = btcWalletService; this.offerUtil = offerUtil; @@ -81,7 +81,6 @@ class CoreTradesService { this.tradeManager = tradeManager; this.tradeUtil = tradeUtil; this.user = user; - this.isApiUser = coreContext.isApiUser(); } void takeOffer(Offer offer, @@ -113,7 +112,7 @@ class CoreTradesService { offer, paymentAccountId, useSavingsWallet, - isApiUser, + coreContext.isApiUser(), resultHandler::accept, errorMessage -> { log.error(errorMessage);