1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
|
#!/usr/bin/perl -w -T
use strict;
use lib '.'; use lib 't';
use SATest; sa_t_init("reuse");
use vars qw(%patterns %anti_patterns $perl_path &patterns_run_cb);
use Mail::SpamAssassin;
use Test::More;
plan skip_all => "no mass check" unless (-e '../masses/mass-check');
plan skip_all => "mass check script does not run on Windows" if $RUNNING_ON_WINDOWS;
plan tests => 37;
# Tests the following cases:
# - No reuse: no change
# - Reuse and no X-Spam-Status: no change
# - Reuse on: metas work
# - Reuse works with existing tests (disabled)
# - Reuse works with non-existing tests (they get scores)
# - Reuse handles multiple "old rule names"
# - Reuse works in positive and negative cases
# - Rules defined only by "reuse" can have arbitrary scores and priorities set
# Need all files under $localrules for mass-check
foreach my $tainted (<$siterules/*.pre $siterules/languages>) {
$tainted =~ /(.*)/;
my $file = $1;
copy ($file, "$localrules")
or warn "cannot copy $file to $localrules: $!";
}
tstlocalrules('
# suppress RB warnings
util_rb_tld com
# Check that order of reuse/body lines for BODY_RULE_* does not matter
reuse BODY_RULE_1
body BODY_RULE_1 /./
score BODY_RULE_1 1.0
body BODY_RULE_2 /\bfoobar\b/
score BODY_RULE_2 1.0
header HEADER_RULE_1 Subject =~ /\bmessage\b/
meta META_RULE_1 BODY_RULE_1 || BODY_RULE_2
reuse BODY_RULE_2
priority BODY_RULE_2 -2
score BODY_RULE_2 1.5
reuse NEW_RULE OTHER_RULE
priority NEW_RULE -3
score NEW_RULE 0.5
reuse OTHER_RULE
priority OTHER_RULE -4
reuse RENAMED_RULE OLD_RULE_1 OLD_RULE_2 OLD_RULE_3
reuse SCORED_RULE OLD_RULE_2
score SCORED_RULE 2.0
priority SCORED_RULE -1
');
# reuse on, mail has no X-Spam-Status
write_mail(0);
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --reuse --file $workdir/mail.txt > $workdir/noxss.out");
%patterns = (
'BODY_RULE_1' => '',
'HEADER_RULE_1' => '',
'META_RULE_1' => '',
);
%anti_patterns = (
'NEW_RULE' => '',
'OTHER_RULE' => '',
'RENAMED_RULE' => '',
'NONEXISTANT_RULE' => '',
'BODY_RULE_2' => '',
'SCORED_RULE' => '',
);
checkfile("$workdir/noxss.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
# write mail with X-Spam-Status
write_mail(1);
# test without reuse
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --file $workdir/mail.txt > $workdir/noreuse.out");
%patterns = (
'BODY_RULE_1' => '',
'HEADER_RULE_1' => '',
'META_RULE_1' => '',
);
%anti_patterns = (
'NEW_RULE' => '',
'OTHER_RULE' => '',
'RENAMED_RULE' => '',
'NONEXISTANT_RULE' => '',
'BODY_RULE_2' => '',
'SCORED_RULE' => '',
);
checkfile("$workdir/noreuse.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
# test with reuse
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --reuse --file $workdir/mail.txt > $workdir/reuse.out");
%patterns = (
'HEADER_RULE_1' => '',
'BODY_RULE_2' => '',
'META_RULE_1' => '',
'NEW_RULE' => '',
'OTHER_RULE' => '',
'RENAMED_RULE' => '',
'SCORED_RULE' => '',
'Y 8' => '',
);
%anti_patterns = (
'BODY_RULE_1' => '',
'NONEXISTANT_RULE' => '',
);
checkfile("$workdir/reuse.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
tstlocalrules('
# suppress RB warnings
util_rb_tld com
meta META_RULE_1 RULE_A && !RULE_B
body RULE_A /./
reuse RULE_B OTHER_RULE
body RULE_C / does not hit /
meta META_RULE_2 (RULE_A && RULE_B) || RULE_C
');
write_mail(1);
# test with reuse
ok_system("$perl_path -w ../masses/mass-check -c=$localrules --reuse --file $workdir/mail.txt > $workdir/metareuse.out");
%patterns = (
'META_RULE_2' => '',
'RULE_A' => '',
'RULE_B' => '',
);
%anti_patterns = (
'META_RULE_1' => '',
'RULE_C' => '',
);
checkfile("$workdir/metareuse.out", \&patterns_run_cb);
ok_all_patterns();
clear_pattern_counters();
sub write_mail {
my ($x_spam_status) = @_;
my $msg = <<EOF;
Received: from internal.example.com [127.0.0.1] by localhost
for recipient\@example.com; Fri, 07 Oct 2002 09:02:00 +0000
Received: from external.spammer.com (external.spammer.com
[150.51.53.1]) by internal.example.com for recipient\@example.com;
Fri, 07 Oct 2002 09:01:00 +0000
Message-ID: <clean.1010101\@example.com>
Date: Mon, 07 Oct 2002 09:00:00 +0000
From: Sender <sender\@this-spammer.com>
MIME-Version: 1.0
To: Recipient <recipient\@example.com>
Subject: trivial message
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
EOF
if ($x_spam_status) {
$msg .= <<END;
X-Spam-Status: Yes, score=15.3 required=5.0 tests=BODY_RULE_2,
NONEXISTANT_RULE,OTHER_RULE,OLD_RULE_2,OLD_RULE_3
END
}
$msg .= <<END;
This is a test message.
END
tstfile($msg);
}
sub ok_system {
my $cmd = shift;
print "\t$cmd\n";
untaint_system($cmd);
my $exit_code = ($?>>8);
ok ($exit_code == 0)
}
|