// Copyright 2017 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.rdap; import com.google.common.collect.ImmutableList; import google.registry.rdap.RdapDataStructures.Link; import google.registry.rdap.RdapDataStructures.Notice; import google.registry.rdap.RdapDataStructures.Remark; /** * This file contains boilerplate required by the ICANN RDAP Profile. * * @see RDAP * Operational Profile for gTLD Registries and Registrars */ 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. */ 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") .addLink( Link.builder() .setValue("https://icann.org/epp") .setRel("alternate") .setHref("https://icann.org/epp") .setType("text/html") .build()) .build(); /** Required by ICANN RDAP Response Profile section 2.11. */ private static final Notice INACCURACY_COMPLAINT_FORM_NOTICE = Notice.builder() .setTitle("RDDS Inaccuracy Complaint Form") .setDescription( "URL of the ICANN RDDS Inaccuracy Complaint Form: https://www.icann.org/wicf") .addLink( Link.builder() .setValue("https://www.icann.org/wicf") .setRel("alternate") .setHref("https://www.icann.org/wicf") .setType("text/html") .build()) .build(); /** Boilerplate notices required by domain responses. */ static final ImmutableList domainBoilerplateNotices = ImmutableList.of( CONFORMANCE_NOTICE, // RDAP Response Profile 2.6.3 DOMAIN_STATUS_CODES_NOTICE, // RDAP Response Profile 2.11 INACCURACY_COMPLAINT_FORM_NOTICE); /** Boilerplate remarks required by nameserver and entity responses. */ static final ImmutableList nameserverAndEntityBoilerplateNotices = ImmutableList.of(CONFORMANCE_NOTICE); /** * Required by ICANN RDAP Profile section 1.4.9, as corrected by Gustavo Lozano of ICANN. * * Also mentioned in the RDAP Technical Implementation Guide 3.6. * * @see Questions about * the ICANN RDAP Profile */ static final Remark SUMMARY_DATA_REMARK = Remark.builder() .setTitle("Incomplete Data") .setDescription( "Summary data only. For complete data, send a specific query for the object.") .setType(Remark.Type.OBJECT_TRUNCATED_UNEXPLAINABLE) .build(); /** * Required by ICANN RDAP Profile section 1.4.8, as corrected by Gustavo Lozano of ICANN. * * Also mentioned in the RDAP Technical Implementation Guide 3.5. * * @see Questions about * the ICANN RDAP Profile */ static final Notice TRUNCATED_RESULT_SET_NOTICE = Notice.builder() .setTitle("Search Policy") .setDescription("Search results per query are limited.") .setType(Notice.Type.RESULT_TRUNCATED_UNEXPLAINABLE) .build(); /** Truncation notice as a singleton list, for easy use. */ static final ImmutableList TRUNCATION_NOTICES = ImmutableList.of(TRUNCATED_RESULT_SET_NOTICE); /** * Used when a search for domains by nameserver may have returned incomplete information because * there were too many nameservers in the first stage results. */ static final Notice POSSIBLY_INCOMPLETE_RESULT_SET_NOTICE = Notice.builder() .setTitle("Search Policy") .setDescription( "Search results may contain incomplete information due to first-stage query" + " limits.") .setType(Notice.Type.RESULT_TRUNCATED_UNEXPLAINABLE) .build(); /** Possibly incomplete notice as a singleton list, for easy use. */ static final ImmutableList POSSIBLY_INCOMPLETE_NOTICES = ImmutableList.of(POSSIBLY_INCOMPLETE_RESULT_SET_NOTICE); /** * Included when requester is not logged in as the owner of the contact being returned. * *

Format required by ICANN RDAP Response Profile 15feb19 section 2.7.4.3. */ static final Remark CONTACT_PERSONAL_DATA_HIDDEN_DATA_REMARK = Remark.builder() .setTitle("REDACTED FOR PRIVACY") .setDescription( "Some of the data in this object has been removed.", "Contact personal data is visible only to the owning registrar.") .setType(Remark.Type.OBJECT_REDACTED_AUTHORIZATION) .addLink( Link.builder() .setValue( "https://github.com/google/nomulus/blob/master/docs/rdap.md#authentication") .setRel("alternate") .setHref( "https://github.com/google/nomulus/blob/master/docs/rdap.md#authentication") .setType("text/html") .build()) .build(); /** * String that replaces GDPR redacted values. * *

GTLD Registration Data Temp Spec 17may18, Appendix A, 2.2: Fields required to be "redacted" * MUST privide in the value section text similar to "REDACTED FOR PRIVACY" */ static final String CONTACT_REDACTED_VALUE = "REDACTED FOR PRIVACY"; /** * Included in ALL contact responses, even if the user is authorized. * *

Format required by ICANN RDAP Response Profile 15feb19 section 2.7.5.3. * *

NOTE that unlike other redacted fields, there's no allowance to give the email to authorized * users or allow for registrar consent. */ static final Remark CONTACT_EMAIL_REDACTED_FOR_DOMAIN = Remark.builder() .setTitle("EMAIL REDACTED FOR PRIVACY") .setDescription( "Please query the RDDS service of the Registrar of Record identifies in this output" + " for information on how to contact the Registrant of the queried domain" + " name.") .setType(Remark.Type.OBJECT_REDACTED_AUTHORIZATION) .build(); }