]>
Commit | Line | Data |
---|---|---|
a75bd17b DM |
1 | #!/usr/bin/perl |
2 | ||
3 | use strict; | |
4 | use warnings; | |
7f0a6c36 DM |
5 | use lib '..'; |
6 | ||
a75bd17b DM |
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 | ||
7e293a63 TL |
22 | my $testdb = 'Proxmox_testdb'; |
23 | my $testport = 10122; | |
24 | my $testpidfn = "greylist-test-$$.pid"; | |
a75bd17b | 25 | |
7e293a63 | 26 | system ("perl -I.. ../bin/pmgpolicy -d $testdb -t --port $testport --pidfile '$testpidfn'"); |
a75bd17b DM |
27 | |
28 | sub reset_gldb { | |
7e293a63 | 29 | my $dbh = PMG::DBTools::open_ruledb($testdb); |
a75bd17b DM |
30 | $dbh->do ("DELETE FROM CGreylist"); |
31 | $dbh->disconnect(); | |
32 | } | |
33 | ||
34 | reset_gldb(); | |
35 | ||
36 | my $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 | ||
43 | my $testtime = 1; | |
44 | my $starttime = $testtime; | |
45 | ||
46 | my $icount = 0; | |
47 | ||
48 | sub 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 | ||
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 | ||
951a5ed9 SI |
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 | ||
a75bd17b DM |
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 | ||
7e293a63 TL |
218 | system("kill `cat $testpidfn`") if -f $testpidfn; |
219 | unlink($testpidfn); | |
a75bd17b DM |
220 | |
221 | print "ALL TESTS OK\n"; | |
222 | ||
7e293a63 | 223 | $sock->close(); |
b1060628 | 224 | |
a75bd17b | 225 | exit (0); |