]>
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 | ||
130 | ||
131 | my $testdomain = "interspar.at"; | |
132 | my $testipok = "68.232.133.35"; | |
133 | my $testipfail = "1.2.3.4"; | |
134 | ||
135 | my $data_ok = <<_EOD; | |
136 | request=smtpd_access_policy | |
137 | protocol_state=RCPT | |
138 | protocol_name=SMTP | |
139 | client_address=$testipok | |
140 | helo_name=$testdomain | |
141 | sender=xyz\@$testdomain | |
142 | recipient=testspf\@maurer-it.com | |
143 | _EOD | |
144 | ||
145 | gltest ($data_ok, $testtime, 'prepend'); # helo pass | |
146 | ||
147 | $data_ok = <<_EOD; | |
148 | request=smtpd_access_policy | |
149 | protocol_state=RCPT | |
150 | protocol_name=SMTP | |
151 | client_address=$testipok | |
152 | helo_name= | |
153 | sender=xyz\@$testdomain | |
154 | recipient=testspf\@proxmox.com | |
155 | _EOD | |
156 | ||
157 | gltest ($data_ok, $testtime, 'prepend'); # mform pass | |
158 | ||
159 | $data_ok = <<_EOD; | |
160 | request=smtpd_access_policy | |
161 | protocol_state=RCPT | |
162 | protocol_name=SMTP | |
163 | client_address=88.198.105.243 | |
164 | helo_name= | |
165 | sender=xyz\@$testdomain | |
166 | recipient=testspf\@maurer-it.com | |
167 | _EOD | |
168 | ||
169 | # we currently hav no backup mx, so we cant test this | |
170 | #gltest ($data_ok, $testtime, 'dunno'); # mail from backup mx | |
171 | ||
172 | $testdomain = "openspf.org"; # rejects everything | |
173 | ||
174 | my $data_fail = <<_EOD; | |
175 | request=smtpd_access_policy | |
176 | protocol_state=RCPT | |
177 | protocol_name=SMTP | |
178 | client_address=$testipfail | |
179 | helo_name=$testdomain | |
180 | sender=xyz\@$testdomain | |
181 | recipient=testspf\@maurer-it.com | |
182 | _EOD | |
183 | ||
184 | gltest ($data_fail, $testtime, 'reject'); | |
185 | ||
7e293a63 TL |
186 | system("kill `cat $testpidfn`") if -f $testpidfn; |
187 | unlink($testpidfn); | |
a75bd17b DM |
188 | |
189 | print "ALL TESTS OK\n"; | |
190 | ||
7e293a63 | 191 | $sock->close(); |
b1060628 | 192 | |
a75bd17b | 193 | exit (0); |