@@ -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