diff --git a/build.xml b/build.xml index 9b4ee6f9..904a1ad3 100644 --- a/build.xml +++ b/build.xml @@ -124,6 +124,11 @@ + + + + + diff --git a/lib/groovy.jar b/lib/groovy.jar index 85af249d..22ba3904 100644 Binary files a/lib/groovy.jar and b/lib/groovy.jar differ diff --git a/lib/ivy.jar b/lib/ivy.jar new file mode 100644 index 00000000..7e73dab6 Binary files /dev/null and b/lib/ivy.jar differ diff --git a/source/net/sourceforge/filebot/cli/ArgumentProcessor.java b/source/net/sourceforge/filebot/cli/ArgumentProcessor.java index 50cbf0c5..561b6f3f 100644 --- a/source/net/sourceforge/filebot/cli/ArgumentProcessor.java +++ b/source/net/sourceforge/filebot/cli/ArgumentProcessor.java @@ -2,6 +2,7 @@ package net.sourceforge.filebot.cli; +import static net.sourceforge.filebot.Settings.*; import static net.sourceforge.filebot.cli.CLILogging.*; import static net.sourceforge.tuned.ExceptionUtilities.*; import static net.sourceforge.tuned.FileUtilities.*; @@ -32,6 +33,7 @@ import org.kohsuke.args4j.CmdLineParser; import net.sourceforge.filebot.Analytics; import net.sourceforge.filebot.MediaTypes; +import net.sourceforge.filebot.cli.ScriptShell.Script; import net.sourceforge.filebot.cli.ScriptShell.ScriptProvider; import net.sourceforge.filebot.web.CachedResource; @@ -119,13 +121,15 @@ public class ArgumentProcessor { } } else { // execute user script + System.setProperty("grape.root", new File(getApplicationFolder(), "grape").getAbsolutePath()); + Bindings bindings = new SimpleBindings(); bindings.put("args", args.getFiles(false)); - ScriptProvider scriptProvider = new DefaultScriptProvider(); + ScriptProvider scriptProvider = new DefaultScriptProvider(args.trustScript); Analytics.trackEvent("CLI", "ExecuteScript", scriptProvider.getScriptLocation(args.script).getScheme()); - ScriptShell shell = new ScriptShell(cli, args, args.parameters, args.trustScript, AccessController.getContext(), scriptProvider); + ScriptShell shell = new ScriptShell(cli, args, args.parameters, AccessController.getContext(), scriptProvider); shell.runScript(args.script, bindings); } @@ -147,6 +151,14 @@ public class ArgumentProcessor { public static class DefaultScriptProvider implements ScriptProvider { + private final boolean trustRemoteScript; + + + public DefaultScriptProvider(boolean trustRemoteScript) { + this.trustRemoteScript = trustRemoteScript; + } + + @Override public URI getScriptLocation(String input) { try { @@ -155,7 +167,7 @@ public class ArgumentProcessor { try { // fn:sortivo if (input.startsWith("fn:")) { - return new URI("http", "filebot.sourceforge.net", "/scripts/" + input.substring(3) + ".groovy", null); + return new URI("fn", input.substring(3), null, null, null); } // script:println 'hello world' @@ -182,28 +194,37 @@ public class ArgumentProcessor { @Override - public String fetchScript(URI uri) throws IOException { + public Script fetchScript(URI uri) throws IOException { if (uri.getScheme().equals("file")) { - return readAll(new InputStreamReader(new FileInputStream(new File(uri)), "UTF-8")); + return new Script(readAll(new InputStreamReader(new FileInputStream(new File(uri)), "UTF-8")), true); } if (uri.getScheme().equals("system")) { - return readAll(new InputStreamReader(System.in)); + return new Script(readAll(new InputStreamReader(System.in)), true); } if (uri.getScheme().equals("script")) { - return uri.getAuthority(); + return new Script(uri.getAuthority(), true); + } + + String url = uri.toString(); + boolean trusted = trustRemoteScript; + + // special handling for endorsed online scripts + if (uri.getScheme().endsWith("fn")) { + url = "http://filebot.sourceforge.net/scripts/" + uri.getAuthority() + ".groovy"; + trusted = true; } // fetch remote script only if modified - CachedResource script = new CachedResource(uri.toString(), String.class, 24 * 60 * 60 * 1000) { + CachedResource script = new CachedResource(url, String.class, 24 * 60 * 60 * 1000) { @Override public String process(ByteBuffer data) { return Charset.forName("UTF-8").decode(data).toString(); } }; - return script.get(); + return new Script(script.get(), trusted); } } diff --git a/source/net/sourceforge/filebot/cli/ScriptShell.java b/source/net/sourceforge/filebot/cli/ScriptShell.java index d48c21fd..34e47e46 100644 --- a/source/net/sourceforge/filebot/cli/ScriptShell.java +++ b/source/net/sourceforge/filebot/cli/ScriptShell.java @@ -43,14 +43,12 @@ import net.sourceforge.filebot.web.MovieIdentificationService; class ScriptShell { private final ScriptEngine engine = new GroovyScriptEngineFactory().getScriptEngine(); - private final boolean trustScript; private final ScriptProvider scriptProvider; - public ScriptShell(CmdlineInterface cli, ArgumentBean args, Map parameters, boolean trustScript, AccessControlContext acc, ScriptProvider scriptProvider) throws ScriptException { + public ScriptShell(CmdlineInterface cli, ArgumentBean args, Map parameters, AccessControlContext acc, ScriptProvider scriptProvider) throws ScriptException { this.scriptProvider = scriptProvider; - this.trustScript = trustScript; // setup script context ScriptContext context = new SimpleScriptContext(); @@ -68,18 +66,32 @@ class ScriptShell { public URI getScriptLocation(String input); - public String fetchScript(URI uri) throws Exception; + public Script fetchScript(URI uri) throws Exception; + } + + + public static class Script { + + public final String code; + public final boolean trusted; + + + public Script(String code, boolean trusted) { + this.code = code; + this.trusted = trusted; + } } public Object runScript(String input, Bindings bindings) throws Throwable { URI resource = scriptProvider.getScriptLocation(input); - String script = scriptProvider.fetchScript(resource); - return evaluate(script, bindings); + Script script = scriptProvider.fetchScript(resource); + + return evaluate(script.code, bindings, script.trusted); } - public Object evaluate(final String script, final Bindings bindings) throws Throwable { + public Object evaluate(final String script, final Bindings bindings, boolean trustScript) throws Throwable { try { if (trustScript) { return engine.eval(script, bindings);