import java.util.*;
import java.sql.Timestamp;
-public class Graylist extends SqliteTable {
+public class Graylist extends SqliteDB {
- public Graylist(String filename) {
- super(filename,
- new String[] {
- "create table if not exists 'whitelist' (ip unique)",
- "create table if not exists 'graylist' (ip,fromaddr,toaddr,date, primary key(ip,fromaddr,toaddr))"
- });
- reap("graylist", "date");
+ public Graylist(String filename) throws SQLException {
+ super(filename);
+ SqliteTable whitelist = getTable("whitelist", "(ip unique)");
+ SqliteTable graylist = getTable("graylist", "(ip,fromaddr,toaddr,date,PRIMARY KEY(ip,fromaddr,toaddr))");
+ graylist.reap("date");
}
public synchronized void addWhitelist(InetAddress ip) {
try {
PreparedStatement check =
conn.prepareStatement("select date from graylist where ip=? and fromaddr=? and toaddr=?");
- check.setString(1, ip.getHostAddress());
+ check.setString(1, graylistAddress(ip));
check.setString(2, from);
check.setString(3, to);
ResultSet rs = check.executeQuery();
try {
PreparedStatement check =
conn.prepareStatement("insert or replace into graylist (ip,fromaddr,toaddr,date) values(?,?,?,?)");
- check.setString(1, ip.getHostAddress());
+ check.setString(1, graylistAddress(ip));
check.setString(2, from);
check.setString(3, to);
check.setTimestamp(4, new Timestamp(date));
} catch (SQLException e) { throw new RuntimeException(e); }
}
+ //
+ // this is mostly to deal with comcast's pathetic retry policy and
+ // rotating pool of outbound servers
+ // see: http://lists.puremagic.com/pipermail/greylist-users/2006-November/001255.html
+ //
+ private static String graylistAddress(InetAddress ipa) {
+ byte[] ip = ipa.getAddress();
+ return
+ (ip[0] & 0xff)+"."+
+ (ip[1] & 0xff)+"."+
+ (ip[2] & 0xff)+"."+
+ ".0";
+ }
+
}