Skip to content

Commit e057531

Browse files
committed
Update handle_message to accept recipient_data as an input field
1. The recipient data, if present, will be used by the handler to abandon outbound payments that have failed for some reason. 2. Also update handle_custom_message to accept optional recipient data for consistency. This will remain unused in this PR for now.
1 parent a249303 commit e057531

File tree

6 files changed

+32
-17
lines changed

6 files changed

+32
-17
lines changed

fuzz/src/onion_message.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use bitcoin::secp256k1::ecdsa::RecoverableSignature;
77
use bitcoin::secp256k1::schnorr;
88

99
use lightning::blinded_path::{BlindedPath, EmptyNodeIdLookUp};
10-
use lightning::blinded_path::message::ForwardNode;
10+
use lightning::blinded_path::message::{ForwardNode, RecipientData};
1111
use lightning::ln::features::InitFeatures;
1212
use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
1313
use lightning::ln::script::ShutdownScript;
@@ -98,7 +98,7 @@ impl MessageRouter for TestMessageRouter {
9898
struct TestOffersMessageHandler {}
9999

100100
impl OffersMessageHandler for TestOffersMessageHandler {
101-
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>) -> ResponseInstruction<OffersMessage> {
101+
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>, _recipient_data: RecipientData) -> ResponseInstruction<OffersMessage> {
102102
ResponseInstruction::NoResponse
103103
}
104104
}
@@ -128,7 +128,7 @@ struct TestCustomMessageHandler {}
128128

129129
impl CustomOnionMessageHandler for TestCustomMessageHandler {
130130
type CustomMessage = TestCustomMessage;
131-
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
131+
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>, _recipient_data: RecipientData) -> ResponseInstruction<Self::CustomMessage> {
132132
match responder {
133133
Some(responder) => responder.respond(message),
134134
None => ResponseInstruction::NoResponse

lightning/src/ln/channelmanager.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ use bitcoin::secp256k1::{SecretKey,PublicKey};
3131
use bitcoin::secp256k1::Secp256k1;
3232
use bitcoin::{secp256k1, Sequence};
3333

34+
use crate::blinded_path::message::RecipientData;
3435
use crate::blinded_path::{BlindedPath, NodeIdLookUp};
3536
use crate::blinded_path::message::ForwardNode;
3637
use crate::blinded_path::payment::{Bolt12OfferContext, Bolt12RefundContext, PaymentConstraints, PaymentContext, ReceiveTlvs};
@@ -10360,10 +10361,16 @@ where
1036010361
R::Target: Router,
1036110362
L::Target: Logger,
1036210363
{
10363-
fn handle_message(&self, message: OffersMessage, responder: Option<Responder>) -> ResponseInstruction<OffersMessage> {
10364+
fn handle_message(&self, message: OffersMessage, responder: Option<Responder>, recipient_data: RecipientData) -> ResponseInstruction<OffersMessage> {
1036410365
let secp_ctx = &self.secp_ctx;
1036510366
let expanded_key = &self.inbound_payment_key;
1036610367

10368+
let abandon_if_payment = |payment_id| {
10369+
if let Some(payment_id) = payment_id {
10370+
self.abandon_payment(payment_id);
10371+
}
10372+
};
10373+
1036710374
match message {
1036810375
OffersMessage::InvoiceRequest(invoice_request) => {
1036910376
let responder = match responder {
@@ -10472,8 +10479,12 @@ where
1047210479
});
1047310480

1047410481
match (responder, response) {
10475-
(Some(responder), Err(e)) => responder.respond(OffersMessage::InvoiceError(e)),
10482+
(Some(responder), Err(e)) => {
10483+
abandon_if_payment(recipient_data.payment_id);
10484+
responder.respond(OffersMessage::InvoiceError(e))
10485+
},
1047610486
(None, Err(_)) => {
10487+
abandon_if_payment(recipient_data.payment_id);
1047710488
log_trace!(
1047810489
self.logger,
1047910490
"A response was generated, but there is no reply_path specified for sending the response."
@@ -10484,6 +10495,7 @@ where
1048410495
}
1048510496
},
1048610497
OffersMessage::InvoiceError(invoice_error) => {
10498+
abandon_if_payment(recipient_data.payment_id);
1048710499
log_trace!(self.logger, "Received invoice_error: {}", invoice_error);
1048810500
return ResponseInstruction::NoResponse;
1048910501
},

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use bitcoin::blockdata::constants::ChainHash;
1919
use bitcoin::secp256k1::{self, Secp256k1, SecretKey, PublicKey};
2020

21+
use crate::blinded_path::message::RecipientData;
2122
use crate::sign::{NodeSigner, Recipient};
2223
use crate::events::{EventHandler, EventsProvider, MessageSendEvent, MessageSendEventsProvider};
2324
use crate::ln::types::ChannelId;
@@ -137,13 +138,13 @@ impl OnionMessageHandler for IgnoringMessageHandler {
137138
}
138139

139140
impl OffersMessageHandler for IgnoringMessageHandler {
140-
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>) -> ResponseInstruction<OffersMessage> {
141+
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>, _recipient_data: RecipientData) -> ResponseInstruction<OffersMessage> {
141142
ResponseInstruction::NoResponse
142143
}
143144
}
144145
impl CustomOnionMessageHandler for IgnoringMessageHandler {
145146
type CustomMessage = Infallible;
146-
fn handle_custom_message(&self, _message: Self::CustomMessage, _responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
147+
fn handle_custom_message(&self, _message: Self::CustomMessage, _responder: Option<Responder>, _recipient_data: RecipientData) -> ResponseInstruction<Self::CustomMessage> {
147148
// Since we always return `None` in the read the handle method should never be called.
148149
unreachable!();
149150
}

lightning/src/onion_message/functional_tests.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
//! Onion message testing and test utilities live here.
1111
12+
use crate::blinded_path::message::RecipientData;
1213
use crate::blinded_path::{BlindedPath, EmptyNodeIdLookUp};
1314
use crate::blinded_path::message::ForwardNode;
1415
use crate::events::{Event, EventsProvider};
@@ -74,7 +75,7 @@ impl Drop for MessengerNode {
7475
struct TestOffersMessageHandler {}
7576

7677
impl OffersMessageHandler for TestOffersMessageHandler {
77-
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>) -> ResponseInstruction<OffersMessage> {
78+
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>, _recipient_data: RecipientData) -> ResponseInstruction<OffersMessage> {
7879
ResponseInstruction::NoResponse
7980
}
8081
}
@@ -161,7 +162,7 @@ impl Drop for TestCustomMessageHandler {
161162

162163
impl CustomOnionMessageHandler for TestCustomMessageHandler {
163164
type CustomMessage = TestCustomMessage;
164-
fn handle_custom_message(&self, msg: Self::CustomMessage, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
165+
fn handle_custom_message(&self, msg: Self::CustomMessage, responder: Option<Responder>, _recipient_data: RecipientData) -> ResponseInstruction<Self::CustomMessage> {
165166
let expectation = self.get_next_expectation();
166167
assert_eq!(msg, expectation.expect);
167168

@@ -424,7 +425,7 @@ fn async_response_over_one_blinded_hop() {
424425

425426
// 5. Expect Alice to receive the message and create a response instruction for it.
426427
alice.custom_message_handler.expect_message(message.clone());
427-
let response_instruction = nodes[0].custom_message_handler.handle_custom_message(message, responder);
428+
let response_instruction = nodes[0].custom_message_handler.handle_custom_message(message, responder, RecipientData::new());
428429

429430
// 6. Simulate Alice asynchronously responding back to Bob with a response.
430431
assert_eq!(
@@ -458,7 +459,7 @@ fn async_response_with_reply_path_succeeds() {
458459
// Alice asynchronously responds to Bob, expecting a response back from him.
459460
let responder = Responder::new(reply_path, path_id);
460461
alice.custom_message_handler.expect_message_and_response(message.clone());
461-
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Some(responder));
462+
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Some(responder), RecipientData::new());
462463

463464
assert_eq!(
464465
alice.messenger.handle_onion_message_response(response_instruction),
@@ -496,7 +497,7 @@ fn async_response_with_reply_path_fails() {
496497
// Therefore, the reply_path cannot be used for the response.
497498
let responder = Responder::new(reply_path, path_id);
498499
alice.custom_message_handler.expect_message_and_response(message.clone());
499-
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Some(responder));
500+
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Some(responder), RecipientData::new());
500501

501502
assert_eq!(
502503
alice.messenger.handle_onion_message_response(response_instruction),

lightning/src/onion_message/messenger.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ pub trait CustomOnionMessageHandler {
623623
/// Called with the custom message that was received, returning a response to send, if any.
624624
///
625625
/// The returned [`Self::CustomMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
626-
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage>;
626+
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>, recipient_data: RecipientData) -> ResponseInstruction<Self::CustomMessage>;
627627

628628
/// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
629629
/// message type is unknown.
@@ -1236,7 +1236,7 @@ where
12361236
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage) {
12371237
let logger = WithContext::from(&self.logger, Some(*peer_node_id), None, None);
12381238
match self.peel_onion_message(msg) {
1239-
Ok(PeeledOnion::Receive(message, path_id, _, reply_path)) => {
1239+
Ok(PeeledOnion::Receive(message, path_id, recipient_data, reply_path)) => {
12401240
log_trace!(
12411241
logger,
12421242
"Received an onion message with path_id {:02x?} and {} reply_path: {:?}",
@@ -1247,14 +1247,14 @@ where
12471247
let responder = reply_path.map(
12481248
|reply_path| Responder::new(reply_path, path_id)
12491249
);
1250-
let response_instructions = self.offers_handler.handle_message(msg, responder);
1250+
let response_instructions = self.offers_handler.handle_message(msg, responder, recipient_data);
12511251
let _ = self.handle_onion_message_response(response_instructions);
12521252
},
12531253
ParsedOnionMessageContents::Custom(msg) => {
12541254
let responder = reply_path.map(
12551255
|reply_path| Responder::new(reply_path, path_id)
12561256
);
1257-
let response_instructions = self.custom_handler.handle_custom_message(msg, responder);
1257+
let response_instructions = self.custom_handler.handle_custom_message(msg, responder, recipient_data);
12581258
let _ = self.handle_onion_message_response(response_instructions);
12591259
},
12601260
}

lightning/src/onion_message/offers.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//! Message handling for BOLT 12 Offers.
1111
1212
use core::fmt;
13+
use crate::blinded_path::message::RecipientData;
1314
use crate::io::{self, Read};
1415
use crate::ln::msgs::DecodeError;
1516
use crate::offers::invoice_error::InvoiceError;
@@ -40,7 +41,7 @@ pub trait OffersMessageHandler {
4041
/// The returned [`OffersMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
4142
///
4243
/// [`OnionMessenger`]: crate::onion_message::messenger::OnionMessenger
43-
fn handle_message(&self, message: OffersMessage, responder: Option<Responder>) -> ResponseInstruction<OffersMessage>;
44+
fn handle_message(&self, message: OffersMessage, responder: Option<Responder>, recipient_data: RecipientData) -> ResponseInstruction<OffersMessage>;
4445

4546
/// Releases any [`OffersMessage`]s that need to be sent.
4647
///

0 commit comments

Comments
 (0)