Skip to content

Commit

Permalink
Merge pull request #1245 from tgreenx/update-syntax06
Browse files Browse the repository at this point in the history
Update Syntax06
  • Loading branch information
tgreenx authored Dec 4, 2023
2 parents d47a356 + 5d68ba5 commit 7f2c5cd
Show file tree
Hide file tree
Showing 13 changed files with 66 additions and 33 deletions.
67 changes: 37 additions & 30 deletions lib/Zonemaster/Engine/Test/Syntax.pm
Original file line number Diff line number Diff line change
Expand Up @@ -906,9 +906,10 @@ sub syntax06 {
@nss = sort values %nss;
}

my %seen_rnames;
my %rname_candidates;
my %seen_mail_servers;
my $invalid_exchanges = undef;
for my $ns ( @nss ) {

if ( _ip_disabled_message( \@results, $ns, q{SOA} ) ) {
next;
}
Expand Down Expand Up @@ -960,76 +961,82 @@ sub syntax06 {
$domain .= q{.}; # Add back final dot
$domain = $cnames{$domain} while $cnames{$domain};

# Determine mail domain(s)
my @mail_domains;
# Determine mail server(s)
my @mail_servers;
if ( my @mxs = $p_mx->get_records_for_name( q{MX}, $domain ) ) {
@mail_domains = map { $_->exchange } @mxs;
@mail_servers = uniq( map { $_->exchange } @mxs );
}
else {
@mail_domains = ( $domain );
@mail_servers = ( $domain );
}

for my $mail_domain ( @mail_domains ) {
for my $mail_server ( @mail_servers ) {
next if $seen_mail_servers{$mail_server};
$seen_mail_servers{$mail_server} = 1;

# Assume mail domain is invalid until we see an actual IP address
# Assume mail server is invalid until we see an actual IP address
my $exchange_valid = 0;
$invalid_exchanges = 0 unless defined $invalid_exchanges;

# Lookup IPv4 address for mail server
my $p_a = Zonemaster::Engine::Recursor->recurse( $mail_domain, q{A} );
my $p_a = Zonemaster::Engine::Recursor->recurse( $mail_server, q{A} );
if ( $p_a ) {
if ( $p_a->get_records( q{CNAME}, q{answer} ) ) {
push @results, _emit_log( RNAME_MAIL_ILLEGAL_CNAME => { domain => $mail_domain } );
push @results, _emit_log( RNAME_MAIL_ILLEGAL_CNAME => { domain => $mail_server } );
}
else {
my @rrs_a = grep { $_->owner eq $mail_domain } $p_a->get_records( q{A}, q{answer} );
my @rrs_a = grep { $_->owner eq $mail_server } $p_a->get_records( q{A}, q{answer} );

if ( grep { $_->address eq q{127.0.0.1} } @rrs_a ) {
push @results, _emit_log( RNAME_MAIL_DOMAIN_LOCALHOST => { domain => $mail_domain, localhost => q{127.0.0.1} } );
push @results, _emit_log( RNAME_MAIL_DOMAIN_LOCALHOST => { domain => $mail_server, localhost => q{127.0.0.1} } );
}
elsif ( @rrs_a ) {
$exchange_valid = 1;
}
}
}

# Lookup IPv6 address for mail domain
my $p_aaaa = Zonemaster::Engine::Recursor->recurse( $mail_domain, q{AAAA} );
# Lookup IPv6 address for mail server
my $p_aaaa = Zonemaster::Engine::Recursor->recurse( $mail_server, q{AAAA} );
if ( $p_aaaa ) {
if ( $p_aaaa->get_records( q{CNAME}, q{answer} ) ) {
push @results, _emit_log( RNAME_MAIL_ILLEGAL_CNAME => { domain => $mail_domain } );
push @results, _emit_log( RNAME_MAIL_ILLEGAL_CNAME => { domain => $mail_server } );
}
else {
my @rrs_aaaa = grep { $_->owner eq $mail_domain } $p_aaaa->get_records( q{AAAA}, q{answer} );
my @rrs_aaaa = grep { $_->owner eq $mail_server } $p_aaaa->get_records( q{AAAA}, q{answer} );

if ( grep { $_->address eq q{::1} } @rrs_aaaa) {
push @results, _emit_log( RNAME_MAIL_DOMAIN_LOCALHOST => { domain => $mail_domain, localhost => q{::1} } );
push @results, _emit_log( RNAME_MAIL_DOMAIN_LOCALHOST => { domain => $mail_server, localhost => q{::1} } );
}
elsif ( @rrs_aaaa ) {
$exchange_valid = 1;
}
}
}

# Emit verdict for mail domain
# Emit verdict for mail server
if ( $exchange_valid ) {
if ( !exists $seen_rnames{$rname} ) {
$seen_rnames{$rname} = 1;
push @results,
_emit_log(
RNAME_RFC822_VALID => {
rname => $rname,
}
);
}
$rname_candidates{$rname} = 1;
}
else {
push @results, _emit_log( RNAME_MAIL_DOMAIN_INVALID => { domain => $mail_domain } );
push @results, _emit_log( RNAME_MAIL_DOMAIN_INVALID => { domain => $mail_server } );
delete $rname_candidates{$rname};
$invalid_exchanges++;
}
} ## end for my $mail_domain ( @mail_domains)
} ## end for my $mail_server ( @mail_servers)

} ## end for my $ns ( @nss )

return ( @results, _emit_log( TEST_CASE_END => { testcase => $Zonemaster::Engine::Logger::TEST_CASE_NAME } ) );
if ( defined $invalid_exchanges and $invalid_exchanges == 0 ) {
push @results,
_emit_log(
RNAME_RFC822_VALID => {
rname => $_,
}
) for keys %rname_candidates;
}

return ( @results, _emit_log( TEST_CASE_END => { testcase => (split /::/, (caller(0))[3])[-1] } ) );
} ## end sub syntax06

=over
Expand Down
10 changes: 7 additions & 3 deletions t/Test-syntax.t
Original file line number Diff line number Diff line change
Expand Up @@ -96,26 +96,30 @@ zone_gives( q{syntax05}, $zone, q{RNAME_NO_AT_SIGN} );
zone_gives_not( q{syntax05}, $zone, q{RNAME_MISUSED_AT_SIGN} );
zone_gives( q{syntax06}, $zone, q{RNAME_RFC822_VALID} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_RFC822_INVALID} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_ILLEGAL_CNAME} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_DOMAIN_LOCALHOST} );
zone_gives_not( q{syntax07}, $zone, q{MNAME_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax07}, $zone, q{MNAME_NUMERIC_TLD} );
zone_gives_not( q{syntax07}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives_not( q{syntax08}, $zone, q{MX_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax08}, $zone, q{MX_NUMERIC_TLD} );
zone_gives_not( q{syntax08}, $zone, q{NO_RESPONSE_MX_QUERY} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );

$zone = Zonemaster::Engine->zone( q{syntax01.zut-root.rd.nic.fr} );
zone_gives( q{syntax05}, $zone, q{RNAME_MISUSED_AT_SIGN} );
zone_gives_not( q{syntax05}, $zone, q{RNAME_NO_AT_SIGN} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_RFC822_VALID} );
zone_gives( q{syntax06}, $zone, q{RNAME_RFC822_INVALID} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_ILLEGAL_CNAME} );
zone_gives_not( q{syntax06}, $zone, q{RNAME_MAIL_DOMAIN_LOCALHOST} );
zone_gives( q{syntax07}, $zone, q{MNAME_DISCOURAGED_DOUBLE_DASH} );
zone_gives( q{syntax07}, $zone, q{MNAME_NUMERIC_TLD} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );
zone_gives( q{syntax08}, $zone, q{MX_NUMERIC_TLD} );
zone_gives( q{syntax08}, $zone, q{MX_DISCOURAGED_DOUBLE_DASH} );
zone_gives_not( q{syntax08}, $zone, q{NO_RESPONSE_MX_QUERY} );
zone_gives_not( q{syntax06}, $zone, q{NO_RESPONSE_SOA_QUERY} );

$zone = Zonemaster::Engine->zone( 'name.doesnotexist' );
%res = map { $_->tag => 1 } Zonemaster::Engine->test_method( q{Syntax}, q{syntax05}, $zone );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-A.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} )
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-B.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} )
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-C.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( $res{NO_RESPONSE_SOA_QUERY}, q{should emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-D.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} )
ok( $res{RNAME_RFC822_INVALID}, q{should emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-E.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-F.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} )
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-G.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-I.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( $res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-J.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} );
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( $res{RNAME_MAIL_DOMAIN_INVALID}, q{should emit RNAME_MAIL_DOMAIN_INVALID} );
ok( !$res{RNAME_RFC822_VALID}, q{should not emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( $res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-K.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} )
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down
2 changes: 2 additions & 0 deletions t/Test-syntax06-L.t
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ ok( !$res{NO_RESPONSE_SOA_QUERY}, q{should not emit NO_RESPONSE_SOA_QUERY} )
ok( !$res{RNAME_RFC822_INVALID}, q{should not emit RNAME_RFC822_INVALID} );
ok( !$res{RNAME_MAIL_DOMAIN_INVALID}, q{should not emit RNAME_MAIL_DOMAIN_INVALID} );
ok( $res{RNAME_RFC822_VALID}, q{should emit RNAME_RFC822_VALID} );
ok( !$res{RNAME_MAIL_ILLEGAL_CNAME}, q{should not emit RNAME_MAIL_ILLEGAL_CNAME} );
ok( !$res{RNAME_MAIL_DOMAIN_LOCALHOST}, q{should not emit RNAME_MAIL_DOMAIN_LOCALHOST} );

if ( $ENV{ZONEMASTER_RECORD} ) {
Zonemaster::Engine::Nameserver->save( $datafile );
Expand Down

0 comments on commit 7f2c5cd

Please sign in to comment.