@@ -65,7 +65,7 @@ use crate::offers::merkle::SignError;
6565use crate::offers::offer::{Offer, OfferBuilder};
6666use crate::offers::parse::Bolt12SemanticError;
6767use crate::offers::refund::{Refund, RefundBuilder};
68- use crate::onion_message::messenger::{Destination, MessageRouter, PendingOnionMessage, new_pending_onion_message };
68+ use crate::onion_message::messenger::{new_pending_onion_message, Destination, MessageRouter, PendingOnionMessage, Responder, ResponseInstruction };
6969use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
7070use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
7171use crate::sign::ecdsa::WriteableEcdsaChannelSigner;
@@ -76,6 +76,7 @@ use crate::util::string::UntrustedString;
7676use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
7777use crate::util::logger::{Level, Logger, WithContext};
7878use crate::util::errors::APIError;
79+
7980#[cfg(not(c_bindings))]
8081use {
8182 crate::offers::offer::DerivedMetadata,
@@ -9450,24 +9451,31 @@ where
94509451 R::Target: Router,
94519452 L::Target: Logger,
94529453{
9453- fn handle_message(&self, message: OffersMessage) -> Option <OffersMessage> {
9454+ fn handle_message(&self, message: OffersMessage, responder: Option<Responder> ) -> ResponseInstruction <OffersMessage> {
94549455 let secp_ctx = &self.secp_ctx;
94559456 let expanded_key = &self.inbound_payment_key;
94569457
94579458 match message {
94589459 OffersMessage::InvoiceRequest(invoice_request) => {
9460+ let responder = match responder {
9461+ Some(responder) => responder,
9462+ None => return ResponseInstruction::NoResponse,
9463+ };
9464+
94599465 let amount_msats = match InvoiceBuilder::<DerivedSigningPubkey>::amount_msats(
94609466 &invoice_request
94619467 ) {
94629468 Ok(amount_msats) => amount_msats,
9463- Err(error) => return Some(OffersMessage::InvoiceError(error.into())),
9469+ Err(error) => {
9470+ return responder.respond(OffersMessage::InvoiceError(error.into()));
9471+ }
94649472 };
94659473 let invoice_request = match invoice_request.verify(expanded_key, secp_ctx) {
94669474 Ok(invoice_request) => invoice_request,
94679475 Err(()) => {
94689476 let error = Bolt12SemanticError::InvalidMetadata;
9469- return Some (OffersMessage::InvoiceError(error.into()));
9470- },
9477+ return responder.respond (OffersMessage::InvoiceError(error.into()));
9478+ }
94719479 };
94729480
94739481 let relative_expiry = DEFAULT_RELATIVE_EXPIRY.as_secs() as u32;
@@ -9477,8 +9485,8 @@ where
94779485 Ok((payment_hash, payment_secret)) => (payment_hash, payment_secret),
94789486 Err(()) => {
94799487 let error = Bolt12SemanticError::InvalidAmount;
9480- return Some (OffersMessage::InvoiceError(error.into()));
9481- },
9488+ return responder.respond (OffersMessage::InvoiceError(error.into()));
9489+ }
94829490 };
94839491
94849492 let payment_paths = match self.create_blinded_payment_paths(
@@ -9487,8 +9495,8 @@ where
94879495 Ok(payment_paths) => payment_paths,
94889496 Err(()) => {
94899497 let error = Bolt12SemanticError::MissingPaths;
9490- return Some (OffersMessage::InvoiceError(error.into()));
9491- },
9498+ return responder.respond (OffersMessage::InvoiceError(error.into()));
9499+ }
94929500 };
94939501
94949502 #[cfg(not(feature = "std"))]
@@ -9508,8 +9516,8 @@ where
95089516 let builder: Result<InvoiceBuilder<DerivedSigningPubkey>, _> =
95099517 builder.map(|b| b.into());
95109518 match builder.and_then(|b| b.allow_mpp().build_and_sign(secp_ctx)) {
9511- Ok(invoice) => Some (OffersMessage::Invoice(invoice)),
9512- Err(error) => Some (OffersMessage::InvoiceError(error.into())),
9519+ Ok(invoice) => return responder.respond (OffersMessage::Invoice(invoice)),
9520+ Err(error) => return responder.respond (OffersMessage::InvoiceError(error.into())),
95139521 }
95149522 } else {
95159523 #[cfg(feature = "std")]
@@ -9538,13 +9546,14 @@ where
95389546 }
95399547 });
95409548 match response {
9541- Ok(invoice) => Some (invoice),
9542- Err(error) => Some (error),
9549+ Ok(invoice) => return responder.respond (invoice),
9550+ Err(error) => return responder.respond (error),
95439551 }
95449552 }
95459553 },
9554+
95469555 OffersMessage::Invoice(invoice) => {
9547- match invoice.verify(expanded_key, secp_ctx) {
9556+ let response = match invoice.verify(expanded_key, secp_ctx) {
95489557 Err(()) => {
95499558 Some(OffersMessage::InvoiceError(InvoiceError::from_string("Unrecognized invoice".to_owned())))
95509559 },
@@ -9559,11 +9568,24 @@ where
95599568 None
95609569 }
95619570 },
9571+ };
9572+
9573+ match (responder, response) {
9574+ (Some(responder), Some(response)) => return responder.respond(response),
9575+ (None, Some(_)) => {
9576+ log_trace!(
9577+ self.logger,
9578+ "A response was generated, but there is no reply_path specified for sending the response."
9579+ );
9580+ return ResponseInstruction::NoResponse
9581+ },
9582+ _ => return ResponseInstruction::NoResponse
95629583 }
95639584 },
9585+
95649586 OffersMessage::InvoiceError(invoice_error) => {
95659587 log_trace!(self.logger, "Received invoice_error: {}", invoice_error);
9566- None
9588+ return ResponseInstruction::NoResponse
95679589 },
95689590 }
95699591 }
0 commit comments