Inject RDAP help information in ConfigModule

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=140849879
This commit is contained in:
mountford 2016-12-02 07:58:35 -08:00 committed by Ben McIlwain
parent 3740171bbf
commit c59b738b5b
57 changed files with 436 additions and 306 deletions

View file

@ -13,6 +13,7 @@ java_library(
"//java/com/google/common/collect", "//java/com/google/common/collect",
"//java/com/google/common/net", "//java/com/google/common/net",
"//third_party/java/appengine:appengine-api", "//third_party/java/appengine:appengine-api",
"//third_party/java/auto:auto_value",
"//third_party/java/dagger", "//third_party/java/dagger",
"//third_party/java/joda_money", "//third_party/java/joda_money",
"//third_party/java/joda_time", "//third_party/java/joda_time",

View file

@ -26,6 +26,7 @@ import java.net.URI;
import java.net.URL; import java.net.URL;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Qualifier; import javax.inject.Qualifier;
import javax.inject.Singleton;
import org.joda.money.CurrencyUnit; import org.joda.money.CurrencyUnit;
import org.joda.time.DateTimeConstants; import org.joda.time.DateTimeConstants;
import org.joda.time.Duration; import org.joda.time.Duration;
@ -921,4 +922,89 @@ public final class ConfigModule {
// TODO(b/32875427): This will be moved into configuration in a text file in a future refactor. // TODO(b/32875427): This will be moved into configuration in a text file in a future refactor.
return "google.registry.flows.custom.CustomLogicFactory"; return "google.registry.flows.custom.CustomLogicFactory";
} }
/**
* Returns the help path for the RDAP terms of service.
*
* <p>Make sure that this path is equal to the key of the entry in the RDAP help map containing
* the terms of service. The ICANN operational profile requires that the TOS be included in all
* responses, and this string is used to find the TOS in the help map.
*/
@Provides
@Config("rdapTosPath")
public static String provideRdapTosPath() {
return "/tos";
}
/**
* Returns the help text to be used by RDAP.
*
* <p>Make sure that the map entry for the terms of service use the same key as specified in
* rdapTosPath above.
*/
@Singleton
@Provides
@Config("rdapHelpMap")
public static ImmutableMap<String, RdapNoticeDescriptor> provideRdapHelpMap() {
return new ImmutableMap.Builder<String, RdapNoticeDescriptor>()
.put("/", RdapNoticeDescriptor.builder()
.setTitle("RDAP Help")
.setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)",
"syntax",
"tos (Terms of Service)"))
.setLinkValueSuffix("help/")
.build())
.put("/index", RdapNoticeDescriptor.builder()
.setTitle("RDAP Help")
.setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)",
"syntax",
"tos (Terms of Service)"))
.setLinkValueSuffix("help/index")
.build())
.put("/syntax", RdapNoticeDescriptor.builder()
.setTitle("RDAP Command Syntax")
.setDescription(ImmutableList.of(
"domain/XXXX",
"nameserver/XXXX",
"entity/XXXX",
"domains?name=XXXX",
"domains?nsLdhName=XXXX",
"domains?nsIp=XXXX",
"nameservers?name=XXXX",
"nameservers?ip=XXXX",
"entities?fn=XXXX",
"entities?handle=XXXX",
"help/XXXX"))
.setLinkValueSuffix("help/syntax")
.build())
.put("/tos", RdapNoticeDescriptor.builder()
.setTitle("RDAP Terms of Service")
.setDescription(ImmutableList.of(
"By querying our Domain Database, you are agreeing to comply with these terms so"
+ " please read them carefully.",
"Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for"
+ " query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the"
+ " transmission of mass unsolicited, commercial advertising or"
+ " solicitations.",
"Don't access our Domain Database through the use of high volume, automated"
+ " electronic processes that send queries or data to the systems of any"
+ " ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful"
+ " purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information"
+ " contained in the Domain Database in its entirety, or in any substantial"
+ " portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the"
+ " purposes of detecting and preventing misuse.",
"We reserve the right to restrict or deny your access to the database if we"
+ " suspect that you have failed to comply with these terms.",
"We reserve the right to modify this agreement at any time."))
.setLinkValueSuffix("help/tos")
.build())
.build();
}
} }

View file

@ -0,0 +1,50 @@
// Copyright 2016 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.config;
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import javax.annotation.Nullable;
/**
* AutoValue class describing an RDAP Notice object.
*
* <p>This is used for injecting RDAP help pages.
*/
@AutoValue
public abstract class RdapNoticeDescriptor {
public static Builder builder() {
return new AutoValue_RdapNoticeDescriptor.Builder();
}
@Nullable public abstract String getTitle();
public abstract ImmutableList<String> getDescription();
@Nullable public abstract String getTypeString();
@Nullable public abstract String getLinkValueSuffix();
@Nullable public abstract String getLinkHrefUrlString();
/** Builder class for {@link RdapNoticeDescriptor}. */
@AutoValue.Builder
public abstract static class Builder {
public abstract Builder setTitle(@Nullable String title);
public abstract Builder setDescription(Iterable<String> description);
public abstract Builder setTypeString(@Nullable String typeString);
public abstract Builder setLinkValueSuffix(@Nullable String linkValueSuffix);
public abstract Builder setLinkHrefUrlString(@Nullable String linkHrefUrlString);
public abstract RdapNoticeDescriptor build();
}
}

View file

@ -68,6 +68,7 @@ public abstract class RdapActionBase implements Runnable {
@Inject Response response; @Inject Response response;
@Inject @RequestMethod Action.Method requestMethod; @Inject @RequestMethod Action.Method requestMethod;
@Inject @RequestPath String requestPath; @Inject @RequestPath String requestPath;
@Inject RdapJsonFormatter rdapJsonFormatter;
@Inject @Config("rdapLinkBase") String rdapLinkBase; @Inject @Config("rdapLinkBase") String rdapLinkBase;
@Inject @Config("rdapWhoisServer") @Nullable String rdapWhoisServer; @Inject @Config("rdapWhoisServer") @Nullable String rdapWhoisServer;
@ -130,7 +131,7 @@ public abstract class RdapActionBase implements Runnable {
try { try {
if (requestMethod != Action.Method.HEAD) { if (requestMethod != Action.Method.HEAD) {
response.setPayload( response.setPayload(
JSONValue.toJSONString(RdapJsonFormatter.makeError(status, title, description))); JSONValue.toJSONString(rdapJsonFormatter.makeError(status, title, description)));
} }
response.setContentType(RESPONSE_MEDIA_TYPE); response.setContentType(RESPONSE_MEDIA_TYPE);
} catch (Exception ex) { } catch (Exception ex) {

View file

@ -59,7 +59,7 @@ public class RdapDomainAction extends RdapActionBase {
if (domainResource == null) { if (domainResource == null) {
throw new NotFoundException(pathSearchString + " not found"); throw new NotFoundException(pathSearchString + " not found");
} }
return RdapJsonFormatter.makeRdapJsonForDomain( return rdapJsonFormatter.makeRdapJsonForDomain(
domainResource, true, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL); domainResource, true, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL);
} }
} }

View file

@ -126,7 +126,7 @@ public class RdapDomainSearchAction extends RdapActionBase {
} }
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("domainSearchResults", results.jsonList()); builder.put("domainSearchResults", results.jsonList());
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
BoilerplateType.DOMAIN, BoilerplateType.DOMAIN,
results.isTruncated() results.isTruncated()
@ -296,7 +296,7 @@ public class RdapDomainSearchAction extends RdapActionBase {
ImmutableList.Builder<ImmutableMap<String, Object>> jsonBuilder = new ImmutableList.Builder<>(); ImmutableList.Builder<ImmutableMap<String, Object>> jsonBuilder = new ImmutableList.Builder<>();
for (DomainResource domain : domains) { for (DomainResource domain : domains) {
jsonBuilder.add( jsonBuilder.add(
RdapJsonFormatter.makeRdapJsonForDomain( rdapJsonFormatter.makeRdapJsonForDomain(
domain, false, rdapLinkBase, rdapWhoisServer, now, outputDataType)); domain, false, rdapLinkBase, rdapWhoisServer, now, outputDataType));
} }
return RdapSearchResults.create(jsonBuilder.build(), isTruncated); return RdapSearchResults.create(jsonBuilder.build(), isTruncated);

View file

@ -79,7 +79,7 @@ public class RdapEntityAction extends RdapActionBase {
// As per Andy Newton on the regext mailing list, contacts by themselves have no role, since // As per Andy Newton on the regext mailing list, contacts by themselves have no role, since
// they are global, and might have different roles for different domains. // they are global, and might have different roles for different domains.
if ((contactResource != null) && now.isBefore(contactResource.getDeletionTime())) { if ((contactResource != null) && now.isBefore(contactResource.getDeletionTime())) {
return RdapJsonFormatter.makeRdapJsonForContact( return rdapJsonFormatter.makeRdapJsonForContact(
contactResource, contactResource,
true, true,
Optional.<DesignatedContact.Type>absent(), Optional.<DesignatedContact.Type>absent(),
@ -95,7 +95,7 @@ public class RdapEntityAction extends RdapActionBase {
Registrar registrar = Iterables.getOnlyElement( Registrar registrar = Iterables.getOnlyElement(
Registrar.loadByIanaIdentifierRange(ianaIdentifier, ianaIdentifier + 1, 1), null); Registrar.loadByIanaIdentifierRange(ianaIdentifier, ianaIdentifier + 1, 1), null);
if ((registrar != null) && registrar.isActiveAndPubliclyVisible()) { if ((registrar != null) && registrar.isActiveAndPubliclyVisible()) {
return RdapJsonFormatter.makeRdapJsonForRegistrar( return rdapJsonFormatter.makeRdapJsonForRegistrar(
registrar, true, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL); registrar, true, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL);
} }
} catch (NumberFormatException e) { } catch (NumberFormatException e) {

View file

@ -101,7 +101,7 @@ public class RdapEntitySearchAction extends RdapActionBase {
} }
ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>();
jsonBuilder.put("entitySearchResults", results.jsonList()); jsonBuilder.put("entitySearchResults", results.jsonList());
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
jsonBuilder, jsonBuilder,
BoilerplateType.ENTITY, BoilerplateType.ENTITY,
results.isTruncated() results.isTruncated()
@ -243,7 +243,7 @@ public class RdapEntitySearchAction extends RdapActionBase {
} }
// As per Andy Newton on the regext mailing list, contacts by themselves have no role, since // As per Andy Newton on the regext mailing list, contacts by themselves have no role, since
// they are global, and might have different roles for different domains. // they are global, and might have different roles for different domains.
jsonOutputList.add(RdapJsonFormatter.makeRdapJsonForContact( jsonOutputList.add(rdapJsonFormatter.makeRdapJsonForContact(
contact, contact,
false, false,
Optional.<DesignatedContact.Type>absent(), Optional.<DesignatedContact.Type>absent(),
@ -257,7 +257,7 @@ public class RdapEntitySearchAction extends RdapActionBase {
if (jsonOutputList.size() >= rdapResultSetMaxSize) { if (jsonOutputList.size() >= rdapResultSetMaxSize) {
return RdapSearchResults.create(ImmutableList.copyOf(jsonOutputList), true); return RdapSearchResults.create(ImmutableList.copyOf(jsonOutputList), true);
} }
jsonOutputList.add(RdapJsonFormatter.makeRdapJsonForRegistrar( jsonOutputList.add(rdapJsonFormatter.makeRdapJsonForRegistrar(
registrar, false, rdapLinkBase, rdapWhoisServer, now, outputDataType)); registrar, false, rdapLinkBase, rdapWhoisServer, now, outputDataType));
} }
} }

View file

@ -20,10 +20,7 @@ import static google.registry.request.Action.Method.HEAD;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import google.registry.rdap.RdapJsonFormatter.BoilerplateType; import google.registry.rdap.RdapJsonFormatter.BoilerplateType;
import google.registry.rdap.RdapJsonFormatter.MakeRdapJsonNoticeParameters;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.HttpException.InternalServerErrorException;
import google.registry.request.HttpException.NotFoundException;
import google.registry.util.Clock; import google.registry.util.Clock;
import javax.inject.Inject; import javax.inject.Inject;
@ -35,85 +32,6 @@ public class RdapHelpAction extends RdapActionBase {
public static final String PATH = "/rdap/help"; public static final String PATH = "/rdap/help";
/**
* Path for the terms of service. The terms of service are also used to create the required
* boilerplate notice, so we make it a publicly visible that we can use elsewhere to reference it.
*/
public static final String TERMS_OF_SERVICE_PATH = "/tos";
/**
* Map from a relative path underneath the RDAP root path to the appropriate
* {@link MakeRdapJsonNoticeParameters} object.
*/
private static final ImmutableMap<String, MakeRdapJsonNoticeParameters> HELP_MAP =
ImmutableMap.of(
"/",
MakeRdapJsonNoticeParameters.builder()
.title("RDAP Help")
.description(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)",
"syntax",
"tos (Terms of Service)"))
.linkValueSuffix("help/")
.linkHrefUrlString("https://www.registry.google/about/rdap/index.html")
.build(),
"/index",
MakeRdapJsonNoticeParameters.builder()
.title("RDAP Help")
.description(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)",
"syntax",
"tos (Terms of Service)"))
.linkValueSuffix("help/index")
.linkHrefUrlString("https://www.registry.google/about/rdap/index.html")
.build(),
"/syntax",
MakeRdapJsonNoticeParameters.builder()
.title("RDAP Command Syntax")
.description(ImmutableList.of(
"domain/XXXX",
"nameserver/XXXX",
"entity/XXXX",
"domains?name=XXXX",
"domains?nsLdhName=XXXX",
"domains?nsIp=XXXX",
"nameservers?name=XXXX",
"nameservers?ip=XXXX",
"entities?fn=XXXX",
"entities?handle=XXXX",
"help/XXXX"))
.linkValueSuffix("help/syntax")
.linkHrefUrlString("https://www.registry.google/about/rdap/syntax.html")
.build(),
TERMS_OF_SERVICE_PATH,
MakeRdapJsonNoticeParameters.builder()
.title("RDAP Terms of Service")
.description(ImmutableList.of(
"By querying our Domain Database, you are agreeing to comply with these terms so"
+ " please read them carefully.",
"Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for"
+ " query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the"
+ " transmission of mass unsolicited, commercial advertising or"
+ " solicitations.",
"Don't access our Domain Database through the use of high volume, automated"
+ " electronic processes that send queries or data to the systems of"
+ " Charleston Road Registry or any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful"
+ " purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information"
+ " contained in the Domain Database in its entirety, or in any substantial"
+ " portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the"
+ " purposes of detecting and preventing misuse.",
"We reserve the right to restrict or deny your access to the database if we"
+ " suspect that you have failed to comply with these terms.",
"We reserve the right to modify this agreement at any time."))
.linkValueSuffix("help/tos")
.linkHrefUrlString("https://www.registry.google/about/rdap/tos.html")
.build());
@Inject Clock clock; @Inject Clock clock;
@Inject RdapHelpAction() {} @Inject RdapHelpAction() {}
@ -133,28 +51,12 @@ public class RdapHelpAction extends RdapActionBase {
// We rely on addTopLevelEntries to notice if we are sending the TOS notice, and not add a // We rely on addTopLevelEntries to notice if we are sending the TOS notice, and not add a
// duplicate boilerplate entry. // duplicate boilerplate entry.
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
BoilerplateType.OTHER, BoilerplateType.OTHER,
ImmutableList.of(getJsonHelpNotice(pathSearchString, rdapLinkBase)), ImmutableList.of(rdapJsonFormatter.getJsonHelpNotice(pathSearchString, rdapLinkBase)),
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
rdapLinkBase); rdapLinkBase);
return builder.build(); return builder.build();
} }
static ImmutableMap<String, Object> getJsonHelpNotice(
String pathSearchString, String rdapLinkBase) {
if (pathSearchString.isEmpty()) {
pathSearchString = "/";
}
if (!HELP_MAP.containsKey(pathSearchString)) {
throw new NotFoundException("no help found for " + pathSearchString);
}
try {
return RdapJsonFormatter.makeRdapJsonNotice(
HELP_MAP.get(pathSearchString), rdapLinkBase);
} catch (Exception e) {
throw new InternalServerErrorException("unable to read help for " + pathSearchString);
}
}
} }

View file

@ -18,7 +18,6 @@ import static com.google.common.base.Strings.nullToEmpty;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.util.DomainNameUtils.ACE_PREFIX; import static google.registry.util.DomainNameUtils.ACE_PREFIX;
import com.google.auto.value.AutoValue;
import com.google.common.base.Function; import com.google.common.base.Function;
import com.google.common.base.Functions; import com.google.common.base.Functions;
import com.google.common.base.Optional; import com.google.common.base.Optional;
@ -30,6 +29,8 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Ordering; import com.google.common.collect.Ordering;
import com.google.common.net.InetAddresses; import com.google.common.net.InetAddresses;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import google.registry.config.ConfigModule.Config;
import google.registry.config.RdapNoticeDescriptor;
import google.registry.model.EppResource; import google.registry.model.EppResource;
import google.registry.model.contact.ContactPhoneNumber; import google.registry.model.contact.ContactPhoneNumber;
import google.registry.model.contact.ContactResource; import google.registry.model.contact.ContactResource;
@ -44,6 +45,9 @@ import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarAddress; import google.registry.model.registrar.RegistrarAddress;
import google.registry.model.registrar.RegistrarContact; import google.registry.model.registrar.RegistrarContact;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.request.HttpException.InternalServerErrorException;
import google.registry.request.HttpException.NotFoundException;
import google.registry.util.FormattingLogger;
import google.registry.util.Idn; import google.registry.util.Idn;
import java.net.Inet4Address; import java.net.Inet4Address;
import java.net.Inet6Address; import java.net.Inet6Address;
@ -53,6 +57,8 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** /**
@ -66,8 +72,15 @@ import org.joda.time.DateTime;
* @see <a href="https://tools.ietf.org/html/rfc7483"> * @see <a href="https://tools.ietf.org/html/rfc7483">
* RFC 7483: JSON Responses for the Registration Data Access Protocol (RDAP)</a> * RFC 7483: JSON Responses for the Registration Data Access Protocol (RDAP)</a>
*/ */
@Singleton
public class RdapJsonFormatter { public class RdapJsonFormatter {
@Inject @Config("rdapTosPath") String rdapTosPath;
@Inject @Config("rdapHelpMap") ImmutableMap<String, RdapNoticeDescriptor> rdapHelpMap;
@Inject RdapJsonFormatter() {}
private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass();
/** /**
* What type of data to generate. Summary data includes only information about the object itself, * What type of data to generate. Summary data includes only information about the object itself,
* while full data includes associated items (e.g. for domains, full data includes the hosts, * while full data includes associated items (e.g. for domains, full data includes the hosts,
@ -277,6 +290,26 @@ public class RdapJsonFormatter {
return designatedContact.getType(); return designatedContact.getType();
}}); }});
ImmutableMap<String, Object> getJsonTosNotice(String rdapLinkBase) {
return getJsonHelpNotice(rdapTosPath, rdapLinkBase);
}
ImmutableMap<String, Object> getJsonHelpNotice(
String pathSearchString, String rdapLinkBase) {
if (pathSearchString.isEmpty()) {
pathSearchString = "/";
}
if (!rdapHelpMap.containsKey(pathSearchString)) {
throw new NotFoundException("no help found for " + pathSearchString);
}
try {
return RdapJsonFormatter.makeRdapJsonNotice(rdapHelpMap.get(pathSearchString), rdapLinkBase);
} catch (Exception e) {
logger.warningfmt(e, "Error reading RDAP help file: %s", pathSearchString);
throw new InternalServerErrorException("unable to read help for " + pathSearchString);
}
}
/** /**
* Adds the required top-level boilerplate. RFC 7483 specifies that the top-level object should * Adds the required top-level boilerplate. RFC 7483 specifies that the top-level object should
* include an entry indicating the conformance level. The ICANN RDAP Profile document (dated 3 * include an entry indicating the conformance level. The ICANN RDAP Profile document (dated 3
@ -292,7 +325,7 @@ public class RdapJsonFormatter {
* @param remarks a list of remarks to be inserted before the boilerplate notices. * @param remarks a list of remarks to be inserted before the boilerplate notices.
* @param rdapLinkBase the base for link URLs * @param rdapLinkBase the base for link URLs
*/ */
static void addTopLevelEntries( void addTopLevelEntries(
ImmutableMap.Builder<String, Object> jsonBuilder, ImmutableMap.Builder<String, Object> jsonBuilder,
BoilerplateType boilerplateType, BoilerplateType boilerplateType,
List<ImmutableMap<String, Object>> notices, List<ImmutableMap<String, Object>> notices,
@ -301,8 +334,7 @@ public class RdapJsonFormatter {
jsonBuilder.put("rdapConformance", CONFORMANCE_LIST); jsonBuilder.put("rdapConformance", CONFORMANCE_LIST);
ImmutableList.Builder<ImmutableMap<String, Object>> noticesBuilder = ImmutableList.Builder<ImmutableMap<String, Object>> noticesBuilder =
new ImmutableList.Builder<>(); new ImmutableList.Builder<>();
ImmutableMap<String, Object> tosNotice = ImmutableMap<String, Object> tosNotice = getJsonTosNotice(rdapLinkBase);
RdapHelpAction.getJsonHelpNotice(RdapHelpAction.TERMS_OF_SERVICE_PATH, rdapLinkBase);
boolean tosNoticeFound = false; boolean tosNoticeFound = false;
if (!notices.isEmpty()) { if (!notices.isEmpty()) {
noticesBuilder.addAll(notices); noticesBuilder.addAll(notices);
@ -337,31 +369,6 @@ public class RdapJsonFormatter {
} }
} }
/** AutoValue class to build parameters to {@link #makeRdapJsonNotice}. */
@AutoValue
abstract static class MakeRdapJsonNoticeParameters {
static Builder builder() {
return new AutoValue_RdapJsonFormatter_MakeRdapJsonNoticeParameters.Builder();
}
@Nullable abstract String title();
abstract ImmutableList<String> description();
@Nullable abstract String typeString();
@Nullable abstract String linkValueSuffix();
@Nullable abstract String linkHrefUrlString();
@AutoValue.Builder
abstract static class Builder {
abstract Builder title(@Nullable String title);
abstract Builder description(Iterable<String> description);
abstract Builder typeString(@Nullable String typeString);
abstract Builder linkValueSuffix(@Nullable String linkValueSuffix);
abstract Builder linkHrefUrlString(@Nullable String linkHrefUrlString);
abstract MakeRdapJsonNoticeParameters build();
}
}
/** /**
* Creates a JSON object containing a notice or remark object, as defined by RFC 7483 § 4.3. * Creates a JSON object containing a notice or remark object, as defined by RFC 7483 § 4.3.
* The object should then be inserted into a notices or remarks array. The builder fields are: * The object should then be inserted into a notices or remarks array. The builder fields are:
@ -391,22 +398,22 @@ public class RdapJsonFormatter {
* RFC 7483: JSON Responses for the Registration Data Access Protocol (RDAP)</a> * RFC 7483: JSON Responses for the Registration Data Access Protocol (RDAP)</a>
*/ */
static ImmutableMap<String, Object> makeRdapJsonNotice( static ImmutableMap<String, Object> makeRdapJsonNotice(
MakeRdapJsonNoticeParameters parameters, @Nullable String linkBase) { RdapNoticeDescriptor parameters, @Nullable String linkBase) {
ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>();
if (parameters.title() != null) { if (parameters.getTitle() != null) {
jsonBuilder.put("title", parameters.title()); jsonBuilder.put("title", parameters.getTitle());
} }
ImmutableList.Builder<String> descriptionBuilder = new ImmutableList.Builder<>(); ImmutableList.Builder<String> descriptionBuilder = new ImmutableList.Builder<>();
for (String line : parameters.description()) { for (String line : parameters.getDescription()) {
descriptionBuilder.add(nullToEmpty(line)); descriptionBuilder.add(nullToEmpty(line));
} }
jsonBuilder.put("description", descriptionBuilder.build()); jsonBuilder.put("description", descriptionBuilder.build());
if (parameters.typeString() != null) { if (parameters.getTypeString() != null) {
jsonBuilder.put("typeString", parameters.typeString()); jsonBuilder.put("typeString", parameters.getTypeString());
} }
String linkValueString = String linkValueString =
nullToEmpty(linkBase) + nullToEmpty(parameters.linkValueSuffix()); nullToEmpty(linkBase) + nullToEmpty(parameters.getLinkValueSuffix());
if (parameters.linkHrefUrlString() == null) { if (parameters.getLinkHrefUrlString() == null) {
jsonBuilder.put("links", ImmutableList.of(ImmutableMap.of( jsonBuilder.put("links", ImmutableList.of(ImmutableMap.of(
"value", linkValueString, "value", linkValueString,
"rel", "self", "rel", "self",
@ -414,7 +421,7 @@ public class RdapJsonFormatter {
"type", "application/rdap+json"))); "type", "application/rdap+json")));
} else { } else {
URI htmlBaseURI = URI.create(nullToEmpty(linkBase)); URI htmlBaseURI = URI.create(nullToEmpty(linkBase));
URI htmlUri = htmlBaseURI.resolve(parameters.linkHrefUrlString()); URI htmlUri = htmlBaseURI.resolve(parameters.getLinkHrefUrlString());
jsonBuilder.put("links", ImmutableList.of(ImmutableMap.of( jsonBuilder.put("links", ImmutableList.of(ImmutableMap.of(
"value", linkValueString, "value", linkValueString,
"rel", "alternate", "rel", "alternate",
@ -435,7 +442,7 @@ public class RdapJsonFormatter {
* @param now the as-date * @param now the as-date
* @param outputDataType whether to generate full or summary data * @param outputDataType whether to generate full or summary data
*/ */
static ImmutableMap<String, Object> makeRdapJsonForDomain( ImmutableMap<String, Object> makeRdapJsonForDomain(
DomainResource domainResource, DomainResource domainResource,
boolean isTopLevel, boolean isTopLevel,
@Nullable String linkBase, @Nullable String linkBase,
@ -529,7 +536,7 @@ public class RdapJsonFormatter {
* @param now the as-date * @param now the as-date
* @param outputDataType whether to generate full or summary data * @param outputDataType whether to generate full or summary data
*/ */
static ImmutableMap<String, Object> makeRdapJsonForHost( ImmutableMap<String, Object> makeRdapJsonForHost(
HostResource hostResource, HostResource hostResource,
boolean isTopLevel, boolean isTopLevel,
@Nullable String linkBase, @Nullable String linkBase,
@ -612,7 +619,7 @@ public class RdapJsonFormatter {
* @param now the as-date * @param now the as-date
* @param outputDataType whether to generate full or summary data * @param outputDataType whether to generate full or summary data
*/ */
static ImmutableMap<String, Object> makeRdapJsonForContact( ImmutableMap<String, Object> makeRdapJsonForContact(
ContactResource contactResource, ContactResource contactResource,
boolean isTopLevel, boolean isTopLevel,
Optional<DesignatedContact.Type> contactType, Optional<DesignatedContact.Type> contactType,
@ -701,7 +708,7 @@ public class RdapJsonFormatter {
* @param now the as-date * @param now the as-date
* @param outputDataType whether to generate full or summary data * @param outputDataType whether to generate full or summary data
*/ */
static ImmutableMap<String, Object> makeRdapJsonForRegistrar( ImmutableMap<String, Object> makeRdapJsonForRegistrar(
Registrar registrar, Registrar registrar,
boolean isTopLevel, boolean isTopLevel,
@Nullable String linkBase, @Nullable String linkBase,
@ -1044,8 +1051,7 @@ public class RdapJsonFormatter {
* @see <a href="https://tools.ietf.org/html/rfc7483"> * @see <a href="https://tools.ietf.org/html/rfc7483">
* RFC 7483: JSON Responses for the Registration Data Access Protocol (RDAP)</a> * RFC 7483: JSON Responses for the Registration Data Access Protocol (RDAP)</a>
*/ */
static ImmutableMap<String, Object> makeError( ImmutableMap<String, Object> makeError(int status, String title, String description) {
int status, String title, String description) {
return ImmutableMap.<String, Object>of( return ImmutableMap.<String, Object>of(
"rdapConformance", CONFORMANCE_LIST, "rdapConformance", CONFORMANCE_LIST,
"lang", "en", "lang", "en",

View file

@ -59,7 +59,7 @@ public class RdapNameserverAction extends RdapActionBase {
if (hostResource == null) { if (hostResource == null) {
throw new NotFoundException(pathSearchString + " not found"); throw new NotFoundException(pathSearchString + " not found");
} }
return RdapJsonFormatter.makeRdapJsonForHost( return rdapJsonFormatter.makeRdapJsonForHost(
hostResource, true, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL); hostResource, true, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL);
} }
} }

View file

@ -105,7 +105,7 @@ public class RdapNameserverSearchAction extends RdapActionBase {
} }
ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>();
jsonBuilder.put("nameserverSearchResults", results.jsonList()); jsonBuilder.put("nameserverSearchResults", results.jsonList());
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
jsonBuilder, jsonBuilder,
BoilerplateType.NAMESERVER, BoilerplateType.NAMESERVER,
results.isTruncated() results.isTruncated()
@ -127,7 +127,7 @@ public class RdapNameserverSearchAction extends RdapActionBase {
} }
return RdapSearchResults.create( return RdapSearchResults.create(
ImmutableList.of( ImmutableList.of(
RdapJsonFormatter.makeRdapJsonForHost( rdapJsonFormatter.makeRdapJsonForHost(
hostResource, false, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL))); hostResource, false, rdapLinkBase, rdapWhoisServer, now, OutputDataType.FULL)));
// Handle queries with a wildcard, but no suffix. There are no pending deletes for hosts, so we // Handle queries with a wildcard, but no suffix. There are no pending deletes for hosts, so we
// can call queryUndeleted. // can call queryUndeleted.
@ -186,7 +186,7 @@ public class RdapNameserverSearchAction extends RdapActionBase {
new ImmutableList.Builder<>(); new ImmutableList.Builder<>();
for (HostResource host : Iterables.limit(hosts, rdapResultSetMaxSize)) { for (HostResource host : Iterables.limit(hosts, rdapResultSetMaxSize)) {
jsonListBuilder.add( jsonListBuilder.add(
RdapJsonFormatter.makeRdapJsonForHost( rdapJsonFormatter.makeRdapJsonForHost(
host, false, rdapLinkBase, rdapWhoisServer, now, outputDataType)); host, false, rdapLinkBase, rdapWhoisServer, now, outputDataType));
} }
ImmutableList<ImmutableMap<String, Object>> jsonList = jsonListBuilder.build(); ImmutableList<ImmutableMap<String, Object>> jsonList = jsonListBuilder.build();

View file

@ -16,6 +16,7 @@ java_library(
"//java/com/google/common/collect", "//java/com/google/common/collect",
"//java/com/google/common/io", "//java/com/google/common/io",
"//java/com/google/common/net", "//java/com/google/common/net",
"//java/google/registry/config",
"//java/google/registry/model", "//java/google/registry/model",
"//java/google/registry/rdap", "//java/google/registry/rdap",
"//java/google/registry/request", "//java/google/registry/request",

View file

@ -80,12 +80,12 @@ public class RdapActionBaseTest {
} }
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("key", "value"); builder.put("key", "value");
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
BoilerplateType.OTHER, BoilerplateType.OTHER,
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
"http://myserver.google.com/"); "http://myserver.example.com/");
return builder.build(); return builder.build();
} }
} }
@ -98,12 +98,13 @@ public class RdapActionBaseTest {
inject.setStaticField(Ofy.class, "clock", clock); inject.setStaticField(Ofy.class, "clock", clock);
action = new RdapTestAction(); action = new RdapTestAction();
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
} }
private Object generateActualJson(String domainName) { private Object generateActualJson(String domainName) {
action.requestPath = RdapTestAction.PATH + domainName; action.requestPath = RdapTestAction.PATH + domainName;
action.requestMethod = GET; action.requestMethod = GET;
action.rdapLinkBase = "http://myserver.google.com/"; action.rdapLinkBase = "http://myserver.example.com/";
action.run(); action.run();
return JSONValue.parse(response.getPayload()); return JSONValue.parse(response.getPayload());
} }
@ -111,7 +112,7 @@ public class RdapActionBaseTest {
private String generateHeadPayload(String domainName) { private String generateHeadPayload(String domainName) {
action.requestPath = RdapTestAction.PATH + domainName; action.requestPath = RdapTestAction.PATH + domainName;
action.requestMethod = HEAD; action.requestMethod = HEAD;
action.rdapLinkBase = "http://myserver.google.com/"; action.rdapLinkBase = "http://myserver.example.com/";
action.run(); action.run();
return response.getPayload(); return response.getPayload();
} }

View file

@ -123,6 +123,7 @@ public class RdapDomainActionTest {
action = new RdapDomainAction(); action = new RdapDomainAction();
action.clock = clock; action.clock = clock;
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapLinkBase = "https://example.com/rdap/"; action.rdapLinkBase = "https://example.com/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;

View file

@ -301,6 +301,7 @@ public class RdapDomainSearchActionTest {
action.clock = clock; action.clock = clock;
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapLinkBase = "https://example.com/rdap/"; action.rdapLinkBase = "https://example.com/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;
} }
@ -552,7 +553,7 @@ public class RdapDomainSearchActionTest {
} }
persistResources(domainsBuilder.build()); persistResources(domainsBuilder.build());
} }
private Object readMultiDomainFile( private Object readMultiDomainFile(
String fileName, String fileName,
String domainName1, String domainName1,
@ -988,7 +989,7 @@ public class RdapDomainSearchActionTest {
.isEqualTo(generateExpectedJson("No domains found", null, null, "rdap_error_404.json")); .isEqualTo(generateExpectedJson("No domains found", null, null, "rdap_error_404.json"));
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@Test @Test
public void testAddressMatch_nontruncatedResultsSet() throws Exception { public void testAddressMatch_nontruncatedResultsSet() throws Exception {
createManyDomainsAndHosts(4, 1, 2); createManyDomainsAndHosts(4, 1, 2);

View file

@ -144,6 +144,7 @@ public class RdapEntityActionTest {
action = new RdapEntityAction(); action = new RdapEntityAction();
action.clock = clock; action.clock = clock;
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapLinkBase = "https://example.com/rdap/"; action.rdapLinkBase = "https://example.com/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;
} }

View file

@ -124,6 +124,7 @@ public class RdapEntitySearchActionTest {
action.clock = clock; action.clock = clock;
action.requestPath = RdapEntitySearchAction.PATH; action.requestPath = RdapEntitySearchAction.PATH;
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapResultSetMaxSize = 4; action.rdapResultSetMaxSize = 4;
action.rdapLinkBase = "https://example.com/rdap/"; action.rdapLinkBase = "https://example.com/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;
@ -444,7 +445,7 @@ public class RdapEntitySearchActionTest {
generateActualJsonWithHandle("3test*"); generateActualJsonWithHandle("3test*");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@Test @Test
public void testHandleMatch_truncatedEntities() throws Exception { public void testHandleMatch_truncatedEntities() throws Exception {
createManyContactsAndRegistrars(300, 0); createManyContactsAndRegistrars(300, 0);

View file

@ -49,6 +49,7 @@ public class RdapHelpActionTest {
action = new RdapHelpAction(); action = new RdapHelpAction();
action.clock = clock; action.clock = clock;
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapLinkBase = "https://example.tld/rdap/"; action.rdapLinkBase = "https://example.tld/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;
} }

View file

@ -30,6 +30,7 @@ import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import google.registry.config.RdapNoticeDescriptor;
import google.registry.model.contact.ContactResource; import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DesignatedContact; import google.registry.model.domain.DesignatedContact;
import google.registry.model.domain.DomainResource; import google.registry.model.domain.DomainResource;
@ -40,7 +41,6 @@ import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarContact; import google.registry.model.registrar.RegistrarContact;
import google.registry.model.registry.Registry.TldState; import google.registry.model.registry.Registry.TldState;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.rdap.RdapJsonFormatter.MakeRdapJsonNoticeParameters;
import google.registry.rdap.RdapJsonFormatter.OutputDataType; import google.registry.rdap.RdapJsonFormatter.OutputDataType;
import google.registry.testing.AppEngineRule; import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock; import google.registry.testing.FakeClock;
@ -65,6 +65,8 @@ public class RdapJsonFormatterTest {
private final FakeClock clock = new FakeClock(DateTime.parse("1999-01-01T00:00:00Z")); private final FakeClock clock = new FakeClock(DateTime.parse("1999-01-01T00:00:00Z"));
private RdapJsonFormatter rdapJsonFormatter;
private Registrar registrar; private Registrar registrar;
private DomainResource domainResourceFull; private DomainResource domainResourceFull;
private DomainResource domainResourceNoNameservers; private DomainResource domainResourceNoNameservers;
@ -76,8 +78,8 @@ public class RdapJsonFormatterTest {
private ContactResource contactResourceAdmin; private ContactResource contactResourceAdmin;
private ContactResource contactResourceTech; private ContactResource contactResourceTech;
private static final String LINK_BASE = "http://myserver.google.com/"; private static final String LINK_BASE = "http://myserver.example.com/";
private static final String LINK_BASE_NO_TRAILING_SLASH = "http://myserver.google.com"; private static final String LINK_BASE_NO_TRAILING_SLASH = "http://myserver.example.com";
// Do not set a port43 whois server, as per Gustavo Lozano. // Do not set a port43 whois server, as per Gustavo Lozano.
private static final String WHOIS_SERVER = null; private static final String WHOIS_SERVER = null;
@ -85,6 +87,8 @@ public class RdapJsonFormatterTest {
public void setUp() throws Exception { public void setUp() throws Exception {
inject.setStaticField(Ofy.class, "clock", clock); inject.setStaticField(Ofy.class, "clock", clock);
rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
// Create the registrar in 1999, then update it in 2000. // Create the registrar in 1999, then update it in 2000.
clock.setTo(DateTime.parse("1999-01-01T00:00:00Z")); clock.setTo(DateTime.parse("1999-01-01T00:00:00Z"));
createTld("xn--q9jyb4c", TldState.GENERAL_AVAILABILITY); createTld("xn--q9jyb4c", TldState.GENERAL_AVAILABILITY);
@ -204,42 +208,42 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testRegistrar() throws Exception { public void testRegistrar() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForRegistrar( assertThat(rdapJsonFormatter.makeRdapJsonForRegistrar(
registrar, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) registrar, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_registrar.json")); .isEqualTo(loadJson("rdapjson_registrar.json"));
} }
@Test @Test
public void testRegistrar_summary() throws Exception { public void testRegistrar_summary() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForRegistrar( assertThat(rdapJsonFormatter.makeRdapJsonForRegistrar(
registrar, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.SUMMARY)) registrar, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.SUMMARY))
.isEqualTo(loadJson("rdapjson_registrar_summary.json")); .isEqualTo(loadJson("rdapjson_registrar_summary.json"));
} }
@Test @Test
public void testHost_ipv4() throws Exception { public void testHost_ipv4() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceIpv4, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) hostResourceIpv4, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_ipv4.json")); .isEqualTo(loadJson("rdapjson_host_ipv4.json"));
} }
@Test @Test
public void testHost_ipv6() throws Exception { public void testHost_ipv6() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceIpv6, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) hostResourceIpv6, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_ipv6.json")); .isEqualTo(loadJson("rdapjson_host_ipv6.json"));
} }
@Test @Test
public void testHost_both() throws Exception { public void testHost_both() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceBoth, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) hostResourceBoth, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_both.json")); .isEqualTo(loadJson("rdapjson_host_both.json"));
} }
@Test @Test
public void testHost_both_summary() throws Exception { public void testHost_both_summary() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceBoth, hostResourceBoth,
false, false,
LINK_BASE, LINK_BASE,
@ -251,7 +255,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testHost_noAddresses() throws Exception { public void testHost_noAddresses() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceNoAddresses, hostResourceNoAddresses,
false, false,
LINK_BASE, LINK_BASE,
@ -264,7 +268,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testRegistrant() throws Exception { public void testRegistrant() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceRegistrant, contactResourceRegistrant,
false, false,
Optional.of(DesignatedContact.Type.REGISTRANT), Optional.of(DesignatedContact.Type.REGISTRANT),
@ -278,7 +282,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testRegistrant_summary() throws Exception { public void testRegistrant_summary() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceRegistrant, contactResourceRegistrant,
false, false,
Optional.of(DesignatedContact.Type.REGISTRANT), Optional.of(DesignatedContact.Type.REGISTRANT),
@ -292,7 +296,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testRegistrant_baseHasNoTrailingSlash() throws Exception { public void testRegistrant_baseHasNoTrailingSlash() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceRegistrant, contactResourceRegistrant,
false, false,
Optional.of(DesignatedContact.Type.REGISTRANT), Optional.of(DesignatedContact.Type.REGISTRANT),
@ -306,7 +310,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testRegistrant_noBase() throws Exception { public void testRegistrant_noBase() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceRegistrant, contactResourceRegistrant,
false, false,
Optional.of(DesignatedContact.Type.REGISTRANT), Optional.of(DesignatedContact.Type.REGISTRANT),
@ -320,7 +324,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testAdmin() throws Exception { public void testAdmin() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceAdmin, contactResourceAdmin,
false, false,
Optional.of(DesignatedContact.Type.ADMIN), Optional.of(DesignatedContact.Type.ADMIN),
@ -334,7 +338,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testTech() throws Exception { public void testTech() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceTech, contactResourceTech,
false, false,
Optional.of(DesignatedContact.Type.TECH), Optional.of(DesignatedContact.Type.TECH),
@ -348,7 +352,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testRolelessContact() throws Exception { public void testRolelessContact() throws Exception {
assertThat( assertThat(
RdapJsonFormatter.makeRdapJsonForContact( rdapJsonFormatter.makeRdapJsonForContact(
contactResourceTech, contactResourceTech,
false, false,
Optional.<DesignatedContact.Type>absent(), Optional.<DesignatedContact.Type>absent(),
@ -361,7 +365,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testDomain_full() throws Exception { public void testDomain_full() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForDomain( assertThat(rdapJsonFormatter.makeRdapJsonForDomain(
domainResourceFull, domainResourceFull,
false, false,
LINK_BASE, LINK_BASE,
@ -373,7 +377,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testDomain_summary() throws Exception { public void testDomain_summary() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForDomain( assertThat(rdapJsonFormatter.makeRdapJsonForDomain(
domainResourceFull, domainResourceFull,
false, false,
LINK_BASE, LINK_BASE,
@ -385,7 +389,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testDomain_noNameservers() throws Exception { public void testDomain_noNameservers() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonForDomain( assertThat(rdapJsonFormatter.makeRdapJsonForDomain(
domainResourceNoNameservers, domainResourceNoNameservers,
false, false,
LINK_BASE, LINK_BASE,
@ -398,7 +402,7 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testError() throws Exception { public void testError() throws Exception {
assertThat( assertThat(
RdapJsonFormatter rdapJsonFormatter
.makeError(SC_BAD_REQUEST, "Invalid Domain Name", "Not a valid domain name")) .makeError(SC_BAD_REQUEST, "Invalid Domain Name", "Not a valid domain name"))
.isEqualTo(loadJson("rdapjson_error.json")); .isEqualTo(loadJson("rdapjson_error.json"));
} }
@ -406,14 +410,14 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testHelp_absoluteHtmlUrl() throws Exception { public void testHelp_absoluteHtmlUrl() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonNotice( assertThat(RdapJsonFormatter.makeRdapJsonNotice(
MakeRdapJsonNoticeParameters.builder() RdapNoticeDescriptor.builder()
.title("RDAP Help") .setTitle("RDAP Help")
.description(ImmutableList.of( .setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)", "RDAP Help Topics (use /help/topic for information)",
"syntax", "syntax",
"tos (Terms of Service)")) "tos (Terms of Service)"))
.linkValueSuffix("help/index") .setLinkValueSuffix("help/index")
.linkHrefUrlString(LINK_BASE + "about/rdap/index.html") .setLinkHrefUrlString(LINK_BASE + "about/rdap/index.html")
.build(), .build(),
LINK_BASE)) LINK_BASE))
.isEqualTo(loadJson("rdapjson_notice_alternate_link.json")); .isEqualTo(loadJson("rdapjson_notice_alternate_link.json"));
@ -422,14 +426,14 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testHelp_relativeHtmlUrlWithStartingSlash() throws Exception { public void testHelp_relativeHtmlUrlWithStartingSlash() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonNotice( assertThat(RdapJsonFormatter.makeRdapJsonNotice(
MakeRdapJsonNoticeParameters.builder() RdapNoticeDescriptor.builder()
.title("RDAP Help") .setTitle("RDAP Help")
.description(ImmutableList.of( .setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)", "RDAP Help Topics (use /help/topic for information)",
"syntax", "syntax",
"tos (Terms of Service)")) "tos (Terms of Service)"))
.linkValueSuffix("help/index") .setLinkValueSuffix("help/index")
.linkHrefUrlString("/about/rdap/index.html") .setLinkHrefUrlString("/about/rdap/index.html")
.build(), .build(),
LINK_BASE)) LINK_BASE))
.isEqualTo(loadJson("rdapjson_notice_alternate_link.json")); .isEqualTo(loadJson("rdapjson_notice_alternate_link.json"));
@ -438,14 +442,14 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testHelp_relativeHtmlUrlWithoutStartingSlash() throws Exception { public void testHelp_relativeHtmlUrlWithoutStartingSlash() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonNotice( assertThat(RdapJsonFormatter.makeRdapJsonNotice(
MakeRdapJsonNoticeParameters.builder() RdapNoticeDescriptor.builder()
.title("RDAP Help") .setTitle("RDAP Help")
.description(ImmutableList.of( .setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)", "RDAP Help Topics (use /help/topic for information)",
"syntax", "syntax",
"tos (Terms of Service)")) "tos (Terms of Service)"))
.linkValueSuffix("help/index") .setLinkValueSuffix("help/index")
.linkHrefUrlString("about/rdap/index.html") .setLinkHrefUrlString("about/rdap/index.html")
.build(), .build(),
LINK_BASE)) LINK_BASE))
.isEqualTo(loadJson("rdapjson_notice_alternate_link.json")); .isEqualTo(loadJson("rdapjson_notice_alternate_link.json"));
@ -454,13 +458,13 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testHelp_noHtmlUrl() throws Exception { public void testHelp_noHtmlUrl() throws Exception {
assertThat(RdapJsonFormatter.makeRdapJsonNotice( assertThat(RdapJsonFormatter.makeRdapJsonNotice(
MakeRdapJsonNoticeParameters.builder() RdapNoticeDescriptor.builder()
.title("RDAP Help") .setTitle("RDAP Help")
.description(ImmutableList.of( .setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)", "RDAP Help Topics (use /help/topic for information)",
"syntax", "syntax",
"tos (Terms of Service)")) "tos (Terms of Service)"))
.linkValueSuffix("help/index") .setLinkValueSuffix("help/index")
.build(), .build(),
LINK_BASE)) LINK_BASE))
.isEqualTo(loadJson("rdapjson_notice_self_link.json")); .isEqualTo(loadJson("rdapjson_notice_self_link.json"));
@ -470,7 +474,7 @@ public class RdapJsonFormatterTest {
public void testTopLevel() throws Exception { public void testTopLevel() throws Exception {
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("key", "value"); builder.put("key", "value");
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
RdapJsonFormatter.BoilerplateType.OTHER, RdapJsonFormatter.BoilerplateType.OTHER,
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
@ -483,10 +487,10 @@ public class RdapJsonFormatterTest {
public void testTopLevel_withTermsOfService() throws Exception { public void testTopLevel_withTermsOfService() throws Exception {
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("key", "value"); builder.put("key", "value");
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
RdapJsonFormatter.BoilerplateType.OTHER, RdapJsonFormatter.BoilerplateType.OTHER,
ImmutableList.of(RdapHelpAction.getJsonHelpNotice("/tos", LINK_BASE)), ImmutableList.of(rdapJsonFormatter.getJsonHelpNotice("/tos", LINK_BASE)),
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
LINK_BASE); LINK_BASE);
assertThat(builder.build()).isEqualTo(loadJson("rdapjson_toplevel.json")); assertThat(builder.build()).isEqualTo(loadJson("rdapjson_toplevel.json"));
@ -496,7 +500,7 @@ public class RdapJsonFormatterTest {
public void testTopLevel_domain() throws Exception { public void testTopLevel_domain() throws Exception {
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("key", "value"); builder.put("key", "value");
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
RdapJsonFormatter.BoilerplateType.DOMAIN, RdapJsonFormatter.BoilerplateType.DOMAIN,
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
@ -509,10 +513,10 @@ public class RdapJsonFormatterTest {
public void testTopLevel_domainWithTermsOfService() throws Exception { public void testTopLevel_domainWithTermsOfService() throws Exception {
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("key", "value"); builder.put("key", "value");
RdapJsonFormatter.addTopLevelEntries( rdapJsonFormatter.addTopLevelEntries(
builder, builder,
RdapJsonFormatter.BoilerplateType.DOMAIN, RdapJsonFormatter.BoilerplateType.DOMAIN,
ImmutableList.of(RdapHelpAction.getJsonHelpNotice("/tos", LINK_BASE)), ImmutableList.of(rdapJsonFormatter.getJsonHelpNotice("/tos", LINK_BASE)),
ImmutableList.<ImmutableMap<String, Object>>of(), ImmutableList.<ImmutableMap<String, Object>>of(),
LINK_BASE); LINK_BASE);
assertThat(builder.build()).isEqualTo(loadJson("rdapjson_toplevel_domain.json")); assertThat(builder.build()).isEqualTo(loadJson("rdapjson_toplevel_domain.json"));

View file

@ -75,6 +75,7 @@ public class RdapNameserverActionTest {
action.clock = clock; action.clock = clock;
action.response = response; action.response = response;
action.requestPath = RdapNameserverAction.PATH.concat(input); action.requestPath = RdapNameserverAction.PATH.concat(input);
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapLinkBase = "https://example.tld/rdap/"; action.rdapLinkBase = "https://example.tld/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;
return action; return action;

View file

@ -132,6 +132,7 @@ public class RdapNameserverSearchActionTest {
action.clock = clock; action.clock = clock;
action.requestPath = RdapNameserverSearchAction.PATH; action.requestPath = RdapNameserverSearchAction.PATH;
action.response = response; action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapResultSetMaxSize = 4; action.rdapResultSetMaxSize = 4;
action.rdapLinkBase = "https://example.tld/rdap/"; action.rdapLinkBase = "https://example.tld/rdap/";
action.rdapWhoisServer = null; action.rdapWhoisServer = null;
@ -140,7 +141,7 @@ public class RdapNameserverSearchActionTest {
} }
private Object generateExpectedJson(String expectedOutputFile) { private Object generateExpectedJson(String expectedOutputFile) {
return generateExpectedJson(null, null, null, null, null, expectedOutputFile); return generateExpectedJson(null, null, null, null, null, expectedOutputFile);
} }
private Object generateExpectedJson(String name, String expectedOutputFile) { private Object generateExpectedJson(String name, String expectedOutputFile) {
@ -207,7 +208,7 @@ public class RdapNameserverSearchActionTest {
.setSubordinateHosts(subordinateHostsBuilder.build()) .setSubordinateHosts(subordinateHostsBuilder.build())
.build()); .build());
} }
@Test @Test
public void testInvalidPath_rejected() throws Exception { public void testInvalidPath_rejected() throws Exception {
action.requestPath = RdapDomainSearchAction.PATH + "/path"; action.requestPath = RdapDomainSearchAction.PATH + "/path";
@ -354,7 +355,7 @@ public class RdapNameserverSearchActionTest {
generateActualJsonWithName("dog*"); generateActualJsonWithName("dog*");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@Test @Test
public void testNameMatch_nontruncatedResultSet() throws Exception { public void testNameMatch_nontruncatedResultSet() throws Exception {
createManyHosts(4); createManyHosts(4);

View file

@ -16,6 +16,7 @@ package google.registry.rdap;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import google.registry.config.RdapNoticeDescriptor;
public class RdapTestHelper { public class RdapTestHelper {
@ -35,8 +36,8 @@ public class RdapTestHelper {
+ " transmission of mass unsolicited, commercial advertising or" + " transmission of mass unsolicited, commercial advertising or"
+ " solicitations.", + " solicitations.",
"Don't access our Domain Database through the use of high volume, automated" "Don't access our Domain Database through the use of high volume, automated"
+ " electronic processes that send queries or data to the systems of" + " electronic processes that send queries or data to the systems of any"
+ " Charleston Road Registry or any ICANN-accredited registrar.", + " ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful" "You may only use the information contained in the Domain Database for lawful"
+ " purposes.", + " purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information" "Do not compile, repackage, disseminate, or otherwise use the information"
@ -51,7 +52,7 @@ public class RdapTestHelper {
ImmutableMap.of( ImmutableMap.of(
"value", linkBase + "help/tos", "value", linkBase + "help/tos",
"rel", "alternate", "rel", "alternate",
"href", "https://www.registry.google/about/rdap/tos.html", "href", "https://www.registry.tld/about/rdap/tos.html",
"type", "text/html"))))); "type", "text/html")))));
} }
@ -99,5 +100,75 @@ public class RdapTestHelper {
"href", "https://www.icann.org/wicf", "href", "https://www.icann.org/wicf",
"type", "text/html"))))); "type", "text/html")))));
} }
}
static RdapJsonFormatter getTestRdapJsonFormatter() {
RdapJsonFormatter rdapJsonFormatter = new RdapJsonFormatter();
rdapJsonFormatter.rdapTosPath = "/tos";
rdapJsonFormatter.rdapHelpMap = ImmutableMap.of(
"/",
RdapNoticeDescriptor.builder()
.setTitle("RDAP Help")
.setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)",
"syntax",
"tos (Terms of Service)"))
.setLinkValueSuffix("help/")
.build(),
"/index",
RdapNoticeDescriptor.builder()
.setTitle("RDAP Help")
.setDescription(ImmutableList.of(
"RDAP Help Topics (use /help/topic for information)",
"syntax",
"tos (Terms of Service)"))
.setLinkValueSuffix("help/index")
.build(),
"/syntax",
RdapNoticeDescriptor.builder()
.setTitle("RDAP Command Syntax")
.setDescription(ImmutableList.of(
"domain/XXXX",
"nameserver/XXXX",
"entity/XXXX",
"domains?name=XXXX",
"domains?nsLdhName=XXXX",
"domains?nsIp=XXXX",
"nameservers?name=XXXX",
"nameservers?ip=XXXX",
"entities?fn=XXXX",
"entities?handle=XXXX",
"help/XXXX"))
.setLinkValueSuffix("help/syntax")
.setLinkHrefUrlString("https://www.registry.tld/about/rdap/syntax.html")
.build(),
"/tos",
RdapNoticeDescriptor.builder()
.setTitle("RDAP Terms of Service")
.setDescription(ImmutableList.of(
"By querying our Domain Database, you are agreeing to comply with these terms so"
+ " please read them carefully.",
"Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for"
+ " query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the"
+ " transmission of mass unsolicited, commercial advertising or"
+ " solicitations.",
"Don't access our Domain Database through the use of high volume, automated"
+ " electronic processes that send queries or data to the systems of any"
+ " ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful"
+ " purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information"
+ " contained in the Domain Database in its entirety, or in any substantial"
+ " portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the"
+ " purposes of detecting and preventing misuse.",
"We reserve the right to restrict or deny your access to the database if we"
+ " suspect that you have failed to comply with these terms.",
"We reserve the right to modify this agreement at any time."))
.setLinkValueSuffix("help/tos")
.setLinkHrefUrlString("https://www.registry.tld/about/rdap/tos.html")
.build());
return rdapJsonFormatter;
}
}

View file

@ -14,9 +14,9 @@
[ [
{ {
"value" : "https://example.tld/rdap/help/%NAME%", "value" : "https://example.tld/rdap/help/%NAME%",
"rel" : "alternate", "rel" : "self",
"type" : "text/html", "type" : "application/rdap+json",
"href" : "https://www.registry.google/about/rdap/index.html" "href" : "https://example.tld/rdap/help/%NAME%"
} }
] ]
}, },
@ -28,7 +28,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -40,7 +40,7 @@
{ {
"value" : "https://example.tld/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -10,7 +10,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -22,7 +22,7 @@
{ {
"value" : "https://example.tld/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -112,7 +112,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -124,7 +124,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -105,7 +105,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -117,7 +117,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -70,7 +70,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -82,7 +82,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -70,7 +70,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -82,7 +82,7 @@
{ {
"value" : "https://example.tld/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -197,7 +197,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -209,7 +209,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -126,7 +126,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -138,7 +138,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -125,7 +125,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -137,7 +137,7 @@
{ {
"value" : "https://example.tld/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -225,7 +225,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -237,7 +237,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -205,7 +205,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -217,7 +217,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -134,7 +134,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -146,7 +146,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -133,7 +133,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -145,7 +145,7 @@
{ {
"value" : "https://example.tld/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -212,7 +212,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -224,7 +224,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -233,7 +233,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -245,7 +245,7 @@
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.com/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/4-ROID", "value" : "http://myserver.example.com/entity/4-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/4-ROID", "href" : "http://myserver.example.com/entity/4-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -13,9 +13,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/domain/cat.xn--q9jyb4c", "value" : "http://myserver.example.com/domain/cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/domain/cat.xn--q9jyb4c", "href" : "http://myserver.example.com/domain/cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -49,9 +49,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns1.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns1.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns1.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns1.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -80,9 +80,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns2.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns2.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns2.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns2.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -113,9 +113,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/4-ROID", "value" : "http://myserver.example.com/entity/4-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/4-ROID", "href" : "http://myserver.example.com/entity/4-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -162,9 +162,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/6-ROID", "value" : "http://myserver.example.com/entity/6-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/6-ROID", "href" : "http://myserver.example.com/entity/6-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -211,9 +211,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/2-ROID", "value" : "http://myserver.example.com/entity/2-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/2-ROID", "href" : "http://myserver.example.com/entity/2-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -14,9 +14,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/domain/fish.xn--q9jyb4c", "value" : "http://myserver.example.com/domain/fish.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/domain/fish.xn--q9jyb4c", "href" : "http://myserver.example.com/domain/fish.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -49,9 +49,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/4-ROID", "value" : "http://myserver.example.com/entity/4-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/4-ROID", "href" : "http://myserver.example.com/entity/4-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -98,9 +98,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/6-ROID", "value" : "http://myserver.example.com/entity/6-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/6-ROID", "href" : "http://myserver.example.com/entity/6-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -147,9 +147,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/2-ROID", "value" : "http://myserver.example.com/entity/2-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/2-ROID", "href" : "http://myserver.example.com/entity/2-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -13,9 +13,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/domain/cat.xn--q9jyb4c", "value" : "http://myserver.example.com/domain/cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/domain/cat.xn--q9jyb4c", "href" : "http://myserver.example.com/domain/cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -7,9 +7,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns3.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns3.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns3.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns3.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -7,9 +7,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns3.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns3.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns3.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns3.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -7,9 +7,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns1.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns1.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns1.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns1.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -7,9 +7,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns2.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns2.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns2.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns2.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -7,9 +7,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/nameserver/ns4.cat.xn--q9jyb4c", "value" : "http://myserver.example.com/nameserver/ns4.cat.xn--q9jyb4c",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/nameserver/ns4.cat.xn--q9jyb4c", "href" : "http://myserver.example.com/nameserver/ns4.cat.xn--q9jyb4c",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -9,10 +9,10 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/help/index", "value" : "http://myserver.example.com/help/index",
"rel" : "alternate", "rel" : "alternate",
"type" : "text/html", "type" : "text/html",
"href" : "http://myserver.google.com/about/rdap/index.html" "href" : "http://myserver.example.com/about/rdap/index.html"
} }
] ]
} }

View file

@ -9,10 +9,10 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/help/index", "value" : "http://myserver.example.com/help/index",
"rel" : "self", "rel" : "self",
"type" : "application/rdap+json", "type" : "application/rdap+json",
"href" : "http://myserver.google.com/help/index", "href" : "http://myserver.example.com/help/index",
} }
] ]
} }

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/2-ROID", "value" : "http://myserver.example.com/entity/2-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/2-ROID", "href" : "http://myserver.example.com/entity/2-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/2-ROID", "value" : "http://myserver.example.com/entity/2-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/2-ROID", "href" : "http://myserver.example.com/entity/2-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/1", "value" : "http://myserver.example.com/entity/1",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/1", "href" : "http://myserver.example.com/entity/1",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/1", "value" : "http://myserver.example.com/entity/1",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/1", "href" : "http://myserver.example.com/entity/1",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -5,9 +5,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/6-ROID", "value" : "http://myserver.example.com/entity/6-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/6-ROID", "href" : "http://myserver.example.com/entity/6-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/entity/6-ROID", "value" : "http://myserver.example.com/entity/6-ROID",
"rel" : "self", "rel" : "self",
"href" : "http://myserver.google.com/entity/6-ROID", "href" : "http://myserver.example.com/entity/6-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -14,7 +14,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -24,9 +24,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/help/tos", "value" : "http://myserver.example.com/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]

View file

@ -14,7 +14,7 @@
"Any information provided is 'as is' without any guarantee of accuracy.", "Any information provided is 'as is' without any guarantee of accuracy.",
"Please do not misuse the Domain Database. It is intended solely for query-based access.", "Please do not misuse the Domain Database. It is intended solely for query-based access.",
"Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.", "Don't use the Domain Database to allow, enable, or otherwise support the transmission of mass unsolicited, commercial advertising or solicitations.",
"Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of Charleston Road Registry or any ICANN-accredited registrar.", "Don't access our Domain Database through the use of high volume, automated electronic processes that send queries or data to the systems of any ICANN-accredited registrar.",
"You may only use the information contained in the Domain Database for lawful purposes.", "You may only use the information contained in the Domain Database for lawful purposes.",
"Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.", "Do not compile, repackage, disseminate, or otherwise use the information contained in the Domain Database in its entirety, or in any substantial portion, without our prior written permission.",
"We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.", "We may retain certain details about queries to our Domain Database for the purposes of detecting and preventing misuse.",
@ -24,9 +24,9 @@
"links" : "links" :
[ [
{ {
"value" : "http://myserver.google.com/help/tos", "value" : "http://myserver.example.com/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.google/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"
} }
] ]