@@ -69,9 +69,18 @@ pub fn parse_addresses(input: &Opts) -> Vec<IpAddr> {
6969 }
7070 }
7171
72+ // Finally, craft a list of addresses to be excluded from the scan.
73+ let mut excluded_ips: Vec < IpAddr > = Vec :: new ( ) ;
74+ if let Some ( exclude_addresses) = & input. exclude_addresses {
75+ for addr in exclude_addresses {
76+ excluded_ips. extend ( parse_address ( addr, & backup_resolver) ) ;
77+ }
78+ }
79+
7280 ips. into_iter ( )
7381 . collect :: < BTreeSet < _ > > ( )
7482 . into_iter ( )
83+ . filter ( |ip| !excluded_ips. contains ( ip) )
7584 . collect ( )
7685}
7786
@@ -212,6 +221,58 @@ mod tests {
212221 ) ;
213222 }
214223
224+ #[ test]
225+ fn parse_addresses_with_address_exclusions ( ) {
226+ let mut opts = Opts :: default ( ) ;
227+ opts. addresses = vec ! [ "192.168.0.0/30" . to_owned( ) ] ;
228+ opts. exclude_addresses = Some ( vec ! [ "192.168.0.1" . to_owned( ) ] ) ;
229+ let ips = parse_addresses ( & opts) ;
230+
231+ assert_eq ! (
232+ ips,
233+ [
234+ Ipv4Addr :: new( 192 , 168 , 0 , 0 ) ,
235+ Ipv4Addr :: new( 192 , 168 , 0 , 2 ) ,
236+ Ipv4Addr :: new( 192 , 168 , 0 , 3 )
237+ ]
238+ ) ;
239+ }
240+
241+ #[ test]
242+ fn parse_addresses_with_cidr_exclusions ( ) {
243+ let mut opts = Opts :: default ( ) ;
244+ opts. addresses = vec ! [ "192.168.0.0/29" . to_owned( ) ] ;
245+ opts. exclude_addresses = Some ( vec ! [ "192.168.0.0/30" . to_owned( ) ] ) ;
246+ let ips = parse_addresses ( & opts) ;
247+
248+ assert_eq ! (
249+ ips,
250+ [
251+ Ipv4Addr :: new( 192 , 168 , 0 , 4 ) ,
252+ Ipv4Addr :: new( 192 , 168 , 0 , 5 ) ,
253+ Ipv4Addr :: new( 192 , 168 , 0 , 6 ) ,
254+ Ipv4Addr :: new( 192 , 168 , 0 , 7 ) ,
255+ ]
256+ ) ;
257+ }
258+
259+ #[ test]
260+ fn parse_addresses_with_incorrect_address_exclusions ( ) {
261+ let mut opts = Opts :: default ( ) ;
262+ opts. addresses = vec ! [ "192.168.0.0/30" . to_owned( ) ] ;
263+ opts. exclude_addresses = Some ( vec ! [ "192.168.0.1" . to_owned( ) , "im_wrong" . to_owned( ) ] ) ;
264+ let ips = parse_addresses ( & opts) ;
265+
266+ assert_eq ! (
267+ ips,
268+ [
269+ Ipv4Addr :: new( 192 , 168 , 0 , 0 ) ,
270+ Ipv4Addr :: new( 192 , 168 , 0 , 2 ) ,
271+ Ipv4Addr :: new( 192 , 168 , 0 , 3 )
272+ ]
273+ ) ;
274+ }
275+
215276 #[ test]
216277 fn parse_correct_host_addresses ( ) {
217278 let opts = Opts {
@@ -247,6 +308,7 @@ mod tests {
247308
248309 assert ! ( ips. is_empty( ) ) ;
249310 }
311+
250312 #[ test]
251313 fn parse_hosts_file_and_incorrect_hosts ( ) {
252314 // Host file contains IP, Hosts, incorrect IPs, incorrect hosts
0 commit comments