Skip to content

Commit bce6cd3

Browse files
shaavanjkczyz
authored andcommitted
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 ebfe771 commit bce6cd3

File tree

5 files changed

+60
-21
lines changed

5 files changed

+60
-21
lines changed

fuzz/src/onion_message.rs

Lines changed: 11 additions & 5 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::{MessageContext, OffersContext};
910
use lightning::blinded_path::{BlindedPath, EmptyNodeIdLookUp};
1011
use lightning::ln::features::InitFeatures;
1112
use lightning::ln::msgs::{self, DecodeError, OnionMessageHandler};
@@ -104,7 +105,7 @@ struct TestOffersMessageHandler {}
104105

105106
impl OffersMessageHandler for TestOffersMessageHandler {
106107
fn handle_message(
107-
&self, _message: OffersMessage, _responder: Option<Responder>,
108+
&self, _message: OffersMessage, _context: OffersContext, _responder: Option<Responder>,
108109
) -> ResponseInstruction<OffersMessage> {
109110
ResponseInstruction::NoResponse
110111
}
@@ -152,7 +153,7 @@ struct TestCustomMessageHandler {}
152153
impl CustomOnionMessageHandler for TestCustomMessageHandler {
153154
type CustomMessage = TestCustomMessage;
154155
fn handle_custom_message(
155-
&self, message: Self::CustomMessage, responder: Option<Responder>,
156+
&self, message: Self::CustomMessage, _context: Vec<u8>, responder: Option<Responder>,
156157
) -> ResponseInstruction<Self::CustomMessage> {
157158
match responder {
158159
Some(responder) => responder.respond(message),
@@ -342,9 +343,14 @@ mod tests {
342343
super::do_test(&<Vec<u8>>::from_hex(one_hop_om).unwrap(), &logger);
343344
{
344345
let log_entries = logger.lines.lock().unwrap();
345-
assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
346-
"Received an onion message with path_id None and a reply_path: Custom(TestCustomMessage)"
347-
.to_string())), Some(&1));
346+
assert_eq!(
347+
log_entries.get(&(
348+
"lightning::onion_message::messenger".to_string(),
349+
"Received an onion message with a reply_path: Custom(TestCustomMessage)"
350+
.to_string()
351+
)),
352+
Some(&1)
353+
);
348354
assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),
349355
"Constructing onion message when responding with Custom Message to an onion message: TestCustomMessage".to_string())), Some(&1));
350356
assert_eq!(log_entries.get(&("lightning::onion_message::messenger".to_string(),

lightning/src/ln/channelmanager.rs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10261,6 +10261,13 @@ where
1026110261
let secp_ctx = &self.secp_ctx;
1026210262
let expanded_key = &self.inbound_payment_key;
1026310263

10264+
let abandon_if_payment = |context| {
10265+
match context {
10266+
OffersContext::OutboundPayment { payment_id } => self.abandon_payment(payment_id),
10267+
_ => {},
10268+
}
10269+
};
10270+
1026410271
match message {
1026510272
OffersMessage::InvoiceRequest(invoice_request) => {
1026610273
let responder = match responder {
@@ -10400,12 +10407,21 @@ where
1040010407
};
1040110408

1040210409
match result {
10403-
Ok(()) => ResponseInstruction::NoResponse,
10404-
Err(e) => match responder {
10405-
Some(responder) => responder.respond(OffersMessage::InvoiceError(e)),
10410+
Ok(_) => ResponseInstruction::NoResponse,
10411+
Err(err) => match responder {
10412+
Some(responder) => {
10413+
abandon_if_payment(context);
10414+
responder.respond(OffersMessage::InvoiceError(err))
10415+
},
1040610416
None => {
10407-
log_trace!(logger, "No reply path for sending invoice error: {:?}", e);
10408-
ResponseInstruction::NoResponse
10417+
abandon_if_payment(context);
10418+
log_trace!(
10419+
logger,
10420+
"An error response was generated, but there is no reply_path specified \
10421+
for sending the response. Error: {}",
10422+
err
10423+
);
10424+
return ResponseInstruction::NoResponse;
1040910425
},
1041010426
},
1041110427
}
@@ -10428,6 +10444,7 @@ where
1042810444
};
1042910445
let logger = WithContext::from(&self.logger, None, None, payment_hash);
1043010446
log_trace!(logger, "Received invoice_error: {}", invoice_error);
10447+
abandon_if_payment(context);
1043110448
ResponseInstruction::NoResponse
1043210449
},
1043310450
}

lightning/src/ln/peer_handler.rs

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

21-
use crate::sign::{NodeSigner, Recipient};
2221
use crate::blinded_path::message::OffersContext;
22+
use crate::sign::{NodeSigner, Recipient};
2323
use crate::events::{MessageSendEvent, MessageSendEventsProvider};
2424
use crate::ln::types::ChannelId;
2525
use crate::ln::features::{InitFeatures, NodeFeatures};
@@ -160,7 +160,7 @@ impl AsyncPaymentsMessageHandler for IgnoringMessageHandler {
160160
}
161161
impl CustomOnionMessageHandler for IgnoringMessageHandler {
162162
type CustomMessage = Infallible;
163-
fn handle_custom_message(&self, _message: Self::CustomMessage, _responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
163+
fn handle_custom_message(&self, _message: Self::CustomMessage, _context: Vec<u8>, _responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
164164
// Since we always return `None` in the read the handle method should never be called.
165165
unreachable!();
166166
}

lightning/src/onion_message/functional_tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ impl Drop for TestCustomMessageHandler {
174174

175175
impl CustomOnionMessageHandler for TestCustomMessageHandler {
176176
type CustomMessage = TestCustomMessage;
177-
fn handle_custom_message(&self, msg: Self::CustomMessage, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
177+
fn handle_custom_message(&self, msg: Self::CustomMessage, _context: Vec<u8>, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage> {
178178
let expectation = self.get_next_expectation();
179179
assert_eq!(msg, expectation.expect);
180180

@@ -437,7 +437,7 @@ fn async_response_over_one_blinded_hop() {
437437

438438
// 5. Expect Alice to receive the message and create a response instruction for it.
439439
alice.custom_message_handler.expect_message(message.clone());
440-
let response_instruction = nodes[0].custom_message_handler.handle_custom_message(message, responder);
440+
let response_instruction = nodes[0].custom_message_handler.handle_custom_message(message, Vec::new(), responder);
441441

442442
// 6. Simulate Alice asynchronously responding back to Bob with a response.
443443
assert_eq!(
@@ -470,7 +470,7 @@ fn async_response_with_reply_path_succeeds() {
470470
// Alice asynchronously responds to Bob, expecting a response back from him.
471471
let responder = Responder::new(reply_path);
472472
alice.custom_message_handler.expect_message_and_response(message.clone());
473-
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Some(responder));
473+
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Vec::new(), Some(responder));
474474

475475
assert_eq!(
476476
alice.messenger.handle_onion_message_response(response_instruction),
@@ -508,7 +508,7 @@ fn async_response_with_reply_path_fails() {
508508
disconnect_peers(alice, bob);
509509
let responder = Responder::new(reply_path);
510510
alice.custom_message_handler.expect_message_and_response(message.clone());
511-
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Some(responder));
511+
let response_instruction = alice.custom_message_handler.handle_custom_message(message, Vec::new(), Some(responder));
512512

513513
assert_eq!(
514514
alice.messenger.handle_onion_message_response(response_instruction),

lightning/src/onion_message/messenger.rs

Lines changed: 21 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, MessageContext, OffersContext};
19+
use crate::blinded_path::message::{advance_path_by_one, ForwardNode, ForwardTlvs, MessageContext, OffersContext, ReceiveTlvs};
2020
use crate::blinded_path::utils;
2121
use crate::events::{Event, EventHandler, EventsProvider};
2222
use crate::sign::{EntropySource, NodeSigner, Recipient};
@@ -768,7 +768,7 @@ pub trait CustomOnionMessageHandler {
768768
/// Called with the custom message that was received, returning a response to send, if any.
769769
///
770770
/// The returned [`Self::CustomMessage`], if any, is enqueued to be sent by [`OnionMessenger`].
771-
fn handle_custom_message(&self, message: Self::CustomMessage, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage>;
771+
fn handle_custom_message(&self, message: Self::CustomMessage, context: Vec<u8>, responder: Option<Responder>) -> ResponseInstruction<Self::CustomMessage>;
772772

773773
/// Read a custom message of type `message_type` from `buffer`, returning `Ok(None)` if the
774774
/// message type is unknown.
@@ -1446,7 +1446,7 @@ where
14461446
fn handle_onion_message(&self, peer_node_id: &PublicKey, msg: &OnionMessage) {
14471447
let logger = WithContext::from(&self.logger, Some(*peer_node_id), None, None);
14481448
match self.peel_onion_message(msg) {
1449-
Ok(PeeledOnion::Receive(message, _context, reply_path)) => {
1449+
Ok(PeeledOnion::Receive(message, context, reply_path)) => {
14501450
log_trace!(
14511451
logger,
14521452
"Received an onion message with {} reply_path: {:?}",
@@ -1455,7 +1455,15 @@ where
14551455
let responder = reply_path.map(Responder::new);
14561456
match message {
14571457
ParsedOnionMessageContents::Offers(msg) => {
1458-
let response_instructions = self.offers_handler.handle_message(msg, OffersContext::Unknown {}, responder);
1458+
let context = match context {
1459+
None => OffersContext::Unknown {},
1460+
Some(MessageContext::Offers(context)) => context,
1461+
Some(MessageContext::Custom(_)) => {
1462+
debug_assert!(false, "Shouldn't have triggered this case.");
1463+
return
1464+
}
1465+
};
1466+
let response_instructions = self.offers_handler.handle_message(msg, context, responder);
14591467
let _ = self.handle_onion_message_response(response_instructions);
14601468
},
14611469
#[cfg(async_payments)]
@@ -1470,7 +1478,15 @@ where
14701478
self.async_payments_handler.release_held_htlc(msg);
14711479
},
14721480
ParsedOnionMessageContents::Custom(msg) => {
1473-
let response_instructions = self.custom_handler.handle_custom_message(msg, responder);
1481+
let context = match context {
1482+
None => vec![],
1483+
Some(MessageContext::Custom(data)) => data,
1484+
Some(MessageContext::Offers(_)) => {
1485+
debug_assert!(false, "Shouldn't have triggered this case.");
1486+
return
1487+
}
1488+
};
1489+
let response_instructions = self.custom_handler.handle_custom_message(msg, context, responder);
14741490
let _ = self.handle_onion_message_response(response_instructions);
14751491
},
14761492
}

0 commit comments

Comments
 (0)