Skip to content

Commit 5cd409d

Browse files
committed
Uses OGNL 3.2.2 which always requires MemberAccess
1 parent d63cc99 commit 5cd409d

File tree

14 files changed

+118
-59
lines changed

14 files changed

+118
-59
lines changed

‎core/src/main/java/com/opensymphony/xwork2/ActionContext.java‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
*/
1919
package com.opensymphony.xwork2;
2020

21+
import com.opensymphony.xwork2.conversion.TypeConverter;
2122
import com.opensymphony.xwork2.inject.Container;
2223
import com.opensymphony.xwork2.util.ValueStack;
24+
import ognl.OgnlContext;
2325
import org.apache.struts2.dispatcher.HttpParameters;
2426

2527
import java.io.Serializable;
@@ -184,6 +186,10 @@ public void setContextMap(Map<String, Object> contextMap) {
184186
* @return the context map.
185187
*/
186188
public Map<String, Object> getContextMap() {
189+
Map<String, Object> context = getContext().context;
190+
if (context instanceof OgnlContext) {
191+
((OgnlContext) context).put(TypeConverter.TYPE_CONVERTER_CONTEXT_KEY, ((OgnlContext) context).getTypeConverter());
192+
}
187193
return context;
188194
}
189195

‎core/src/main/java/com/opensymphony/xwork2/ognl/OgnlUtil.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ protected Map createDefaultContext(Object root, ClassResolver classResolver) {
677677
memberAccess.setExcludedPackageNames(excludedPackageNames);
678678
memberAccess.setDisallowProxyMemberAccess(disallowProxyMemberAccess);
679679

680-
return Ognl.createDefaultContext(root, resolver, defaultConverter, memberAccess);
680+
return Ognl.createDefaultContext(root, memberAccess, resolver, defaultConverter);
681681
}
682682

683683
private interface OgnlTask<T> {

‎core/src/main/java/com/opensymphony/xwork2/ognl/OgnlValueStack.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor acces
9494
boolean allowStaticMethodAccess) {
9595
this.root = compoundRoot;
9696
this.securityMemberAccess = new SecurityMemberAccess(allowStaticMethodAccess);
97-
this.context = Ognl.createDefaultContext(this.root, accessor, new OgnlTypeConverterWrapper(xworkConverter), securityMemberAccess);
97+
this.context = Ognl.createDefaultContext(this.root, securityMemberAccess, accessor, new OgnlTypeConverterWrapper(xworkConverter));
9898
context.put(VALUE_STACK, this);
9999
((OgnlContext) context).setTraceEvaluations(false);
100100
((OgnlContext) context).setKeepLastEvaluation(false);

‎core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java‎

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
package com.opensymphony.xwork2.ognl;
2020

2121
import com.opensymphony.xwork2.util.ProxyUtil;
22-
import ognl.DefaultMemberAccess;
22+
import ognl.MemberAccess;
2323
import org.apache.logging.log4j.LogManager;
2424
import org.apache.logging.log4j.Logger;
2525

26-
import java.lang.reflect.*;
26+
import java.lang.reflect.AccessibleObject;
27+
import java.lang.reflect.Member;
28+
import java.lang.reflect.Modifier;
2729
import java.util.Collections;
2830
import java.util.Map;
2931
import java.util.Set;
@@ -34,7 +36,7 @@
3436
* Allows access decisions to be made on the basis of whether a member is static or not.
3537
* Also blocks or allows access to properties.
3638
*/
37-
public class SecurityMemberAccess extends DefaultMemberAccess {
39+
public class SecurityMemberAccess implements MemberAccess {
3840

3941
private static final Logger LOG = LogManager.getLogger(SecurityMemberAccess.class);
4042

@@ -47,14 +49,35 @@ public class SecurityMemberAccess extends DefaultMemberAccess {
4749
private boolean disallowProxyMemberAccess;
4850

4951
public SecurityMemberAccess(boolean method) {
50-
super(false);
5152
allowStaticMethodAccess = method;
5253
}
5354

5455
public boolean getAllowStaticMethodAccess() {
5556
return allowStaticMethodAccess;
5657
}
5758

59+
@Override
60+
public Object setup(Map context, Object target, Member member, String propertyName) {
61+
Object result = null;
62+
63+
if (isAccessible(context, target, member, propertyName)) {
64+
AccessibleObject accessible = (AccessibleObject) member;
65+
66+
if (!accessible.isAccessible()) {
67+
result = Boolean.TRUE;
68+
accessible.setAccessible(true);
69+
}
70+
}
71+
return result;
72+
}
73+
74+
@Override
75+
public void restore(Map context, Object target, Member member, String propertyName, Object state) {
76+
if (state != null) {
77+
((AccessibleObject) member).setAccessible((Boolean) state);
78+
}
79+
}
80+
5881
@Override
5982
public boolean isAccessible(Map context, Object target, Member member, String propertyName) {
6083
LOG.debug("Checking access for [target: {}, member: {}, property: {}]", target, member, propertyName);
@@ -105,8 +128,7 @@ public boolean isAccessible(Map context, Object target, Member member, String pr
105128
return false;
106129
}
107130

108-
// Now check for standard scope rules
109-
return super.isAccessible(context, target, member, propertyName) && isAcceptableProperty(propertyName);
131+
return Modifier.isPublic(member.getModifiers()) && isAcceptableProperty(propertyName);
110132
}
111133

112134
protected boolean checkStaticMethodAccess(Member member) {
@@ -132,7 +154,7 @@ protected boolean isPackageExcluded(Package targetPackage, Package memberPackage
132154
if (targetPackage == null || memberPackage == null) {
133155
LOG.warn("The use of the default (unnamed) package is discouraged!");
134156
}
135-
157+
136158
final String targetPackageName = targetPackage == null ? "" : targetPackage.getName();
137159
final String memberPackageName = memberPackage == null ? "" : memberPackage.getName();
138160

@@ -142,7 +164,7 @@ protected boolean isPackageExcluded(Package targetPackage, Package memberPackage
142164
}
143165
}
144166

145-
for (String packageName: excludedPackageNames) {
167+
for (String packageName : excludedPackageNames) {
146168
if (targetPackageName.startsWith(packageName) || targetPackageName.equals(packageName)
147169
|| memberPackageName.startsWith(packageName) || memberPackageName.equals(packageName)) {
148170
return true;

‎core/src/main/java/org/apache/struts2/views/jsp/ui/OgnlTool.java‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.apache.struts2.views.jsp.ui;
2020

21-
import ognl.Ognl;
21+
import com.opensymphony.xwork2.ActionContext;
2222
import ognl.OgnlException;
2323

2424
import com.opensymphony.xwork2.inject.Inject;
@@ -30,18 +30,18 @@
3030
public class OgnlTool {
3131

3232
private OgnlUtil ognlUtil;
33-
33+
3434
public OgnlTool() {
3535
}
36-
36+
3737
@Inject
3838
public void setOgnlUtil(OgnlUtil ognlUtil) {
3939
this.ognlUtil = ognlUtil;
4040
}
41-
41+
4242
public Object findValue(String expr, Object context) {
4343
try {
44-
return Ognl.getValue(ognlUtil.compile(expr), context);
44+
return ognlUtil.getValue(expr, ActionContext.getContext().getContextMap(), context);
4545
} catch (OgnlException e) {
4646
return null;
4747
}

‎core/src/main/resources/struts-default.xml‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
ognl.ClassResolver,
5050
ognl.TypeConverter,
5151
ognl.MemberAccess,
52-
ognl.DefaultMemberAccess,
5352
com.opensymphony.xwork2.ognl.SecurityMemberAccess,
5453
com.opensymphony.xwork2.ActionContext" />
5554

‎core/src/test/java/com/opensymphony/xwork2/DefaultActionInvocationTest.java‎

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,8 @@ public void testDeserialization() throws Exception {
105105

106106
public void testInvokingExistingExecuteMethod() throws Exception {
107107
// given
108-
DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) {
109-
public ValueStack getStack() {
110-
return new StubValueStack();
111-
}
112-
};
108+
DefaultActionInvocation dai = new DefaultActionInvocation(ActionContext.getContext().getContextMap(), false);
109+
container.inject(dai);
113110

114111
SimpleAction action = new SimpleAction() {
115112
@Override
@@ -120,6 +117,7 @@ public String execute() throws Exception {
120117
MockActionProxy proxy = new MockActionProxy();
121118
proxy.setMethod("execute");
122119

120+
dai.stack = container.getInstance(ValueStackFactory.class).createValueStack();
123121
dai.proxy = proxy;
124122
dai.ognlUtil = new OgnlUtil();
125123

@@ -132,11 +130,8 @@ public String execute() throws Exception {
132130

133131
public void testInvokingMissingMethod() throws Exception {
134132
// given
135-
DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) {
136-
public ValueStack getStack() {
137-
return new StubValueStack();
138-
}
139-
};
133+
DefaultActionInvocation dai = new DefaultActionInvocation(ActionContext.getContext().getContextMap(), false);
134+
container.inject(dai);
140135

141136
SimpleAction action = new SimpleAction() {
142137
@Override
@@ -154,6 +149,7 @@ public boolean hasUnknownHandlers() {
154149
}
155150
};
156151

152+
dai.stack = container.getInstance(ValueStackFactory.class).createValueStack();
157153
dai.proxy = proxy;
158154
dai.ognlUtil = new OgnlUtil();
159155
dai.unknownHandlerManager = uhm;
@@ -173,11 +169,8 @@ public boolean hasUnknownHandlers() {
173169

174170
public void testInvokingExistingMethodThatThrowsException() throws Exception {
175171
// given
176-
DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) {
177-
public ValueStack getStack() {
178-
return new StubValueStack();
179-
}
180-
};
172+
DefaultActionInvocation dai = new DefaultActionInvocation(ActionContext.getContext().getContextMap(), false);
173+
container.inject(dai);
181174

182175
SimpleAction action = new SimpleAction() {
183176
@Override
@@ -188,6 +181,7 @@ public String execute() throws Exception {
188181
MockActionProxy proxy = new MockActionProxy();
189182
proxy.setMethod("execute");
190183

184+
dai.stack = container.getInstance(ValueStackFactory.class).createValueStack();
191185
dai.proxy = proxy;
192186
dai.ognlUtil = new OgnlUtil();
193187

@@ -206,11 +200,8 @@ public String execute() throws Exception {
206200

207201
public void testUnknownHandlerManagerThatThrowsException() throws Exception {
208202
// given
209-
DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) {
210-
public ValueStack getStack() {
211-
return new StubValueStack();
212-
}
213-
};
203+
DefaultActionInvocation dai = new DefaultActionInvocation(ActionContext.getContext().getContextMap(), false);
204+
container.inject(dai);
214205

215206
UnknownHandlerManager uhm = new DefaultUnknownHandlerManager() {
216207
@Override
@@ -227,6 +218,7 @@ public Object handleUnknownMethod(Object action, String methodName) throws NoSuc
227218
MockActionProxy proxy = new MockActionProxy();
228219
proxy.setMethod("notExists");
229220

221+
dai.stack = container.getInstance(ValueStackFactory.class).createValueStack();
230222
dai.proxy = proxy;
231223
dai.ognlUtil = new OgnlUtil();
232224
dai.unknownHandlerManager = uhm;
@@ -247,11 +239,8 @@ public Object handleUnknownMethod(Object action, String methodName) throws NoSuc
247239

248240
public void testUnknownHandlerManagerThatReturnsNull() throws Exception {
249241
// given
250-
DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) {
251-
public ValueStack getStack() {
252-
return new StubValueStack();
253-
}
254-
};
242+
DefaultActionInvocation dai = new DefaultActionInvocation(ActionContext.getContext().getContextMap(), false);
243+
container.inject(dai);
255244

256245
UnknownHandlerManager uhm = new DefaultUnknownHandlerManager() {
257246
@Override
@@ -268,6 +257,7 @@ public Object handleUnknownMethod(Object action, String methodName) throws NoSuc
268257
MockActionProxy proxy = new MockActionProxy();
269258
proxy.setMethod("notExists");
270259

260+
dai.stack = container.getInstance(ValueStackFactory.class).createValueStack();
271261
dai.proxy = proxy;
272262
dai.ognlUtil = new OgnlUtil();
273263
dai.unknownHandlerManager = uhm;
@@ -287,11 +277,8 @@ public Object handleUnknownMethod(Object action, String methodName) throws NoSuc
287277

288278
public void testUnknownHandlerManagerThatReturnsSuccess() throws Exception {
289279
// given
290-
DefaultActionInvocation dai = new DefaultActionInvocation(new HashMap<String, Object>(), false) {
291-
public ValueStack getStack() {
292-
return new StubValueStack();
293-
}
294-
};
280+
DefaultActionInvocation dai = new DefaultActionInvocation(ActionContext.getContext().getContextMap(), false);
281+
container.inject(dai);
295282

296283
UnknownHandlerManager uhm = new DefaultUnknownHandlerManager() {
297284
@Override
@@ -308,6 +295,7 @@ public Object handleUnknownMethod(Object action, String methodName) throws NoSuc
308295
MockActionProxy proxy = new MockActionProxy();
309296
proxy.setMethod("notExists");
310297

298+
dai.stack = container.getInstance(ValueStackFactory.class).createValueStack();
311299
dai.proxy = proxy;
312300
dai.ognlUtil = new OgnlUtil();
313301
dai.unknownHandlerManager = uhm;

‎core/src/test/java/com/opensymphony/xwork2/conversion/impl/AnnotationXWorkConverterTest.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.opensymphony.xwork2.util.Bar;
2525
import com.opensymphony.xwork2.util.ValueStack;
2626
import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
27+
import ognl.Ognl;
2728
import ognl.OgnlException;
2829
import ognl.OgnlRuntime;
2930

‎core/src/test/java/com/opensymphony/xwork2/ognl/SetPropertiesTest.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public void setUp() throws Exception {
5757
}
5858
public void testOgnlUtilEmptyStringAsLong() {
5959
Bar bar = new Bar();
60-
Map context = Ognl.createDefaultContext(bar);
60+
Map context = Ognl.createDefaultContext(bar, new SecurityMemberAccess(false));
6161
context.put(XWorkConverter.REPORT_CONVERSION_ERRORS, Boolean.TRUE);
6262
bar.setId(null);
6363

‎core/src/test/java/org/apache/struts2/factory/StrutsResultFactoryTest.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.struts2.factory;
2020

21+
import com.opensymphony.xwork2.ActionContext;
2122
import com.opensymphony.xwork2.ActionInvocation;
2223
import com.opensymphony.xwork2.Result;
2324
import com.opensymphony.xwork2.config.entities.ResultConfig;
@@ -39,10 +40,9 @@ public void testAcceptParams() throws Exception {
3940
params.put("accept", "ok");
4041
params.put("reject", "bad");
4142
ResultConfig config = new ResultConfig.Builder("struts", MyResult.class.getName()).addParams(params).build();
42-
Map<String, Object> context = new HashMap<String, Object>();
4343

4444
// when
45-
Result result = builder.buildResult(config, context);
45+
Result result = builder.buildResult(config, ActionContext.getContext().getContextMap());
4646

4747
// then
4848
assertEquals("ok", ((MyResult)result).getAccept());

0 commit comments

Comments
 (0)