@@ -25,6 +25,7 @@ use lightning::ln::channelmanager::{self, ChainParameters, ChannelManagerReadArg
2525use lightning:: ln:: msgs:: { RoutingMessageHandler , SocketAddress } ;
2626use lightning:: ln:: peer_handler:: { IgnoringMessageHandler , MessageHandler } ;
2727use lightning:: log_trace;
28+ use lightning:: onion_message:: dns_resolution:: DNSResolverMessageHandler ;
2829use lightning:: routing:: gossip:: NodeAlias ;
2930use lightning:: routing:: router:: DefaultRouter ;
3031use lightning:: routing:: scoring:: {
@@ -38,6 +39,7 @@ use lightning::util::persist::{
3839} ;
3940use lightning:: util:: ser:: ReadableArgs ;
4041use lightning:: util:: sweep:: OutputSweeper ;
42+ use lightning_dns_resolver:: OMDomainResolver ;
4143use lightning_persister:: fs_store:: FilesystemStore ;
4244use vss_client:: headers:: VssHeaderProvider ;
4345
@@ -74,8 +76,8 @@ use crate::peer_store::PeerStore;
7476use crate :: runtime:: { Runtime , RuntimeSpawner } ;
7577use crate :: tx_broadcaster:: TransactionBroadcaster ;
7678use crate :: types:: {
77- AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph ,
78- KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , PendingPaymentStore ,
79+ AsyncPersister , ChainMonitor , ChannelManager , DomainResolver , DynStore , DynStoreWrapper , GossipSync , Graph ,
80+ HRNResolver , KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , PendingPaymentStore ,
7981 Persister , SyncAndAsyncKVStore ,
8082} ;
8183use crate :: wallet:: persist:: KVStoreWalletPersister ;
@@ -188,6 +190,8 @@ pub enum BuildError {
188190 NetworkMismatch ,
189191 /// The role of the node in an asynchronous payments context is not compatible with the current configuration.
190192 AsyncPaymentsConfigMismatch ,
193+ /// An attempt to setup a DNS Resolver failed.
194+ DNSResolverSetupFailed ,
191195}
192196
193197impl fmt:: Display for BuildError {
@@ -220,12 +224,21 @@ impl fmt::Display for BuildError {
220224 "The async payments role is not compatible with the current configuration."
221225 )
222226 } ,
227+ Self :: DNSResolverSetupFailed => {
228+ write ! ( f, "An attempt to setup a DNS resolver has failed." )
229+ } ,
223230 }
224231 }
225232}
226233
227234impl std:: error:: Error for BuildError { }
228235
236+ enum Resolver {
237+ HRN ( Arc < HRNResolver > ) ,
238+ DNS ( Arc < DomainResolver > ) ,
239+ Ignore ( Arc < IgnoringMessageHandler > ) ,
240+ }
241+
229242/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
230243/// the getgo.
231244///
@@ -1516,7 +1529,34 @@ fn build_with_store_internal(
15161529 } ) ?;
15171530 }
15181531
1519- let hrn_resolver = Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone ( & network_graph) ) ) ;
1532+ let resolver = if let Some ( hrn_config) = & config. hrn_config {
1533+ if hrn_config. is_hrn_resolver {
1534+ let dns_addr = hrn_config. dns_server_address . as_str ( ) ;
1535+
1536+ Resolver :: DNS ( Arc :: new ( OMDomainResolver :: ignoring_incoming_proofs (
1537+ dns_addr. parse ( ) . map_err ( |_| BuildError :: DNSResolverSetupFailed ) ?,
1538+ ) ) )
1539+ } else {
1540+ Resolver :: HRN ( Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone (
1541+ & network_graph,
1542+ ) ) ) )
1543+ }
1544+ } else {
1545+ // hrn_config is None, default to the IgnoringMessaageHandler.
1546+ Resolver :: Ignore ( Arc :: new ( IgnoringMessageHandler { } ) )
1547+ } ;
1548+
1549+ let om_resolver = match resolver {
1550+ Resolver :: DNS ( ref dns_resolver) => {
1551+ Arc :: clone ( dns_resolver) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1552+ } ,
1553+ Resolver :: HRN ( ref hrn_resolver) => {
1554+ Arc :: clone ( hrn_resolver) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1555+ } ,
1556+ Resolver :: Ignore ( ref ignoring_handler) => {
1557+ Arc :: clone ( ignoring_handler) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1558+ } ,
1559+ } ;
15201560
15211561 // Initialize the PeerManager
15221562 let onion_messenger: Arc < OnionMessenger > =
@@ -1529,7 +1569,7 @@ fn build_with_store_internal(
15291569 message_router,
15301570 Arc :: clone ( & channel_manager) ,
15311571 Arc :: clone ( & channel_manager) ,
1532- Arc :: clone ( & hrn_resolver ) ,
1572+ Arc :: clone ( & om_resolver ) ,
15331573 IgnoringMessageHandler { } ,
15341574 ) )
15351575 } else {
@@ -1541,7 +1581,7 @@ fn build_with_store_internal(
15411581 message_router,
15421582 Arc :: clone ( & channel_manager) ,
15431583 Arc :: clone ( & channel_manager) ,
1544- Arc :: clone ( & hrn_resolver ) ,
1584+ Arc :: clone ( & om_resolver ) ,
15451585 IgnoringMessageHandler { } ,
15461586 ) )
15471587 } ;
@@ -1674,11 +1714,19 @@ fn build_with_store_internal(
16741714 ) ) ;
16751715
16761716 let peer_manager_clone = Arc :: downgrade ( & peer_manager) ;
1677- hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1678- if let Some ( upgraded_pointer) = peer_manager_clone. upgrade ( ) {
1679- upgraded_pointer. process_events ( ) ;
1680- }
1681- } ) ) ;
1717+
1718+ let hrn_resolver = match resolver {
1719+ Resolver :: DNS ( _) => None ,
1720+ Resolver :: HRN ( ref hrn_resolver) => {
1721+ hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1722+ if let Some ( upgraded_pointer) = peer_manager_clone. upgrade ( ) {
1723+ upgraded_pointer. process_events ( ) ;
1724+ }
1725+ } ) ) ;
1726+ Some ( hrn_resolver)
1727+ } ,
1728+ Resolver :: Ignore ( _) => None ,
1729+ } ;
16821730
16831731 liquidity_source. as_ref ( ) . map ( |l| l. set_peer_manager ( Arc :: downgrade ( & peer_manager) ) ) ;
16841732
@@ -1785,7 +1833,7 @@ fn build_with_store_internal(
17851833 node_metrics,
17861834 om_mailbox,
17871835 async_payments_role,
1788- hrn_resolver,
1836+ hrn_resolver : hrn_resolver . cloned ( ) ,
17891837 #[ cfg( cycle_tests) ]
17901838 _leak_checker,
17911839 } )
0 commit comments