add hack to deal with comcast pathetic retry policy
[org.ibex.mail.git] / src / org / ibex / mail / Graylist.java
index ec1fe12..1f65dd4 100644 (file)
@@ -9,13 +9,11 @@ import java.sql.Timestamp;
 
 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) {
@@ -39,7 +37,7 @@ public class Graylist extends SqliteDB {
         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();
@@ -52,7 +50,7 @@ public class Graylist extends SqliteDB {
         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));
@@ -60,5 +58,19 @@ public class Graylist extends SqliteDB {
         } 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";
+    }
+
 }