X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2FScript.java;h=f7b259dbd6d72a41728031dcb563426b6815de37;hb=f44b297a36dbce9cc17c55df1de195aadcffc398;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..f7b259d 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 { @@ -232,7 +243,37 @@ public class Script extends JS.Obj implements Target { StringBuffer ret = new StringBuffer(); new Stream(p.getInputStream()).transcribe(ret); p.waitFor(); - return JSU.S(ret.toString()); + String result = ret.toString(); + Log.warn("dcc", ((Message)args[0]).summary() + ":\n " + result); + int body = 0; + int fuz1 = 0; + int fuz2 = 0; + int i_body = result.indexOf("Body="); + int i_fuz1 = result.indexOf("Fuz1="); + int i_fuz2 = result.indexOf("Fuz2="); + if (i_body != -1) try { + String s = result.substring(i_body+5); + if (s.indexOf(' ') != -1) s = s.substring(0, s.indexOf(' ')); + if (s.indexOf('\n') != -1) s = s.substring(0, s.indexOf('\n')); + body = s.equals("many") ? 999 : Integer.parseInt(s.trim()); + } catch (Exception e) { Log.error("", e); } + if (i_fuz1 != -1) try { + String s = result.substring(i_fuz1+5); + if (s.indexOf(' ') != -1) s = s.substring(0, s.indexOf(' ')); + if (s.indexOf('\n') != -1) s = s.substring(0, s.indexOf('\n')); + fuz1 = s.equals("many") ? 999 : Integer.parseInt(s.trim()); + } catch (Exception e) { Log.error("", e); } + if (i_fuz2 != -1) try { + String s = result.substring(i_fuz2+5); + if (s.indexOf(' ') != -1) s = s.substring(0, s.indexOf(' ')); + if (s.indexOf('\n') != -1) s = s.substring(0, s.indexOf('\n')); + fuz2 = s.equals("many") ? 999 : Integer.parseInt(s.trim()); + } catch (Exception e) { Log.error("", e); } + JSArray jsa = new JSArray(); + jsa.put(JSU.N(0), JSU.N(body)); + jsa.put(JSU.N(1), JSU.N(fuz1)); + jsa.put(JSU.N(2), JSU.N(fuz2)); + return jsa; } if (name.equals("mail.drop")) { return args.length==0 ? new Drop() : new Drop(JSU.toString(args[0])); @@ -251,9 +292,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 +301,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 +429,4 @@ public class Script extends JS.Obj implements Target { } } - }