comment out BODYSTRUCTURE
[org.ibex.mail.git] / src / org / ibex / mail / Graylist.java
index 3754c62..1f65dd4 100644 (file)
@@ -7,16 +7,13 @@ import java.io.*;
 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))"
-              },
-              "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) {
@@ -40,7 +37,7 @@ public class Graylist extends SqliteTable {
         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();
@@ -53,7 +50,7 @@ public class Graylist extends SqliteTable {
         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));
@@ -61,5 +58,19 @@ public class Graylist extends SqliteTable {
         } 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";
+    }
+
 }