Internet-Draft | rdap-extensions | September 2024 |
Newton, et al. | Expires 3 April 2025 | [Page] |
This document describes and clarifies the usage of extensions in RDAP.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 3 April 2025.¶
Copyright (c) 2024 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
The Registration Data Access Protocol (RDAP) defines a uniform means to access data from Internet operations registries, specifically Domain Name Registries (DNRs), Regional Internet Registries (RIRs), and other registries serving Internet Number Resources (INRs). RDAP queries are defined in [RFC9082] and RDAP responses are defined in [RFC9083].¶
RDAP contains a means to define extensions for queries not found in [RFC9082] and responses not found in [RFC9083]. RDAP extensions are also described in [RFC7480]. This document describes the requirements for RDAP extension definition and use, clarifying ambiguities and defining additional semantics and options that were previously implicit.¶
This document updates [RFC7480], [RFC9082], and [RFC9083] in the following areas:¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in [BCP14] when, and only when, they appear in all capitals, as shown here.¶
Section 6 of [RFC7480] describes the identifier used to signify RDAP extensions and the IANA registry into which RDAP extensions are to be registered.¶
When in use in RDAP, extension identifiers are prepended to URL path segments, URL query parameters, and JSON object member names (herein further referred to as "JSON names"). They are also included in the "rdapConformance" member of each response that relies on the extension, so that clients can determine the extensions being used by the server for that response. The "/help" response returns an "rdapConformance" member containing the identifiers for all extensions used by the server.¶
The main purpose of the extension identifier is to act as a namespace, preventing collisions between elements from different extensions. Additionally, implementers and operators can use the extension identifiers to find extension definitions via an IANA registry.¶
While the RDAP extension mechanism was created to extend RDAP queries and/or responses, extensions can also be used to signal server policy (for example, specifying the conditions of use for existing response structures). Extensions that are primarily about signaling server policy are often called "profiles".¶
Some extensions exist to denote the usage of values placed into an IANA registry, such as the IANA RDAP registries, or the usage of extensions for specifications used in RDAP responses, such as extended vCard/jCard properties. Such extensions exist to "mark" these usages and are often called "marker" extensions.¶
For example, an extension may be used to signal desired processing of a "rel" attribute in a "links" array, where the "rel" value is registered in the Link Relations Registry (https://www.iana.org/assignments/link-relations/link-relations.xhtml):¶
{ "rdapConformance": [ "rdap_level_0", "lunarNIC" ], "objectClassName": "domain", "ldhName": "example.com", "links": [ { "value": "https://example.com/domain/example.com", "href": "https://example.com/sideways_href", "rel": "sideways", "type": "application/rdap+json" } ] }¶
When defining the usage of link relations, extensions should specify the media types expected to be used with those link relations.¶
Regardless of the category of the extension, its usage may also leverage the appearance of its identifier in the "rdapConformance" array. Clients may use the "/help" query as defined in [RFC9082] to discover the extensions in use by the server.¶
Extension specifications have customarily defined only one extension identifier. However, there is no explicit limit on the number of extension identifiers that may be defined in a single extension specification. The main reason for defining multiple identifiers is to reserve multiple namespaces in URLs or responses: see e.g. [I-D.ietf-regext-rdap-rir-search].¶
In brief, RDAP extension identifiers start with an alphabetic character and may contain alphanumeric characters and "_" (underscore) characters. This formulation was explicitly chosen to allow compatibility with variable names in programming languages and transliteration with XML.¶
RDAP extension identifiers have no explicit structure, and are opaque insofar as no inner-meaning can be "seen" in them.¶
RDAP extensions MUST NOT define an extension identifier that when prepended to an underscore character may collide with an existing extension identifier. For example, if there were a pre-existing identifier of "foo_bar", another extension could not define the identifier "foo". Likewise, if there were a pre-existing identifier of "foo_bar", another extension could not define the identifier "foo_bar_buzz". However, an extension could define "foo" if there were a pre-existing definition of "foobar", and vice versa.¶
For this reason, usage of an underscore character in RDAP extension identifiers is NOT RECOMMENDED. Implementers should be aware that many existing extension identifiers do contain underscore characters.¶
[RFC7480] does not explicitly state that extension identifiers are case-sensitive. This document updates the formulation in [RFC7480] to explicitly note that extension identifiers are case-sensitive, and extension identifiers MUST NOT be registered where a new identifier is a mixed-case version of an existing identifier. For example, if "lunarNIC" is already registered as an identifier, a new registration with "lunarNic" (note the lowercase if "ic" in "Nic") would not be allowed.¶
Section 5 of [RFC9082] describes the use of extension identifiers in formulating URLs to query RDAP servers. The extension identifiers are to be prepended to the path segments they use. For example, if an extension uses the identifier "foobar", then the path segments used in that extension are prepended with "foobar_". If the "foobar" extension defines paths "fizz" and "fazz", the URLs for this extension would be like so:¶
https://base.example/foobar_fizz https://base.example/foobar_fazz¶
While [RFC9082] describes the extension identifier as a prepended string to a path segment, it does not describe the usage of the extension identifier as a path segment which may have child path segments. This document updates [RFC9082] to allow the usage of extension identifiers as path segments which may have child path segments. For example, if the "foobar" extension defines the child paths "fizz" and "fazz", the URLs for this extension would be like so:¶
https://base.example/foobar/fizz https://base.example/foobar/fazz¶
Extensions defining new URL paths MUST explicitly define the expected responses for each new URL path. New URL paths may return existing object classes or search results as defined in [RFC9083], object classes or search results defined by the extension (see Section 2.4.3 and Section 2.4.4 below), or object classes or search results from other extensions.¶
Although [RFC9082] describes the use of URL query strings, it does not define their use with extensions. [RFC7480] instructs servers to ignore unknown query parameters. Therefore, the use of query parameters, whether prefixed with an extension identifier or not, is not supported by [RFC9082] and [RFC7480].¶
Despite this, there are several extensions that do specify query parameters. This document updates [RFC9082] with regard to the use of RDAP extension identifiers in URL query parameters.¶
When an RDAP extension defines query parameters to be used with a URL path that is not defined by that RDAP extension, those query parameter names SHOULD be constructed in the same manner as URL path segments (that is, extension identifier + '_' + parameter name). (See section Section 2.5 regarding when an extension identifier may be omitted.)¶
When an RDAP extension defines query parameters to be used with a URL path defined by that RDAP extension, prefixing of query parameters is not required. In this situation, the URL path operates as a namespace for the query parameters, so there is no risk of collision with parameters defined elsewhere.¶
See Section 4.1 and Section 4.2 for other guidance on the use of query parameters, and see Section 7 and Section 8 regarding constraints on the usage of query parameters.¶
Section 2 of [RFC9083] describes the use of extension identifiers in the JSON returned by RDAP servers. Just as in URLs, the extension identifier is prepended to JSON names to create a namespace so that the JSON name from one extension will not collide with the JSON name from another extension. Just as with unknown query parameters in URLs, clients are to ignore unknown JSON names.¶
The example given in [RFC9083] is as follows:¶
{ "handle": "ABC123", "lunarNIC_beforeOneSmallStep": "TRUE THAT!", "remarks": [ { "description": [ "She sells sea shells down by the sea shore.", "Originally written by Terry Sullivan." ] } ], "lunarNIC_harshMistressNotes": [ "In space,", "nobody can hear you scream." ] }¶
In this example, the extension identified by "lunarNIC" is prepended to the member names of both a JSON string and a JSON array.¶
As Section 4.1 of [RFC9083] requires the use of the "rdapConformance" data structure, and the "objectClassName" string is required of all object class instances, the complete example from above would be:¶
{ "rdapConformance": [ "rdap_level_0", "lunarNIC" ], "objectClassName": "domain", "handle": "ABC123", "ldhName": "example.com", "lunarNIC_beforeOneSmallStep": "TRUE THAT!", "remarks": [ { "description": [ "She sells sea shells down by the sea shore.", "Originally written by Terry Sullivan." ] } ], "lunarNIC_harshMistressNotes": [ "In space,", "nobody can hear you scream." ] }¶
Prefixing of the extension identifier is not required for children of a prefixed JSON object defined by an RDAP extension.¶
The following example shows this use with a JSON object:¶
{ "rdapConformance": [ "rdap_level_0", "lunarNIC" ], "objectClassName": "domain", "ldhName": "example.com", "remarks": [ { "description": [ "She sells sea shells down by the sea shore.", "Originally written by Terry Sullivan." ] } ], "lunarNIC_author": { "firstInitial": "R", "lastName": "Heinlein" } }¶
Here the JSON name "lunarNIC_author" will separate the JSON from other extensions that may have an "author" structure. But the JSON contained within "lunarNIC_author" need not be prepended, as collision is avoided by the use of "lunarNIC_author".¶
As described in [RFC9082] and Section 2.3, an extension may define new paths in URLs. If the extension describes the behavior of an RDAP query using that path to return an instance of a new class of RDAP object, the JSON names are not required to be prepended with the extension identifier as described in Section 2.4.2. However, the extension MUST define the value for the "objectClassName" string which is used by clients to evaluate the type of the response. To avoid collisions with object classes defined in other extensions, the value for the "objectClassName" MUST be prepended with the extension identifier, in the same way as for URL paths, query parameters, and JSON names:¶
{ "rdapConformance": [ "rdap_level_0", "lunarNIC" ], "objectClassName": "lunarNIC_author", "author": { "firstInitial": "R", "lastName": "Heinlein" } }¶
It is RECOMMENDED that object class names comprise lowercase ASCII characters, and that the "_" (underscore) character be used as a word separator. Though "objectClassName" is a string and [RFC9083] does define one object class name with a space separator (i.e. "ip network"), usage of the space character or any other character that requires URL-encoding is NOT RECOMMENDED. When object class names are also used in URLs, extensions MUST specify that the names are to be URL-encoded as defined in [RFC3986] if the object class names contain any characters requiring URL-encoding.¶
As described in [RFC9082] and Section 2.3, an extension may define new paths in URLs. If the extension describes the behavior of an RDAP query using the path to return a new RDAP search result, the JSON name of the search result MUST be prepended with the extension identifier (to avoid collision with search results defined in other extensions). If the search result contains object class instances defined by the extension, each instance MUST have an "objectClassName" string as defined in Section 2.4.3. For example:¶
{ "rdapConformance": [ "rdap_level_0", "lunarNIC" ], "lunarNIC_authorSearchResult": [ { "objectClassName": "lunarNIC_author", "author": { "firstInitial": "R", "lastName": "Heinlein" } }, { "objectClassName": "lunarNIC_author", "author": { "firstInitial": "J", "lastName": "Pournelle" } }, ] }¶
Some RDAP extensions define only one JSON value and do not prefix it with their RDAP extension identifier, instead using the extension identifier as the JSON name for that JSON value. That is, the extension identifier is used "bare" and not appended with an underscore character and subsequent names.¶
Consider the example in Section 2.4.2. Using the bare extension identifier pattern, that example could be written as:¶
{ "rdapConformance": [ "rdap_level_0", "lunarNIC" ], "objectClassName": "domain", "ldhName": "example.com", "remarks": [ { "description": [ "She sells sea shells down by the sea shore.", "Originally written by Terry Sullivan." ] } ], "lunarNIC": { "firstInitial": "R", "lastName": "Heinlein" } }¶
Usage of a bare extension identifier contravenes the guidance in [RFC9083]. This document updates [RFC9083] to explicitly allow this pattern.¶
Along similar lines, an extension may define a single new object class, and use the extension's identifier as the object class name.¶
Section 4.1 of [RFC9083] offers the following guidance on including extension identifiers in the "rdapConformance" member of an RDAP response:¶
A response to a "help" request will include identifiers for all of the specifications supported by the server. A response to any other request will include only identifiers for the specifications used in the construction of the response.¶
A strict interpretation of this wording where "construction of the response" refers to the JSON structure only would rule out the use of Section 2.1.1 extension identifiers, which are in common use in RDAP. This document updates the guidance. For responses to queries other than "/help", a response MUST include in the "rdapConformance" array only those extension identifiers necessary for a client to deserialize the JSON and understand the semantic meaning of the content within the JSON, and each extension identifier MUST be free from conflict with the other identifiers with respect to their syntax and semantics.¶
Note that this document does not update the guidance from Section 4.1 of [RFC9083] regarding "/help" responses and the "rdapConformance" array.¶
When a server implementation supports multiple extensions, it is RECOMMENDED that the server also support and return versioning information such as that defined by [I-D.gould-regext-rdap-versioning].¶
The styling convention used in [RFC9083] for JSON names is often called "camel casing", in reference to the hump of a camel. In this style, the first letter of every word, except the first word, composing a name is capitalized. This convention was adopted to visually separate the namespace from the name, with an underscore between them. Extension authors SHOULD use camel casing for JSON names defined in extensions.¶
Though all RDAP extensions are to be registered in the IANA RDAP Extensions Registry, there is an implicit two-class system of extensions that comes from the ownership of the RDAP specifications by the IETF: extensions created by the IETF and extensions not created by the IETF.¶
In the perspective of how extension identifiers are used as namespace separators, extensions created by the IETF are not required to use the extension identifier as a prefix in requests and responses, as the IETF can coordinate its own activities to avoid name collisions. In practice, most extensions owned by the IETF do use extension identifiers as prefixes in their requests and responses.¶
RDAP extensions not defined by the IETF MUST use the extension identifier as a prefix in accordance with this document, [RFC7480], [RFC9082], and [RFC9083]. RDAP extensions defined by the IETF SHOULD use the extension identifier as a prefix or as a bare extension identifier (see Section 2.4.5). IETF-defined RDAP extensions that do not follow this guidance MUST describe why it is not being followed.¶
[RFC7480] describes the use of redirects in RDAP. Redirects are prominent in the discovery of authoritative RIR servers, as the process outlined in [RFC9224], which uses IANA allocations, does not account for transfers of resources between RIRs. Section 4.3 of [RFC7480] instructs servers to ignore unknown query parameters. As it relates to issuing URLs for redirects, servers MUST NOT blindly copy query parameters from a request to a redirect URL as query parameters may contain sensitive information, such as security credentials, not relevant to the target server of the URL. Following the advice in [RFC7480], servers SHOULD only place query parameters in redirect URLs when it is known by the origin server (the server issuing the redirect) that the target server (the server referenced by the redirect) can process the query parameter and the contents of the query parameter are appropriate to be received by the target.¶
The following extensions have been registered with IANA, but do not comply with the requirements set out in the base specifications, as clarified by this document:¶
Extension identifier: fred¶
Extension identifier: artRecord¶
Extension identifier: platformNS¶
Extension identifier: regType¶
Client authors should be aware that responses that make use of these extensions may require special handling on the part of the client. Also, while these extensions will be retained in the registry, future extensions that are similarly non-compliant will not be registered.¶
To avoid any confusion with the operation of the existing entries, an extension registration that attempts to use one of the RDAP conformance values given in this section as an extension identifier (and so as an RDAP conformance value also) will be rejected.¶
[RFC7480] defines the RDAP Extensions Registry (https://www.iana.org/assignments/rdap-extensions/rdap-extensions.xhtml). This document does not change the RDAP Extensions Registry nor its purpose. However, this document does update the procedures to be used by its expert reviewers.¶
The RDAP Extensions Registry should have as a minimum three expert reviewers and ideally four or five. An expert reviewer assigned to the review of an RDAP extension registration must have another expert reviewer double-check any submitted registration.¶
Expert reviewers are to use the following criteria for extensions defined in this document, [RFC7480], [RFC9082], and [RFC9083]. The following is a summary checklist:¶
As noted in Section 2.2, any new registration that is a case variant of an existing registration MUST be rejected.¶
RDAP clients SHOULD match values in this registry using case-insensitive matching.¶
Extension authors are encouraged but not required to seek an informal review of their extension by sending a request for review to regext@ietf.org.¶
Section 10.2 of [RFC9083] defines the RDAP JSON Values Registry in IANA. This registry contains values to be used in the JSON values of RDAP responses. Registrations into this registry may occur in IETF-defined RDAP extensions or via requests to the IANA. Authors of RDAP extensions not defined by the IETF MAY register values in this registry via requests to the IANA.¶
This document does not change the RDAP JSON Values Registry nor its purpose. However, this document does update the procedures for registrations and the processes to be used by its expert reviewers.¶
In addition to the registration of values, RDAP extensions defined by the IETF and other IETF specifications MAY define additional value types (the "type" field). These specifications MUST describe the specific JSON field to be used for each new value type.¶
Section 10.2 of [RFC9083] defines the criteria for the values. Of these, criteria two states:¶
Values must be strings. They should be multiple words separated by single space characters. Every character should be lowercased. If possible, every word should be given in English and each character should be US-ASCII.¶
All registrations SHOULD meet these requirements. However, there may be scenarios in which it is more appropriate for the values to follow other requirements, such as for values also used in other specifications or documents. In all cases, it should be understood that additional registrations of RDAP JSON values occurring after the specification of the value's type in the registry may not be recognized by clients, and therefore either ignored or passed on to users without processing.¶
Designated experts MUST reject any registration that is a duplicate of an existing registration, and all registrations are to be considered case-insensitive. That is, any new registration that is a case variant of an existing registration should be rejected.¶
RDAP clients SHOULD match values in this registry using case-insensitive matching.¶
Definitions of new types (see above) MAY additionally constrain the format of values for those new types beyond the specification of this document and [RFC9083]. Designated experts MUST evaluate registrations with those criteria.¶
The RDAP JSON Values Registry should have as a minimum three expert reviewers and ideally four or five. An expert reviewer assigned to the review of an RDAP JSON values registration must have another expert reviewer double-check any submitted registration.¶
Expert reviewers are to use the criteria defined in Section 10.2 of [RFC9083].¶
Section 2.3.2 describes the usage of query parameters and Section 4.1 describes the restrictions extensions must follow to use them. Section 4.3 of [RFC7480] instructs servers to ignore unknown query parameters. As it relates to issuing URLs for redirects, servers MUST NOT blindly copy query parameters from a request to a redirect URL as query parameters may contain sensitive information, such as security credentials or tracking information, not relevant to the target server of the URL. Following the advice in [RFC7480], servers SHOULD only place query parameters in redirect URLs when it is known by the origin server (the server issuing the redirect) that the target server (the server referenced by the redirect) can process the query parameter and the contents of the query parameter are appropriate to be received by the target.¶
Section 2.3.2 describes the usage of query parameters and Section 4.1 describes the restrictions extensions must follow to use them. As query parameters have been known to be used to subvert the privacy preferences of users in HTTP-based protocols, server MUST NOT blindly copy query parameters from a request to a redirect URL as described in Section 7 and extensions MUST follow the constraints of query parameter usage as defined in Section 4.1.¶
The following individuals have provided feedback and contributions to the content and direction of this document: James Gould, Daniel Keathley, and Ties de Kock.¶