@@ -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:: {
@@ -39,6 +40,7 @@ use lightning::util::persist::{
3940} ;
4041use lightning:: util:: ser:: ReadableArgs ;
4142use lightning:: util:: sweep:: OutputSweeper ;
43+ use lightning_dns_resolver:: OMDomainResolver ;
4244use lightning_persister:: fs_store:: FilesystemStore ;
4345use vss_client:: headers:: VssHeaderProvider ;
4446
@@ -75,9 +77,9 @@ use crate::peer_store::PeerStore;
7577use crate :: runtime:: { Runtime , RuntimeSpawner } ;
7678use crate :: tx_broadcaster:: TransactionBroadcaster ;
7779use crate :: types:: {
78- AsyncPersister , ChainMonitor , ChannelManager , DynStore , DynStoreWrapper , GossipSync , Graph ,
79- KeysManager , MessageRouter , OnionMessenger , PaymentStore , PeerManager , PendingPaymentStore ,
80- Persister , SyncAndAsyncKVStore ,
80+ AsyncPersister , ChainMonitor , ChannelManager , DomainResolver , DynStore , DynStoreWrapper ,
81+ GossipSync , Graph , HRNResolver , KeysManager , MessageRouter , OnionMessenger , PaymentStore ,
82+ PeerManager , PendingPaymentStore , Persister , SyncAndAsyncKVStore ,
8183} ;
8284use crate :: wallet:: persist:: KVStoreWalletPersister ;
8385use crate :: wallet:: Wallet ;
@@ -189,6 +191,8 @@ pub enum BuildError {
189191 NetworkMismatch ,
190192 /// The role of the node in an asynchronous payments context is not compatible with the current configuration.
191193 AsyncPaymentsConfigMismatch ,
194+ /// An attempt to setup a DNS Resolver failed.
195+ DNSResolverSetupFailed ,
192196}
193197
194198impl fmt:: Display for BuildError {
@@ -221,12 +225,21 @@ impl fmt::Display for BuildError {
221225 "The async payments role is not compatible with the current configuration."
222226 )
223227 } ,
228+ Self :: DNSResolverSetupFailed => {
229+ write ! ( f, "An attempt to setup a DNS resolver has failed." )
230+ } ,
224231 }
225232 }
226233}
227234
228235impl std:: error:: Error for BuildError { }
229236
237+ enum Resolver {
238+ HRN ( Arc < HRNResolver > ) ,
239+ DNS ( Arc < DomainResolver > ) ,
240+ Ignore ( Arc < IgnoringMessageHandler > ) ,
241+ }
242+
230243/// A builder for an [`Node`] instance, allowing to set some configuration and module choices from
231244/// the getgo.
232245///
@@ -1517,7 +1530,34 @@ fn build_with_store_internal(
15171530 } ) ?;
15181531 }
15191532
1520- let hrn_resolver = Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone ( & network_graph) ) ) ;
1533+ let resolver = if let Some ( hrn_config) = & config. hrn_config {
1534+ if hrn_config. is_hrn_resolver {
1535+ let dns_addr = hrn_config. dns_server_address . as_str ( ) ;
1536+
1537+ Resolver :: DNS ( Arc :: new ( OMDomainResolver :: ignoring_incoming_proofs (
1538+ dns_addr. parse ( ) . map_err ( |_| BuildError :: DNSResolverSetupFailed ) ?,
1539+ ) ) )
1540+ } else {
1541+ Resolver :: HRN ( Arc :: new ( LDKOnionMessageDNSSECHrnResolver :: new ( Arc :: clone (
1542+ & network_graph,
1543+ ) ) ) )
1544+ }
1545+ } else {
1546+ // hrn_config is None, default to the IgnoringMessaageHandler.
1547+ Resolver :: Ignore ( Arc :: new ( IgnoringMessageHandler { } ) )
1548+ } ;
1549+
1550+ let om_resolver = match resolver {
1551+ Resolver :: DNS ( ref dns_resolver) => {
1552+ Arc :: clone ( dns_resolver) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1553+ } ,
1554+ Resolver :: HRN ( ref hrn_resolver) => {
1555+ Arc :: clone ( hrn_resolver) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1556+ } ,
1557+ Resolver :: Ignore ( ref ignoring_handler) => {
1558+ Arc :: clone ( ignoring_handler) as Arc < dyn DNSResolverMessageHandler + Send + Sync >
1559+ } ,
1560+ } ;
15211561
15221562 // Initialize the PeerManager
15231563 let onion_messenger: Arc < OnionMessenger > =
@@ -1530,7 +1570,7 @@ fn build_with_store_internal(
15301570 message_router,
15311571 Arc :: clone ( & channel_manager) ,
15321572 Arc :: clone ( & channel_manager) ,
1533- Arc :: clone ( & hrn_resolver ) ,
1573+ Arc :: clone ( & om_resolver ) ,
15341574 IgnoringMessageHandler { } ,
15351575 ) )
15361576 } else {
@@ -1542,7 +1582,7 @@ fn build_with_store_internal(
15421582 message_router,
15431583 Arc :: clone ( & channel_manager) ,
15441584 Arc :: clone ( & channel_manager) ,
1545- Arc :: clone ( & hrn_resolver ) ,
1585+ Arc :: clone ( & om_resolver ) ,
15461586 IgnoringMessageHandler { } ,
15471587 ) )
15481588 } ;
@@ -1675,11 +1715,19 @@ fn build_with_store_internal(
16751715 ) ) ;
16761716
16771717 let peer_manager_clone = Arc :: downgrade ( & peer_manager) ;
1678- hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1679- if let Some ( upgraded_pointer) = peer_manager_clone. upgrade ( ) {
1680- upgraded_pointer. process_events ( ) ;
1681- }
1682- } ) ) ;
1718+
1719+ let hrn_resolver = match resolver {
1720+ Resolver :: DNS ( _) => None ,
1721+ Resolver :: HRN ( ref hrn_resolver) => {
1722+ hrn_resolver. register_post_queue_action ( Box :: new ( move || {
1723+ if let Some ( upgraded_pointer) = peer_manager_clone. upgrade ( ) {
1724+ upgraded_pointer. process_events ( ) ;
1725+ }
1726+ } ) ) ;
1727+ Some ( hrn_resolver)
1728+ } ,
1729+ Resolver :: Ignore ( _) => None ,
1730+ } ;
16831731
16841732 liquidity_source. as_ref ( ) . map ( |l| l. set_peer_manager ( Arc :: downgrade ( & peer_manager) ) ) ;
16851733
@@ -1786,7 +1834,7 @@ fn build_with_store_internal(
17861834 node_metrics,
17871835 om_mailbox,
17881836 async_payments_role,
1789- hrn_resolver,
1837+ hrn_resolver : hrn_resolver . cloned ( ) ,
17901838 #[ cfg( cycle_tests) ]
17911839 _leak_checker,
17921840 } )
0 commit comments