X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FMailingList.java;h=54fed952408c2fd083377211918b68f138cff08d;hb=4b76a31e8f86bc8de673899bbb45252c01e9a0f6;hp=82c5ec34b330b6feccc76d53f24dff47ff9802d6;hpb=440e9bee20802bfbf97061b01f950448d3baf8f5;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/MailingList.java b/src/org/ibex/mail/MailingList.java index 82c5ec3..54fed95 100644 --- a/src/org/ibex/mail/MailingList.java +++ b/src/org/ibex/mail/MailingList.java @@ -10,17 +10,20 @@ import org.ibex.mail.protocol.*; import java.util.*; import java.io.*; import java.net.*; -import org.prevayler.*; -import org.prevayler.Query; import javax.servlet.*; import javax.servlet.http.*; -public class MailingList implements Target, Iterable { +// TODO: RFC 2369 +// TODO: RFC 2919 - // DO NOT move this below the stuff underneath it - private MailingList(File path) throws IOException { +// FEATURE: store interesting/important stuff in sqlite +public class MailingList extends Mailbox.MailboxWrapper { + + // FIXME + public MailingList(File path, FileBasedMailbox fbm) throws IOException { + super(fbm); this.path = path; - archive = FileBasedMailbox.getFileBasedMailbox(path.getCanonicalPath(), true); + this.mailbox = fbm; properties = new PropertiesFile(new File(path.getCanonicalPath() + File.separatorChar + "properties")); address = new Address(properties.get("address")); homepage = properties.get("homepage"); @@ -29,16 +32,27 @@ public class MailingList implements Target, Iterable { } public void banner(HttpServletRequest request, HttpServletResponse response) throws IOException { - String basename = request.getServletPath(); + String basename = request.getRequestURL()+""; PrintWriter pw = new PrintWriter(response.getWriter()); + /* pw.println(""); + pw.println(" "); + pw.println(" "); + pw.println(" "); pw.println(" "); + */ String confirm = request.getParameter("confirm"); if (confirm != null) { - Subscribe sub = (Subscribe)Confirmation.decode(confirm, Long.parseLong(properties.get("secret")), new Date()); + Subscribe sub = (Subscribe)Confirmation.decode(confirm, secret, new Date()); String email = sub.email; synchronized(this) { - String path = this.path.getAbsolutePath() + File.separatorChar + "subscribers" + File.separatorChar + sub.email; + String path = this.path.getAbsolutePath() + File.separatorChar + "subscribers" + File.separatorChar+sub.email; if (sub.un) new File(path).delete(); else { Log.warn(null, "creating " + path); @@ -47,30 +61,42 @@ public class MailingList implements Target, Iterable { } pw.println(" successfully "+sub.adj+"d " + email + " to " + properties.get("address")); } else { - pw.println(" "+properties.get("address")+"
"); - pw.println(" "+properties.get("nntp")+"
"); String action = request.getParameter("action"); String email = request.getParameter("email"); if (action != null) { Subscribe sub = new Subscribe(email, request.getRequestURL().toString(), action.equals("unsubscribe")); - sub.signAndSend(new Address(properties.get("owner")), Long.parseLong(properties.get("secret")), new Date()); - pw.println("a confirmation email has been sent to " + email + "; click the enclosed link to confirm your request to " + action); + sub.signAndSend(new Address(properties.get("owner")), + secret, new Date()); + pw.println("a confirmation email has been sent to " + email + + "; click the enclosed link to confirm your request to " + action); } else { - pw.println("
"); + pw.println("
"); + pw.println(" "+properties.get("address")+"
"); + pw.println(" "+properties.get("description")+" "); + pw.println("
"); + pw.println("access via: "); + if (path.getAbsolutePath().startsWith("/afs/")) + pw.println("[AFS] "); + pw.println("[NNTP]"); + pw.println("[SMTP]"); + pw.println("[HTTP]"); + pw.println("
"); + pw.println(" "); pw.println(" "); pw.println(" "); pw.println(" "); pw.println(" "); + pw.println("
"); } } - pw.println(" "); - pw.println(""); + //pw.println(" "); + //pw.println(""); pw.flush(); - pw.close(); } public class Subscribe extends Confirmation { @@ -90,8 +116,8 @@ public class MailingList implements Target, Iterable { } private final File path; - private final FileBasedMailbox archive; private final PropertiesFile properties; + private final FileBasedMailbox mailbox; private final long secret = new Random().nextLong(); public final Address address; @@ -110,38 +136,41 @@ public class MailingList implements Target, Iterable { // Pooling ////////////////////////////////////////////////////////////////////////////// - - public Iterator iterator() { - final File subdir = new File(path.getAbsolutePath() + File.separatorChar + "subscribers"); - if (!subdir.exists()) subdir.mkdirs(); - final String[] subs = !subdir.isDirectory() ? new String[0] : subdir.list(); - return new Iterator() { - int i=0; - Subscriber prep = null; - public void remove() { - try { - new File(subdir.getAbsolutePath() + File.separatorChar + subs[i++]).delete(); - } catch (Exception e) { - Log.error(MailingList.class, e); - } - } - public boolean hasNext() { if (prep==null) prep = next(); return prep!=null; } - public Subscriber next() { - if (prep!=null) { Subscriber ret = prep; prep = null; return ret; } - while(i subscribers() { + return new Iterable() { + public java.util.Iterator iterator() { + final File subdir = new File(path.getAbsolutePath() + File.separatorChar + "subscribers"); + if (!subdir.exists()) subdir.mkdirs(); + final String[] subs = !subdir.isDirectory() ? new String[0] : subdir.list(); + return new java.util.Iterator() { + int i=0; + Subscriber prep = null; + public void remove() { + try { + new File(subdir.getAbsolutePath() + File.separatorChar + subs[i++]).delete(); + } catch (Exception e) { + Log.error(MailingList.class, e); + } } - } - return null; + public boolean hasNext() { if (prep==null) prep = next(); return prep!=null; } + public Subscriber next() { + if (prep!=null) { Subscriber ret = prep; prep = null; return ret; } + while(i cache = new HashMap(); public static MailingList getMailingList(String path) throws IOException { return getMailingList(new File(path)); } public static MailingList getMailingList(File path) throws IOException { @@ -150,27 +179,37 @@ public class MailingList implements Target, Iterable { if (ret==null) cache.put(path.getCanonicalPath(), ret = new MailingList(path)); return ret; } - + */ // Methods ////////////////////////////////////////////////////////////////////////////// - public Mailbox getArchive() throws IOException { return archive; } - - public void accept(Message m) throws IOException, MailException { - StringBuffer buf = new StringBuffer(); - m.getBody().getStream().transcribe(buf); - Headers head = new Headers.Original(m.headers.getStream()); - head = head.set("List-Id", one_line_description + "<"+address+">"); - head = head.set("Subject", properties.get("prefix") + " " + head.get("Subject")); - - m = Message.newMessage(new Fountain.StringFountain(head.getString()+"\r\n"+buf.toString())); - Log.warn(MailingList.class, "archiving list message " + m.subject); - getArchive().accept(m); - - for(Subscriber s : this) try { - Log.warn(MailingList.class, " trying " + s.address); - SMTP.accept(Message.newMessage(m, m.envelopeFrom, s.address)); - Log.warn("[list]", "successfully sent to " + s); - } catch (Exception e2) { Log.error("[list]", e2); } + public void add(Message message) { + try { + accept(message); + } catch (Exception e) { throw new RuntimeException(e); } + } + public void add(Message message, int flags) { add(message); /* FIXME: flags? */ } + public void accept(Message m) throws MailException { + try { + StringBuffer buf = new StringBuffer(); + m.getBody().getStream().transcribe(buf); + Headers head = new Headers(m.headers, + new String[] { + "List-Id", one_line_description + "<"+address+">", + "Subject", properties.get("prefix") + " " + m.headers.get("Subject") + }); + + m = Message.newMessage(Fountain.Util.concat(new Fountain[] { head, + Fountain.Util.create("\r\n"), + Fountain.Util.create(buf.toString()) })); + Log.warn(MailingList.class, "archiving list message " + m.subject); + mailbox.accept(m); + + for(Subscriber s : subscribers()) try { + Log.warn(MailingList.class, " trying " + s.address); + SMTP.enqueue(m.withEnvelope(m.envelopeFrom, s.address)); + Log.warn("[list]", "successfully sent to " + s); + } catch (Exception e2) { Log.error("[list]", e2); } + } catch (Exception e) { throw new RuntimeException(e); } } //public Filter[] filters = new Filter[0];