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