Add experimental mode

This commit is contained in:
nicolas.dorier 2022-05-23 10:46:51 +09:00
parent c7d0537bf9
commit 3285f24fe9
No known key found for this signature in database
GPG key ID: 6618763EF09186FE
10 changed files with 60 additions and 16 deletions

View file

@ -137,6 +137,8 @@ namespace BTCPayServer.Tests
}
if (CheatMode)
config.AppendLine("cheatmode=1");
if (Experimental)
config.AppendLine("experimental=1");
config.AppendLine($"torrcfile={TestUtils.GetTestDataFullPath("Tor/torrc")}");
config.AppendLine($"socksendpoint={SocksEndpoint}");
@ -291,6 +293,7 @@ namespace BTCPayServer.Tests
public string SSHKeyFile { get; internal set; }
public string SSHConnection { get; set; }
public bool NoCSP { get; set; }
public bool Experimental { get; internal set; }
public T GetController<T>(string userId = null, string storeId = null, bool isAdmin = false) where T : Controller
{

View file

@ -2519,6 +2519,7 @@ namespace BTCPayServer.Tests
public async Task CustodiansControllerTests()
{
using var tester = CreateServerTester();
tester.PayTester.Experimental = true;
await tester.StartAsync();
var unauthClient = new BTCPayServerClient(tester.PayTester.ServerUri);
await AssertHttpError(401, async () => await unauthClient.GetCustodians());
@ -2538,6 +2539,7 @@ namespace BTCPayServer.Tests
{
using var tester = CreateServerTester();
tester.PayTester.Experimental = true;
await tester.StartAsync();
var admin = tester.NewAccount();
@ -2709,6 +2711,7 @@ namespace BTCPayServer.Tests
public async Task CustodianTests()
{
using var tester = CreateServerTester();
tester.PayTester.Experimental = true;
await tester.StartAsync();
var admin = tester.NewAccount();

View file

@ -147,6 +147,7 @@ namespace BTCPayServer.Configuration
PluginRemote = conf.GetOrDefault("plugin-remote", "btcpayserver/btcpayserver-plugins");
RecommendedPlugins = conf.GetOrDefault("recommended-plugins", "").ToLowerInvariant().Split('\r', '\n', '\t', ' ').Where(s => !string.IsNullOrEmpty(s)).Distinct().ToArray();
CheatMode = conf.GetOrDefault("cheatmode", false);
Experimental = conf.GetOrDefault("experimental", false);
if (CheatMode && this.NetworkType == ChainName.Mainnet)
throw new ConfigException($"cheatmode can't be used on mainnet");
}
@ -154,6 +155,7 @@ namespace BTCPayServer.Configuration
public string PluginRemote { get; set; }
public string[] RecommendedPlugins { get; set; }
public bool CheatMode { get; set; }
public bool Experimental { get; set; }
private SSHSettings ParseSSHConfiguration(IConfiguration conf)
{

View file

@ -49,7 +49,8 @@ namespace BTCPayServer.Configuration
app.Option("--plugin-remote", "Which github repository to fetch the available plugins list (default:btcpayserver/btcpayserver-plugins)", CommandOptionType.SingleValue);
app.Option("--recommended-plugins", "Plugins which would be marked as recommended to be installed. Separated by newline or space", CommandOptionType.MultipleValue);
app.Option("--xforwardedproto", "If specified, set X-Forwarded-Proto to the specified value, this may be useful if your reverse proxy handle https but is not configured to add X-Forwarded-Proto (example: --xforwardedproto https)", CommandOptionType.SingleValue);
app.Option("--cheatmode", "Add elements in the UI to facilitate dev-time testing (Default false)", CommandOptionType.BoolValue);
app.Option("--cheatmode", "Add some helper UI to facilitate dev-time testing (Default false)", CommandOptionType.BoolValue);
app.Option("--experimental", "Enable experimental features (Default false)", CommandOptionType.BoolValue);
app.Option("--explorerpostgres", $"Connection string to the postgres database of NBXplorer. (optional, used for dashboard and reporting features)", CommandOptionType.SingleValue);
foreach (var network in provider.GetAll().OfType<BTCPayNetwork>())

View file

@ -10,6 +10,7 @@ using BTCPayServer.Abstractions.Extensions;
using BTCPayServer.Client;
using BTCPayServer.Client.Models;
using BTCPayServer.Data;
using BTCPayServer.Filters;
using BTCPayServer.Security;
using BTCPayServer.Services.Custodian;
using BTCPayServer.Services.Custodian.Client;
@ -38,6 +39,7 @@ namespace BTCPayServer.Controllers.Greenfield
[Authorize(AuthenticationSchemes = AuthenticationSchemes.GreenfieldAPIKeys)]
[EnableCors(CorsPolicies.All)]
[CustodianExceptionFilter]
[ExperimentalRouteAttribute] // if you remove this, also remove "x_experimental": true in swagger.template.custodians.json
public class GreenfieldCustodianAccountController : ControllerBase
{
private readonly CustodianAccountRepository _custodianAccountRepository;

View file

@ -3,6 +3,7 @@ using System.Linq;
using BTCPayServer.Abstractions.Constants;
using BTCPayServer.Abstractions.Custodians;
using BTCPayServer.Client.Models;
using BTCPayServer.Filters;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
@ -12,6 +13,7 @@ namespace BTCPayServer.Controllers.Greenfield
[ApiController]
[Authorize(AuthenticationSchemes = AuthenticationSchemes.GreenfieldAPIKeys)]
[EnableCors(CorsPolicies.All)]
[ExperimentalRouteAttribute] // if you remove this, also remove "x_experimental": true in swagger.template.custodians.json
public class GreenfieldCustodianController : ControllerBase
{
private readonly IEnumerable<ICustodian> _custodianRegistry;

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using BTCPayServer.Services;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
using Microsoft.Extensions.DependencyInjection;
namespace BTCPayServer.Filters
{
public class ExperimentalRouteAttribute : Attribute, IActionConstraint
{
public int Order => 100;
public bool Accept(ActionConstraintContext context)
{
return context.RouteContext.HttpContext.RequestServices.GetRequiredService<BTCPayServerEnvironment>().Experimental;
}
}
}

View file

@ -35,6 +35,7 @@ namespace BTCPayServer.Services
NetworkType = provider.NetworkType;
this.torServices = torServices;
CheatMode = opts.CheatMode;
Experimental = opts.Experimental;
}
public IWebHostEnvironment Environment
{
@ -80,6 +81,8 @@ namespace BTCPayServer.Services
public HttpContext Context => httpContext.HttpContext;
public bool Experimental { get; set; }
public override string ToString()
{
StringBuilder txt = new StringBuilder();

View file

@ -1,4 +1,4 @@
using System.IO;
using System.IO;
using System.Threading.Tasks;
using BTCPayServer.Abstractions.Contracts;
using Microsoft.AspNetCore.Hosting;
@ -11,11 +11,15 @@ public class DefaultSwaggerProvider: ISwaggerProvider
{
private readonly IFileProvider _fileProvider;
public DefaultSwaggerProvider(IWebHostEnvironment webHostEnvironment)
public DefaultSwaggerProvider(IWebHostEnvironment webHostEnvironment, BTCPayServerEnvironment env)
{
_fileProvider = webHostEnvironment.WebRootFileProvider;
Env = env;
}
public BTCPayServerEnvironment Env { get; }
public async Task<JObject> Fetch()
{
@ -25,7 +29,10 @@ public class DefaultSwaggerProvider: ISwaggerProvider
{
await using var stream = fi.CreateReadStream();
using var reader = new StreamReader(fi.CreateReadStream());
json.Merge(JObject.Parse(await reader.ReadToEndAsync()));
var jObject = JObject.Parse(await reader.ReadToEndAsync());
if (jObject.Remove("x_experimental") && !Env.Experimental)
continue;
json.Merge(jObject);
}
return json;

View file

@ -1,9 +1,10 @@
{
"x_experimental": true,
"paths": {
"/api/v1/custodians": {
"get": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "List supported custodians",
"description": "List all supported custodians for the BTCPay instance. You can install plugins to add more custodians.",
@ -34,7 +35,7 @@
"/api/v1/stores/{storeId}/custodian-accounts": {
"get": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "List store custodian accounts",
"parameters": [
@ -79,7 +80,7 @@
},
"post": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Add a custodial account to a store.",
"description": "Add a custodial account to a store.",
@ -123,7 +124,7 @@
"/api/v1/stores/{storeId}/custodian-accounts/{accountId}": {
"get": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Get store custodian account",
"parameters": [
@ -174,7 +175,7 @@
},
"put": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Update custodial account",
"description": "Update custodial account",
@ -216,7 +217,7 @@
},
"delete": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Delete store custodian account",
"description": "Deletes a custodial account",
@ -233,7 +234,7 @@
"/api/v1/stores/{storeId}/custodian-accounts/{accountId}/trades/quote": {
"get": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Get quote for trading one asset for another",
"description": "Get the current bid and ask price for converting one asset into another.",
@ -306,7 +307,7 @@
"/api/v1/stores/{storeId}/custodian-accounts/{accountId}/trades/market": {
"post": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Trade one asset for another",
"description": "Trade one asset for another using a market order (=instant purchase with instant result or failure). A suitable asset pair will automatically be selected. If no asset pair is available, the call will fail.",
@ -371,7 +372,7 @@
"/api/v1/stores/{storeId}/custodian-accounts/{accountId}/addresses/{paymentMethod}": {
"get": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Get a deposit address for custodian",
"description": "Get a new deposit address for the custodian using the specified payment method (network + crypto code).",
@ -445,7 +446,7 @@
"/api/v1/stores/{storeId}/custodian-accounts/{accountId}/withdrawals": {
"post": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Withdraw to store wallet",
"description": "Withdraw an asset to your store wallet.",
@ -531,7 +532,7 @@
"/api/v1/stores/{storeId}/custodian-accounts/{accountId}/withdrawals/{withdrawalId}": {
"post": {
"tags": [
"Custodians (Experimental)"
"Custodians"
],
"summary": "Get withdrawal info",
"description": "Get the details about a past withdrawal.",
@ -1034,7 +1035,7 @@
},
"tags": [
{
"name": "Custodians (Experimental)"
"name": "Custodians"
}
]
}