From 034d6cb1d6f959c4640a0690b9ba0613e1f0ded4 Mon Sep 17 00:00:00 2001 From: adam Date: Sat, 8 May 2004 07:58:23 +0000 Subject: [PATCH 1/1] pretty much working darcs-hash:20040508075823-5007d-60116e47fa0248d791988e50fdde37c82ba0bc9c.gz --- doc/README | 2 +- mail.jar | Bin 55383 -> 57208 bytes src/org/ibex/mail/Message.java | 16 +++++++++------- src/org/ibex/mail/protocol/SMTP.java | 29 ++++++++++++++--------------- src/org/ibex/mail/target/FileSystem.java | 25 ++++++++++++++++++++++++- src/org/ibex/mail/target/Script.java | 13 +++++++++++++ 6 files changed, 61 insertions(+), 24 deletions(-) diff --git a/doc/README b/doc/README index e26737a..df2113d 100644 --- a/doc/README +++ b/doc/README @@ -50,13 +50,13 @@ The following properties are available from ibex.mail: dcc vipul spamAssassin + vacation target. dead -- drops the message on the floor; it vanishes without a trace dir[path] -- uses the directory [path] as a naive file-based storage area send -- sends the outgoing message via smtp bounce(message) -- bounces the message - vacation darcs(repo) procmail(procmailrc) lmtp(path) diff --git a/mail.jar b/mail.jar index 418b89d72277f2997cbb396d38dc06df92e1023f..4d7e3e2016af5c087969e51a1ca2dc9e94c2239d 100644 GIT binary patch delta 25233 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 delta 23516 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 CAS_7$ diff --git a/src/org/ibex/mail/Message.java b/src/org/ibex/mail/Message.java index 85ab516..0e0b13a 100644 --- a/src/org/ibex/mail/Message.java +++ b/src/org/ibex/mail/Message.java @@ -42,6 +42,8 @@ public class Message extends JSReflection { public void dump(OutputStream os) throws IOException { Writer w = new OutputStreamWriter(os); w.write(allHeaders); + w.write("X-IbexMail-EnvelopeFrom: " + envelopeFrom + "\r\n"); + w.write("X-IbexMail-EnvelopeTo: "); for(int i=0; i 126) - throw new Malformed("Header key contains invalid character \"" + s.charAt(i) + "\""); - String val = s.substring(0, s.indexOf(':')); + for(int i=0; i 126) + throw new Malformed("Header key \""+key+"\" contains invalid character \"" + key.charAt(i) + "\""); + String val = s.substring(s.indexOf(':') + 1).trim(); while(Character.isSpace(val.charAt(0))) val = val.substring(1); if (key.startsWith("Resent-")) { if (key.startsWith("Resent-From")) resent.addElement(new Hashtable()); @@ -135,9 +137,9 @@ public class Message extends JSReflection { } this.date = (Date)headers.get("Date"); - this.to = new Address((String)headers.get("To")); - this.from = new Address((String)headers.get("From")); - this.replyto = new Address((String)headers.get("Reply-To")); + this.to = new Address((String)headers.get("To")); // FIXME what if null? + this.from = headers.get("From") == null ? envelopeFrom : new Address((String)headers.get("From")); + this.replyto = headers.get("Reply-To") == null ? null : new Address((String)headers.get("Reply-To")); this.subject = (String)headers.get("Subject"); this.messageid = (String)headers.get("Message-Id"); if (headers.get("Cc") != null) { diff --git a/src/org/ibex/mail/protocol/SMTP.java b/src/org/ibex/mail/protocol/SMTP.java index b764b7e..dad7a06 100644 --- a/src/org/ibex/mail/protocol/SMTP.java +++ b/src/org/ibex/mail/protocol/SMTP.java @@ -155,25 +155,18 @@ public class SMTP extends MessageProtocol { try { conn.setSoTimeout(5 * 60 * 1000); StringBuffer logMessage = new StringBuffer(); - String conversationId = getConversation(); - Log.setThreadAnnotation("[conversation/" + conversationId + "] "); + String cid = getConversation(); + Log.setThreadAnnotation("[conversation " + cid + "] "); InetSocketAddress remote = (InetSocketAddress)conn.getRemoteSocketAddress(); - Log.info(this, "connection from " + remote.getHostName() + ":" + remote.getPort() + - " (" + remote.getAddress() + ")"); - PrintWriter logf = - new PrintWriter(new OutputStreamWriter(new FileOutputStream(convdir + File.separatorChar + conversationId))); + Log.info(this, "connection from "+remote.getHostName()+":"+remote.getPort()+" ("+remote.getAddress()+")"); + PrintWriter logf = new PrintWriter(new OutputStreamWriter(new FileOutputStream(convdir+File.separatorChar+cid))); try { return handleRequest(new LoggedLineReader(new InputStreamReader(conn.getInputStream()), logf), new LoggedPrintWriter(new OutputStreamWriter(conn.getOutputStream()), logf)); - } catch(Throwable t) { - Log.warn(this, t); - } finally { - logf.close(); - Log.setThreadAnnotation(""); + } catch(Throwable t) { Log.warn(this, t); + } finally { logf.close(); Log.setThreadAnnotation(""); } - } catch (Exception e) { - Log.error(this, e); - } + } catch (Exception e) { Log.error(this, e); } return false; } @@ -294,7 +287,13 @@ public class SMTP extends MessageProtocol { } else { ret = new InetAddress[attr.size()]; NamingEnumeration ne = attr.getAll(); - for(int i=0; ne.hasMore(); i++) ret[i] = (InetAddress)ne.next(); + for(int i=0; ne.hasMore(); i++) { + String mx = (String)ne.next(); + // FIXME we should be sorting here + mx = mx.substring(mx.indexOf(" ") + 1); + if (mx.charAt(mx.length() - 1) == '.') mx = mx.substring(0, mx.length() - 1); + ret[i] = InetAddress.getByName(mx); + } } } catch (Exception e) { Log.warn(SMTP.class, "couldn't find MX host for " + hostName + " due to"); diff --git a/src/org/ibex/mail/target/FileSystem.java b/src/org/ibex/mail/target/FileSystem.java index ab277a2..8be7d8f 100644 --- a/src/org/ibex/mail/target/FileSystem.java +++ b/src/org/ibex/mail/target/FileSystem.java @@ -8,7 +8,7 @@ import java.util.*; import java.text.*; // FIXME: appallingly inefficient -public class FileSystem { +public class FileSystem extends Target { private static final String STORAGE_ROOT = System.getProperty("ibex.mail.root", File.separatorChar + "var" + File.separatorChar + "org.ibex.mail"); @@ -23,6 +23,7 @@ public class FileSystem { } } + public void accept(Message m) throws IOException { add(m); } public FileSystem slash(String name) throws IOException { throw new Error(this.getClass().getName() + " does not support the slash() method"); } public int[] list() { throw new Error(this.getClass().getName() + " does not support the list() method"); } @@ -35,6 +36,28 @@ public class FileSystem { public Message[] query(int maxResults) { throw new Error(this.getClass().getName() + " does not support the query() method"); } + public static class Mailbox extends FileSystem { + String user; + private static Hashtable cache = new Hashtable(); + public static Mailbox getForUser(String user) { + Mailbox ret = (Mailbox)cache.get(user); + if (ret == null) ret = new Mailbox(user); + return ret; + } + Mailbox(String user) { this.user = user; } + public FileSystem slash(String name) throws IOException { + throw new Error(this.getClass().getName() + " does not support the slash() method"); } + public synchronized int add(Message message) throws IOException { + FileOutputStream fos = new FileOutputStream("/var/mail/" + user, true); + PrintWriter pw = new PrintWriter(new OutputStreamWriter(fos)); + pw.println("From " + message.envelopeFrom); + pw.flush(); + message.dump(fos); + fos.close(); + return -1; + } + } + /** a fast-write, slow-read place to stash all messages we touch -- in case of a major f*ckup */ public static class Transcript extends FileSystem { private String path; diff --git a/src/org/ibex/mail/target/Script.java b/src/org/ibex/mail/target/Script.java index 65746b3..4e06040 100644 --- a/src/org/ibex/mail/target/Script.java +++ b/src/org/ibex/mail/target/Script.java @@ -55,6 +55,15 @@ public class Script extends Target { // FIXME: this should extend org.ibex.core.Ibex public static class ScriptEnv extends JS { + private static PropertyFile prefs; + static { + try { + prefs = new PropertyFile(new File("/etc/org.ibex.mail.properties")); + } catch (IOException e) { + Log.error(ScriptEnv.class, e); + } + } + /** lets us put multi-level get/put/call keys all in the same method */ private class Sub extends JS { String key; @@ -80,6 +89,10 @@ public class Script extends Target { if (name.equals("log.info")) { return METHOD; } if (name.equals("log.warn")) { return METHOD; } if (name.equals("log.error")) { return METHOD; } + if (name.equals("mail")) { return getSub("mail"); } + if (name.equals("mail.my")) { return getSub("mail.my"); } + if (name.equals("mail.my.prefs")) { return prefs; } + if (name.equals("mail.my.mailbox")) { return FileSystem.Mailbox.getForUser("megacz"); } return super.get(name); } -- 1.7.10.4