This is an automated email from the ASF dual-hosted git repository.
henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push:
new 46854b60 JEXL-397: core permissions allow dynamic proxy introspection;
46854b60 is described below
commit 46854b60a75fba8ec96066fae6051e38c6fe1245
Author: Henri Biestro <[email protected]>
AuthorDate: Thu May 4 12:55:58 2023 +0200
JEXL-397: core permissions allow dynamic proxy introspection;
---
.../jexl3/internal/introspection/Permissions.java | 5 +++
.../org/apache/commons/jexl3/Issues300Test.java | 36 ++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git
a/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
b/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
index cbf5d987..983f9699 100644
---
a/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
+++
b/src/main/java/org/apache/commons/jexl3/internal/introspection/Permissions.java
@@ -20,6 +20,7 @@ package org.apache.commons.jexl3.internal.introspection;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
@@ -406,6 +407,10 @@ public class Permissions implements JexlPermissions {
if (!validate(clazz)) {
return false;
}
+ // proxy goes through
+ if (Proxy.isProxyClass(clazz)) {
+ return true;
+ }
// class must be allowed
if (deny(clazz)) {
return false;
diff --git a/src/test/java/org/apache/commons/jexl3/Issues300Test.java
b/src/test/java/org/apache/commons/jexl3/Issues300Test.java
index 34b4d008..b44eb879 100644
--- a/src/test/java/org/apache/commons/jexl3/Issues300Test.java
+++ b/src/test/java/org/apache/commons/jexl3/Issues300Test.java
@@ -18,12 +18,14 @@ package org.apache.commons.jexl3;
import org.apache.commons.jexl3.internal.Engine32;
import org.apache.commons.jexl3.internal.OptionsContext;
+import static
org.apache.commons.jexl3.introspection.JexlPermissions.RESTRICTED;
import org.apache.commons.jexl3.introspection.JexlSandbox;
import org.junit.Assert;
import org.junit.Test;
import java.io.StringReader;
import java.io.StringWriter;
+import java.lang.reflect.Proxy;
import java.math.MathContext;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1284,4 +1286,38 @@ public class Issues300Test {
Assert.assertEquals("foo", x.toString());
}
+ public interface Interface397i {
+ String summary();
+ }
+ static private class Class397 implements Interface397i {
+ @Override public String summary() {
+ return getClass().getName();
+ }
+ }
+ <T> T createProxy(final JexlEngine jexl, final Object o, final Class[]
clazzz) {
+ // a JEX-based delegating proxy
+ return (T) Proxy.newProxyInstance(getClass().getClassLoader(), clazzz,
+ (proxy, method, args) -> jexl.invokeMethod(o, method.getName(),
args)
+ );
+ }
+
+ @Test public void testIssue397() {
+ String result;
+ final String control = Class397.class.getName();
+ final JexlEngine jexl = new
JexlBuilder().permissions(RESTRICTED).create();
+
+ Interface397i instance = new Class397();
+ result = (String) jexl.invokeMethod(instance, "summary");
+ Assert.assertEquals(control, result);
+
+ Interface397i proxy = createProxy(jexl, instance, new Class[] {
Interface397i.class }) ;
+ result = (String) jexl.invokeMethod(proxy, "summary");
+ Assert.assertEquals(control, result);
+
+ JexlScript script = jexl.createScript("dan.summary()", "dan");
+ result = (String) script.execute(null, instance);
+ Assert.assertEquals(control, result);
+ result = (String) script.execute(null, proxy);
+ Assert.assertEquals(control, result);
+ }
}