WW-4429 Fixes support for accessing static methods

Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/532841d4
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/532841d4
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/532841d4

Branch: refs/heads/master
Commit: 532841d40f164a8d8ae6ac0b85b60d3cf6db0011
Parents: a35c3ef
Author: Lukasz Lenart <lukaszlen...@apache.org>
Authored: Tue Dec 23 21:29:30 2014 +0100
Committer: Lukasz Lenart <lukaszlen...@apache.org>
Committed: Tue Dec 23 21:29:30 2014 +0100

----------------------------------------------------------------------
 .../xwork2/ognl/SecurityMemberAccess.java       | 14 ++++++--
 .../xwork2/ognl/SecurityMemberAccessTest.java   | 37 +++++++++++++++++++-
 2 files changed, 48 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/532841d4/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 a172237..6c9d64c 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
@@ -60,14 +60,24 @@ public class SecurityMemberAccess extends 
DefaultMemberAccess {
             return true;
         }
 
-        if (isPackageExcluded(target.getClass().getPackage(), 
member.getDeclaringClass().getPackage())) {
+        Class targetClass = target.getClass();
+        Class memberClass = member.getDeclaringClass();
+
+        if (Modifier.isStatic(member.getModifiers()) && 
allowStaticMethodAccess) {
+            if (LOG.isWarnEnabled()) {
+                LOG.warn("Support for accessing static methods is deprecated! 
Please refactor your application!");
+            }
+            targetClass = member.getDeclaringClass();
+        }
+
+        if (isPackageExcluded(targetClass.getPackage(), 
memberClass.getPackage())) {
             if (LOG.isWarnEnabled()) {
                 LOG.warn("Package of target [#0] or package of member [#1] are 
excluded!", target, member);
             }
             return false;
         }
 
-        if (isClassExcluded(target.getClass(), member.getDeclaringClass())) {
+        if (isClassExcluded(targetClass, memberClass)) {
             if (LOG.isWarnEnabled()) {
                 LOG.warn("Target class [#0] or declaring class of member type 
[#1] are excluded!", target, member);
             }

http://git-wip-us.apache.org/repos/asf/struts/blob/532841d4/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 61a91a0..11ff9d0 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
@@ -3,6 +3,7 @@ package com.opensymphony.xwork2.ognl;
 import junit.framework.TestCase;
 
 import java.lang.reflect.Member;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -202,6 +203,32 @@ public class SecurityMemberAccessTest extends TestCase {
         assertTrue("Access to enums is blocked!", actual);
     }
 
+    public void testAccessStatic() throws Exception {
+        // given
+        SecurityMemberAccess sma = new SecurityMemberAccess(true);
+        sma.setExcludedClasses(new 
HashSet<Class<?>>(Arrays.<Class<?>>asList(Class.class)));
+
+        // when
+        Member method = StaticTester.class.getMethod("sayHello");
+        boolean actual = sma.isAccessible(context, Class.class, method, null);
+
+        // then
+        assertTrue("Access to static is blocked!", actual);
+    }
+
+    public void testBlockStaticAccess() throws Exception {
+        // given
+        SecurityMemberAccess sma = new SecurityMemberAccess(false);
+        sma.setExcludedClasses(new 
HashSet<Class<?>>(Arrays.<Class<?>>asList(Class.class)));
+
+        // when
+        Member method = StaticTester.class.getMethod("sayHello");
+        boolean actual = sma.isAccessible(context, Class.class, method, null);
+
+        // then
+        assertFalse("Access to static isn't blocked!", actual);
+    }
+
 }
 
 class FooBar implements FooBarInterface {
@@ -249,4 +276,12 @@ interface FooBarInterface extends FooInterface, 
BarInterface {
 
 enum MyValues {
     ONE, TWO, THREE
-}
\ No newline at end of file
+}
+
+class StaticTester {
+
+    public static String sayHello() {
+        return "Hello";
+    }
+
+}

Reply via email to