Mailing List Archive

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;