From 1258c46bf9145ed1f9506171dce5938163e4332d Mon Sep 17 00:00:00 2001 From: Kukks Date: Thu, 1 Jun 2023 11:55:42 +0200 Subject: [PATCH] wip --- .../Controllers/BitpayRateController.cs | 7 +++-- ...enfieldLightningNodeApiController.Store.cs | 6 ++-- ...ldStoreLNURLPayPaymentMethodsController.cs | 15 +++++---- ...ightningNetworkPaymentMethodsController.cs | 21 +++++++------ ...eldStoreOnChainPaymentMethodsController.cs | 13 +++++--- ...GreenfieldStoreOnChainWalletsController.cs | 8 +++-- ...GreenfieldStorePaymentMethodsController.cs | 7 +++-- .../GreenField/GreenfieldStoresController.cs | 12 +++---- .../GreenfieldTestApiKeyController.cs | 11 +++---- .../Controllers/UIWalletsController.cs | 7 +++-- BTCPayServer/Data/StoreDataExtensions.cs | 31 +++++++++---------- BTCPayServer/Extensions.cs | 4 +-- .../PaymentMethodIdModelBinder.cs | 5 +-- 13 files changed, 84 insertions(+), 63 deletions(-) diff --git a/BTCPayServer/Controllers/BitpayRateController.cs b/BTCPayServer/Controllers/BitpayRateController.cs index ad2173ac6..f6fe29959 100644 --- a/BTCPayServer/Controllers/BitpayRateController.cs +++ b/BTCPayServer/Controllers/BitpayRateController.cs @@ -9,6 +9,7 @@ using BTCPayServer.Abstractions.Constants; using BTCPayServer.Data; using BTCPayServer.Filters; using BTCPayServer.Models; +using BTCPayServer.Payments; using BTCPayServer.Rating; using BTCPayServer.Security; using BTCPayServer.Security.Bitpay; @@ -30,6 +31,7 @@ namespace BTCPayServer.Controllers readonly BTCPayNetworkProvider _networkProvider; readonly CurrencyNameTable _currencyNameTable; readonly StoreRepository _storeRepo; + private readonly PaymentTypeRegistry _paymentTypeRegistry; private StoreData CurrentStore => HttpContext.GetStoreData(); @@ -37,12 +39,13 @@ namespace BTCPayServer.Controllers RateFetcher rateProviderFactory, BTCPayNetworkProvider networkProvider, StoreRepository storeRepo, - CurrencyNameTable currencyNameTable) + CurrencyNameTable currencyNameTable, PaymentTypeRegistry paymentTypeRegistry) { _rateProviderFactory = rateProviderFactory ?? throw new ArgumentNullException(nameof(rateProviderFactory)); _networkProvider = networkProvider; _storeRepo = storeRepo; _currencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); + _paymentTypeRegistry = paymentTypeRegistry; } [Route("rates/{baseCurrency}")] @@ -50,7 +53,7 @@ namespace BTCPayServer.Controllers [BitpayAPIConstraint] public async Task GetBaseCurrencyRates(string baseCurrency, CancellationToken cancellationToken) { - var supportedMethods = CurrentStore.GetSupportedPaymentMethods(_networkProvider); + var supportedMethods = CurrentStore.GetSupportedPaymentMethods(_networkProvider, _paymentTypeRegistry); var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.PaymentId.CryptoCode)) .Select(method => method.PaymentId.CryptoCode).Distinct(); diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.Store.cs b/BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.Store.cs index 30df86ca3..9b7fdafb5 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.Store.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldLightningNodeApiController.Store.cs @@ -28,17 +28,19 @@ namespace BTCPayServer.Controllers.Greenfield private readonly IOptions _lightningNetworkOptions; private readonly LightningClientFactoryService _lightningClientFactory; private readonly BTCPayNetworkProvider _btcPayNetworkProvider; + private readonly PaymentTypeRegistry _paymentTypeRegistry; public GreenfieldStoreLightningNodeApiController( IOptions lightningNetworkOptions, LightningClientFactoryService lightningClientFactory, BTCPayNetworkProvider btcPayNetworkProvider, PoliciesSettings policiesSettings, - IAuthorizationService authorizationService) : base( + IAuthorizationService authorizationService, PaymentTypeRegistry paymentTypeRegistry) : base( btcPayNetworkProvider, policiesSettings, authorizationService) { _lightningNetworkOptions = lightningNetworkOptions; _lightningClientFactory = lightningClientFactory; _btcPayNetworkProvider = btcPayNetworkProvider; + _paymentTypeRegistry = paymentTypeRegistry; } [Authorize(Policy = Policies.CanUseLightningNodeInStore, @@ -151,7 +153,7 @@ namespace BTCPayServer.Controllers.Greenfield } var id = new PaymentMethodId(cryptoCode, LightningPaymentType.Instance); - var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider) + var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry) .OfType() .FirstOrDefault(d => d.PaymentId == id); if (existing == null) diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoreLNURLPayPaymentMethodsController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoreLNURLPayPaymentMethodsController.cs index ebc3ef0d3..7d6b67672 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoreLNURLPayPaymentMethodsController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoreLNURLPayPaymentMethodsController.cs @@ -32,22 +32,25 @@ namespace BTCPayServer.Controllers.Greenfield private StoreData Store => HttpContext.GetStoreData(); private readonly StoreRepository _storeRepository; private readonly BTCPayNetworkProvider _btcPayNetworkProvider; + private readonly PaymentTypeRegistry _paymentTypeRegistry; public GreenfieldStoreLNURLPayPaymentMethodsController( StoreRepository storeRepository, - BTCPayNetworkProvider btcPayNetworkProvider) + BTCPayNetworkProvider btcPayNetworkProvider, + PaymentTypeRegistry paymentTypeRegistry) { _storeRepository = storeRepository; _btcPayNetworkProvider = btcPayNetworkProvider; + _paymentTypeRegistry = paymentTypeRegistry; } public static IEnumerable GetLNURLPayPaymentMethods(StoreData store, - BTCPayNetworkProvider networkProvider, bool? enabled) + BTCPayNetworkProvider networkProvider, bool? enabled, PaymentTypeRegistry paymentTypeRegistry) { var blob = store.GetStoreBlob(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); - return store.GetSupportedPaymentMethods(networkProvider) + return store.GetSupportedPaymentMethods(networkProvider, paymentTypeRegistry) .Where((method) => method.PaymentId.PaymentType == LNURLPayPaymentType.Instance) .OfType() .Select(paymentMethod => @@ -67,7 +70,7 @@ namespace BTCPayServer.Controllers.Greenfield string storeId, [FromQuery] bool? enabled) { - return Ok(GetLNURLPayPaymentMethods(Store, _btcPayNetworkProvider, enabled)); + return Ok(GetLNURLPayPaymentMethods(Store, _btcPayNetworkProvider, enabled, _paymentTypeRegistry)); } [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -110,7 +113,7 @@ namespace BTCPayServer.Controllers.Greenfield AssertCryptoCodeWallet(cryptoCode, out _); var lnMethod = GreenfieldStoreLightningNetworkPaymentMethodsController.GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, - cryptoCode, Store); + cryptoCode, Store, _paymentTypeRegistry); if ((lnMethod is null || lnMethod.Enabled is false) && paymentMethodData.Enabled) { @@ -143,7 +146,7 @@ namespace BTCPayServer.Controllers.Greenfield var storeBlob = store.GetStoreBlob(); var id = new PaymentMethodId(cryptoCode, LNURLPayPaymentType.Instance); var paymentMethod = store - .GetSupportedPaymentMethods(_btcPayNetworkProvider) + .GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry) .OfType() .FirstOrDefault(method => method.PaymentId == id); diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningNetworkPaymentMethodsController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningNetworkPaymentMethodsController.cs index 03a926ad0..bfbe3a716 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningNetworkPaymentMethodsController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoreLightningNetworkPaymentMethodsController.cs @@ -37,27 +37,30 @@ namespace BTCPayServer.Controllers.Greenfield private readonly StoreRepository _storeRepository; private readonly BTCPayNetworkProvider _btcPayNetworkProvider; private readonly IAuthorizationService _authorizationService; + private readonly PaymentTypeRegistry _paymentTypeRegistry; public GreenfieldStoreLightningNetworkPaymentMethodsController( StoreRepository storeRepository, BTCPayNetworkProvider btcPayNetworkProvider, IAuthorizationService authorizationService, ISettingsRepository settingsRepository, - PoliciesSettings policiesSettings) + PoliciesSettings policiesSettings, + PaymentTypeRegistry paymentTypeRegistry) { _storeRepository = storeRepository; _btcPayNetworkProvider = btcPayNetworkProvider; _authorizationService = authorizationService; + _paymentTypeRegistry = paymentTypeRegistry; PoliciesSettings = policiesSettings; } public static IEnumerable GetLightningPaymentMethods(StoreData store, - BTCPayNetworkProvider networkProvider, bool? enabled) + BTCPayNetworkProvider networkProvider, bool? enabled, PaymentTypeRegistry paymentTypeRegistry) { var blob = store.GetStoreBlob(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); - return store.GetSupportedPaymentMethods(networkProvider) + return store.GetSupportedPaymentMethods(networkProvider, paymentTypeRegistry ) .Where((method) => method.PaymentId.PaymentType == LightningPaymentType.Instance) .OfType() .Select(paymentMethod => @@ -79,7 +82,7 @@ namespace BTCPayServer.Controllers.Greenfield string storeId, [FromQuery] bool? enabled) { - return Ok(GetLightningPaymentMethods(Store, _btcPayNetworkProvider, enabled)); + return Ok(GetLightningPaymentMethods(Store, _btcPayNetworkProvider, enabled, _paymentTypeRegistry)); } [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -88,7 +91,7 @@ namespace BTCPayServer.Controllers.Greenfield { AssertSupportLightning(cryptoCode); - var method = GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, Store); + var method = GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, Store, _paymentTypeRegistry); if (method is null) { throw ErrorPaymentMethodNotConfigured(); @@ -137,7 +140,7 @@ namespace BTCPayServer.Controllers.Greenfield LightningSupportedPaymentMethod? paymentMethod = null; var store = Store; var storeBlob = store.GetStoreBlob(); - var existing = GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, store); + var existing = GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, store, _paymentTypeRegistry); if (existing == null || existing.ConnectionString != request.ConnectionString) { if (request.ConnectionString == LightningSupportedPaymentMethod.InternalNode) @@ -187,17 +190,17 @@ namespace BTCPayServer.Controllers.Greenfield storeBlob.SetExcluded(paymentMethodId, !request.Enabled); store.SetStoreBlob(storeBlob); await _storeRepository.UpdateStore(store); - return Ok(GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, store)); + return Ok(GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, store, _paymentTypeRegistry)); } public static LightningNetworkPaymentMethodData? GetExistingLightningLikePaymentMethod(BTCPayNetworkProvider btcPayNetworkProvider, string cryptoCode, - StoreData store) + StoreData store, PaymentTypeRegistry paymentTypeRegistry) { var storeBlob = store.GetStoreBlob(); var id = new PaymentMethodId(cryptoCode, LightningPaymentType.Instance); var paymentMethod = store - .GetSupportedPaymentMethods(btcPayNetworkProvider) + .GetSupportedPaymentMethods(btcPayNetworkProvider, paymentTypeRegistry) .OfType() .FirstOrDefault(method => method.PaymentId == id); diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainPaymentMethodsController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainPaymentMethodsController.cs index c4f15448b..6b7f235ea 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainPaymentMethodsController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainPaymentMethodsController.cs @@ -38,6 +38,7 @@ namespace BTCPayServer.Controllers.Greenfield private readonly IAuthorizationService _authorizationService; private readonly ExplorerClientProvider _explorerClientProvider; private readonly EventAggregator _eventAggregator; + private readonly PaymentTypeRegistry _paymentTypeRegistry; public GreenfieldStoreOnChainPaymentMethodsController( StoreRepository storeRepository, @@ -46,7 +47,8 @@ namespace BTCPayServer.Controllers.Greenfield IAuthorizationService authorizationService, ExplorerClientProvider explorerClientProvider, PoliciesSettings policiesSettings, - EventAggregator eventAggregator) + EventAggregator eventAggregator, + PaymentTypeRegistry paymentTypeRegistry) { _storeRepository = storeRepository; _btcPayNetworkProvider = btcPayNetworkProvider; @@ -54,16 +56,17 @@ namespace BTCPayServer.Controllers.Greenfield _authorizationService = authorizationService; _explorerClientProvider = explorerClientProvider; _eventAggregator = eventAggregator; + _paymentTypeRegistry = paymentTypeRegistry; PoliciesSettings = policiesSettings; } public static IEnumerable GetOnChainPaymentMethods(StoreData store, - BTCPayNetworkProvider networkProvider, bool? enabled) + BTCPayNetworkProvider networkProvider, bool? enabled, PaymentTypeRegistry paymentTypeRegistry) { var blob = store.GetStoreBlob(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); - return store.GetSupportedPaymentMethods(networkProvider) + return store.GetSupportedPaymentMethods(networkProvider, paymentTypeRegistry) .Where((method) => method.PaymentId.PaymentType == BitcoinPaymentType.Instance) .OfType() .Select(strategy => @@ -81,7 +84,7 @@ namespace BTCPayServer.Controllers.Greenfield string storeId, [FromQuery] bool? enabled) { - return Ok(GetOnChainPaymentMethods(Store, _btcPayNetworkProvider, enabled)); + return Ok(GetOnChainPaymentMethods(Store, _btcPayNetworkProvider, enabled, _paymentTypeRegistry)); } [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -295,7 +298,7 @@ namespace BTCPayServer.Controllers.Greenfield var storeBlob = store.GetStoreBlob(); var id = new PaymentMethodId(cryptoCode, BitcoinPaymentType.Instance); var paymentMethod = store - .GetSupportedPaymentMethods(_btcPayNetworkProvider) + .GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry) .OfType() .FirstOrDefault(method => method.PaymentId == id); diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainWalletsController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainWalletsController.cs index 85cfda789..dd6bd0a9c 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainWalletsController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoreOnChainWalletsController.cs @@ -14,6 +14,7 @@ using BTCPayServer.Client.Models; using BTCPayServer.Data; using BTCPayServer.HostedServices; using BTCPayServer.Models.WalletViewModels; +using BTCPayServer.Payments; using BTCPayServer.Payments.PayJoin; using BTCPayServer.Payments.PayJoin.Sender; using BTCPayServer.Services; @@ -54,6 +55,7 @@ namespace BTCPayServer.Controllers.Greenfield private readonly WalletReceiveService _walletReceiveService; private readonly IFeeProviderFactory _feeProviderFactory; private readonly UTXOLocker _utxoLocker; + private readonly PaymentTypeRegistry _paymentTypeRegistry; public GreenfieldStoreOnChainWalletsController( IAuthorizationService authorizationService, @@ -69,7 +71,8 @@ namespace BTCPayServer.Controllers.Greenfield EventAggregator eventAggregator, WalletReceiveService walletReceiveService, IFeeProviderFactory feeProviderFactory, - UTXOLocker utxoLocker + UTXOLocker utxoLocker, + PaymentTypeRegistry paymentTypeRegistry ) { _authorizationService = authorizationService; @@ -86,6 +89,7 @@ namespace BTCPayServer.Controllers.Greenfield _walletReceiveService = walletReceiveService; _feeProviderFactory = feeProviderFactory; _utxoLocker = utxoLocker; + _paymentTypeRegistry = paymentTypeRegistry; } [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -801,7 +805,7 @@ namespace BTCPayServer.Controllers.Greenfield private DerivationSchemeSettings? GetDerivationSchemeSettings(string cryptoCode) { var paymentMethod = Store - .GetSupportedPaymentMethods(_btcPayNetworkProvider) + .GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry) .OfType() .FirstOrDefault(p => p.PaymentId.PaymentType == Payments.BitcoinPaymentType.Instance && diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs index 16c430321..824a502b1 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStorePaymentMethodsController.cs @@ -6,6 +6,7 @@ using BTCPayServer.Abstractions.Constants; using BTCPayServer.Client; using BTCPayServer.Client.Models; using BTCPayServer.Data; +using BTCPayServer.Payments; using BTCPayServer.Security; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Cors; @@ -22,11 +23,13 @@ namespace BTCPayServer.Controllers.Greenfield private StoreData Store => HttpContext.GetStoreData(); private readonly BTCPayNetworkProvider _btcPayNetworkProvider; private readonly IAuthorizationService _authorizationService; + private readonly PaymentTypeRegistry _paymentTypeRegistry; - public GreenfieldStorePaymentMethodsController(BTCPayNetworkProvider btcPayNetworkProvider, IAuthorizationService authorizationService) + public GreenfieldStorePaymentMethodsController(BTCPayNetworkProvider btcPayNetworkProvider, IAuthorizationService authorizationService, PaymentTypeRegistry paymentTypeRegistry) { _btcPayNetworkProvider = btcPayNetworkProvider; _authorizationService = authorizationService; + _paymentTypeRegistry = paymentTypeRegistry; } [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -40,7 +43,7 @@ namespace BTCPayServer.Controllers.Greenfield var canModifyStore = (await _authorizationService.AuthorizeAsync(User, null, new PolicyRequirement(Policies.CanModifyStoreSettings))).Succeeded; ; - return Ok(Store.GetSupportedPaymentMethods(_btcPayNetworkProvider) + return Ok(Store.GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry) .Where(method => enabled is null || (enabled is false && excludedPaymentMethods.Match(method.PaymentId))) .ToDictionary( diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs index b7f2bbe77..c1ccebeff 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldStoresController.cs @@ -40,7 +40,7 @@ namespace BTCPayServer.Controllers.Greenfield public Task>> GetStores() { var stores = HttpContext.GetStoresData(); - return Task.FromResult>>(Ok(stores.Select(FromModel))); + return Task.FromResult>>(Ok(stores.Select(data => FromModel(data, _paymentTypeRegistry)))); } [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -52,7 +52,7 @@ namespace BTCPayServer.Controllers.Greenfield { return StoreNotFound(); } - return Ok(FromModel(store)); + return Ok(FromModel(store, _paymentTypeRegistry)); } [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -89,7 +89,7 @@ namespace BTCPayServer.Controllers.Greenfield _paymentTypeRegistry.TryParsePaymentMethod(request.DefaultPaymentMethod, out var defaultPaymentMethodId); ToModel(request, store, defaultPaymentMethodId); await _storeRepository.CreateStore(_userManager.GetUserId(User), store); - return Ok(FromModel(store)); + return Ok(FromModel(store, _paymentTypeRegistry)); } [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] @@ -111,10 +111,10 @@ namespace BTCPayServer.Controllers.Greenfield ToModel(request, store, defaultPaymentMethodId); await _storeRepository.UpdateStore(store); - return Ok(FromModel(store)); + return Ok(FromModel(store, _paymentTypeRegistry)); } - internal static Client.Models.StoreData FromModel(Data.StoreData data) + internal static Client.Models.StoreData FromModel(StoreData data, PaymentTypeRegistry paymentTypeRegistry) { var storeBlob = data.GetStoreBlob(); return new Client.Models.StoreData @@ -124,7 +124,7 @@ namespace BTCPayServer.Controllers.Greenfield Website = data.StoreWebsite, SupportUrl = storeBlob.StoreSupportUrl, SpeedPolicy = data.SpeedPolicy, - DefaultPaymentMethod = data.GetDefaultPaymentId()?.ToStringNormalized(), + DefaultPaymentMethod = data.GetDefaultPaymentId(paymentTypeRegistry)?.ToStringNormalized(), //blob //we do not include DefaultCurrencyPairs,Spread, PreferredExchange, RateScripting, RateScript in this model and instead opt to set it in stores/storeid/rates endpoints //we do not include ExcludedPaymentMethods in this model and instead opt to set it in stores/storeid/payment-methods endpoints diff --git a/BTCPayServer/Controllers/GreenField/GreenfieldTestApiKeyController.cs b/BTCPayServer/Controllers/GreenField/GreenfieldTestApiKeyController.cs index 6b49ab860..da2260cbf 100644 --- a/BTCPayServer/Controllers/GreenField/GreenfieldTestApiKeyController.cs +++ b/BTCPayServer/Controllers/GreenField/GreenfieldTestApiKeyController.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using BTCPayServer.Abstractions.Constants; using BTCPayServer.Client; using BTCPayServer.Data; +using BTCPayServer.Payments; using BTCPayServer.Security; using BTCPayServer.Services.Stores; using Microsoft.AspNetCore.Authorization; @@ -22,14 +23,12 @@ namespace BTCPayServer.Controllers.Greenfield public class GreenfieldTestApiKeyController : ControllerBase { private readonly UserManager _userManager; - private readonly StoreRepository _storeRepository; - private readonly BTCPayServerClient _localBTCPayServerClient; + private readonly PaymentTypeRegistry _paymentTypeRegistry; - public GreenfieldTestApiKeyController(UserManager userManager, StoreRepository storeRepository, BTCPayServerClient localBTCPayServerClient) + public GreenfieldTestApiKeyController(UserManager userManager, PaymentTypeRegistry paymentTypeRegistry) { _userManager = userManager; - _storeRepository = storeRepository; - _localBTCPayServerClient = localBTCPayServerClient; + _paymentTypeRegistry = paymentTypeRegistry; } [HttpGet("me/id")] @@ -57,7 +56,7 @@ namespace BTCPayServer.Controllers.Greenfield [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] public BTCPayServer.Client.Models.StoreData[] GetCurrentUserStores() { - return this.HttpContext.GetStoresData().Select(Greenfield.GreenfieldStoresController.FromModel).ToArray(); + return this.HttpContext.GetStoresData().Select(data => Greenfield.GreenfieldStoresController.FromModel(data, _paymentTypeRegistry)).ToArray(); } [HttpGet("me/stores/{storeId}/can-view")] diff --git a/BTCPayServer/Controllers/UIWalletsController.cs b/BTCPayServer/Controllers/UIWalletsController.cs index 60344c019..122d4897a 100644 --- a/BTCPayServer/Controllers/UIWalletsController.cs +++ b/BTCPayServer/Controllers/UIWalletsController.cs @@ -66,6 +66,7 @@ namespace BTCPayServer.Controllers private readonly DelayedTransactionBroadcaster _broadcaster; private readonly PayjoinClient _payjoinClient; private readonly LabelService _labelService; + private readonly PaymentTypeRegistry _paymentTypeRegistry; private readonly PullPaymentHostedService _pullPaymentHostedService; private readonly WalletHistogramService _walletHistogramService; @@ -89,10 +90,12 @@ namespace BTCPayServer.Controllers PayjoinClient payjoinClient, IServiceProvider serviceProvider, PullPaymentHostedService pullPaymentHostedService, - LabelService labelService) + LabelService labelService, + PaymentTypeRegistry paymentTypeRegistry) { _currencyTable = currencyTable; _labelService = labelService; + _paymentTypeRegistry = paymentTypeRegistry; Repository = repo; WalletRepository = walletRepository; RateFetcher = rateProvider; @@ -171,7 +174,7 @@ namespace BTCPayServer.Controllers var stores = await Repository.GetStoresByUserId(GetUserId()); var onChainWallets = stores - .SelectMany(s => s.GetSupportedPaymentMethods(NetworkProvider) + .SelectMany(s => s.GetSupportedPaymentMethods(NetworkProvider, _paymentTypeRegistry) .OfType() .Select(d => ((Wallet: _walletProvider.GetWallet(d.Network), DerivationStrategy: d.AccountDerivation, diff --git a/BTCPayServer/Data/StoreDataExtensions.cs b/BTCPayServer/Data/StoreDataExtensions.cs index 122a3d272..1a36abdea 100644 --- a/BTCPayServer/Data/StoreDataExtensions.cs +++ b/BTCPayServer/Data/StoreDataExtensions.cs @@ -24,15 +24,15 @@ namespace BTCPayServer.Data return defaultPaymentId; } - public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks) + public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks, PaymentTypeRegistry paymentTypeRegistry) { - return GetEnabledPaymentMethods(storeData, networks).Select(method => method.PaymentId).ToArray(); + return GetEnabledPaymentMethods(storeData, networks, paymentTypeRegistry).Select(method => method.PaymentId).ToArray(); } - public static ISupportedPaymentMethod[] GetEnabledPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks) + public static ISupportedPaymentMethod[] GetEnabledPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks, PaymentTypeRegistry paymentTypeRegistry) { var excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods(); - var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks) + var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks, paymentTypeRegistry) .Where(a => !excludeFilter.Match(a.PaymentId)) .OrderByDescending(a => a.PaymentId.CryptoCode == "BTC") .ThenBy(a => a.PaymentId.CryptoCode) @@ -69,7 +69,7 @@ namespace BTCPayServer.Data return true; } - public static IEnumerable GetSupportedPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks) + public static IEnumerable GetSupportedPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks, PaymentTypeRegistry paymentTypeRegistry) { ArgumentNullException.ThrowIfNull(storeData); #pragma warning disable CS0618 @@ -80,7 +80,7 @@ namespace BTCPayServer.Data JObject strategies = JObject.Parse(storeData.DerivationStrategies); foreach (var strat in strategies.Properties()) { - if (!_paymentTypeRegistry.TryParsePaymentMethod(strat.Name, out var paymentMethodId)) + if (!paymentTypeRegistry.TryParsePaymentMethod(strat.Name, out var paymentMethodId)) { continue; } @@ -127,11 +127,8 @@ namespace BTCPayServer.Data bool existing = false; foreach (var strat in strategies.Properties().ToList()) { - if (!_paymentTypeRegistry.TryParsePaymentMethod(strat.Name, out var stratId)) - { - continue; - } - if (stratId == paymentMethodId) + + if (strat.Name == paymentMethodId.PaymentType.GetPaymentMethodId(paymentMethodId)) { if (supportedPaymentMethod == null) { @@ -151,19 +148,19 @@ namespace BTCPayServer.Data #pragma warning restore CS0618 } - public static bool IsLightningEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode) + public static bool IsLightningEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode, PaymentTypeRegistry paymentTypeRegistry) { - return IsPaymentTypeEnabled(storeData, networks, cryptoCode, LightningPaymentType.Instance); + return IsPaymentTypeEnabled(storeData, networks, cryptoCode, LightningPaymentType.Instance, paymentTypeRegistry); } - public static bool IsLNUrlEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode) + public static bool IsLNUrlEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode, PaymentTypeRegistry paymentTypeRegistry) { - return IsPaymentTypeEnabled(storeData, networks, cryptoCode, LNURLPayPaymentType.Instance); + return IsPaymentTypeEnabled(storeData, networks, cryptoCode, LNURLPayPaymentType.Instance, paymentTypeRegistry); } - private static bool IsPaymentTypeEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode, PaymentType paymentType) + private static bool IsPaymentTypeEnabled(this StoreData storeData, BTCPayNetworkProvider networks, string cryptoCode, PaymentType paymentType, PaymentTypeRegistry paymentTypeRegistry) { - var paymentMethods = storeData.GetSupportedPaymentMethods(networks); + var paymentMethods = storeData.GetSupportedPaymentMethods(networks, paymentTypeRegistry); var excludeFilters = storeData.GetStoreBlob().GetExcludedPaymentMethods(); return paymentMethods.Any(method => method.PaymentId.CryptoCode == cryptoCode && diff --git a/BTCPayServer/Extensions.cs b/BTCPayServer/Extensions.cs index 270fb3e6c..986ebbd56 100644 --- a/BTCPayServer/Extensions.cs +++ b/BTCPayServer/Extensions.cs @@ -125,9 +125,9 @@ namespace BTCPayServer return services; } - public static PaymentMethodId GetpaymentMethodId(this InvoiceCryptoInfo info) + public static PaymentMethodId GetpaymentMethodId(this InvoiceCryptoInfo info, PaymentTypeRegistry paymentTypeRegistry) { - return new PaymentMethodId(info.CryptoCode, PaymentTypes.Parse(info.PaymentType)); + return new PaymentMethodId(info.CryptoCode, paymentTypeRegistry.Parse(info.PaymentType)); } public static async Task CloseSocket(this WebSocket webSocket) diff --git a/BTCPayServer/ModelBinders/PaymentMethodIdModelBinder.cs b/BTCPayServer/ModelBinders/PaymentMethodIdModelBinder.cs index b773c689c..544fb8658 100644 --- a/BTCPayServer/ModelBinders/PaymentMethodIdModelBinder.cs +++ b/BTCPayServer/ModelBinders/PaymentMethodIdModelBinder.cs @@ -2,6 +2,7 @@ using System.Reflection; using System.Threading.Tasks; using BTCPayServer.Payments; using Microsoft.AspNetCore.Mvc.ModelBinding; +using Microsoft.Extensions.DependencyInjection; namespace BTCPayServer.ModelBinders { @@ -21,8 +22,8 @@ namespace BTCPayServer.ModelBinders { return Task.CompletedTask; } - - if (_paymentTypeRegistry.TryParsePaymentMethod(key, out var paymentId)) + var paymentTypeRegistry = bindingContext.HttpContext.RequestServices.GetRequiredService(); + if (paymentTypeRegistry.TryParsePaymentMethod(key, out var paymentId)) { bindingContext.Result = ModelBindingResult.Success(paymentId); }