diff --git a/core/src/main/resources/struts-default.xml b/core/src/main/resources/struts-default.xml index 3686c20f6..15bd60ea1 100644 --- a/core/src/main/resources/struts-default.xml +++ b/core/src/main/resources/struts-default.xml @@ -52,7 +52,6 @@ ognl.TypeConverter, ognl.MemberAccess, ognl.DefaultMemberAccess, - com.opensymphony.xwork2.ognl.SecurityMemberAccess, com.opensymphony.xwork2.ActionContext" /> @@ -60,7 +59,17 @@ - + diff --git a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java index 7d52a46fa..4d2ebcb06 100644 --- a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java +++ b/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java @@ -139,9 +139,9 @@ public class SecurityMemberAccess extends DefaultMemberAccess { if (LOG.isWarnEnabled() && (targetPackage == null || memberPackage == null)) { LOG.warn("The use of the default (unnamed) package is discouraged!"); } - - final String targetPackageName = targetPackage == null ? "" : targetPackage.getName(); - final String memberPackageName = memberPackage == null ? "" : memberPackage.getName(); + + String targetPackageName = targetPackage == null ? "" : targetPackage.getName(); + String memberPackageName = memberPackage == null ? "" : memberPackage.getName(); for (Pattern pattern : excludedPackageNamePatterns) { if (pattern.matcher(targetPackageName).matches() || pattern.matcher(memberPackageName).matches()) { @@ -149,9 +149,12 @@ public class SecurityMemberAccess extends DefaultMemberAccess { } } + targetPackageName = targetPackageName + "."; + memberPackageName = memberPackageName + "."; + for (String packageName: excludedPackageNames) { if (targetPackageName.startsWith(packageName) || targetPackageName.equals(packageName) - || memberPackageName.startsWith(packageName) || memberPackageName.equals(packageName)) { + || memberPackageName.startsWith(packageName) || memberPackageName.equals(packageName)) { return true; } } diff --git a/xwork-core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java b/xwork-core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java index 8f98c2516..f52fb42d8 100644 --- a/xwork-core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java +++ b/xwork-core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java @@ -4,7 +4,6 @@ import com.opensymphony.xwork2.util.TextParseUtil; import junit.framework.TestCase; import java.lang.reflect.Member; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -168,7 +167,7 @@ public class SecurityMemberAccessTest extends TestCase { // then assertFalse("stringField is accessible!", actual); } - + public void testPackageNameExclusion() throws Exception { // given SecurityMemberAccess sma = new SecurityMemberAccess(false); @@ -187,29 +186,29 @@ public class SecurityMemberAccessTest extends TestCase { assertFalse("stringField is accessible!", actual); } - public void testDefaultPackageExclusion() throws Exception { + public void testDefaultPackageExclusion() { // given SecurityMemberAccess sma = new SecurityMemberAccess(false); Set excluded = new HashSet(); excluded.add(Pattern.compile("^" + FooBar.class.getPackage().getName().replaceAll("\\.", "\\\\.") + ".*")); sma.setExcludedPackageNamePatterns(excluded); - + // when boolean actual = sma.isPackageExcluded(null, null); // then assertFalse("default package is excluded!", actual); } - - public void testDefaultPackageExclusion2() throws Exception { + + public void testDefaultPackageExclusion2() { // given SecurityMemberAccess sma = new SecurityMemberAccess(false); Set excluded = new HashSet(); excluded.add(Pattern.compile("^$")); sma.setExcludedPackageNamePatterns(excluded); - + // when boolean actual = sma.isPackageExcluded(null, null); @@ -299,7 +298,7 @@ public class SecurityMemberAccessTest extends TestCase { public void testAccessPrimitiveDoubleWithNames() throws Exception { // given SecurityMemberAccess sma = new SecurityMemberAccess(false); - sma.setExcludedPackageNames(TextParseUtil.commaDelimitedStringToSet("java.lang.,ognl,javax")); + sma.setExcludedPackageNames(TextParseUtil.commaDelimitedStringToSet("ognl.,javax.")); Set> excluded = new HashSet>(); @@ -401,6 +400,21 @@ public class SecurityMemberAccessTest extends TestCase { assertFalse(accessible); } + public void testPackageNameExclusionAsCommaDelimited() { + // given + SecurityMemberAccess sma = new SecurityMemberAccess(false); + + + sma.setExcludedPackageNames(TextParseUtil.commaDelimitedStringToSet("java.lang.")); + + // when + boolean actual = sma.isPackageExcluded(String.class.getPackage(), null); + actual &= sma.isPackageExcluded(null, String.class.getPackage()); + + // then + assertTrue("package java.lang. is accessible!", actual); + } + } class FooBar implements FooBarInterface {