You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@spamassassin.apache.org by he...@apache.org on 2020/06/08 07:51:58 UTC

svn commit: r1878582 - in /spamassassin/trunk/lib/Mail/SpamAssassin: Conf.pm Conf/Parser.pm Plugin.pm Plugin/HashBL.pm

Author: hege
Date: Mon Jun  8 07:51:58 2020
New Revision: 1878582

URL: http://svn.apache.org/viewvc?rev=1878582&view=rev
Log:
Bug 7825 - Improve register_eval_rule() to prevent config mistakes

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

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm?rev=1878582&r1=1878581&r2=1878582&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf.pm Mon Jun  8 07:51:58 2020
@@ -117,6 +117,23 @@ my @rule_types = ("body_tests", "uri_tes
                   "full_evals", "rawbody_tests", "rawbody_evals",
 		  "rbl_evals", "meta_tests");
 
+# Map internal ruletype to descriptive ruletype string
+our %TYPE_AS_STRING = (
+  $TYPE_HEAD_TESTS => 'header',
+  $TYPE_HEAD_EVALS => 'header',
+  $TYPE_BODY_TESTS => 'body',
+  $TYPE_BODY_EVALS => 'body',
+  $TYPE_FULL_TESTS => 'full',
+  $TYPE_FULL_EVALS => 'full',
+  $TYPE_RAWBODY_TESTS => 'rawbody',
+  $TYPE_RAWBODY_EVALS => 'rawbody',
+  $TYPE_URI_TESTS => 'uri',
+  $TYPE_URI_EVALS => 'uri',
+  $TYPE_META_TESTS => 'meta',
+  $TYPE_RBL_EVALS => 'header',
+  $TYPE_EMPTY_TESTS => 'empty',
+);
+
 #Removed $VERSION per BUG 6422
 #$VERSION = 'bogus';     # avoid CPAN.pm picking up version strings later
 
@@ -4766,6 +4783,7 @@ sub new {
   $self->{rawbody_evals} = { };
   $self->{meta_tests} = { };
   $self->{eval_plugins} = { };
+  $self->{eval_plugins_types} = { };
   $self->{duplicate_rules} = { };
 
   # map eval function names to rulenames
@@ -5171,8 +5189,15 @@ sub load_plugin_succeeded {
 }
 
 sub register_eval_rule {
-  my ($self, $pluginobj, $nameofsub) = @_;
+  my ($self, $pluginobj, $nameofsub, $ruletype) = @_;
   $self->{eval_plugins}->{$nameofsub} = $pluginobj;
+  if (defined $ruletype) {
+    if (defined $TYPE_AS_STRING{$ruletype}) {
+      $self->{eval_plugins_types}->{$nameofsub} = $ruletype;
+    } else {
+      $self->{parser}->lint_warn("register_eval_rule: invalid ruletype for $nameofsub");
+    }
+  }
 }
 
 ###########################################################################
@@ -5194,8 +5219,8 @@ sub clone {
   # is defined, its method will be recompiled for future scans in
   # order to *remove* the generated method calls
   my @NON_COPIED_KEYS = qw(
-    main eval_plugins plugins_loaded registered_commands sed_path_cache parser
-    scoreset scores want_rebuild_for_type
+    main eval_plugins eval_plugins_types plugins_loaded registered_commands
+    sed_path_cache parser scoreset scores want_rebuild_for_type
   );
 
   # special cases.  first, skip anything that cannot be changed

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm?rev=1878582&r1=1878581&r2=1878582&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Conf/Parser.pm Mon Jun  8 07:51:58 2020
@@ -887,7 +887,14 @@ sub finish_parsing {
           $self->lint_warn("syntax error for eval function $name: $text");
           next;
         }
-        elsif ($type == $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS) {
+        my $expected_type = $conf->{eval_plugins_types}->{$function};
+        if (defined $expected_type && $type != $expected_type) {
+          my $estr = $Mail::SpamAssassin::Conf::TYPE_AS_STRING{$expected_type};
+          $self->lint_warn("wrong rule type defined for $name, expected '$estr'");
+          next;
+        }
+
+        if ($type == $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS) {
           $conf->{body_evals}->{$priority}->{$name} = [ $function, [@$argsref] ];
         }
         elsif ($type == $Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS) {

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm?rev=1878582&r1=1878581&r2=1878582&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin.pm Mon Jun  8 07:51:58 2020
@@ -1042,17 +1042,27 @@ to receive specific events, or control t
 
 =over 4
 
-=item $plugin->register_eval_rule ($nameofevalsub)
+=item $plugin->register_eval_rule ($nameofevalsub, $ruletype)
 
 Plugins that implement an eval test will need to call this, so that
 SpamAssassin calls into the object when that eval test is encountered.
 See the B<REGISTERING EVAL RULES> section for full details.
 
+Since 4.0, optional $ruletype can be specified to enforce that eval function
+cannot be called with wrong ruletype from configuration, for example user
+using "header FOO eval:foobar()" instead of "body FOO eval:foobar()". 
+Mismatch will result in lint failure. $ruletype can be one of:
+
+  $Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS
+  $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS
+  $Mail::SpamAssassin::Conf::TYPE_RAWBODY_EVALS
+  $Mail::SpamAssassin::Conf::TYPE_FULL_EVALS
+
 =cut
 
 sub register_eval_rule {
-  my ($self, $nameofsub) = @_;
-  $self->{main}->{conf}->register_eval_rule ($self, $nameofsub);
+  my ($self, $nameofsub, $ruletype) = @_;
+  $self->{main}->{conf}->register_eval_rule ($self, $nameofsub, $ruletype);
 }
 
 =item $plugin->register_generated_rule_method ($nameofsub)
@@ -1161,7 +1171,7 @@ called from rules in the configuration f
 
 For example,
 
-  $plugin->register_eval_rule ('check_for_foo')
+  $plugin->register_eval_rule ('check_for_foo', $Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS)
 
 will cause C<$plugin-E<gt>check_for_foo()> to be called for this
 SpamAssassin rule:

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm
URL: http://svn.apache.org/viewvc/spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm?rev=1878582&r1=1878581&r2=1878582&view=diff
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm (original)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/Plugin/HashBL.pm Mon Jun  8 07:51:58 2020
@@ -159,9 +159,9 @@ sub new {
     $self->{hashbl_available} = 1;
   }
 
-  $self->register_eval_rule("check_hashbl_emails");
-  $self->register_eval_rule("check_hashbl_uris");
-  $self->register_eval_rule("check_hashbl_bodyre");
+  $self->register_eval_rule("check_hashbl_emails", $Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS);
+  $self->register_eval_rule("check_hashbl_uris", $Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS);
+  $self->register_eval_rule("check_hashbl_bodyre", $Mail::SpamAssassin::Conf::TYPE_BODY_EVALS);
   $self->set_config($mailsa->{conf});
 
   return $self;