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);