@@ -85,6 +85,9 @@ pub struct DiscoveryBehaviour<TSubstream> {
85
85
local_peer_id : PeerId ,
86
86
/// Number of nodes we're currently connected to.
87
87
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 ,
88
91
}
89
92
90
93
impl < TSubstream > DiscoveryBehaviour < TSubstream > {
@@ -94,7 +97,8 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> {
94
97
pub fn new (
95
98
local_public_key : PublicKey ,
96
99
user_defined : Vec < ( PeerId , Multiaddr ) > ,
97
- enable_mdns : bool
100
+ enable_mdns : bool ,
101
+ allow_private_ipv4 : bool ,
98
102
) -> Self {
99
103
if enable_mdns {
100
104
#[ cfg( target_os = "unknown" ) ]
@@ -116,6 +120,7 @@ impl<TSubstream> DiscoveryBehaviour<TSubstream> {
116
120
discoveries : VecDeque :: new ( ) ,
117
121
local_peer_id : local_public_key. into_peer_id ( ) ,
118
122
num_connections : 0 ,
123
+ allow_private_ipv4,
119
124
#[ cfg( not( target_os = "unknown" ) ) ]
120
125
mdns : if enable_mdns {
121
126
match Mdns :: new ( ) {
@@ -214,9 +219,27 @@ where
214
219
let mut list = self . user_defined . iter ( )
215
220
. filter_map ( |( p, a) | if p == peer_id { Some ( a. clone ( ) ) } else { None } )
216
221
. 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
+
220
243
trace ! ( target: "sub-libp2p" , "Addresses of {:?} are {:?}" , peer_id, list) ;
221
244
if list. is_empty ( ) {
222
245
if self . kademlia . kbuckets_entries ( ) . any ( |p| p == peer_id) {
@@ -457,7 +480,7 @@ mod tests {
457
480
upgrade:: apply ( stream, upgrade, endpoint, libp2p:: core:: upgrade:: Version :: V1 )
458
481
} ) ;
459
482
460
- let behaviour = DiscoveryBehaviour :: new ( keypair. public ( ) , user_defined. clone ( ) , false ) ;
483
+ let behaviour = DiscoveryBehaviour :: new ( keypair. public ( ) , user_defined. clone ( ) , false , true ) ;
461
484
let mut swarm = Swarm :: new ( transport, behaviour, keypair. public ( ) . into_peer_id ( ) ) ;
462
485
let listen_addr: Multiaddr = format ! ( "/memory/{}" , rand:: random:: <u64 >( ) ) . parse ( ) . unwrap ( ) ;
463
486
0 commit comments