@@ -65,7 +65,7 @@ use crate::offers::merkle::SignError;
65
65
use crate::offers::offer::{Offer, OfferBuilder};
66
66
use crate::offers::parse::Bolt12SemanticError;
67
67
use 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 };
69
69
use crate::onion_message::offers::{OffersMessage, OffersMessageHandler};
70
70
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
71
71
use crate::sign::ecdsa::WriteableEcdsaChannelSigner;
@@ -76,6 +76,7 @@ use crate::util::string::UntrustedString;
76
76
use crate::util::ser::{BigSize, FixedLengthReader, Readable, ReadableArgs, MaybeReadable, Writeable, Writer, VecWriter};
77
77
use crate::util::logger::{Level, Logger, WithContext};
78
78
use crate::util::errors::APIError;
79
+
79
80
#[cfg(not(c_bindings))]
80
81
use {
81
82
crate::offers::offer::DerivedMetadata,
@@ -9450,23 +9451,30 @@ where
9450
9451
R::Target: Router,
9451
9452
L::Target: Logger,
9452
9453
{
9453
- fn handle_message(&self, message: OffersMessage) -> Option <OffersMessage> {
9454
+ fn handle_message(&self, message: OffersMessage, responder: Option<Responder> ) -> ResponseInstruction <OffersMessage> {
9454
9455
let secp_ctx = &self.secp_ctx;
9455
9456
let expanded_key = &self.inbound_payment_key;
9456
9457
9457
9458
match message {
9458
9459
OffersMessage::InvoiceRequest(invoice_request) => {
9460
+ let responder = match responder {
9461
+ Some(responder) => responder,
9462
+ None => return ResponseInstruction::NoResponse,
9463
+ };
9464
+
9459
9465
let amount_msats = match InvoiceBuilder::<DerivedSigningPubkey>::amount_msats(
9460
9466
&invoice_request
9461
9467
) {
9462
9468
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
+ },
9464
9472
};
9465
9473
let invoice_request = match invoice_request.verify(expanded_key, secp_ctx) {
9466
9474
Ok(invoice_request) => invoice_request,
9467
9475
Err(()) => {
9468
9476
let error = Bolt12SemanticError::InvalidMetadata;
9469
- return Some (OffersMessage::InvoiceError(error.into()));
9477
+ return responder.respond (OffersMessage::InvoiceError(error.into()));
9470
9478
},
9471
9479
};
9472
9480
@@ -9477,8 +9485,8 @@ where
9477
9485
Ok((payment_hash, payment_secret)) => (payment_hash, payment_secret),
9478
9486
Err(()) => {
9479
9487
let error = Bolt12SemanticError::InvalidAmount;
9480
- return Some (OffersMessage::InvoiceError(error.into()));
9481
- },
9488
+ return responder.respond (OffersMessage::InvoiceError(error.into()));
9489
+ }
9482
9490
};
9483
9491
9484
9492
let payment_paths = match self.create_blinded_payment_paths(
@@ -9487,8 +9495,8 @@ where
9487
9495
Ok(payment_paths) => payment_paths,
9488
9496
Err(()) => {
9489
9497
let error = Bolt12SemanticError::MissingPaths;
9490
- return Some (OffersMessage::InvoiceError(error.into()));
9491
- },
9498
+ return responder.respond (OffersMessage::InvoiceError(error.into()));
9499
+ }
9492
9500
};
9493
9501
9494
9502
#[cfg(not(feature = "std"))]
@@ -9508,8 +9516,8 @@ where
9508
9516
let builder: Result<InvoiceBuilder<DerivedSigningPubkey>, _> =
9509
9517
builder.map(|b| b.into());
9510
9518
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())),
9513
9521
}
9514
9522
} else {
9515
9523
#[cfg(feature = "std")]
@@ -9538,13 +9546,14 @@ where
9538
9546
}
9539
9547
});
9540
9548
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),
9543
9551
}
9544
9552
}
9545
9553
},
9554
+
9546
9555
OffersMessage::Invoice(invoice) => {
9547
- match invoice.verify(expanded_key, secp_ctx) {
9556
+ let response = match invoice.verify(expanded_key, secp_ctx) {
9548
9557
Err(()) => {
9549
9558
Some(OffersMessage::InvoiceError(InvoiceError::from_string("Unrecognized invoice".to_owned())))
9550
9559
},
@@ -9559,11 +9568,24 @@ where
9559
9568
None
9560
9569
}
9561
9570
},
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,
9562
9583
}
9563
9584
},
9585
+
9564
9586
OffersMessage::InvoiceError(invoice_error) => {
9565
9587
log_trace!(self.logger, "Received invoice_error: {}", invoice_error);
9566
- None
9588
+ return ResponseInstruction::NoResponse;
9567
9589
},
9568
9590
}
9569
9591
}
0 commit comments