X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fmail%2Ftarget%2FScript.java;h=d2bca1b6b8097fe5086eb3efb27459436fae73d5;hb=6aa91951ef890746acd9d4764dd4f9e5aad6fabb;hp=b4269ba40b6c4792b9970f2aa0bb564be4427c49;hpb=3173d1c5764330a4ffab8baccbcf68d0007a7f15;p=org.ibex.mail.git diff --git a/src/org/ibex/mail/target/Script.java b/src/org/ibex/mail/target/Script.java index b4269ba..d2bca1b 100644 --- a/src/org/ibex/mail/target/Script.java +++ b/src/org/ibex/mail/target/Script.java @@ -41,7 +41,9 @@ public class Script extends Target { public synchronized void accept(Message m) throws IOException, MailException { this.m = m; try { + Log.info(this, "invoking config..."); Object ret = js.call(m, null, null, null, 1); + Log.info(this, "config returned " + ret); if (ret == null) throw new IOException("configuration script returned null"); if (ret instanceof Target) ((Target)ret).accept(m); //else if (ret instanceof Filter) ((Filter)ret).process(m); @@ -55,14 +57,17 @@ public class Script extends Target { // FIXME: this should extend org.ibex.core.Ibex public static class ScriptEnv extends JS { - private static PropertyFile prefs; + private static PropertyFile prefs = null; + /* static { try { + // FIXME 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 { @@ -90,15 +95,60 @@ public class Script extends Target { 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.forward")) { return METHOD; } + if (name.equals("mail.send")) { return METHOD; } if (name.equals("mail.my")) { return getSub("mail.my"); } - if (name.equals("mail.my.prefs")) { return prefs; } - if (name.equals("mail.my.mailbox")) { return Mailbox.Mailbox.getForUser("megacz"); } + if (name.equals("mail.my.prefs")) { + try { + return new org.ibex.js.Directory(new File("/etc/org.ibex.mail.prefs")); + } catch (IOException e) { + throw new JSExn(e.toString()); + } + } + if (name.equals("mail.my.mailbox")) { + return FileBasedMailbox.getFileBasedMailbox(Mailbox.STORAGE_ROOT, true).slash("user", true).slash("megacz", true).slash("newmail", true); + } return super.get(name); } - public Object callMethod(Object name, Object a, Object b, Object c, Object[] rest, int nargs) throws JSExn { + public Object callMethod(Object name, final Object a, Object b, Object c, Object[] rest, int nargs) throws JSExn { try { if (name.equals("date")) { return new JSDate(a, b, c, rest, nargs); } + if (name.equals("mail.send")) { + JS m = (JS)a; + StringBuffer headers = new StringBuffer(); + String body = ""; + Address from = null, to = null; + for(Enumeration e = m.keys(); e.hasMoreElements();) { + String key = (String)e.nextElement(); + String val = m.get(key) == null ? null : m.get(key).toString(); + if ("body".equals(key)) body = val; + else headers.append(key + ": " + val + "\r\n"); + if ("from".equalsIgnoreCase(key)) from = Address.parse(val); + if ("to".equalsIgnoreCase(key)) to = Address.parse(val); + } + Message message = new Message(new org.ibex.io.Stream(headers.toString() + "\r\n" + body), + new Message.Envelope(from, + to, + new Date())); + //org.ibex.mail.protocol.SMTP.Outgoing.accept(message); + boolean ok = org.ibex.mail.protocol.SMTP.Outgoing.attempt(message); + if (!ok) throw new JSExn("SMTP server rejected message"); + return T; + } + if (name.equals("mail.forward")) { return new Target() { + public void accept(Message m) throws MailException { + try { + Message m2 = new Message(new org.ibex.io.Stream(m.toString()), + new Message.Envelope(m.envelope.from, + new Address(a.toString()), + new Date())); + org.ibex.mail.protocol.SMTP.Outgoing.accept(m2); + } catch (Exception e) { + throw new MailException(e.toString()); + } + } + }; } if (name.equals("log.debug")) { JS.debug(a== null ? "**null**" : a.toString()); return null; } if (name.equals("log.info")) { JS.info(a== null ? "**null**" : a.toString()); return null; } if (name.equals("log.warn")) { JS.warn(a== null ? "**null**" : a.toString()); return null; } @@ -110,8 +160,10 @@ public class Script extends Target { case 2: if (name.equals("regexp")) {return new JSRegexp(a, b); } } - } catch (RuntimeException e) { + } catch (Exception e) { Log.warn(this, "ibex."+name+"() threw: " + e); + Log.warn(this, e); + if (e instanceof JSExn) throw ((JSExn)e); throw new JSExn("invalid argument for ibex object method "+name+"()"); } throw new JSExn("invalid number of arguments ("+nargs+") for ibex object method "+name+"()");