You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by he...@apache.org on 2022/05/26 05:24:05 UTC

svn commit: r1901268 - in /spamassassin/trunk: lib/Mail/SpamAssassin/Plugin/HashBL.pm t/data/spam/hashbl t/hashbl.t

Author: hege
Date: Thu May 26 05:24:05 2022
New Revision: 1901268

URL: http://svn.apache.org/viewvc?rev=1901268&view=rev
Log:
Use uridnsbl_skip_domains for HashBL lookups

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm
    spamassassin/trunk/t/data/spam/hashbl
    spamassassin/trunk/t/hashbl.t

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm?rev=1901268&r1=1901267&r2=1901268&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm Thu May 26 05:24:05 2022
@@ -214,6 +214,9 @@ Skip any type of query, if either the ha
 example) matches.  Multiple values can be defined, separated by whitespace. 
 Matching is case-insensitive.
 
+Any host or its domain part matching uridnsbl_skip_domains is also ignored
+by default.
+
 =back
 
 =cut
@@ -409,22 +412,31 @@ sub _parse_opts {
 
 sub _get_emails {
   my ($self, $pms, $opts, $from, $acl) = @_;
+  my $conf = $pms->{conf};
 
   my @emails; # keep find order
   my %seen;
 
   foreach my $hdr (split(/\s*\/\s*/, $from)) {
     my $parsed_emails = $self->_parse_emails($pms, $opts, $hdr);
-    foreach (@$parsed_emails) {
-      next if $seen{$_}++;
-      my ($domain) = ($_ =~ /.*\@(.+)/);
-      if (defined $domain && defined $acl && $acl ne 'all') {
-        if ($self->{hashbl_acl}{$acl}{$domain}) {
-          push @emails, $_;
+    foreach my $email (@$parsed_emails) {
+      next if $seen{$email}++;
+      my ($domain) = ($email =~ /.*\@(.+)/);
+      next unless defined $domain;
+      next if defined $acl && $acl ne 'all' && !$self->{hashbl_acl}{$acl}{$domain};
+      # Don't check uridnsbl_skip_domains when explicit acl is used
+      if (!defined $acl) {
+        if (exists $conf->{uridnsbl_skip_domains}->{lc $domain}) {
+          dbg("query skipped, uridnsbl_skip_domains: $email");
+          next;
+        }
+        my $dom = $pms->{main}->{registryboundaries}->trim_domain($domain);
+        if (exists $conf->{uridnsbl_skip_domains}->{lc $dom}) {
+          dbg("query skipped, uridnsbl_skip_domains: $email");
+          next;
         }
-      } else {
-        push @emails, $_;
       }
+      push @emails, $email;
     }
   }
 
@@ -578,6 +590,7 @@ sub check_hashbl_uris {
   return 0 if !$self->{hashbl_available};
   return 0 if !$pms->is_dns_available();
 
+  my $conf = $pms->{conf};
   my $rulename = $pms->get_current_eval_rule_name();
 
   if (!defined $list) {
@@ -606,6 +619,7 @@ sub check_hashbl_uris {
   my %seen;
   my @filtered_uris;
 
+URI:
   while (my($uri, $info) = each %{$uris}) {
     # we want to skip mailto: uris
     next if ($uri =~ /^mailto:/i);
@@ -615,6 +629,14 @@ sub check_hashbl_uris {
     next unless $info->{hosts};
     next unless $info->{cleaned};
     next unless $info->{types}->{a} || $info->{types}->{parsed};
+    foreach my $host (keys %{$info->{hosts}}) {
+      if (exists $conf->{uridnsbl_skip_domains}->{$host} ||
+          exists $conf->{uridnsbl_skip_domains}->{$info->{hosts}->{$host}})
+      {
+        dbg("query skipped, uridnsbl_skip_domains: $uri");
+        next URI;
+      }
+    }
     foreach my $uri (@{$info->{cleaned}}) {
       # check url
       push @filtered_uris, $opts->{case} ? $uri : lc($uri);
@@ -774,6 +796,7 @@ sub check_hashbl_tag {
 
 sub _check_hashbl_tag {
   my ($self, $pms, $list, $opts, $tag, $subtest, $rulename) = @_;
+  my $conf = $pms->{conf};
 
   # Get raw array of tag values, get_tag() returns joined string
   my $valref = $pms->get_tag_raw($tag);
@@ -809,16 +832,28 @@ sub _check_hashbl_tag {
       $value = reverse_ip_address($value);
     }
     if (!$is_ip) {
-      if ($opts->{fqdn} && !is_fqdn_valid($value)) {
+      my $fqdn_valid = is_fqdn_valid($value);
+      if ($opts->{fqdn} && !$fqdn_valid) {
         $value = undef;
         next;
       }
+      my $domain;
+      if ($fqdn_valid) {
+        $domain = $pms->{main}->{registryboundaries}->trim_domain($value);
+        if (exists $conf->{uridnsbl_skip_domains}->{lc $value} ||
+            exists $conf->{uridnsbl_skip_domains}->{lc $domain})
+        {
+          dbg("query skipped, uridnsbl_skip_domains: $value");
+          $value = undef;
+          next;
+        }
+      }
       if ($opts->{tld} && !$pms->{main}->{registryboundaries}->is_domain_valid($value)) {
         $value = undef;
         next;
       }
-      if ($opts->{trim}) {
-        $value = $pms->{main}->{registryboundaries}->trim_domain($value);
+      if ($opts->{trim} && $domain) {
+        $value = $domain;
       }
     }
   }
@@ -947,14 +982,15 @@ sub _hash {
 
 sub _submit_query {
   my ($self, $pms, $rulename, $value, $list, $opts, $subtest, $already_hashed) = @_;
+  my $conf = $pms->{conf};
 
-  if (!$already_hashed && exists $pms->{conf}->{hashbl_ignore}->{lc $value}) {
+  if (!$already_hashed && exists $conf->{hashbl_ignore}->{lc $value}) {
     dbg("query skipped, ignored string: $value");
     return 0;
   }
 
   my $hash = $already_hashed ? $value : $self->_hash($opts, $value);
-  if (exists $pms->{conf}->{hashbl_ignore}->{lc $hash}) {
+  if (exists $conf->{hashbl_ignore}->{lc $hash}) {
     dbg("query skipped, ignored hash: $value");
     return 0;
   }

Modified: spamassassin/trunk/t/data/spam/hashbl
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/data/spam/hashbl?rev=1901268&r1=1901267&r2=1901268&view=diff
==============================================================================
--- spamassassin/trunk/t/data/spam/hashbl (original)
+++ spamassassin/trunk/t/data/spam/hashbl Thu May 26 05:24:05 2022
@@ -33,6 +33,8 @@ Some uris spammer.com https://spammer2.c
 
 btc 1JaSs2bTZYVbj6jaqZ5Mjfs8gSLY9vYCrK
 
+uridnsbl_skip_domain  https://sub.trusted.com/  email@trusted.com
+
 --ETDFsshmzrOmOVdZ
 Content-Type: application/octet-stream
 Content-Disposition: attachment; filename="macro.xlsm"

Modified: spamassassin/trunk/t/hashbl.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/hashbl.t?rev=1901268&r1=1901267&r2=1901268&view=diff
==============================================================================
--- spamassassin/trunk/t/hashbl.t (original)
+++ spamassassin/trunk/t/hashbl.t Thu May 26 05:24:05 2022
@@ -71,6 +71,9 @@ sub check_queries {
 tstlocalrules(q{
   rbl_timeout 30
 
+  clear_uridnsbl_skip_domain
+  uridnsbl_skip_domain trusted.com
+
   header   X_HASHBL_EMAIL eval:check_hashbl_emails('hashbltest1.spamassassin.org')
   tflags   X_HASHBL_EMAIL net