You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by mm...@apache.org on 2009/08/06 18:28:06 UTC

svn commit: r801707 - in /spamassassin/trunk/lib/Mail: SpamAssassin.pm SpamAssassin/PerMsgStatus.pm SpamAssassin/Plugin/Check.pm

Author: mmartinec
Date: Thu Aug  6 16:28:06 2009
New Revision: 801707

URL: http://svn.apache.org/viewvc?rev=801707&view=rev
Log:
Bug 5463: enhance got_hit API for dynamic scores & descriptions
(loosely based on the patch provided there)

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin.pm?rev=801707&r1=801706&r2=801707&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin.pm Thu Aug  6 16:28:06 2009
@@ -470,7 +470,7 @@
 represent unnecessary work for SpamAssassin to obtain it. The argument will
 be stored to a Mail::SpamAssassin::Message object as 'suppl_attrib', thus
 made available to the rest of the code as well as to plugins. The exact list
-of attributes will evolve through time, any unknown attributes should be
+of attributes will evolve through time, any unknown attribute should be
 ignored. Possible examples are: SMTP envelope information, a flag indicating
 that a message as supplied by a caller was truncated due to size limit, an
 already verified list of DKIM signature objects, or perhaps a list of rule

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm?rev=801707&r1=801706&r2=801707&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm Thu Aug  6 16:28:06 2009
@@ -2170,6 +2170,12 @@
 C<hit_rule> plugin call, called by this method.  If unset, I<'unknown'> is
 used.
 
+=item description => $string
+
+Optional: a custom rule description string.  This is used in the
+C<hit_rule> plugin call, called by this method. If unset, the static
+description is used.
+
 =back
 
 Backwards compatibility: the two mandatory arguments have been part of this API
@@ -2181,21 +2187,29 @@
 sub got_hit {
   my ($self, $rule, $area, %params) = @_;
 
+  my $conf_ref = $self->{conf};
+
+  my $dynamic_score_provided;
   my $score = $params{score};
-  $score = $self->{conf}->{scores}->{$rule}  if !defined $score;
+  if (defined $score) {
+    $dynamic_score_provided = 1;
+  } else {
+    $score = $conf_ref->{scores}->{$rule};
+  }
 
   # adding a hit does nothing if we don't have a score -- we probably
   # shouldn't have run it in the first place
   return unless $score;
 
-  # ensure that rule values always result in an *increase* of
-  # $self->{tests_already_hit}->{$rule}:
-  my $value = $params{value}; if (!$value || $value <= 0) { $value = 1; }
+  # ensure that rule values always result in an *increase*
+  # of $self->{tests_already_hit}->{$rule}:
+  my $value = $params{value};
+  if (!$value || $value <= 0) { $value = 1 }
 
   my $already_hit = $self->{tests_already_hit}->{$rule} || 0;
 
   # don't count hits multiple times, unless 'tflags multiple' is on
-  if ($already_hit && ($self->{conf}->{tflags}->{$rule}||'') !~ /\bmultiple\b/) {
+  if ($already_hit && ($conf_ref->{tflags}->{$rule}||'') !~ /\bmultiple\b/) {
     return;
   }
 
@@ -2204,7 +2218,16 @@
   # default ruletype, if not specified:
   $params{ruletype} ||= 'unknown';
 
-  my $rule_descr = $self->{conf}->get_description_for_rule($rule);
+  if ($dynamic_score_provided) {  # copy it to static for proper reporting
+    $conf_ref->{scoreset}->[$_]->{$rule} = $score  for (0..3);
+  }
+
+  my $rule_descr = $params{description};
+  if (defined $rule_descr) {
+    $conf_ref->{descriptions}->{$rule} = $rule_descr;  # save dynamic descr.
+  } else {
+    $rule_descr = $conf_ref->get_description_for_rule($rule);  # static
+  }
   $rule_descr = $rule  if !defined $rule_descr || $rule_descr eq '';
   $self->_handle_hit($rule,
             $score,
@@ -2213,7 +2236,7 @@
             $rule_descr);
 
   # take care of duplicate rules, too (bug 5206)
-  my $dups = $self->{conf}->{duplicate_rules}->{$rule};
+  my $dups = $conf_ref->{duplicate_rules}->{$rule};
   if ($dups && @{$dups}) {
     foreach my $dup (@{$dups}) {
       $self->got_hit($dup, $area, %params);

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm?rev=801707&r1=801706&r2=801707&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/Check.pm Thu Aug  6 16:28:06 2009
@@ -52,24 +52,20 @@
   if (defined $suppl_attrib && ref $suppl_attrib->{rule_hits}) {
     my @caller_rule_hits = @{$suppl_attrib->{rule_hits}};
     dbg("check: adding caller rule hits, %d rules", scalar(@caller_rule_hits));
-    my($tflags_ref,$scoreset_ref,$descr_ref) =
-      @{$pms->{conf}}{'tflags','scoreset','descriptions'};
+    my($tflags_ref) = $pms->{conf}->{tflags};
     for my $caller_rule_hit (@caller_rule_hits) {
       next if ref $caller_rule_hit ne 'HASH';
       my($rulename, $area, $score, $value, $ruletype, $tflags, $description) =
         @$caller_rule_hit{qw(rule area score value ruletype tflags descr)};
-      if (defined $description) { $descr_ref->{$rulename} = $description }
-      if (defined $score) {
-        $scoreset_ref->[$_]->{$rulename} = $score  for (0..3);
-      }
       if (defined $tflags) {
         $_ = join(' ', !defined $_ ? () : split(' '),
                        split(/[ \t,]+/,$tflags))  for $tflags_ref->{$rulename};
       }
       $pms->got_hit($rulename, $area,
-                    !defined $score ? () : (score=>$score),
-                    !defined $value ? () : (value=>$value),
-                    ruletype=>$ruletype);
+                    !defined $score ? () : (score => $score),
+                    !defined $value ? () : (value => $value),
+                    !defined $description ? () : (description => $description),
+                    ruletype => $ruletype);
     }
   }