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/30 14:12:23 UTC

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

Author: hege
Date: Mon May 30 14:12:23 2022
New Revision: 1901419

URL: http://svn.apache.org/viewvc?rev=1901419&view=rev
Log:
- hashbl_email_domain_alias
- warn of undefined acl
- lc base32 for better cosmetics

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=1901419&r1=1901418&r2=1901419&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm Mon May 30 14:12:23 2022
@@ -30,7 +30,10 @@ HashBL - query hashed (and unhashed) DNS
   describe HASHBL_EMAIL Message contains email address found on EBL
   tflags   HASHBL_EMAIL net
 
-  hashbl_acl_freemail gmail.com # only query gmail.com addresses
+  # rewrite googlemail.com -> gmail.com, applied before acl/welcomelist
+  hashbl_email_domain_alias gmail.com googlemail.com
+  # only query gmail.com addresses
+  hashbl_acl_freemail gmail.com
   header   HASHBL_OSENDR eval:check_hashbl_emails('rbl.example.invalid/A', 'md5/max=10/shuffle', 'X-Original-Sender', '^127\.', 'freemail')
   describe HASHBL_OSENDR Message contains email address found on HASHBL
   tflags   HASHBL_OSENDR net
@@ -294,6 +297,27 @@ sub set_config {
   });
 
   push (@cmds, {
+    setting => 'hashbl_email_domain_alias',
+    is_admin => 1,
+    type => $Mail::SpamAssassin::Conf::CONF_TYPE_HASH_KEY_VALUE,
+    default => {},
+    code => sub {
+      my ($self, $key, $value, $line) = @_;
+      if (!defined $value || $value eq '') {
+        return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
+      }
+      my @vals = split(/\s+/, lc $value);
+      if (@vals < 2 || index($value, '@') >= 0) {
+        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
+      }
+      my $domain = shift @vals;
+      foreach my $alias (@vals) {
+        $self->{hashbl_email_domain_alias}->{$alias} = $domain;
+      }
+    }
+  });
+
+  push (@cmds, {
     setting => 'hashbl_email_regex',
     is_admin => 1,
     type => $Mail::SpamAssassin::Conf::CONF_TYPE_STRING,
@@ -423,9 +447,13 @@ sub _get_emails {
   foreach my $hdr (split(/\s*\/\s*/, $from)) {
     my $parsed_emails = $self->_parse_emails($pms, $opts, $hdr);
     foreach my $email (@$parsed_emails) {
-      next if $seen{$email}++;
-      my ($domain) = ($email =~ /.*\@(.+)/);
+      my ($username, $domain) = ($email =~ /(.*)\@(.+)/);
       next unless defined $domain;
+      if (exists $conf->{hashbl_email_domain_alias}->{lc $domain}) {
+        $domain = $conf->{hashbl_email_domain_alias}->{lc $domain};
+        $email = $username.'@'.$domain;
+      }
+      next if $seen{$email}++;
       next if defined $acl && $acl ne 'all' && !$self->{hashbl_acl}{$acl}{$domain};
       push @emails, $email;
     }
@@ -509,6 +537,11 @@ sub check_hashbl_emails {
     return 0;
   }
 
+  if (defined $acl && $acl ne 'all' && !exists $self->{hashbl_acl}{$acl}) {
+    warn "HashBL: $rulename acl '$acl' not defined\n";
+    return 0;
+  }
+
   if ($subtest) {
     my ($rec, $err) = compile_regexp($subtest, 0);
     if (!$rec) {
@@ -991,7 +1024,7 @@ sub _hash {
 
   if ($opts->{sha256}) {
     utf8::encode($value) if utf8::is_utf8($value); # sha256 expects bytes
-    return base32_encode(sha256($value));
+    return lc base32_encode(sha256($value));
   } elsif ($opts->{sha1}) {
     utf8::encode($value) if utf8::is_utf8($value); # sha1_hex expects bytes
     return sha1_hex($value);
@@ -1074,5 +1107,6 @@ sub has_hashbl_tag { 1 }
 sub has_hashbl_sha256 { 1 }
 sub has_hashbl_attachments { 1 }
 sub has_hashbl_email_domain { 1 } # user/host/domain option for emails
+sub has_hashbl_email_domain_alias { 1 } # hashbl_email_domain_alias
 
 1;

Modified: spamassassin/trunk/t/data/spam/hashbl
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/data/spam/hashbl?rev=1901419&r1=1901418&r2=1901419&view=diff
==============================================================================
--- spamassassin/trunk/t/data/spam/hashbl (original)
+++ spamassassin/trunk/t/data/spam/hashbl Mon May 30 14:12:23 2022
@@ -29,6 +29,8 @@ This is an innocent@email.com
 
 This is a google email: spamm.er@gmail.com
 
+hashbl_email_alias_domain: spamm.er2@aliasdomain.com
+
 Some uris spammer.com https://spammer2.com/
 
 btc 1JaSs2bTZYVbj6jaqZ5Mjfs8gSLY9vYCrK

Modified: spamassassin/trunk/t/hashbl.t
URL: http://svn.apache.org/viewvc/spamassassin/trunk/t/hashbl.t?rev=1901419&r1=1901418&r2=1901419&view=diff
==============================================================================
--- spamassassin/trunk/t/hashbl.t (original)
+++ spamassassin/trunk/t/hashbl.t Mon May 30 14:12:23 2022
@@ -9,7 +9,7 @@ plan skip_all => "Can't use Net::DNS Saf
 
 # run many times to catch some random natured failures
 my $iterations = 5;
-plan tests => 11 * $iterations;
+plan tests => 12 * $iterations;
 
 # ---------------------------------------------------------------------------
 
@@ -25,6 +25,7 @@ plan tests => 11 * $iterations;
 );
 %anti_patterns = (
  q{ 1.0 X_HASHBL_SHA256 } => '',
+ q{ warn: } => '',
 );
 
 # Check from debug output log that nothing else than these were queried
@@ -34,6 +35,7 @@ bc9f1b35acd338b92b0659cc2111e6b661a8b2bc
 62e12fbe4b32adc2e87147d74590372b461f35f6.hashbltest1.spamassassin.org
 96b802967118135ef048c2bc860e7b0deb7d2333.hashbltest1.spamassassin.org
 1675677ba3d539bdfb0ae8940bf7e6c836f3ad17.hashbltest1.spamassassin.org
+2ead26370ef9d238584aa3c86a02e254708370a0.hashbltest1.spamassassin.org
 170d83ef2dc9c2de0e65ce4461a3a375.hashbltest2.spamassassin.org
 cc205dd956d568ff8524d7fc42868500e4d7d162.hashbltest3.spamassassin.org
 jykf2a5v6asavfel3stymlmieh4e66jeroxuw52mc5xhdylnyb7a.hashbltest3.spamassassin.org
@@ -44,6 +46,7 @@ w3hcrlct6yshq5vq6gjv2hf3pzk3jvsk6ilj5iak
 userpart.hashbltest7.spamassassin.org
 host.domain.com.hashbltest7.spamassassin.org
 domain.com.hashbltest7.spamassassin.org
+2qlyngefopecg66lt6pwfpegjaajbzasuxs5vzgii2vfbonj6rua.hashbltest8.spamassassin.org
 );
 
 sub check_queries {
@@ -58,16 +61,21 @@ sub check_queries {
     print STDERR $line if $line =~ /warn:/;
     while ($line =~ m,([^\s/]+\.hashbltest\d\.spamassassin\.org)\b,g) {
       my $query = $1;
-      $found{$query}++;
       if (!grep { $query eq $_ } @valid_queries) {
         $invalid{$query}++;
+      } else {
+        $found{$query}++;
       }
     }
   }
   close WL;
-  diag("Invalid query launched: $_") foreach (keys %invalid);
+  diag("Unwanted query launched: $_") foreach (keys %invalid);
   unless (keys %found == @valid_queries) {
-    diag("Incorrect amount of queries launched");
+    foreach (@valid_queries) {
+      if (!exists $found{$_}) {
+        diag("Query not launched: $_");
+      }
+    }
     return 0;
   }
   return !%invalid;
@@ -112,6 +120,11 @@ tstlocalrules(q{
   header __X_HASHBL_UHD2 eval:check_hashbl_emails('hashbltest7.spamassassin.org', 'raw/host', 'body', '^', 'domacl')
   header __X_HASHBL_UHD3 eval:check_hashbl_emails('hashbltest7.spamassassin.org', 'raw/domain', 'body', '^', 'domacl')
 
+  hashbl_email_domain_alias domain.com aliasdomain.com
+  hashbl_acl_domaincom domain.com
+  header   X_HASHBL_ALIAS_NODOT eval:check_hashbl_emails('hashbltest8.spamassassin.org', 'sha256/nodot', 'body', '^127\.', 'domaincom')
+  tflags   X_HASHBL_ALIAS_NODOT net
+
   # Bug 7897 - test that meta rules depending on net rules hit
   meta META_HASHBL_EMAIL X_HASHBL_EMAIL
   # It also needs to hit even if priority is lower than dnsbl (-100)