mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-03-11 01:35:22 +01:00
Adding Lnd to connection types and supporting parsing
This commit is contained in:
parent
7c29cb62ef
commit
789b9168ad
3 changed files with 53 additions and 43 deletions
|
@ -328,6 +328,13 @@ namespace BTCPayServer.Tests
|
|||
public void CanParseLightningURL()
|
||||
{
|
||||
LightningConnectionString conn = null;
|
||||
|
||||
Assert.True(LightningConnectionString.TryParse("http://127.0.0.1:53280?type=lnd", out conn));
|
||||
Assert.Equal("http://127.0.0.1:53280/", conn.ToString());
|
||||
Assert.Equal("http://127.0.0.1:53280/", conn.ToUri(true).AbsoluteUri);
|
||||
Assert.Equal("http://127.0.0.1:53280/", conn.ToUri(false).AbsoluteUri);
|
||||
Assert.Equal(LightningConnectionType.Lnd, conn.ConnectionType);
|
||||
|
||||
Assert.True(LightningConnectionString.TryParse("/test/a", out conn));
|
||||
Assert.Equal("unix://test/a", conn.ToString());
|
||||
Assert.Equal("unix://test/a", conn.ToUri(true).AbsoluteUri);
|
||||
|
|
|
@ -79,7 +79,7 @@ namespace BTCPayServer.Tests.UnitTests
|
|||
public async Task<LnrpcChannel> EnsureLightningChannelAsync()
|
||||
{
|
||||
var merchantInfo = await WaitLNSynched();
|
||||
var merchantAddress = new LnrpcLightningAddress
|
||||
var merchantNodeAddress = new LnrpcLightningAddress
|
||||
{
|
||||
Pubkey = merchantInfo.NodeId,
|
||||
Host = "merchant_lnd:9735"
|
||||
|
@ -90,7 +90,7 @@ namespace BTCPayServer.Tests.UnitTests
|
|||
// if channel is pending generate blocks until confirmed
|
||||
var pendingResponse = await CustomerLnd.PendingChannelsAsync();
|
||||
if (pendingResponse.Pending_open_channels?
|
||||
.Any(a => a.Channel?.Remote_node_pub == merchantAddress.Pubkey) == true)
|
||||
.Any(a => a.Channel?.Remote_node_pub == merchantNodeAddress.Pubkey) == true)
|
||||
{
|
||||
ExplorerNode.Generate(1);
|
||||
await WaitLNSynched();
|
||||
|
@ -100,7 +100,7 @@ namespace BTCPayServer.Tests.UnitTests
|
|||
// check if channel is established
|
||||
var chanResponse = await CustomerLnd.ListChannelsAsync(null, null, null, null);
|
||||
var channelToMerchant = chanResponse?.Channels
|
||||
.Where(a => a.Remote_pubkey == merchantAddress.Pubkey)
|
||||
.Where(a => a.Remote_pubkey == merchantNodeAddress.Pubkey)
|
||||
.FirstOrDefault();
|
||||
|
||||
if (channelToMerchant == null)
|
||||
|
@ -111,7 +111,7 @@ namespace BTCPayServer.Tests.UnitTests
|
|||
{
|
||||
var connectResp = await CustomerLnd.ConnectPeerAsync(new LnrpcConnectPeerRequest
|
||||
{
|
||||
Addr = merchantAddress
|
||||
Addr = merchantNodeAddress
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -8,21 +8,48 @@ namespace BTCPayServer.Payments.Lightning
|
|||
public enum LightningConnectionType
|
||||
{
|
||||
Charge,
|
||||
CLightning
|
||||
CLightning,
|
||||
Lnd
|
||||
}
|
||||
public class LightningConnectionString
|
||||
{
|
||||
public LightningConnectionString() { }
|
||||
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
public Uri BaseUri { get; set; }
|
||||
|
||||
public LightningConnectionType ConnectionType { get; private set; }
|
||||
|
||||
public Uri ToUri(bool withCredentials)
|
||||
{
|
||||
if (withCredentials)
|
||||
{
|
||||
return new UriBuilder(BaseUri) { UserName = Username ?? "", Password = Password ?? "" }.Uri;
|
||||
}
|
||||
else
|
||||
{
|
||||
return BaseUri;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return ToUri(true).AbsoluteUri;
|
||||
}
|
||||
|
||||
//
|
||||
public static bool TryParse(string str, out LightningConnectionString connectionString)
|
||||
{
|
||||
return TryParse(str, out connectionString, out var error);
|
||||
}
|
||||
|
||||
public static bool TryParse(string str, out LightningConnectionString connectionString, out string error)
|
||||
{
|
||||
if (str == null)
|
||||
throw new ArgumentNullException(nameof(str));
|
||||
if (str.StartsWith('/'))
|
||||
str = "unix:" + str;
|
||||
var result = new LightningConnectionString();
|
||||
connectionString = null;
|
||||
error = null;
|
||||
|
||||
|
@ -51,7 +78,16 @@ namespace BTCPayServer.Payments.Lightning
|
|||
uri = new Uri("unix://" + str, UriKind.Absolute);
|
||||
}
|
||||
|
||||
if (uri.Scheme == "http" || uri.Scheme == "https")
|
||||
var result = new LightningConnectionString();
|
||||
|
||||
result.ConnectionType = uri.Scheme == "http" || uri.Scheme == "https" ?
|
||||
LightningConnectionType.Charge :
|
||||
LightningConnectionType.CLightning;
|
||||
|
||||
if (uri.Query.Contains("type=lnd"))
|
||||
result.ConnectionType = LightningConnectionType.Lnd;
|
||||
|
||||
if (result.ConnectionType == LightningConnectionType.Charge)
|
||||
{
|
||||
var parts = uri.UserInfo.Split(':');
|
||||
if (string.IsNullOrEmpty(uri.UserInfo) || parts.Length != 2)
|
||||
|
@ -67,44 +103,11 @@ namespace BTCPayServer.Payments.Lightning
|
|||
error = "The url should not have user information";
|
||||
return false;
|
||||
}
|
||||
result.BaseUri = new UriBuilder(uri) { UserName = "", Password = "" }.Uri;
|
||||
|
||||
var uriWithoutQuery = uri.AbsoluteUri.Split('?')[0];
|
||||
result.BaseUri = new UriBuilder(uriWithoutQuery) { UserName = "", Password = "" }.Uri;
|
||||
connectionString = result;
|
||||
return true;
|
||||
}
|
||||
|
||||
public LightningConnectionString()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
public Uri BaseUri { get; set; }
|
||||
|
||||
public LightningConnectionType ConnectionType
|
||||
{
|
||||
get
|
||||
{
|
||||
return BaseUri.Scheme == "http" || BaseUri.Scheme == "https" ? LightningConnectionType.Charge
|
||||
: LightningConnectionType.CLightning;
|
||||
}
|
||||
}
|
||||
|
||||
public Uri ToUri(bool withCredentials)
|
||||
{
|
||||
if (withCredentials)
|
||||
{
|
||||
return new UriBuilder(BaseUri) { UserName = Username ?? "", Password = Password ?? "" }.Uri;
|
||||
}
|
||||
else
|
||||
{
|
||||
return BaseUri;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return ToUri(true).AbsoluteUri;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue