-
Notifications
You must be signed in to change notification settings - Fork 2.2k
routerrpc: reject payment to invoice that don't have payment secret or blinded paths #9752
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
routerrpc: reject payment to invoice that don't have payment secret or blinded paths #9752
Conversation
Important Review skippedAuto reviews are limited to specific labels. 🏷️ Labels to auto review (1)
Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
ada4d4e
to
69e180c
Compare
670fca4
to
b37fe55
Compare
b37fe55
to
bb59d52
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello @erickcestari, could you please split the commit into two? One for the code changes and another for the documentation. Thanks!
bb59d52
to
50cc265
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @erickcestari , consider adding a test case to TestExtractIntentFromSendRequest
in router_backend_test.go
to cover this scenario.
50cc265
to
6e7034a
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That’s all from my side.
2395167
to
51b1059
Compare
Hello @saubyk it would be nice to have the CI Workflow running for this PR. |
51b1059
to
ca77283
Compare
@erickcestari, remember to re-request review from reviewers when ready |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have just one final comment about the commit message. LGTM 🎉
@saubyk the CI needs approval to run.
Approved CI. |
Ensure that a payment is only sent if the invoice includes either a payment address (payment secret) or at least one blinded path.
ca77283
to
c6abfff
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
tACK 🎉
@@ -503,6 +503,13 @@ func TestExtractIntentFromSendRequest(t *testing.T) { | |||
"g6aykds4ydvf2x9lpngqcfux3hv8qlraan9v3s9296r5w5eh959yzadgh5ck" + | |||
"gjydgyfxdpumxtuk3p3caugmlqpz5necs" | |||
|
|||
const paymentReqMissingAddr = "lnbcrt100p1p70xwfzpp5qqqsyqcyq5rqwzqfq" + |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
@@ -503,6 +503,13 @@ func TestExtractIntentFromSendRequest(t *testing.T) { | |||
"g6aykds4ydvf2x9lpngqcfux3hv8qlraan9v3s9296r5w5eh959yzadgh5ck" + | |||
"gjydgyfxdpumxtuk3p3caugmlqpz5necs" | |||
|
|||
const paymentReqMissingAddr = "lnbcrt100p1p70xwfzpp5qqqsyqcyq5rqwzqfq" + |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Q: How are we handling this in LND to make sure this test doesn’t fail in 10 years when the invoice expires?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good question, in this case we aren't handling it at all. Idk how exactly we should handle this.
if payReq.PaymentAddr.IsNone() && | ||
len(payReq.BlindedPaymentPaths) == 0 { | ||
|
||
return nil, errors.New("payment request must contain " + | ||
"either a payment address or blinded paths") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @erickcestari and @MPins, what do you think about adding this check directly in the invoice validation function? It could help make the invoice validation more complete in just one place
Line 373 in f8e67c0
func validateInvoice(invoice *Invoice) error { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The idea here is to reject the payment only if it has no payment address or blinded paths. If we added this validation to validateInvoice
, the decoding phase would also fail.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is exactly what I'm suggesting. Why do we reject the payment instead of rejecting the creation of an invalid invoice in the first place? Are there any use cases where an invoice without a payment address or blinded paths is still valid and serves a purpose?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You can see more about the discussion here: #9702 (comment)
The main reason, however, is the one mentioned by @Roasbeef.
Sometimes you just want to decode an invoice. Many node management UIs support just decoding an invoice. Invoice validity (BOLT 11) is distinct from the feature bits and fields we deem mandatory.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It’s not clear to me that an invoice missing these fields should be considered well structured; however, if it’s planned to improve this later, I’m fine with it
c6abfff
to
2de5604
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Approved CI run. |
Rebase conflict is preventing CI from running for some reason... |
This PR introduces the initial phase of enforcing payment secret validation for invoices, as described in issue #9718.
Change Description
Adds validation to
extractIntentFromSendRequest
to ensure that an invoice includes either a payment address (payment secret) or at least one blinded path when parsing the SendRequest details.Related to: #9700, #9718