This is an automated email from the ASF dual-hosted git repository.

lukaszlenart pushed a commit to branch fix/WW-5415-constructor
in repository https://gitbox.apache.org/repos/asf/struts.git

commit b36e88ff4b2810776854041dc1e71fd95228aef5
Author: Lukasz Lenart <lukaszlen...@apache.org>
AuthorDate: Sun May 12 09:47:38 2024 +0200

    WW-5415 Fixes accessing public constructors via expression
---
 .../com/opensymphony/xwork2/ognl/SecurityMemberAccess.java    |  2 +-
 .../xwork2/validator/VisitorFieldValidatorTest.java           | 11 +++++++++++
 .../xwork2/validator/VisitorValidatorTestAction.java          | 11 ++++++++++-
 .../validator/VisitorValidatorTestAction-validation.xml       |  8 ++++++++
 4 files changed, 30 insertions(+), 2 deletions(-)

diff --git 
a/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java 
b/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
index 43ae99240..8a8c71326 100644
--- a/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
+++ b/core/src/main/java/com/opensymphony/xwork2/ognl/SecurityMemberAccess.java
@@ -147,7 +147,7 @@ public class SecurityMemberAccess implements MemberAccess {
         if (target != null) {
             // Special case: Target is a Class object but not Class.class
             if (Class.class.equals(target.getClass()) && 
!Class.class.equals(target)) {
-                if (!isStatic(member)) {
+                if (!isStatic(member) && Arrays.stream(((Class<?>) 
target).getConstructors()).noneMatch(p -> 
p.getClass().equals(member.getClass()))) {
                     throw new IllegalArgumentException("Member expected to be 
static!");
                 }
                 if (!member.getDeclaringClass().equals(target)) {
diff --git 
a/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java
 
b/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java
index 76c2eac71..de605d2c5 100644
--- 
a/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java
+++ 
b/core/src/test/java/com/opensymphony/xwork2/validator/VisitorFieldValidatorTest.java
@@ -28,6 +28,8 @@ import com.opensymphony.xwork2.config.entities.ActionConfig;
 import com.opensymphony.xwork2.conversion.impl.ConversionData;
 import org.easymock.EasyMock;
 
+import java.sql.Date;
+import java.time.LocalDate;
 import java.util.Calendar;
 import java.util.GregorianCalendar;
 import java.util.HashMap;
@@ -142,6 +144,15 @@ public class VisitorFieldValidatorTest extends 
XWorkTestCase {
         assertEquals(1, errors.size());
     }
 
+    public void testDateValidation() throws Exception {
+        action.setBirthday(Date.valueOf(LocalDate.now().minusYears(20)));
+        action.setContext("birthday");
+
+        validate("birthday");
+
+        assertFalse(action.hasFieldErrors());
+    }
+
     public void testContextIsOverriddenByContextParamInValidationXML() throws 
Exception {
         validate("visitorValidationAlias");
         assertTrue(action.hasFieldErrors());
diff --git 
a/core/src/test/java/com/opensymphony/xwork2/validator/VisitorValidatorTestAction.java
 
b/core/src/test/java/com/opensymphony/xwork2/validator/VisitorValidatorTestAction.java
index 2050726f7..9e672bf48 100644
--- 
a/core/src/test/java/com/opensymphony/xwork2/validator/VisitorValidatorTestAction.java
+++ 
b/core/src/test/java/com/opensymphony/xwork2/validator/VisitorValidatorTestAction.java
@@ -22,6 +22,7 @@ import com.opensymphony.xwork2.ActionSupport;
 import com.opensymphony.xwork2.TestBean;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 
@@ -37,7 +38,7 @@ public class VisitorValidatorTestAction extends ActionSupport 
{
     private String context;
     private TestBean bean = new TestBean();
     private TestBean[] testBeanArray;
-
+    private Date birthday;
 
     public VisitorValidatorTestAction() {
         testBeanArray = new TestBean[5];
@@ -80,4 +81,12 @@ public class VisitorValidatorTestAction extends 
ActionSupport {
     public List<TestBean> getTestBeanList() {
         return testBeanList;
     }
+
+    public Date getBirthday() {
+        return birthday;
+    }
+
+    public void setBirthday(Date birthday) {
+        this.birthday = birthday;
+    }
 }
diff --git 
a/core/src/test/resources/com/opensymphony/xwork2/validator/VisitorValidatorTestAction-validation.xml
 
b/core/src/test/resources/com/opensymphony/xwork2/validator/VisitorValidatorTestAction-validation.xml
index a8de9f705..fb2aa80bf 100644
--- 
a/core/src/test/resources/com/opensymphony/xwork2/validator/VisitorValidatorTestAction-validation.xml
+++ 
b/core/src/test/resources/com/opensymphony/xwork2/validator/VisitorValidatorTestAction-validation.xml
@@ -26,4 +26,12 @@
             <message>You must enter a context.</message>
         </field-validator>
     </field>
+    <field name="birthday">
+        <field-validator type="fieldexpression">
+            <param name="expression"><![CDATA[
+                (birthday == null || birthday.before(new java.util.Date()))
+            ]]></param>
+            <message key="errors_birthday" />
+        </field-validator>
+    </field>
 </validators>

Reply via email to