This is an automated email from the ASF dual-hosted git repository. lukaszlenart pushed a commit to branch WW-5675-share-parsed-ognl-security-config in repository https://gitbox.apache.org/repos/asf/struts.git
commit 75b162f9613abc55b6d8db8c250fefc80e9f5e18 Author: Lukasz Lenart <[email protected]> AuthorDate: Fri Aug 14 14:07:39 2026 +0200 WW-5675 perf(config): hoist the whitespace pattern in validatePackageNames Co-Authored-By: Claude Opus 5 <[email protected]> --- .../org/apache/struts2/util/ConfigParseUtil.java | 4 ++- .../apache/struts2/util/ConfigParseUtilTest.java | 30 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java b/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java index 116ca637d..06dc1a43c 100644 --- a/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java +++ b/core/src/main/java/org/apache/struts2/util/ConfigParseUtil.java @@ -47,6 +47,8 @@ public class ConfigParseUtil { .maximumSize(MAX_CLASSLOADER_CACHE_SIZE) .build(); + private static final Pattern WHITESPACE = Pattern.compile("\\s"); + private ConfigParseUtil() { } @@ -140,7 +142,7 @@ public class ConfigParseUtil { } public static void validatePackageNames(Collection<String> packageNames) { - if (packageNames.stream().anyMatch(s -> Pattern.compile("\\s").matcher(s).find())) { + if (packageNames.stream().anyMatch(s -> WHITESPACE.matcher(s).find())) { throw new ConfigurationException("Excluded package names could not be parsed due to erroneous whitespace characters: " + packageNames); } } diff --git a/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java b/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java index 84cf9a0a3..6e9c79727 100644 --- a/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java +++ b/core/src/test/java/org/apache/struts2/util/ConfigParseUtilTest.java @@ -29,9 +29,11 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; +import java.util.List; import java.util.Map; import java.util.Set; +import static org.junit.Assert.assertThrows; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -187,6 +189,34 @@ public class ConfigParseUtilTest { innerCache.estimatedSize() <= limit); } + @Test + public void validatePackageNamesAcceptsNamesWithoutWhitespace() { + ConfigParseUtil.validatePackageNames(Set.of("java.lang", "org.apache.struts2", "")); + } + + @Test + public void validatePackageNamesRejectsSpace() { + assertThrows(ConfigurationException.class, + () -> ConfigParseUtil.validatePackageNames(Set.of("java.lang", "org.apache struts2"))); + } + + @Test + public void validatePackageNamesRejectsTab() { + assertThrows(ConfigurationException.class, + () -> ConfigParseUtil.validatePackageNames(Set.of("java\tlang"))); + } + + @Test + public void validatePackageNamesRejectsNewline() { + assertThrows(ConfigurationException.class, + () -> ConfigParseUtil.validatePackageNames(Set.of("java\nlang"))); + } + + @Test + public void validatePackageNamesAcceptsEmptyCollection() { + ConfigParseUtil.validatePackageNames(List.of()); + } + @SuppressWarnings("unchecked") private static Cache<Object, Object> validatedClassCache() { try {
