mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 14:34:23 +01:00
Expose LND's other macaroon if possible
This commit is contained in:
57
BTCPayServer/Controllers/Macaroons.cs
Normal file
57
BTCPayServer/Controllers/Macaroons.cs
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace BTCPayServer.Controllers
|
||||||
|
{
|
||||||
|
public class Macaroons
|
||||||
|
{
|
||||||
|
public class Macaroon
|
||||||
|
{
|
||||||
|
public Macaroon(byte[] bytes)
|
||||||
|
{
|
||||||
|
Bytes = bytes;
|
||||||
|
Hex = NBitcoin.DataEncoders.Encoders.Hex.EncodeData(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Hex { get; set; }
|
||||||
|
public byte[] Bytes { get; set; }
|
||||||
|
}
|
||||||
|
public static async Task<Macaroons> GetFromDirectoryAsync(string directoryPath)
|
||||||
|
{
|
||||||
|
if (directoryPath == null)
|
||||||
|
throw new ArgumentNullException(nameof(directoryPath));
|
||||||
|
Macaroons macaroons = new Macaroons();
|
||||||
|
if (!Directory.Exists(directoryPath))
|
||||||
|
return macaroons;
|
||||||
|
foreach(var file in Directory.GetFiles("*.macaroon"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
switch (Path.GetFileName(file))
|
||||||
|
{
|
||||||
|
case "admin.macaroon":
|
||||||
|
macaroons.AdminMacaroon = new Macaroon(await File.ReadAllBytesAsync(file));
|
||||||
|
break;
|
||||||
|
case "readonly.macaroon":
|
||||||
|
macaroons.ReadonlyMacaroon = new Macaroon(await File.ReadAllBytesAsync(file));
|
||||||
|
break;
|
||||||
|
case "invoice.macaroon":
|
||||||
|
macaroons.InvoiceMacaroon = new Macaroon(await File.ReadAllBytesAsync(file));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
}
|
||||||
|
return macaroons;
|
||||||
|
}
|
||||||
|
public Macaroon ReadonlyMacaroon { get; set; }
|
||||||
|
|
||||||
|
public Macaroon InvoiceMacaroon { get; set; }
|
||||||
|
public Macaroon AdminMacaroon { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -504,7 +504,7 @@ namespace BTCPayServer.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Route("server/services/lnd/{cryptoCode}/{index}")]
|
[Route("server/services/lnd/{cryptoCode}/{index}")]
|
||||||
public IActionResult LndServices(string cryptoCode, int index, uint? nonce)
|
public async Task<IActionResult> LndServices(string cryptoCode, int index, uint? nonce)
|
||||||
{
|
{
|
||||||
if (!_dashBoard.IsFullySynched(cryptoCode, out var unusud))
|
if (!_dashBoard.IsFullySynched(cryptoCode, out var unusud))
|
||||||
{
|
{
|
||||||
@@ -536,6 +536,10 @@ namespace BTCPayServer.Controllers
|
|||||||
{
|
{
|
||||||
model.Macaroon = Encoders.Hex.EncodeData(external.Macaroon);
|
model.Macaroon = Encoders.Hex.EncodeData(external.Macaroon);
|
||||||
}
|
}
|
||||||
|
var macaroons = external.MacaroonDirectoryPath == null ? null : await Macaroons.GetFromDirectoryAsync(external.MacaroonDirectoryPath);
|
||||||
|
model.AdminMacaroon = macaroons?.AdminMacaroon?.Hex;
|
||||||
|
model.InvoiceMacaroon = macaroons?.InvoiceMacaroon?.Hex;
|
||||||
|
model.ReadonlyMacaroon = macaroons?.ReadonlyMacaroon?.Hex;
|
||||||
|
|
||||||
if (nonce != null)
|
if (nonce != null)
|
||||||
{
|
{
|
||||||
@@ -568,36 +572,40 @@ namespace BTCPayServer.Controllers
|
|||||||
|
|
||||||
[Route("server/services/lnd/{cryptoCode}/{index}")]
|
[Route("server/services/lnd/{cryptoCode}/{index}")]
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult LndServicesPost(string cryptoCode, int index)
|
public async Task<IActionResult> LndServicesPost(string cryptoCode, int index)
|
||||||
{
|
{
|
||||||
var external = GetExternalLndConnectionString(cryptoCode, index);
|
var external = GetExternalLndConnectionString(cryptoCode, index);
|
||||||
if (external == null)
|
if (external == null)
|
||||||
return NotFound();
|
return NotFound();
|
||||||
LightningConfigurations confs = new LightningConfigurations();
|
LightningConfigurations confs = new LightningConfigurations();
|
||||||
|
var macaroons = external.MacaroonDirectoryPath == null ? null : await Macaroons.GetFromDirectoryAsync(external.MacaroonDirectoryPath);
|
||||||
if (external.ConnectionType == LightningConnectionType.LndGRPC)
|
if (external.ConnectionType == LightningConnectionType.LndGRPC)
|
||||||
{
|
{
|
||||||
LightningConfiguration conf = new LightningConfiguration();
|
LightningConfiguration grpcConf = new LightningConfiguration();
|
||||||
conf.Type = "grpc";
|
grpcConf.Type = "grpc";
|
||||||
conf.ChainType = _Options.NetworkType.ToString();
|
grpcConf.Host = external.BaseUri.DnsSafeHost;
|
||||||
conf.CryptoCode = cryptoCode;
|
grpcConf.Port = external.BaseUri.Port;
|
||||||
conf.Host = external.BaseUri.DnsSafeHost;
|
grpcConf.SSL = external.BaseUri.Scheme == "https";
|
||||||
conf.Port = external.BaseUri.Port;
|
confs.Configurations.Add(grpcConf);
|
||||||
conf.SSL = external.BaseUri.Scheme == "https";
|
|
||||||
conf.Macaroon = external.Macaroon == null ? null : Encoders.Hex.EncodeData(external.Macaroon);
|
|
||||||
conf.CertificateThumbprint = external.CertificateThumbprint == null ? null : Encoders.Hex.EncodeData(external.CertificateThumbprint);
|
|
||||||
confs.Configurations.Add(conf);
|
|
||||||
}
|
}
|
||||||
else if (external.ConnectionType == LightningConnectionType.LndREST)
|
else if (external.ConnectionType == LightningConnectionType.LndREST)
|
||||||
{
|
{
|
||||||
var restconf = new LNDRestConfiguration();
|
var restconf = new LNDRestConfiguration();
|
||||||
restconf.Type = "lnd-rest";
|
restconf.Type = "lnd-rest";
|
||||||
restconf.ChainType = _Options.NetworkType.ToString();
|
|
||||||
restconf.CryptoCode = cryptoCode;
|
|
||||||
restconf.Uri = external.BaseUri.AbsoluteUri;
|
restconf.Uri = external.BaseUri.AbsoluteUri;
|
||||||
restconf.Macaroon = external.Macaroon == null ? null : Encoders.Hex.EncodeData(external.Macaroon);
|
|
||||||
restconf.CertificateThumbprint = external.CertificateThumbprint == null ? null : Encoders.Hex.EncodeData(external.CertificateThumbprint);
|
|
||||||
confs.Configurations.Add(restconf);
|
confs.Configurations.Add(restconf);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
throw new NotSupportedException(external.ConnectionType.ToString());
|
||||||
|
var commonConf = (LNDConfiguration)confs.Configurations[confs.Configurations.Count - 1];
|
||||||
|
commonConf.ChainType = _Options.NetworkType.ToString();
|
||||||
|
commonConf.CryptoCode = cryptoCode;
|
||||||
|
commonConf.Macaroon = external.Macaroon == null ? null : Encoders.Hex.EncodeData(external.Macaroon);
|
||||||
|
commonConf.CertificateThumbprint = external.CertificateThumbprint == null ? null : Encoders.Hex.EncodeData(external.CertificateThumbprint);
|
||||||
|
commonConf.AdminMacaroon = macaroons?.AdminMacaroon?.Hex;
|
||||||
|
commonConf.ReadonlyMacaroon = macaroons?.ReadonlyMacaroon?.Hex;
|
||||||
|
commonConf.InvoiceMacaroon = macaroons?.InvoiceMacaroon?.Hex;
|
||||||
|
|
||||||
var nonce = RandomUtils.GetUInt32();
|
var nonce = RandomUtils.GetUInt32();
|
||||||
var configKey = GetConfigKey("lnd", cryptoCode, index, nonce);
|
var configKey = GetConfigKey("lnd", cryptoCode, index, nonce);
|
||||||
_LnConfigProvider.KeepConfig(configKey, confs);
|
_LnConfigProvider.KeepConfig(configKey, confs);
|
||||||
|
|||||||
@@ -11,7 +11,9 @@ namespace BTCPayServer.Models.ServerViewModels
|
|||||||
public string Host { get; set; }
|
public string Host { get; set; }
|
||||||
public bool SSL { get; set; }
|
public bool SSL { get; set; }
|
||||||
public string Macaroon { get; set; }
|
public string Macaroon { get; set; }
|
||||||
public string RestrictedMacaroon { get; set; }
|
public string AdminMacaroon { get; set; }
|
||||||
|
public string ReadonlyMacaroon { get; set; }
|
||||||
|
public string InvoiceMacaroon { get; set; }
|
||||||
public string CertificateThumbprint { get; set; }
|
public string CertificateThumbprint { get; set; }
|
||||||
[Display(Name = "GRPC SSL Cipher suite (GRPC_SSL_CIPHER_SUITES)")]
|
[Display(Name = "GRPC SSL Cipher suite (GRPC_SSL_CIPHER_SUITES)")]
|
||||||
public string GRPCSSLCipherSuites { get; set; }
|
public string GRPCSSLCipherSuites { get; set; }
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using NBitcoin;
|
using NBitcoin;
|
||||||
|
using NBitcoin.DataEncoders;
|
||||||
|
|
||||||
namespace BTCPayServer.Services
|
namespace BTCPayServer.Services
|
||||||
{
|
{
|
||||||
@@ -27,9 +28,9 @@ namespace BTCPayServer.Services
|
|||||||
|
|
||||||
private void CleanExpired()
|
private void CleanExpired()
|
||||||
{
|
{
|
||||||
foreach(var item in _Map)
|
foreach (var item in _Map)
|
||||||
{
|
{
|
||||||
if(item.Value.expiration < DateTimeOffset.UtcNow)
|
if (item.Value.expiration < DateTimeOffset.UtcNow)
|
||||||
{
|
{
|
||||||
_Map.TryRemove(item.Key, out var unused);
|
_Map.TryRemove(item.Key, out var unused);
|
||||||
}
|
}
|
||||||
@@ -41,24 +42,29 @@ namespace BTCPayServer.Services
|
|||||||
{
|
{
|
||||||
public List<object> Configurations { get; set; } = new List<object>();
|
public List<object> Configurations { get; set; } = new List<object>();
|
||||||
}
|
}
|
||||||
public class LightningConfiguration
|
|
||||||
|
public class LNDConfiguration
|
||||||
{
|
{
|
||||||
public string ChainType { get; set; }
|
public string ChainType { get; set; }
|
||||||
public string Type { get; set; }
|
public string Type { get; set; }
|
||||||
public string CryptoCode { get; set; }
|
public string CryptoCode { get; set; }
|
||||||
|
public string CertificateThumbprint { get; set; }
|
||||||
|
public string Macaroon { get; set; }
|
||||||
|
public string AdminMacaroon { get; set; }
|
||||||
|
public string ReadonlyMacaroon { get; set; }
|
||||||
|
public string InvoiceMacaroon { get; set; }
|
||||||
|
}
|
||||||
|
public class LightningConfiguration : LNDConfiguration
|
||||||
|
{
|
||||||
public string Host { get; set; }
|
public string Host { get; set; }
|
||||||
public int Port { get; set; }
|
public int Port { get; set; }
|
||||||
public bool SSL { get; set; }
|
public bool SSL { get; set; }
|
||||||
public string CertificateThumbprint { get; set; }
|
|
||||||
public string Macaroon { get; set; }
|
|
||||||
}
|
}
|
||||||
public class LNDRestConfiguration
|
public class LNDRestConfiguration : LNDConfiguration
|
||||||
{
|
{
|
||||||
public string ChainType { get; set; }
|
public string ChainType { get; set; }
|
||||||
public string Type { get; set; }
|
public string Type { get; set; }
|
||||||
public string CryptoCode { get; set; }
|
public string CryptoCode { get; set; }
|
||||||
public string Uri { get; set; }
|
public string Uri { get; set; }
|
||||||
public string Macaroon { get; set; }
|
|
||||||
public string CertificateThumbprint { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,12 +86,26 @@
|
|||||||
<input asp-for="Macaroon" readonly class="form-control" />
|
<input asp-for="Macaroon" readonly class="form-control" />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
@if (Model.RestrictedMacaroon != null)
|
@if (Model.AdminMacaroon != null)
|
||||||
{
|
{
|
||||||
@*<div class="form-group">
|
<div class="form-group">
|
||||||
<label asp-for="RestrictedMacaroon"></label>
|
<label asp-for="AdminMacaroon"></label>
|
||||||
<input asp-for="RestrictedMacaroon" readonly class="form-control" />
|
<input asp-for="AdminMacaroon" readonly class="form-control" />
|
||||||
</div>*@
|
</div>
|
||||||
|
}
|
||||||
|
@if (Model.InvoiceMacaroon != null)
|
||||||
|
{
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="InvoiceMacaroon"></label>
|
||||||
|
<input asp-for="InvoiceMacaroon" readonly class="form-control" />
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (Model.ReadonlyMacaroon != null)
|
||||||
|
{
|
||||||
|
<div class="form-group">
|
||||||
|
<label asp-for="ReadonlyMacaroon"></label>
|
||||||
|
<input asp-for="ReadonlyMacaroon" readonly class="form-control" />
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
@if (Model.GRPCSSLCipherSuites != null)
|
@if (Model.GRPCSSLCipherSuites != null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user