]> git.proxmox.com Git - pmg-api.git/blame - src/tests/test_greylist.pl
add tests for greylisting ipv6
[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;
e68a3b47
SI
57 if ($res !~ m/^action=$eres(\s.*)?/) {
58 my $timediff = $ttime - $starttime;
59 system("kill `cat $testpidfn`") if -f $testpidfn;
60 die "unexpected result at time $timediff: $res != $eres\n$data"
61 }
a75bd17b
DM
62}
63
64# a normal record
65
66my $data = <<_EOD;
67request=smtpd_access_policy
68protocol_state=RCPT
69protocol_name=SMTP
70client_address=1.2.3.4
71client_name=test.domain.tld
72helo_name=test.domain.tld
73sender=test1\@test.domain.tld
74recipient=test1\@proxmox.com
75_EOD
76
77# time 0
78reset_gldb ();
79gltest ($data, $testtime, 'defer');
80gltest ($data, $testtime+$greylist_delay-3, 'defer');
81gltest ($data, $testtime+$greylist_delay-1, 'defer');
82gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
83gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1, 'dunno');
84gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
85
86# time 0
87reset_gldb ();
88gltest ($data, $testtime, 'defer');
89gltest ($data, $testtime+$greylist_delay-3, 'defer');
90gltest ($data, $testtime+$greylist_delay-1, 'defer');
91gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
92gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
93gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
94gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1, 'dunno');
95gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
96
97# a record with sender = <> (bounce)
98
99$data = <<_EOD;
100request=smtpd_access_policy
101protocol_state=RCPT
102protocol_name=SMTP
103client_address=1.2.3.4
104client_name=test.domain.tld
105helo_name=test.domain.tld
106sender=
107recipient=test1\@proxmox.com
108_EOD
109
110# time 0
111reset_gldb ();
112
113gltest ($data, $testtime, 'defer');
114gltest ($data, $testtime+$greylist_delay-3, 'defer');
115gltest ($data, $testtime+$greylist_delay-1, 'defer');
116gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
117gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
118
119# time 0
120reset_gldb ();
121
122gltest ($data, $testtime, 'defer');
123gltest ($data, $testtime+$greylist_delay-3, 'defer');
124gltest ($data, $testtime+$greylist_delay-1, 'defer');
125gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
126gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
127gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
128gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+2, 'defer');
129
951a5ed9
SI
130# greylist ipv6
131my $data6 = <<_EOD;
132request=smtpd_access_policy
133protocol_state=RCPT
134protocol_name=SMTP
135client_address=2001:db8::1
136client_name=test.domain.tld
137helo_name=test.domain.tld
138sender=test1\@test.domain.tld
139recipient=test1\@proxmox.com
140_EOD
141
142# time 0
143reset_gldb ();
144gltest ($data6, $testtime, 'defer');
145gltest ($data6, $testtime+$greylist_delay-3, 'defer');
146gltest ($data6, $testtime+$greylist_delay-1, 'defer');
147gltest ($data6, $testtime+$greylist_lifetime-1, 'dunno');
148gltest ($data6, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1, 'dunno');
149gltest ($data6, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
150
151# time 0
152reset_gldb ();
153gltest ($data6, $testtime, 'defer');
154gltest ($data6, $testtime+$greylist_delay-3, 'defer');
155gltest ($data6, $testtime+$greylist_delay-1, 'defer');
156gltest ($data6, $testtime+$greylist_lifetime+1, 'defer');
157gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
158gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
159gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1, 'dunno');
160gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
161
a75bd17b
DM
162
163my $testdomain = "interspar.at";
164my $testipok = "68.232.133.35";
165my $testipfail = "1.2.3.4";
166
167my $data_ok = <<_EOD;
168request=smtpd_access_policy
169protocol_state=RCPT
170protocol_name=SMTP
171client_address=$testipok
172helo_name=$testdomain
173sender=xyz\@$testdomain
174recipient=testspf\@maurer-it.com
175_EOD
176
177gltest ($data_ok, $testtime, 'prepend'); # helo pass
178
179$data_ok = <<_EOD;
180request=smtpd_access_policy
181protocol_state=RCPT
182protocol_name=SMTP
183client_address=$testipok
184helo_name=
185sender=xyz\@$testdomain
186recipient=testspf\@proxmox.com
187_EOD
188
189gltest ($data_ok, $testtime, 'prepend'); # mform pass
190
191$data_ok = <<_EOD;
192request=smtpd_access_policy
193protocol_state=RCPT
194protocol_name=SMTP
195client_address=88.198.105.243
196helo_name=
197sender=xyz\@$testdomain
198recipient=testspf\@maurer-it.com
199_EOD
200
201# we currently hav no backup mx, so we cant test this
202#gltest ($data_ok, $testtime, 'dunno'); # mail from backup mx
203
204$testdomain = "openspf.org"; # rejects everything
205
206my $data_fail = <<_EOD;
207request=smtpd_access_policy
208protocol_state=RCPT
209protocol_name=SMTP
210client_address=$testipfail
211helo_name=$testdomain
212sender=xyz\@$testdomain
213recipient=testspf\@maurer-it.com
214_EOD
215
216gltest ($data_fail, $testtime, 'reject');
217
7e293a63
TL
218system("kill `cat $testpidfn`") if -f $testpidfn;
219unlink($testpidfn);
a75bd17b
DM
220
221print "ALL TESTS OK\n";
222
7e293a63 223$sock->close();
b1060628 224
a75bd17b 225exit (0);