Skip to content

Commit 5ff7db6

Browse files
committed
Move DNSResolverMessageHandler impl to OffersMessageFlow
1 parent d7f14fc commit 5ff7db6

File tree

4 files changed

+123
-87
lines changed

4 files changed

+123
-87
lines changed

lightning-dns-resolver/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ mod test {
393393
// When we get the proof back, override its contents to an offer from nodes[1]
394394
let bs_offer = nodes[1].offers_handler.create_offer_builder(None).unwrap().build().unwrap();
395395
nodes[0]
396-
.node
396+
.offers_handler
397397
.testing_dnssec_proof_offer_resolution_override
398398
.lock()
399399
.unwrap()

lightning/src/ln/channelmanager.rs

Lines changed: 26 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ use crate::offers::signer;
7575
use crate::offers::static_invoice::StaticInvoice;
7676
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
7777
use crate::onion_message::dns_resolution::HumanReadableName;
78-
use crate::onion_message::messenger::{Destination, MessageRouter, Responder, ResponseInstruction, MessageSendInstructions};
78+
use crate::onion_message::messenger::{DefaultMessageRouter, Destination, MessageRouter, MessageSendInstructions, Responder, ResponseInstruction};
7979
use crate::onion_message::offers::OffersMessage;
8080
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
8181
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -88,13 +88,10 @@ use crate::util::logger::{Level, Logger, WithContext};
8888
use crate::util::errors::APIError;
8989

9090
#[cfg(feature = "dnssec")]
91-
use crate::blinded_path::message::DNSResolverContext;
92-
#[cfg(feature = "dnssec")]
93-
use crate::onion_message::dns_resolution::{DNSResolverMessage, DNSResolverMessageHandler, DNSSECQuery, DNSSECProof, OMNameResolver};
91+
use crate::onion_message::dns_resolution::{DNSResolverMessage, OMNameResolver};
9492

9593
#[cfg(not(c_bindings))]
9694
use {
97-
crate::onion_message::messenger::DefaultMessageRouter,
9895
crate::routing::router::DefaultRouter,
9996
crate::routing::gossip::NetworkGraph,
10097
crate::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters},
@@ -2390,14 +2387,6 @@ where
23902387
#[cfg(feature = "dnssec")]
23912388
pending_dns_onion_messages: Mutex<Vec<(DNSResolverMessage, MessageSendInstructions)>>,
23922389

2393-
#[cfg(feature = "_test_utils")]
2394-
/// In testing, it is useful be able to forge a name -> offer mapping so that we can pay an
2395-
/// offer generated in the test.
2396-
///
2397-
/// This allows for doing so, validating proofs as normal, but, if they pass, replacing the
2398-
/// offer they resolve to to the given one.
2399-
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
2400-
24012390
entropy_source: ES,
24022391
node_signer: NS,
24032392
signer_provider: SP,
@@ -3267,9 +3256,6 @@ where
32673256
hrn_resolver: OMNameResolver::new(current_timestamp, params.best_block.height),
32683257
#[cfg(feature = "dnssec")]
32693258
pending_dns_onion_messages: Mutex::new(Vec::new()),
3270-
3271-
#[cfg(feature = "_test_utils")]
3272-
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
32733259
}
32743260
}
32753261

@@ -9203,6 +9189,7 @@ pub trait OffersMessageCommons {
92039189
/// Get pending offers messages
92049190
fn get_pending_offers_messages(&self) -> MutexGuard<'_, Vec<(OffersMessage, MessageSendInstructions)>>;
92059191

9192+
#[cfg(feature = "dnssec")]
92069193
/// Get pending DNS onion messages
92079194
fn get_pending_dns_onion_messages(&self) -> MutexGuard<'_, Vec<(DNSResolverMessage, MessageSendInstructions)>>;
92089195

@@ -9335,6 +9322,16 @@ pub trait OffersMessageCommons {
93359322
payer_note: Option<String>, payment_id: PaymentId,
93369323
human_readable_name: Option<HumanReadableName>, create_pending_payment: CPP,
93379324
) -> Result<(), Bolt12SemanticError>;
9325+
9326+
#[cfg(feature = "dnssec")]
9327+
/// Amount for payment awaiting offer
9328+
fn amt_msats_for_payment_awaiting_offer(&self, payment_id: PaymentId) -> Result<u64, ()>;
9329+
9330+
#[cfg(feature = "dnssec")]
9331+
/// Received Offer
9332+
fn received_offer(
9333+
&self, payment_id: PaymentId, retryable_invoice_request: Option<RetryableInvoiceRequest>,
9334+
) -> Result<(), ()>;
93389335
}
93399336

93409337
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref> OffersMessageCommons for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
@@ -9353,6 +9350,7 @@ where
93539350
self.pending_offers_messages.lock().expect("Mutex is locked by other thread.")
93549351
}
93559352

9353+
#[cfg(feature = "dnssec")]
93569354
fn get_pending_dns_onion_messages(&self) -> MutexGuard<'_, Vec<(DNSResolverMessage, MessageSendInstructions)>> {
93579355
self.pending_dns_onion_messages.lock().expect("Mutex is locked by other thread.")
93589356
}
@@ -9586,6 +9584,18 @@ where
95869584

95879585
self.enqueue_invoice_request(invoice_request, reply_paths)
95889586
}
9587+
9588+
#[cfg(feature = "dnssec")]
9589+
fn amt_msats_for_payment_awaiting_offer(&self, payment_id: PaymentId) -> Result<u64, ()> {
9590+
self.pending_outbound_payments.amt_msats_for_payment_awaiting_offer(payment_id)
9591+
}
9592+
9593+
#[cfg(feature = "dnssec")]
9594+
fn received_offer(
9595+
&self, payment_id: PaymentId, retryable_invoice_request: Option<RetryableInvoiceRequest>,
9596+
) -> Result<(), ()> {
9597+
self.pending_outbound_payments.received_offer(payment_id, retryable_invoice_request)
9598+
}
95899599
}
95909600

95919601
/// Defines the maximum number of [`OffersMessage`] including different reply paths to be sent
@@ -11119,69 +11129,6 @@ where
1111911129
}
1112011130
}
1112111131

11122-
#[cfg(feature = "dnssec")]
11123-
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref>
11124-
DNSResolverMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
11125-
where
11126-
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
11127-
T::Target: BroadcasterInterface,
11128-
ES::Target: EntropySource,
11129-
NS::Target: NodeSigner,
11130-
SP::Target: SignerProvider,
11131-
F::Target: FeeEstimator,
11132-
R::Target: Router,
11133-
MR::Target: MessageRouter,
11134-
L::Target: Logger,
11135-
{
11136-
fn handle_dnssec_query(
11137-
&self, _message: DNSSECQuery, _responder: Option<Responder>,
11138-
) -> Option<(DNSResolverMessage, ResponseInstruction)> {
11139-
None
11140-
}
11141-
11142-
fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) {
11143-
let offer_opt = self.hrn_resolver.handle_dnssec_proof_for_offer(message, context);
11144-
#[cfg_attr(not(feature = "_test_utils"), allow(unused_mut))]
11145-
if let Some((completed_requests, mut offer)) = offer_opt {
11146-
for (name, payment_id) in completed_requests {
11147-
#[cfg(feature = "_test_utils")]
11148-
if let Some(replacement_offer) = self.testing_dnssec_proof_offer_resolution_override.lock().unwrap().remove(&name) {
11149-
// If we have multiple pending requests we may end up over-using the override
11150-
// offer, but tests can deal with that.
11151-
offer = replacement_offer;
11152-
}
11153-
if let Ok(amt_msats) = self.pending_outbound_payments.amt_msats_for_payment_awaiting_offer(payment_id) {
11154-
let offer_pay_res =
11155-
self.pay_for_offer_intern(&offer, None, Some(amt_msats), None, payment_id, Some(name),
11156-
|invoice_request, nonce| {
11157-
let retryable_invoice_request = RetryableInvoiceRequest {
11158-
invoice_request: invoice_request.clone(),
11159-
nonce,
11160-
};
11161-
self.pending_outbound_payments
11162-
.received_offer(payment_id, Some(retryable_invoice_request))
11163-
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
11164-
});
11165-
if offer_pay_res.is_err() {
11166-
// The offer we tried to pay is the canonical current offer for the name we
11167-
// wanted to pay. If we can't pay it, there's no way to recover so fail the
11168-
// payment.
11169-
// Note that the PaymentFailureReason should be ignored for an
11170-
// AwaitingInvoice payment.
11171-
self.pending_outbound_payments.abandon_payment(
11172-
payment_id, PaymentFailureReason::RouteNotFound, &self.pending_events,
11173-
);
11174-
}
11175-
}
11176-
}
11177-
}
11178-
}
11179-
11180-
fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> {
11181-
core::mem::take(&mut self.pending_dns_onion_messages.lock().unwrap())
11182-
}
11183-
}
11184-
1118511132
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref>
1118611133
NodeIdLookUp for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
1118711134
where
@@ -13033,9 +12980,6 @@ where
1303312980
hrn_resolver: OMNameResolver::new(highest_seen_timestamp, best_block_height),
1303412981
#[cfg(feature = "dnssec")]
1303512982
pending_dns_onion_messages: Mutex::new(Vec::new()),
13036-
13037-
#[cfg(feature = "_test_utils")]
13038-
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
1303912983
};
1304012984

1304112985
for (_, monitor) in args.channel_monitors.iter() {

lightning/src/ln/functional_test_utils.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ type TestOnionMessenger<'chan_man, 'node_cfg, 'chan_mon_cfg> = OnionMessenger<
437437
&'node_cfg test_utils::TestMessageRouter<'chan_mon_cfg>,
438438
Arc<TestOffersMessageFlow<'chan_man, 'node_cfg, 'chan_mon_cfg>>,
439439
&'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
440-
&'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
440+
Arc<TestOffersMessageFlow<'chan_man, 'node_cfg, 'chan_mon_cfg>>,
441441
IgnoringMessageHandler,
442442
>;
443443

@@ -3328,7 +3328,7 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
33283328
#[cfg(feature = "dnssec")]
33293329
let onion_messenger = OnionMessenger::new(
33303330
dedicated_entropy, cfgs[i].keys_manager, cfgs[i].logger, &chan_mgrs[i],
3331-
&cfgs[i].message_router, offers_handler.clone(), &chan_mgrs[i], &chan_mgrs[i],
3331+
&cfgs[i].message_router, offers_handler.clone(), &chan_mgrs[i], offers_handler.clone(),
33323332
IgnoringMessageHandler {},
33333333
);
33343334
#[cfg(not(feature = "dnssec"))]

lightning/src/offers/flow.rs

Lines changed: 94 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//! Provides data structures and functions for creating and managing Offers messages,
1111
//! facilitating communication, and handling Bolt12 invoice payments.
1212
13+
use crate::prelude::*;
1314
use alloc::vec::Vec;
1415
use core::ops::Deref;
1516
use core::time::Duration;
@@ -39,6 +40,7 @@ use crate::offers::parse::Bolt12SemanticError;
3940
use crate::offers::refund::{Refund, RefundBuilder};
4041

4142
use crate::sign::EntropySource;
43+
use crate::sync::Mutex;
4244
use crate::util::logger::{Logger, WithContext};
4345

4446
#[cfg(c_bindings)]
@@ -48,7 +50,12 @@ use {
4850
};
4951

5052
#[cfg(feature = "dnssec")]
51-
use crate::onion_message::dns_resolution::{DNSResolverMessage, HumanReadableName};
53+
use {
54+
crate::blinded_path::message::DNSResolverContext,
55+
crate::onion_message::dns_resolution::{
56+
DNSResolverMessage, DNSResolverMessageHandler, DNSSECProof, DNSSECQuery, HumanReadableName,
57+
},
58+
};
5259

5360
/// A trivial trait which describes any [`OffersMessageFlow`].
5461
///
@@ -392,6 +399,14 @@ where
392399
/// Contains functions shared between OffersMessageHandler and ChannelManager.
393400
commons: OMC,
394401

402+
#[cfg(feature = "_test_utils")]
403+
/// In testing, it is useful be able to forge a name -> offer mapping so that we can pay an
404+
/// offer generated in the test.
405+
///
406+
/// This allows for doing so, validating proofs as normal, but, if they pass, replacing the
407+
/// offer they resolve to to the given one.
408+
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
409+
395410
/// The Logger for use in the OffersMessageFlow and which may be used to log
396411
/// information during deserialization.
397412
pub logger: L,
@@ -408,7 +423,14 @@ where
408423
let mut secp_ctx = Secp256k1::new();
409424
secp_ctx.seeded_randomize(&entropy_source.get_secure_random_bytes());
410425

411-
Self { secp_ctx, commons, entropy_source, logger }
426+
Self {
427+
secp_ctx,
428+
commons,
429+
entropy_source,
430+
#[cfg(feature = "_test_utils")]
431+
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
432+
logger,
433+
}
412434
}
413435
}
414436

@@ -1148,3 +1170,73 @@ where
11481170
Ok(())
11491171
}
11501172
}
1173+
1174+
#[cfg(feature = "dnssec")]
1175+
impl<ES: Deref, OMC: Deref, L: Deref> DNSResolverMessageHandler for OffersMessageFlow<ES, OMC, L>
1176+
where
1177+
ES::Target: EntropySource,
1178+
OMC::Target: OffersMessageCommons,
1179+
L::Target: Logger,
1180+
{
1181+
fn handle_dnssec_query(
1182+
&self, _message: DNSSECQuery, _responder: Option<Responder>,
1183+
) -> Option<(DNSResolverMessage, ResponseInstruction)> {
1184+
None
1185+
}
1186+
1187+
fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) {
1188+
let offer_opt =
1189+
self.commons.get_hrn_resolver().handle_dnssec_proof_for_offer(message, context);
1190+
#[cfg_attr(not(feature = "_test_utils"), allow(unused_mut))]
1191+
if let Some((completed_requests, mut offer)) = offer_opt {
1192+
for (name, payment_id) in completed_requests {
1193+
#[cfg(feature = "_test_utils")]
1194+
if let Some(replacement_offer) = self
1195+
.testing_dnssec_proof_offer_resolution_override
1196+
.lock()
1197+
.unwrap()
1198+
.remove(&name)
1199+
{
1200+
// If we have multiple pending requests we may end up over-using the override
1201+
// offer, but tests can deal with that.
1202+
offer = replacement_offer;
1203+
}
1204+
if let Ok(amt_msats) = self.commons.amt_msats_for_payment_awaiting_offer(payment_id)
1205+
{
1206+
let offer_pay_res = self.commons.pay_for_offer_intern(
1207+
&offer,
1208+
None,
1209+
Some(amt_msats),
1210+
None,
1211+
payment_id,
1212+
Some(name),
1213+
|invoice_request, nonce| {
1214+
let retryable_invoice_request = RetryableInvoiceRequest {
1215+
invoice_request: invoice_request.clone(),
1216+
nonce,
1217+
};
1218+
self.commons
1219+
.received_offer(payment_id, Some(retryable_invoice_request))
1220+
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
1221+
},
1222+
);
1223+
if offer_pay_res.is_err() {
1224+
// The offer we tried to pay is the canonical current offer for the name we
1225+
// wanted to pay. If we can't pay it, there's no way to recover so fail the
1226+
// payment.
1227+
// Note that the PaymentFailureReason should be ignored for an
1228+
// AwaitingInvoice payment.
1229+
self.commons.abandon_payment_with_reason(
1230+
payment_id,
1231+
PaymentFailureReason::RouteNotFound,
1232+
);
1233+
}
1234+
}
1235+
}
1236+
}
1237+
}
1238+
1239+
fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> {
1240+
core::mem::take(&mut self.commons.get_pending_dns_onion_messages())
1241+
}
1242+
}

0 commit comments

Comments
 (0)