our
@ISA
=
qw(Mail::SpamAssassin::Plugin)
;
sub
new {
my
$class
=
shift
;
my
$mailsaobject
=
shift
;
$class
=
ref
(
$class
) ||
$class
;
my
$self
=
$class
->SUPER::new(
$mailsaobject
);
bless
(
$self
,
$class
);
$self
->register_eval_rule (
"check_subject_in_welcomelist"
,
$Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS
);
$self
->register_eval_rule (
"check_subject_in_whitelist"
,
$Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS
);
$self
->register_eval_rule (
"check_subject_in_blocklist"
,
$Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS
);
$self
->register_eval_rule (
"check_subject_in_blacklist"
,
$Mail::SpamAssassin::Conf::TYPE_HEAD_EVALS
);
$self
->set_config(
$mailsaobject
->{conf});
return
$self
;
}
sub
set_config {
my
(
$self
,
$conf
) =
@_
;
my
@cmds
;
push
(
@cmds
, {
setting
=>
'welcomelist_subject'
,
aliases
=> [
'whitelist_subject'
],
default
=> {},
type
=>
$Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST
,
code
=>
sub
{
my
(
$self
,
$key
,
$value
,
$line
) =
@_
;
$value
=
lc
$value
;
my
$re
=
$value
;
$re
=~ s/([^\*\?_a-zA-Z0-9])/\\$1/g;
$re
=~
tr
/?/./;
$re
=~ s/\*+/\.\*/g;
my
(
$rec
,
$err
) = compile_regexp(
$re
, 0);
if
(!
$rec
) {
warn
"could not compile $key '$value': $err"
;
return
;
}
$conf
->{
$key
}->{
$value
} =
$rec
;
}});
push
(
@cmds
, {
setting
=>
'blocklist_subject'
,
aliases
=> [
'blacklist_subject'
],
default
=> {},
type
=>
$Mail::SpamAssassin::Conf::CONF_TYPE_ADDRLIST
,
code
=>
sub
{
my
(
$self
,
$key
,
$value
,
$line
) =
@_
;
$value
=
lc
$value
;
my
$re
=
$value
;
$re
=~ s/([^\*\?_a-zA-Z0-9])/\\$1/g;
$re
=~
tr
/?/./;
$re
=~ s/\*+/\.\*/g;
my
(
$rec
,
$err
) = compile_regexp(
$re
, 0);
if
(!
$rec
) {
warn
"could not compile $key '$value': $err"
;
return
;
}
$conf
->{
$key
}->{
$value
} =
$rec
;
}});
$conf
->{parser}->register_commands(\
@cmds
);
}
sub
check_subject_in_welcomelist {
my
(
$self
,
$permsgstatus
) =
@_
;
my
$subject
=
$permsgstatus
->get(
'Subject'
);
return
0
unless
$subject
ne
''
;
return
$self
->_check_subject(
$permsgstatus
->{conf}->{welcomelist_subject},
$subject
);
}
*check_subject_in_whitelist
= \
&check_subject_in_welcomelist
;
sub
check_subject_in_blocklist {
my
(
$self
,
$permsgstatus
) =
@_
;
my
$subject
=
$permsgstatus
->get(
'Subject'
);
return
0
unless
$subject
ne
''
;
return
$self
->_check_subject(
$permsgstatus
->{conf}->{blocklist_subject},
$subject
);
}
*check_subject_in_blacklist
= \
&check_subject_in_blocklist
;
sub
_check_subject {
my
(
$self
,
$list
,
$subject
) =
@_
;
$subject
=
lc
$subject
;
return
1
if
defined
(
$list
->{
$subject
});
foreach
my
$regexp
(
values
%{
$list
}) {
if
(
$subject
=~
$regexp
) {
return
1;
}
}
return
0;
}
1;