mirror of
https://github.com/aljazceru/btcpayserver.git
synced 2025-12-18 22:44:29 +01:00
Add some tests on externalConnectionString
This commit is contained in:
@@ -52,6 +52,9 @@ using NBitpayClient.Extensions;
|
|||||||
using BTCPayServer.Services;
|
using BTCPayServer.Services;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using BTCPayServer.Events;
|
using BTCPayServer.Events;
|
||||||
|
using BTCPayServer.Configuration;
|
||||||
|
using System.Security;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
namespace BTCPayServer.Tests
|
namespace BTCPayServer.Tests
|
||||||
{
|
{
|
||||||
@@ -2332,6 +2335,62 @@ donation:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
[Trait("Fast", "Fast")]
|
||||||
|
public async Task CanExpandExternalConnectionString()
|
||||||
|
{
|
||||||
|
var unusedUri = new Uri("https://toto.com");
|
||||||
|
Assert.True(ExternalConnectionString.TryParse("server=/test", out var connStr, out var error));
|
||||||
|
var expanded = await connStr.Expand(new Uri("https://toto.com"), ExternalServiceTypes.Charge);
|
||||||
|
Assert.Equal(new Uri("https://toto.com/test"), expanded.Server);
|
||||||
|
expanded = await connStr.Expand(new Uri("http://toto.onion"), ExternalServiceTypes.Charge);
|
||||||
|
Assert.Equal(new Uri("http://toto.onion/test"), expanded.Server);
|
||||||
|
await Assert.ThrowsAsync<SecurityException>(() => connStr.Expand(new Uri("http://toto.com"), ExternalServiceTypes.Charge));
|
||||||
|
|
||||||
|
// Make sure absolute paths are not expanded
|
||||||
|
Assert.True(ExternalConnectionString.TryParse("server=https://tow/test", out connStr, out error));
|
||||||
|
expanded = await connStr.Expand(new Uri("https://toto.com"), ExternalServiceTypes.Charge);
|
||||||
|
Assert.Equal(new Uri("https://tow/test"), expanded.Server);
|
||||||
|
|
||||||
|
// Error if directory not exists
|
||||||
|
Assert.True(ExternalConnectionString.TryParse($"server={unusedUri};macaroondirectorypath=pouet", out connStr, out error));
|
||||||
|
await Assert.ThrowsAsync<DirectoryNotFoundException>(() => connStr.Expand(unusedUri, ExternalServiceTypes.LNDGRPC));
|
||||||
|
await Assert.ThrowsAsync<DirectoryNotFoundException>(() => connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest));
|
||||||
|
await connStr.Expand(unusedUri, ExternalServiceTypes.Charge);
|
||||||
|
|
||||||
|
var macaroonDirectory = CreateDirectory();
|
||||||
|
Assert.True(ExternalConnectionString.TryParse($"server={unusedUri};macaroondirectorypath={macaroonDirectory}", out connStr, out error));
|
||||||
|
await connStr.Expand(unusedUri, ExternalServiceTypes.LNDGRPC);
|
||||||
|
expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest);
|
||||||
|
Assert.NotNull(expanded.Macaroons);
|
||||||
|
Assert.Null(expanded.MacaroonFilePath);
|
||||||
|
Assert.Null(expanded.Macaroons.AdminMacaroon);
|
||||||
|
Assert.Null(expanded.Macaroons.InvoiceMacaroon);
|
||||||
|
Assert.Null(expanded.Macaroons.ReadonlyMacaroon);
|
||||||
|
|
||||||
|
File.WriteAllBytes($"{macaroonDirectory}/admin.macaroon", new byte[] { 0xaa });
|
||||||
|
File.WriteAllBytes($"{macaroonDirectory}/invoice.macaroon", new byte[] { 0xab });
|
||||||
|
File.WriteAllBytes($"{macaroonDirectory}/readonly.macaroon", new byte[] { 0xac });
|
||||||
|
expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.LNDRest);
|
||||||
|
Assert.NotNull(expanded.Macaroons.AdminMacaroon);
|
||||||
|
Assert.NotNull(expanded.Macaroons.InvoiceMacaroon);
|
||||||
|
Assert.Equal("ab", expanded.Macaroons.InvoiceMacaroon.Hex);
|
||||||
|
Assert.Equal(0xab, expanded.Macaroons.InvoiceMacaroon.Bytes[0]);
|
||||||
|
Assert.NotNull(expanded.Macaroons.ReadonlyMacaroon);
|
||||||
|
|
||||||
|
Assert.True(ExternalConnectionString.TryParse($"server={unusedUri};cookiefilepath={macaroonDirectory}/charge.cookie", out connStr, out error));
|
||||||
|
File.WriteAllText($"{macaroonDirectory}/charge.cookie", "apitoken");
|
||||||
|
expanded = await connStr.Expand(unusedUri, ExternalServiceTypes.Charge);
|
||||||
|
Assert.Equal("apitoken", expanded.APIToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string CreateDirectory([CallerMemberName] string caller = null)
|
||||||
|
{
|
||||||
|
var name = $"{caller}-{NBitcoin.RandomUtils.GetUInt32()}";
|
||||||
|
Directory.CreateDirectory(name);
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
[Trait("Fast", "Fast")]
|
[Trait("Fast", "Fast")]
|
||||||
public void CheckRatesProvider()
|
public void CheckRatesProvider()
|
||||||
|
|||||||
@@ -34,66 +34,72 @@ namespace BTCPayServer.Configuration
|
|||||||
}
|
}
|
||||||
connectionString.Server = serviceUri;
|
connectionString.Server = serviceUri;
|
||||||
|
|
||||||
// Read the MacaroonFilePath
|
if (serviceType == ExternalServiceTypes.LNDGRPC || serviceType == ExternalServiceTypes.LNDRest)
|
||||||
if (connectionString.MacaroonFilePath != null)
|
|
||||||
{
|
{
|
||||||
try
|
// Read the MacaroonDirectory
|
||||||
|
if (connectionString.MacaroonDirectoryPath != null)
|
||||||
{
|
{
|
||||||
connectionString.Macaroon = await System.IO.File.ReadAllBytesAsync(connectionString.MacaroonFilePath);
|
try
|
||||||
connectionString.MacaroonFilePath = null;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new System.IO.FileNotFoundException("Macaroon not found", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read the MacaroonDirectory
|
|
||||||
if (connectionString.MacaroonDirectoryPath != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
connectionString.Macaroons = await Macaroons.GetFromDirectoryAsync(connectionString.MacaroonDirectoryPath);
|
|
||||||
connectionString.MacaroonDirectoryPath = null;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new System.IO.DirectoryNotFoundException("Macaroon directory path not found", ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read access key from cookie file
|
|
||||||
if (connectionString.CookieFilePath != null)
|
|
||||||
{
|
|
||||||
string cookieFileContent = null;
|
|
||||||
bool isFake = false;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
cookieFileContent = await System.IO.File.ReadAllTextAsync(connectionString.CookieFilePath);
|
|
||||||
isFake = connectionString.CookieFilePath == "fake";
|
|
||||||
connectionString.CookieFilePath = null;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
throw new System.IO.FileNotFoundException("Cookie file path not found", ex);
|
|
||||||
}
|
|
||||||
if (serviceType == ExternalServiceTypes.RTL)
|
|
||||||
{
|
|
||||||
connectionString.AccessKey = cookieFileContent;
|
|
||||||
}
|
|
||||||
else if (serviceType == ExternalServiceTypes.Spark)
|
|
||||||
{
|
|
||||||
var cookie = (isFake ? "fake:fake:fake" // Hacks for testing
|
|
||||||
: cookieFileContent).Split(':');
|
|
||||||
if (cookie.Length >= 3)
|
|
||||||
{
|
{
|
||||||
connectionString.AccessKey = cookie[2];
|
connectionString.Macaroons = await Macaroons.GetFromDirectoryAsync(connectionString.MacaroonDirectoryPath);
|
||||||
|
connectionString.MacaroonDirectoryPath = null;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new System.IO.DirectoryNotFoundException("Macaroon directory path not found", ex);
|
||||||
}
|
}
|
||||||
throw new FormatException("Invalid cookiefile format");
|
|
||||||
}
|
}
|
||||||
else if (serviceType == ExternalServiceTypes.Charge)
|
|
||||||
|
// Read the MacaroonFilePath
|
||||||
|
if (connectionString.MacaroonFilePath != null)
|
||||||
{
|
{
|
||||||
connectionString.APIToken = isFake ? "fake" : cookieFileContent;
|
try
|
||||||
|
{
|
||||||
|
connectionString.Macaroon = await System.IO.File.ReadAllBytesAsync(connectionString.MacaroonFilePath);
|
||||||
|
connectionString.MacaroonFilePath = null;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new System.IO.FileNotFoundException("Macaroon not found", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (serviceType == ExternalServiceTypes.Charge || serviceType == ExternalServiceTypes.RTL || serviceType == ExternalServiceTypes.Spark)
|
||||||
|
{
|
||||||
|
// Read access key from cookie file
|
||||||
|
if (connectionString.CookieFilePath != null)
|
||||||
|
{
|
||||||
|
string cookieFileContent = null;
|
||||||
|
bool isFake = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cookieFileContent = await System.IO.File.ReadAllTextAsync(connectionString.CookieFilePath);
|
||||||
|
isFake = connectionString.CookieFilePath == "fake";
|
||||||
|
connectionString.CookieFilePath = null;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
throw new System.IO.FileNotFoundException("Cookie file path not found", ex);
|
||||||
|
}
|
||||||
|
if (serviceType == ExternalServiceTypes.RTL)
|
||||||
|
{
|
||||||
|
connectionString.AccessKey = cookieFileContent;
|
||||||
|
}
|
||||||
|
else if (serviceType == ExternalServiceTypes.Spark)
|
||||||
|
{
|
||||||
|
var cookie = (isFake ? "fake:fake:fake" // Hacks for testing
|
||||||
|
: cookieFileContent).Split(':');
|
||||||
|
if (cookie.Length >= 3)
|
||||||
|
{
|
||||||
|
connectionString.AccessKey = cookie[2];
|
||||||
|
}
|
||||||
|
throw new FormatException("Invalid cookiefile format");
|
||||||
|
}
|
||||||
|
else if (serviceType == ExternalServiceTypes.Charge)
|
||||||
|
{
|
||||||
|
connectionString.APIToken = isFake ? "fake" : cookieFileContent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return connectionString;
|
return connectionString;
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace BTCPayServer.Controllers
|
|||||||
throw new ArgumentNullException(nameof(directoryPath));
|
throw new ArgumentNullException(nameof(directoryPath));
|
||||||
Macaroons macaroons = new Macaroons();
|
Macaroons macaroons = new Macaroons();
|
||||||
if (!Directory.Exists(directoryPath))
|
if (!Directory.Exists(directoryPath))
|
||||||
return macaroons;
|
throw new DirectoryNotFoundException("Macaroons directory not found");
|
||||||
foreach(var file in Directory.GetFiles(directoryPath, "*.macaroon"))
|
foreach(var file in Directory.GetFiles(directoryPath, "*.macaroon"))
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
Reference in New Issue
Block a user