]> git.proxmox.com Git - pmg-api.git/blob - src/tests/test_greylist.pl
tests: greylist: retry connecting 3 times
[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 exit_test_pmgpolicy {
29 my $pid = PVE::Tools::file_read_firstline($testpidfn);
30 die "could not read pidfile: $!\n" if !$pid;
31
32 die "could not find pid in pidfile\n" if $pid !~ m/^(\d+)$/;
33 $pid = $1;
34
35 kill ('TERM', $pid);
36 unlink($testpidfn);
37 }
38
39 sub reset_gldb {
40 my $dbh = PMG::DBTools::open_ruledb($testdb);
41 $dbh->do ("DELETE FROM CGreylist");
42 $dbh->disconnect();
43 }
44
45 reset_gldb();
46
47
48 my $sock;
49 for (my $tries = 0 ; $tries < 3 ; $tries++) {
50 $sock = IO::Socket::INET->new(
51 PeerAddr => '127.0.0.1',
52 PeerPort => $testport);
53 last if $sock;
54 sleep 1;
55 }
56 die "unable to open socket - $!" if !$sock;
57
58 $/ = "\n\n";
59
60 my $testtime = 1;
61 my $starttime = $testtime;
62
63 my $icount = 0;
64
65 sub gltest {
66 my ($data, $ttime, $eres) = @_;
67
68 $icount++;
69
70 print $sock "testtime=$ttime\ninstance=$icount\n$data\n";
71 $sock->flush;
72 my $res = <$sock>;
73 chomp $res;
74 if ($res !~ m/^action=$eres(\s.*)?/) {
75 my $timediff = $ttime - $starttime;
76 exit_test_pmgpolicy();
77 die "unexpected result at time $timediff: $res != $eres\n$data"
78 }
79 }
80
81 # a normal record
82
83 my $data = <<_EOD;
84 request=smtpd_access_policy
85 protocol_state=RCPT
86 protocol_name=SMTP
87 client_address=1.2.3.4
88 client_name=test.domain.tld
89 helo_name=test.domain.tld
90 sender=test1\@test.domain.tld
91 recipient=test1\@proxmox.com
92 _EOD
93
94 # time 0
95 reset_gldb ();
96 gltest ($data, $testtime, 'defer');
97 gltest ($data, $testtime+$greylist_delay-3, 'defer');
98 gltest ($data, $testtime+$greylist_delay-1, 'defer');
99 gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
100 gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1, 'dunno');
101 gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
102
103 # time 0
104 reset_gldb ();
105 gltest ($data, $testtime, 'defer');
106 gltest ($data, $testtime+$greylist_delay-3, 'defer');
107 gltest ($data, $testtime+$greylist_delay-1, 'defer');
108 gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
109 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
110 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
111 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1, 'dunno');
112 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
113
114 # a record with sender = <> (bounce)
115
116 $data = <<_EOD;
117 request=smtpd_access_policy
118 protocol_state=RCPT
119 protocol_name=SMTP
120 client_address=1.2.3.4
121 client_name=test.domain.tld
122 helo_name=test.domain.tld
123 sender=
124 recipient=test1\@proxmox.com
125 _EOD
126
127 # time 0
128 reset_gldb ();
129
130 gltest ($data, $testtime, 'defer');
131 gltest ($data, $testtime+$greylist_delay-3, 'defer');
132 gltest ($data, $testtime+$greylist_delay-1, 'defer');
133 gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
134 gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
135
136 # time 0
137 reset_gldb ();
138
139 gltest ($data, $testtime, 'defer');
140 gltest ($data, $testtime+$greylist_delay-3, 'defer');
141 gltest ($data, $testtime+$greylist_delay-1, 'defer');
142 gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
143 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
144 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
145 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+2, 'defer');
146
147 # greylist ipv6
148 my $data6 = <<_EOD;
149 request=smtpd_access_policy
150 protocol_state=RCPT
151 protocol_name=SMTP
152 client_address=2001:db8::1
153 client_name=test.domain.tld
154 helo_name=test.domain.tld
155 sender=test1\@test.domain.tld
156 recipient=test1\@proxmox.com
157 _EOD
158
159 # time 0
160 reset_gldb ();
161 gltest ($data6, $testtime, 'defer');
162 gltest ($data6, $testtime+$greylist_delay-3, 'defer');
163 gltest ($data6, $testtime+$greylist_delay-1, 'defer');
164 gltest ($data6, $testtime+$greylist_lifetime-1, 'dunno');
165 gltest ($data6, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1, 'dunno');
166 gltest ($data6, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
167
168 # time 0
169 reset_gldb ();
170 gltest ($data6, $testtime, 'defer');
171 gltest ($data6, $testtime+$greylist_delay-3, 'defer');
172 gltest ($data6, $testtime+$greylist_delay-1, 'defer');
173 gltest ($data6, $testtime+$greylist_lifetime+1, 'defer');
174 gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
175 gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
176 gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1, 'dunno');
177 gltest ($data6, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
178
179
180 my $testdomain = "interspar.at";
181 my $testipok = "68.232.133.35";
182 my $testipfail = "1.2.3.4";
183
184 my $data_ok = <<_EOD;
185 request=smtpd_access_policy
186 protocol_state=RCPT
187 protocol_name=SMTP
188 client_address=$testipok
189 helo_name=$testdomain
190 sender=xyz\@$testdomain
191 recipient=testspf\@maurer-it.com
192 _EOD
193
194 gltest ($data_ok, $testtime, 'prepend'); # helo pass
195
196 $data_ok = <<_EOD;
197 request=smtpd_access_policy
198 protocol_state=RCPT
199 protocol_name=SMTP
200 client_address=$testipok
201 helo_name=
202 sender=xyz\@$testdomain
203 recipient=testspf\@proxmox.com
204 _EOD
205
206 gltest ($data_ok, $testtime, 'prepend'); # mform pass
207
208 $data_ok = <<_EOD;
209 request=smtpd_access_policy
210 protocol_state=RCPT
211 protocol_name=SMTP
212 client_address=88.198.105.243
213 helo_name=
214 sender=xyz\@$testdomain
215 recipient=testspf\@maurer-it.com
216 _EOD
217
218 # we currently hav no backup mx, so we can't test this
219 #gltest ($data_ok, $testtime, 'dunno'); # mail from backup mx
220
221 $testdomain = "openspf.org"; # rejects everything
222
223 my $data_fail = <<_EOD;
224 request=smtpd_access_policy
225 protocol_state=RCPT
226 protocol_name=SMTP
227 client_address=$testipfail
228 helo_name=$testdomain
229 sender=xyz\@$testdomain
230 recipient=testspf\@maurer-it.com
231 _EOD
232
233 gltest ($data_fail, $testtime, 'reject');
234
235 exit_test_pmgpolicy();
236
237 print "ALL TESTS OK\n";
238
239 $sock->close();
240
241 exit (0);