1 package org.columba.mail.spam; 19 20 import java.io.File ; 21 import java.io.IOException ; 22 import java.io.InputStream ; 23 import java.security.NoSuchAlgorithmException ; 24 import java.util.ArrayList ; 25 import java.util.Enumeration ; 26 import java.util.List ; 27 import java.util.logging.Logger ; 28 29 import javax.swing.JOptionPane ; 30 31 import org.columba.core.config.DefaultConfigDirectory; 32 import org.columba.core.gui.frame.FrameManager; 33 import org.columba.core.io.CloneStreamMaster; 34 import org.columba.core.logging.Logging; 35 import org.columba.mail.folder.IMailbox; 36 import org.columba.mail.spam.command.CommandHelper; 37 import org.columba.mail.spam.rules.RuleList; 38 import org.columba.ristretto.message.Header; 39 import org.macchiato.DBWrapper; 40 import org.macchiato.Message; 41 import org.macchiato.SpamFilter; 42 import org.macchiato.SpamFilterImpl; 43 import org.macchiato.db.FrequencyDB; 44 import org.macchiato.db.MD5SumHelper; 45 import org.macchiato.db.berkleydb.BerkleyFrequencyDBImpl; 46 import org.macchiato.log.MacchiatoLogger; 47 import org.macchiato.maps.ProbabilityMap; 48 49 61 public class MacchiatoPlugin implements ISpamPlugin { 62 63 64 private static final Logger LOG = Logger 65 .getLogger("org.columba.core.gui.htmlviewer"); 66 67 70 public final static int THRESHOLD = 200000; 71 72 76 public final static int AGE = 7; 77 78 81 private SpamFilter filter; 82 83 86 private FrequencyDB db; 87 88 91 private File file; 92 93 96 private boolean hasChanged = false; 97 98 101 private boolean alreadyLoaded = false; 102 103 106 public MacchiatoPlugin() { 107 File configDirectory = DefaultConfigDirectory.getInstance().getCurrentPath(); 109 File mailDirectory = new File (configDirectory, "mail"); 110 file = new File (mailDirectory, "spamdb"); 111 if (!file.exists()) 112 file.mkdir(); 113 db = new DBWrapper(new BerkleyFrequencyDBImpl(file)); 114 115 filter = new SpamFilterImpl(db); 116 117 MacchiatoLogger.setParentLogger(Logger 119 .getLogger("org.columba.mail.spam")); 120 121 } 122 123 130 public boolean scoreMessage(IMailbox mailbox, Object uid) throws Exception { 131 load(); 133 134 InputStream istream = CommandHelper.getBodyPart(mailbox, uid); 136 137 CloneStreamMaster master = new CloneStreamMaster(istream); 140 141 istream = master.getClone(); 143 144 ProbabilityMap map = RuleList.getInstance().getProbabilities(mailbox, 146 uid); 147 148 float score = filter.scoreMessage(new Message(istream), map); 149 150 return score >= 0.9f; 151 } 152 153 157 public void trainMessageAsSpam(IMailbox mailbox, Object uid) 158 throws Exception { 159 InputStream istream = CommandHelper.getBodyPart(mailbox, uid); 161 162 Header h = mailbox.getHeaderFields(uid, Message.HEADERFIELDS); 164 165 Enumeration e = h.getKeys(); 167 List list = new ArrayList (); 168 169 while (e.hasMoreElements()) { 170 String key = (String ) e.nextElement(); 171 list.add(h.get(key)); 172 } 173 174 load(); 176 177 try { 178 CloneStreamMaster master = new CloneStreamMaster(istream); 179 InputStream inputStream = master.getClone(); 180 181 byte[] md5sum = MD5SumHelper.createMD5(inputStream); 182 inputStream.close(); 184 185 inputStream = master.getClone(); 187 188 Message message = new Message(inputStream, list, md5sum); 189 if (db.MD5SumExists(md5sum)) { 192 filter.correctMessageAsSpam(message); 195 } else { 196 filter.trainMessageAsSpam(message); 198 } 199 200 inputStream.close(); 202 203 hasChanged = true; 205 } catch (IOException e1) { 206 LOG.severe(e1.getMessage()); 207 if (Logging.DEBUG) 208 e1.printStackTrace(); 209 } catch (NoSuchAlgorithmException nsae) { 210 } 212 } 213 214 218 public void trainMessageAsHam(IMailbox mailbox, Object uid) 219 throws Exception { 220 InputStream istream = CommandHelper.getBodyPart(mailbox, uid); 222 223 Header h = mailbox.getHeaderFields(uid, Message.HEADERFIELDS); 225 226 Enumeration e = h.getKeys(); 228 List list = new ArrayList (); 229 230 while (e.hasMoreElements()) { 231 String key = (String ) e.nextElement(); 232 list.add(h.get(key)); 233 } 234 235 load(); 237 238 try { 239 CloneStreamMaster master = new CloneStreamMaster(istream); 240 InputStream inputStream = master.getClone(); 241 242 byte[] md5sum = MD5SumHelper.createMD5(inputStream); 243 inputStream.close(); 245 246 inputStream = master.getClone(); 248 Message message = new Message(inputStream, list, md5sum); 249 250 if (db.MD5SumExists(md5sum)) { 252 254 filter.correctMessageAsHam(message); 256 } else { 257 259 filter.trainMessageAsHam(message); 260 } 261 262 inputStream.close(); 264 265 hasChanged = true; 267 } catch (IOException e1) { 268 LOG.severe(e1.getMessage()); 269 if (Logging.DEBUG) 270 e1.printStackTrace(); 271 } catch (NoSuchAlgorithmException nsae) { 272 } 274 } 275 276 279 public void save() { 280 try { 281 if (alreadyLoaded && hasChanged) { 283 db.cleanupDB(THRESHOLD); 285 286 db.close(); 288 } 289 } catch (Exception e) { 290 if (Logging.DEBUG) { 291 e.printStackTrace(); 292 } 293 int value = JOptionPane.showConfirmDialog(FrameManager.getInstance() 295 .getActiveFrame(), 296 "An error occured while saving the spam database.\n" 297 + "Try again?", "Error saving database", 298 JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); 299 if (value == JOptionPane.YES_OPTION) { 300 save(); 301 } 302 } 303 304 } 305 306 309 public void load() { 310 324 } 325 326 } 327 | Popular Tags |