Skip to content

Commit 546da37

Browse files
committed
Move DNSResolverMessageHandler impl to OffersMessageFlow
1 parent e3784c8 commit 546da37

File tree

4 files changed

+113
-86
lines changed

4 files changed

+113
-86
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: 13 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ use crate::offers::signer;
7676
use crate::offers::static_invoice::StaticInvoice;
7777
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
7878
use crate::onion_message::dns_resolution::HumanReadableName;
79-
use crate::onion_message::messenger::{Destination, MessageRouter, Responder, ResponseInstruction, MessageSendInstructions};
79+
use crate::onion_message::messenger::{DefaultMessageRouter, Destination, MessageRouter, MessageSendInstructions, Responder, ResponseInstruction};
8080
use crate::onion_message::offers::OffersMessage;
8181
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
8282
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -90,13 +90,10 @@ use crate::util::logger::{Level, Logger, WithContext};
9090
use crate::util::errors::APIError;
9191

9292
#[cfg(feature = "dnssec")]
93-
use crate::blinded_path::message::DNSResolverContext;
94-
#[cfg(feature = "dnssec")]
95-
use crate::onion_message::dns_resolution::{DNSResolverMessage, DNSResolverMessageHandler, DNSSECQuery, DNSSECProof, OMNameResolver};
93+
use crate::onion_message::dns_resolution::{DNSResolverMessage, OMNameResolver};
9694

9795
#[cfg(not(c_bindings))]
9896
use {
99-
crate::onion_message::messenger::DefaultMessageRouter,
10097
crate::routing::router::DefaultRouter,
10198
crate::routing::gossip::NetworkGraph,
10299
crate::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters},
@@ -2419,14 +2416,6 @@ where
24192416
#[cfg(feature = "dnssec")]
24202417
pending_dns_onion_messages: Mutex<Vec<(DNSResolverMessage, MessageSendInstructions)>>,
24212418

2422-
#[cfg(feature = "_test_utils")]
2423-
/// In testing, it is useful be able to forge a name -> offer mapping so that we can pay an
2424-
/// offer generated in the test.
2425-
///
2426-
/// This allows for doing so, validating proofs as normal, but, if they pass, replacing the
2427-
/// offer they resolve to to the given one.
2428-
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
2429-
24302419
#[cfg(test)]
24312420
pub(super) entropy_source: ES,
24322421
#[cfg(not(test))]
@@ -3357,9 +3346,6 @@ where
33573346
hrn_resolver: OMNameResolver::new(current_timestamp, params.best_block.height),
33583347
#[cfg(feature = "dnssec")]
33593348
pending_dns_onion_messages: Mutex::new(Vec::new()),
3360-
3361-
#[cfg(feature = "_test_utils")]
3362-
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
33633349
}
33643350
}
33653351

@@ -9716,6 +9702,17 @@ where
97169702
) -> Result<(), Bolt12SemanticError> {
97179703
self.pay_for_offer_intern(offer, quantity, amount_msats, payer_note, payment_id, human_readable_name, create_pending_payment)
97189704
}
9705+
9706+
#[cfg(feature = "dnssec")]
9707+
fn amt_msats_for_payment_awaiting_offer(&self, payment_id: PaymentId) -> Result<u64, ()> {
9708+
self.pending_outbound_payments.amt_msats_for_payment_awaiting_offer(payment_id)
9709+
}
9710+
#[cfg(feature = "dnssec")]
9711+
fn received_offer(
9712+
&self, payment_id: PaymentId, retryable_invoice_request: Option<RetryableInvoiceRequest>,
9713+
) -> Result<(), ()> {
9714+
self.pending_outbound_payments.received_offer(payment_id, retryable_invoice_request)
9715+
}
97199716
}
97209717

97219718
/// Defines the maximum number of [`OffersMessage`] including different reply paths to be sent
@@ -11464,69 +11461,6 @@ where
1146411461
}
1146511462
}
1146611463

11467-
#[cfg(feature = "dnssec")]
11468-
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref>
11469-
DNSResolverMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
11470-
where
11471-
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
11472-
T::Target: BroadcasterInterface,
11473-
ES::Target: EntropySource,
11474-
NS::Target: NodeSigner,
11475-
SP::Target: SignerProvider,
11476-
F::Target: FeeEstimator,
11477-
R::Target: Router,
11478-
MR::Target: MessageRouter,
11479-
L::Target: Logger,
11480-
{
11481-
fn handle_dnssec_query(
11482-
&self, _message: DNSSECQuery, _responder: Option<Responder>,
11483-
) -> Option<(DNSResolverMessage, ResponseInstruction)> {
11484-
None
11485-
}
11486-
11487-
fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) {
11488-
let offer_opt = self.hrn_resolver.handle_dnssec_proof_for_offer(message, context);
11489-
#[cfg_attr(not(feature = "_test_utils"), allow(unused_mut))]
11490-
if let Some((completed_requests, mut offer)) = offer_opt {
11491-
for (name, payment_id) in completed_requests {
11492-
#[cfg(feature = "_test_utils")]
11493-
if let Some(replacement_offer) = self.testing_dnssec_proof_offer_resolution_override.lock().unwrap().remove(&name) {
11494-
// If we have multiple pending requests we may end up over-using the override
11495-
// offer, but tests can deal with that.
11496-
offer = replacement_offer;
11497-
}
11498-
if let Ok(amt_msats) = self.pending_outbound_payments.amt_msats_for_payment_awaiting_offer(payment_id) {
11499-
let offer_pay_res =
11500-
self.pay_for_offer_intern(&offer, None, Some(amt_msats), None, payment_id, Some(name),
11501-
|invoice_request, nonce| {
11502-
let retryable_invoice_request = RetryableInvoiceRequest {
11503-
invoice_request: invoice_request.clone(),
11504-
nonce,
11505-
};
11506-
self.pending_outbound_payments
11507-
.received_offer(payment_id, Some(retryable_invoice_request))
11508-
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
11509-
});
11510-
if offer_pay_res.is_err() {
11511-
// The offer we tried to pay is the canonical current offer for the name we
11512-
// wanted to pay. If we can't pay it, there's no way to recover so fail the
11513-
// payment.
11514-
// Note that the PaymentFailureReason should be ignored for an
11515-
// AwaitingInvoice payment.
11516-
self.pending_outbound_payments.abandon_payment(
11517-
payment_id, PaymentFailureReason::RouteNotFound, &self.pending_events,
11518-
);
11519-
}
11520-
}
11521-
}
11522-
}
11523-
}
11524-
11525-
fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> {
11526-
core::mem::take(&mut self.pending_dns_onion_messages.lock().unwrap())
11527-
}
11528-
}
11529-
1153011464
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref>
1153111465
NodeIdLookUp for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
1153211466
where
@@ -13406,9 +13340,6 @@ where
1340613340
hrn_resolver: OMNameResolver::new(highest_seen_timestamp, best_block_height),
1340713341
#[cfg(feature = "dnssec")]
1340813342
pending_dns_onion_messages: Mutex::new(Vec::new()),
13409-
13410-
#[cfg(feature = "_test_utils")]
13411-
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
1341213343
};
1341313344

1341413345
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
@@ -440,7 +440,7 @@ type TestOnionMessenger<'chan_man, 'node_cfg, 'chan_mon_cfg> = OnionMessenger<
440440
&'node_cfg test_utils::TestMessageRouter<'chan_mon_cfg>,
441441
Arc<TestOffersMessageFlow<'chan_man, 'node_cfg, 'chan_mon_cfg>>,
442442
&'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
443-
&'chan_man TestChannelManager<'node_cfg, 'chan_mon_cfg>,
443+
Arc<TestOffersMessageFlow<'chan_man, 'node_cfg, 'chan_mon_cfg>>,
444444
IgnoringMessageHandler,
445445
>;
446446

@@ -3350,7 +3350,7 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
33503350
#[cfg(feature = "dnssec")]
33513351
let onion_messenger = OnionMessenger::new(
33523352
dedicated_entropy, cfgs[i].keys_manager, cfgs[i].logger, &chan_mgrs[i],
3353-
&cfgs[i].message_router, offers_handler.clone(), &chan_mgrs[i], &chan_mgrs[i],
3353+
&cfgs[i].message_router, offers_handler.clone(), &chan_mgrs[i], offers_handler.clone(),
33543354
IgnoringMessageHandler {},
33553355
);
33563356
#[cfg(not(feature = "dnssec"))]

lightning/src/offers/flow.rs

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ use crate::offers::offer::{Offer, OfferBuilder};
4848
use crate::offers::refund::{Refund, RefundBuilder};
4949

5050
use crate::sign::EntropySource;
51+
use crate::sync::Mutex;
5152
use crate::util::logger::{Logger, WithContext};
5253

5354
#[cfg(async_payments)]
@@ -63,7 +64,12 @@ use {
6364
};
6465

6566
#[cfg(feature = "dnssec")]
66-
use crate::onion_message::dns_resolution::{DNSResolverMessage, OMNameResolver};
67+
use {
68+
crate::blinded_path::message::DNSResolverContext,
69+
crate::onion_message::dns_resolution::{
70+
DNSResolverMessage, DNSResolverMessageHandler, DNSSECProof, DNSSECQuery, OMNameResolver,
71+
},
72+
};
6773

6874
/// Functions commonly shared in usage between [`ChannelManager`] & `OffersMessageFlow`
6975
///
@@ -216,6 +222,16 @@ pub trait OffersMessageCommons {
216222
payer_note: Option<String>, payment_id: PaymentId,
217223
human_readable_name: Option<HumanReadableName>, create_pending_payment: CPP,
218224
) -> Result<(), Bolt12SemanticError>;
225+
226+
#[cfg(feature = "dnssec")]
227+
/// Amount for payment awaiting offer
228+
fn amt_msats_for_payment_awaiting_offer(&self, payment_id: PaymentId) -> Result<u64, ()>;
229+
230+
#[cfg(feature = "dnssec")]
231+
/// Received Offer
232+
fn received_offer(
233+
&self, payment_id: PaymentId, retryable_invoice_request: Option<RetryableInvoiceRequest>,
234+
) -> Result<(), ()>;
219235
}
220236

221237
/// A trivial trait which describes any [`OffersMessageFlow`].
@@ -564,6 +580,14 @@ where
564580
/// Contains functions shared between OffersMessageHandler and ChannelManager.
565581
commons: OMC,
566582

583+
#[cfg(feature = "_test_utils")]
584+
/// In testing, it is useful be able to forge a name -> offer mapping so that we can pay an
585+
/// offer generated in the test.
586+
///
587+
/// This allows for doing so, validating proofs as normal, but, if they pass, replacing the
588+
/// offer they resolve to to the given one.
589+
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
590+
567591
/// The Logger for use in the OffersMessageFlow and which may be used to log
568592
/// information during deserialization.
569593
pub logger: L,
@@ -589,6 +613,8 @@ where
589613
secp_ctx,
590614
commons,
591615
entropy_source,
616+
#[cfg(feature = "_test_utils")]
617+
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
592618
logger,
593619
}
594620
}
@@ -1343,3 +1369,73 @@ where
13431369
Ok(())
13441370
}
13451371
}
1372+
1373+
#[cfg(feature = "dnssec")]
1374+
impl<ES: Deref, OMC: Deref, L: Deref> DNSResolverMessageHandler for OffersMessageFlow<ES, OMC, L>
1375+
where
1376+
ES::Target: EntropySource,
1377+
OMC::Target: OffersMessageCommons,
1378+
L::Target: Logger,
1379+
{
1380+
fn handle_dnssec_query(
1381+
&self, _message: DNSSECQuery, _responder: Option<Responder>,
1382+
) -> Option<(DNSResolverMessage, ResponseInstruction)> {
1383+
None
1384+
}
1385+
1386+
fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) {
1387+
let offer_opt =
1388+
self.commons.get_hrn_resolver().handle_dnssec_proof_for_offer(message, context);
1389+
#[cfg_attr(not(feature = "_test_utils"), allow(unused_mut))]
1390+
if let Some((completed_requests, mut offer)) = offer_opt {
1391+
for (name, payment_id) in completed_requests {
1392+
#[cfg(feature = "_test_utils")]
1393+
if let Some(replacement_offer) = self
1394+
.testing_dnssec_proof_offer_resolution_override
1395+
.lock()
1396+
.unwrap()
1397+
.remove(&name)
1398+
{
1399+
// If we have multiple pending requests we may end up over-using the override
1400+
// offer, but tests can deal with that.
1401+
offer = replacement_offer;
1402+
}
1403+
if let Ok(amt_msats) = self.commons.amt_msats_for_payment_awaiting_offer(payment_id)
1404+
{
1405+
let offer_pay_res = self.commons.pay_for_offer_intern(
1406+
&offer,
1407+
None,
1408+
Some(amt_msats),
1409+
None,
1410+
payment_id,
1411+
Some(name),
1412+
|invoice_request, nonce| {
1413+
let retryable_invoice_request = RetryableInvoiceRequest {
1414+
invoice_request: invoice_request.clone(),
1415+
nonce,
1416+
};
1417+
self.commons
1418+
.received_offer(payment_id, Some(retryable_invoice_request))
1419+
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
1420+
},
1421+
);
1422+
if offer_pay_res.is_err() {
1423+
// The offer we tried to pay is the canonical current offer for the name we
1424+
// wanted to pay. If we can't pay it, there's no way to recover so fail the
1425+
// payment.
1426+
// Note that the PaymentFailureReason should be ignored for an
1427+
// AwaitingInvoice payment.
1428+
self.commons.abandon_payment_with_reason(
1429+
payment_id,
1430+
PaymentFailureReason::RouteNotFound,
1431+
);
1432+
}
1433+
}
1434+
}
1435+
}
1436+
}
1437+
1438+
fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> {
1439+
core::mem::take(&mut self.commons.get_pending_dns_onion_messages())
1440+
}
1441+
}

0 commit comments

Comments
 (0)