diff --git a/api/src/main/java/com/instancify/scriptify/api/script/ScriptObject.java b/api/src/main/java/com/instancify/scriptify/api/script/ScriptObject.java new file mode 100644 index 0000000..3434292 --- /dev/null +++ b/api/src/main/java/com/instancify/scriptify/api/script/ScriptObject.java @@ -0,0 +1,26 @@ +package com.instancify.scriptify.api.script; + +/** + * Represents a class to wrap an object in a script, + * so if this class is found in a script, it will be converted to its value. + * This is necessary for script runtimes that do not support automatic object conversion. + */ +public interface ScriptObject { + + /** + * Returns the stored value. + * + * @return The value held by this object + */ + Object getValue(); + + /** + * Creates a ScriptObject from the given value. + * + * @param value The value to encapsulate + * @return A new ScriptObject instance + */ + static ScriptObject of(Object value) { + return () -> value; + } +} \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 05aa678..dc1985a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,7 +12,7 @@ java { allprojects { group = "com.instancify.scriptify" - version = "1.3.4-SNAPSHOT" + version = "1.3.5-SNAPSHOT" } subprojects { diff --git a/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java index 6db4ca4..45e96c1 100644 --- a/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java +++ b/script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java @@ -2,6 +2,7 @@ import com.instancify.scriptify.api.exception.ScriptException; import com.instancify.scriptify.api.script.Script; +import com.instancify.scriptify.api.script.ScriptObject; import com.instancify.scriptify.api.script.constant.ScriptConstant; import com.instancify.scriptify.api.script.constant.ScriptConstantManager; import com.instancify.scriptify.api.script.function.ScriptFunction; @@ -46,7 +47,16 @@ public void setConstantManager(ScriptConstantManager constantManager) { @Override public Value eval(String script) throws ScriptException { Context.Builder builder = Context.newBuilder("js") - .allowHostAccess(HostAccess.ALL); + .allowHostAccess(HostAccess.newBuilder(HostAccess.ALL) + // Mapping for the ScriptObject class required + // to convert a ScriptObject to the value it contains + .targetTypeMapping( + ScriptObject.class, + Object.class, + object -> true, + ScriptObject::getValue + ) + .build()); // If security mode is enabled, search all exclusions // and add the classes that were excluded to JsSecurityClassAccessor diff --git a/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java index 3e618a6..d8dffaa 100644 --- a/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java +++ b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java @@ -7,8 +7,6 @@ import com.instancify.scriptify.api.script.function.ScriptFunction; import com.instancify.scriptify.api.script.function.ScriptFunctionManager; import com.instancify.scriptify.api.script.security.ScriptSecurityManager; -import com.instancify.scriptify.api.script.security.exclude.ClassSecurityExclude; -import com.instancify.scriptify.api.script.security.exclude.SecurityExclude; import com.instancify.scriptify.core.script.security.StandardSecurityManager; import org.mozilla.javascript.Context; import org.mozilla.javascript.ScriptableObject; @@ -20,6 +18,10 @@ public class JsScript implements Script { private ScriptFunctionManager functionManager; private ScriptConstantManager constantManager; + public JsScript() { + context.setWrapFactory(new JsWrapFactory()); + } + @Override public ScriptSecurityManager getSecurityManager() { return securityManager; diff --git a/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsWrapFactory.java b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsWrapFactory.java new file mode 100644 index 0000000..c79e39b --- /dev/null +++ b/script-js-rhino/src/main/java/com/instancify/scriptify/script/JsWrapFactory.java @@ -0,0 +1,22 @@ +package com.instancify.scriptify.script; + +import com.instancify.scriptify.api.script.ScriptObject; +import org.mozilla.javascript.Context; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.WrapFactory; + +public class JsWrapFactory extends WrapFactory { + + public JsWrapFactory() { + this.setJavaPrimitiveWrap(false); + } + + @Override + public Object wrap(Context context, Scriptable scope, Object object, Class staticType) { + // Convert the ScriptObject class to the value it contains + if (object instanceof ScriptObject scriptObject) { + return Context.javaToJS(scriptObject.getValue(), scope); + } + return super.wrap(context, scope, object, staticType); + } +}