1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.jexl3;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertFalse;
21 import static org.junit.jupiter.api.Assertions.assertTrue;
22
23 import java.util.List;
24
25 import org.apache.commons.jexl3.introspection.JexlPermissions;
26 import org.junit.jupiter.api.Test;
27
28
29
30
31
32 class LoggingPermissionsTest {
33
34 @Test
35 void testLoggingPermissionsCaptureAndDedup() throws Exception {
36 final CaptureLog log = new CaptureLog();
37 final JexlPermissions perms = JexlPermissions.RESTRICTED.logging(log);
38
39 for (int i = 0; i < 2; i++) {
40 assertTrue(perms.allow(String.class));
41 assertFalse(perms.allow(java.lang.Runtime.class));
42 assertTrue(perms.allow(String.class.getMethod("length")));
43 }
44 final List<String> msgs = log.getCapturedMessages();
45
46
47
48 assertEquals(4, msgs.size(), msgs::toString);
49 assertEquals(4, log.count("info"));
50 assertTrue(msgs.contains("Class java.lang.String is allowed"));
51 assertTrue(msgs.contains("Class java.lang.Runtime is denied"));
52 assertTrue(msgs.contains("Method java.lang.String.length() is allowed"));
53 assertTrue(msgs.contains("Method java.lang.String.length() is allowed for class java.lang.String"));
54 }
55
56 @Test
57 void testLoggingConstructorAndField() throws Exception {
58 final CaptureLog log = new CaptureLog();
59 final JexlPermissions perms = JexlPermissions.RESTRICTED.logging(log);
60
61 for (int i = 0; i < 2; i++) {
62 assertTrue(perms.allow(StringBuilder.class.getConstructor()));
63 assertFalse(perms.allow(java.io.File.class.getConstructor(String.class)));
64 assertTrue(perms.allow(Integer.class.getField("MAX_VALUE")));
65 assertFalse(perms.allow(System.class.getField("out")));
66 }
67 final List<String> msgs = log.getCapturedMessages();
68
69 assertTrue(msgs.stream().anyMatch(m ->
70 m.startsWith("Constructor java.lang.StringBuilder") && m.endsWith("is allowed")), msgs::toString);
71 assertTrue(msgs.stream().anyMatch(m ->
72 m.startsWith("Constructor java.io.File") && m.endsWith("is denied")), msgs::toString);
73
74 assertTrue(msgs.contains("Field java.lang.Integer.MAX_VALUE is allowed"), msgs::toString);
75 assertTrue(msgs.contains("Field java.lang.System.out is denied"), msgs::toString);
76 assertTrue(msgs.contains("Field java.lang.System.out is denied for class java.lang.System"), msgs::toString);
77
78 assertEquals(msgs.size(), msgs.stream().distinct().count(), msgs::toString);
79 }
80
81 @Test
82 void testLoggingComposePreservesWrapper() throws Exception {
83 final CaptureLog log = new CaptureLog();
84 final JexlPermissions composed =
85 JexlPermissions.RESTRICTED.logging(log).compose("java.io { +File {} }");
86 assertTrue(composed instanceof JexlPermissions.LoggingPermissions);
87 assertTrue(composed.allow(java.io.File.class));
88 assertTrue(log.getCapturedMessages().contains("Class java.io.File is allowed"));
89 }
90
91 @Test
92 void testLoggingFactories() {
93
94 assertTrue(JexlPermissions.RESTRICTED.logging() instanceof JexlPermissions.LoggingPermissions);
95 final JexlPermissions named = JexlPermissions.RESTRICTED.logging("jexl.test.perms");
96 assertTrue(named instanceof JexlPermissions.LoggingPermissions);
97
98 assertTrue(named.allow(String.class));
99 assertFalse(named.allow(java.lang.Runtime.class));
100 }
101 }