@@ -3145,80 +3145,80 @@ sub dnssec10 {
3145
3145
my ( @nsec_response_error , @nsec3param_response_error );
3146
3146
my ( @with_dnskey , @without_dnskey );
3147
3147
3148
- my @nss = grep { $_ -> isa(' Zonemaster::Engine::Nameserver' ) } (
3148
+ my @nameservers = grep { $_ -> isa(' Zonemaster::Engine::Nameserver' ) } (
3149
3149
@{ Zonemaster::Engine::TestMethodsV2-> get_del_ns_names_and_ips( $zone ) // [] },
3150
3150
@{ Zonemaster::Engine::TestMethodsV2-> get_zone_ns_names_and_ips( $zone ) // [] }
3151
3151
);
3152
+
3152
3153
my @ignored_nss ;
3153
- my @unique_ip_nss ;
3154
+ my %nss ;
3155
+ push @{ $nss {$_ -> address-> short} }, $_ for ( uniq @nameservers );
3154
3156
3155
- my %ip_already_processed ;
3156
3157
my $testing_time = time ;
3157
3158
3158
- for my $ns ( @nss ) {
3159
- next if exists $ip_already_processed {$ns -> address-> short};
3160
- $ip_already_processed {$ns -> address-> short} = 1;
3161
- push @unique_ip_nss , $ns ;
3159
+ for my $ns_ip ( keys %nss ) {
3160
+ my $ns = $nss {$ns_ip }[0];
3161
+ my @all_ns_for_ip = @{ $nss {$ns_ip } };
3162
3162
3163
3163
if ( _ip_disabled_message( \@results , $ns , @query_types ) ) {
3164
- push @ignored_nss , $ns ;
3164
+ push @ignored_nss , @all_ns_for_ip ;
3165
3165
next ;
3166
3166
}
3167
3167
3168
3168
my $dnskey_p = $ns -> query( $zone -> name, $type_dnskey , { dnssec => 1 } );
3169
3169
3170
3170
if ( not $dnskey_p or $dnskey_p -> rcode ne q{ NOERROR} or not $dnskey_p -> aa ) {
3171
- push @ignored_nss , $ns ;
3171
+ push @ignored_nss , @all_ns_for_ip ;
3172
3172
next ;
3173
3173
}
3174
3174
3175
3175
my @dnskey_records = $dnskey_p -> get_records_for_name( $type_dnskey , $zone -> name-> string, q{ answer} );
3176
3176
3177
3177
if ( not scalar @dnskey_records ) {
3178
- push @without_dnskey , $ns ;
3178
+ push @without_dnskey , @all_ns_for_ip ;
3179
3179
next ;
3180
3180
}
3181
3181
3182
- push @with_dnskey , $ns ;
3182
+ push @with_dnskey , @all_ns_for_ip ;
3183
3183
3184
3184
my $nsec_p = $ns -> query( $zone -> name, $type_nsec , { dnssec => 1 } );
3185
3185
3186
3186
if ( not $nsec_p or $nsec_p -> rcode ne q{ NOERROR} or not $nsec_p -> aa ) {
3187
- push @nsec_response_error , $ns ;
3187
+ push @nsec_response_error , @all_ns_for_ip ;
3188
3188
}
3189
3189
elsif ( $nsec_p -> answer ) {
3190
3190
if ( scalar $nsec_p -> get_records( $type_nsec , q{ answer} ) ) {
3191
- push @nsec_in_answer , $ns ;
3191
+ push @nsec_in_answer , @all_ns_for_ip ;
3192
3192
3193
3193
if ( scalar $nsec_p -> get_records( $type_nsec , q{ answer} ) > 1 ) {
3194
- push @erroneous_multiple_nsec , $ns ;
3194
+ push @erroneous_multiple_nsec , @all_ns_for_ip ;
3195
3195
}
3196
3196
elsif ( ($nsec_p -> get_records( $type_nsec , q{ answer} ))[0]-> owner ne $zone -> name ) {
3197
- push @nsec_mismatches_apex , $ns ;
3197
+ push @nsec_mismatches_apex , @all_ns_for_ip ;
3198
3198
}
3199
3199
}
3200
3200
else {
3201
- push @nsec_erroneous_answer , $ns ;
3201
+ push @nsec_erroneous_answer , @all_ns_for_ip ;
3202
3202
}
3203
3203
}
3204
3204
elsif ( not $nsec_p -> answer and scalar $nsec_p -> get_records( $type_nsec3 , q{ authority} ) ) {
3205
3205
my @nsec3_rrs = $nsec_p -> get_records( $type_nsec3 , q{ authority} );
3206
3206
3207
- push @nsec_nsec3_nodata , $ns ;
3207
+ push @nsec_nsec3_nodata , @all_ns_for_ip ;
3208
3208
3209
3209
unless ( scalar $nsec_p -> get_records( $type_soa , q{ authority} ) ) {
3210
- push @nsec3_nodata_missing_soa , $ns ;
3210
+ push @nsec3_nodata_missing_soa , @all_ns_for_ip ;
3211
3211
}
3212
3212
elsif ( ($nsec_p -> get_records( $type_soa , q{ authority} ))[0]-> owner ne $zone -> name ) {
3213
- push @{ $nsec3_nodata_wrong_soa {$zone -> name} }, $ns ;
3213
+ push @{ $nsec3_nodata_wrong_soa {$zone -> name} }, @all_ns_for_ip ;
3214
3214
}
3215
3215
3216
3216
if ( scalar @nsec3_rrs > 1 ) {
3217
- push @erroneous_multiple_nsec3 , $ns ;
3217
+ push @erroneous_multiple_nsec3 , @all_ns_for_ip ;
3218
3218
}
3219
3219
else {
3220
3220
unless ( $nsec3_rrs [0]-> hash_name( $zone -> name ) eq lc ( @{ name($nsec3_rrs [0]-> owner)-> labels }[0] ) ) {
3221
- push @nsec3_mismatches_apex , $ns ;
3221
+ push @nsec3_mismatches_apex , @all_ns_for_ip ;
3222
3222
}
3223
3223
else {
3224
3224
my @mandatory_typelist = qw( SOA NS DNSKEY NSEC3PARAM RRSIG ) ;
@@ -3227,14 +3227,14 @@ sub dnssec10 {
3227
3227
3228
3228
foreach my $type ( @mandatory_typelist ) {
3229
3229
if ( not exists $typelist {$type } ) {
3230
- push @nsec3_incorrect_type_list , $ns ;
3230
+ push @nsec3_incorrect_type_list , @all_ns_for_ip ;
3231
3231
last ;
3232
3232
}
3233
3233
}
3234
3234
3235
3235
foreach my $type ( @forbidden_typelist ) {
3236
3236
if ( exists $typelist {$type } ) {
3237
- push @nsec3_incorrect_type_list , $ns ;
3237
+ push @nsec3_incorrect_type_list , @all_ns_for_ip ;
3238
3238
last ;
3239
3239
}
3240
3240
}
@@ -3243,20 +3243,20 @@ sub dnssec10 {
3243
3243
my @nsec3_rrsig_rrs = grep { $_ -> typecovered eq q{ NSEC3} } $nsec_p -> get_records_for_name( q{ RRSIG} , $nsec3_rrs [0]-> name );
3244
3244
3245
3245
unless ( scalar @nsec3_rrsig_rrs ) {
3246
- push @nsec3_missing_signature , $ns ;
3246
+ push @nsec3_missing_signature , @all_ns_for_ip ;
3247
3247
}
3248
3248
else {
3249
3249
foreach my $rr ( @nsec3_rrsig_rrs ) {
3250
3250
my @matching_dnskeys = grep { $rr -> keytag == $_ -> keytag } @dnskey_records ;
3251
3251
3252
3252
unless ( scalar @matching_dnskeys ) {
3253
- push @{ $nsec3_rrsig_no_dnskey {$rr -> keytag} }, $ns ;
3253
+ push @{ $nsec3_rrsig_no_dnskey {$rr -> keytag} }, @all_ns_for_ip ;
3254
3254
}
3255
3255
elsif ( $rr -> expiration < $testing_time ) {
3256
- push @{ $nsec3_rrsig_expired {$rr -> keytag} }, $ns ;
3256
+ push @{ $nsec3_rrsig_expired {$rr -> keytag} }, @all_ns_for_ip ;
3257
3257
}
3258
3258
elsif ( $rr -> inception > $testing_time ) {
3259
- push @{ $nsec3_rrsig_not_yet_valid {$rr -> keytag} }, $ns ;
3259
+ push @{ $nsec3_rrsig_not_yet_valid {$rr -> keytag} }, @all_ns_for_ip ;
3260
3260
}
3261
3261
else {
3262
3262
my $i = 1;
@@ -3265,16 +3265,16 @@ sub dnssec10 {
3265
3265
my $validated = $rr -> verify_time( [grep { name( $_ -> name ) eq name( $rr -> name ) } @nsec3_rrs ], [ $dnskey ], $testing_time , $msg );
3266
3266
3267
3267
if ( $validated ) {
3268
- push @nsec3_rrsig_verified , $ns ;
3268
+ push @nsec3_rrsig_verified , @all_ns_for_ip ;
3269
3269
last ;
3270
3270
}
3271
3271
3272
3272
if ( $i >= scalar @matching_dnskeys ) {
3273
3273
if ( $msg =~ / Unknown cryptographic algorithm/ ) {
3274
- push @{ $algo_not_supported_by_zm {$dnskey -> keytag}{$dnskey -> algorithm} }, $ns ;
3274
+ push @{ $algo_not_supported_by_zm {$dnskey -> keytag}{$dnskey -> algorithm} }, @all_ns_for_ip ;
3275
3275
}
3276
3276
else {
3277
- push @{ $nsec3_rrsig_verify_error {$dnskey -> keytag} }, $ns ;
3277
+ push @{ $nsec3_rrsig_verify_error {$dnskey -> keytag} }, @all_ns_for_ip ;
3278
3278
}
3279
3279
}
3280
3280
@@ -3289,41 +3289,41 @@ sub dnssec10 {
3289
3289
my $nsec3param_p = $ns -> query( $zone -> name, $type_nsec3param , { dnssec => 1 } );
3290
3290
3291
3291
if ( not $nsec3param_p or $nsec3param_p -> rcode ne q{ NOERROR} or not $nsec3param_p -> aa ) {
3292
- push @nsec3param_response_error , $ns ;
3292
+ push @nsec3param_response_error , @all_ns_for_ip ;
3293
3293
}
3294
3294
elsif ( $nsec3param_p -> answer ) {
3295
3295
if ( scalar $nsec3param_p -> get_records( $type_nsec3param , q{ answer} ) ) {
3296
- push @nsec3param_in_answer , $ns ;
3296
+ push @nsec3param_in_answer , @all_ns_for_ip ;
3297
3297
3298
3298
if ( scalar $nsec3param_p -> get_records( $type_nsec3param , q{ answer} ) > 1 ) {
3299
- push @erroneous_multiple_nsec3param , $ns ;
3299
+ push @erroneous_multiple_nsec3param , @all_ns_for_ip ;
3300
3300
}
3301
3301
elsif ( ($nsec3param_p -> get_records( $type_nsec3param , q{ answer} ))[0]-> owner ne $zone -> name ) {
3302
- push @nsec3param_mismatches_apex , $ns ;
3302
+ push @nsec3param_mismatches_apex , @all_ns_for_ip ;
3303
3303
}
3304
3304
}
3305
3305
else {
3306
- push @nsec3param_erroneous_answer , $ns ;
3306
+ push @nsec3param_erroneous_answer , @all_ns_for_ip ;
3307
3307
}
3308
3308
}
3309
3309
elsif ( not $nsec3param_p -> answer and scalar $nsec3param_p -> get_records( $type_nsec , q{ authority} ) ) {
3310
3310
my @nsec_rrs = $nsec3param_p -> get_records( $type_nsec , q{ authority} );
3311
3311
3312
- push @nsec3param_nsec_nodata , $ns ;
3312
+ push @nsec3param_nsec_nodata , @all_ns_for_ip ;
3313
3313
3314
3314
unless ( scalar $nsec3param_p -> get_records( $type_soa , q{ authority} ) ) {
3315
- push @nsec_nodata_missing_soa , $ns ;
3315
+ push @nsec_nodata_missing_soa , @all_ns_for_ip ;
3316
3316
}
3317
3317
elsif ( ($nsec3param_p -> get_records( $type_soa , q{ authority} ))[0]-> owner ne $zone -> name ) {
3318
- push @{ $nsec_nodata_wrong_soa {$zone -> name} }, $ns ;
3318
+ push @{ $nsec_nodata_wrong_soa {$zone -> name} }, @all_ns_for_ip ;
3319
3319
}
3320
3320
3321
3321
if ( scalar @nsec_rrs > 1 ) {
3322
- push @erroneous_multiple_nsec , $ns ;
3322
+ push @erroneous_multiple_nsec , @all_ns_for_ip ;
3323
3323
}
3324
3324
else {
3325
3325
unless ( $nsec_rrs [0]-> owner eq $zone -> name ) {
3326
- push @nsec_mismatches_apex , $ns ;
3326
+ push @nsec_mismatches_apex , @all_ns_for_ip ;
3327
3327
}
3328
3328
else {
3329
3329
my @mandatory_typelist = qw( SOA NS DNSKEY NSEC RRSIG ) ;
@@ -3332,14 +3332,14 @@ sub dnssec10 {
3332
3332
3333
3333
foreach my $type ( @mandatory_typelist ) {
3334
3334
if ( not exists $typelist {$type } ) {
3335
- push @nsec_incorrect_type_list , $ns ;
3335
+ push @nsec_incorrect_type_list , @all_ns_for_ip ;
3336
3336
last ;
3337
3337
}
3338
3338
}
3339
3339
3340
3340
foreach my $type ( @forbidden_typelist ) {
3341
3341
if ( exists $typelist {$type } ) {
3342
- push @nsec_incorrect_type_list , $ns ;
3342
+ push @nsec_incorrect_type_list , @all_ns_for_ip ;
3343
3343
last ;
3344
3344
}
3345
3345
}
@@ -3348,20 +3348,20 @@ sub dnssec10 {
3348
3348
my @nsec_rrsig_rrs = grep { $_ -> typecovered eq q{ NSEC} } $nsec3param_p -> get_records_for_name( q{ RRSIG} , $nsec_rrs [0]-> name );
3349
3349
3350
3350
unless ( scalar @nsec_rrsig_rrs ) {
3351
- push @nsec_missing_signature , $ns ;
3351
+ push @nsec_missing_signature , @all_ns_for_ip ;
3352
3352
}
3353
3353
else {
3354
3354
foreach my $rr ( @nsec_rrsig_rrs ) {
3355
3355
my @matching_dnskeys = grep { $rr -> keytag == $_ -> keytag } @dnskey_records ;
3356
3356
3357
3357
unless ( scalar @matching_dnskeys ) {
3358
- push @{ $nsec_rrsig_no_dnskey {$rr -> keytag} }, $ns ;
3358
+ push @{ $nsec_rrsig_no_dnskey {$rr -> keytag} }, @all_ns_for_ip ;
3359
3359
}
3360
3360
elsif ( $rr -> expiration < $testing_time ) {
3361
- push @{ $nsec_rrsig_expired {$rr -> keytag} }, $ns ;
3361
+ push @{ $nsec_rrsig_expired {$rr -> keytag} }, @all_ns_for_ip ;
3362
3362
}
3363
3363
elsif ( $rr -> inception > $testing_time ) {
3364
- push @{ $nsec_rrsig_not_yet_valid {$rr -> keytag} }, $ns ;
3364
+ push @{ $nsec_rrsig_not_yet_valid {$rr -> keytag} }, @all_ns_for_ip ;
3365
3365
}
3366
3366
else {
3367
3367
my $i = 1;
@@ -3370,16 +3370,16 @@ sub dnssec10 {
3370
3370
my $validated = $rr -> verify_time( [grep { name( $_ -> name ) eq name( $rr -> name ) } @nsec_rrs ], [ $dnskey ], $testing_time , $msg );
3371
3371
3372
3372
if ( $validated ) {
3373
- push @nsec_rrsig_verified , $ns ;
3373
+ push @nsec_rrsig_verified , @all_ns_for_ip ;
3374
3374
last ;
3375
3375
}
3376
3376
3377
3377
if ( $i >= scalar @matching_dnskeys ) {
3378
3378
if ( $msg =~ / Unknown cryptographic algorithm/ ) {
3379
- push @{ $algo_not_supported_by_zm {$dnskey -> keytag}{$dnskey -> algorithm} }, $ns ;
3379
+ push @{ $algo_not_supported_by_zm {$dnskey -> keytag}{$dnskey -> algorithm} }, @all_ns_for_ip ;
3380
3380
}
3381
3381
else {
3382
- push @{ $nsec_rrsig_verify_error {$dnskey -> keytag} }, $ns ;
3382
+ push @{ $nsec_rrsig_verify_error {$dnskey -> keytag} }, @all_ns_for_ip ;
3383
3383
}
3384
3384
}
3385
3385
@@ -3790,7 +3790,9 @@ sub dnssec10 {
3790
3790
);
3791
3791
}
3792
3792
3793
- $lc = List::Compare-> new( [ @unique_ip_nss ], [ @ignored_nss , @without_dnskey , @nsec_in_answer , @nsec3param_nsec_nodata , @nsec3param_in_answer , @nsec_nsec3_nodata ] );
3793
+ my @all_ns = map { $_ } ( map { @{ $_ } } values %nss );
3794
+
3795
+ $lc = List::Compare-> new( [ @all_ns ], [ @ignored_nss , @without_dnskey , @nsec_in_answer , @nsec3param_nsec_nodata , @nsec3param_in_answer , @nsec_nsec3_nodata ] );
3794
3796
@first = $lc -> get_unique;
3795
3797
3796
3798
if ( @first ) {
0 commit comments