1
0
mirror of https://github.com/google/nomulus synced 2026-05-02 13:55:58 +00:00

Update RDAP response profile + tech impl guide versions (#2778)

This corresponds to the Feb 2024 response profile section 1.2 and
implementation guide 1.3 respectively, now that we comply (or are, at
least closer to complying), with the Feb 2024 versions.

This should probably depend on https://github.com/google/nomulus/pull/2771
because that includes a small change included in the Feb 2024 version

This also updates the documentation to reference the proper areas of the
specifications.
This commit is contained in:
gbrodman
2025-07-09 17:02:33 -04:00
committed by GitHub
parent f34aec8b56
commit c6868b771b
67 changed files with 195 additions and 349 deletions

View File

@@ -55,7 +55,7 @@ import java.util.Optional;
import org.joda.time.DateTime;
/**
* Base RDAP (new WHOIS) action for all requests.
* Base RDAP action for all requests.
*
* @see <a href="https://tools.ietf.org/html/rfc9082">RFC 9082: Registration Data Access Protocol
* (RDAP) Query Format</a>
@@ -138,7 +138,7 @@ public abstract class RdapActionBase implements Runnable {
// RFC7480 4.2 - servers receiving an RDAP request return an entity with a Content-Type header
// containing the RDAP-specific JSON media type.
response.setContentType(RESPONSE_MEDIA_TYPE);
// RDAP Technical Implementation Guide 1.13 - when responding to RDAP valid requests, we MUST
// RDAP Technical Implementation Guide 1.14 - when responding to RDAP valid requests, we MUST
// include the Access-Control-Allow-Origin, which MUST be "*" unless otherwise specified.
response.setHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*");
try {

View File

@@ -26,7 +26,7 @@ import google.registry.request.auth.Auth;
import jakarta.inject.Inject;
/**
* RDAP (new WHOIS) action for RDAP autonomous system number requests.
* RDAP action for RDAP autonomous system number requests.
*
* <p>This feature is not implemented because it's only necessary for <i>address</i> registries like
* ARIN, not domain registries.

View File

@@ -41,14 +41,13 @@ final class RdapDataStructures {
// Conformance to RFC 9083
jsonArray.add("rdap_level_0");
// Conformance to the RDAP Response Profile V2.1
// Conformance to the RDAP Response Profile V2.2 (February 2024)
// (see section 1.2)
jsonArray.add("icann_rdap_response_profile_1");
// Conformance to the RDAP Technical Implementation Guide V2.2 (February 2024)
// (see section 1.3)
jsonArray.add("icann_rdap_response_profile_0");
// Conformance to the RDAP Technical Implementation Guide V2.1
// (see section 1.14)
jsonArray.add("icann_rdap_technical_implementation_guide_0");
jsonArray.add("icann_rdap_technical_implementation_guide_1");
return jsonArray;
}
}

View File

@@ -36,7 +36,7 @@ import google.registry.request.auth.Auth;
import jakarta.inject.Inject;
import java.util.Optional;
/** RDAP (new WHOIS) action for domain requests. */
/** RDAP action for domain requests. */
@Action(
service = GaeService.PUBAPI,
path = "/rdap/domain/",

View File

@@ -51,6 +51,7 @@ import google.registry.request.Parameter;
import google.registry.request.auth.Auth;
import google.registry.util.NonFinalForTesting;
import jakarta.inject.Inject;
import jakarta.persistence.Query;
import jakarta.persistence.criteria.CriteriaBuilder;
import java.net.InetAddress;
import java.util.Comparator;
@@ -60,17 +61,15 @@ import java.util.stream.Stream;
import org.hibernate.Hibernate;
/**
* RDAP (new WHOIS) action for domain search requests.
* RDAP action for domain search requests.
*
* <p>All commands and responses conform to the RDAP spec as defined in RFCs 7480 through 7485.
* <p>All commands and responses conform to the RDAP spec as defined in STD 95 and its RFCs.
*
* @see <a href="http://tools.ietf.org/html/rfc9082">RFC 9082: Registration Data Access Protocol
* (RDAP) Query Format</a>
* @see <a href="http://tools.ietf.org/html/rfc9083">RFC 9083: JSON Responses for the Registration
* Data Access Protocol (RDAP)</a>
*/
// TODO: This isn't required by the RDAP Technical Implementation Guide, and hence should be
// deleted, at least until it's actually required.
@Action(
service = GaeService.PUBAPI,
path = "/rdap/domains",
@@ -442,7 +441,7 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
replicaTm()
.transact(
() -> {
jakarta.persistence.Query query =
Query query =
replicaTm()
.getEntityManager()
.createNativeQuery(queryBuilder.toString())

View File

@@ -37,14 +37,12 @@ import jakarta.inject.Inject;
import java.util.Optional;
/**
* RDAP (new WHOIS) action for entity (contact and registrar) requests. the ICANN operational
* profile dictates that the "handle" for registrars is to be the IANA registrar ID:
* RDAP action for entity (contact and registrar) requests. the ICANN operational profile dictates
* that the "handle" for registrars is to be the IANA registrar ID:
*
* <p>2.8.3. Registries MUST support lookup for entities with the registrar role within other
* objects using the handle (as described in 3.1.5 of RFC 9082). The handle of the entity with the
* registrar role MUST be equal to IANA Registrar ID. The entity with the registrar role in the RDAP
* response MUST contain a publicIDs member to identify the IANA Registrar ID from the IANAs
* Registrar ID registry. The type value of the publicID object MUST be equal to IANA Registrar ID.
* <p>2.4.1.Registry RDAP servers MUST support Registrar object lookup using an entity path request
* for entities with the registrar role using the handle (as described in 3.1.5 of RFC9082) where
* the handle of the entity with the registrar role is be [sic] equal to the IANA Registrar ID.
*/
@Action(
service = GaeService.PUBAPI,
@@ -104,7 +102,7 @@ public class RdapEntityAction extends RdapActionBase {
// query, it MUST reply with 404 response code.
//
// Note we don't do RFC7480 5.3 - returning a different code if we wish to say "this info
// exists but we don't want to show it to you", because we DON'T wish to say that.
// exists, but we don't want to show it to you", because we DON'T wish to say that.
throw new NotFoundException(pathSearchString + " not found");
}
}

View File

@@ -49,9 +49,9 @@ import java.util.List;
import java.util.Optional;
/**
* RDAP (new WHOIS) action for entity (contact and registrar) search requests.
* RDAP action for entity (contact and registrar) search requests.
*
* <p>All commands and responses conform to the RDAP spec as defined in RFCs 7480 through 7485.
* <p>All commands and responses conform to the RDAP spec as defined in STD 95 and its RFCs.
*
* <p>The RDAP specification lumps contacts and registrars together and calls them "entities", which
* is confusing for us, because "entity" means something else in SQL. But here, when we use the
@@ -76,8 +76,6 @@ import java.util.Optional;
* @see <a href="http://tools.ietf.org/html/rfc9083">RFC 9083: JSON Responses for the Registration
* Data Access Protocol (RDAP)</a>
*/
// TODO: This isn't required by the RDAP Technical Implementation Guide, and hence should be
// deleted, at least until it's actually required.
@Action(
service = GaeService.PUBAPI,
path = "/rdap/entities",

View File

@@ -28,7 +28,7 @@ import google.registry.request.auth.Auth;
import jakarta.inject.Inject;
import java.util.Optional;
/** RDAP (new WHOIS) action for help requests. */
/** RDAP action for help requests. */
@Action(
service = GaeService.PUBAPI,
path = RdapHelpAction.PATH,

View File

@@ -22,26 +22,18 @@ import google.registry.rdap.RdapDataStructures.Remark;
/**
* This file contains boilerplate required by the ICANN RDAP Profile.
*
* @see <a href="https://www.icann.org/resources/pages/rdap-operational-profile-2016-07-26-en">RDAP
* Operational Profile for gTLD Registries and Registrars</a>
* @see <a
* href="https://itp.cdn.icann.org/en/files/registry-operators/rdap-response-profile-21feb24-en.pdf">
* RDAP Response Profile</a>
*/
public class RdapIcannStandardInformation {
/** Required by ICANN RDAP Profile section 1.4.10. */
private static final Notice CONFORMANCE_NOTICE =
Notice.builder()
.setDescription(
"This response conforms to the RDAP Operational Profile for gTLD Registries and"
+ " Registrars version 1.0")
.build();
/** Required by ICANN RDAP Profile section 1.5.18. */
/** Required by RDAP Response Profile section 2.6.3. */
private static final Notice DOMAIN_STATUS_CODES_NOTICE =
Notice.builder()
.setTitle("Status Codes")
.setDescription(
"For more information on domain status codes, please visit"
+ " https://icann.org/epp")
"For more information on domain status codes, please visit https://icann.org/epp")
.addLink(
Link.builder()
.setRel("glossary")
@@ -50,7 +42,7 @@ public class RdapIcannStandardInformation {
.build())
.build();
/** Required by ICANN RDAP Response Profile section 2.11. */
/** Required by RDAP Response Profile section 2.10. */
private static final Notice INACCURACY_COMPLAINT_FORM_NOTICE =
Notice.builder()
.setTitle("RDDS Inaccuracy Complaint Form")
@@ -79,28 +71,16 @@ public class RdapIcannStandardInformation {
/** Boilerplate notices required by domain responses. */
static final ImmutableList<Notice> DOMAIN_BOILERPLATE_NOTICES =
ImmutableList.of(
CONFORMANCE_NOTICE,
// RDAP Response Profile 2.6.3
DOMAIN_STATUS_CODES_NOTICE,
// RDAP Response Profile 2.11
// RDAP Response Profile 2.10
INACCURACY_COMPLAINT_FORM_NOTICE);
/** Boilerplate notice for when a domain is blocked by BSA. */
static final ImmutableList<Notice> DOMAIN_BLOCKED_BY_BSA_BOILERPLATE_NOTICES =
ImmutableList.of(DOMAIN_BLOCKED_BY_BSA_NOTICE);
/** Boilerplate remarks required by nameserver and entity responses. */
static final ImmutableList<Notice> NAMESERVER_AND_ENTITY_BOILERPLATE_NOTICES =
ImmutableList.of(CONFORMANCE_NOTICE);
/**
* Required by ICANN RDAP Profile section 1.4.9, as corrected by Gustavo Lozano of ICANN.
*
* <p>Also mentioned in the RDAP Technical Implementation Guide 3.6.
*
* @see <a href="http://mm.icann.org/pipermail/gtld-tech/2016-October/000822.html">Questions about
* the ICANN RDAP Profile</a>
*/
/** Required by the RDAP Technical Implementation Guide 3.6. */
static final Remark SUMMARY_DATA_REMARK =
Remark.builder()
.setTitle("Incomplete Data")
@@ -109,14 +89,7 @@ public class RdapIcannStandardInformation {
.setType(Remark.Type.OBJECT_TRUNCATED_UNEXPLAINABLE)
.build();
/**
* Required by ICANN RDAP Profile section 1.4.8, as corrected by Gustavo Lozano of ICANN.
*
* <p>Also mentioned in the RDAP Technical Implementation Guide 3.5.
*
* @see <a href="http://mm.icann.org/pipermail/gtld-tech/2016-October/000822.html">Questions about
* the ICANN RDAP Profile</a>
*/
/** Required by the RDAP Technical Implementation Guide 3.5. */
static final Notice TRUNCATED_RESULT_SET_NOTICE =
Notice.builder()
.setTitle("Search Policy")
@@ -148,7 +121,9 @@ public class RdapIcannStandardInformation {
/**
* Included when requester is not logged in as the owner of the contact being returned.
*
* <p>Format required by ICANN RDAP Response Profile 15feb19 section 2.7.4.3.
* <p>>Note: if we were keeping this around, we'd want/need to implement the <a
* href="https://datatracker.ietf.org/doc/rfc9537/">official RDAP redaction spec</a> for contacts.
* We are getting rid of contacts in 2025 though so this should be unnecessary.
*/
static final Remark CONTACT_PERSONAL_DATA_HIDDEN_DATA_REMARK =
Remark.builder()
@@ -169,10 +144,9 @@ public class RdapIcannStandardInformation {
/**
* Included in ALL contact responses, even if the user is authorized.
*
* <p>Format required by ICANN RDAP Response Profile 15feb19 section 2.7.5.3.
*
* <p>NOTE that unlike other redacted fields, there's no allowance to give the email to authorized
* users or allow for registrar consent.
* <p>>Note: if we were keeping this around, we'd want/need to implement the <a
* href="https://datatracker.ietf.org/doc/rfc9537/">official RDAP redaction spec</a> for contacts.
* We are getting rid of contacts in 2025 though so this should be unnecessary.
*/
static final Remark CONTACT_EMAIL_REDACTED_FOR_DOMAIN =
Remark.builder()

View File

@@ -26,7 +26,7 @@ import google.registry.request.auth.Auth;
import jakarta.inject.Inject;
/**
* RDAP (new WHOIS) action for RDAP IP address requests.
* RDAP action for RDAP IP address requests.
*
* <p>This feature is not implemented because it's only necessary for <i>address</i> registries like
* ARIN, not domain registries.

View File

@@ -221,7 +221,7 @@ public class RdapJsonFormatter {
* Map of EPP event values to the RDAP equivalents.
*
* <p>Only has entries for optional events, either stated as optional in the RDAP Response Profile
* 15feb19, or not mentioned at all but thought to be useful anyway.
* section 2.3.2, or not mentioned at all but thought to be useful anyway.
*
* <p>Any required event should be added elsewhere, preferably without using HistoryEntries (so
* that we don't need to load HistoryEntries for "summary" responses).
@@ -292,8 +292,8 @@ public class RdapJsonFormatter {
* Creates a JSON object for a {@link Domain}.
*
* <p>NOTE that domain searches aren't in the spec yet - they're in the RFC 9082 that describes
* the query format, but they aren't in the RDAP Technical Implementation Guide 15feb19, meaning
* we don't have to implement them yet and the RDAP Response Profile doesn't apply to them.
* the query format, but they aren't in the RDAP Technical Implementation Guide, meaning we don't
* have to implement them yet and the RDAP Response Profile doesn't apply to them.
*
* <p>We're implementing domain searches anyway, BUT we won't have the response for searches
* conform to the RDAP Response Profile.
@@ -307,9 +307,9 @@ public class RdapJsonFormatter {
if (outputDataType != OutputDataType.FULL) {
builder.remarksBuilder().add(RdapIcannStandardInformation.SUMMARY_DATA_REMARK);
}
// RDAP Response Profile 15feb19 section 2.1 discusses the domain name.
// RDAP Response Profile section 2.1 discusses the domain name.
builder.setLdhName(domain.getDomainName());
// RDAP Response Profile 15feb19 section 2.2:
// RDAP Response Profile section 2.2:
// The domain handle MUST be the ROID
builder.setHandle(domain.getRepoId());
// If this is a summary (search result) - we'll return now. Since there's no requirement for
@@ -317,9 +317,9 @@ public class RdapJsonFormatter {
if (outputDataType == OutputDataType.SUMMARY) {
return builder.build();
}
// RDAP Response Profile 15feb19 section 2.3.1:
// RDAP Response Profile section 2.3.1:
// The domain object in the RDAP response MUST contain the following events:
// [registration, expiration, last update of RDAP database]
// [registration, expiration]
builder
.eventsBuilder()
.add(
@@ -333,14 +333,18 @@ public class RdapJsonFormatter {
.setEventAction(EventAction.EXPIRATION)
.setEventDate(domain.getRegistrationExpirationTime())
.build(),
// RDAP response profile section 1.5:
// The topmost object in the RDAP response MUST contain an event of "eventAction" type
// "last update of RDAP database" with a value equal to the timestamp when the RDAP
// database was last updated
Event.builder()
.setEventAction(EventAction.LAST_UPDATE_OF_RDAP_DATABASE)
.setEventDate(getRequestTime())
.build());
// RDAP Response Profile 15feb19 section 2.3.2 discusses optional events. We add some of those
// RDAP Response Profile section 2.3.2 discusses optional events. We add some of those
// here. We also add a few others we find interesting.
builder.eventsBuilder().addAll(makeOptionalEvents(domain));
// RDAP Response Profile 15feb19 section 2.4.1:
// RDAP Response Profile section 2.4.1:
// The domain object in the RDAP response MUST contain an entity with the Registrar role.
//
// See {@link createRdapRegistrarEntity} for details of section 2.4 conformance
@@ -378,8 +382,6 @@ public class RdapJsonFormatter {
// RDAP Response Profile 2.6.3, must have a notice about statuses. That is in {@link
// RdapIcannStandardInformation#domainBoilerplateNotices}
// Kick off the database loads of the nameservers that we will need, so it can load
// asynchronously while we load and process the contacts.
ImmutableSet<Host> loadedHosts =
replicaTm()
.transact(
@@ -424,12 +426,12 @@ public class RdapJsonFormatter {
}
// Add the nameservers to the data; the load was kicked off above for efficiency.
// RDAP Response Profile 2.9: we MUST have the nameservers
// RDAP Response Profile 2.8: we MUST have the nameservers
for (Host host : HOST_RESOURCE_ORDERING.immutableSortedCopy(loadedHosts)) {
builder.nameserversBuilder().add(createRdapNameserver(host, OutputDataType.INTERNAL));
}
// RDAP Response Profile 2.10 - MUST contain a secureDns member including at least a
// RDAP Response Profile 2.9 - MUST contain a secureDns member including at least a
// delegationSigned element. Other elements (e.g. dsData) MUST be included if the domain name is
// signed and the elements are stored in the Registry
//
@@ -454,13 +456,13 @@ public class RdapJsonFormatter {
builder.remarksBuilder().add(RdapIcannStandardInformation.SUMMARY_DATA_REMARK);
}
// We need the ldhName: RDAP Response Profile 2.9.1, 4.1
// We need the ldhName: RDAP Response Profile 2.8.1, 4.1
builder.setLdhName(host.getHostName());
// Handle is optional, but if given it MUST be the ROID.
// We will set it always as it's important as a "self link"
builder.setHandle(host.getRepoId());
// Status is optional for internal Nameservers - RDAP Response Profile 2.9.2
// Status is optional for internal Nameservers - RDAP Response Profile 2.8.2
// It isn't mentioned at all anywhere else. So we can just not put it at all?
//
// To be safe, we'll put it on the "FULL" version anyway
@@ -492,7 +494,7 @@ public class RdapJsonFormatter {
// For query responses - we MUST have all the ip addresses: RDAP Response Profile 4.2.
//
// However, it is optional for internal responses: RDAP Response Profile 2.9.2
// However, it is optional for internal responses: RDAP Response Profile 2.8.2
if (outputDataType != OutputDataType.INTERNAL) {
for (InetAddress inetAddress : host.getInetAddresses()) {
if (inetAddress instanceof Inet4Address) {
@@ -510,7 +512,7 @@ public class RdapJsonFormatter {
builder.entitiesBuilder().add(createRdapRegistrarEntity(registrar, OutputDataType.INTERNAL));
}
if (outputDataType != OutputDataType.INTERNAL) {
// Rdap Response Profile 4.4, must have "last update of RDAP database" response. But this is
// Rdap Response Profile 1.5, must have "last update of RDAP database" response. But this is
// only for direct query responses and not for internal objects.
builder.setLastUpdateOfRdapDatabaseEvent(
Event.builder()
@@ -535,10 +537,7 @@ public class RdapJsonFormatter {
Contact contact, Iterable<RdapEntity.Role> roles, OutputDataType outputDataType) {
RdapContactEntity.Builder contactBuilder = RdapContactEntity.builder();
// RDAP Response Profile 2.7.1, 2.7.3 - we MUST have the contacts. 2.7.4 discusses censoring of
// fields we don't want to show (as opposed to not having contacts at all) because of GDPR etc.
//
// 2.8 allows for unredacted output for authorized people.
// RDAP Response Profile 2.7.1, 2.7.3 - we MUST have the contacts
boolean isAuthorized =
rdapAuthorization.isAuthorizedForRegistrar(contact.getCurrentSponsorRegistrarId());
@@ -578,7 +577,7 @@ public class RdapJsonFormatter {
.add(RdapIcannStandardInformation.CONTACT_EMAIL_REDACTED_FOR_DOMAIN);
if (outputDataType != OutputDataType.INTERNAL) {
// Rdap Response Profile 2.7.6 must have "last update of RDAP database" response. But this is
// Rdap Response Profile 1.5 must have "last update of RDAP database" response. But this is
// only for direct query responses and not for internal objects. I'm not sure why it's in that
// section at all...
contactBuilder.setLastUpdateOfRdapDatabaseEvent(
@@ -656,8 +655,8 @@ public class RdapJsonFormatter {
* Creates a JSON object for a {@link Registrar}.
*
* <p>This object can be INTERNAL to the Domain and Nameserver responses, with requirements
* discussed in the RDAP Response Profile 15feb19 sections 2.4 (internal to Domain) and 4.3
* (internal to Namesever)
* discussed in the RDAP Response Profile sections 2.4 (internal to Domain) and 4.3 (internal to
* Namesever)
*
* @param registrar the registrar object from which the RDAP response
* @param outputDataType whether to generate FULL, SUMMARY, or INTERNAL data.
@@ -755,7 +754,6 @@ public class RdapJsonFormatter {
//
// Write the minimum, meaning only ABUSE for INTERNAL registrars, nothing for SUMMARY and
// everything for FULL.
//
if (outputDataType != OutputDataType.SUMMARY) {
ImmutableList<RdapContactEntity> registrarContacts =
registrar.getContactsFromReplica().stream()
@@ -776,7 +774,7 @@ public class RdapJsonFormatter {
builder.entitiesBuilder().addAll(registrarContacts);
}
// Rdap Response Profile 3.3, must have "last update of RDAP database" response. But this is
// Rdap Response Profile 1.5, must have "last update of RDAP database" response. But this is
// only for direct query responses and not for internal objects.
if (outputDataType != OutputDataType.INTERNAL) {
builder.setLastUpdateOfRdapDatabaseEvent(
@@ -934,8 +932,8 @@ public class RdapJsonFormatter {
* Creates the list of optional events to list in domain, nameserver, or contact replies.
*
* <p>Only has entries for optional events that won't be shown in "SUMMARY" versions of these
* objects. These are either stated as optional in the RDAP Response Profile 15feb19, or not
* mentioned at all but thought to be useful anyway.
* objects. These are either stated as optional in the RDAP Response Profile, or not mentioned at
* all but thought to be useful anyway.
*
* <p>Any required event should be added elsewhere, preferably without using HistoryEntries (so
* that we don't need to load HistoryEntries for "summary" responses).
@@ -974,7 +972,7 @@ public class RdapJsonFormatter {
lastChangeTime = modificationTime;
}
}
// RDAP Response Profile 15feb19 section 2.3.2.2:
// RDAP Response Profile section 2.3.2.2:
// The event of eventAction type last changed MUST be omitted if the domain name has not been
// updated since it was created
if (lastChangeTime.isAfter(creationTime)) {
@@ -991,7 +989,7 @@ public class RdapJsonFormatter {
/**
* Creates a vCard address entry: array of strings specifying the components of the address.
*
* <p>Rdap Response Profile 3.1.1: MUST contain the following fields: Street, City, Country Rdap
* <p>RDAP Response Profile 3.1.1: MUST contain the following fields: Street, City, Country Rdap
* Response Profile 3.1.2: optional fields: State/Province, Postal Code, Fax Number
*
* @see <a href="https://tools.ietf.org/html/rfc7095">RFC 7095: jCard: The JSON Format for

View File

@@ -33,7 +33,7 @@ import google.registry.request.auth.Auth;
import jakarta.inject.Inject;
import java.util.Optional;
/** RDAP (new WHOIS) action for nameserver requests. */
/** RDAP action for nameserver requests. */
@Action(
service = GaeService.PUBAPI,
path = "/rdap/nameserver/",
@@ -48,7 +48,7 @@ public class RdapNameserverAction extends RdapActionBase {
@Override
public RdapNameserver getJsonObjectForResource(String pathSearchString, boolean isHeadRequest) {
// RDAP Technical Implementation Guide 2.2.1 - we must support A-label (Punycode) and U-label
// RDAP Technical Implementation Guide 2.1.1 - we must support A-label (Punycode) and U-label
// (Unicode) formats. canonicalizeName will transform Unicode to Punycode so we support both.
pathSearchString = canonicalizeName(pathSearchString);
// The RDAP syntax is /rdap/nameserver/ns1.mydomain.com.

View File

@@ -47,9 +47,9 @@ import java.util.List;
import java.util.Optional;
/**
* RDAP (new WHOIS) action for nameserver search requests.
* RDAP action for nameserver search requests.
*
* <p>All commands and responses conform to the RDAP spec as defined in RFCs 7480 through 7485.
* <p>All commands and responses conform to the RDAP spec as defined in STD 95 and its RFCs.
*
* @see <a href="http://tools.ietf.org/html/rfc9082">RFC 9082: Registration Data Access Protocol
* (RDAP) Query Format</a>

View File

@@ -45,11 +45,7 @@ import java.util.Optional;
/** Object Classes defined in RFC 9083 section 5. */
final class RdapObjectClasses {
/**
* Temporary implementation of VCards.
*
* <p>Will create a better implementation soon.
*/
/** Rough implementation of VCards. */
@RestrictJsonNames({})
@AutoValue
public abstract static class Vcard implements Jsonable {
@@ -140,8 +136,8 @@ final class RdapObjectClasses {
public enum BoilerplateType {
DOMAIN(RdapIcannStandardInformation.DOMAIN_BOILERPLATE_NOTICES),
DOMAIN_BLOCKED_BY_BSA(RdapIcannStandardInformation.DOMAIN_BLOCKED_BY_BSA_BOILERPLATE_NOTICES),
NAMESERVER(RdapIcannStandardInformation.NAMESERVER_AND_ENTITY_BOILERPLATE_NOTICES),
ENTITY(RdapIcannStandardInformation.NAMESERVER_AND_ENTITY_BOILERPLATE_NOTICES),
NAMESERVER(ImmutableList.of()),
ENTITY(ImmutableList.of()),
OTHER(ImmutableList.of());
@SuppressWarnings("ImmutableEnumChecker") // immutable lists are, in fact, immutable
@@ -173,8 +169,8 @@ final class RdapObjectClasses {
* The Top Level JSON reply, Adds the required top-level boilerplate to a ReplyPayloadBase.
*
* <p>RFC 9083 specifies that the top-level object should include an entry indicating the
* conformance level. ICANN RDAP spec for 15feb19 mandates several additional entries, in sections
* 2.6.3, 2.11 of the Response Profile and 3.3, 3.5, of the Technical Implementation Guide.
* conformance level. The RDAP spec mandates several additional entries, in sections 2.6.3, 2.10
* of the Response Profile and 3.3, 3.5, of the Technical Implementation Guide.
*/
@AutoValue
@RestrictJsonNames({})
@@ -353,7 +349,7 @@ final class RdapObjectClasses {
*
* <p>Takes care of the name and unicode field.
*
* <p>See RDAP Response Profile 15feb19 sections 2.1 and 4.1.
* <p>See RDAP Response Profile sections 2.1 and 4.1.
*
* <p>Note the ldhName field is only required for non-IDN names or IDN names when the query was an
* A-label. It is optional for IDN names when the query was a U-label. Because we don't want to
@@ -471,7 +467,7 @@ final class RdapObjectClasses {
}
/**
* an integer representing the signature lifetime in seconds to be used when creating the RRSIG
* An integer representing the signature lifetime in seconds to be used when creating the RRSIG
* DS record in the parent zone [RFC5910].
*
* <p>Note that although it isn't given as optional in RFC 9083, in RFC5910 it's mentioned as

View File

@@ -44,7 +44,7 @@ import java.util.Objects;
import java.util.Optional;
/**
* Base RDAP (new WHOIS) action for domain, nameserver and entity search requests.
* Base RDAP action for domain, nameserver and entity search requests.
*
* @see <a href="https://tools.ietf.org/html/rfc9082">RFC 9082: Registration Data Access Protocol
* (RDAP) Query Format</a>
@@ -155,7 +155,6 @@ public abstract class RdapSearchActionBase extends RdapActionBase {
*/
<T extends EppResource> RdapResultSet<T> getMatchingResources(
CriteriaQueryBuilder<T> builder, boolean checkForVisibility, int querySizeLimit) {
replicaTm().assertInTransaction();
Optional<String> desiredRegistrar = getDesiredRegistrar();
if (desiredRegistrar.isPresent()) {
builder =

View File

@@ -39,8 +39,8 @@ public final class RdapSearchPattern {
/**
* Pattern for allowed LDH searches.
*
* <p>Based on RFC 9082 4.1. Must contains only alphanumeric plus dots and hyphens. A single
* whildcard asterix is allowed - but if exists must be the last character of a domain name label
* <p>Based on RFC 9082 4.1. Must contain only alphanumeric plus dots and hyphens. A single
* wildcard asterix is allowed - but if exists must be the last character of a domain name label
* (so exam* and exam*.com are allowed, but exam*le.com isn't allowd)
*
* <p>The prefix is in group(1), and the suffix without the dot (if it exists) is in group(4). If
@@ -123,7 +123,7 @@ public final class RdapSearchPattern {
* Creates a SearchPattern using the provided domain search pattern in LDH format.
*
* <p>The domain search pattern can have a single wildcard asterix that can match 0 or more
* charecters. If such an asterix exists - it must be at the end of a domain label.
* characters. If such an asterix exists - it must be at the end of a domain label.
*
* @param searchQuery the string containing the partial match pattern
* @throws UnprocessableEntityException if {@code pattern} does not meet the requirements of RFC
@@ -150,7 +150,7 @@ public final class RdapSearchPattern {
* Creates a SearchPattern using the provided domain search pattern in LDH or Unicode format.
*
* <p>The domain search pattern can have a single wildcard asterix that can match 0 or more
* charecters. If such an asterix exists - it must be at the end of a domain label.
* characters. If such an asterix exists - it must be at the end of a domain label.
*
* <p>In theory, according to RFC 9082 4.1 - we should make some checks about partial matching in
* unicode queries. We don't, but we might want to just disable partial matches for unicode inputs

View File

@@ -37,7 +37,7 @@ public final class RdapUtils {
*
* <p>Used for RDAP Technical Implementation Guide 2.4.2 - search of registrar by the fn element.
*
* <p>For convenience, we use case insensitive search.
* <p>For convenience, we use case-insensitive search.
*/
static Optional<Registrar> getRegistrarByName(String registrarName) {
return Streams.stream(Registrar.loadAllCached())

View File

@@ -205,16 +205,6 @@ have failed to comply with these terms.",
}
JsonArray notices = jsonObject.getAsJsonArray("notices");
notices.add(createTosNotice());
notices.add(
JsonParser.parseString(
"""
{
"description": [
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars \
version 1.0"
]
}
"""));
return jsonObject;
}

View File

@@ -43,12 +43,13 @@ final class RdapDataStructuresTest {
@Test
void testRdapConformance() {
assertThat(RdapConformance.INSTANCE.toJson())
.isEqualTo(createJson(
"[",
" 'rdap_level_0',",
" 'icann_rdap_response_profile_0',",
" 'icann_rdap_technical_implementation_guide_0'",
"]"));
.isEqualTo(
createJson(
"[",
" 'rdap_level_0',",
" 'icann_rdap_response_profile_1',",
" 'icann_rdap_technical_implementation_guide_1'",
"]"));
}
@Test

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "entity",
"handle": "%CONTACT_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName" : "entity",
"handle" : "",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName" : "entity",
"handle" : "%CONTACT_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName" : "entity",
"handle" : "%CONTACT_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName" : "entity",
"handle" : "",

View File

@@ -4,8 +4,8 @@
"handle": "%DOMAIN_HANDLE_1%",
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"status": [
"client delete prohibited",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"entities": [

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"entities": [

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"handle": "%DOMAIN_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"ldhName": "%DOMAIN_PUNYCODE_NAME_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"entities": [

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"handle": "%DOMAIN_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"handle": "%DOMAIN_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"entities": [

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"handle": "%DOMAIN_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"entities": [

View File

@@ -5,8 +5,8 @@
"handle": "%DOMAIN_HANDLE_1%",
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"status": [
"client delete prohibited",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "domain",
"handle": "%DOMAIN_HANDLE_1%",

View File

@@ -83,8 +83,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -140,12 +140,6 @@
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"title" : "Status Codes",
"description" :

View File

@@ -84,8 +84,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -120,12 +120,6 @@
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"title" : "Status Codes",
"description" :

View File

@@ -84,8 +84,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -141,12 +141,6 @@
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"title" : "Status Codes",
"description" :

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"domainSearchResults": [
{
@@ -82,9 +82,6 @@
}
]
},
{
"description": ["This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"]
},
{
"title": "Status Codes",
"description": ["For more information on domain status codes, please visit https://icann.org/epp"],

View File

@@ -7,8 +7,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices": [
{

View File

@@ -1,8 +1,8 @@
{
"rdapConformance" : [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[

View File

@@ -1,8 +1,8 @@
{
"rdapConformance" : [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "nameserver",
"handle": "%NAMESERVER_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"status": [
"active"

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "nameserver",
"handle": "%NAMESERVER_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName": "nameserver",
"handle": "%NAMESERVER_HANDLE_1%",

View File

@@ -112,12 +112,6 @@
],
"title":"RDAP Terms of Service"
},
{
"description":
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"description":
[
@@ -150,7 +144,7 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
]
}

View File

@@ -82,11 +82,6 @@
}
]
},
{
"description":[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"title":"Status Codes",
"description":[
@@ -116,7 +111,7 @@
],
"rdapConformance":[
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
]
}

View File

@@ -101,8 +101,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -134,12 +134,6 @@
"type": "text/html"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -118,8 +118,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -153,12 +153,6 @@
"value": "https://example.tld/rdap/entities"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -71,8 +71,8 @@
],
"rdapConformance" : [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -106,12 +106,6 @@
"value": "https://example.tld/rdap/nameservers"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -232,8 +232,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -267,12 +267,6 @@
"value": "https://example.tld/rdap/entities"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -91,8 +91,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -127,12 +127,6 @@
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"title" : "Status Codes",
"description" :

View File

@@ -136,8 +136,8 @@
],
"rdapConformance" : [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -171,12 +171,6 @@
"value": "https://example.tld/rdap/nameservers"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -260,8 +260,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices":
[
@@ -295,12 +295,6 @@
"value": "https://example.tld/rdap/entities"
}
]
},
{
"description":
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName" : "entity",
"handle" : "%REGISTRAR_HANDLE_1%",

View File

@@ -1,8 +1,8 @@
{
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"objectClassName" : "entity",
"handle" : "%REGISTRAR_HANDLE_1%",

View File

@@ -232,8 +232,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices":
[
@@ -288,12 +288,6 @@
"value": "https://example.tld/rdap/entities"
}
]
},
{
"description":
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -136,8 +136,8 @@
],
"rdapConformance" : [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -192,12 +192,6 @@
"value": "https://example.tld/rdap/nameservers"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -239,8 +239,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -295,12 +295,6 @@
"value": "https://example.tld/rdap/entities"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -260,8 +260,8 @@
],
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[
@@ -316,12 +316,6 @@
"value": "https://example.tld/rdap/entities"
}
]
},
{
"description" :
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
}
]
}

View File

@@ -1 +1 @@
{"key":"value","rdapConformance":["rdap_level_0","icann_rdap_response_profile_0","icann_rdap_technical_implementation_guide_0"],"notices":[{"title":"RDAP Terms of Service","links":[{"href":"https:\/\/www.example.tld\/about\/rdap\/tos.html","rel":"alternate","type":"text\/html","value":"http:\/\/myserver.example.com\/help\/tos"}],"description":["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."]}]}
{"key":"value","rdapConformance":["rdap_level_0","icann_rdap_response_profile_1","icann_rdap_technical_implementation_guide_1"],"notices":[{"title":"RDAP Terms of Service","links":[{"href":"https:\/\/www.example.tld\/about\/rdap\/tos.html","rel":"alternate","type":"text\/html","value":"http:\/\/myserver.example.com\/help\/tos"}],"description":["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."]}]}

View File

@@ -2,8 +2,8 @@
"key" : "value",
"rdapConformance" : [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices" :
[

View File

@@ -2,8 +2,8 @@
"key": "value",
"rdapConformance": [
"rdap_level_0",
"icann_rdap_response_profile_0",
"icann_rdap_technical_implementation_guide_0"
"icann_rdap_response_profile_1",
"icann_rdap_technical_implementation_guide_1"
],
"notices":
[
@@ -36,12 +36,6 @@
}
]
},
{
"description":
[
"This response conforms to the RDAP Operational Profile for gTLD Registries and Registrars version 1.0"
]
},
{
"title": "Status Codes",
"description":