@@ -85,6 +85,9 @@ pub struct DiscoveryBehaviour<TSubstream> {
8585 local_peer_id : PeerId ,
8686 /// Number of nodes we're currently connected to.
8787 num_connections : u64 ,
88+ /// If false, `addresses_of_peer` won't return any private IPv4 address, except for the ones
89+ /// stored in `user_defined`.
90+ allow_private_ipv4 : bool ,
8891}
8992
9093impl < TSubstream > DiscoveryBehaviour < TSubstream > {
@@ -94,7 +97,8 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> {
9497 pub fn new (
9598 local_public_key : PublicKey ,
9699 user_defined : Vec < ( PeerId , Multiaddr ) > ,
97- enable_mdns : bool
100+ enable_mdns : bool ,
101+ allow_private_ipv4 : bool ,
98102 ) -> Self {
99103 if enable_mdns {
100104 #[ cfg( target_os = "unknown" ) ]
@@ -116,6 +120,7 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> {
116120 discoveries : VecDeque :: new ( ) ,
117121 local_peer_id : local_public_key. into_peer_id ( ) ,
118122 num_connections : 0 ,
123+ allow_private_ipv4,
119124 #[ cfg( not( target_os = "unknown" ) ) ]
120125 mdns : if enable_mdns {
121126 match Mdns :: new ( ) {
@@ -214,9 +219,27 @@ where
214219 let mut list = self . user_defined . iter ( )
215220 . filter_map ( |( p, a) | if p == peer_id { Some ( a. clone ( ) ) } else { None } )
216221 . collect :: < Vec < _ > > ( ) ;
217- list. extend ( self . kademlia . addresses_of_peer ( peer_id) ) ;
218- #[ cfg( not( target_os = "unknown" ) ) ]
219- list. extend ( self . mdns . addresses_of_peer ( peer_id) ) ;
222+
223+ {
224+ let mut list_to_filter = self . kademlia . addresses_of_peer ( peer_id) ;
225+ #[ cfg( not( target_os = "unknown" ) ) ]
226+ list_to_filter. extend ( self . mdns . addresses_of_peer ( peer_id) ) ;
227+
228+ if !self . allow_private_ipv4 {
229+ list_to_filter. retain ( |addr| {
230+ if let Some ( Protocol :: Ip4 ( addr) ) = addr. iter ( ) . next ( ) {
231+ if addr. is_private ( ) {
232+ return false ;
233+ }
234+ }
235+
236+ true
237+ } ) ;
238+ }
239+
240+ list. extend ( list_to_filter) ;
241+ }
242+
220243 trace ! ( target: "sub-libp2p" , "Addresses of {:?} are {:?}" , peer_id, list) ;
221244 if list. is_empty ( ) {
222245 if self . kademlia . kbuckets_entries ( ) . any ( |p| p == peer_id) {
@@ -457,7 +480,7 @@ mod tests {
457480 upgrade:: apply ( stream, upgrade, endpoint, libp2p:: core:: upgrade:: Version :: V1 )
458481 } ) ;
459482
460- let behaviour = DiscoveryBehaviour :: new ( keypair. public ( ) , user_defined. clone ( ) , false ) ;
483+ let behaviour = DiscoveryBehaviour :: new ( keypair. public ( ) , user_defined. clone ( ) , false , true ) ;
461484 let mut swarm = Swarm :: new ( transport, behaviour, keypair. public ( ) . into_peer_id ( ) ) ;
462485 let listen_addr: Multiaddr = format ! ( "/memory/{}" , rand:: random:: <u64 >( ) ) . parse ( ) . unwrap ( ) ;
463486
0 commit comments