Skip to content

Commit e34f953

Browse files
committed
Wrap at a higher level and don't resolve ____int3rpr3t3r____
1 parent 49c9aee commit e34f953

20 files changed

Lines changed: 98 additions & 58 deletions
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.hubspot.jinjava.el;
2+
3+
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
4+
5+
public interface HasInterpreter {
6+
JinjavaInterpreter interpreter();
7+
}

src/main/java/com/hubspot/jinjava/el/JinjavaELContext.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
import java.lang.reflect.Method;
66
import javax.el.ELResolver;
77

8-
public class JinjavaELContext extends SimpleContext {
8+
public class JinjavaELContext extends SimpleContext implements HasInterpreter {
99

1010
private JinjavaInterpreter interpreter;
1111
private MacroFunctionMapper functionMapper;
1212

13+
@Deprecated
1314
public JinjavaELContext() {
1415
super();
1516
}
@@ -19,6 +20,11 @@ public JinjavaELContext(JinjavaInterpreter interpreter, ELResolver resolver) {
1920
this.interpreter = interpreter;
2021
}
2122

23+
@Override
24+
public JinjavaInterpreter interpreter() {
25+
return interpreter;
26+
}
27+
2228
@Override
2329
public MacroFunctionMapper getFunctionMapper() {
2430
if (functionMapper == null) {

src/main/java/com/hubspot/jinjava/el/JinjavaInterpreterResolver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ private Object getValue(
276276
}
277277

278278
context.setPropertyResolved(true);
279-
return wrap(value);
279+
return value;
280280
}
281281

282282
@SuppressWarnings("unchecked")

src/main/java/com/hubspot/jinjava/el/NoInvokeELContext.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.hubspot.jinjava.el;
22

3+
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
34
import javax.el.ELContext;
45
import javax.el.ELResolver;
56
import javax.el.FunctionMapper;
67
import javax.el.VariableMapper;
78

8-
public class NoInvokeELContext extends ELContext {
9+
public class NoInvokeELContext extends ELContext implements HasInterpreter {
910

10-
private ELContext delegate;
11+
private final ELContext delegate;
1112
private NoInvokeELResolver elResolver;
1213

1314
public NoInvokeELContext(ELContext delegate) {
@@ -31,4 +32,9 @@ public FunctionMapper getFunctionMapper() {
3132
public VariableMapper getVariableMapper() {
3233
return delegate.getVariableMapper();
3334
}
35+
36+
@Override
37+
public JinjavaInterpreter interpreter() {
38+
return ((HasInterpreter) delegate).interpreter();
39+
}
3440
}

src/main/java/com/hubspot/jinjava/el/ReturnTypeValidatingJinjavaInterpreterResolver.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public Class<?> getType(ELContext context, Object base, Object property) {
4040
@Override
4141
public Object getValue(ELContext context, Object base, Object property) {
4242
return returnTypeValidator.validateReturnType(
43-
delegate.getValue(context, base, property)
43+
wrap(delegate.getValue(context, base, property))
4444
);
4545
}
4646

@@ -63,7 +63,11 @@ public Object invoke(
6363
Object[] params
6464
) {
6565
return returnTypeValidator.validateReturnType(
66-
delegate.invoke(context, base, method, paramTypes, params)
66+
wrap(delegate.invoke(context, base, method, paramTypes, params))
6767
);
6868
}
69+
70+
Object wrap(Object object) {
71+
return delegate.wrap(object);
72+
}
6973
}

src/main/java/com/hubspot/jinjava/el/ext/AllowlistGroup.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ Class<?>[] allowedDeclaredMethodsFromClasses() {
129129
String[] allowedDeclaredMethodsFromCanonicalClassPrefixes() {
130130
return ARRAY;
131131
}
132+
133+
@Override
134+
String[] allowedReturnTypeCanonicalClassPrefixes() {
135+
return ARRAY;
136+
}
132137
},
133138
JinjavaFunctions,
134139
JinjavaExpTests {

src/main/java/com/hubspot/jinjava/el/ext/AllowlistReturnTypeValidator.java

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import com.google.common.collect.ImmutableList;
44
import com.google.common.collect.ImmutableSet;
5-
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
65

76
public final class AllowlistReturnTypeValidator {
87

@@ -32,27 +31,22 @@ private AllowlistReturnTypeValidator(
3231
}
3332

3433
public Object validateReturnType(Object o) {
35-
Object wrapped = JinjavaInterpreter
36-
.getCurrentMaybe()
37-
.map(jinjavaInterpreter -> jinjavaInterpreter.wrap(o))
38-
.orElse(o);
39-
40-
if (wrapped == null) {
34+
if (o == null) {
4135
return null;
4236
}
43-
Class<?> clazz = wrapped.getClass();
37+
Class<?> clazz = o.getClass();
4438
String canonicalClassName = clazz.getCanonicalName();
4539
if (
4640
allowedCanonicalClassNames.contains(canonicalClassName) ||
4741
allowedCanonicalClassPrefixes.stream().anyMatch(canonicalClassName::startsWith)
4842
) {
4943
for (ReturnTypeValidator v : additionalValidators) {
50-
wrapped = v.validateReturnType(wrapped);
51-
if (wrapped == null) {
44+
o = v.validateReturnType(o);
45+
if (o == null) {
5246
return null;
5347
}
5448
}
55-
return wrapped;
49+
return o;
5650
}
5751
return null;
5852
}

src/main/java/com/hubspot/jinjava/el/ext/AstDict.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hubspot.jinjava.el.ext;
22

3+
import com.hubspot.jinjava.el.HasInterpreter;
34
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
45
import com.hubspot.jinjava.interpret.TemplateStateException;
56
import com.hubspot.jinjava.objects.collections.SizeLimitingPyMap;
@@ -26,10 +27,7 @@ public AstDict(Map<AstNode, AstNode> dict) {
2627
public Object eval(Bindings bindings, ELContext context) {
2728
Map<String, Object> resolved = new LinkedHashMap<>();
2829

29-
JinjavaInterpreter interpreter = (JinjavaInterpreter) context
30-
.getELResolver()
31-
.getValue(context, null, ExtendedParser.INTERPRETER);
32-
30+
JinjavaInterpreter interpreter = ((HasInterpreter) context).interpreter();
3331
for (Map.Entry<AstNode, AstNode> entry : dict.entrySet()) {
3432
String key;
3533
AstNode entryKey = entry.getKey();

src/main/java/com/hubspot/jinjava/el/ext/AstFilterChain.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hubspot.jinjava.el.ext;
22

3+
import com.hubspot.jinjava.el.HasInterpreter;
34
import com.hubspot.jinjava.interpret.DisabledException;
45
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
56
import com.hubspot.jinjava.interpret.TemplateError;
@@ -120,9 +121,7 @@ public Object eval(Bindings bindings, ELContext context) {
120121
}
121122

122123
protected JinjavaInterpreter getInterpreter(ELContext context) {
123-
return (JinjavaInterpreter) context
124-
.getELResolver()
125-
.getValue(context, null, ExtendedParser.INTERPRETER);
124+
return ((HasInterpreter) context).interpreter();
126125
}
127126

128127
protected Object[] evaluateFilterArgs(

src/main/java/com/hubspot/jinjava/el/ext/AstList.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hubspot.jinjava.el.ext;
22

3+
import com.hubspot.jinjava.el.HasInterpreter;
34
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
45
import com.hubspot.jinjava.objects.collections.SizeLimitingPyList;
56
import de.odysseus.el.tree.Bindings;
@@ -26,9 +27,7 @@ public Object eval(Bindings bindings, ELContext context) {
2627
list.add(elements.getChild(i).eval(bindings, context));
2728
}
2829

29-
JinjavaInterpreter interpreter = (JinjavaInterpreter) context
30-
.getELResolver()
31-
.getValue(context, null, ExtendedParser.INTERPRETER);
30+
JinjavaInterpreter interpreter = ((HasInterpreter) context).interpreter();
3231

3332
return new SizeLimitingPyList(list, interpreter.getConfig().getMaxListSize());
3433
}

0 commit comments

Comments
 (0)