From 20eafb632721627b4bef2463e80b7dad42fd4dd6 Mon Sep 17 00:00:00 2001 From: Kusal Kithul-Godage Date: Fri, 6 Oct 2023 04:16:57 +1100 Subject: [PATCH] WW-5340 Mild refactor StrutsOgnlGuard for easier subclassing --- .../apache/struts2/ognl/StrutsOgnlGuard.java | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/ognl/StrutsOgnlGuard.java b/core/src/main/java/org/apache/struts2/ognl/StrutsOgnlGuard.java index 262aec362..0cb4d1d93 100644 --- a/core/src/main/java/org/apache/struts2/ognl/StrutsOgnlGuard.java +++ b/core/src/main/java/org/apache/struts2/ognl/StrutsOgnlGuard.java @@ -71,28 +71,38 @@ public class StrutsOgnlGuard implements OgnlGuard { @Override public boolean isParsedTreeBlocked(Object tree) { - return containsExcludedNodeType(tree); - } - - protected boolean containsExcludedNodeType(Object tree) { - if (!(tree instanceof Node) || excludedNodeTypes.isEmpty()) { + if (!(tree instanceof Node) || skipTreeCheck((Node) tree)) { return false; } - return recurseExcludedNodeType((Node) tree); + return recurseNodes((Node) tree); } - protected boolean recurseExcludedNodeType(Node node) { + protected boolean skipTreeCheck(Node tree) { + return excludedNodeTypes.isEmpty(); + } + + protected boolean recurseNodes(Node node) { + if (checkNode(node)) { + return true; + } + for (int i = 0; i < node.jjtGetNumChildren(); i++) { + if (recurseNodes(node.jjtGetChild(i))) { + return true; + } + } + return false; + } + + protected boolean checkNode(Node node) { + return containsExcludedNodeType(node); + } + + protected boolean containsExcludedNodeType(Node node) { String nodeClassName = node.getClass().getName(); if (excludedNodeTypes.contains(nodeClassName)) { LOG.warn("Expression contains blocked node type [{}]", nodeClassName); return true; - } else { - for (int i = 0; i < node.jjtGetNumChildren(); i++) { - if (recurseExcludedNodeType(node.jjtGetChild(i))) { - return true; - } - } - return false; } + return false; } }