channeldb: stricter validation of invoice updates
This commit is contained in:
4 files changed
+221
-94
No files matched your search
+11
-35
@@ -464,7 +464,7 @@ func (i *InvoiceRegistry) NotifyExitHopHtlc(rHash lntypes.Hash,
|
||||
|
||||
// Only send an update if the invoice state was changed.
|
||||
updateSubscribers = updateDesc != nil &&
|
||||
inv.State != updateDesc.State
|
||||
updateDesc.State != nil
|
||||
|
||||
// Assign result to outer scope variable.
|
||||
result = res
|
||||
@@ -541,8 +541,10 @@ func (i *InvoiceRegistry) SettleHodlInvoice(preimage lntypes.Preimage) error {
|
||||
}
|
||||
|
||||
return &channeldb.InvoiceUpdateDesc{
|
||||
State: channeldb.ContractSettled,
|
||||
Preimage: preimage,
|
||||
State: &channeldb.InvoiceStateUpdateDesc{
|
||||
NewState: channeldb.ContractSettled,
|
||||
Preimage: preimage,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
@@ -589,39 +591,13 @@ func (i *InvoiceRegistry) CancelInvoice(payHash lntypes.Hash) error {
|
||||
updateInvoice := func(invoice *channeldb.Invoice) (
|
||||
*channeldb.InvoiceUpdateDesc, error) {
|
||||
|
||||
switch invoice.State {
|
||||
case channeldb.ContractSettled:
|
||||
return nil, channeldb.ErrInvoiceAlreadySettled
|
||||
case channeldb.ContractCanceled:
|
||||
return nil, channeldb.ErrInvoiceAlreadyCanceled
|
||||
}
|
||||
|
||||
// Mark individual held htlcs as canceled.
|
||||
canceledHtlcs := make(
|
||||
map[channeldb.CircuitKey]struct{},
|
||||
)
|
||||
for key, htlc := range invoice.Htlcs {
|
||||
switch htlc.State {
|
||||
|
||||
// If we get here, there shouldn't be any settled htlcs.
|
||||
case channeldb.HtlcStateSettled:
|
||||
return nil, errors.New("cannot cancel " +
|
||||
"invoice with settled htlc(s)")
|
||||
|
||||
// Don't cancel htlcs that were already canceled,
|
||||
// because it would incorrectly modify the invoice paid
|
||||
// amt.
|
||||
case channeldb.HtlcStateCanceled:
|
||||
continue
|
||||
}
|
||||
|
||||
canceledHtlcs[key] = struct{}{}
|
||||
}
|
||||
|
||||
// Move invoice to the canceled state.
|
||||
// Move invoice to the canceled state. Rely on validation in
|
||||
// channeldb to return an error if the invoice is already
|
||||
// settled or canceled.
|
||||
return &channeldb.InvoiceUpdateDesc{
|
||||
CancelHtlcs: canceledHtlcs,
|
||||
State: channeldb.ContractCanceled,
|
||||
State: &channeldb.InvoiceStateUpdateDesc{
|
||||
NewState: channeldb.ContractCanceled,
|
||||
},
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
||||
+7
-5
@@ -138,11 +138,9 @@ func updateInvoice(ctx *invoiceUpdateCtx, inv *channeldb.Invoice) (
|
||||
// We do accept or settle the HTLC.
|
||||
switch inv.State {
|
||||
case channeldb.ContractAccepted:
|
||||
update.State = channeldb.ContractAccepted
|
||||
return &update, resultDuplicateToAccepted, nil
|
||||
|
||||
case channeldb.ContractSettled:
|
||||
update.State = channeldb.ContractSettled
|
||||
return &update, resultDuplicateToSettled, nil
|
||||
}
|
||||
|
||||
@@ -150,12 +148,16 @@ func updateInvoice(ctx *invoiceUpdateCtx, inv *channeldb.Invoice) (
|
||||
// to wait for the preimage.
|
||||
holdInvoice := inv.Terms.PaymentPreimage == channeldb.UnknownPreimage
|
||||
if holdInvoice {
|
||||
update.State = channeldb.ContractAccepted
|
||||
update.State = &channeldb.InvoiceStateUpdateDesc{
|
||||
NewState: channeldb.ContractAccepted,
|
||||
}
|
||||
return &update, resultAccepted, nil
|
||||
}
|
||||
|
||||
update.Preimage = inv.Terms.PaymentPreimage
|
||||
update.State = channeldb.ContractSettled
|
||||
update.State = &channeldb.InvoiceStateUpdateDesc{
|
||||
NewState: channeldb.ContractSettled,
|
||||
Preimage: inv.Terms.PaymentPreimage,
|
||||
}
|
||||
|
||||
return &update, resultSettled, nil
|
||||
}
|
||||
Reference in new issue
Block a user