From f1ad34b12f32e111632831efd7b8aefffa7be5ad Mon Sep 17 00:00:00 2001 From: mountford Date: Sat, 15 Oct 2016 13:33:11 -0700 Subject: [PATCH] Fix RDAP quirks uncovered during documentation There's no reason not to allow a one-character search string when there are no wildcards. And the ROID validity pattern did not allow underscores, which was causing problems with our ROIDs. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=136256605 --- .../registry/rdap/RdapEntityAction.java | 2 +- .../registry/rdap/RdapJsonFormatter.java | 4 +++- .../registry/rdap/RdapSearchPattern.java | 20 +++++++++---------- .../registry/rdap/RdapEntityActionTest.java | 4 ++-- .../registry/rdap/RdapSearchPatternTest.java | 8 ++++++++ 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/java/google/registry/rdap/RdapEntityAction.java b/java/google/registry/rdap/RdapEntityAction.java index 8735b9a80..22b7d52a3 100644 --- a/java/google/registry/rdap/RdapEntityAction.java +++ b/java/google/registry/rdap/RdapEntityAction.java @@ -49,7 +49,7 @@ public class RdapEntityAction extends RdapActionBase { public static final String PATH = "/rdap/entity/"; - private static final Pattern ROID_PATTERN = Pattern.compile("[-.a-zA-Z0-9]+"); + private static final Pattern ROID_PATTERN = Pattern.compile("[-_.a-zA-Z0-9]+"); @Inject Clock clock; @Inject RdapEntityAction() {} diff --git a/java/google/registry/rdap/RdapJsonFormatter.java b/java/google/registry/rdap/RdapJsonFormatter.java index fe3c1bf85..191ad8dd7 100644 --- a/java/google/registry/rdap/RdapJsonFormatter.java +++ b/java/google/registry/rdap/RdapJsonFormatter.java @@ -16,6 +16,7 @@ package google.registry.rdap; import static com.google.common.base.Strings.nullToEmpty; import static google.registry.model.ofy.ObjectifyService.ofy; +import static google.registry.util.DomainNameUtils.ACE_PREFIX; import com.google.auto.value.AutoValue; import com.google.common.base.Function; @@ -1054,6 +1055,7 @@ public class RdapJsonFormatter { } private static boolean hasUnicodeComponents(String fullyQualifiedName) { - return fullyQualifiedName.startsWith("xn--") || fullyQualifiedName.contains(".xn--"); + return fullyQualifiedName.startsWith(ACE_PREFIX) + || fullyQualifiedName.contains("." + ACE_PREFIX); } } diff --git a/java/google/registry/rdap/RdapSearchPattern.java b/java/google/registry/rdap/RdapSearchPattern.java index 24549716b..3f832bc61 100644 --- a/java/google/registry/rdap/RdapSearchPattern.java +++ b/java/google/registry/rdap/RdapSearchPattern.java @@ -14,6 +14,8 @@ package google.registry.rdap; +import static google.registry.util.DomainNameUtils.ACE_PREFIX; + import google.registry.request.HttpException.UnprocessableEntityException; import javax.annotation.Nullable; @@ -82,8 +84,7 @@ public final class RdapSearchPattern { * @throws UnprocessableEntityException if {@code pattern} does not meet the requirements of RFC * 7482 */ - public static RdapSearchPattern create( - String pattern, boolean allowSuffix) throws UnprocessableEntityException { + public static RdapSearchPattern create(String pattern, boolean allowSuffix) { String initialString; boolean hasWildcard; String suffix; @@ -112,14 +113,13 @@ public final class RdapSearchPattern { suffix = null; } initialString = pattern.substring(0, wildcardPos); - } - if (initialString.length() < 2) { - throw new UnprocessableEntityException("At least two characters must be specified"); - } - if (initialString.startsWith("xn--") - && (initialString.length() < 7)) { - throw new UnprocessableEntityException( - "At least seven characters must be specified for punycode domain searches"); + if (initialString.length() < 2) { + throw new UnprocessableEntityException("At least two characters must be specified"); + } + if (initialString.startsWith(ACE_PREFIX) && (initialString.length() < 7)) { + throw new UnprocessableEntityException( + "At least seven characters must be specified for punycode domain searches"); + } } return new RdapSearchPattern(initialString, hasWildcard, suffix); } diff --git a/javatests/google/registry/rdap/RdapEntityActionTest.java b/javatests/google/registry/rdap/RdapEntityActionTest.java index af4a26f5c..d4b08a4cb 100644 --- a/javatests/google/registry/rdap/RdapEntityActionTest.java +++ b/javatests/google/registry/rdap/RdapEntityActionTest.java @@ -202,8 +202,8 @@ public class RdapEntityActionTest { @Test public void testUnknownEntity_returns404() throws Exception { - assertThat(generateActualJson("MISSING-ENTITY")).isEqualTo( - generateExpectedJson("MISSING-ENTITY not found", "rdap_error_404.json")); + assertThat(generateActualJson("_MISSING-ENTITY_")).isEqualTo( + generateExpectedJson("_MISSING-ENTITY_ not found", "rdap_error_404.json")); assertThat(response.getStatus()).isEqualTo(404); } diff --git a/javatests/google/registry/rdap/RdapSearchPatternTest.java b/javatests/google/registry/rdap/RdapSearchPatternTest.java index d0d780909..37eb04db2 100644 --- a/javatests/google/registry/rdap/RdapSearchPatternTest.java +++ b/javatests/google/registry/rdap/RdapSearchPatternTest.java @@ -72,6 +72,14 @@ public class RdapSearchPatternTest { RdapSearchPattern.create("ex*am.lol", true); } + @Test + public void testShortString_ok() throws Exception { + RdapSearchPattern rdapSearchPattern = RdapSearchPattern.create("e", true); + assertThat(rdapSearchPattern.getInitialString()).isEqualTo("e"); + assertThat(rdapSearchPattern.getHasWildcard()).isFalse(); + assertThat(rdapSearchPattern.getSuffix()).isNull(); + } + @Test public void testPrefixTooShort_unprocessable() throws Exception { thrown.expect(UnprocessableEntityException.class);