]> git.proxmox.com Git - pmg-api.git/blob - tests/test_greylist.pl
use /etc/pmg/ instead of /etc/proxmox
[pmg-api.git] / tests / test_greylist.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5 use Socket;
6 use IO::Socket::INET;
7 use DBI;
8
9 use PVE::SafeSyslog;
10
11 use PMG::DBTools;
12 use PMG::RuleDB;
13
14 my $greylist_delay = 3*60;
15 my $greylist_lifetime = 3600*24*2; #retry window
16 my $greylist_awlifetime = 3600*24*36;
17
18 initlog($0, 'mail');
19
20 system("systemctl stop pmgpolicy");
21
22 my $pidfile = "/var/run/pmgpolicy.pid";
23
24 system("kill `cat $pidfile`") if -f $pidfile;
25
26 system ("perl -I.. ../bin/pmgpolicy -d Proxmox_testdb -t");
27
28 sub reset_gldb {
29 my $dbh = PMG::DBTools::open_ruledb("Proxmox_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 => 10022) ||
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 my $timediff = $ttime - $starttime;
58 die "unectpexted result at time $timediff: $res != $eres\n$data" if !($res =~ m/^action=$eres(\s.*)?/);
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
183 system("kill `cat $pidfile`") if -f $pidfile;
184
185 print "ALL TESTS OK\n";
186
187 exit (0);
188