channeldb: validate feature dependencies when adding invoice
This commit is contained in:
parent
7bed359296
commit
7e2f5a184b
@ -8,6 +8,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/lightningnetwork/lnd/clock"
|
||||
"github.com/lightningnetwork/lnd/feature"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
"github.com/lightningnetwork/lnd/record"
|
||||
@ -1658,3 +1659,30 @@ func TestDeleteInvoices(t *testing.T) {
|
||||
assertInvoiceCount(0)
|
||||
|
||||
}
|
||||
|
||||
// TestAddInvoiceInvalidFeatureDeps asserts that inserting an invoice with
|
||||
// invalid transitive feature dependencies fails with the appropriate error.
|
||||
func TestAddInvoiceInvalidFeatureDeps(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
db, cleanup, err := MakeTestDB()
|
||||
require.NoError(t, err, "unable to make test db")
|
||||
defer cleanup()
|
||||
|
||||
invoice, err := randInvoice(500)
|
||||
require.NoError(t, err)
|
||||
|
||||
invoice.Terms.Features = lnwire.NewFeatureVector(
|
||||
lnwire.NewRawFeatureVector(
|
||||
lnwire.TLVOnionPayloadOptional,
|
||||
lnwire.MPPOptional,
|
||||
),
|
||||
lnwire.Features,
|
||||
)
|
||||
|
||||
hash := invoice.Terms.PaymentPreimage.Hash()
|
||||
_, err = db.AddInvoice(invoice, hash)
|
||||
require.Error(t, err, feature.NewErrMissingFeatureDep(
|
||||
lnwire.PaymentAddrOptional,
|
||||
))
|
||||
}
|
||||
|
@ -10,6 +10,7 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/lightningnetwork/lnd/channeldb/kvdb"
|
||||
"github.com/lightningnetwork/lnd/feature"
|
||||
"github.com/lightningnetwork/lnd/htlcswitch/hop"
|
||||
"github.com/lightningnetwork/lnd/lntypes"
|
||||
"github.com/lightningnetwork/lnd/lnwire"
|
||||
@ -674,6 +675,11 @@ func validateInvoice(i *Invoice, paymentHash lntypes.Hash) error {
|
||||
return errors.New("invoice must have a feature vector")
|
||||
}
|
||||
|
||||
err := feature.ValidateDeps(i.Terms.Features)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if i.Terms.PaymentPreimage == nil && !i.HodlInvoice {
|
||||
return errors.New("non-hodl invoices must have a preimage")
|
||||
}
|
||||
|
@ -111,7 +111,10 @@ var (
|
||||
Value: testInvoiceAmt,
|
||||
Expiry: time.Hour,
|
||||
Features: lnwire.NewFeatureVector(
|
||||
lnwire.NewRawFeatureVector(lnwire.PaymentAddrRequired),
|
||||
lnwire.NewRawFeatureVector(
|
||||
lnwire.TLVOnionPayloadOptional,
|
||||
lnwire.PaymentAddrRequired,
|
||||
),
|
||||
lnwire.Features,
|
||||
),
|
||||
},
|
||||
@ -124,7 +127,10 @@ var (
|
||||
Value: testInvoiceAmt,
|
||||
Expiry: time.Hour,
|
||||
Features: lnwire.NewFeatureVector(
|
||||
lnwire.NewRawFeatureVector(lnwire.PaymentAddrOptional),
|
||||
lnwire.NewRawFeatureVector(
|
||||
lnwire.TLVOnionPayloadOptional,
|
||||
lnwire.PaymentAddrOptional,
|
||||
),
|
||||
lnwire.Features,
|
||||
),
|
||||
},
|
||||
|
Loading…
Reference in New Issue
Block a user