Skip to content

Commit 4a9a941

Browse files
committed
Move DNSResolverMessageHandler impl to OffersMessageFlow
1 parent 78cc64f commit 4a9a941

File tree

5 files changed

+115
-88
lines changed

5 files changed

+115
-88
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 & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ use crate::offers::parse::Bolt12SemanticError;
7474
use crate::offers::signer;
7575
use crate::onion_message::async_payments::{AsyncPaymentsMessage, HeldHtlcAvailable, ReleaseHeldHtlc, AsyncPaymentsMessageHandler};
7676
use crate::onion_message::dns_resolution::HumanReadableName;
77-
use crate::onion_message::messenger::{Destination, MessageRouter, Responder, ResponseInstruction, MessageSendInstructions};
77+
use crate::onion_message::messenger::{DefaultMessageRouter, Destination, MessageRouter, MessageSendInstructions, Responder, ResponseInstruction};
7878
use crate::onion_message::offers::OffersMessage;
7979
use crate::sign::{EntropySource, NodeSigner, Recipient, SignerProvider};
8080
use crate::sign::ecdsa::EcdsaChannelSigner;
@@ -90,13 +90,10 @@ use crate::util::errors::APIError;
9090
use crate::offers::static_invoice::StaticInvoice;
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},
@@ -2440,14 +2437,6 @@ where
24402437
#[cfg(feature = "dnssec")]
24412438
pending_dns_onion_messages: Mutex<Vec<(DNSResolverMessage, MessageSendInstructions)>>,
24422439

2443-
#[cfg(feature = "_test_utils")]
2444-
/// In testing, it is useful be able to forge a name -> offer mapping so that we can pay an
2445-
/// offer generated in the test.
2446-
///
2447-
/// This allows for doing so, validating proofs as normal, but, if they pass, replacing the
2448-
/// offer they resolve to to the given one.
2449-
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
2450-
24512440
#[cfg(test)]
24522441
pub(super) entropy_source: ES,
24532442
#[cfg(not(test))]
@@ -3382,9 +3371,6 @@ where
33823371
hrn_resolver: OMNameResolver::new(current_timestamp, params.best_block.height),
33833372
#[cfg(feature = "dnssec")]
33843373
pending_dns_onion_messages: Mutex::new(Vec::new()),
3385-
3386-
#[cfg(feature = "_test_utils")]
3387-
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
33883374
}
33893375
}
33903376

@@ -9596,6 +9582,17 @@ where
95969582
) -> Result<(), Bolt12SemanticError> {
95979583
self.pay_for_offer_intern(offer, quantity, amount_msats, payer_note, payment_id, human_readable_name, create_pending_payment)
95989584
}
9585+
9586+
#[cfg(feature = "dnssec")]
9587+
fn amt_msats_for_payment_awaiting_offer(&self, payment_id: PaymentId) -> Result<u64, ()> {
9588+
self.pending_outbound_payments.amt_msats_for_payment_awaiting_offer(payment_id)
9589+
}
9590+
#[cfg(feature = "dnssec")]
9591+
fn received_offer(
9592+
&self, payment_id: PaymentId, retryable_invoice_request: Option<RetryableInvoiceRequest>,
9593+
) -> Result<(), ()> {
9594+
self.pending_outbound_payments.received_offer(payment_id, retryable_invoice_request)
9595+
}
95999596
}
96009597

96019598
/// Defines the maximum number of [`OffersMessage`] including different reply paths to be sent
@@ -11350,70 +11347,6 @@ where
1135011347
}
1135111348
}
1135211349

11353-
#[cfg(feature = "dnssec")]
11354-
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref>
11355-
DNSResolverMessageHandler for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
11356-
where
11357-
M::Target: chain::Watch<<SP::Target as SignerProvider>::EcdsaSigner>,
11358-
T::Target: BroadcasterInterface,
11359-
ES::Target: EntropySource,
11360-
NS::Target: NodeSigner,
11361-
SP::Target: SignerProvider,
11362-
F::Target: FeeEstimator,
11363-
R::Target: Router,
11364-
MR::Target: MessageRouter,
11365-
L::Target: Logger,
11366-
{
11367-
fn handle_dnssec_query(
11368-
&self, _message: DNSSECQuery, _responder: Option<Responder>,
11369-
) -> Option<(DNSResolverMessage, ResponseInstruction)> {
11370-
None
11371-
}
11372-
11373-
fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) {
11374-
let offer_opt = self.hrn_resolver.handle_dnssec_proof_for_offer(message, context);
11375-
#[cfg_attr(not(feature = "_test_utils"), allow(unused_mut))]
11376-
if let Some((completed_requests, mut offer)) = offer_opt {
11377-
for (name, payment_id) in completed_requests {
11378-
#[cfg(feature = "_test_utils")]
11379-
if let Some(replacement_offer) = self.testing_dnssec_proof_offer_resolution_override.lock().unwrap().remove(&name) {
11380-
// If we have multiple pending requests we may end up over-using the override
11381-
// offer, but tests can deal with that.
11382-
offer = replacement_offer;
11383-
}
11384-
if let Ok(amt_msats) = self.pending_outbound_payments.amt_msats_for_payment_awaiting_offer(payment_id) {
11385-
let offer_pay_res =
11386-
self.pay_for_offer_intern(&offer, None, Some(amt_msats), None, payment_id, Some(name),
11387-
|invoice_request, nonce| {
11388-
let retryable_invoice_request = RetryableInvoiceRequest {
11389-
invoice_request: invoice_request.clone(),
11390-
nonce,
11391-
needs_retry: true,
11392-
};
11393-
self.pending_outbound_payments
11394-
.received_offer(payment_id, Some(retryable_invoice_request))
11395-
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
11396-
});
11397-
if offer_pay_res.is_err() {
11398-
// The offer we tried to pay is the canonical current offer for the name we
11399-
// wanted to pay. If we can't pay it, there's no way to recover so fail the
11400-
// payment.
11401-
// Note that the PaymentFailureReason should be ignored for an
11402-
// AwaitingInvoice payment.
11403-
self.pending_outbound_payments.abandon_payment(
11404-
payment_id, PaymentFailureReason::RouteNotFound, &self.pending_events,
11405-
);
11406-
}
11407-
}
11408-
}
11409-
}
11410-
}
11411-
11412-
fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> {
11413-
core::mem::take(&mut self.pending_dns_onion_messages.lock().unwrap())
11414-
}
11415-
}
11416-
1141711350
impl<M: Deref, T: Deref, ES: Deref, NS: Deref, SP: Deref, F: Deref, R: Deref, MR: Deref, L: Deref>
1141811351
NodeIdLookUp for ChannelManager<M, T, ES, NS, SP, F, R, MR, L>
1141911352
where
@@ -13350,9 +13283,6 @@ where
1335013283
hrn_resolver: OMNameResolver::new(highest_seen_timestamp, best_block_height),
1335113284
#[cfg(feature = "dnssec")]
1335213285
pending_dns_onion_messages: Mutex::new(Vec::new()),
13353-
13354-
#[cfg(feature = "_test_utils")]
13355-
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
1335613286
};
1335713287

1335813288
let mut processed_claims: HashSet<Vec<MPPClaimHTLCSource>> = new_hash_set();

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

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

lightning/src/offers/flow.rs

Lines changed: 98 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)]
@@ -72,7 +73,12 @@ use {
7273
};
7374

7475
#[cfg(feature = "dnssec")]
75-
use crate::onion_message::dns_resolution::{DNSResolverMessage, OMNameResolver};
76+
use {
77+
crate::blinded_path::message::DNSResolverContext,
78+
crate::onion_message::dns_resolution::{
79+
DNSResolverMessage, DNSResolverMessageHandler, DNSSECProof, DNSSECQuery, OMNameResolver,
80+
},
81+
};
7682

7783
/// Functions commonly shared in usage between [`ChannelManager`] & `OffersMessageFlow`
7884
///
@@ -230,6 +236,16 @@ pub trait OffersMessageCommons {
230236
payer_note: Option<String>, payment_id: PaymentId,
231237
human_readable_name: Option<HumanReadableName>, create_pending_payment: CPP,
232238
) -> Result<(), Bolt12SemanticError>;
239+
240+
#[cfg(feature = "dnssec")]
241+
/// Amount for payment awaiting offer
242+
fn amt_msats_for_payment_awaiting_offer(&self, payment_id: PaymentId) -> Result<u64, ()>;
243+
244+
#[cfg(feature = "dnssec")]
245+
/// Received Offer
246+
fn received_offer(
247+
&self, payment_id: PaymentId, retryable_invoice_request: Option<RetryableInvoiceRequest>,
248+
) -> Result<(), ()>;
233249
}
234250

235251
/// A trivial trait which describes any [`OffersMessageFlow`].
@@ -578,6 +594,14 @@ where
578594
/// Contains functions shared between OffersMessageHandler and ChannelManager.
579595
commons: OMC,
580596

597+
#[cfg(feature = "_test_utils")]
598+
/// In testing, it is useful be able to forge a name -> offer mapping so that we can pay an
599+
/// offer generated in the test.
600+
///
601+
/// This allows for doing so, validating proofs as normal, but, if they pass, replacing the
602+
/// offer they resolve to to the given one.
603+
pub testing_dnssec_proof_offer_resolution_override: Mutex<HashMap<HumanReadableName, Offer>>,
604+
581605
/// The Logger for use in the OffersMessageFlow and which may be used to log
582606
/// information during deserialization.
583607
pub logger: L,
@@ -603,6 +627,8 @@ where
603627
secp_ctx,
604628
commons,
605629
entropy_source,
630+
#[cfg(feature = "_test_utils")]
631+
testing_dnssec_proof_offer_resolution_override: Mutex::new(new_hash_map()),
606632
logger,
607633
}
608634
}
@@ -1481,3 +1507,74 @@ where
14811507
Ok(())
14821508
}
14831509
}
1510+
1511+
#[cfg(feature = "dnssec")]
1512+
impl<ES: Deref, OMC: Deref, L: Deref> DNSResolverMessageHandler for OffersMessageFlow<ES, OMC, L>
1513+
where
1514+
ES::Target: EntropySource,
1515+
OMC::Target: OffersMessageCommons,
1516+
L::Target: Logger,
1517+
{
1518+
fn handle_dnssec_query(
1519+
&self, _message: DNSSECQuery, _responder: Option<Responder>,
1520+
) -> Option<(DNSResolverMessage, ResponseInstruction)> {
1521+
None
1522+
}
1523+
1524+
fn handle_dnssec_proof(&self, message: DNSSECProof, context: DNSResolverContext) {
1525+
let offer_opt =
1526+
self.commons.get_hrn_resolver().handle_dnssec_proof_for_offer(message, context);
1527+
#[cfg_attr(not(feature = "_test_utils"), allow(unused_mut))]
1528+
if let Some((completed_requests, mut offer)) = offer_opt {
1529+
for (name, payment_id) in completed_requests {
1530+
#[cfg(feature = "_test_utils")]
1531+
if let Some(replacement_offer) = self
1532+
.testing_dnssec_proof_offer_resolution_override
1533+
.lock()
1534+
.unwrap()
1535+
.remove(&name)
1536+
{
1537+
// If we have multiple pending requests we may end up over-using the override
1538+
// offer, but tests can deal with that.
1539+
offer = replacement_offer;
1540+
}
1541+
if let Ok(amt_msats) = self.commons.amt_msats_for_payment_awaiting_offer(payment_id)
1542+
{
1543+
let offer_pay_res = self.commons.pay_for_offer_intern(
1544+
&offer,
1545+
None,
1546+
Some(amt_msats),
1547+
None,
1548+
payment_id,
1549+
Some(name),
1550+
|invoice_request, nonce| {
1551+
let retryable_invoice_request = RetryableInvoiceRequest {
1552+
invoice_request: invoice_request.clone(),
1553+
nonce,
1554+
needs_retry: true,
1555+
};
1556+
self.commons
1557+
.received_offer(payment_id, Some(retryable_invoice_request))
1558+
.map_err(|_| Bolt12SemanticError::DuplicatePaymentId)
1559+
},
1560+
);
1561+
if offer_pay_res.is_err() {
1562+
// The offer we tried to pay is the canonical current offer for the name we
1563+
// wanted to pay. If we can't pay it, there's no way to recover so fail the
1564+
// payment.
1565+
// Note that the PaymentFailureReason should be ignored for an
1566+
// AwaitingInvoice payment.
1567+
self.commons.abandon_payment_with_reason(
1568+
payment_id,
1569+
PaymentFailureReason::RouteNotFound,
1570+
);
1571+
}
1572+
}
1573+
}
1574+
}
1575+
}
1576+
1577+
fn release_pending_messages(&self) -> Vec<(DNSResolverMessage, MessageSendInstructions)> {
1578+
core::mem::take(&mut self.commons.get_pending_dns_onion_messages())
1579+
}
1580+
}

lightning/src/onion_message/messenger.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2108,7 +2108,7 @@ pub type SimpleArcOnionMessenger<M, T, F, L> = OnionMessenger<
21082108
Arc<DefaultMessageRouter<Arc<NetworkGraph<Arc<L>>>, Arc<L>, Arc<KeysManager>>>,
21092109
Arc<OffersMessageFlow<Arc<KeysManager>, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<L>>>,
21102110
Arc<SimpleArcChannelManager<M, T, F, L>>,
2111-
Arc<SimpleArcChannelManager<M, T, F, L>>,
2111+
Arc<OffersMessageFlow<Arc<KeysManager>, Arc<SimpleArcChannelManager<M, T, F, L>>, Arc<L>>>,
21122112
IgnoringMessageHandler,
21132113
>;
21142114

0 commit comments

Comments
 (0)