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