Hello,

I wrote a little patch for the SPF plugin to detect domains authenticating any IP by SPF.
Usage:

local.cf
  header SPF_PASS_PLUSALL                 eval:check_for_spf_pass_plusall()
header SPF_HELO_PASS_PLUSALL eval:check_for_spf_helo_pass_plusall()
  describe SPF_PASS_PLUSALL               SPF: SPF record allow any sender
  describe SPF_HELO_PASS_PLUSALL          SPF: SPF record allow any HELO
lang de describe SPF_PASS_PLUSALL SPF: SPF-Datensatz erlaubt beliebige Senderechner lang de describe SPF_HELO_PASS_PLUSALL SPF: SPF-Datensatz erlaubt beliebige HELO-Namen
  score SPF_PASS_PLUSALL                  0.001
  score SPF_HELO_PASS_PLUSALL             0.001

Unfortunately I found also domains not really sending spam use "+all" ¹)
Any comments?

Andreas


¹) https://listi.jpberlin.de/pipermail/postfixbuch-users/2015-April/062921.html


Index: spamassassin-3.4.0/lib/Mail/SpamAssassin/Plugin/SPF.pm
===================================================================
--- spamassassin-3.4.0.orig/lib/Mail/SpamAssassin/Plugin/SPF.pm
+++ spamassassin-3.4.0/lib/Mail/SpamAssassin/Plugin/SPF.pm
@@ -55,11 +55,13 @@ sub new {
   bless ($self, $class);
 
   $self->register_eval_rule ("check_for_spf_pass");
+  $self->register_eval_rule ("check_for_spf_pass_plusall");
   $self->register_eval_rule ("check_for_spf_neutral");
   $self->register_eval_rule ("check_for_spf_none");
   $self->register_eval_rule ("check_for_spf_fail");
   $self->register_eval_rule ("check_for_spf_softfail");
   $self->register_eval_rule ("check_for_spf_helo_pass");
+  $self->register_eval_rule ("check_for_spf_helo_pass_plusall");
   $self->register_eval_rule ("check_for_spf_helo_neutral");
   $self->register_eval_rule ("check_for_spf_helo_none");
   $self->register_eval_rule ("check_for_spf_helo_fail");
@@ -231,6 +233,12 @@ sub check_for_spf_pass {
   $scanner->{spf_pass};
 }
 
+sub check_for_spf_pass_plusall {
+  my ($self, $scanner) = @_;
+  $self->_check_spf ($scanner, 0) unless $scanner->{spf_checked};
+  $scanner->{spf_pass_plusall};
+}
+
 sub check_for_spf_neutral {
   my ($self, $scanner) = @_;
   $self->_check_spf ($scanner, 0) unless $scanner->{spf_checked};
@@ -264,6 +272,12 @@ sub check_for_spf_helo_pass {
   $scanner->{spf_helo_pass};
 }
 
+sub check_for_spf_helo_pass_plusall {
+  my ($self, $scanner) = @_;
+  $self->_check_spf ($scanner, 1) unless $scanner->{spf_helo_checked};
+  $scanner->{spf_helo_pass_plusall};
+}
+
 sub check_for_spf_helo_neutral {
   my ($self, $scanner) = @_;
   $self->_check_spf ($scanner, 1) unless $scanner->{spf_helo_checked};
@@ -377,6 +391,7 @@ sub _check_spf {
 	  # we'd set these if we actually did the check
 	  $scanner->{"spf_${identity}checked"} = 1;
 	  $scanner->{"spf_${identity}pass"} = 0;
+	  $scanner->{"spf_${identity}pass_plusall"} = 0;
 	  $scanner->{"spf_${identity}neutral"} = 0;
 	  $scanner->{"spf_${identity}none"} = 0;
 	  $scanner->{"spf_${identity}fail"} = 0;
@@ -426,6 +441,7 @@ sub _check_spf {
           # we'd set these if we actually did the check
           $scanner->{"spf_${identity}checked"} = 1;
           $scanner->{"spf_${identity}pass"} = 0;
+          $scanner->{"spf_${identity}pass_plusall"} = 0;
           $scanner->{"spf_${identity}neutral"} = 0;
           $scanner->{"spf_${identity}none"} = 0;
           $scanner->{"spf_${identity}fail"} = 0;
@@ -520,6 +536,7 @@ sub _check_spf {
     # SPF HELO-checking variant
     $scanner->{spf_helo_checked} = 1;
     $scanner->{spf_helo_pass} = 0;
+    $scanner->{spf_helo_pass_plusall} = 0;
     $scanner->{spf_helo_neutral} = 0;
     $scanner->{spf_helo_none} = 0;
     $scanner->{spf_helo_fail} = 0;
@@ -529,6 +546,7 @@ sub _check_spf {
     # SPF on envelope sender (where possible)
     $scanner->{spf_checked} = 1;
     $scanner->{spf_pass} = 0;
+    $scanner->{spf_pass_plusall} = 0;
     $scanner->{spf_neutral} = 0;
     $scanner->{spf_none} = 0;
     $scanner->{spf_fail} = 0;
@@ -674,7 +692,10 @@ sub _check_spf {
   $text =~ s/\s+/ /gs;		# no newlines please
 
   if ($ishelo) {
-    if ($result eq 'pass') { $scanner->{spf_helo_pass} = 1; }
+    if ($result eq 'pass') {
+      $scanner->{spf_helo_pass} = 1;
+      $scanner->{spf_helo_pass_plusall} = 1 if $text =~ /\'all\' matched/;
+    }
     elsif ($result eq 'neutral') { $scanner->{spf_helo_neutral} = 1; }
     elsif ($result eq 'none') { $scanner->{spf_helo_none} = 1; }
     elsif ($result eq 'fail') { $scanner->{spf_helo_fail} = 1; }
@@ -684,7 +705,10 @@ sub _check_spf {
       $scanner->{spf_helo_failure_comment} = "SPF failed: $comment";
     }
   } else {
-    if ($result eq 'pass') { $scanner->{spf_pass} = 1; }
+    if ($result eq 'pass') {
+      $scanner->{spf_pass} = 1;
+      $scanner->{spf_pass_plusall} = 1 if $text =~ /\'all\' matched/;
+    }
     elsif ($result eq 'neutral') { $scanner->{spf_neutral} = 1; }
     elsif ($result eq 'none') { $scanner->{spf_none} = 1; }
     elsif ($result eq 'fail') { $scanner->{spf_fail} = 1; }

Reply via email to