mirror of
https://git.proxmox.com/git/proxmox-spamassassin
synced 2025-04-28 16:01:29 +00:00
173 lines
3.6 KiB
Perl
Executable File
173 lines
3.6 KiB
Perl
Executable File
#!/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/
|
|
));
|
|
|