From e2d9142c5a118e27e724b6574cc4a6ee446e270d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 20 Oct 2011 11:53:02 +0000 Subject: [PATCH] LocaleEditor and StringToLocaleConverter do not restrict variant part through validation (SPR-8637) --- .../org/springframework/util/StringUtils.java | 19 ++++++++++++------- .../util/StringUtilsTests.java | 10 ++++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/org.springframework.core/src/main/java/org/springframework/util/StringUtils.java b/org.springframework.core/src/main/java/org/springframework/util/StringUtils.java index e86ab49793..3e1960870f 100644 --- a/org.springframework.core/src/main/java/org/springframework/util/StringUtils.java +++ b/org.springframework.core/src/main/java/org/springframework/util/StringUtils.java @@ -665,16 +665,11 @@ public abstract class StringUtils { * @return a corresponding Locale instance */ public static Locale parseLocaleString(String localeString) { - for (int i = 0; i < localeString.length(); i++) { - char ch = localeString.charAt(i); - if (ch != '_' && ch != ' ' && !Character.isLetterOrDigit(ch)) { - throw new IllegalArgumentException( - "Locale value \"" + localeString + "\" contains invalid characters"); - } - } String[] parts = tokenizeToStringArray(localeString, "_ ", false, false); String language = (parts.length > 0 ? parts[0] : ""); String country = (parts.length > 1 ? parts[1] : ""); + validateLocalePart(language); + validateLocalePart(country); String variant = ""; if (parts.length >= 2) { // There is definitely a variant, and it is everything after the country @@ -689,6 +684,16 @@ public abstract class StringUtils { return (language.length() > 0 ? new Locale(language, country, variant) : null); } + private static void validateLocalePart(String localePart) { + for (int i = 0; i < localePart.length(); i++) { + char ch = localePart.charAt(i); + if (ch != '_' && ch != ' ' && !Character.isLetterOrDigit(ch)) { + throw new IllegalArgumentException( + "Locale part \"" + localePart + "\" contains invalid characters"); + } + } + } + /** * Determine the RFC 3066 compliant language tag, * as used for the HTTP "Accept-Language" header. diff --git a/org.springframework.core/src/test/java/org/springframework/util/StringUtilsTests.java b/org.springframework.core/src/test/java/org/springframework/util/StringUtilsTests.java index 4e82d3cfdb..65cf242724 100644 --- a/org.springframework.core/src/test/java/org/springframework/util/StringUtilsTests.java +++ b/org.springframework.core/src/test/java/org/springframework/util/StringUtilsTests.java @@ -566,6 +566,16 @@ public class StringUtilsTests extends TestCase { assertNull("When given an empty Locale string, must return null.", locale); } + /** + * See SPR-8637. + */ + public void testParseLocaleWithMultiSpecialCharactersInVariant() throws Exception { + final String variant = "proper-northern"; + final String localeString = "en_GB_" + variant; + Locale locale = StringUtils.parseLocaleString(localeString); + assertEquals("Multi-valued variant portion of the Locale not extracted correctly.", variant, locale.getVariant()); + } + /** * See SPR-3671. */ -- GitLab