Skip to content

Commit

Permalink
Address review comments
Browse files Browse the repository at this point in the history
  • Loading branch information
shanggeeth committed Nov 27, 2023
1 parent c4213b6 commit 9cbea57
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 68 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

package org.wso2.carbon.identity.application.authentication.framework.config.model.graph;

import java.util.Optional;

import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
Expand All @@ -31,27 +33,48 @@
*/
public abstract class BaseThreadLocalScriptEngineHolder {

private static final ThreadLocal<ScriptEngine> threadLocalScriptEngine = new ThreadLocal<>();
private static final ThreadLocal<ScriptEngine> THREAD_LOCAL_SCRIPT_ENGINE = new ThreadLocal<>();
protected static final String[] NASHORN_ARGS = {"--no-java"};

protected abstract void init();
public BaseThreadLocalScriptEngineHolder() {

init();
}

protected void init() {

getScriptEngine()
.ifPresent(this::clearScriptEngineBindings);

ScriptEngine scriptEngine = getScriptEngine()
.orElseGet(this::createScriptEngine);

initializeScriptContext(scriptEngine);

// Set the threadLocal Script Engine.
setScriptEngine(scriptEngine);
}

/**
* Get the thread local script engine.
*
* @return ScriptEngine
*/
public ScriptEngine getScriptEngine() {
public Optional<ScriptEngine> getScriptEngine() {

return threadLocalScriptEngine.get();
ScriptEngine scriptEngine = THREAD_LOCAL_SCRIPT_ENGINE.get();
if (scriptEngine != null) {
return Optional.of(scriptEngine);
}
return Optional.empty();
}

protected void setScriptEngine(ScriptEngine scriptEngine) {
private void setScriptEngine(ScriptEngine scriptEngine) {

threadLocalScriptEngine.set(scriptEngine);
THREAD_LOCAL_SCRIPT_ENGINE.set(scriptEngine);
}

protected void setScriptContext(ScriptEngine scriptEngine) {
private void initializeScriptContext(ScriptEngine scriptEngine) {

ScriptContext scriptContext = new SimpleScriptContext();

Expand All @@ -66,5 +89,14 @@ protected void setScriptContext(ScriptEngine scriptEngine) {
scriptEngine.setContext(scriptContext);
}

private void clearScriptEngineBindings(ScriptEngine scriptEngine) {

// Clear the existing bindings.
scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).clear();
scriptEngine.getBindings(ScriptContext.GLOBAL_SCOPE).clear();
}

protected abstract ClassLoader getClassLoader();

protected abstract ScriptEngine createScriptEngine();
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@
import org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.SelectAcrFromFunction;
import org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.SelectOneFunction;
import org.wso2.carbon.identity.application.authentication.framework.util.FrameworkConstants;
import org.wso2.carbon.identity.base.IdentityRuntimeException;
import org.wso2.carbon.identity.core.util.IdentityUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import javax.script.Bindings;
import javax.script.ScriptContext;
Expand Down Expand Up @@ -94,8 +96,9 @@ public ScriptEngine createEngine(AuthenticationContext authenticationContext) {
ScriptEngine engine;
Bindings globalBindings;
if (useThreadLocalScriptEngine) {
ThreadLocalScriptEngineHolder threadLocalScriptEngineWrapper = new ThreadLocalScriptEngineHolder();
engine = threadLocalScriptEngineWrapper.getScriptEngine();
Optional<ScriptEngine> optionalScriptEngine = new ThreadLocalScriptEngineHolder().getScriptEngine();
engine = optionalScriptEngine.orElseThrow(
() -> new IdentityRuntimeException("Failed to create a script engine"));
globalBindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
} else {
engine = factory.getScriptEngine(NASHORN_ARGS, getClassLoader(), classFilter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import jdk.nashorn.api.scripting.ClassFilter;
import jdk.nashorn.api.scripting.NashornScriptEngineFactory;

import javax.script.ScriptContext;
import javax.script.ScriptEngine;

/**
Expand All @@ -32,37 +31,17 @@
*/
public class ThreadLocalScriptEngineHolder extends BaseThreadLocalScriptEngineHolder {

@SuppressWarnings("removal")
private NashornScriptEngineFactory factory;
private ClassFilter classFilter;

public ThreadLocalScriptEngineHolder() {

init();
}

protected void init() {

ScriptEngine scriptEngine = getScriptEngine();
if (scriptEngine == null) {
factory = new NashornScriptEngineFactory();
classFilter = new RestrictedClassFilter();
scriptEngine = factory.getScriptEngine(NASHORN_ARGS, getClassLoader(), classFilter);
} else {
//Clear the existing bindings.
scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).clear();
scriptEngine.getBindings(ScriptContext.GLOBAL_SCOPE).clear();
}
setScriptContext(scriptEngine);
//Set the threadLocal Script Engine
setScriptEngine(scriptEngine);

}

protected ClassLoader getClassLoader() {

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return classLoader == null ? NashornScriptEngineFactory.class.getClassLoader() : classLoader;
}

protected ScriptEngine createScriptEngine() {

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ClassFilter classFilter = new RestrictedClassFilter();
return factory.getScriptEngine(NASHORN_ARGS, getClassLoader(), classFilter);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@
import org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.OpenJdkSelectAcrFromFunction;
import org.wso2.carbon.identity.application.authentication.framework.handler.sequence.impl.SelectOneFunction;
import org.wso2.carbon.identity.application.authentication.framework.util.FrameworkConstants;
import org.wso2.carbon.identity.base.IdentityRuntimeException;
import org.wso2.carbon.identity.core.util.IdentityUtil;

import java.util.HashMap;
import java.util.Map;
import java.util.Optional;

import javax.script.Bindings;
import javax.script.ScriptContext;
Expand Down Expand Up @@ -101,9 +103,10 @@ public ScriptEngine createEngine(AuthenticationContext authenticationContext) {
ScriptEngine engine;
Bindings globalBindings;
if (useThreadLocalScriptEngine) {
OpenJdkNashornThreadLocalScriptEngineHolder threadLocalScriptEngineWrapper =
new OpenJdkNashornThreadLocalScriptEngineHolder();
engine = threadLocalScriptEngineWrapper.getScriptEngine();
Optional<ScriptEngine> optionalScriptEngine =
new OpenJdkNashornThreadLocalScriptEngineHolder().getScriptEngine();
engine = optionalScriptEngine.orElseThrow(
() -> new IdentityRuntimeException("Script engine is not available"));
globalBindings = engine.getBindings(ScriptContext.GLOBAL_SCOPE);
} else {
engine = factory.getScriptEngine(NASHORN_ARGS, getClassLoader(), classFilter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import org.openjdk.nashorn.api.scripting.NashornScriptEngineFactory;
import org.wso2.carbon.identity.application.authentication.framework.config.model.graph.BaseThreadLocalScriptEngineHolder;

import javax.script.ScriptContext;
import javax.script.ScriptEngine;

/**
Expand All @@ -33,35 +32,17 @@
*/
public class OpenJdkNashornThreadLocalScriptEngineHolder extends BaseThreadLocalScriptEngineHolder {

private NashornScriptEngineFactory factory;
private ClassFilter classFilter;

public OpenJdkNashornThreadLocalScriptEngineHolder() {

init();
}

protected void init() {

ScriptEngine scriptEngine = getScriptEngine();
if (scriptEngine == null) {
factory = new NashornScriptEngineFactory();
classFilter = new OpenJdkNashornRestrictedClassFilter();
scriptEngine = factory.getScriptEngine(NASHORN_ARGS, getClassLoader(), classFilter);
} else {
//Clear the existing bindings.
scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).clear();
scriptEngine.getBindings(ScriptContext.GLOBAL_SCOPE).clear();
}
setScriptContext(scriptEngine);
//Set the threadLocal Script Engine.
setScriptEngine(scriptEngine);
}

protected ClassLoader getClassLoader() {

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
return classLoader == null ? NashornScriptEngineFactory.class.getClassLoader() : classLoader;
}

protected ScriptEngine createScriptEngine() {

NashornScriptEngineFactory factory = new NashornScriptEngineFactory();
ClassFilter classFilter = new OpenJdkNashornRestrictedClassFilter();
return factory.getScriptEngine(NASHORN_ARGS, getClassLoader(), classFilter);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ public abstract class FrameworkConstants {
public static final String ORACLE = "Oracle";

public static final String SCRIPT_ENGINE_CONFIG = "AdaptiveAuth.ScriptEngine";
public static final String THREAD_LOCAL_SCRIPT_ENGINE_CONFIG = "AdaptiveAuth.UseThreadLocalScriptEngine";
public static final String THREAD_LOCAL_SCRIPT_ENGINE_CONFIG = "AdaptiveAuth.LimitScriptEngineCreation";
public static final String OPENJDK_NASHORN = "openjdkNashorn";
public static final String NASHORN = "nashorn";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1157,7 +1157,7 @@
-->
<AdaptiveAuth>
<ScriptEngine>{{AdaptiveAuth.ScriptEngine}}</ScriptEngine>
<UseThreadLocalScriptEngine>{{AdaptiveAuth.UseThreadLocalScriptEngine}}</UseThreadLocalScriptEngine>
<UseThreadLocalScriptEngine>{{AdaptiveAuth.LimitScriptEngineCreation}}</UseThreadLocalScriptEngine>
</AdaptiveAuth>

<MultifactorAuthentication>
Expand Down

0 comments on commit 9cbea57

Please sign in to comment.