@@ -59,6 +59,17 @@ struct MessengerNode {
59
59
> >
60
60
}
61
61
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
+
62
73
struct TestOffersMessageHandler { }
63
74
64
75
impl OffersMessageHandler for TestOffersMessageHandler {
@@ -162,22 +173,41 @@ impl CustomOnionMessageHandler for TestCustomMessageHandler {
162
173
}
163
174
164
175
fn create_nodes ( num_messengers : u8 ) -> Vec < MessengerNode > {
165
- let secrets = ( 1 ..=num_messengers)
176
+ let cfgs = ( 1 ..=num_messengers)
166
177
. into_iter ( )
167
- . map ( |i| SecretKey :: from_slice ( & [ i ; 32 ] ) . unwrap ( ) )
178
+ . map ( |_| MessengerCfg :: new ( ) )
168
179
. collect ( ) ;
169
- create_nodes_using_secrets ( secrets )
180
+ create_nodes_using_cfgs ( cfgs )
170
181
}
171
182
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 > {
173
202
let gossip_logger = Arc :: new ( test_utils:: TestLogger :: with_id ( "gossip" . to_string ( ) ) ) ;
174
203
let network_graph = Arc :: new ( NetworkGraph :: new ( Network :: Testnet , gossip_logger. clone ( ) ) ) ;
175
204
let gossip_sync = Arc :: new (
176
205
P2PGossipSync :: new ( network_graph. clone ( ) , None , gossip_logger)
177
206
) ;
178
207
179
208
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 ( ) ) ;
181
211
let logger = Arc :: new ( test_utils:: TestLogger :: with_id ( format ! ( "node {}" , i) ) ) ;
182
212
let seed = [ i as u8 ; 32 ] ;
183
213
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> {
189
219
) ;
190
220
let offers_message_handler = Arc :: new ( TestOffersMessageHandler { } ) ;
191
221
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
+ } ;
192
235
nodes. push ( MessengerNode {
193
236
privkey : secret_key,
194
237
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,
200
240
custom_message_handler,
201
241
gossip_sync : gossip_sync. clone ( ) ,
202
242
} ) ;
@@ -369,11 +409,10 @@ fn we_are_intro_node() {
369
409
370
410
#[ test]
371
411
fn 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.
373
413
let nodes = create_nodes ( 3 ) ;
374
414
let test_msg = TestCustomMessage :: Response ;
375
415
376
- // 0 hops
377
416
let secp_ctx = Secp256k1 :: new ( ) ;
378
417
let mut blinded_path = BlindedPath :: new_for_message ( & [ nodes[ 1 ] . node_id , nodes[ 2 ] . node_id ] , & * nodes[ 2 ] . entropy_source , & secp_ctx) . unwrap ( ) ;
379
418
blinded_path. blinded_hops . clear ( ) ;
@@ -549,18 +588,83 @@ fn drops_buffered_messages_waiting_for_peer_connection() {
549
588
assert ! ( nodes[ 0 ] . messenger. next_onion_message_for_peer( nodes[ 1 ] . node_id) . is_none( ) ) ;
550
589
}
551
590
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
+
552
655
#[ test]
553
656
fn spec_test_vector ( ) {
554
- let secret_keys = [
657
+ let node_cfgs = [
555
658
"4141414141414141414141414141414141414141414141414141414141414141" , // Alice
556
659
"4242424242424242424242424242424242424242424242424242424242424242" , // Bob
557
660
"4343434343434343434343434343434343434343434343434343434343434343" , // Carol
558
661
"4444444444444444444444444444444444444444444444444444444444444444" , // Dave
559
662
]
560
663
. 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) )
562
666
. collect ( ) ;
563
- let nodes = create_nodes_using_secrets ( secret_keys ) ;
667
+ let nodes = create_nodes_using_cfgs ( node_cfgs ) ;
564
668
565
669
// Hardcode the sender->Alice onion message, because it includes an unknown TLV of type 1, which
566
670
// LDK doesn't support constructing.
0 commit comments