diff --git a/src/main/java/scripting/AbstractScriptManager.java b/src/main/java/scripting/AbstractScriptManager.java
index 1e3c54635c..187f46b3a0 100644
--- a/src/main/java/scripting/AbstractScriptManager.java
+++ b/src/main/java/scripting/AbstractScriptManager.java
@@ -22,6 +22,7 @@ along with this program. If not, see .
package scripting;
import client.MapleClient;
+import com.oracle.truffle.js.scriptengine.GraalJSScriptEngine;
import tools.FilePrinter;
import javax.script.*;
@@ -40,7 +41,7 @@ public abstract class AbstractScriptManager {
sef = new ScriptEngineManager().getEngineByName("graal.js").getFactory();
}
- protected ScriptEngine getScriptEngine(String path) {
+ protected ScriptEngine getInvocableScriptEngine(String path) {
path = "scripts/" + path;
File scriptFile = new File(path);
if (!scriptFile.exists()) {
@@ -48,7 +49,11 @@ public abstract class AbstractScriptManager {
}
ScriptEngine engine = sef.getScriptEngine();
- applyLooserGraalSecurity(engine);
+ if (!(engine instanceof GraalJSScriptEngine graalScriptEngine)) {
+ throw new IllegalStateException("ScriptEngineFactory did not provide a GraalJSScriptEngine");
+ }
+
+ enableScriptHostAccess(graalScriptEngine);
try (FileReader fr = new FileReader(scriptFile)) {
engine.eval(fr);
@@ -57,21 +62,24 @@ public abstract class AbstractScriptManager {
return null;
}
- return engine;
+ return graalScriptEngine;
}
- protected ScriptEngine getScriptEngine(String path, MapleClient c) {
+ protected ScriptEngine getInvocableScriptEngine(String path, MapleClient c) {
ScriptEngine engine = c.getScriptEngine("scripts/" + path);
if (engine == null) {
- engine = getScriptEngine(path);
+ engine = getInvocableScriptEngine(path);
c.setScriptEngine(path, engine);
}
return engine;
}
- private void applyLooserGraalSecurity(ScriptEngine scriptEngine) {
- Bindings bindings = scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE);
+ /**
+ * Allow usage of "Java.type()" in script to look up host class
+ */
+ private void enableScriptHostAccess(GraalJSScriptEngine engine) {
+ Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
bindings.put("polyglot.js.allowHostAccess", true);
bindings.put("polyglot.js.allowHostClassLookup", true);
}
diff --git a/src/main/java/scripting/event/EventInstanceManager.java b/src/main/java/scripting/event/EventInstanceManager.java
index 225f48ed2d..ee4dbc6104 100644
--- a/src/main/java/scripting/event/EventInstanceManager.java
+++ b/src/main/java/scripting/event/EventInstanceManager.java
@@ -51,7 +51,6 @@ import server.maps.MapleReactor;
import tools.MaplePacketCreator;
import tools.Pair;
-import javax.script.Invocable;
import javax.script.ScriptException;
import java.awt.*;
import java.util.List;
@@ -214,10 +213,10 @@ public class EventInstanceManager {
}
}
-
+
public Object invokeScriptFunction(String name, Object... args) throws ScriptException, NoSuchMethodException {
if (!disposed) {
- return ((Invocable) em.getIv()).invokeFunction(name, args);
+ return em.getIv().invokeFunction(name, args);
} else {
return null;
}
diff --git a/src/main/java/scripting/event/EventManager.java b/src/main/java/scripting/event/EventManager.java
index c4ab4ada2a..550ee3b79e 100644
--- a/src/main/java/scripting/event/EventManager.java
+++ b/src/main/java/scripting/event/EventManager.java
@@ -45,7 +45,6 @@ import server.quest.MapleQuest;
import tools.exceptions.EventInstanceInProgressException;
import javax.script.Invocable;
-import javax.script.ScriptEngine;
import javax.script.ScriptException;
import java.util.*;
import java.util.concurrent.Semaphore;
@@ -60,7 +59,7 @@ import java.util.logging.Logger;
* @author Ronan
*/
public class EventManager {
- private ScriptEngine iv;
+ private Invocable iv;
private Channel cserv;
private World wserv;
private Server server;
@@ -83,7 +82,7 @@ public class EventManager {
private static final int maxLobbys = 8; // an event manager holds up to this amount of concurrent lobbys
- public EventManager(Channel cserv, ScriptEngine iv, String name) {
+ public EventManager(Channel cserv, Invocable iv, String name) {
this.server = Server.getInstance();
this.iv = iv;
this.cserv = cserv;
@@ -102,7 +101,7 @@ public class EventManager {
ess.dispose();
try {
- ((Invocable) iv).invokeFunction("cancelSchedule", (Object) null);
+ iv.invokeFunction("cancelSchedule", (Object) null);
} catch (ScriptException | NoSuchMethodException ex) {
ex.printStackTrace();
}
@@ -166,7 +165,7 @@ public class EventManager {
private List getLobbyRange() {
try {
- List