Skip to content

Commit 40de470

Browse files
authored
add default ClassFilter for script execution, thx to Nam0101
2 parents e321a94 + 441e1fa commit 40de470

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

APIJSONORM/src/main/java/apijson/orm/script/JSR223ScriptExecutor.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,34 @@ public abstract class JSR223ScriptExecutor<T, M extends Map<String, Object>, L e
2727

2828
@Override
2929
public ScriptExecutor<T, M, L> init() {
30-
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
31-
scriptEngine = scriptEngineManager.getEngineByName(scriptEngineName());
30+
scriptEngine = createScriptEngine();
3231
return this;
3332
}
3433

34+
protected ScriptEngine createScriptEngine() {
35+
String name = scriptEngineName();
36+
if ("nashorn".equalsIgnoreCase(name) || "javascript".equalsIgnoreCase(name)
37+
|| "js".equalsIgnoreCase(name) || "ecmascript".equalsIgnoreCase(name)) {
38+
try {
39+
Class<?> factoryClass = Class.forName("jdk.nashorn.api.scripting.NashornScriptEngineFactory");
40+
Class<?> filterClass = Class.forName("jdk.nashorn.api.scripting.ClassFilter");
41+
Object filter = java.lang.reflect.Proxy.newProxyInstance(
42+
filterClass.getClassLoader(),
43+
new Class<?>[]{filterClass},
44+
(proxy, method, methodArgs) -> isClassExposureAllowed((String) methodArgs[0]));
45+
Object factory = factoryClass.getDeclaredConstructor().newInstance();
46+
return (ScriptEngine) factoryClass.getMethod("getScriptEngine", filterClass).invoke(factory, filter);
47+
} catch (Throwable e) {
48+
Log.e(TAG, "create sandboxed Nashorn engine failed, falling back: " + e);
49+
}
50+
}
51+
return new ScriptEngineManager().getEngineByName(name);
52+
}
53+
54+
protected boolean isClassExposureAllowed(String className) {
55+
return false;
56+
}
57+
3558
protected abstract String scriptEngineName();
3659

3760
protected abstract Object extendParameter(AbstractFunctionParser<T, M, L> parser, Map<String, Object> currentObject, String methodName, Object[] args);

0 commit comments

Comments
 (0)