-
Notifications
You must be signed in to change notification settings - Fork 70
/
body_str.t
executable file
·172 lines (143 loc) · 3.59 KB
/
body_str.t
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
#!/usr/bin/perl -w -T
# test URIs with UTF8 IDNA-equivalent dots between domains instead of ordinary '.'
use strict;
use lib '.'; use lib 't';
use SATest; sa_t_init("body_str.t");
use Test::More tests => 12;
use Mail::SpamAssassin;
my $header = <<'EOH';
Message-ID: <clean.1010101@example.com>
Date: Mon, 07 Oct 2002 09:00:00 +0000
From: Sender <sender@example.com>
MIME-Version: 1.0
To: Recipient <recipient@example.com>
Subject: SUBJECT X
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 8bit
EOH
sub write_mail {
my $body = shift;
return $header.$body;
}
sub run_sa {
my $message = write_mail(shift);
my $scansize = shift;
my $rawbody_re = shift;
my $body_re = shift;
# initialize SpamAssassin
my $sa = create_saobj({
dont_copy_prefs => 1,
config_text => "
dns_available no
use_auto_whitelist 0
use_bayes 0
util_rb_tld com
rawbody_part_scan_size $scansize
body_part_scan_size $scansize
",
});
$sa->init(0); # parse rules
my $mail = $sa->parse($message);
my $pms = Mail::SpamAssassin::PerMsgStatus->new($sa, $mail);
my $rawbody = join("", @{$pms->get_decoded_body_text_array()});
my $body = join("", @{$pms->get_decoded_stripped_body_text_array()});
my $body_part_scan_size = $pms->{main}->{conf}->{body_part_scan_size};
my $rawbody_part_scan_size = $pms->{main}->{conf}->{rawbody_part_scan_size};
$pms->finish();
$mail->finish();
$sa->finish();
my $rawbody_str = $rawbody;
my $body_str = $body;
$rawbody_str =~ s/\n/\\n/s;
$rawbody_str =~ s/([^ [:graph:]])/sprintf("\\x%s",unpack("H*",$1))/ge;
$body_str =~ s/\n/\\n/s;
$body_str =~ s/([^ [:graph:]])/sprintf("\\x%s",unpack("H*",$1))/ge;
if ($rawbody_part_scan_size != $scansize ||
$body_part_scan_size != $scansize) {
print STDERR "FAIL: scan_size mismatch!\n";
return 0;
}
if ($rawbody !~ /$rawbody_re/) {
print STDERR "FAIL: rawbody mismatch: <BEGIN>$rawbody_str<END>\n";
return 0;
}
if ($body !~ /$body_re/) {
print STDERR "FAIL: body mismatch: <BEGIN>$body_str<END>\n";
return 0;
}
return 1;
}
ok(run_sa(
"FIRST LAST",
0,
qr/^FIRST LAST\z/,
qr/^SUBJECT X\nFIRST LAST\z/
));
ok(run_sa(
"<html><body><p>FIRST LAST</p></body></html>",
0,
qr!^<html><body><p>FIRST LAST</p></body></html>\z!,
qr!^SUBJECT X\n<html><body><p>FIRST LAST</p></body></html>\z!
));
ok(run_sa(
"<html><body><p>FIRST X<p><p>LAST</p></body></html>",
0,
qr!^<html><body><p>FIRST X<p><p>LAST</p></body></html>\z!,
qr!^SUBJECT X\n<html><body><p>FIRST X<p><p>LAST</p></body></html>\z!
));
ok(run_sa(
"FIRST LAST",
9,
qr/^FIRST LAS\z/,
qr/^SUBJECT X\nFIRST LAS\z/
));
ok(run_sa(
"FIRST XYZ\nLAST",
10,
qr/^FIRST XYZ\n\z/,
qr/^SUBJECT X\nFIRST XYZ \z/
));
ok(run_sa(
"FIRST LAST",
11,
qr/^FIRST LAST\z/,
qr/^SUBJECT X\nFIRST LAST\z/
));
ok(run_sa(
"<html><body><p>FIRST LAST</p></body></html>",
11,
qr/^<html><body>\z/,
qr/^SUBJECT X\n<html><body><p>FIRST \z/
));
ok(run_sa(
"FIRST XYZ BA R\nLAST",
11,
qr/^FIRST XYZ BA R\n\z/,
qr/^SUBJECT X\nFIRST XYZ BA R \z/
));
ok(run_sa(
"FIRST" . "X" x 1000 . "LAST",
11,
qr/^FIRSTXXXXXX\z/,
qr/^SUBJECT X\nFIRSTXXXXXX\z/
));
ok(run_sa(
"FIRST" . "X" x 3000 . "LAST",
11,
qr/^FIRSTXXXXXX\z/,
qr/^SUBJECT X\nFIRSTXXXXXX\z/
));
# Is legal because 1-2k extra is allowed while
# searching for boundary
ok(run_sa(
"FIRST" . "X" x 1000 . "\nLAST",
11,
qr/^FIRSTX{1000}\n\z/,
qr/^SUBJECT X\nFIRSTX{1000} \z/
));
ok(run_sa(
"FIRST" . "X" x 3000 . "\nLAST",
11,
qr/^FIRSTXXXXXX\z/,
qr/^SUBJECT X\nFIRSTXXXXXX\z/
));