Adds ability to exclude whole packages based on regex
Project: http://git-wip-us.apache.org/repos/asf/struts/repo Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/dba9da3a Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/dba9da3a Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/dba9da3a Branch: refs/heads/develop Commit: dba9da3abf1b5e6f59251b5a6d948c5bc502c9af Parents: 8a93df1 Author: Lukasz Lenart <lukaszlen...@apache.org> Authored: Fri May 23 09:20:07 2014 +0200 Committer: Lukasz Lenart <lukaszlen...@apache.org> Committed: Fri May 23 09:20:07 2014 +0200 ---------------------------------------------------------------------- .../xwork2/ognl/SecurityMemberAccess.java | 20 ++++++++++++++++++++ .../xwork2/ognl/SecurityMemberAccessTest.java | 19 +++++++++++++++++++ 2 files changed, 39 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/struts/blob/dba9da3a/xwork-core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java ---------------------------------------------------------------------- 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 c14d8b9..39f882a 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 @@ -40,6 +40,7 @@ public class SecurityMemberAccess extends DefaultMemberAccess { private Set<Pattern> excludeProperties = Collections.emptySet(); private Set<Pattern> acceptProperties = Collections.emptySet(); private Set<Class<?>> excludedClasses = Collections.emptySet(); + private Set<Pattern> excludedPackageNamePatterns = Collections.emptySet(); public SecurityMemberAccess(boolean method) { super(false); @@ -52,6 +53,13 @@ public class SecurityMemberAccess extends DefaultMemberAccess { @Override public boolean isAccessible(Map context, Object target, Member member, String propertyName) { + if (isPackageExcluded(target.getClass().getPackage(), member.getDeclaringClass().getPackage())) { + if (LOG.isDebugEnabled()) { + LOG.debug("Target package [#0] and member package [#1] are excluded!", target, member); + } + return false; + } + if (isClassExcluded(target.getClass(), member.getDeclaringClass())) { if (LOG.isDebugEnabled()) { LOG.debug("Target class [#0] and member type [#1] are excluded!", target, member); @@ -84,6 +92,15 @@ public class SecurityMemberAccess extends DefaultMemberAccess { return isAcceptableProperty(propertyName); } + protected boolean isPackageExcluded(Package targetPackage, Package memberPackage) { + for (Pattern pattern : excludedPackageNamePatterns) { + if (pattern.matcher(targetPackage.getName()).matches() || pattern.matcher(memberPackage.getName()).matches()) { + return true; + } + } + return false; + } + protected boolean isClassExcluded(Class<?> targetClass, Class<?> declaringClass) { if (targetClass == Object.class || declaringClass == Object.class) { return true; @@ -141,4 +158,7 @@ public class SecurityMemberAccess extends DefaultMemberAccess { this.excludedClasses = excludedClasses; } + public void setExcludedPackageNamePatterns(Set<Pattern> excludedPackageNamePatterns) { + this.excludedPackageNamePatterns = excludedPackageNamePatterns; + } } http://git-wip-us.apache.org/repos/asf/struts/blob/dba9da3a/xwork-core/src/test/java/com/opensymphony/xwork2/ognl/SecurityMemberAccessTest.java ---------------------------------------------------------------------- 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 1c14cb2..748d5a9 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 @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.regex.Pattern; public class SecurityMemberAccessTest extends TestCase { @@ -171,6 +172,24 @@ public class SecurityMemberAccessTest extends TestCase { assertFalse("barLogic() from BarInterface is accessible!!!", accessible); } + public void testPackageExclusion() throws Exception { + // given + SecurityMemberAccess sma = new SecurityMemberAccess(false); + + Set<Pattern> excluded = new HashSet<Pattern>(); + excluded.add(Pattern.compile("^" + FooBar.class.getPackage().getName().replaceAll("\\.", "\\\\.") + ".*")); + sma.setExcludedPackageNamePatterns(excluded); + + String propertyName = "stringField"; + Member member = FooBar.class.getMethod("get" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1)); + + // when + boolean actual = sma.isAccessible(context, target, member, propertyName); + + // then + assertFalse("stringField is accessible!", actual); + } + } class FooBar implements FooBarInterface {