@@ -16,7 +16,7 @@ use nimiq_network_interface::{
1616use nimiq_network_libp2p:: {
1717 dht,
1818 discovery:: { self , peer_contacts:: PeerContact } ,
19- Config , Network ,
19+ Config , Network , NetworkError ,
2020} ;
2121use nimiq_serde:: { Deserialize , Serialize } ;
2222use nimiq_test_log:: test;
@@ -245,6 +245,17 @@ impl dht::Verifier for Verifier {
245245 }
246246}
247247
248+ struct RejectingVerifier ;
249+
250+ impl dht:: Verifier for RejectingVerifier {
251+ fn verify (
252+ & self ,
253+ _record : & libp2p:: kad:: Record ,
254+ ) -> Result < dht:: DhtRecord , dht:: DhtVerifierError > {
255+ Err ( dht:: DhtVerifierError :: InvalidSignature )
256+ }
257+ }
258+
248259async fn create_network_with_n_peers (
249260 n_peers : usize ,
250261) -> (
@@ -515,6 +526,58 @@ async fn dht_put_and_get() {
515526 assert_eq ! ( fetched_record, Some ( put_record) ) ;
516527}
517528
529+ #[ test( tokio:: test) ]
530+ #[ cfg( feature = "kad" ) ]
531+ async fn dht_get_with_verifier_failure_returns_error ( ) {
532+ let addr1 = multiaddr ! [ Memory ( rand:: random:: <u64 >( ) ) ] ;
533+ let addr2 = multiaddr ! [ Memory ( rand:: random:: <u64 >( ) ) ] ;
534+ let keys = Arc :: new ( RwLock :: new ( BTreeMap :: default ( ) ) ) ;
535+
536+ let net1 = Network :: new ( network_config ( addr1. clone ( ) ) , Verifier :: new ( & keys) ) . await ;
537+ net1. listen_on ( vec ! [ addr1. clone( ) ] ) . await ;
538+
539+ let net2 = Network :: new ( network_config ( addr2. clone ( ) ) , RejectingVerifier ) . await ;
540+ net2. listen_on ( vec ! [ addr2. clone( ) ] ) . await ;
541+
542+ let mut events1 = net1. subscribe_events ( ) ;
543+ let mut events2 = net2. subscribe_events ( ) ;
544+
545+ net2. dial_address ( addr1) . await . unwrap ( ) ;
546+
547+ let event1 = helper:: get_next_peer_event ( & mut events1) . await ;
548+ helper:: assert_peer_joined ( & event1, & net2. get_local_peer_id ( ) ) ;
549+
550+ let event2 = helper:: get_next_peer_event ( & mut events2) . await ;
551+ helper:: assert_peer_joined ( & event2, & net1. get_local_peer_id ( ) ) ;
552+
553+ sleep ( Duration :: from_secs ( 10 ) ) . await ;
554+
555+ let mut rng = test_rng ( false ) ;
556+ let keypair = KeyPair :: generate ( & mut rng) ;
557+ let key: Address = ( & keypair. public ) . into ( ) ;
558+
559+ let put_record = ValidatorRecord {
560+ peer_id : net1. get_local_peer_id ( ) ,
561+ validator_address : key. clone ( ) ,
562+ timestamp : 0x42u64 ,
563+ } ;
564+
565+ assert ! ( keys. write( ) . insert( key. clone( ) , keypair. public) . is_none( ) ) ;
566+ net1. dht_put ( & key, & put_record, & keypair) . await . unwrap ( ) ;
567+
568+ let result = timeout (
569+ Duration :: from_secs ( 2 ) ,
570+ net2. dht_get :: < _ , ValidatorRecord < PeerId > , KeyPair > ( & key) ,
571+ )
572+ . await ;
573+
574+ assert ! ( result. is_ok( ) , "dht_get future hung" ) ;
575+ assert ! ( matches!(
576+ result. unwrap( ) ,
577+ Err ( NetworkError :: DhtGetVerificationFailed )
578+ ) ) ;
579+ }
580+
518581#[ test( tokio:: test) ]
519582async fn ban_peer ( ) {
520583 let ( net1, net2) = create_connected_networks ( ) . await ;
0 commit comments