You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by gb...@apache.org on 2019/04/04 13:34:49 UTC
svn commit: r1856933 - in /spamassassin:
branches/3.4/lib/Mail/SpamAssassin/Plugin/DNSEval.pm
trunk/lib/Mail/SpamAssassin/Plugin/DNSEval.pm
Author: gbechis
Date: Thu Apr 4 13:34:49 2019
New Revision: 1856933
URL: http://svn.apache.org/viewvc?rev=1856933&view=rev
Log:
convert check_rbl_ns_from to async lookups
Modified:
spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/DNSEval.pm
spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/DNSEval.pm
Modified: spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/DNSEval.pm
URL: http://svn.apache.org/viewvc/spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/DNSEval.pm?rev=1856933&r1=1856932&r2=1856933&view=diff
==============================================================================
--- spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/DNSEval.pm (original)
+++ spamassassin/branches/3.4/lib/Mail/SpamAssassin/Plugin/DNSEval.pm Thu Apr 4 13:34:49 2019
@@ -454,30 +454,57 @@ It is possible to include a subtest for
sub check_rbl_ns_from {
my ($self, $pms, $rule, $set, $rbl_server, $subtest) = @_;
- my $host;
+ my $domain;
my @nshost = ();
return 0 unless $pms->is_dns_available();
$pms->load_resolver();
- for my $from ($_[1]->get('EnvelopeFrom:addr',undef)) {
+ for my $from ($pms->get('EnvelopeFrom:addr')) {
next unless defined $from;
-
$from =~ tr/././s; # bug 3366
if ($from =~ m/ \@ ( [^\@\s]+ \. [^\@\s]+ )/x ) {
- $host = lc($1);
+ $domain = lc($1);
last;
}
}
- return 0 unless defined $host;
+ return 0 unless defined $domain;
+
+ dbg("dns: checking NS for host $domain");
+
+ my $key = "NS:" . $domain;
+ my $obj = { dom => $domain, rule => $rule, set => $set, rbl_server => $rbl_server, subtest => $subtest };
+ my $ent = {
+ key => $key, zone => $domain, obj => $obj, type => "URI-NS",
+ };
+ # dig $dom ns
+ $ent = $pms->{async}->bgsend_and_start_lookup(
+ $domain, 'NS', undef, $ent,
+ sub { my ($ent2,$pkt) = @_;
+ $self->complete_ns_lookup($pms, $ent2, $pkt, $domain) },
+ master_deadline => $pms->{master_deadline} );
+ return $ent;
+}
+
+sub complete_ns_lookup {
+ my ($self, $pms, $ent, $pkt, $host) = @_;
- dbg("dns: checking NS for host $host");
+ my $rule = $ent->{obj}->{rule};
+ my $set = $ent->{obj}->{set};
+ my $rbl_server = $ent->{obj}->{rbl_server};
+ my $subtest = $ent->{obj}->{subtest};
+
+ if (!$pkt) {
+ # $pkt will be undef if the DNS query was aborted (e.g. timed out)
+ dbg("DNSEval: complete_ns_lookup aborted %s", $ent->{key});
+ return;
+ }
- my @ns = $pms->lookup_ns($host);
- my @rd_ns = $ns[0];
+ dbg("DNSEval: complete_ns_lookup %s", $ent->{key});
+ my @ns = $pkt->answer;
- for my $count ( 0 .. ( @rd_ns + 1 ) ) {
- my $nshost = $ns[0][$count];
+ foreach my $rr (@ns) {
+ my $nshost = $rr->nsdname;
if(defined($nshost)) {
chomp($nshost);
if ( defined $subtest ) {
@@ -487,7 +514,6 @@ sub check_rbl_ns_from {
}
$pms->do_rbl_lookup($rule, $set, 'A',
"$nshost.$rbl_server", $subtest) if ( defined $nshost and $nshost ne "");
- $count++;
}
}
}
Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/DNSEval.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/DNSEval.pm?rev=1856933&r1=1856932&r2=1856933&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/DNSEval.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/DNSEval.pm Thu Apr 4 13:34:49 2019
@@ -460,30 +460,57 @@ It is possible to include a subtest for
sub check_rbl_ns_from {
my ($self, $pms, $rule, $set, $rbl_server, $subtest) = @_;
- my $host;
+ my $domain;
my @nshost = ();
return 0 unless $pms->is_dns_available();
$pms->load_resolver();
- for my $from ($_[1]->get('EnvelopeFrom:addr',undef)) {
+ for my $from ($pms->get('EnvelopeFrom:addr')) {
next unless defined $from;
-
$from =~ tr/././s; # bug 3366
if ($from =~ m/ \@ ( [^\@\s]+ \. [^\@\s]+ )/x ) {
- $host = lc($1);
+ $domain = lc($1);
last;
}
}
- return 0 unless defined $host;
+ return 0 unless defined $domain;
+
+ dbg("dns: checking NS for host $domain");
+
+ my $key = "NS:" . $domain;
+ my $obj = { dom => $domain, rule => $rule, set => $set, rbl_server => $rbl_server, subtest => $subtest };
+ my $ent = {
+ key => $key, zone => $domain, obj => $obj, type => "URI-NS",
+ };
+ # dig $dom ns
+ $ent = $pms->{async}->bgsend_and_start_lookup(
+ $domain, 'NS', undef, $ent,
+ sub { my ($ent2,$pkt) = @_;
+ $self->complete_ns_lookup($pms, $ent2, $pkt, $domain) },
+ master_deadline => $pms->{master_deadline} );
+ return $ent;
+}
+
+sub complete_ns_lookup {
+ my ($self, $pms, $ent, $pkt, $host) = @_;
- dbg("dns: checking NS for host $host");
+ my $rule = $ent->{obj}->{rule};
+ my $set = $ent->{obj}->{set};
+ my $rbl_server = $ent->{obj}->{rbl_server};
+ my $subtest = $ent->{obj}->{subtest};
+
+ if (!$pkt) {
+ # $pkt will be undef if the DNS query was aborted (e.g. timed out)
+ dbg("DNSEval: complete_ns_lookup aborted %s", $ent->{key});
+ return;
+ }
- my @ns = $pms->lookup_ns($host);
- my @rd_ns = $ns[0];
+ dbg("DNSEval: complete_ns_lookup %s", $ent->{key});
+ my @ns = $pkt->answer;
- for my $count ( 0 .. ( @rd_ns + 1 ) ) {
- my $nshost = $ns[0][$count];
+ foreach my $rr (@ns) {
+ my $nshost = $rr->nsdname;
if(defined($nshost)) {
chomp($nshost);
if ( defined $subtest ) {
@@ -493,7 +520,6 @@ sub check_rbl_ns_from {
}
$pms->do_rbl_lookup($rule, $set, 'A',
"$nshost.$rbl_server", $subtest) if ( defined $nshost and $nshost ne "");
- $count++;
}
}
}