From 8f7212f973567b5caf9d8a4d7f9b5b400f53f44f Mon Sep 17 00:00:00 2001 From: adam Date: Wed, 28 Feb 2007 06:51:04 +0000 Subject: [PATCH] graylist/whitelist updates darcs-hash:20070228065104-5007d-c0b82c224aa3a29098fa6bf21049e1e04b63771f.gz --- src/org/ibex/mail/Graylist.java | 21 +++---- src/org/ibex/mail/SqliteTable.java | 65 ++++++++++++++++++++++ src/org/ibex/mail/Whitelist.java | 107 +++++++++++++++--------------------- 3 files changed, 117 insertions(+), 76 deletions(-) create mode 100644 src/org/ibex/mail/SqliteTable.java diff --git a/src/org/ibex/mail/Graylist.java b/src/org/ibex/mail/Graylist.java index 0628062..3754c62 100644 --- a/src/org/ibex/mail/Graylist.java +++ b/src/org/ibex/mail/Graylist.java @@ -7,21 +7,16 @@ import java.io.*; import java.util.*; import java.sql.Timestamp; -public class Graylist { - - private Connection conn; +public class Graylist extends SqliteTable { 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); } + 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 synchronized void addWhitelist(InetAddress ip) { diff --git a/src/org/ibex/mail/SqliteTable.java b/src/org/ibex/mail/SqliteTable.java new file mode 100644 index 0000000..085a9b6 --- /dev/null +++ b/src/org/ibex/mail/SqliteTable.java @@ -0,0 +1,65 @@ +package org.ibex.mail; + +import org.ibex.io.*; +import org.ibex.mail.protocol.*; +import org.ibex.util.*; +import org.ibex.net.*; +import java.sql.*; +import java.net.*; +import java.io.*; +import java.util.*; +import java.sql.Timestamp; +import java.sql.Connection; + +public class SqliteTable { + + protected Connection conn; + private String filename; + private String reapTable; + private String reapColumn; + + public SqliteTable(String filename, String[] tables, String reapTable, String reapColumn) { + this.filename = filename; + try { + Class.forName("org.sqlite.JDBC"); + conn = DriverManager.getConnection("jdbc:sqlite:"+filename); + for(String s : tables) + conn.prepareStatement(s).executeUpdate(); + } + catch (SQLException e) { throw new RuntimeException(e); } + catch (ClassNotFoundException e) { throw new RuntimeException(e); } + this.reapTable = reapTable; + this.reapColumn = reapColumn; + if (reapTable != null && reapColumn != null) + new Reaper().start(); + } + + public static final int REAPER_INTERVAL_SECONDS = 60 * 60; + + private class Reaper extends Thread { + + public void run() { + while(true) { + try { + try { Thread.sleep(1000 * REAPER_INTERVAL_SECONDS); } catch (Exception e) { }; + Log.warn(Reaper.class, filename + " reaping..."); + long when = System.currentTimeMillis(); + when -= 5 * 24 * 60 * 60 * 1000; + synchronized(SqliteTable.this) { + PreparedStatement ps = conn.prepareStatement("select count(*) from "+reapTable+" where "+reapColumn+"