package org.ibex.mail.target;
import org.ibex.js.*;
+import org.ibex.io.*;
import org.ibex.util.*;
import org.ibex.mail.*;
import org.ibex.mail.filter.*;
import java.io.*;
import java.util.*;
-public class Script extends Target {
+public class Script extends JS.Obj implements Target {
private static final JS.Method METHOD = new JS.Method();
private String filePath = null;
public Script(String filePath) throws JSExn, IOException {
this.filePath = filePath;
- js = JSU.cloneWithNewGlobalScope(JSU.fromReader(filePath, 0, new InputStreamReader(new FileInputStream(filePath))),
+ js = JSU.cloneWithNewGlobalScope(JSU.fromReader(filePath, 1, new InputStreamReader(new FileInputStream(filePath))),
new ScriptScope()); }
private class ScriptScope extends JS.Immutable {
ScriptEnv env = new ScriptEnv();
- public Object get(Object o) {
- if (o.equals("m")) return m;
- if (o.equals("ibex")) return env;
+ public JS get(JS name) throws JSExn {
+ //#jsswitch(name)
+ case "m": return m;
+ case "ibex": return env;
+ default: return null;
+ //#end
return null;
}
}
Object ret = js.call(null, new JS[] { m });
Log.debug(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);
//else if (ret instanceof Filter) ((Filter)ret).process(m);
else throw new IOException("configuration script returned a " + ret.getClass().getName());
Sub(String key) { this.key = key; }
public void put(JS key, JS val) throws JSExn {
ScriptEnv.this.put(JSU.S(this.key + "." + JSU.toString(key)), val); }
- public JS get(JS key) throws JSExn {
- return ScriptEnv.this.get(JSU.S(this.key + "." + JSU.toString(key))); }
+ public JS get(JS key) throws JSExn { return ScriptEnv.this.get(JSU.S(this.key + "." + JSU.toString(key))); }
public JS call(JS method, JS[] args) throws JSExn {
return ScriptEnv.this.call(JSU.S(this.key + "." + JSU.toString(method)), args);
}
case "log.warn": return METHOD;
case "log.error": return METHOD;
case "list": return getSub("list");
+ case "url": return getSub("url");
+ case "url.encode": return METHOD;
case "mail": return getSub("mail");
case "mail.forward": return METHOD;
case "mail.forward2": return METHOD;
case "mail.send": return METHOD;
+ case "mail.attempt": return METHOD;
+ case "mail.later": return Later.instance;
+ case "mail.drop": return METHOD;
+ case "mail.razor": return getSub("mail.razor");
+ case "mail.razor.check": return METHOD;
+ case "mail.dcc": return getSub("mail.dcc");
+ case "mail.dcc.check": return METHOD;
+ case "mail.bounce": return METHOD;
+ case "mail.reject": return METHOD;
case "mail.my": return getSub("mail.my");
case "mail.my.prefs": try {
return new org.ibex.js.Directory(new File("/etc/org.ibex.mail.prefs"));
case "mail.my.mailbox":
FileBasedMailbox root = FileBasedMailbox.getFileBasedMailbox(Mailbox.STORAGE_ROOT, true);
return root.slash("user", true).slash("megacz", true).slash("newmail", true);
+ case "mail.list": return METHOD;
//#end
- if (JSU.toString(name).startsWith("list.")) { return MailingList.getList(JSU.toString(name).substring(5)); }
return super.get(name);
}
- public JS call(JS name, JS[] args) throws JSExn {
+ public JS call(JS name0, JS[] args) throws JSExn {
final JS a = args.length >= 1 ? args[0] : null;
final JS b = args.length >= 2 ? args[1] : null;
final JS c = args.length >= 3 ? args[2] : null;
final int nargs = args.length;
+ String name = JSU.toString(name0);
try {
+ if (name.equals("url.encode")) return JSU.S(java.net.URLEncoder.encode(JSU.toString(args[0])));
+ if (name.equals("mail.list")) return JSReflection.wrap(MailingList.getMailingList(JSU.toString(args[0])));
if (name.equals("date")) { return new JSDate(args); }
- if (name.equals("mail.send")) {
+ 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;
- for(JS.Enumeration e = m.keys(); e.hasNext();) {
+ Address from = null, to = null, envelopeFrom = null, envelopeTo = null;
+ JS.Enumeration e = m.keys();
+ 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(key + ": " + val + "\r\n");
+ else headers.append(JSU.toString(key) + ": " + JSU.toString(val) + "\r\n");
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));
+ if ("envelopeTo".equalsIgnoreCase(JSU.toString(key))) envelopeTo = Address.parse(JSU.toString(val));
+ }
+ if (envelopeTo == null) envelopeTo = to;
+ if (envelopeFrom == null) envelopeFrom = from;
+ Message message =
+ Message.newMessage(new org.ibex.io.Fountain.StringFountain(headers.toString() + "\r\n" + body),
+ envelopeFrom,
+ envelopeTo
+ );
+
+ boolean ok = false;
+ try {
+ if (attempt) {
+ org.ibex.mail.protocol.SMTP.Outgoing.attempt(message);
+ } else {
+ org.ibex.mail.protocol.SMTP.Outgoing.accept(message);
+ }
+ ok = true;
+ } catch (Exception ex) {
+ if (!attempt) Log.warn(this, ex);
}
- Message message = Message.newMessage(new org.ibex.io.Stream(headers.toString() + "\r\n" + body), from, to);
- //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 JSU.T;
+ if (!ok && !attempt) throw new JSExn("SMTP server rejected message");
+ return JSU.B(ok);
+ }
+ if (name.equals("mail.razor.check")) {
+ Process p = Runtime.getRuntime().exec("razor-check");
+ ((Message)args[0]).getStream().transcribe(new Stream(p.getOutputStream()), true);
+ return JSU.N(p.waitFor());
+ }
+ if (name.equals("mail.dcc.check")) {
+ Process p = Runtime.getRuntime().exec(new String[] { "dccproc", "-H" });
+ ((Message)args[0]).getStream().transcribe(new Stream(p.getOutputStream()), true);
+ StringBuffer ret = new StringBuffer();
+ new Stream(p.getInputStream()).transcribe(ret);
+ p.waitFor();
+ return JSU.S(ret.toString());
+ }
+ if (name.equals("mail.drop")) {
+ return args.length==0 ? new Drop() : new Drop(JSU.toString(args[0]));
+ }
+ if (name.equals("mail.bounce")) {
+ return new JSTarget() {
+ public void accept(Message m) throws MailException {
+ try {
+ Message m2 = m.bounce(JSU.toString(a));
+ org.ibex.mail.protocol.SMTP.Outgoing.accept(m2);
+ Log.error(this, "BOUNCING! " + m2.summary());
+ } catch (Exception e) {
+ Log.warn(this, e);
+ }
+ } };
}
- if (name.equals("mail.forward2")) {
+ if (name.equals("mail.forward2") || name.equals("forward2")) {
try {
- Message m2 = Message.newMessage(new org.ibex.io.Stream(m.toString()),
+ Message m2 = Message.newMessage(new org.ibex.io.Fountain.StringFountain(m.toString()),
m.envelopeFrom,
- new Address(a.toString()));
+ new Address(JSU.toString(a)));
org.ibex.mail.protocol.SMTP.Outgoing.accept(m2);
} catch (Exception e) {
Log.warn(this, e);
}
return null;
}
- if (name.equals("mail.forward")) { return new Target() {
- public void accept(Message m) throws MailException {
- try {
- Message m2 = Message.newMessage(new org.ibex.io.Stream(m.toString()),
- m.envelopeFrom,
- new Address(a.toString()));
- org.ibex.mail.protocol.SMTP.Outgoing.accept(m2);
- } catch (Exception e) {
- throw new MailException(e.toString());
- }
- }
- }; }
- if (name.equals("log.debug")) { JSU.debug(a== null ? "**null**" : a.toString()); return null; }
- if (name.equals("log.info")) { JSU.info(a== null ? "**null**" : a.toString()); return null; }
- if (name.equals("log.warn")) { JSU.warn(a== null ? "**null**" : a.toString()); return null; }
- if (name.equals("log.error")) { JSU.error(a== null ? "**null**" : a.toString()); 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)));
+ org.ibex.mail.protocol.SMTP.Outgoing.attempt(m2, false);
+ return Drop.instance;
+ }
+ if (name.equals("mail.reject"))
+ return new Reject(JSU.toString(a));
+ if (name.equals("log.debug") || name.equals("debug")) { JSU.debug(a== null ? "**null**" : JSU.toString(a)); return null; }
+ if (name.equals("log.info") || name.equals("info")) { JSU.info(a== null ? "**null**" : JSU.toString(a)); return null; }
+ if (name.equals("log.warn") || name.equals("warn")) { JSU.warn(a== null ? "**null**" : JSU.toString(a)); return null; }
+ if (name.equals("log.error") || name.equals("error")) { JSU.error(a== null ? "**null**" : JSU.toString(a)); return null; }
switch (nargs) {
case 1:
if (name.equals("regexp")) {return new JSRegexp(a, null); }
case 2:
if (name.equals("regexp")) {return new JSRegexp(a, b); }
}
+ } catch (MailException e) { throw 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 argument for ibex object method "+JSU.toString(name0)+"()");
}
- throw new JSExn("invalid number of arguments ("+nargs+") for ibex object method "+name+"()");
+ throw new JSExn("invalid number of arguments ("+nargs+") for ibex object method "+JSU.toString(name0)+"()");
}
public final JSMath ibexMath = new JSMath() {
}
};
}
+
+ private static abstract class JSTarget extends JS.Obj implements Target { }
}