You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by fe...@apache.org on 2005/03/06 08:54:04 UTC

svn commit: r156296 - spamassassin/trunk/lib/Mail/SpamAssassin.pm spamassassin/trunk/lib/Mail/SpamAssassin/Bayes.pm spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm

Author: felicity
Date: Sat Mar  5 23:54:02 2005
New Revision: 156296

URL: http://svn.apache.org/viewcvs?view=rev&rev=156296
Log:
bug 3704: if a message was already learned, don't autolearn it in the opposite way.  added in no_relearn option to init_learner(), and changed init_learner() to go through a key/value pair array instead of numerous if/then statements to make it cleaner.  also init_learner() now returns the original values so a change can be undone later on.

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Bayes.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin.pm
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/lib/Mail/SpamAssassin.pm?view=diff&r1=156295&r2=156296
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin.pm Sat Mar  5 23:54:02 2005
@@ -503,6 +503,11 @@
 During the opportunistic journal sync and expire check, don't actually do the
 expire but report back whether or not it should occur (optional, default 0).
 
+=item no_relearn
+
+If doing a learn operation, and the message has already been learned as
+the opposite type, don't re-learn the message.
+
 =back
 
 =cut
@@ -515,13 +520,24 @@
   # Make sure we're already initialized ...
   $self->init(1);
 
+  my %kv = (
+    'force_expire'			=> 'learn_force_expire',
+    'learn_to_journal'			=> 'learn_to_journal',
+    'caller_will_untie'			=> 'learn_caller_will_untie',
+    'wait_for_lock'			=> 'learn_wait_for_lock',
+    'opportunistic_expire_check_only'	=> 'opportunistic_expire_check_only',
+    'no_relearn'			=> 'learn_no_relearn',
+  );
+
+  my %ret;
+
   # Set any other options that need setting ...
-  if (defined $opts->{force_expire}) { $self->{learn_force_expire} = $opts->{force_expire}; }
-  if (defined $opts->{learn_to_journal}) { $self->{learn_to_journal} = $opts->{learn_to_journal}; }
-  if (defined $opts->{caller_will_untie}) { $self->{learn_caller_will_untie} = $opts->{caller_will_untie}; }
-  if (defined $opts->{wait_for_lock}) { $self->{learn_wait_for_lock} = $opts->{wait_for_lock}; }
-  if (defined $opts->{opportunistic_expire_check_only}) { $self->{opportunistic_expire_check_only} = $opts->{opportunistic_expire_check_only}; }
-  1;
+  while( my($k,$v) = each %kv ) {
+    $ret{$k} = $self->{$v};
+    if (exists $opts->{$k}) { $self->{$v} = $opts->{$k}; }
+  }
+
+  return \%ret;
 }
 
 ###########################################################################

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Bayes.pm
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/lib/Mail/SpamAssassin/Bayes.pm?view=diff&r1=156295&r2=156296
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Bayes.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Bayes.pm Sat Mar  5 23:54:02 2005
@@ -782,6 +782,14 @@
       } elsif ($seen !~ /^[hs]$/) {
         warn("bayes: db_seen corrupt: value='$seen' for $msgid, ignored");
       } else {
+        # bug 3704: If the message was already learned, don't try learning it again.
+        # this prevents, for instance, manually learning as spam, then autolearning
+        # as ham, or visa versa.
+        if ($self->{main}->{learn_no_relearn}) {
+	  dbg("bayes: $msgid already learnt as opposite, not re-learning");
+	  return 0;
+	}
+
         dbg("bayes: $msgid already learnt as opposite, forgetting first");
 
         # kluge so that forget() won't untie the db on us ...

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm
URL: http://svn.apache.org/viewcvs/spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm?view=diff&r1=156295&r2=156296
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/PerMsgStatus.pm Sat Mar  5 23:54:02 2005
@@ -295,6 +295,9 @@
       isspam => $isspam
     });
 
+  # bug 3704: temporarily override learn's ability to re-learn a message
+  my $orig_learner = $self->{main}->init_learner({ "no_relearn" => 1 });
+
   eval {
     my $learnstatus = $self->{main}->learn ($self->{msg}, undef, $isspam, 0);
     $learnstatus->finish();
@@ -307,6 +310,9 @@
       $self->{main}->{bayes_scanner}->sanity_check_is_untied();
     }
   };
+
+  # reset learner options to their original values
+  $self->{main}->init_learner($orig_learner);
 
   if ($@) {
     dbg("learn: auto-learning failed: $@");