import java.util.*;
import java.sql.Timestamp;
-public class Graylist {
+public class Graylist extends SqliteDB {
- private Connection conn;
-
- public Graylist(String filename) {
- try {
- Class.forName("org.sqlite.JDBC");
- conn = DriverManager.getConnection("jdbc:sqlite:"+filename);
- conn.prepareStatement("create table if not exists "+
- "'whitelist' (ip unique)").executeUpdate();
- conn.prepareStatement("create table if not exists "+
- "'graylist' (ip,fromaddr,toaddr,date, primary key(ip,fromaddr,toaddr))").executeUpdate();
- }
- catch (SQLException e) { throw new RuntimeException(e); }
- catch (ClassNotFoundException e) { throw new RuntimeException(e); }
+ 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";
+ }
+
}