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 2011/09/08 01:40:42 UTC

svn commit: r1166471 - in /spamassassin/trunk/lib/Mail/SpamAssassin: Conf.pm Conf/Parser.pm

Author: mmartinec
Date: Wed Sep  7 23:40:42 2011
New Revision: 1166471

URL: http://svn.apache.org/viewvc?rev=1166471&view=rev
Log:
Bug 6657: tighten header rule parsing syntax check, improve error message for a header rule like "exists:References:addr"

Modified:
    spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
    spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm?rev=1166471&r1=1166470&r2=1166471&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm Wed Sep  7 23:40:42 2011
@@ -98,7 +98,7 @@ use vars qw{
   $CONF_TYPE_ADDRLIST $CONF_TYPE_TEMPLATE
   $CONF_TYPE_STRINGLIST $CONF_TYPE_IPADDRLIST
   $CONF_TYPE_NOARGS
-  $INVALID_VALUE $MISSING_REQUIRED_VALUE
+  $MISSING_REQUIRED_VALUE $INVALID_VALUE $INVALID_HEADER_FIELD_NAME
   @MIGRATED_SETTINGS
   $COLLECT_REGRESSION_TESTS
 
@@ -145,8 +145,9 @@ $CONF_TYPE_TEMPLATE         =  6;
 $CONF_TYPE_NOARGS           =  7;
 $CONF_TYPE_STRINGLIST       =  8;
 $CONF_TYPE_IPADDRLIST       =  9;
-$MISSING_REQUIRED_VALUE     = -99999999999999;
-$INVALID_VALUE              = -99999999999998;
+$MISSING_REQUIRED_VALUE     = '-99999999999999';  # string expected by parser
+$INVALID_VALUE              = '-99999999999998';
+$INVALID_HEADER_FIELD_NAME  = '-99999999999997';
 
 # set to "1" by the test suite code, to record regression tests
 # $Mail::SpamAssassin::Conf::COLLECT_REGRESSION_TESTS = 1;
@@ -2526,11 +2527,13 @@ If you add or modify a test, please be s
 by running C<spamassassin --lint>.  This will avoid confusing error
 messages, or other tests being skipped as a side-effect.
 
-=item header SYMBOLIC_TEST_NAME exists:name_of_header
+=item header SYMBOLIC_TEST_NAME exists:header_field_name
 
-Define a header existence test.  C<name_of_header> is the name of a
-header field to test for existence.  This is just a very simple version
-of the above header tests.
+Define a header field existence test.  C<header_field_name> is the name
+of a header field to test for existence.  Not to be confused with a
+test for an empty header field body, which can be implemented with a
+C<header SYMBOLIC_TEST_NAME header_field_name op /pattern/modifiers>
+rule described above.
 
 =item header SYMBOLIC_TEST_NAME eval:name_of_eval_method([arguments])
 
@@ -2644,19 +2647,26 @@ name.
       my ($self, $key, $value, $line) = @_;
       local ($1,$2);
       if ($value =~ /^(\S+)\s+(?:rbl)?eval:(.*)$/) {
-        my ($name, $fn) = ($1, $2);
+        my ($rulename, $fn) = ($1, $2);
 
         if ($fn =~ /^check_(?:rbl|dns)/) {
-          $self->{parser}->add_test ($name, $fn, $TYPE_RBL_EVALS);
+          $self->{parser}->add_test ($rulename, $fn, $TYPE_RBL_EVALS);
         }
         else {
-          $self->{parser}->add_test ($name, $fn, $TYPE_HEAD_EVALS);
+          $self->{parser}->add_test ($rulename, $fn, $TYPE_HEAD_EVALS);
         }
       }
-      elsif ($value =~ /^(\S+)\s+exists:([!-9;-\176]+)$/) {
+      elsif ($value =~ /^(\S+)\s+exists:(.*)$/) {
+        my ($rulename, $header_name) = ($1, $2);
         # RFC 5322 section 3.6.8, ftext printable US-ASCII ch not including ":"
-        $self->{parser}->add_test ($1, "defined($2)", $TYPE_HEAD_TESTS);
-        $self->{descriptions}->{$1} = "Found a $2 header";
+        if ($header_name !~ /\S/) {
+	  return $MISSING_REQUIRED_VALUE;
+        } elsif ($header_name !~ /^([!-9;-\176]+)$/) {
+          return $INVALID_HEADER_FIELD_NAME;
+        }
+        $self->{parser}->add_test ($rulename, "defined($header_name)",
+                                   $TYPE_HEAD_TESTS);
+        $self->{descriptions}->{$rulename} = "Found a $header_name header";
       }
       else {
 	my @values = split(/\s+/, $value, 2);

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm?rev=1166471&r1=1166470&r2=1166471&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Wed Sep  7 23:40:42 2011
@@ -91,6 +91,10 @@ that a value be set, but one was not pro
 C<$Mail::SpamAssassin::Conf::INVALID_VALUE> -- this setting requires a value
 from a set of 'valid' values, but the user provided an invalid one.
 
+C<$Mail::SpamAssassin::Conf::INVALID_HEADER_FIELD_NAME> -- this setting
+requires a syntactically valid header field name, but the user provided
+an invalid one.
+
 Any other values -- including C<undef> -- returned from the subroutine are
 considered to mean 'success'.
 
@@ -430,6 +434,13 @@ sub parse {
                         "skipping: $line";
         goto failed_line;
       }
+      elsif ($ret && $ret eq $Mail::SpamAssassin::Conf::INVALID_HEADER_FIELD_NAME)
+      {
+        $parse_error = "config: SpamAssassin failed to parse line, ".
+                        "\"$value\" does not specify a valid header field name for \"$key\", ".
+                        "skipping: $line";
+        goto failed_line;
+      }
       elsif ($ret && $ret eq $Mail::SpamAssassin::Conf::MISSING_REQUIRED_VALUE)
       {
         $parse_error = "config: SpamAssassin failed to parse line, ".