Attempt cover scenarios of switching back to Bitcoin only after taint (#2881)

This commit is contained in:
Andrew Camilleri
2021-09-24 07:16:25 +02:00
committed by GitHub
parent 0aed8fdb5b
commit 8c061b1f07
7 changed files with 36 additions and 8 deletions

View File

@@ -52,7 +52,7 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
public bool CanHandle(PaymentMethodId paymentMethod) public bool CanHandle(PaymentMethodId paymentMethod)
{ {
return paymentMethod.PaymentType == BitcoinPaymentType.Instance && return paymentMethod?.PaymentType == BitcoinPaymentType.Instance &&
_btcPayNetworkProvider.GetNetwork<BTCPayNetwork>(paymentMethod.CryptoCode)?.ReadonlyWallet is false; _btcPayNetworkProvider.GetNetwork<BTCPayNetwork>(paymentMethod.CryptoCode)?.ReadonlyWallet is false;
} }
@@ -89,6 +89,10 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
if (payout?.Proof is null) if (payout?.Proof is null)
return null; return null;
var paymentMethodId = payout.GetPaymentMethodId(); var paymentMethodId = payout.GetPaymentMethodId();
if (paymentMethodId is null)
{
return null;
}
var raw = JObject.Parse(Encoding.UTF8.GetString(payout.Proof)); var raw = JObject.Parse(Encoding.UTF8.GetString(payout.Proof));
if (raw.TryGetValue("proofType", StringComparison.InvariantCultureIgnoreCase, out var proofType) && if (raw.TryGetValue("proofType", StringComparison.InvariantCultureIgnoreCase, out var proofType) &&
proofType.Value<string>() == ManualPayoutProof.Type) proofType.Value<string>() == ManualPayoutProof.Type)
@@ -161,7 +165,9 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
.Include(p => p.PullPaymentData.StoreData) .Include(p => p.PullPaymentData.StoreData)
.Where(p => payoutIds.Contains(p.Id)) .Where(p => payoutIds.Contains(p.Id))
.Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment) .Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment)
.ToListAsync()).Where(data => CanHandle(PaymentMethodId.Parse(data.PaymentMethodId))) .ToListAsync()).Where(data =>
PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId) &&
CanHandle(paymentMethodId))
.Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == false); .Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == false);
foreach (var valueTuple in payouts) foreach (var valueTuple in payouts)
{ {
@@ -185,7 +191,9 @@ public class BitcoinLikePayoutHandler : IPayoutHandler
.Include(p => p.PullPaymentData.StoreData) .Include(p => p.PullPaymentData.StoreData)
.Where(p => payoutIds.Contains(p.Id)) .Where(p => payoutIds.Contains(p.Id))
.Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment) .Where(p => p.PullPaymentData.StoreId == storeId && !p.PullPaymentData.Archived && p.State == PayoutState.AwaitingPayment)
.ToListAsync()).Where(data => CanHandle(PaymentMethodId.Parse(data.PaymentMethodId))) .ToListAsync()).Where(data =>
PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId) &&
CanHandle(paymentMethodId))
.Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == true); .Select(data => (data, ParseProof(data) as PayoutTransactionOnChainBlob)).Where(tuple=> tuple.Item2 != null && tuple.Item2.TransactionId != null && tuple.Item2.Accounted == true);
foreach (var valueTuple in payouts) foreach (var valueTuple in payouts)
{ {

View File

@@ -28,7 +28,7 @@ namespace BTCPayServer.Data
public static PaymentMethodId GetPaymentMethodId(this PayoutData data) public static PaymentMethodId GetPaymentMethodId(this PayoutData data)
{ {
return PaymentMethodId.Parse(data.PaymentMethodId); return PaymentMethodId.TryParse(data.PaymentMethodId, out var paymentMethodId)? paymentMethodId : null;
} }
public static PayoutBlob GetBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers) public static PayoutBlob GetBlob(this PayoutData data, BTCPayNetworkJsonSerializerSettings serializers)
{ {

View File

@@ -171,7 +171,8 @@ namespace BTCPayServer.Data
#pragma warning disable CS0618 // Type or member is obsolete #pragma warning disable CS0618 // Type or member is obsolete
if (ExcludedPaymentMethods == null || ExcludedPaymentMethods.Length == 0) if (ExcludedPaymentMethods == null || ExcludedPaymentMethods.Length == 0)
return PaymentFilter.Never(); return PaymentFilter.Never();
return PaymentFilter.Any(ExcludedPaymentMethods.Select(p => PaymentFilter.WhereIs(PaymentMethodId.Parse(p))).ToArray());
return PaymentFilter.Any(ExcludedPaymentMethods.ParsePaymentMethodIds().Select(PaymentFilter.WhereIs).ToArray());
#pragma warning restore CS0618 // Type or member is obsolete #pragma warning restore CS0618 // Type or member is obsolete
} }

View File

@@ -25,7 +25,8 @@ namespace BTCPayServer.Data
public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks) public static PaymentMethodId[] GetEnabledPaymentIds(this StoreData storeData, BTCPayNetworkProvider networks)
{ {
var excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods(); var excludeFilter = storeData.GetStoreBlob().GetExcludedPaymentMethods();
var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks).Select(p => p.PaymentId) var paymentMethodIds = storeData.GetSupportedPaymentMethods(networks)
.Select(p => p.PaymentId)
.Where(a => !excludeFilter.Match(a)) .Where(a => !excludeFilter.Match(a))
.OrderByDescending(a => a.CryptoCode == "BTC") .OrderByDescending(a => a.CryptoCode == "BTC")
.ThenBy(a => a.CryptoCode) .ThenBy(a => a.CryptoCode)

View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
using System.IO; using System.IO;
@@ -482,6 +483,15 @@ namespace BTCPayServer
"Supported chains: " + String.Join(',', supportedChains.ToArray())); "Supported chains: " + String.Join(',', supportedChains.ToArray()));
return result; return result;
} }
public static PaymentMethodId[] ParsePaymentMethodIds(this string[] paymentMethods)
{
return paymentMethods.Select(s =>
{
PaymentMethodId.TryParse(s, out var parsed);
return parsed;
}).Where(id => id != null).ToArray();
}
public static DataDirectories Configure(this DataDirectories dataDirectories, IConfiguration configuration) public static DataDirectories Configure(this DataDirectories dataDirectories, IConfiguration configuration)
{ {

View File

@@ -286,8 +286,13 @@ namespace BTCPayServer.HostedServices
req.Completion.SetResult(PayoutApproval.Result.OldRevision); req.Completion.SetResult(PayoutApproval.Result.OldRevision);
return; return;
} }
if (!PaymentMethodId.TryParse(payout.PaymentMethodId, out var paymentMethod))
{
req.Completion.SetResult(PayoutApproval.Result.NotFound);
return;
}
payout.State = PayoutState.AwaitingPayment; payout.State = PayoutState.AwaitingPayment;
var paymentMethod = PaymentMethodId.Parse(payout.PaymentMethodId);
if (paymentMethod.CryptoCode == payout.PullPaymentData.GetBlob().Currency) if (paymentMethod.CryptoCode == payout.PullPaymentData.GetBlob().Currency)
req.Rate = 1.0m; req.Rate = 1.0m;
var cryptoAmount = payoutBlob.Amount / req.Rate; var cryptoAmount = payoutBlob.Amount / req.Rate;

View File

@@ -290,7 +290,10 @@ namespace BTCPayServer.Services.Invoices
JObject strategies = JObject.Parse(DerivationStrategies); JObject strategies = JObject.Parse(DerivationStrategies);
foreach (var strat in strategies.Properties()) foreach (var strat in strategies.Properties())
{ {
var paymentMethodId = PaymentMethodId.Parse(strat.Name); if (!PaymentMethodId.TryParse(strat.Name, out var paymentMethodId))
{
continue;
}
var network = Networks.GetNetwork<BTCPayNetworkBase>(paymentMethodId.CryptoCode); var network = Networks.GetNetwork<BTCPayNetworkBase>(paymentMethodId.CryptoCode);
if (network != null) if (network != null)
{ {