@@ -59,6 +59,17 @@ struct MessengerNode {
5959 > >
6060}
6161
62+ impl Drop for MessengerNode {
63+ fn drop ( & mut self ) {
64+ #[ cfg( feature = "std" ) ] {
65+ if std:: thread:: panicking ( ) {
66+ return ;
67+ }
68+ }
69+ assert ! ( release_events( self ) . is_empty( ) ) ;
70+ }
71+ }
72+
6273struct TestOffersMessageHandler { }
6374
6475impl OffersMessageHandler for TestOffersMessageHandler {
@@ -162,22 +173,41 @@ impl CustomOnionMessageHandler for TestCustomMessageHandler {
162173}
163174
164175fn create_nodes ( num_messengers : u8 ) -> Vec < MessengerNode > {
165- let secrets = ( 1 ..=num_messengers)
176+ let cfgs = ( 1 ..=num_messengers)
166177 . into_iter ( )
167- . map ( |i| SecretKey :: from_slice ( & [ i ; 32 ] ) . unwrap ( ) )
178+ . map ( |_| MessengerCfg :: new ( ) )
168179 . collect ( ) ;
169- create_nodes_using_secrets ( secrets )
180+ create_nodes_using_cfgs ( cfgs )
170181}
171182
172- fn create_nodes_using_secrets ( secrets : Vec < SecretKey > ) -> Vec < MessengerNode > {
183+ struct MessengerCfg {
184+ secret_override : Option < SecretKey > ,
185+ intercept_offline_peer_oms : bool ,
186+ }
187+ impl MessengerCfg {
188+ fn new ( ) -> Self {
189+ Self { secret_override : None , intercept_offline_peer_oms : false }
190+ }
191+ fn with_node_secret ( mut self , secret : SecretKey ) -> Self {
192+ self . secret_override = Some ( secret) ;
193+ self
194+ }
195+ fn with_offline_peer_interception ( mut self ) -> Self {
196+ self . intercept_offline_peer_oms = true ;
197+ self
198+ }
199+ }
200+
201+ fn create_nodes_using_cfgs ( cfgs : Vec < MessengerCfg > ) -> Vec < MessengerNode > {
173202 let gossip_logger = Arc :: new ( test_utils:: TestLogger :: with_id ( "gossip" . to_string ( ) ) ) ;
174203 let network_graph = Arc :: new ( NetworkGraph :: new ( Network :: Testnet , gossip_logger. clone ( ) ) ) ;
175204 let gossip_sync = Arc :: new (
176205 P2PGossipSync :: new ( network_graph. clone ( ) , None , gossip_logger)
177206 ) ;
178207
179208 let mut nodes = Vec :: new ( ) ;
180- for ( i, secret_key) in secrets. into_iter ( ) . enumerate ( ) {
209+ for ( i, cfg) in cfgs. into_iter ( ) . enumerate ( ) {
210+ let secret_key = cfg. secret_override . unwrap_or ( SecretKey :: from_slice ( & [ ( i + 1 ) as u8 ; 32 ] ) . unwrap ( ) ) ;
181211 let logger = Arc :: new ( test_utils:: TestLogger :: with_id ( format ! ( "node {}" , i) ) ) ;
182212 let seed = [ i as u8 ; 32 ] ;
183213 let entropy_source = Arc :: new ( test_utils:: TestKeysInterface :: new ( & seed, Network :: Testnet ) ) ;
@@ -189,14 +219,24 @@ fn create_nodes_using_secrets(secrets: Vec<SecretKey>) -> Vec<MessengerNode> {
189219 ) ;
190220 let offers_message_handler = Arc :: new ( TestOffersMessageHandler { } ) ;
191221 let custom_message_handler = Arc :: new ( TestCustomMessageHandler :: new ( ) ) ;
222+ let messenger = if cfg. intercept_offline_peer_oms {
223+ OnionMessenger :: new_with_offline_peer_interception (
224+ entropy_source. clone ( ) , node_signer. clone ( ) , logger. clone ( ) ,
225+ node_id_lookup, message_router, offers_message_handler,
226+ custom_message_handler. clone ( )
227+ )
228+ } else {
229+ OnionMessenger :: new (
230+ entropy_source. clone ( ) , node_signer. clone ( ) , logger. clone ( ) ,
231+ node_id_lookup, message_router, offers_message_handler,
232+ custom_message_handler. clone ( )
233+ )
234+ } ;
192235 nodes. push ( MessengerNode {
193236 privkey : secret_key,
194237 node_id : node_signer. get_node_id ( Recipient :: Node ) . unwrap ( ) ,
195- entropy_source : entropy_source. clone ( ) ,
196- messenger : OnionMessenger :: new (
197- entropy_source, node_signer, logger. clone ( ) , node_id_lookup, message_router,
198- offers_message_handler, custom_message_handler. clone ( )
199- ) ,
238+ entropy_source,
239+ messenger,
200240 custom_message_handler,
201241 gossip_sync : gossip_sync. clone ( ) ,
202242 } ) ;
@@ -369,11 +409,10 @@ fn we_are_intro_node() {
369409
370410#[ test]
371411fn invalid_blinded_path_error ( ) {
372- // Make sure we error as expected if a provided blinded path has 0 or 1 hops.
412+ // Make sure we error as expected if a provided blinded path has 0 hops.
373413 let nodes = create_nodes ( 3 ) ;
374414 let test_msg = TestCustomMessage :: Response ;
375415
376- // 0 hops
377416 let secp_ctx = Secp256k1 :: new ( ) ;
378417 let mut blinded_path = BlindedPath :: new_for_message ( & [ nodes[ 1 ] . node_id , nodes[ 2 ] . node_id ] , & * nodes[ 2 ] . entropy_source , & secp_ctx) . unwrap ( ) ;
379418 blinded_path. blinded_hops . clear ( ) ;
@@ -549,18 +588,83 @@ fn drops_buffered_messages_waiting_for_peer_connection() {
549588 assert ! ( nodes[ 0 ] . messenger. next_onion_message_for_peer( nodes[ 1 ] . node_id) . is_none( ) ) ;
550589}
551590
591+ #[ test]
592+ fn intercept_offline_peer_oms ( ) {
593+ // Ensure that if OnionMessenger is initialized with
594+ // new_with_offline_peer_interception, we will intercept OMs for offline
595+ // peers, generate the right events, and forward OMs when they are re-injected
596+ // by the user.
597+ let node_cfgs = vec ! [ MessengerCfg :: new( ) , MessengerCfg :: new( ) . with_offline_peer_interception( ) , MessengerCfg :: new( ) ] ;
598+ let mut nodes = create_nodes_using_cfgs ( node_cfgs) ;
599+
600+ let peer_conn_evs = release_events ( & nodes[ 1 ] ) ;
601+ assert_eq ! ( peer_conn_evs. len( ) , 2 ) ;
602+ for ( i, ev) in peer_conn_evs. iter ( ) . enumerate ( ) {
603+ match ev {
604+ Event :: OnionMessagePeerConnected { peer_node_id } => {
605+ let node_idx = if i == 0 { 0 } else { 2 } ;
606+ assert_eq ! ( peer_node_id, & nodes[ node_idx] . node_id) ;
607+ } ,
608+ _ => panic ! ( )
609+ }
610+ }
611+
612+ let message = TestCustomMessage :: Response ;
613+ let secp_ctx = Secp256k1 :: new ( ) ;
614+ let blinded_path = BlindedPath :: new_for_message (
615+ & [ nodes[ 1 ] . node_id , nodes[ 2 ] . node_id ] , & * nodes[ 2 ] . entropy_source , & secp_ctx
616+ ) . unwrap ( ) ;
617+ let destination = Destination :: BlindedPath ( blinded_path) ;
618+
619+ // Disconnect the peers to ensure we intercept the OM.
620+ disconnect_peers ( & nodes[ 1 ] , & nodes[ 2 ] ) ;
621+ nodes[ 0 ] . messenger . send_onion_message ( message, destination, None ) . unwrap ( ) ;
622+ let mut final_node_vec = nodes. split_off ( 2 ) ;
623+ pass_along_path ( & nodes) ;
624+
625+ let mut events = release_events ( & nodes[ 1 ] ) ;
626+ assert_eq ! ( events. len( ) , 1 ) ;
627+ let onion_message = match events. remove ( 0 ) {
628+ Event :: OnionMessageIntercepted { peer_node_id, message } => {
629+ assert_eq ! ( peer_node_id, final_node_vec[ 0 ] . node_id) ;
630+ message
631+ } ,
632+ _ => panic ! ( )
633+ } ;
634+
635+ // Ensure that we'll refuse to forward the re-injected OM until after the
636+ // outbound peer comes back online.
637+ let err = nodes[ 1 ] . messenger . forward_onion_message ( onion_message. clone ( ) , & final_node_vec[ 0 ] . node_id ) . unwrap_err ( ) ;
638+ assert_eq ! ( err, SendError :: InvalidFirstHop ( final_node_vec[ 0 ] . node_id) ) ;
639+
640+ connect_peers ( & nodes[ 1 ] , & final_node_vec[ 0 ] ) ;
641+ let peer_conn_ev = release_events ( & nodes[ 1 ] ) ;
642+ assert_eq ! ( peer_conn_ev. len( ) , 1 ) ;
643+ match peer_conn_ev[ 0 ] {
644+ Event :: OnionMessagePeerConnected { peer_node_id } => {
645+ assert_eq ! ( peer_node_id, final_node_vec[ 0 ] . node_id) ;
646+ } ,
647+ _ => panic ! ( )
648+ }
649+
650+ nodes[ 1 ] . messenger . forward_onion_message ( onion_message, & final_node_vec[ 0 ] . node_id ) . unwrap ( ) ;
651+ final_node_vec[ 0 ] . custom_message_handler . expect_message ( TestCustomMessage :: Response ) ;
652+ pass_along_path ( & vec ! [ nodes. remove( 1 ) , final_node_vec. remove( 0 ) ] ) ;
653+ }
654+
552655#[ test]
553656fn spec_test_vector ( ) {
554- let secret_keys = [
657+ let node_cfgs = [
555658 "4141414141414141414141414141414141414141414141414141414141414141" , // Alice
556659 "4242424242424242424242424242424242424242424242424242424242424242" , // Bob
557660 "4343434343434343434343434343434343434343434343434343434343434343" , // Carol
558661 "4444444444444444444444444444444444444444444444444444444444444444" , // Dave
559662 ]
560663 . iter ( )
561- . map ( |secret| SecretKey :: from_slice ( & <Vec < u8 > >:: from_hex ( secret) . unwrap ( ) ) . unwrap ( ) )
664+ . map ( |secret_hex| SecretKey :: from_slice ( & <Vec < u8 > >:: from_hex ( secret_hex) . unwrap ( ) ) . unwrap ( ) )
665+ . map ( |secret| MessengerCfg :: new ( ) . with_node_secret ( secret) )
562666 . collect ( ) ;
563- let nodes = create_nodes_using_secrets ( secret_keys ) ;
667+ let nodes = create_nodes_using_cfgs ( node_cfgs ) ;
564668
565669 // Hardcode the sender->Alice onion message, because it includes an unknown TLV of type 1, which
566670 // LDK doesn't support constructing.
0 commit comments