Skip to content

Commit 46f2caf

Browse files
committed
Update handle_message to Accept offers_data as an Input Field
1. Handling Offers Data: - Updated `handle_message` to accept `offers_data` as an input field. - If `offers_data` is present, it will be utilized by the handler to abandon outbound payments that have failed for any reason. 2. Consistency in Custom Message Handling: - Updated `handle_custom_message` to accept optional `custom_data` for consistency. - Note: `custom_data` will remain unused in this PR.
1 parent dc952fb commit 46f2caf

File tree

6 files changed

+61
-24
lines changed

6 files changed

+61
-24
lines changed

fuzz/src/onion_message.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use bitcoin::secp256k1::ecdsa::RecoverableSignature;
66
use bitcoin::secp256k1::schnorr;
77
use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
88

9+
use lightning::blinded_path::message::{OffersData, RecipientData};
910
use lightning::blinded_path::{BlindedPath, EmptyNodeIdLookUp};
1011
use lightning::ln::features::InitFeatures;
1112
use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
@@ -99,7 +100,7 @@ struct TestOffersMessageHandler {}
99100

100101
impl OffersMessageHandler for TestOffersMessageHandler {
101102
fn handle_message(
102-
&self, _message: OffersMessage, _responder: Option<Responder>,
103+
&self, _message: OffersMessage, _responder: Option<Responder>, _offers_data: OffersData,
103104
) -> ResponseInstruction<OffersMessage> {
104105
ResponseInstruction::NoResponse
105106
}
@@ -131,7 +132,7 @@ struct TestCustomMessageHandler {}
131132
impl CustomOnionMessageHandler for TestCustomMessageHandler {
132133
type CustomMessage = TestCustomMessage;
133134
fn handle_custom_message(
134-
&self, message: Self::CustomMessage, responder: Option<Responder>,
135+
&self, message: Self::CustomMessage, responder: Option<Responder>, _custom_data: Vec<u8>,
135136
) -> ResponseInstruction<Self::CustomMessage> {
136137
match responder {
137138
Some(responder) => responder.respond(message),

lightning/src/ln/channelmanager.rs

Lines changed: 22 additions & 9 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::OffersData;
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};
@@ -10211,10 +10212,16 @@ where
1021110212
R::Target: Router,
1021210213
L::Target: Logger,
1021310214
{
10214-
fn handle_message(&self, message: OffersMessage, responder: Option<Responder>) -> ResponseInstruction<OffersMessage> {
10215+
fn handle_message(&self, message: OffersMessage, responder: Option<Responder>, offers_data: OffersData) -> ResponseInstruction<OffersMessage> {
1021510216
let secp_ctx = &self.secp_ctx;
1021610217
let expanded_key = &self.inbound_payment_key;
1021710218

10219+
let abandon_if_payment = |payment_id| {
10220+
if let Some(payment_id) = payment_id {
10221+
self.abandon_payment(payment_id);
10222+
}
10223+
};
10224+
1021810225
match message {
1021910226
OffersMessage::InvoiceRequest(invoice_request) => {
1022010227
let responder = match responder {
@@ -10326,18 +10333,24 @@ where
1032610333
Err(()) => Err(InvoiceError::from_string("Unrecognized invoice".to_owned())),
1032710334
};
1032810335

10329-
match result {
10330-
Ok(()) => ResponseInstruction::NoResponse,
10331-
Err(e) => match responder {
10332-
Some(responder) => responder.respond(OffersMessage::InvoiceError(e)),
10333-
None => {
10334-
log_trace!(self.logger, "No reply path for sending invoice error: {:?}", e);
10335-
ResponseInstruction::NoResponse
10336-
},
10336+
match (responder, result) {
10337+
(Some(responder), Err(e)) => {
10338+
abandon_if_payment(offers_data.payment_id);
10339+
responder.respond(OffersMessage::InvoiceError(e))
1033710340
},
10341+
(None, Err(_)) => {
10342+
abandon_if_payment(offers_data.payment_id);
10343+
log_trace!(
10344+
self.logger,
10345+
"A response was generated, but there is no reply_path specified for sending the response."
10346+
);
10347+
return ResponseInstruction::NoResponse;
10348+
}
10349+
_ => return ResponseInstruction::NoResponse,
1033810350
}
1033910351
},
1034010352
OffersMessage::InvoiceError(invoice_error) => {
10353+
abandon_if_payment(offers_data.payment_id);
1034110354
log_trace!(self.logger, "Received invoice_error: {}", invoice_error);
1034210355
ResponseInstruction::NoResponse
1034310356
},

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::OffersData;
2122
use crate::sign::{NodeSigner, Recipient};
2223
use crate::events::{MessageSendEvent, MessageSendEventsProvider};
2324
use crate::ln::types::ChannelId;
@@ -144,13 +145,13 @@ impl OnionMessageHandler for IgnoringMessageHandler {
144145
}
145146

146147
impl OffersMessageHandler for IgnoringMessageHandler {
147-
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>) -> ResponseInstruction<OffersMessage> {
148+
fn handle_message(&self, _message: OffersMessage, _responder: Option<Responder>, _offers_data: OffersData) -> ResponseInstruction<OffersMessage> {
148149
ResponseInstruction::NoResponse
149150
}
150151
}
151152
impl CustomOnionMessageHandler for IgnoringMessageHandler {
152153
type CustomMessage = Infallible;
153-
fn handle_custom_message(&self, _message: Self::CustomMessage, _responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
154+
fn handle_custom_message(&self, _message: Self::CustomMessage, _responder: Option<Responder>, _custom_data: Vec<u8>) -> ResponseInstruction<Self::CustomMessage> {
154155
// Since we always return `None` in the read the handle method should never be called.
155156
unreachable!();
156157
}

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::OffersData;
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>, _offers_data: OffersData) -> 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>, _custom_data: Vec<u8>) -> 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, Vec::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), Vec::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), Vec::new());
500501

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

lightning/src/onion_message/messenger.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use bitcoin::hashes::sha256::Hash as Sha256;
1616
use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
1717

1818
use crate::blinded_path::{BlindedPath, IntroductionNode, NextMessageHop, NodeIdLookUp};
19-
use crate::blinded_path::message::{advance_path_by_one, ForwardNode, ForwardTlvs, ReceiveTlvs, RecipientData};
19+
use crate::blinded_path::message::{advance_path_by_one, ForwardNode, ForwardTlvs, OffersData, ReceiveTlvs, RecipientData};
2020
use crate::blinded_path::utils;
2121
use crate::events::{Event, EventHandler, EventsProvider};
2222
use crate::sign::{EntropySource, NodeSigner, Recipient};
@@ -752,7 +752,7 @@ pub trait CustomOnionMessageHandler {
752752
/// Called with the custom message that was received, returning a response to send, if any.
753753
///
754754
/// The returned [`Self::CustomMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
755-
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage>;
755+
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>, custom_data: Vec<u8>) -> ResponseInstruction<Self::CustomMessage>;
756756

757757
/// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
758758
/// message type is unknown.
@@ -1425,7 +1425,7 @@ where
14251425
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage) {
14261426
let logger = WithContext::from(&self.logger, Some(*peer_node_id), None, None);
14271427
match self.peel_onion_message(msg) {
1428-
Ok(PeeledOnion::Receive(message, _tlvs, reply_path)) => {
1428+
Ok(PeeledOnion::Receive(message, tlvs, reply_path)) => {
14291429
let path_id: Option<[u8; 32]> = None;
14301430
log_trace!(
14311431
logger,
@@ -1437,14 +1437,34 @@ where
14371437
let responder = reply_path.map(
14381438
|reply_path| Responder::new(reply_path, path_id)
14391439
);
1440-
let response_instructions = self.offers_handler.handle_message(msg, responder);
1440+
1441+
let offers_data = match tlvs {
1442+
None => OffersData { payment_id: None },
1443+
Some(RecipientData::OffersContext(offers_data)) => offers_data,
1444+
Some(RecipientData::CustomContext(_)) => {
1445+
debug_assert!(false, "Shouldn't have triggered this case.");
1446+
return
1447+
}
1448+
};
1449+
1450+
let response_instructions = self.offers_handler.handle_message(msg, responder, offers_data);
14411451
let _ = self.handle_onion_message_response(response_instructions);
14421452
},
14431453
ParsedOnionMessageContents::Custom(msg) => {
14441454
let responder = reply_path.map(
14451455
|reply_path| Responder::new(reply_path, path_id)
14461456
);
1447-
let response_instructions = self.custom_handler.handle_custom_message(msg, responder);
1457+
1458+
let custom_data = match tlvs {
1459+
None => vec![],
1460+
Some(RecipientData::CustomContext(data)) => data,
1461+
Some(RecipientData::OffersContext(_)) => {
1462+
debug_assert!(false, "Shouldn't have triggered this case.");
1463+
return
1464+
}
1465+
};
1466+
1467+
let response_instructions = self.custom_handler.handle_custom_message(msg, responder, custom_data);
14481468
let _ = self.handle_onion_message_response(response_instructions);
14491469
},
14501470
}

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::OffersData;
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>, offers_data: OffersData) -> ResponseInstruction<OffersMessage>;
4445

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

0 commit comments

Comments
 (0)