X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FScript.java;h=875b17823465a48a4d2a6545ee89f1ebd794440f;hb=40e53cd3c7abe25902add4c97b8bc9202f3c8931;hp=332aa99a5f506427769bff4eb5f1e6e15b6ecd5c;hpb=d4d57f96d380a277a315ea0f19559be3e150b2b4;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/Script.java b/src/org/ibex/mail/Script.java index 332aa99..875b178 100644 --- a/src/org/ibex/mail/Script.java +++ b/src/org/ibex/mail/Script.java @@ -13,6 +13,14 @@ import java.io.*; import java.util.*; import java.text.*; +// +// - better matching syntax: +// - src-ip +// - from *@foo.com +// - list-id +// - ==> {discard, refuse, bounce} +// + public class Script extends JS.Obj implements Target { private static final JS.Method METHOD = new JS.Method(); @@ -62,7 +70,7 @@ public class Script extends JS.Obj implements Target { this.m = m; try { Object ret = js.call(null, new JS[] { m }); - Log.debug(this, "configuration script returned " + ret); + Log.warn(this, "configuration script returned " + ret); if (ret == null) throw new IOException("configuration script returned null"); while (ret instanceof JSReflection.Wrapper) ret = ((JSReflection.Wrapper)ret).unwrap(); if (ret instanceof Target) ((Target)ret).accept(m); @@ -125,6 +133,8 @@ public class Script extends JS.Obj implements Target { case "mail.drop": return METHOD; case "mail.razor": return getSub("mail.razor"); case "mail.razor.check": return METHOD; + case "mail.procmail": /* FEATURE */ return null; + case "mail.vacation": /* FEATURE */ return null; case "mail.dcc": return getSub("mail.dcc"); case "mail.dcc.check": return METHOD; case "mail.bounce": return METHOD; @@ -137,8 +147,8 @@ public class Script extends JS.Obj implements Target { } catch (IOException e) { throw new JSExn(e.toString()); } case "mail.whitelist": return JSReflection.wrap(org.ibex.mail.SMTP.whitelist); case "mail.my.mailbox": - Mailbox root = FileBasedMailbox.getFileBasedMailbox(Mailbox.STORAGE_ROOT, true); - return root.slash("user", true).slash("megacz", true); + MailTree root = FileBasedMailbox.getFileBasedMailbox(Mailbox.STORAGE_ROOT, true); + return (JS)root.slash("user", true).slash("megacz", true); case "mail.list": return METHOD; //#end return super.get(name); @@ -158,11 +168,11 @@ public class Script extends JS.Obj implements Target { } if (name.equals("mail.shell")) { // FIXME: EEEEEVIL! - Log.warn("dbug", args[0].getClass().getName()); - Log.warn("dbug", args[1].getClass().getName()); - final Process p = Runtime.getRuntime().exec(JSU.toString(args[1])); - Message m = (Message)args[0]; - new Thread() { + Log.warn("dbug", a.getClass().getName()); + Log.warn("dbug", b.getClass().getName()); + Message m = (Message)b; + final Process p = Runtime.getRuntime().exec(JSU.toString(a)); + Main.threadPool.start(new Runnable() { public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream())); @@ -171,10 +181,16 @@ public class Script extends JS.Obj implements Target { Log.warn("shell", s); } catch (Exception e) { e.printStackTrace(); } } - }.start(); + }); OutputStream os = p.getOutputStream(); Stream stream = new Stream(os); - m.getStream().transcribe(stream); + + // why do I need to go via an sb here? + StringBuffer sb = new StringBuffer(); + m.getBody().getStream().transcribe(sb); + stream.println(sb.toString()); + + stream.flush(); stream.close(); p.waitFor(); return null; @@ -183,15 +199,15 @@ public class Script extends JS.Obj implements Target { if (name.equals("mail.send") || name.equals("send") || name.equals("mail.attempt") || name.equals("attempt")) { boolean attempt = name.equals("mail.attempt") || name.equals("attempt"); JS m = (JS)a; - StringBuffer headers = new StringBuffer(); String body = ""; Address from = null, to = null, envelopeFrom = null, envelopeTo = null; JS.Enumeration e = m.keys(); + Headers headers = new Headers(); for(; e.hasNext();) { JS key = (JS)e.next(); JS val = m.get(key) == null ? null : m.get(key); if ("body".equalsIgnoreCase(JSU.toString(key))) body = JSU.toString(val); - else headers.append(JSU.toString(key) + ": " + JSU.toString(val) + "\r\n"); + else headers = new Headers(headers, new String[] { JSU.toString(key), JSU.toString(val) }); if ("from".equalsIgnoreCase(JSU.toString(key))) from = Address.parse(JSU.toString(val)); if ("to".equalsIgnoreCase(JSU.toString(key))) to = Address.parse(JSU.toString(val)); if ("envelopeFrom".equalsIgnoreCase(JSU.toString(key))) envelopeFrom = Address.parse(JSU.toString(val)); @@ -200,12 +216,7 @@ public class Script extends JS.Obj implements Target { if (envelopeTo == null) envelopeTo = to; if (envelopeFrom == null) envelopeFrom = from; Message message = - Message.newMessage(Fountain.Util.concat(Fountain.Util.create(headers.toString()), - Fountain.Util.create("\r\n"), - Fountain.Util.create(body)), - envelopeFrom, - envelopeTo - ); + Message.newMessageFromHeadersAndBody(headers, Fountain.Util.create(body), envelopeFrom, envelopeTo); boolean ok = false; try { @@ -251,9 +262,7 @@ public class Script extends JS.Obj implements Target { } if (name.equals("mail.forward2") || name.equals("forward2")) { try { - Message m2 = Message.newMessage(m, - m.envelopeFrom, - new Address(JSU.toString(a))); + Message m2 = m.withEnvelope(m.envelopeFrom, new Address(JSU.toString(a))); org.ibex.mail.SMTP.Outgoing.enqueue(m2); } catch (Exception e) { Log.warn(this, e); @@ -262,7 +271,7 @@ public class Script extends JS.Obj implements Target { return null; } if (name.equals("mail.forward") || name.equals("forward")) { - Message m2 = Message.newMessage(Script.this.m, Script.this.m.envelopeFrom, new Address(JSU.toString(a))); + Message m2 = Script.this.m.withEnvelope(Script.this.m.envelopeFrom, new Address(JSU.toString(a))); org.ibex.mail.SMTP.Outgoing.attempt(m2, false); return Drop.instance; } @@ -390,5 +399,4 @@ public class Script extends JS.Obj implements Target { } } - }