Encrypt WalletSetupViewModel.Config

This commit is contained in:
nicolas.dorier
2021-06-17 18:27:17 +09:00
parent 8a1d5bbc57
commit 70f56d5920
3 changed files with 23 additions and 9 deletions

View File

@@ -189,8 +189,8 @@ namespace BTCPayServer.Tests
}; };
await store.GenerateWallet(StoreId, cryptoCode, WalletSetupMethod.HotWallet, generateRequest); await store.GenerateWallet(StoreId, cryptoCode, WalletSetupMethod.HotWallet, generateRequest);
Assert.NotNull(store.GenerateWalletResponseV); Assert.NotNull(store.GenerateWalletResponse);
GenerateWalletResponseV = store.GenerateWalletResponseV; GenerateWalletResponseV = store.GenerateWalletResponse;
return new WalletId(StoreId, cryptoCode); return new WalletId(StoreId, cryptoCode);
} }

View File

@@ -1,6 +1,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using BTCPayServer.Abstractions.Extensions; using BTCPayServer.Abstractions.Extensions;
using BTCPayServer.Abstractions.Models; using BTCPayServer.Abstractions.Models;
@@ -135,7 +136,7 @@ namespace BTCPayServer.Controllers
} }
else if (!string.IsNullOrEmpty(vm.Config)) else if (!string.IsNullOrEmpty(vm.Config))
{ {
if (!DerivationSchemeSettings.TryParseFromJson(vm.Config, network, out strategy)) if (!DerivationSchemeSettings.TryParseFromJson(UnprotectString(vm.Config), network, out strategy))
{ {
ModelState.AddModelError(nameof(vm.Config), "Config file was not in the correct format"); ModelState.AddModelError(nameof(vm.Config), "Config file was not in the correct format");
return View(vm.ViewName, vm); return View(vm.ViewName, vm);
@@ -148,7 +149,7 @@ namespace BTCPayServer.Controllers
return View(vm.ViewName, vm); return View(vm.ViewName, vm);
} }
vm.Config = strategy.ToJson(); vm.Config = ProtectString(strategy.ToJson());
ModelState.Remove(nameof(vm.Config)); ModelState.Remove(nameof(vm.Config));
PaymentMethodId paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike); PaymentMethodId paymentMethodId = new PaymentMethodId(network.CryptoCode, PaymentTypes.BTCLike);
@@ -180,6 +181,15 @@ namespace BTCPayServer.Controllers
return ConfirmAddresses(vm, strategy); return ConfirmAddresses(vm, strategy);
} }
private string ProtectString(string str)
{
return Convert.ToBase64String(DataProtector.Protect(Encoding.UTF8.GetBytes(str)));
}
private string UnprotectString(string str)
{
return Encoding.UTF8.GetString(DataProtector.Unprotect(Convert.FromBase64String(str)));
}
[HttpGet("{storeId}/onchain/{cryptoCode}/generate/{method?}")] [HttpGet("{storeId}/onchain/{cryptoCode}/generate/{method?}")]
public async Task<IActionResult> GenerateWallet(WalletSetupViewModel vm) public async Task<IActionResult> GenerateWallet(WalletSetupViewModel vm)
{ {
@@ -212,7 +222,7 @@ namespace BTCPayServer.Controllers
return View(vm.ViewName, vm); return View(vm.ViewName, vm);
} }
internal GenerateWalletResponse GenerateWalletResponseV; internal GenerateWalletResponse GenerateWalletResponse;
[HttpPost("{storeId}/onchain/{cryptoCode}/generate/{method}")] [HttpPost("{storeId}/onchain/{cryptoCode}/generate/{method}")]
public async Task<IActionResult> GenerateWallet(string storeId, string cryptoCode, WalletSetupMethod method, GenerateWalletRequest request) public async Task<IActionResult> GenerateWallet(string storeId, string cryptoCode, WalletSetupMethod method, GenerateWalletRequest request)
{ {
@@ -290,7 +300,7 @@ namespace BTCPayServer.Controllers
derivationSchemeSettings.AccountOriginal = response.DerivationScheme.ToString(); derivationSchemeSettings.AccountOriginal = response.DerivationScheme.ToString();
// Set wallet properties from generate response // Set wallet properties from generate response
vm.Config = derivationSchemeSettings.ToJson(); vm.Config = ProtectString(derivationSchemeSettings.ToJson());
var result = await UpdateWallet(vm); var result = await UpdateWallet(vm);
@@ -315,7 +325,7 @@ namespace BTCPayServer.Controllers
}; };
if (this._BTCPayEnv.IsDeveloping) if (this._BTCPayEnv.IsDeveloping)
{ {
GenerateWalletResponseV = response; GenerateWalletResponse = response;
} }
return this.RedirectToRecoverySeedBackup(seedVm); return this.RedirectToRecoverySeedBackup(seedVm);
} }
@@ -370,7 +380,7 @@ namespace BTCPayServer.Controllers
vm.RootFingerprint = derivation.GetSigningAccountKeySettings().RootFingerprint.ToString(); vm.RootFingerprint = derivation.GetSigningAccountKeySettings().RootFingerprint.ToString();
vm.DerivationScheme = derivation.AccountDerivation.ToString(); vm.DerivationScheme = derivation.AccountDerivation.ToString();
vm.KeyPath = derivation.GetSigningAccountKeySettings().AccountKeyPath?.ToString(); vm.KeyPath = derivation.GetSigningAccountKeySettings().AccountKeyPath?.ToString();
vm.Config = derivation.ToJson(); vm.Config = ProtectString(derivation.ToJson());
vm.IsHotWallet = isHotWallet; vm.IsHotWallet = isHotWallet;
return View(vm); return View(vm);

View File

@@ -27,6 +27,7 @@ using BTCPayServer.Services.Stores;
using BTCPayServer.Services.Wallets; using BTCPayServer.Services.Wallets;
using BundlerMinifier.TagHelpers; using BundlerMinifier.TagHelpers;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
@@ -69,7 +70,8 @@ namespace BTCPayServer.Controllers
AppService appService, AppService appService,
IWebHostEnvironment webHostEnvironment, IWebHostEnvironment webHostEnvironment,
WebhookNotificationManager webhookNotificationManager, WebhookNotificationManager webhookNotificationManager,
IOptions<LightningNetworkOptions> lightningNetworkOptions) IOptions<LightningNetworkOptions> lightningNetworkOptions,
IDataProtectionProvider dataProtector)
{ {
_RateFactory = rateFactory; _RateFactory = rateFactory;
_Repo = repo; _Repo = repo;
@@ -85,6 +87,7 @@ namespace BTCPayServer.Controllers
_appService = appService; _appService = appService;
_webHostEnvironment = webHostEnvironment; _webHostEnvironment = webHostEnvironment;
_lightningNetworkOptions = lightningNetworkOptions; _lightningNetworkOptions = lightningNetworkOptions;
DataProtector = dataProtector.CreateProtector("ConfigProtector");
WebhookNotificationManager = webhookNotificationManager; WebhookNotificationManager = webhookNotificationManager;
_EventAggregator = eventAggregator; _EventAggregator = eventAggregator;
_NetworkProvider = networkProvider; _NetworkProvider = networkProvider;
@@ -826,6 +829,7 @@ namespace BTCPayServer.Controllers
public string GeneratedPairingCode { get; set; } public string GeneratedPairingCode { get; set; }
public WebhookNotificationManager WebhookNotificationManager { get; } public WebhookNotificationManager WebhookNotificationManager { get; }
public IDataProtector DataProtector { get; }
[HttpGet] [HttpGet]
[Route("{storeId}/Tokens/Create")] [Route("{storeId}/Tokens/Create")]