#!/usr/bin/perl -T
our
$have_patricia
= 0;
eval
{
Net::Patricia->VERSION(1.16);
Net::Patricia->
import
;
$have_patricia
= 1;
};
use
SATest; sa_t_init(
"trust_path"
);
plan
skip_all
=>
"Long running tests disabled"
unless
conf_bool(
'run_long_tests'
);
plan
tests
=> 96;
open
(OLDERR,
">&STDERR"
) ||
die
"Cannot copy STDERR file handle"
;
1
if
*OLDERR
;
tstpre ("
loadplugin Mail::SpamAssassin::Plugin::AWL
");
tstlocalrules ("
clear_originating_ip_headers
originating_ip_headers X-Yahoo-Post-IP X-Originating-IP X-Apparently-From
originating_ip_headers X-SenderIP X-AOL-IP
originating_ip_headers X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp
");
my
@data
= (
q{
Received: from sender.net (127.0.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:01 -0000
}
=>
q{
Trusted: [ ip=127.0.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 127/8
Received: from sender.net (127.0.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:02 -0000
}
=>
q{
Netset-Warn
Trusted: [ ip=127.0.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 127/8 1.2.2.1
Received: from sender.net (127.0.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:03 -0000
}
=>
q{
Netset-Warn
Trusted: [ ip=127.0.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.2/16 !127/8
internal_networks 1.2/16 !127/8
Received: from sender.net (127.0.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:04 -0000
}
=>
q{
Netset-Warn
Patricia-Failure
Trusted: [ ip=127.0.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.2/16
Received: from sender.net (127.0.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:05 -0000
}
=>
q{
Trusted: [ ip=127.0.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
Received: from sender.net (10.0.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:06 -0000
}
=>
q{
Trusted: [ ip=10.0.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.2/16 !1.2/16
Received: from sender.net (1.2.3.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:07 -0000
}
=>
q{
Netset-Warn
Patricia-Failure
Trusted: [ ip=1.2.3.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.2/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:08 -0000
}
=>
q{
Trusted:
Untrusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
}
,
q{
trusted_networks 1.1/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:09 -0000
}
=>
q{
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1/16
internal_networks 1.1/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:10 -0000
}
=>
q{
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
internal_networks 1.1/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:11 -0000
}
=>
q{
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1/16 1.2/16
internal_networks 1.2/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:12 -0000
}
=>
q{
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1/16
internal_networks 1.2.8/24
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:13 -0000
}
=>
q{
Lint-Error
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1.1/24
internal_networks 1.1/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:14 -0000
}
=>
q{
Lint-Error
Patricia-Failure
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks !1.1.1.1 1.1/16
internal_networks 1.1.1.1
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:15 -0000
}
=>
q{
Lint-Error
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1/8 !1.1.1.2
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:16 -0000
}
=>
q{
Netset-Warn
Patricia-Failure
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1/16
internal_networks !4.3.2.1 1.1/16
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:17 -0000
}
=>
q{
Trusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1/16
msa_networks 1.1.1.2
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:18 -0000
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:18 -0000
Received: from sender.net (5.5.5.5) by receiver.net
with SMTP; 10 Nov 2005 00:00:18 -0000
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ] [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=1 ] [ ip=5.5.5.5 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1.1/16
internal_networks !1.1.1.2 1.1/16
msa_networks 1.1.1.2
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:19 -0000
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:19 -0000
Received: from sender.net (5.5.5.5) by receiver.net
with SMTP; 10 Nov 2005 00:00:19 -0000
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ] [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=1 ] [ ip=5.5.5.5 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks !1.1.1.2 1.1/16 5.5.5.5
msa_networks 5.5.5.5
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:20 -0000
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:20 -0000
Received: from sender.net (5.5.5.5) by receiver.net
with SMTP; 10 Nov 2005 00:00:20 -0000
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted: [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ] [ ip=5.5.5.5 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
}
,
q{
trusted_networks 1.1/16
msa_networks 5.5.5.5
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:21 -0000
Received: from sender.net (1.1.1.2) by receiver.net
with SMTP; 10 Nov 2005 00:00:21 -0000
Received: from sender.net (5.5.5.5) by receiver.net
with SMTP; 10 Nov 2005 00:00:21 -0000
}
=>
q{
Lint-Error
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ] [ ip=1.1.1.2 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted: [ ip=5.5.5.5 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
}
,
q{
trusted_networks 1/8 !1/8
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:22 -0000
}
=>
q{
Netset-Warn
Patricia-Failure
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1/8
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:23 -0000
X-Originating-IP: 2.2.2.2
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted: [ ip=2.2.2.2 rdns= helo= by= ident= envfrom= intl=0 id= auth= msa=0 ]
}
,
q{
trusted_networks 1/8 2/8
internal_networks 1/8
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:24 -0000
X-Originating-IP: 2.2.2.2
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ] [ ip=2.2.2.2 rdns= helo= by= ident= envfrom= intl=0 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1/8
msa_networks 1/8
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:25 -0000
X-Originating-IP: 2.2.2.2
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=1 ] [ ip=2.2.2.2 rdns= helo= by= ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks 1/8 2/8
internal_networks 1/8 2/8
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:26 -0000
X-Originating-IP: 2.2.2.2
}
=>
q{
Trusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ] [ ip=2.2.2.2 rdns= helo= by= ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks !1/8 1/8
Received: from sender.net (1.1.1.1) by receiver.net
with SMTP; 10 Nov 2005 00:00:27 -0000
}
=>
q{
Netset-Warn
Patricia-Failure
Trusted:
Untrusted: [ ip=1.1.1.1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id= auth= msa=0 ]
}
,
q{
trusted_networks DEAD:BEEF:0000:0102:0304:0506:0708:0a0b
Received: from sender.net (sender.net [DEAD:BEEF:0000:0102:0304:0506:0708:0a0b])
by receiver.net (Postfix) with ESMTP id A96E18BD97;
10 Nov 2005 00:00:28 -0000
}
=>
q{
Trusted: [ ip=DEAD:BEEF:0000:0102:0304:0506:0708:0a0b rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id=A96E18BD97 auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks DEAD:BEEF:0000:0102:0304:0506:0708:0a0b
Received: from sender.net (sender.net [IPv6:2002:abcd:ef10::1])
by receiver.net (Postfix) with ESMTP id A96E18BD97;
10 Nov 2005 00:00:29 -0000
}
=>
q{
Trusted:
Untrusted: [ ip=2002:abcd:ef10::1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id=A96E18BD97 auth= msa=0 ]
}
,
q{
Received: from sender.net (::1) by receiver.net
with SMTP; 10 Nov 2005 00:00:30 -0000
}
=>
q{
Trusted: [ ip=::1 rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id= auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks DEAD:BEEF:0000:0102:0304:0506:0708:0000/108
Received: from sender.net (sender.net [DEAD:BEEF:0000:0102:0304:0506:0708:0a0b])
by receiver.net (Postfix) with ESMTP id A96E18BD97;
10 Nov 2005 00:00:31 -0000
}
=>
q{
Trusted: [ ip=DEAD:BEEF:0000:0102:0304:0506:0708:0a0b rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=1 id=A96E18BD97 auth= msa=0 ]
Untrusted:
}
,
q{
trusted_networks DEAD:BEEF:0000:0102:0304:0506:0708:0a0c
Received: from sender.net (sender.net [DEAD:BEEF:0000:0102:0304:0506:0708:0a0b])
by receiver.net (Postfix) with ESMTP id A96E18BD97;
10 Nov 2005 00:00:32 -0000
}
=>
q{
Trusted:
Untrusted: [ ip=DEAD:BEEF:0000:0102:0304:0506:0708:0a0b rdns=sender.net helo=sender.net by=receiver.net ident= envfrom= intl=0 id=A96E18BD97 auth= msa=0 ]
}
,
);
my
(
$i
);
while
(1) {
my
$hdrs
=
shift
@data
;
my
$expected
=
shift
@data
;
$i
++;
print
"Data Set: #$i\n"
;
last
unless
defined
$expected
;
my
$test_failure
= 0;
my
$conf
=
"add_header all Untrusted _RELAYSUNTRUSTED_\n"
.
"add_header all Trusted _RELAYSTRUSTED_\n"
.
"clear_trusted_networks\n"
.
"clear_internal_networks\n"
.
"clear_msa_networks\n"
;
if
(
$hdrs
=~ s/^\s*(trusted_networks\s+[^\n]*)//gs) {
$conf
.= $1.
"\n"
;
}
if
(
$hdrs
=~ s/^\s*(internal_networks\s+[^\n]*)//gs) {
if
($1) {
$conf
.= $1.
"\n"
; }
}
if
(
$hdrs
=~ s/^\s*(msa_networks\s+[^\n]*)//gs) {
if
($1) {
$conf
.= $1.
"\n"
; }
}
tstprefs (
$conf
);
my
$netset_warn
= 0;
my
$fh
;
if
(
$expected
=~ s/^\s
*Netset
-Warn\s*//) {
$fh
= IO::File->new_tmpfile();
open
(STDERR,
">&"
.
fileno
(
$fh
)) ||
die
"Cannot create LOGERR temp file"
;
$netset_warn
= 1;
print
"[netset warning expected here...]\n"
;
}
my
$sa
= create_saobj({
userprefs_filename
=>
$userrules
,
});
ok(
$sa
);
$sa
->{lint_callback} =
sub
{
my
%opts
=
@_
;
print
"lint error: $opts{msg}\n"
;
};
if
(
$expected
=~ s/^\s
*Lint
-Error\s*//) {
print
"[lint error expected here...]\n"
;
ok (
$sa
->lint_rules() != 0) or
$test_failure
=1;
}
else
{
ok (
$sa
->lint_rules() == 0) or
$test_failure
=1;
}
my
$msg
=
$hdrs
.
"\n\n[no body]\n"
;
$msg
=~ s/^\s+(Received|X-\S+): /$1: /gm;
my
$status
=
$sa
->check_message_text (
$msg
);
my
$result
=
$status
->rewrite_mail();
if
(
$netset_warn
) {
open
(STDERR,
">&=OLDERR"
) ||
die
"Cannot reopen STDERR"
;
seek
(
$fh
, 0, 0);
my
$error
=
do
{
local
$/;
<
$fh
>;
};
close
$fh
;
$test_failure
=1;
for
(
split
(/^/m,
$error
)) {
if
(/^netset: /) {
$test_failure
=0;
print
"netset warn: $_"
;
}
else
{
warn
$_
;
}
}
}
$result
=~ s/\n[ \t]+/ /gs;
$result
=~ /(?:\n|^)X-Spam-Trusted: ([^\n]*)\n/s;
my
$relays_t
= $1;
$result
=~ /(?:\n|^)X-Spam-Untrusted: ([^\n]*)\n/s;
my
$relays_u
= $1;
my
$relays
=
"Trusted: $relays_t Untrusted: $relays_u"
;
$relays
=~ s/\s+/ /gs;
$expected
=~ s/\s+/ /gs;
$relays
=~ s/^ //gs;
$expected
=~ s/^ //gs;
$relays
=~ s/ $//gs;
$expected
=~ s/ $//gs;
my
$skip_test
= 0;
if
(
$expected
=~ s/^\s
*Patricia
-Failure\s*//) {
if
(
$have_patricia
> 0) {
$skip_test
= 1;
}
}
if
(
$skip_test
) {
print
"[skipping test known error with Net::Patricia - Bug 6508...]\n"
;
ok (1);
}
else
{
unless
(ok (
$relays
eq
$expected
)) {
$test_failure
= 1;
}
}
if
(
$test_failure
) {
print
"conf: "
, (
'-'
x 67),
"\n"
,
$conf
;
print
"hdr sample: "
, (
'-'
x 67),
$hdrs
, (
'-'
x 78),
"\n\n"
;
print
"expected: $expected\n"
;
print
"got : $relays\n\n"
;
print
"msg : $msg\n\n"
;
die
"Dying on first test failure."
;
}
$status
->finish();
$sa
->finish();
}