Add handle_held_htlc_available MessageContext param

Needed to authenticate that the held_htlc_available message is being sent over
a reply path that we originally created and that isn't expired before we reply
with release_held_htlc. This context will be used in upcoming commits when we
add support for async receive.
This commit is contained in:
Valentine Wallace 2024-12-04 14:00:22 -05:00
parent da8cb9a71d
commit 0611e6065b
No known key found for this signature in database
GPG key ID: FD3E106A2CE099B4
6 changed files with 19 additions and 6 deletions

View file

@ -122,7 +122,8 @@ struct TestAsyncPaymentsMessageHandler {}
impl AsyncPaymentsMessageHandler for TestAsyncPaymentsMessageHandler {
fn handle_held_htlc_available(
&self, _message: HeldHtlcAvailable, responder: Option<Responder>,
&self, _message: HeldHtlcAvailable, _context: AsyncPaymentsContext,
responder: Option<Responder>,
) -> Option<(ReleaseHeldHtlc, ResponseInstruction)> {
let responder = match responder {
Some(resp) => resp,

View file

@ -12166,7 +12166,8 @@ where
L::Target: Logger,
{
fn handle_held_htlc_available(
&self, _message: HeldHtlcAvailable, _responder: Option<Responder>
&self, _message: HeldHtlcAvailable, _context: AsyncPaymentsContext,
_responder: Option<Responder>
) -> Option<(ReleaseHeldHtlc, ResponseInstruction)> {
None
}

View file

@ -149,7 +149,8 @@ impl OffersMessageHandler for IgnoringMessageHandler {
}
impl AsyncPaymentsMessageHandler for IgnoringMessageHandler {
fn handle_held_htlc_available(
&self, _message: HeldHtlcAvailable, _responder: Option<Responder>,
&self, _message: HeldHtlcAvailable, _context: AsyncPaymentsContext,
_responder: Option<Responder>,
) -> Option<(ReleaseHeldHtlc, ResponseInstruction)> {
None
}

View file

@ -28,7 +28,8 @@ pub trait AsyncPaymentsMessageHandler {
/// Handle a [`HeldHtlcAvailable`] message. A [`ReleaseHeldHtlc`] should be returned to release
/// the held funds.
fn handle_held_htlc_available(
&self, message: HeldHtlcAvailable, responder: Option<Responder>,
&self, message: HeldHtlcAvailable, context: AsyncPaymentsContext,
responder: Option<Responder>,
) -> Option<(ReleaseHeldHtlc, ResponseInstruction)>;
/// Handle a [`ReleaseHeldHtlc`] message. If authentication of the message succeeds, an HTLC

View file

@ -85,7 +85,8 @@ struct TestAsyncPaymentsMessageHandler {}
impl AsyncPaymentsMessageHandler for TestAsyncPaymentsMessageHandler {
fn handle_held_htlc_available(
&self, _message: HeldHtlcAvailable, _responder: Option<Responder>,
&self, _message: HeldHtlcAvailable, _context: AsyncPaymentsContext,
_responder: Option<Responder>,
) -> Option<(ReleaseHeldHtlc, ResponseInstruction)> {
None
}

View file

@ -1646,8 +1646,16 @@ where
},
#[cfg(async_payments)]
ParsedOnionMessageContents::AsyncPayments(AsyncPaymentsMessage::HeldHtlcAvailable(msg)) => {
let context = match context {
Some(MessageContext::AsyncPayments(context)) => context,
Some(_) => {
debug_assert!(false, "Checked in peel_onion_message");
return
},
None => return,
};
let response_instructions = self.async_payments_handler.handle_held_htlc_available(
msg, responder
msg, context, responder
);
if let Some((msg, instructions)) = response_instructions {
let _ = self.handle_onion_message_response(msg, instructions);