diff options
author | Matthew Somerville <matthew@mysociety.org> | 2015-08-20 10:51:41 +0100 |
---|---|---|
committer | Matthew Somerville <matthew@mysociety.org> | 2015-08-20 10:55:42 +0100 |
commit | 3144fb3c6abf9d88fdd9f978ce44b7e55907a069 (patch) | |
tree | 1e5cf640d98dd17db563b1ef7ba3f7b0ff381f27 /perllib/Utils | |
parent | 1e772950bf8011078538ea2921d03fe0af6b1c66 (diff) |
Cope better with DNS responses in DMARC lookup.
Diffstat (limited to 'perllib/Utils')
-rw-r--r-- | perllib/Utils/Email.pm | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/perllib/Utils/Email.pm b/perllib/Utils/Email.pm index 466c05ad1..a30e41c61 100644 --- a/perllib/Utils/Email.pm +++ b/perllib/Utils/Email.pm @@ -11,7 +11,7 @@ sub test_dmarc { return unless $addr; my $domain = $addr->host; - my @answers = Net::DNS::Resolver->new->send("_dmarc.$domain", 'TXT')->answer; + my @answers = _send(Net::DNS::Resolver->new, "_dmarc.$domain", 'TXT'); @answers = map { $_->txtdata } @answers; my $dmarc = join(' ', @answers); return unless $dmarc =~ /p *= *reject/; @@ -19,4 +19,19 @@ sub test_dmarc { return 1; } +# Same as send->answer, but follows one CNAME and returns only matching results +sub _send { + my ($resolver, $domain, $type) = @_; + my $packet = $resolver->send($domain, $type); + my @answers; + foreach my $rr ($packet->answer) { + if ($rr->type eq 'CNAME') { + push @answers, $resolver->send($rr->cname, $type)->answer; + } else { + push @answers, $rr; + } + } + return grep { $_->type eq $type } @answers; +} + 1; |