diff --git a/java/google/registry/util/JavaCharMatchers.java b/java/google/registry/util/JavaCharMatchers.java new file mode 100644 index 000000000..b9bfa0d03 --- /dev/null +++ b/java/google/registry/util/JavaCharMatchers.java @@ -0,0 +1,33 @@ +// Copyright 2019 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.util; + +import com.google.common.base.CharMatcher; + +/** + * Creates {@link CharMatcher CharMatchers} that support Java character strings only, not unicode + * supplementary characters. + */ +public class JavaCharMatchers { + + /** Returns a {@link CharMatcher} that matcher only ASCII letters and digits. */ + public static CharMatcher asciiLetterOrDigitMatcher() { + return CharMatcher.inRange('0', '9') + .or(CharMatcher.inRange('a', 'z')) + .or(CharMatcher.inRange('A', 'Z')); + } + + private JavaCharMatchers() {} +} diff --git a/java/google/registry/util/RegistrarUtils.java b/java/google/registry/util/RegistrarUtils.java index d856c618a..a405a737f 100644 --- a/java/google/registry/util/RegistrarUtils.java +++ b/java/google/registry/util/RegistrarUtils.java @@ -14,15 +14,19 @@ package google.registry.util; -import static com.google.common.base.CharMatcher.javaLetterOrDigit; import com.google.common.base.Ascii; +import com.google.common.base.CharMatcher; /** Utilities for working with {@code Registrar} objects. */ public class RegistrarUtils { + + private static final CharMatcher ASCII_LETTER_OR_DIGIT_MATCHER = + JavaCharMatchers.asciiLetterOrDigitMatcher(); + /** Strip out anything that isn't a letter or digit, and lowercase. */ public static String normalizeRegistrarName(String name) { - return Ascii.toLowerCase(javaLetterOrDigit().retainFrom(name)); + return Ascii.toLowerCase(ASCII_LETTER_OR_DIGIT_MATCHER.retainFrom(name)); } /** diff --git a/java/google/registry/util/SqlTemplate.java b/java/google/registry/util/SqlTemplate.java index aae550a88..a7892e927 100644 --- a/java/google/registry/util/SqlTemplate.java +++ b/java/google/registry/util/SqlTemplate.java @@ -38,7 +38,7 @@ public final class SqlTemplate { Pattern.compile("(['\"]?)%(" + KEY_PATTERN + ")%(['\"]?)"); private static final CharMatcher LEGAL_SUBSTITUTIONS = - CharMatcher.javaLetterOrDigit().or(CharMatcher.anyOf("-_.,: ")); + JavaCharMatchers.asciiLetterOrDigitMatcher().or(CharMatcher.anyOf("-_.,: ")); /** Returns a new immutable SQL template builder object, for query parameter substitution. */ public static SqlTemplate create(String template) { diff --git a/javatests/google/registry/util/RegistrarUtilsTest.java b/javatests/google/registry/util/RegistrarUtilsTest.java new file mode 100644 index 000000000..4881727d8 --- /dev/null +++ b/javatests/google/registry/util/RegistrarUtilsTest.java @@ -0,0 +1,36 @@ +// Copyright 2019 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.util; + +import static com.google.common.truth.Truth.assertThat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Unit tests for {@link RegistrarUtils}. */ +@RunWith(JUnit4.class) +public class RegistrarUtilsTest { + + @Test + public void testNormalizeRegistrarName_letterOrDigitOnly() { + assertThat(RegistrarUtils.normalizeRegistrarName("129abzAZ")).isEqualTo("129abzaz"); + } + + @Test + public void testNormalizeRegistrarName_hasSymbols() { + assertThat(RegistrarUtils.normalizeRegistrarName("^}129a(bzAZ/:")).isEqualTo("129abzaz"); + } +}