Skip to content

Commit 885c500

Browse files
authored
Merge pull request #715 from apache/WW-5327-non-java-beans
[WW-5327] Stop using JavaBeans notation for setters in SecurityMemberAccess & MemberAccessValueStack
2 parents 85f7e8a + c7d88be commit 885c500

File tree

11 files changed

+188
-81
lines changed

11 files changed

+188
-81
lines changed

core/src/main/java/com/opensymphony/xwork2/interceptor/ParametersInterceptor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,8 +217,8 @@ protected void setParameters(final Object action, ValueStack stack, HttpParamete
217217
//block or allow access to properties
218218
//see WW-2761 for more details
219219
MemberAccessValueStack accessValueStack = (MemberAccessValueStack) newStack;
220-
accessValueStack.setAcceptProperties(acceptedPatterns.getAcceptedPatterns());
221-
accessValueStack.setExcludeProperties(excludedPatterns.getExcludedPatterns());
220+
accessValueStack.useAcceptProperties(acceptedPatterns.getAcceptedPatterns());
221+
accessValueStack.useExcludeProperties(excludedPatterns.getExcludedPatterns());
222222
}
223223

224224
for (Map.Entry<String, Parameter> entry : acceptableParameters.entrySet()) {

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -872,22 +872,22 @@ protected Map<String, Object> createDefaultContext(Object root, ClassResolver cl
872872
}
873873

874874
SecurityMemberAccess memberAccess = new SecurityMemberAccess(allowStaticFieldAccess);
875-
memberAccess.setDisallowProxyMemberAccess(disallowProxyMemberAccess);
875+
memberAccess.disallowProxyMemberAccess(disallowProxyMemberAccess);
876876

877877
if (devMode) {
878878
if (!warnReported.get()) {
879879
warnReported.set(true);
880880
LOG.warn("Working in devMode, using devMode excluded classes and packages!");
881881
}
882-
memberAccess.setExcludedClasses(devModeExcludedClasses);
883-
memberAccess.setExcludedPackageNamePatterns(devModeExcludedPackageNamePatterns);
884-
memberAccess.setExcludedPackageNames(devModeExcludedPackageNames);
885-
memberAccess.setExcludedPackageExemptClasses(devModeExcludedPackageExemptClasses);
882+
memberAccess.useExcludedClasses(devModeExcludedClasses);
883+
memberAccess.useExcludedPackageNamePatterns(devModeExcludedPackageNamePatterns);
884+
memberAccess.useExcludedPackageNames(devModeExcludedPackageNames);
885+
memberAccess.useExcludedPackageExemptClasses(devModeExcludedPackageExemptClasses);
886886
} else {
887-
memberAccess.setExcludedClasses(excludedClasses);
888-
memberAccess.setExcludedPackageNamePatterns(excludedPackageNamePatterns);
889-
memberAccess.setExcludedPackageNames(excludedPackageNames);
890-
memberAccess.setExcludedPackageExemptClasses(excludedPackageExemptClasses);
887+
memberAccess.useExcludedClasses(excludedClasses);
888+
memberAccess.useExcludedPackageNamePatterns(excludedPackageNamePatterns);
889+
memberAccess.useExcludedPackageNames(excludedPackageNames);
890+
memberAccess.useExcludedPackageExemptClasses(excludedPackageExemptClasses);
891891
}
892892

893893
return Ognl.createDefaultContext(root, memberAccess, resolver, defaultConverter);

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

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,11 +89,11 @@ protected OgnlValueStack(ValueStack vs, XWorkConverter xworkConverter, CompoundR
8989
@Inject
9090
protected void setOgnlUtil(OgnlUtil ognlUtil) {
9191
this.ognlUtil = ognlUtil;
92-
securityMemberAccess.setExcludedClasses(ognlUtil.getExcludedClasses());
93-
securityMemberAccess.setExcludedPackageNamePatterns(ognlUtil.getExcludedPackageNamePatterns());
94-
securityMemberAccess.setExcludedPackageNames(ognlUtil.getExcludedPackageNames());
95-
securityMemberAccess.setExcludedPackageExemptClasses(ognlUtil.getExcludedPackageExemptClasses());
96-
securityMemberAccess.setDisallowProxyMemberAccess(ognlUtil.isDisallowProxyMemberAccess());
92+
securityMemberAccess.useExcludedClasses(ognlUtil.getExcludedClasses());
93+
securityMemberAccess.useExcludedPackageNamePatterns(ognlUtil.getExcludedPackageNamePatterns());
94+
securityMemberAccess.useExcludedPackageNames(ognlUtil.getExcludedPackageNames());
95+
securityMemberAccess.useExcludedPackageExemptClasses(ognlUtil.getExcludedPackageExemptClasses());
96+
securityMemberAccess.disallowProxyMemberAccess(ognlUtil.isDisallowProxyMemberAccess());
9797
}
9898

9999
protected void setRoot(XWorkConverter xworkConverter, CompoundRootAccessor accessor, CompoundRoot compoundRoot, boolean allowStaticFieldAccess) {
@@ -482,12 +482,22 @@ public void clearContextValues() {
482482
((OgnlContext) context).getValues().clear();
483483
}
484484

485+
@Deprecated
485486
public void setAcceptProperties(Set<Pattern> acceptedProperties) {
486-
securityMemberAccess.setAcceptProperties(acceptedProperties);
487+
securityMemberAccess.useAcceptProperties(acceptedProperties);
487488
}
488489

490+
public void useAcceptProperties(Set<Pattern> acceptedProperties) {
491+
securityMemberAccess.useAcceptProperties(acceptedProperties);
492+
}
493+
494+
@Deprecated
489495
public void setExcludeProperties(Set<Pattern> excludeProperties) {
490-
securityMemberAccess.setExcludeProperties(excludeProperties);
496+
securityMemberAccess.useExcludeProperties(excludeProperties);
497+
}
498+
499+
public void useExcludeProperties(Set<Pattern> excludeProperties) {
500+
securityMemberAccess.useExcludeProperties(excludeProperties);
491501
}
492502

493503
@Inject

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,31 +299,87 @@ protected boolean isExcluded(String paramName) {
299299
return false;
300300
}
301301

302+
/**
303+
* @deprecated please use {@link #useExcludeProperties(Set)}
304+
*/
305+
@Deprecated
302306
public void setExcludeProperties(Set<Pattern> excludeProperties) {
303307
this.excludeProperties = excludeProperties;
304308
}
305309

310+
public void useExcludeProperties(Set<Pattern> excludeProperties) {
311+
this.excludeProperties = excludeProperties;
312+
}
313+
314+
/**
315+
* @deprecated please use {@link #useAcceptProperties(Set)}
316+
*/
317+
@Deprecated
306318
public void setAcceptProperties(Set<Pattern> acceptedProperties) {
307319
this.acceptProperties = acceptedProperties;
308320
}
309321

322+
public void useAcceptProperties(Set<Pattern> acceptedProperties) {
323+
this.acceptProperties = acceptedProperties;
324+
}
325+
326+
/**
327+
* @deprecated please use {@link #useExcludedClasses(Set)}
328+
*/
329+
@Deprecated
310330
public void setExcludedClasses(Set<Class<?>> excludedClasses) {
311331
this.excludedClasses = excludedClasses;
312332
}
313333

334+
public void useExcludedClasses(Set<Class<?>> excludedClasses) {
335+
this.excludedClasses = excludedClasses;
336+
}
337+
338+
/**
339+
* @deprecated please use {@link #useExcludedPackageNamePatterns(Set)}
340+
*/
341+
@Deprecated
314342
public void setExcludedPackageNamePatterns(Set<Pattern> excludedPackageNamePatterns) {
315343
this.excludedPackageNamePatterns = excludedPackageNamePatterns;
316344
}
317345

346+
public void useExcludedPackageNamePatterns(Set<Pattern> excludedPackageNamePatterns) {
347+
this.excludedPackageNamePatterns = excludedPackageNamePatterns;
348+
}
349+
350+
/**
351+
* @deprecated please use {@link #useExcludedPackageNames(Set)}
352+
*/
353+
@Deprecated
318354
public void setExcludedPackageNames(Set<String> excludedPackageNames) {
319355
this.excludedPackageNames = excludedPackageNames;
320356
}
321357

358+
public void useExcludedPackageNames(Set<String> excludedPackageNames) {
359+
this.excludedPackageNames = excludedPackageNames;
360+
}
361+
362+
/**
363+
* @deprecated please use {@link #useExcludedPackageExemptClasses(Set)}
364+
*/
365+
@Deprecated
322366
public void setExcludedPackageExemptClasses(Set<Class<?>> excludedPackageExemptClasses) {
323367
this.excludedPackageExemptClasses = excludedPackageExemptClasses;
324368
}
325369

370+
public void useExcludedPackageExemptClasses(Set<Class<?>> excludedPackageExemptClasses) {
371+
this.excludedPackageExemptClasses = excludedPackageExemptClasses;
372+
}
373+
374+
/**
375+
* @deprecated please use {@link #disallowProxyMemberAccess(boolean)}
376+
*/
377+
@Deprecated
326378
public void setDisallowProxyMemberAccess(boolean disallowProxyMemberAccess) {
327379
this.disallowProxyMemberAccess = disallowProxyMemberAccess;
328380
}
381+
382+
public void disallowProxyMemberAccess(boolean disallowProxyMemberAccess) {
383+
this.disallowProxyMemberAccess = disallowProxyMemberAccess;
384+
}
329385
}

core/src/main/java/com/opensymphony/xwork2/util/MemberAccessValueStack.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,20 @@
2727
*/
2828
public interface MemberAccessValueStack {
2929

30+
/**
31+
* @deprecated please use {@link #useExcludeProperties(Set)}
32+
*/
33+
@Deprecated
3034
void setExcludeProperties(Set<Pattern> excludeProperties);
3135

36+
void useExcludeProperties(Set<Pattern> excludeProperties);
37+
38+
/**
39+
* @deprecated please use {@link #useAcceptProperties(Set)}
40+
*/
41+
@Deprecated
3242
void setAcceptProperties(Set<Pattern> acceptedProperties);
3343

44+
void useAcceptProperties(Set<Pattern> acceptedProperties);
45+
3446
}

core/src/main/resources/struts-excluded-classes.xml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
<!--
33
/*
44
* Licensed to the Apache Software Foundation (ASF) under one
5-
* or more contributor license agreements. See the NOTICE file
5+
* or more contributor license agreements. See the NOTICE file
66
* distributed with this work for additional information
7-
* regarding copyright ownership. The ASF licenses this file
7+
* regarding copyright ownership. The ASF licenses this file
88
* to you under the Apache License, Version 2.0 (the
99
* "License"); you may not use this file except in compliance
10-
* with the License. You may obtain a copy of the License at
10+
* with the License. You may obtain a copy of the License at
1111
*
1212
* http://www.apache.org/licenses/LICENSE-2.0
1313
*
1414
* Unless required by applicable law or agreed to in writing,
1515
* software distributed under the License is distributed on an
1616
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17-
* KIND, either express or implied. See the License for the
17+
* KIND, either express or implied. See the License for the
1818
* specific language governing permissions and limitations
1919
* under the License.
2020
*/
@@ -37,7 +37,9 @@
3737
java.lang.ProcessBuilder,
3838
java.lang.Thread,
3939
sun.misc.Unsafe,
40-
com.opensymphony.xwork2.ActionContext"/>
40+
com.opensymphony.xwork2.ActionContext,
41+
com.opensymphony.xwork2.ognl.SecurityMemberAccess,
42+
com.opensymphony.xwork2.ognl.OgnlValueStack"/>
4143

4244
<constant name="struts.devMode.excludedClasses"
4345
value="

core/src/test/java/com/opensymphony/xwork2/ognl/OgnlUtilTest.java

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import com.opensymphony.xwork2.util.ValueStack;
3636
import com.opensymphony.xwork2.util.location.LocatableProperties;
3737
import com.opensymphony.xwork2.util.reflection.ReflectionContextState;
38-
import java.beans.BeanInfo;
3938
import ognl.InappropriateExpressionException;
4039
import ognl.MethodFailedException;
4140
import ognl.NoSuchPropertyException;
@@ -48,6 +47,7 @@
4847
import org.apache.struts2.StrutsConstants;
4948
import org.apache.struts2.StrutsException;
5049

50+
import java.beans.BeanInfo;
5151
import java.beans.IntrospectionException;
5252
import java.lang.reflect.Method;
5353
import java.text.DateFormat;
@@ -877,6 +877,33 @@ public void testStringToLong() {
877877
assertEquals(123, foo.getALong());
878878
}
879879

880+
public void testBeanMapExpressions() throws OgnlException {
881+
Foo foo = new Foo();
882+
ognlUtil.setExcludedClasses(
883+
"com.opensymphony.xwork2.ognl.SecurityMemberAccess"
884+
);
885+
886+
Map<String, Object> context = ognlUtil.createDefaultContext(foo);
887+
888+
String expression = "%{\n" +
889+
"(#request.a=#@org.apache.commons.collections.BeanMap@{}) +\n" +
890+
"(#request.a.setBean(#request.get('struts.valueStack')) == true) +\n" +
891+
"(#request.b=#@org.apache.commons.collections.BeanMap@{}) +\n" +
892+
"(#request.b.setBean(#request.get('a').get('context'))) +\n" +
893+
"(#request.c=#@org.apache.commons.collections.BeanMap@{}) +\n" +
894+
"(#request.c.setBean(#request.get('b').get('memberAccess'))) +\n" +
895+
"(#request.get('c').put('excluded'+'PackageNames',#@org.apache.commons.collections.BeanMap@{}.keySet())) +\n" +
896+
"(#request.get('c').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()))\n" +
897+
"}";
898+
899+
ognlUtil.setValue("title", context, foo, expression);
900+
901+
assertEquals(foo.getTitle(), expression);
902+
903+
SecurityMemberAccess sma = (SecurityMemberAccess) ((OgnlContext) context).getMemberAccess();
904+
assertTrue(sma.isClassExcluded(SecurityMemberAccess.class));
905+
}
906+
880907
public void testNullProperties() {
881908
Foo foo = new Foo();
882909
foo.setALong(88);
@@ -1834,19 +1861,19 @@ public void testOgnlDefaultCacheFactoryCoverage() {
18341861
defaultOgnlCacheFactory.setUseLRUCache("false");
18351862
ognlCache = defaultOgnlCacheFactory.buildOgnlCache();
18361863
assertNotNull("No param build method result null ?", ognlCache);
1837-
assertEquals("Eviction limit for cache mismatches limit for factory ?", 12, ognlCache.getEvictionLimit() );
1864+
assertEquals("Eviction limit for cache mismatches limit for factory ?", 12, ognlCache.getEvictionLimit());
18381865
ognlCache = defaultOgnlCacheFactory.buildOgnlCache(6, 6, 0.75f, false);
18391866
assertNotNull("No param build method result null ?", ognlCache);
1840-
assertEquals("Eviction limit for cache mismatches limit for factory ?", 6, ognlCache.getEvictionLimit() );
1867+
assertEquals("Eviction limit for cache mismatches limit for factory ?", 6, ognlCache.getEvictionLimit());
18411868
// LRU cache
18421869
defaultOgnlCacheFactory.setCacheMaxSize("30");
18431870
defaultOgnlCacheFactory.setUseLRUCache("true");
18441871
ognlCache = defaultOgnlCacheFactory.buildOgnlCache();
18451872
assertNotNull("No param build method result null ?", ognlCache);
1846-
assertEquals("Eviction limit for cache mismatches limit for factory ?", 30, ognlCache.getEvictionLimit() );
1873+
assertEquals("Eviction limit for cache mismatches limit for factory ?", 30, ognlCache.getEvictionLimit());
18471874
ognlCache = defaultOgnlCacheFactory.buildOgnlCache(15, 15, 0.75f, false);
18481875
assertNotNull("No param build method result null ?", ognlCache);
1849-
assertEquals("Eviction limit for cache mismatches limit for factory ?", 15, ognlCache.getEvictionLimit() );
1876+
assertEquals("Eviction limit for cache mismatches limit for factory ?", 15, ognlCache.getEvictionLimit());
18501877
}
18511878

18521879
/**

0 commit comments

Comments
 (0)