our
@ISA
=
qw()
;
sub
new {
my
$class
=
shift
;
$class
=
ref
(
$class
) ||
$class
;
my
$self
= {};
bless
(
$self
,
$class
);
return
$self
;
}
sub
check_rules_at_priority {
my
(
$self
,
$params
) =
@_
;
my
$pms
=
$params
->{permsgstatus};
my
$checkobj
=
$params
->{checkobj};
my
$priority
=
$params
->{priority};
Mail::SpamAssassin::Plugin::Check::do_one_line_body_tests(
$checkobj
,
$pms
,
$priority
);
}
sub
check_start {
my
(
$self
,
$params
) =
@_
;
my
$pms
=
$params
->{permsgstatus};
my
$conf
=
$pms
->{conf};
my
$test_set
=
$conf
->{body_tests};
foreach
my
$pri
(
keys
%{
$test_set
})
{
foreach
my
$rulename
(
keys
%{
$test_set
->{
$pri
}})
{
if
(
$conf
->{generate_body_one_line_sub}->{
$rulename
}) {
$conf
->{one_line_body_tests}->{
$pri
} ||= { };
$conf
->{one_line_body_tests}->{
$pri
}->{
$rulename
} =
$test_set
->{
$pri
}->{
$rulename
};
}
if
(
$conf
->{skip_body_rules}->{
$rulename
}) {
delete
$test_set
->{
$pri
}->{
$rulename
};
}
}
}
}
sub
check_cleanup {
my
(
$self
,
$params
) =
@_
;
my
$pms
=
$params
->{permsgstatus};
my
$scoresptr
=
$pms
->{conf}->{scores};
if
(
$pms
->{conf}->{skip_body_rules}) {
foreach
(
keys
%{
$pms
->{conf}->{skip_body_rules}}) {
$pms
->rule_ready(
$_
, 1)
if
$scoresptr
->{
$_
};
}
}
}
1;
sub
do_one_line_body_tests {
my
(
$self
,
$pms
,
$priority
) =
@_
;
$self
->run_generic_tests (
$pms
,
$priority
,
consttype
=>
$Mail::SpamAssassin::Conf::TYPE_BODY_TESTS
,
type
=>
'one_line_body'
,
testhash
=>
$pms
->{conf}->{one_line_body_tests},
args
=> [ ],
loop_body
=>
sub
{
my
(
$self
,
$pms
,
$conf
,
$rulename
,
$pat
,
%opts
) =
@_
;
my
$sub
= '
my
(
$self
,
$line
) =
@_
;
my
$qrptr
=
$self
->{main}->{conf}->{test_qrs};
';
if
((
$conf
->{tflags}->{
$rulename
}||
''
) =~ /\bmultiple\b/)
{
$sub
.= '
my
$hitsptr
=
$self
->{tests_already_hit};
';
my
(
$max
) =
$conf
->{tflags}->{
$rulename
} =~ /\bmaxhits=(\d+)\b/;
$max
= untaint_var(
$max
);
if
(
$max
) {
$sub
.= '
if
(
$hitsptr
->{
q{'.$rulename.'}
}) {
return
0
if
$hitsptr
->{
q{'.$rulename.'}
} >=
'.$max.'
;
}
';
}
$sub
.= '
my
$lref
= \
$line
;
pos
$$lref
= 0;
'.$self->hash_line_for_rule($pms, $rulename).'
while
(
$$lref
=~ /
$qrptr
->{
q{'.$rulename.'}
}/gop) {
$self
->got_hit(
q{'.$rulename.'}
,
"BODY: "
,
ruletype
=>
"one_line_body"
);
'. $self->hit_rule_plugin_code($pms, $rulename, "one_line_body", "") . '
'. ($max? '
last
if
$hitsptr
->{
q{'.$rulename.'}
} >=
'.$max.'
;
' : '
') . '
}
';
}
else
{
$sub
.= '
'.$self->hash_line_for_rule($pms, $rulename).'
if
(
$line
=~ /
$qrptr
->{
q{'.$rulename.'}
}/op) {
$self
->got_hit(
q{'.$rulename.'}
,
"BODY: "
,
ruletype
=>
"one_line_body"
);
'. $self->hit_rule_plugin_code($pms, $rulename, "one_line_body", "return 1") . '
}
';
}
$sub
.= '
$self
->rule_ready(
q{'.$rulename.'}
, 1);
';
return
if
(
$opts
{doing_user_rules} &&
!
$self
->is_user_rule_sub(
$rulename
.
'_one_line_body_test'
));
$self
->add_temporary_method (
$rulename
.
'_one_line_body_test'
,
$sub
);
},
pre_loop_body
=>
sub
{
my
(
$self
,
$pms
,
$conf
,
%opts
) =
@_
;
$self
->add_evalstr(
$pms
, '
my
$bodytext
=
$self
->get_decoded_stripped_body_text_array();
$self
->{main}->call_plugins(
"run_body_fast_scan"
, {
permsgstatus
=>
$self
,
ruletype
=>
"body"
,
priority
=>
'.$opts{priority}.'
,
lines
=>
$bodytext
});
');
});
}
1;