]> git.proxmox.com Git - pmg-api.git/blame - src/tests/test_greylist.pl
add new What Object 'Match Archive Filename'
[pmg-api.git] / src / tests / test_greylist.pl
CommitLineData
a75bd17b
DM
1#!/usr/bin/perl
2
3use strict;
4use warnings;
7f0a6c36
DM
5use lib '..';
6
a75bd17b
DM
7use Socket;
8use IO::Socket::INET;
9use DBI;
10
11use PVE::SafeSyslog;
12
13use PMG::DBTools;
14use PMG::RuleDB;
15
16my $greylist_delay = 3*60;
17my $greylist_lifetime = 3600*24*2; #retry window
18my $greylist_awlifetime = 3600*24*36;
19
20initlog($0, 'mail');
21
7e293a63
TL
22my $testdb = 'Proxmox_testdb';
23my $testport = 10122;
24my $testpidfn = "greylist-test-$$.pid";
a75bd17b 25
7e293a63 26system ("perl -I.. ../bin/pmgpolicy -d $testdb -t --port $testport --pidfile '$testpidfn'");
a75bd17b
DM
27
28sub reset_gldb {
7e293a63 29 my $dbh = PMG::DBTools::open_ruledb($testdb);
a75bd17b
DM
30 $dbh->do ("DELETE FROM CGreylist");
31 $dbh->disconnect();
32}
33
34reset_gldb();
35
36my $sock = IO::Socket::INET->new(
7e293a63
TL
37 PeerAddr => '127.0.0.1',
38 PeerPort => $testport) ||
a75bd17b
DM
39 die "unable to open socket - $!";
40
41$/ = "\n\n";
42
43my $testtime = 1;
44my $starttime = $testtime;
45
46my $icount = 0;
47
48sub gltest {
49 my ($data, $ttime, $eres) = @_;
7e293a63 50
a75bd17b
DM
51 $icount++;
52
53 print $sock "testtime=$ttime\ninstance=$icount\n$data\n";
54 $sock->flush;
55 my $res = <$sock>;
56 chomp $res;
57 my $timediff = $ttime - $starttime;
7e293a63 58 die "unexpected result at time $timediff: $res != $eres\n$data" if !($res =~ m/^action=$eres(\s.*)?/);
a75bd17b
DM
59}
60
61# a normal record
62
63my $data = <<_EOD;
64request=smtpd_access_policy
65protocol_state=RCPT
66protocol_name=SMTP
67client_address=1.2.3.4
68client_name=test.domain.tld
69helo_name=test.domain.tld
70sender=test1\@test.domain.tld
71recipient=test1\@proxmox.com
72_EOD
73
74# time 0
75reset_gldb ();
76gltest ($data, $testtime, 'defer');
77gltest ($data, $testtime+$greylist_delay-3, 'defer');
78gltest ($data, $testtime+$greylist_delay-1, 'defer');
79gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
80gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1, 'dunno');
81gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
82
83# time 0
84reset_gldb ();
85gltest ($data, $testtime, 'defer');
86gltest ($data, $testtime+$greylist_delay-3, 'defer');
87gltest ($data, $testtime+$greylist_delay-1, 'defer');
88gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
89gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
90gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
91gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1, 'dunno');
92gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
93
94# a record with sender = <> (bounce)
95
96$data = <<_EOD;
97request=smtpd_access_policy
98protocol_state=RCPT
99protocol_name=SMTP
100client_address=1.2.3.4
101client_name=test.domain.tld
102helo_name=test.domain.tld
103sender=
104recipient=test1\@proxmox.com
105_EOD
106
107# time 0
108reset_gldb ();
109
110gltest ($data, $testtime, 'defer');
111gltest ($data, $testtime+$greylist_delay-3, 'defer');
112gltest ($data, $testtime+$greylist_delay-1, 'defer');
113gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
114gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
115
116# time 0
117reset_gldb ();
118
119gltest ($data, $testtime, 'defer');
120gltest ($data, $testtime+$greylist_delay-3, 'defer');
121gltest ($data, $testtime+$greylist_delay-1, 'defer');
122gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
123gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
124gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
125gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+2, 'defer');
126
127
128my $testdomain = "interspar.at";
129my $testipok = "68.232.133.35";
130my $testipfail = "1.2.3.4";
131
132my $data_ok = <<_EOD;
133request=smtpd_access_policy
134protocol_state=RCPT
135protocol_name=SMTP
136client_address=$testipok
137helo_name=$testdomain
138sender=xyz\@$testdomain
139recipient=testspf\@maurer-it.com
140_EOD
141
142gltest ($data_ok, $testtime, 'prepend'); # helo pass
143
144$data_ok = <<_EOD;
145request=smtpd_access_policy
146protocol_state=RCPT
147protocol_name=SMTP
148client_address=$testipok
149helo_name=
150sender=xyz\@$testdomain
151recipient=testspf\@proxmox.com
152_EOD
153
154gltest ($data_ok, $testtime, 'prepend'); # mform pass
155
156$data_ok = <<_EOD;
157request=smtpd_access_policy
158protocol_state=RCPT
159protocol_name=SMTP
160client_address=88.198.105.243
161helo_name=
162sender=xyz\@$testdomain
163recipient=testspf\@maurer-it.com
164_EOD
165
166# we currently hav no backup mx, so we cant test this
167#gltest ($data_ok, $testtime, 'dunno'); # mail from backup mx
168
169$testdomain = "openspf.org"; # rejects everything
170
171my $data_fail = <<_EOD;
172request=smtpd_access_policy
173protocol_state=RCPT
174protocol_name=SMTP
175client_address=$testipfail
176helo_name=$testdomain
177sender=xyz\@$testdomain
178recipient=testspf\@maurer-it.com
179_EOD
180
181gltest ($data_fail, $testtime, 'reject');
182
7e293a63
TL
183system("kill `cat $testpidfn`") if -f $testpidfn;
184unlink($testpidfn);
a75bd17b
DM
185
186print "ALL TESTS OK\n";
187
7e293a63 188$sock->close();
b1060628 189
a75bd17b 190exit (0);