Spam level support
authorJamie Cameron <jcameron@webmin.com>
Tue, 26 Feb 2008 22:23:47 +0000 (22:23 +0000)
committerJamie Cameron <jcameron@webmin.com>
Tue, 26 Feb 2008 22:23:47 +0000 (22:23 +0000)
filter/CHANGELOG
filter/edit.cgi
filter/filter-lib.pl
filter/lang/en
filter/save.cgi

index ec8fd37..75848b9 100644 (file)
@@ -14,3 +14,5 @@ Added a Module Config option to create a .forward file automatically that runs p
 Added Module Config options to set the minimum allowed time between autoreplies, and to force use of that minimum.
 ---- Changes since 1.320 ----
 The default From: address for autoreplies now respects the default address set in the user's address book.
+---- Changes since 1.330 ----
+Added a filter condition to match mail with a spam score at or above some level.
index 9557428..71a8b8f 100755 (executable)
@@ -22,6 +22,7 @@ print &ui_hidden("idx", $in{'idx'});
 
 # Start of condition section
 $cmode = $filter->{'condspam'} ? 5 :
+        $filter->{'condlevel'} ? 6 :
          $filter->{'condheader'} ? 4 :
         $filter->{'condtype'} eq '<' ? 3 :
         $filter->{'condtype'} eq '>' ? 2 :
@@ -38,6 +39,11 @@ print &ui_table_row(
        &ui_oneradio("cmode", 5, $text{'edit_cmode5'}, $cmode == 5),
        "", undef, \@tds);
 
+# Spam level is at or above
+print &ui_table_row(
+       &ui_oneradio("cmode", 6, $text{'edit_cmode6'}, $cmode == 6),
+       &ui_textbox("condlevel", $filter->{'condlevel'}, 4), undef, \@tds);
+
 # Check some header
 @headers = ( "From", "To", "Subject", "Cc" );
 $common = &indexoflc($filter->{'condheader'}, @headers) >= 0;
index e626259..5f33661 100644 (file)
@@ -142,14 +142,19 @@ foreach my $r (@pmrc) {
        if ($simple->{'condtype'} ne '<' && $simple->{'condtype'} ne '>' &&
            !$simple->{'body'} &&
            $simple->{'cond'} =~ /^\^?([a-zA-Z0-9\-]+):\s*(.*)/) {
-               if ($1 eq "X-Spam-Status" && $2 eq "Yes") {
+               local ($h, $v) = ($1, $2);
+               if ($h eq "X-Spam-Status" && $v eq "Yes") {
                        # Special case for spam detection
                        $simple->{'condspam'} = 1;
                        }
+               elsif ($h eq "X-Spam-Level" && $v =~ /^(\\\*)+$/) {
+                       # Spam above some level
+                       $simple->{'condlevel'} = length($v)/2;
+                       }
                else {
                        # Match on some header
-                       $simple->{'condheader'} = $1;
-                       $simple->{'condvalue'} = $2;
+                       $simple->{'condheader'} = $h;
+                       $simple->{'condvalue'} = $v;
                        }
                delete($simple->{'cond'});
                }
@@ -210,6 +215,10 @@ local @flags;
 if ($filter->{'condspam'}) {
        @conds = ( [ "", "X-Spam-Status: Yes" ] );
        }
+elsif ($filter->{'condlevel'}) {
+       local $stars = join("", map { "\\*" } (1..$filter->{'condlevel'}));
+       @conds = ( [ "", "X-Spam-Level: $stars" ] );
+       }
 elsif ($filter->{'condheader'}) {
        @conds = ( [ "", $filter->{'condheader'}.": ".
                         $filter->{'condvalue'} ] );
@@ -427,6 +436,9 @@ local $lastalways = 0;
 if ($f->{'condspam'}) {
        $cond = $text{'index_cspam'};
        }
+elsif ($f->{'condlevel'}) {
+       $cond = &text('index_clevel', $f->{'condlevel'});
+       }
 elsif ($f->{'condheader'}) {
        $cond = &text('index_cheader',
                "<tt>$f->{'condheader'}</tt>",
index bec9c36..741c44b 100644 (file)
@@ -11,6 +11,7 @@ index_add=Add a new email filter.
 index_addauto=Quick automatic reply setup.
 index_addfwd=Quick forwarding setup.
 index_cspam=Email is spam
+index_clevel=Spam score is at least $1
 index_cheader=Header $1 matches $2
 index_cre=Headers match $1
 index_cre2=Body matches $1
@@ -47,6 +48,7 @@ edit_cheader=Header $1$2 must match $3
 edit_cmode3=Email smaller than
 edit_cmode2=Email larger than
 edit_cmode5=Email classified as spam
+edit_cmode6=Spam score is at least
 edit_cmode1=Based on regular expression
 edit_cbody=Apply to message body
 edit_other=Other..
@@ -63,6 +65,7 @@ edit_amode7=Save to new folder named
 
 save_err=Failed to save filter
 save_econdheader=Missing or invalid email header
+save_econdlevel=Minimum spam score must be an integer greater than zero
 save_esmall=Missing or invalid maximum mail size
 save_elarge=Missing or invalid minimum mail size
 save_econd=Missing regular expression
index 885cd36..4408b16 100755 (executable)
@@ -25,6 +25,7 @@ else {
 
        # Parse condition first
        delete($filter->{'condspam'});
+       delete($filter->{'condlevel'});
        delete($filter->{'condheader'});
        delete($filter->{'condtype'});
        delete($filter->{'cond'});
@@ -33,9 +34,15 @@ else {
                # Always enabled, so nothing to set!
                }
        elsif ($in{'cmode'} == 5) {
-               # Need to run spamassassin
+               # Match if spamassassin has set header
                $filter->{'condspam'} = 1;
                }
+       elsif ($in{'cmode'} == 6) {
+               # Match by spam level
+               $in{'condlevel'} =~ /^[1-9]\d*$/ ||
+                       &error($text{'save_econdlevel'});
+               $filter->{'condlevel'} = $in{'condlevel'};
+               }
        elsif ($in{'cmode'} == 4) {
                # Check some header
                $filter->{'condheader'} = $in{'condmenu'} || $in{'condheader'};