Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
}
}
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ java {

allprojects {
group = "com.instancify.scriptify"
version = "1.3.4-SNAPSHOT"
version = "1.3.5-SNAPSHOT"
}

subprojects {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,6 +18,10 @@ public class JsScript implements Script<Object> {
private ScriptFunctionManager functionManager;
private ScriptConstantManager constantManager;

public JsScript() {
context.setWrapFactory(new JsWrapFactory());
}

@Override
public ScriptSecurityManager getSecurityManager() {
return securityManager;
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Loading