You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by jh...@apache.org on 2009/06/21 19:22:31 UTC

svn commit: r787054 - /spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm

Author: jhardin
Date: Sun Jun 21 17:22:31 2009
New Revision: 787054

URL: http://svn.apache.org/viewvc?rev=787054&view=rev
Log:
Add multipass to ReplaceTags.pm - hardcoded limit of 5 passes.

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm?rev=787054&r1=787053&r2=787054&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/ReplaceTags.pm Sun Jun 21 17:22:31 2009
@@ -87,71 +87,80 @@
   for my $type (qw|body_tests rawbody_tests head_tests full_tests uri_tests|) {
     for my $priority (keys %{$conf->{$type}}) {
       while (my ($rule, $re) = each %{$conf->{$type}->{$priority}}) {
-	# skip if not listed by replace_rules
-	next unless $conf->{rules_to_replace}{$rule};
+        # skip if not listed by replace_rules
+        next unless $conf->{rules_to_replace}{$rule};
 
-	if (would_log('dbg', 'replacetags') > 1) {
-	  dbg("replacetags: replacing $rule: $re");
-	}
-
-	my $pre_name;
-	my $post_name;
-	my $inter_name;
-
-	# get modifier tags
-	if ($re =~ s/${start}pre (.+?)${end}//) {
-	  $pre_name = $1;
-	}
-	if ($re =~ s/${start}post (.+?)${end}//) {
-	  $post_name = $1;
-	}
-	if ($re =~ s/${start}inter (.+?)${end}//) {
-	  $inter_name = $1;
-	}
-
-	# this will produce an array of tags to be replaced
-	# for two adjacent tags, an element of "" will be between the two
-	my @re = split(/(<.+?>)/, $re);
-
-	if ($pre_name) {
-	  my $pre = $conf->{replace_pre}->{$pre_name};
-	  if ($pre) {
-	    @re = map { s|($start.+?$end)|$pre$1|; $_; } @re;
-	  }
-        }
-	if ($post_name) {
-	  my $post = $conf->{replace_post}->{$post_name};
-	  if ($post) {
-	    @re = map { s|($start.+?$end)|$1$post|g; $_; } @re;
-	  }
-	}
-	if ($inter_name) {
-	  my $inter = $conf->{replace_inter}->{$inter_name};
-	  if ($inter) {
-	    @re = map { s|^$|$inter|; $_; } @re;
-	  }
-	}
-	for (my $i = 0; $i < @re; $i++) {
-	  if ($re[$i] =~ m|$start(.+?)$end|g) {
-	    my $tag_name = $1;
-	    # if the tag exists, replace it with the corresponding phrase
-	    if ($tag_name) {
-	      my $replacement = $conf->{replace_tag}->{$tag_name};
-	      if ($replacement) {
-		$re[$i] =~ s|$start$tag_name$end|$replacement|g;
-	      }
-	    }
-	  }
+        if (would_log('dbg', 'replacetags') > 1) {
+          dbg("replacetags: replacing $rule: $re");
         }
 
-        $re = join('', @re);
+        my $passes = 0;
+        my $doagain;
 
-	# do the actual replacement
-	$conf->{$type}->{$priority}->{$rule} = $re;
+        do {
+          my $pre_name;
+          my $post_name;
+          my $inter_name;
+          $doagain = 0;
+
+          # get modifier tags
+          if ($re =~ s/${start}pre (.+?)${end}//) {
+            $pre_name = $1;
+          }
+          if ($re =~ s/${start}post (.+?)${end}//) {
+            $post_name = $1;
+          }
+          if ($re =~ s/${start}inter (.+?)${end}//) {
+            $inter_name = $1;
+          }
+
+          # this will produce an array of tags to be replaced
+          # for two adjacent tags, an element of "" will be between the two
+          my @re = split(/(<.+?>)/, $re);
+
+          if ($pre_name) {
+            my $pre = $conf->{replace_pre}->{$pre_name};
+            if ($pre) {
+              @re = map { s|($start.+?$end)|$pre$1|; $_; } @re;
+            }
+          }
+          if ($post_name) {
+            my $post = $conf->{replace_post}->{$post_name};
+            if ($post) {
+              @re = map { s|($start.+?$end)|$1$post|g; $_; } @re;
+            }
+          }
+          if ($inter_name) {
+            my $inter = $conf->{replace_inter}->{$inter_name};
+            if ($inter) {
+              @re = map { s|^$|$inter|; $_; } @re;
+            }
+          }
+          for (my $i = 0; $i < @re; $i++) {
+            if ($re[$i] =~ m|$start(.+?)$end|g) {
+              my $tag_name = $1;
+              # if the tag exists, replace it with the corresponding phrase
+              if ($tag_name) {
+                my $replacement = $conf->{replace_tag}->{$tag_name};
+                if ($replacement) {
+                  $re[$i] =~ s|$start$tag_name$end|$replacement|g;
+                  $doagain = 1 if !$doagain && $replacement =~ /<[^>]+>/;
+                }
+              }
+            }
+          }
+
+          $re = join('', @re);
+
+          # do the actual replacement
+          $conf->{$type}->{$priority}->{$rule} = $re;
+
+          if (would_log('dbg', 'replacetags') > 1) {
+            dbg("replacetags: replaced $rule: $re");
+          }
 
-	if (would_log('dbg', 'replacetags') > 1) {
-	  dbg("replacetags: replaced $rule: $re");
-	}
+          $passes++;
+        } while $doagain && $passes <= 5;
       }
     }
   }
@@ -245,13 +254,13 @@
     code => sub {
       my ($self, $key, $value, $line) = @_;
       unless (defined $value && $value !~ /^$/) {
-	return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
+        return $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE;
       }
       unless ($value =~ /\S+/) {
-	return $Mail::SpamAssassin::Conf::INVALID_VALUE;
+        return $Mail::SpamAssassin::Conf::INVALID_VALUE;
       }
       foreach my $rule (split(' ', $value)) {
-	$conf->{rules_to_replace}->{$rule} = 1;
+        $conf->{rules_to_replace}->{$rule} = 1;
       }
     }
   });