This commit is contained in:
Kukks 2023-06-01 11:55:42 +02:00
parent 6366d2c053
commit 1258c46bf9
No known key found for this signature in database
GPG key ID: 8E5530D9D1C93097
13 changed files with 84 additions and 63 deletions

View file

@ -9,6 +9,7 @@ using BTCPayServer.Abstractions.Constants;
using BTCPayServer.Data; using BTCPayServer.Data;
using BTCPayServer.Filters; using BTCPayServer.Filters;
using BTCPayServer.Models; using BTCPayServer.Models;
using BTCPayServer.Payments;
using BTCPayServer.Rating; using BTCPayServer.Rating;
using BTCPayServer.Security; using BTCPayServer.Security;
using BTCPayServer.Security.Bitpay; using BTCPayServer.Security.Bitpay;
@ -30,6 +31,7 @@ namespace BTCPayServer.Controllers
readonly BTCPayNetworkProvider _networkProvider; readonly BTCPayNetworkProvider _networkProvider;
readonly CurrencyNameTable _currencyNameTable; readonly CurrencyNameTable _currencyNameTable;
readonly StoreRepository _storeRepo; readonly StoreRepository _storeRepo;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
private StoreData CurrentStore => HttpContext.GetStoreData(); private StoreData CurrentStore => HttpContext.GetStoreData();
@ -37,12 +39,13 @@ namespace BTCPayServer.Controllers
RateFetcher rateProviderFactory, RateFetcher rateProviderFactory,
BTCPayNetworkProvider networkProvider, BTCPayNetworkProvider networkProvider,
StoreRepository storeRepo, StoreRepository storeRepo,
CurrencyNameTable currencyNameTable) CurrencyNameTable currencyNameTable, PaymentTypeRegistry paymentTypeRegistry)
{ {
_rateProviderFactory = rateProviderFactory ?? throw new ArgumentNullException(nameof(rateProviderFactory)); _rateProviderFactory = rateProviderFactory ?? throw new ArgumentNullException(nameof(rateProviderFactory));
_networkProvider = networkProvider; _networkProvider = networkProvider;
_storeRepo = storeRepo; _storeRepo = storeRepo;
_currencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable)); _currencyNameTable = currencyNameTable ?? throw new ArgumentNullException(nameof(currencyNameTable));
_paymentTypeRegistry = paymentTypeRegistry;
} }
[Route("rates/{baseCurrency}")] [Route("rates/{baseCurrency}")]
@ -50,7 +53,7 @@ namespace BTCPayServer.Controllers
[BitpayAPIConstraint] [BitpayAPIConstraint]
public async Task<IActionResult> GetBaseCurrencyRates(string baseCurrency, CancellationToken cancellationToken) public async Task<IActionResult> 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)) var currencyCodes = supportedMethods.Where(method => !string.IsNullOrEmpty(method.PaymentId.CryptoCode))
.Select(method => method.PaymentId.CryptoCode).Distinct(); .Select(method => method.PaymentId.CryptoCode).Distinct();

View file

@ -28,17 +28,19 @@ namespace BTCPayServer.Controllers.Greenfield
private readonly IOptions<LightningNetworkOptions> _lightningNetworkOptions; private readonly IOptions<LightningNetworkOptions> _lightningNetworkOptions;
private readonly LightningClientFactoryService _lightningClientFactory; private readonly LightningClientFactoryService _lightningClientFactory;
private readonly BTCPayNetworkProvider _btcPayNetworkProvider; private readonly BTCPayNetworkProvider _btcPayNetworkProvider;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
public GreenfieldStoreLightningNodeApiController( public GreenfieldStoreLightningNodeApiController(
IOptions<LightningNetworkOptions> lightningNetworkOptions, IOptions<LightningNetworkOptions> lightningNetworkOptions,
LightningClientFactoryService lightningClientFactory, BTCPayNetworkProvider btcPayNetworkProvider, LightningClientFactoryService lightningClientFactory, BTCPayNetworkProvider btcPayNetworkProvider,
PoliciesSettings policiesSettings, PoliciesSettings policiesSettings,
IAuthorizationService authorizationService) : base( IAuthorizationService authorizationService, PaymentTypeRegistry paymentTypeRegistry) : base(
btcPayNetworkProvider, policiesSettings, authorizationService) btcPayNetworkProvider, policiesSettings, authorizationService)
{ {
_lightningNetworkOptions = lightningNetworkOptions; _lightningNetworkOptions = lightningNetworkOptions;
_lightningClientFactory = lightningClientFactory; _lightningClientFactory = lightningClientFactory;
_btcPayNetworkProvider = btcPayNetworkProvider; _btcPayNetworkProvider = btcPayNetworkProvider;
_paymentTypeRegistry = paymentTypeRegistry;
} }
[Authorize(Policy = Policies.CanUseLightningNodeInStore, [Authorize(Policy = Policies.CanUseLightningNodeInStore,
@ -151,7 +153,7 @@ namespace BTCPayServer.Controllers.Greenfield
} }
var id = new PaymentMethodId(cryptoCode, LightningPaymentType.Instance); var id = new PaymentMethodId(cryptoCode, LightningPaymentType.Instance);
var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider) var existing = store.GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry)
.OfType<LightningSupportedPaymentMethod>() .OfType<LightningSupportedPaymentMethod>()
.FirstOrDefault(d => d.PaymentId == id); .FirstOrDefault(d => d.PaymentId == id);
if (existing == null) if (existing == null)

View file

@ -32,22 +32,25 @@ namespace BTCPayServer.Controllers.Greenfield
private StoreData Store => HttpContext.GetStoreData(); private StoreData Store => HttpContext.GetStoreData();
private readonly StoreRepository _storeRepository; private readonly StoreRepository _storeRepository;
private readonly BTCPayNetworkProvider _btcPayNetworkProvider; private readonly BTCPayNetworkProvider _btcPayNetworkProvider;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
public GreenfieldStoreLNURLPayPaymentMethodsController( public GreenfieldStoreLNURLPayPaymentMethodsController(
StoreRepository storeRepository, StoreRepository storeRepository,
BTCPayNetworkProvider btcPayNetworkProvider) BTCPayNetworkProvider btcPayNetworkProvider,
PaymentTypeRegistry paymentTypeRegistry)
{ {
_storeRepository = storeRepository; _storeRepository = storeRepository;
_btcPayNetworkProvider = btcPayNetworkProvider; _btcPayNetworkProvider = btcPayNetworkProvider;
_paymentTypeRegistry = paymentTypeRegistry;
} }
public static IEnumerable<LNURLPayPaymentMethodData> GetLNURLPayPaymentMethods(StoreData store, public static IEnumerable<LNURLPayPaymentMethodData> GetLNURLPayPaymentMethods(StoreData store,
BTCPayNetworkProvider networkProvider, bool? enabled) BTCPayNetworkProvider networkProvider, bool? enabled, PaymentTypeRegistry paymentTypeRegistry)
{ {
var blob = store.GetStoreBlob(); var blob = store.GetStoreBlob();
var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods();
return store.GetSupportedPaymentMethods(networkProvider) return store.GetSupportedPaymentMethods(networkProvider, paymentTypeRegistry)
.Where((method) => method.PaymentId.PaymentType == LNURLPayPaymentType.Instance) .Where((method) => method.PaymentId.PaymentType == LNURLPayPaymentType.Instance)
.OfType<LNURLPaySupportedPaymentMethod>() .OfType<LNURLPaySupportedPaymentMethod>()
.Select(paymentMethod => .Select(paymentMethod =>
@ -67,7 +70,7 @@ namespace BTCPayServer.Controllers.Greenfield
string storeId, string storeId,
[FromQuery] bool? enabled) [FromQuery] bool? enabled)
{ {
return Ok(GetLNURLPayPaymentMethods(Store, _btcPayNetworkProvider, enabled)); return Ok(GetLNURLPayPaymentMethods(Store, _btcPayNetworkProvider, enabled, _paymentTypeRegistry));
} }
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -110,7 +113,7 @@ namespace BTCPayServer.Controllers.Greenfield
AssertCryptoCodeWallet(cryptoCode, out _); AssertCryptoCodeWallet(cryptoCode, out _);
var lnMethod = GreenfieldStoreLightningNetworkPaymentMethodsController.GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, var lnMethod = GreenfieldStoreLightningNetworkPaymentMethodsController.GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider,
cryptoCode, Store); cryptoCode, Store, _paymentTypeRegistry);
if ((lnMethod is null || lnMethod.Enabled is false) && paymentMethodData.Enabled) if ((lnMethod is null || lnMethod.Enabled is false) && paymentMethodData.Enabled)
{ {
@ -143,7 +146,7 @@ namespace BTCPayServer.Controllers.Greenfield
var storeBlob = store.GetStoreBlob(); var storeBlob = store.GetStoreBlob();
var id = new PaymentMethodId(cryptoCode, LNURLPayPaymentType.Instance); var id = new PaymentMethodId(cryptoCode, LNURLPayPaymentType.Instance);
var paymentMethod = store var paymentMethod = store
.GetSupportedPaymentMethods(_btcPayNetworkProvider) .GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry)
.OfType<LNURLPaySupportedPaymentMethod>() .OfType<LNURLPaySupportedPaymentMethod>()
.FirstOrDefault(method => method.PaymentId == id); .FirstOrDefault(method => method.PaymentId == id);

View file

@ -37,27 +37,30 @@ namespace BTCPayServer.Controllers.Greenfield
private readonly StoreRepository _storeRepository; private readonly StoreRepository _storeRepository;
private readonly BTCPayNetworkProvider _btcPayNetworkProvider; private readonly BTCPayNetworkProvider _btcPayNetworkProvider;
private readonly IAuthorizationService _authorizationService; private readonly IAuthorizationService _authorizationService;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
public GreenfieldStoreLightningNetworkPaymentMethodsController( public GreenfieldStoreLightningNetworkPaymentMethodsController(
StoreRepository storeRepository, StoreRepository storeRepository,
BTCPayNetworkProvider btcPayNetworkProvider, BTCPayNetworkProvider btcPayNetworkProvider,
IAuthorizationService authorizationService, IAuthorizationService authorizationService,
ISettingsRepository settingsRepository, ISettingsRepository settingsRepository,
PoliciesSettings policiesSettings) PoliciesSettings policiesSettings,
PaymentTypeRegistry paymentTypeRegistry)
{ {
_storeRepository = storeRepository; _storeRepository = storeRepository;
_btcPayNetworkProvider = btcPayNetworkProvider; _btcPayNetworkProvider = btcPayNetworkProvider;
_authorizationService = authorizationService; _authorizationService = authorizationService;
_paymentTypeRegistry = paymentTypeRegistry;
PoliciesSettings = policiesSettings; PoliciesSettings = policiesSettings;
} }
public static IEnumerable<LightningNetworkPaymentMethodData> GetLightningPaymentMethods(StoreData store, public static IEnumerable<LightningNetworkPaymentMethodData> GetLightningPaymentMethods(StoreData store,
BTCPayNetworkProvider networkProvider, bool? enabled) BTCPayNetworkProvider networkProvider, bool? enabled, PaymentTypeRegistry paymentTypeRegistry)
{ {
var blob = store.GetStoreBlob(); var blob = store.GetStoreBlob();
var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods();
return store.GetSupportedPaymentMethods(networkProvider) return store.GetSupportedPaymentMethods(networkProvider, paymentTypeRegistry )
.Where((method) => method.PaymentId.PaymentType == LightningPaymentType.Instance) .Where((method) => method.PaymentId.PaymentType == LightningPaymentType.Instance)
.OfType<LightningSupportedPaymentMethod>() .OfType<LightningSupportedPaymentMethod>()
.Select(paymentMethod => .Select(paymentMethod =>
@ -79,7 +82,7 @@ namespace BTCPayServer.Controllers.Greenfield
string storeId, string storeId,
[FromQuery] bool? enabled) [FromQuery] bool? enabled)
{ {
return Ok(GetLightningPaymentMethods(Store, _btcPayNetworkProvider, enabled)); return Ok(GetLightningPaymentMethods(Store, _btcPayNetworkProvider, enabled, _paymentTypeRegistry));
} }
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -88,7 +91,7 @@ namespace BTCPayServer.Controllers.Greenfield
{ {
AssertSupportLightning(cryptoCode); AssertSupportLightning(cryptoCode);
var method = GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, Store); var method = GetExistingLightningLikePaymentMethod(_btcPayNetworkProvider, cryptoCode, Store, _paymentTypeRegistry);
if (method is null) if (method is null)
{ {
throw ErrorPaymentMethodNotConfigured(); throw ErrorPaymentMethodNotConfigured();
@ -137,7 +140,7 @@ namespace BTCPayServer.Controllers.Greenfield
LightningSupportedPaymentMethod? paymentMethod = null; LightningSupportedPaymentMethod? paymentMethod = null;
var store = Store; var store = Store;
var storeBlob = store.GetStoreBlob(); 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 (existing == null || existing.ConnectionString != request.ConnectionString)
{ {
if (request.ConnectionString == LightningSupportedPaymentMethod.InternalNode) if (request.ConnectionString == LightningSupportedPaymentMethod.InternalNode)
@ -187,17 +190,17 @@ namespace BTCPayServer.Controllers.Greenfield
storeBlob.SetExcluded(paymentMethodId, !request.Enabled); storeBlob.SetExcluded(paymentMethodId, !request.Enabled);
store.SetStoreBlob(storeBlob); store.SetStoreBlob(storeBlob);
await _storeRepository.UpdateStore(store); 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, public static LightningNetworkPaymentMethodData? GetExistingLightningLikePaymentMethod(BTCPayNetworkProvider btcPayNetworkProvider, string cryptoCode,
StoreData store) StoreData store, PaymentTypeRegistry paymentTypeRegistry)
{ {
var storeBlob = store.GetStoreBlob(); var storeBlob = store.GetStoreBlob();
var id = new PaymentMethodId(cryptoCode, LightningPaymentType.Instance); var id = new PaymentMethodId(cryptoCode, LightningPaymentType.Instance);
var paymentMethod = store var paymentMethod = store
.GetSupportedPaymentMethods(btcPayNetworkProvider) .GetSupportedPaymentMethods(btcPayNetworkProvider, paymentTypeRegistry)
.OfType<LightningSupportedPaymentMethod>() .OfType<LightningSupportedPaymentMethod>()
.FirstOrDefault(method => method.PaymentId == id); .FirstOrDefault(method => method.PaymentId == id);

View file

@ -38,6 +38,7 @@ namespace BTCPayServer.Controllers.Greenfield
private readonly IAuthorizationService _authorizationService; private readonly IAuthorizationService _authorizationService;
private readonly ExplorerClientProvider _explorerClientProvider; private readonly ExplorerClientProvider _explorerClientProvider;
private readonly EventAggregator _eventAggregator; private readonly EventAggregator _eventAggregator;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
public GreenfieldStoreOnChainPaymentMethodsController( public GreenfieldStoreOnChainPaymentMethodsController(
StoreRepository storeRepository, StoreRepository storeRepository,
@ -46,7 +47,8 @@ namespace BTCPayServer.Controllers.Greenfield
IAuthorizationService authorizationService, IAuthorizationService authorizationService,
ExplorerClientProvider explorerClientProvider, ExplorerClientProvider explorerClientProvider,
PoliciesSettings policiesSettings, PoliciesSettings policiesSettings,
EventAggregator eventAggregator) EventAggregator eventAggregator,
PaymentTypeRegistry paymentTypeRegistry)
{ {
_storeRepository = storeRepository; _storeRepository = storeRepository;
_btcPayNetworkProvider = btcPayNetworkProvider; _btcPayNetworkProvider = btcPayNetworkProvider;
@ -54,16 +56,17 @@ namespace BTCPayServer.Controllers.Greenfield
_authorizationService = authorizationService; _authorizationService = authorizationService;
_explorerClientProvider = explorerClientProvider; _explorerClientProvider = explorerClientProvider;
_eventAggregator = eventAggregator; _eventAggregator = eventAggregator;
_paymentTypeRegistry = paymentTypeRegistry;
PoliciesSettings = policiesSettings; PoliciesSettings = policiesSettings;
} }
public static IEnumerable<OnChainPaymentMethodData> GetOnChainPaymentMethods(StoreData store, public static IEnumerable<OnChainPaymentMethodData> GetOnChainPaymentMethods(StoreData store,
BTCPayNetworkProvider networkProvider, bool? enabled) BTCPayNetworkProvider networkProvider, bool? enabled, PaymentTypeRegistry paymentTypeRegistry)
{ {
var blob = store.GetStoreBlob(); var blob = store.GetStoreBlob();
var excludedPaymentMethods = blob.GetExcludedPaymentMethods(); var excludedPaymentMethods = blob.GetExcludedPaymentMethods();
return store.GetSupportedPaymentMethods(networkProvider) return store.GetSupportedPaymentMethods(networkProvider, paymentTypeRegistry)
.Where((method) => method.PaymentId.PaymentType == BitcoinPaymentType.Instance) .Where((method) => method.PaymentId.PaymentType == BitcoinPaymentType.Instance)
.OfType<DerivationSchemeSettings>() .OfType<DerivationSchemeSettings>()
.Select(strategy => .Select(strategy =>
@ -81,7 +84,7 @@ namespace BTCPayServer.Controllers.Greenfield
string storeId, string storeId,
[FromQuery] bool? enabled) [FromQuery] bool? enabled)
{ {
return Ok(GetOnChainPaymentMethods(Store, _btcPayNetworkProvider, enabled)); return Ok(GetOnChainPaymentMethods(Store, _btcPayNetworkProvider, enabled, _paymentTypeRegistry));
} }
[Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -295,7 +298,7 @@ namespace BTCPayServer.Controllers.Greenfield
var storeBlob = store.GetStoreBlob(); var storeBlob = store.GetStoreBlob();
var id = new PaymentMethodId(cryptoCode, BitcoinPaymentType.Instance); var id = new PaymentMethodId(cryptoCode, BitcoinPaymentType.Instance);
var paymentMethod = store var paymentMethod = store
.GetSupportedPaymentMethods(_btcPayNetworkProvider) .GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry)
.OfType<DerivationSchemeSettings>() .OfType<DerivationSchemeSettings>()
.FirstOrDefault(method => method.PaymentId == id); .FirstOrDefault(method => method.PaymentId == id);

View file

@ -14,6 +14,7 @@ using BTCPayServer.Client.Models;
using BTCPayServer.Data; using BTCPayServer.Data;
using BTCPayServer.HostedServices; using BTCPayServer.HostedServices;
using BTCPayServer.Models.WalletViewModels; using BTCPayServer.Models.WalletViewModels;
using BTCPayServer.Payments;
using BTCPayServer.Payments.PayJoin; using BTCPayServer.Payments.PayJoin;
using BTCPayServer.Payments.PayJoin.Sender; using BTCPayServer.Payments.PayJoin.Sender;
using BTCPayServer.Services; using BTCPayServer.Services;
@ -54,6 +55,7 @@ namespace BTCPayServer.Controllers.Greenfield
private readonly WalletReceiveService _walletReceiveService; private readonly WalletReceiveService _walletReceiveService;
private readonly IFeeProviderFactory _feeProviderFactory; private readonly IFeeProviderFactory _feeProviderFactory;
private readonly UTXOLocker _utxoLocker; private readonly UTXOLocker _utxoLocker;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
public GreenfieldStoreOnChainWalletsController( public GreenfieldStoreOnChainWalletsController(
IAuthorizationService authorizationService, IAuthorizationService authorizationService,
@ -69,7 +71,8 @@ namespace BTCPayServer.Controllers.Greenfield
EventAggregator eventAggregator, EventAggregator eventAggregator,
WalletReceiveService walletReceiveService, WalletReceiveService walletReceiveService,
IFeeProviderFactory feeProviderFactory, IFeeProviderFactory feeProviderFactory,
UTXOLocker utxoLocker UTXOLocker utxoLocker,
PaymentTypeRegistry paymentTypeRegistry
) )
{ {
_authorizationService = authorizationService; _authorizationService = authorizationService;
@ -86,6 +89,7 @@ namespace BTCPayServer.Controllers.Greenfield
_walletReceiveService = walletReceiveService; _walletReceiveService = walletReceiveService;
_feeProviderFactory = feeProviderFactory; _feeProviderFactory = feeProviderFactory;
_utxoLocker = utxoLocker; _utxoLocker = utxoLocker;
_paymentTypeRegistry = paymentTypeRegistry;
} }
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -801,7 +805,7 @@ namespace BTCPayServer.Controllers.Greenfield
private DerivationSchemeSettings? GetDerivationSchemeSettings(string cryptoCode) private DerivationSchemeSettings? GetDerivationSchemeSettings(string cryptoCode)
{ {
var paymentMethod = Store var paymentMethod = Store
.GetSupportedPaymentMethods(_btcPayNetworkProvider) .GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry)
.OfType<DerivationSchemeSettings>() .OfType<DerivationSchemeSettings>()
.FirstOrDefault(p => .FirstOrDefault(p =>
p.PaymentId.PaymentType == Payments.BitcoinPaymentType.Instance && p.PaymentId.PaymentType == Payments.BitcoinPaymentType.Instance &&

View file

@ -6,6 +6,7 @@ using BTCPayServer.Abstractions.Constants;
using BTCPayServer.Client; using BTCPayServer.Client;
using BTCPayServer.Client.Models; using BTCPayServer.Client.Models;
using BTCPayServer.Data; using BTCPayServer.Data;
using BTCPayServer.Payments;
using BTCPayServer.Security; using BTCPayServer.Security;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.Cors;
@ -22,11 +23,13 @@ namespace BTCPayServer.Controllers.Greenfield
private StoreData Store => HttpContext.GetStoreData(); private StoreData Store => HttpContext.GetStoreData();
private readonly BTCPayNetworkProvider _btcPayNetworkProvider; private readonly BTCPayNetworkProvider _btcPayNetworkProvider;
private readonly IAuthorizationService _authorizationService; private readonly IAuthorizationService _authorizationService;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
public GreenfieldStorePaymentMethodsController(BTCPayNetworkProvider btcPayNetworkProvider, IAuthorizationService authorizationService) public GreenfieldStorePaymentMethodsController(BTCPayNetworkProvider btcPayNetworkProvider, IAuthorizationService authorizationService, PaymentTypeRegistry paymentTypeRegistry)
{ {
_btcPayNetworkProvider = btcPayNetworkProvider; _btcPayNetworkProvider = btcPayNetworkProvider;
_authorizationService = authorizationService; _authorizationService = authorizationService;
_paymentTypeRegistry = paymentTypeRegistry;
} }
[Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -40,7 +43,7 @@ namespace BTCPayServer.Controllers.Greenfield
var canModifyStore = (await _authorizationService.AuthorizeAsync(User, null, var canModifyStore = (await _authorizationService.AuthorizeAsync(User, null,
new PolicyRequirement(Policies.CanModifyStoreSettings))).Succeeded; new PolicyRequirement(Policies.CanModifyStoreSettings))).Succeeded;
; ;
return Ok(Store.GetSupportedPaymentMethods(_btcPayNetworkProvider) return Ok(Store.GetSupportedPaymentMethods(_btcPayNetworkProvider, _paymentTypeRegistry)
.Where(method => .Where(method =>
enabled is null || (enabled is false && excludedPaymentMethods.Match(method.PaymentId))) enabled is null || (enabled is false && excludedPaymentMethods.Match(method.PaymentId)))
.ToDictionary( .ToDictionary(

View file

@ -40,7 +40,7 @@ namespace BTCPayServer.Controllers.Greenfield
public Task<ActionResult<IEnumerable<Client.Models.StoreData>>> GetStores() public Task<ActionResult<IEnumerable<Client.Models.StoreData>>> GetStores()
{ {
var stores = HttpContext.GetStoresData(); var stores = HttpContext.GetStoresData();
return Task.FromResult<ActionResult<IEnumerable<Client.Models.StoreData>>>(Ok(stores.Select(FromModel))); return Task.FromResult<ActionResult<IEnumerable<Client.Models.StoreData>>>(Ok(stores.Select(data => FromModel(data, _paymentTypeRegistry))));
} }
[Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -52,7 +52,7 @@ namespace BTCPayServer.Controllers.Greenfield
{ {
return StoreNotFound(); return StoreNotFound();
} }
return Ok(FromModel(store)); return Ok(FromModel(store, _paymentTypeRegistry));
} }
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -89,7 +89,7 @@ namespace BTCPayServer.Controllers.Greenfield
_paymentTypeRegistry.TryParsePaymentMethod(request.DefaultPaymentMethod, out var defaultPaymentMethodId); _paymentTypeRegistry.TryParsePaymentMethod(request.DefaultPaymentMethod, out var defaultPaymentMethodId);
ToModel(request, store, defaultPaymentMethodId); ToModel(request, store, defaultPaymentMethodId);
await _storeRepository.CreateStore(_userManager.GetUserId(User), store); await _storeRepository.CreateStore(_userManager.GetUserId(User), store);
return Ok(FromModel(store)); return Ok(FromModel(store, _paymentTypeRegistry));
} }
[Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanModifyStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
@ -111,10 +111,10 @@ namespace BTCPayServer.Controllers.Greenfield
ToModel(request, store, defaultPaymentMethodId); ToModel(request, store, defaultPaymentMethodId);
await _storeRepository.UpdateStore(store); 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(); var storeBlob = data.GetStoreBlob();
return new Client.Models.StoreData return new Client.Models.StoreData
@ -124,7 +124,7 @@ namespace BTCPayServer.Controllers.Greenfield
Website = data.StoreWebsite, Website = data.StoreWebsite,
SupportUrl = storeBlob.StoreSupportUrl, SupportUrl = storeBlob.StoreSupportUrl,
SpeedPolicy = data.SpeedPolicy, SpeedPolicy = data.SpeedPolicy,
DefaultPaymentMethod = data.GetDefaultPaymentId()?.ToStringNormalized(), DefaultPaymentMethod = data.GetDefaultPaymentId(paymentTypeRegistry)?.ToStringNormalized(),
//blob //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 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 //we do not include ExcludedPaymentMethods in this model and instead opt to set it in stores/storeid/payment-methods endpoints

View file

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using BTCPayServer.Abstractions.Constants; using BTCPayServer.Abstractions.Constants;
using BTCPayServer.Client; using BTCPayServer.Client;
using BTCPayServer.Data; using BTCPayServer.Data;
using BTCPayServer.Payments;
using BTCPayServer.Security; using BTCPayServer.Security;
using BTCPayServer.Services.Stores; using BTCPayServer.Services.Stores;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
@ -22,14 +23,12 @@ namespace BTCPayServer.Controllers.Greenfield
public class GreenfieldTestApiKeyController : ControllerBase public class GreenfieldTestApiKeyController : ControllerBase
{ {
private readonly UserManager<ApplicationUser> _userManager; private readonly UserManager<ApplicationUser> _userManager;
private readonly StoreRepository _storeRepository; private readonly PaymentTypeRegistry _paymentTypeRegistry;
private readonly BTCPayServerClient _localBTCPayServerClient;
public GreenfieldTestApiKeyController(UserManager<ApplicationUser> userManager, StoreRepository storeRepository, BTCPayServerClient localBTCPayServerClient) public GreenfieldTestApiKeyController(UserManager<ApplicationUser> userManager, PaymentTypeRegistry paymentTypeRegistry)
{ {
_userManager = userManager; _userManager = userManager;
_storeRepository = storeRepository; _paymentTypeRegistry = paymentTypeRegistry;
_localBTCPayServerClient = localBTCPayServerClient;
} }
[HttpGet("me/id")] [HttpGet("me/id")]
@ -57,7 +56,7 @@ namespace BTCPayServer.Controllers.Greenfield
[Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)] [Authorize(Policy = Policies.CanViewStoreSettings, AuthenticationSchemes = AuthenticationSchemes.Greenfield)]
public BTCPayServer.Client.Models.StoreData[] GetCurrentUserStores() 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")] [HttpGet("me/stores/{storeId}/can-view")]

View file

@ -66,6 +66,7 @@ namespace BTCPayServer.Controllers
private readonly DelayedTransactionBroadcaster _broadcaster; private readonly DelayedTransactionBroadcaster _broadcaster;
private readonly PayjoinClient _payjoinClient; private readonly PayjoinClient _payjoinClient;
private readonly LabelService _labelService; private readonly LabelService _labelService;
private readonly PaymentTypeRegistry _paymentTypeRegistry;
private readonly PullPaymentHostedService _pullPaymentHostedService; private readonly PullPaymentHostedService _pullPaymentHostedService;
private readonly WalletHistogramService _walletHistogramService; private readonly WalletHistogramService _walletHistogramService;
@ -89,10 +90,12 @@ namespace BTCPayServer.Controllers
PayjoinClient payjoinClient, PayjoinClient payjoinClient,
IServiceProvider serviceProvider, IServiceProvider serviceProvider,
PullPaymentHostedService pullPaymentHostedService, PullPaymentHostedService pullPaymentHostedService,
LabelService labelService) LabelService labelService,
PaymentTypeRegistry paymentTypeRegistry)
{ {
_currencyTable = currencyTable; _currencyTable = currencyTable;
_labelService = labelService; _labelService = labelService;
_paymentTypeRegistry = paymentTypeRegistry;
Repository = repo; Repository = repo;
WalletRepository = walletRepository; WalletRepository = walletRepository;
RateFetcher = rateProvider; RateFetcher = rateProvider;
@ -171,7 +174,7 @@ namespace BTCPayServer.Controllers
var stores = await Repository.GetStoresByUserId(GetUserId()); var stores = await Repository.GetStoresByUserId(GetUserId());
var onChainWallets = stores var onChainWallets = stores
.SelectMany(s => s.GetSupportedPaymentMethods(NetworkProvider) .SelectMany(s => s.GetSupportedPaymentMethods(NetworkProvider, _paymentTypeRegistry)
.OfType<DerivationSchemeSettings>() .OfType<DerivationSchemeSettings>()
.Select(d => ((Wallet: _walletProvider.GetWallet(d.Network), .Select(d => ((Wallet: _walletProvider.GetWallet(d.Network),
DerivationStrategy: d.AccountDerivation, DerivationStrategy: d.AccountDerivation,

View file

@ -24,15 +24,15 @@ namespace BTCPayServer.Data
return defaultPaymentId; 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 excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods();
var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks) var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks, paymentTypeRegistry)
.Where(a => !excludeFilter.Match(a.PaymentId)) .Where(a => !excludeFilter.Match(a.PaymentId))
.OrderByDescending(a => a.PaymentId.CryptoCode == "BTC") .OrderByDescending(a => a.PaymentId.CryptoCode == "BTC")
.ThenBy(a => a.PaymentId.CryptoCode) .ThenBy(a => a.PaymentId.CryptoCode)
@ -69,7 +69,7 @@ namespace BTCPayServer.Data
return true; return true;
} }
public static IEnumerable<ISupportedPaymentMethod> GetSupportedPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks) public static IEnumerable<ISupportedPaymentMethod> GetSupportedPaymentMethods(this StoreData storeData, BTCPayNetworkProvider networks, PaymentTypeRegistry paymentTypeRegistry)
{ {
ArgumentNullException.ThrowIfNull(storeData); ArgumentNullException.ThrowIfNull(storeData);
#pragma warning disable CS0618 #pragma warning disable CS0618
@ -80,7 +80,7 @@ namespace BTCPayServer.Data
JObject strategies = JObject.Parse(storeData.DerivationStrategies); JObject strategies = JObject.Parse(storeData.DerivationStrategies);
foreach (var strat in strategies.Properties()) foreach (var strat in strategies.Properties())
{ {
if (!_paymentTypeRegistry.TryParsePaymentMethod(strat.Name, out var paymentMethodId)) if (!paymentTypeRegistry.TryParsePaymentMethod(strat.Name, out var paymentMethodId))
{ {
continue; continue;
} }
@ -127,11 +127,8 @@ namespace BTCPayServer.Data
bool existing = false; bool existing = false;
foreach (var strat in strategies.Properties().ToList()) foreach (var strat in strategies.Properties().ToList())
{ {
if (!_paymentTypeRegistry.TryParsePaymentMethod(strat.Name, out var stratId))
{ if (strat.Name == paymentMethodId.PaymentType.GetPaymentMethodId(paymentMethodId))
continue;
}
if (stratId == paymentMethodId)
{ {
if (supportedPaymentMethod == null) if (supportedPaymentMethod == null)
{ {
@ -151,19 +148,19 @@ namespace BTCPayServer.Data
#pragma warning restore CS0618 #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(); var excludeFilters = storeData.GetStoreBlob().GetExcludedPaymentMethods();
return paymentMethods.Any(method => return paymentMethods.Any(method =>
method.PaymentId.CryptoCode == cryptoCode && method.PaymentId.CryptoCode == cryptoCode &&

View file

@ -125,9 +125,9 @@ namespace BTCPayServer
return services; 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) public static async Task CloseSocket(this WebSocket webSocket)

View file

@ -2,6 +2,7 @@ using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Payments; using BTCPayServer.Payments;
using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.Extensions.DependencyInjection;
namespace BTCPayServer.ModelBinders namespace BTCPayServer.ModelBinders
{ {
@ -21,8 +22,8 @@ namespace BTCPayServer.ModelBinders
{ {
return Task.CompletedTask; return Task.CompletedTask;
} }
var paymentTypeRegistry = bindingContext.HttpContext.RequestServices.GetRequiredService<PaymentTypeRegistry>();
if (_paymentTypeRegistry.TryParsePaymentMethod(key, out var paymentId)) if (paymentTypeRegistry.TryParsePaymentMethod(key, out var paymentId))
{ {
bindingContext.Result = ModelBindingResult.Success(paymentId); bindingContext.Result = ModelBindingResult.Success(paymentId);
} }