]> git.proxmox.com Git - pmg-api.git/blob - tests/test_greylist.pl
fix #2276: restore line format for pmg-log-tracker
[pmg-api.git] / 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 system("systemctl stop pmgpolicy");
23
24 my $pidfile = "/var/run/pmgpolicy.pid";
25
26 system("kill `cat $pidfile`") if -f $pidfile;
27
28 system ("perl -I.. ../bin/pmgpolicy -d Proxmox_testdb -t");
29
30 sub reset_gldb {
31 my $dbh = PMG::DBTools::open_ruledb("Proxmox_testdb");
32 $dbh->do ("DELETE FROM CGreylist");
33 $dbh->disconnect();
34 }
35
36 reset_gldb();
37
38 my $sock = IO::Socket::INET->new(
39 PeerAddr => '127.0.0.1',
40 PeerPort => 10022) ||
41 die "unable to open socket - $!";
42
43 $/ = "\n\n";
44
45 my $testtime = 1;
46 my $starttime = $testtime;
47
48 my $icount = 0;
49
50 sub gltest {
51 my ($data, $ttime, $eres) = @_;
52
53 $icount++;
54
55 print $sock "testtime=$ttime\ninstance=$icount\n$data\n";
56 $sock->flush;
57 my $res = <$sock>;
58 chomp $res;
59 my $timediff = $ttime - $starttime;
60 die "unectpexted result at time $timediff: $res != $eres\n$data" if !($res =~ m/^action=$eres(\s.*)?/);
61 }
62
63 # a normal record
64
65 my $data = <<_EOD;
66 request=smtpd_access_policy
67 protocol_state=RCPT
68 protocol_name=SMTP
69 client_address=1.2.3.4
70 client_name=test.domain.tld
71 helo_name=test.domain.tld
72 sender=test1\@test.domain.tld
73 recipient=test1\@proxmox.com
74 _EOD
75
76 # time 0
77 reset_gldb ();
78 gltest ($data, $testtime, 'defer');
79 gltest ($data, $testtime+$greylist_delay-3, 'defer');
80 gltest ($data, $testtime+$greylist_delay-1, 'defer');
81 gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
82 gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1, 'dunno');
83 gltest ($data, $testtime+$greylist_lifetime-1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
84
85 # time 0
86 reset_gldb ();
87 gltest ($data, $testtime, 'defer');
88 gltest ($data, $testtime+$greylist_delay-3, 'defer');
89 gltest ($data, $testtime+$greylist_delay-1, 'defer');
90 gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
91 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
92 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
93 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1, 'dunno');
94 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1+$greylist_awlifetime-1+$greylist_awlifetime, 'defer');
95
96 # a record with sender = <> (bounce)
97
98 $data = <<_EOD;
99 request=smtpd_access_policy
100 protocol_state=RCPT
101 protocol_name=SMTP
102 client_address=1.2.3.4
103 client_name=test.domain.tld
104 helo_name=test.domain.tld
105 sender=
106 recipient=test1\@proxmox.com
107 _EOD
108
109 # time 0
110 reset_gldb ();
111
112 gltest ($data, $testtime, 'defer');
113 gltest ($data, $testtime+$greylist_delay-3, 'defer');
114 gltest ($data, $testtime+$greylist_delay-1, 'defer');
115 gltest ($data, $testtime+$greylist_lifetime-1, 'dunno');
116 gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
117
118 # time 0
119 reset_gldb ();
120
121 gltest ($data, $testtime, 'defer');
122 gltest ($data, $testtime+$greylist_delay-3, 'defer');
123 gltest ($data, $testtime+$greylist_delay-1, 'defer');
124 gltest ($data, $testtime+$greylist_lifetime+1, 'defer');
125 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay-1, 'defer');
126 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+1, 'dunno');
127 gltest ($data, $testtime+$greylist_lifetime+1+$greylist_delay+2, 'defer');
128
129
130 my $testdomain = "interspar.at";
131 my $testipok = "68.232.133.35";
132 my $testipfail = "1.2.3.4";
133
134 my $data_ok = <<_EOD;
135 request=smtpd_access_policy
136 protocol_state=RCPT
137 protocol_name=SMTP
138 client_address=$testipok
139 helo_name=$testdomain
140 sender=xyz\@$testdomain
141 recipient=testspf\@maurer-it.com
142 _EOD
143
144 gltest ($data_ok, $testtime, 'prepend'); # helo pass
145
146 $data_ok = <<_EOD;
147 request=smtpd_access_policy
148 protocol_state=RCPT
149 protocol_name=SMTP
150 client_address=$testipok
151 helo_name=
152 sender=xyz\@$testdomain
153 recipient=testspf\@proxmox.com
154 _EOD
155
156 gltest ($data_ok, $testtime, 'prepend'); # mform pass
157
158 $data_ok = <<_EOD;
159 request=smtpd_access_policy
160 protocol_state=RCPT
161 protocol_name=SMTP
162 client_address=88.198.105.243
163 helo_name=
164 sender=xyz\@$testdomain
165 recipient=testspf\@maurer-it.com
166 _EOD
167
168 # we currently hav no backup mx, so we cant test this
169 #gltest ($data_ok, $testtime, 'dunno'); # mail from backup mx
170
171 $testdomain = "openspf.org"; # rejects everything
172
173 my $data_fail = <<_EOD;
174 request=smtpd_access_policy
175 protocol_state=RCPT
176 protocol_name=SMTP
177 client_address=$testipfail
178 helo_name=$testdomain
179 sender=xyz\@$testdomain
180 recipient=testspf\@maurer-it.com
181 _EOD
182
183 gltest ($data_fail, $testtime, 'reject');
184
185 system("kill `cat $pidfile`") if -f $pidfile;
186
187 print "ALL TESTS OK\n";
188
189 system("systemctl start pmgpolicy");
190
191 exit (0);
192