diff --git a/build.gradle b/build.gradle
index 56a9bb28fe..5ed34e796f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -160,7 +160,9 @@ dependencies {
implementation 'ch.digitalfondue.vatchecker:vatchecker:1.6.0'
implementation 'ch.digitalfondue.basicxlsx:basicxlsx:0.7.1'
implementation 'org.imgscalr:imgscalr-lib:4.2'
- implementation 'org.mozilla:rhino-runtime:1.7.15.1'
+ implementation 'io.roastedroot:quickjs4j:0.0.17'
+ implementation 'io.roastedroot:quickjs4j-annotations:0.0.17'
+ annotationProcessor 'io.roastedroot:quickjs4j-processor:0.0.17'
implementation 'com.google.auth:google-auth-library-oauth2-http:1.41.0'
testImplementation 'org.testcontainers:testcontainers'
diff --git a/src/main/java/alfio/extension/exception/OutOfBoundariesException.java b/src/main/java/alfio/extension/ConsoleApi.java
similarity index 57%
rename from src/main/java/alfio/extension/exception/OutOfBoundariesException.java
rename to src/main/java/alfio/extension/ConsoleApi.java
index 634d917028..40ae337603 100644
--- a/src/main/java/alfio/extension/exception/OutOfBoundariesException.java
+++ b/src/main/java/alfio/extension/ConsoleApi.java
@@ -14,18 +14,25 @@
* You should have received a copy of the GNU General Public License
* along with alf.io. If not, see .
*/
-package alfio.extension.exception;
+package alfio.extension;
-/**
- * Exception thrown if some out of boundaries usage (forbidden methods calls) happens when executing a script.
- */
-public class OutOfBoundariesException extends AlfioScriptingException {
+import io.roastedroot.quickjs4j.annotations.Builtins;
+import io.roastedroot.quickjs4j.annotations.HostFunction;
- public OutOfBoundariesException(String message) {
- super(message);
- }
+@Builtins("console")
+class ConsoleApi {
+ private final ConsoleLogger logger;
- public OutOfBoundariesException(String message, Throwable cause) {
- super(message, cause);
+ ConsoleApi(ConsoleLogger logger) {
+ this.logger = logger;
}
+
+ @HostFunction
+ public void log(String msg) { logger.log(msg); }
+
+ @HostFunction
+ public void warn(String msg) { logger.warn(msg); }
+
+ @HostFunction
+ public void error(String msg) { logger.error(msg); }
}
diff --git a/src/main/java/alfio/extension/ConsoleLogger.java b/src/main/java/alfio/extension/ConsoleLogger.java
index ff2ea25a16..bd5aa758f0 100644
--- a/src/main/java/alfio/extension/ConsoleLogger.java
+++ b/src/main/java/alfio/extension/ConsoleLogger.java
@@ -55,7 +55,6 @@ private static String composeMessage(Object first, Object... others) {
if(others != null) {
parameterPlaceholders = " %s".repeat(others.length);
paramObjects = Stream.concat(Stream.of(first), Arrays.stream(others))
- .map(ExtensionUtils::unwrap)
.toArray();
} else {
paramObjects = new Object[] {first};
diff --git a/src/main/java/alfio/extension/support/SandboxNativeJavaList.java b/src/main/java/alfio/extension/ExtensionLoggerApi.java
similarity index 51%
rename from src/main/java/alfio/extension/support/SandboxNativeJavaList.java
rename to src/main/java/alfio/extension/ExtensionLoggerApi.java
index cf6eb36b6b..1ee02cad66 100644
--- a/src/main/java/alfio/extension/support/SandboxNativeJavaList.java
+++ b/src/main/java/alfio/extension/ExtensionLoggerApi.java
@@ -14,23 +14,28 @@
* You should have received a copy of the GNU General Public License
* along with alf.io. If not, see .
*/
-package alfio.extension.support;
+package alfio.extension;
-import alfio.extension.exception.OutOfBoundariesException;
-import org.mozilla.javascript.NativeJavaList;
-import org.mozilla.javascript.Scriptable;
+import io.roastedroot.quickjs4j.annotations.Builtins;
+import io.roastedroot.quickjs4j.annotations.HostFunction;
-public class SandboxNativeJavaList extends NativeJavaList {
- public SandboxNativeJavaList(Scriptable scope, Object map) {
- super(scope, map);
+@Builtins("extensionLogger")
+class ExtensionLoggerApi {
+ private final ExtensionLogger logger;
+
+ ExtensionLoggerApi(ExtensionLogger logger) {
+ this.logger = logger;
}
- @Override
- public Object get(String name, Scriptable start) {
- if (name.equals("getClass")) {
- throw new OutOfBoundariesException("Out of boundaries class use.");
- }
+ @HostFunction
+ public void logInfo(String msg) { logger.logInfo(msg); }
- return super.get(name, start);
- }
+ @HostFunction
+ public void logWarning(String msg) { logger.logWarning(msg); }
+
+ @HostFunction
+ public void logError(String msg) { logger.logError(msg); }
+
+ @HostFunction
+ public void logSuccess(String msg) { logger.logSuccess(msg); }
}
diff --git a/src/main/java/alfio/extension/ExtensionService.java b/src/main/java/alfio/extension/ExtensionService.java
index ae273aaba8..a875704b2f 100644
--- a/src/main/java/alfio/extension/ExtensionService.java
+++ b/src/main/java/alfio/extension/ExtensionService.java
@@ -54,9 +54,9 @@
@AllArgsConstructor
public class ExtensionService {
- private static final String EVALUATE_RESULT = "res = GSON.fromJson(JSON.stringify(res), returnClass);";
- private static final String PROCESS_EXTENSION_RESULT = "var res = executeScript(extensionEvent); " + EVALUATE_RESULT;
- private static final String PROCESS_CAPABILITY_RESULT = "var res = executeCapability(capability); " + EVALUATE_RESULT;
+ private static final String SET_RESULT = "alfio_internal.setResult(JSON.stringify(res));";
+ private static final String PROCESS_EXTENSION_RESULT = "var res = executeScript(extensionEvent); " + SET_RESULT;
+ private static final String PROCESS_CAPABILITY_RESULT = "var res = executeCapability(capability); " + SET_RESULT;
private static final String EXECUTE_SCRIPT = "executeScript(extensionEvent);";
private static final String OUTPUT = "output";
private static final String EXECUTION_KEY = "executionKey";
@@ -112,7 +112,7 @@ private static final class NoopExtensionLogger implements ExtensionLogger {
private ExtensionMetadata getMetadata(String name, String script) {
return scriptingExecutionService.executeScript(
name,
- script + "\n;GSON.fromJson(JSON.stringify(getScriptMetadata()), returnClass);", //<- ugly hack, but the interop java<->js is simpler that way...
+ script + "\n;alfio_internal.setResult(JSON.stringify(getScriptMetadata()));",
Collections.emptyMap(),
ExtensionMetadata.class, new NoopExtensionLogger());
}
@@ -121,8 +121,6 @@ private ExtensionMetadata getMetadata(String name, String script) {
public void createOrUpdate(String previousPath, String previousName, Extension script) {
Validate.notBlank(script.getName(), "Name is mandatory");
Validate.notBlank(script.getPath(), "Path must be defined");
- ScriptValidation validation = new ScriptValidation(script.getScript());
- validation.validate();
String hash = DigestUtils.sha256Hex(script.getScript());
ExtensionMetadata extensionMetadata = getMetadata(script.getName(), script.getScript());
diff --git a/src/main/java/alfio/extension/ExtensionUtils.java b/src/main/java/alfio/extension/ExtensionUtils.java
index 25fc13c668..f6f2b50cda 100644
--- a/src/main/java/alfio/extension/ExtensionUtils.java
+++ b/src/main/java/alfio/extension/ExtensionUtils.java
@@ -22,7 +22,6 @@
import org.apache.commons.codec.digest.HmacAlgorithms;
import org.apache.commons.codec.digest.HmacUtils;
import org.apache.commons.lang3.StringUtils;
-import org.mozilla.javascript.*;
import java.lang.reflect.Type;
import java.nio.charset.StandardCharsets;
@@ -31,7 +30,8 @@
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Base64;
import java.util.stream.Collectors;
public class ExtensionUtils {
@@ -83,56 +83,8 @@ public static String base64UrlSafe(String input) {
.encodeToString(input.getBytes(StandardCharsets.UTF_8));
}
- /**
- * Unwrap / convert all Scriptable object to their java native counterpart and transform to json
- *
- * - NativeArray -> ArrayList
- * - NativeJavaObject -> unwrapped java object
- * - NativeObject -> LinkedHashMap
- *
- *
- * @param o
- * @return
- */
public static String convertToJson(Object o) {
- return JSON_SERIALIZER.toJson(unwrap(o));
- }
-
- static Object unwrap(Object o) {
- if (o instanceof Scriptable) {
- if (o instanceof NativeArray na) {
- List