draft-ietf-regext-rdap-redacted-00.txt | draft-ietf-regext-rdap-redacted-01.txt | |||
---|---|---|---|---|
Network Working Group J.G. Gould | Network Working Group J.G. Gould | |||
Internet-Draft D.S. Smith | Internet-Draft D.S. Smith | |||
Intended status: Standards Track VeriSign, Inc. | Intended status: Standards Track VeriSign, Inc. | |||
Expires: 3 March 2022 J.K. Kolker | Expires: 5 March 2022 J.K. Kolker | |||
R.C. Carney | R.C. Carney | |||
GoDaddy Inc. | GoDaddy Inc. | |||
30 August 2021 | 1 September 2021 | |||
Redacted Fields in the Registration Data Access Protocol (RDAP) Response | Redacted Fields in the Registration Data Access Protocol (RDAP) Response | |||
draft-ietf-regext-rdap-redacted-00 | draft-ietf-regext-rdap-redacted-01 | |||
Abstract | Abstract | |||
This document describes an RDAP extension for explicitly identifying | This document describes an RDAP extension for explicitly identifying | |||
redacted RDAP response fields, using JSONPath as the default | redacted RDAP lookup response fields, using JSONPath as the default | |||
expression language. | expression language. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on 3 March 2022. | This Internet-Draft will expire on 5 March 2022. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2021 IETF Trust and the persons identified as the | Copyright (c) 2021 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents (https://trustee.ietf.org/ | |||
license-info) in effect on the date of publication of this document. | license-info) in effect on the date of publication of this document. | |||
Please review these documents carefully, as they describe your rights | Please review these documents carefully, as they describe your rights | |||
and restrictions with respect to this document. Code Components | and restrictions with respect to this document. Code Components | |||
extracted from this document must include Simplified BSD License text | extracted from this document must include Simplified BSD License text | |||
as described in Section 4.e of the Trust Legal Provisions and are | as described in Section 4.e of the Trust Legal Provisions and are | |||
provided without warranty as described in the Simplified BSD License. | provided without warranty as described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
2. Conventions Used in This Document . . . . . . . . . . . . . . 2 | 2. Conventions Used in This Document . . . . . . . . . . . . . . 3 | |||
3. Redaction Methods . . . . . . . . . . . . . . . . . . . . . . 3 | 3. Redaction Methods . . . . . . . . . . . . . . . . . . . . . . 3 | |||
3.1. Redaction by Removal Method . . . . . . . . . . . . . . . 3 | 3.1. Redaction by Removal Method . . . . . . . . . . . . . . . 4 | |||
3.2. Redaction by Empty Value Method . . . . . . . . . . . . . 4 | 3.2. Redaction by Empty Value Method . . . . . . . . . . . . . 4 | |||
4. Redacted RDAP Response . . . . . . . . . . . . . . . . . . . 5 | 4. Redacted RDAP Response . . . . . . . . . . . . . . . . . . . 5 | |||
4.1. RDAP Conformance . . . . . . . . . . . . . . . . . . . . 5 | 4.1. RDAP Conformance . . . . . . . . . . . . . . . . . . . . 5 | |||
4.2. "redacted" Member . . . . . . . . . . . . . . . . . . . . 5 | 4.2. "redacted" Member . . . . . . . . . . . . . . . . . . . . 6 | |||
5. JSONPath Considerations . . . . . . . . . . . . . . . . . . . 21 | 5. JSONPath Considerations . . . . . . . . . . . . . . . . . . . 22 | |||
6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21 | 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23 | |||
6.1. RDAP Extensions Registry . . . . . . . . . . . . . . . . 21 | 6.1. RDAP Extensions Registry . . . . . . . . . . . . . . . . 23 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 22 | 6.2. JSON Values Registry . . . . . . . . . . . . . . . . . . 24 | |||
8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 22 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 24 | |||
9. References . . . . . . . . . . . . . . . . . . . . . . . . . 22 | 8. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 24 | |||
9.1. Normative References . . . . . . . . . . . . . . . . . . 22 | 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 23 | 9.1. Informative References . . . . . . . . . . . . . . . . . 24 | |||
9.2. Normative References . . . . . . . . . . . . . . . . . . 24 | ||||
Appendix A. Change History . . . . . . . . . . . . . . . . . . . 26 | ||||
A.1. Change from 00 to 01 . . . . . . . . . . . . . . . . . . 26 | ||||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 26 | ||||
1. Introduction | 1. Introduction | |||
This document describes an RDAP extension for explicitly identifying | This document describes an RDAP extension for explicitly identifying | |||
redacted RDAP response fields, using JSONPath as the default | redacted RDAP lookup response fields, using JSONPath as the default | |||
expression language. A redacted RDAP field is one that has data | expression language. A redacted RDAP field is one that has data | |||
removed from the RDAP response due to the lack of client privilege to | removed from the RDAP lookup response due to the lack of client | |||
receive the field. This extension can be used to identify redacted | privilege to receive the field. This extension can be used to | |||
RDAP fields in any RDAP object class, as defined in [RFC7483], or | identify redacted RDAP fields in any RDAP object class, as defined in | |||
RDAP fields defined in RDAP extensions. Because an RDAP response may | [RFC7483], or RDAP fields defined in RDAP extensions. Because an | |||
exclude a field due to either the lack of data or based on the lack | RDAP lookup response may exclude a field due to either the lack of | |||
of RDAP client privileges, this extension is used to explicitly | data or based on the lack of RDAP client privileges, this extension | |||
specify which RDAP fields are not included in the RDAP response due | is used to explicitly specify which RDAP fields are not included in | |||
to redaction. It thereby provides a capability for disambiguation | the RDAP lookup response due to redaction. It thereby provides a | |||
between redaction and possible other reasons for data or field | capability for disambiguation between redaction and possible other | |||
absence. | reasons for data or field absence. | |||
In [RFC7482] RDAP supports both lookup and search queries, where a | ||||
lookup query responds with a single object and a search query | ||||
responds with a list of objects. This document applies to redaction | ||||
of a single object in a lookup response. | ||||
JSONPath, as defined in [I-D.ietf-jsonpath-base], is used as the | JSONPath, as defined in [I-D.ietf-jsonpath-base], is used as the | |||
default expression language to reference RDAP fields that have been | default expression language to reference RDAP fields that have been | |||
redacted. The redacted JSON fields will either be removed or have | redacted. The redacted JSON fields will either be removed or have | |||
empty values in the RDAP response. JSON is defined by [RFC8259]. | empty values in the RDAP lookup response. JSON is defined by | |||
[RFC8259]. | ||||
2. Conventions Used in This Document | 2. Conventions Used in This Document | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | "OPTIONAL" in this document are to be interpreted as described in BCP | |||
14 [RFC2119] [RFC8174] when, and only when, they appear in all | 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
The JSON examples include extra line breaks and whitespace. For | The JSON examples include extra line breaks and whitespace. For | |||
skipping to change at page 3, line 31 ¶ | skipping to change at page 3, line 45 ¶ | |||
entity objects with jCard [RFC7095]. jCard [RFC7095] is a JSON | entity objects with jCard [RFC7095]. jCard [RFC7095] is a JSON | |||
representation of vCard [RFC6350] that inherits its dependency on | representation of vCard [RFC6350] that inherits its dependency on | |||
arrays. An example is the vCard [RFC6350] "ADR" property / jCard | arrays. An example is the vCard [RFC6350] "ADR" property / jCard | |||
[RFC7095] "adr" property that defines a sequence of address | [RFC7095] "adr" property that defines a sequence of address | |||
components. According to [RFC6350], when an "ADR" property component | components. According to [RFC6350], when an "ADR" property component | |||
value is missing, the associated component separator MUST still be | value is missing, the associated component separator MUST still be | |||
specified. jCard [RFC7095] extends the use of arrays with each | specified. jCard [RFC7095] extends the use of arrays with each | |||
individual vCard property being represented by an array of three | individual vCard property being represented by an array of three | |||
fixed elements, followed by one or more additional elements. The mix | fixed elements, followed by one or more additional elements. The mix | |||
of JSON objects and JSON arrays impacts the methods used for | of JSON objects and JSON arrays impacts the methods used for | |||
redaction in RDAP. The redaction of RDAP fields fall into the two | redaction in RDAP. | |||
categories of Redaction by Removal Method (Section 3.1) and Redaction | ||||
by Empty Value Method (Section 3.2), defined in the following sub- | The redaction of RDAP fields fall into the two categories of | |||
sections. | Redaction by Removal Method (Section 3.1) and Redaction by Empty | |||
Value Method (Section 3.2), defined in the following sub-sections. | ||||
3.1. Redaction by Removal Method | 3.1. Redaction by Removal Method | |||
The Redaction by Removal Method is when the RDAP field is removed | The Redaction by Removal Method is when the RDAP field is removed | |||
from the RDAP response, which is the preferred method. The Redaction | from the RDAP response, which is the preferred method. The Redaction | |||
by Removal Method can be done for all RDAP response fields other than | by Removal Method can be done for all RDAP response fields other than | |||
the JSON arrays used with jCard [RFC7095]. When an RDAP object is | response fields using the position in an array to signal the redacted | |||
redacted by removal, all of the RDAP object's child fields are also | field (e.g., the JSON arrays used with jCard [RFC7095]). RDAP | |||
removed. Only the redacted RDAP object needs to be referenced in the | extensions such as JSContact in Registration Data Access Protocol | |||
list of redacted fields, as defined in Section 4.2. An example of | (RDAP) JSON Responses [I-D.ietf-regext-rdap-jscontact] do not have a | |||
redacting an RDAP object is removing the administrative contact from | dependency on the use of positional JSON arrays and are therefore | |||
the RDAP response and including the following "redacted" member: | suited for the Redaction by Removal Method. | |||
When an RDAP object is redacted by removal, all of the RDAP object's | ||||
child fields are also removed. Only the redacted RDAP object needs | ||||
to be referenced in the list of redacted fields, as defined in | ||||
Section 4.2. An example of redacting an RDAP object is removing the | ||||
administrative contact from the RDAP response and including the | ||||
following "redacted" member: | ||||
"redacted": [ | "redacted": [ | |||
{ | { | |||
"name": "Administrative Contact", | "name": { | |||
"type": "Administrative Contact" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='administrative')]", | "path": "$.entities[?(@.roles[0]=='administrative')]", | |||
"method": "removal" | "method": "removal" | |||
"reason": "Client request" | ||||
} | } | |||
] | ] | |||
The Redaction by Removal Method MUST NOT be used to remove a field | The Redaction by Removal Method MUST NOT be used to remove a field | |||
from a jCard [RFC7095] fixed array position, which will result in a | using the position in a fixed length array to signal the redacted | |||
non-conformant jCard [RFC7095] array definition. | field. For example, removal of an individual data field in jCard | |||
[RFC7095] will result in a non-conformant jCard [RFC7095] array | ||||
definition. | ||||
3.2. Redaction by Empty Value Method | 3.2. Redaction by Empty Value Method | |||
The Redaction by Empty Value Method is when a redacted field is not | The Redaction by Empty Value Method is when a redacted field is not | |||
removed, but its value is set to an empty value, such as "" for a | removed, but its value is set to an empty value, such as "" for a | |||
jCard [RFC7095] Text ("text") property or null for non-Text ("text") | jCard [RFC7095] Text ("text") property or null for non-Text ("text") | |||
properties. The empty jCard [RFC7095] values ("" or null) are | properties. The empty jCard [RFC7095] values ("" or null) are | |||
referenced in the "redacted" member in place of the jCard [RFC7095] | referenced in the "redacted" member in place of the jCard [RFC7095] | |||
property name, such as referencing the "fn" jCard property value at | property name, such as referencing the "fn" jCard property value at | |||
position 3 instead of referencing the "fn" jCard property name at | position 3 instead of referencing the "fn" jCard property name at | |||
position 0. The Redaction by Empty Value Method SHOULD be used only | position 0. The Redaction by Empty Value Method SHOULD be used only | |||
when redacting JSON response fields that use jCard [RFC7095] arrays. | when redacting JSON response fields that use the position in an array | |||
to signal the redacted field (e.g., jCard [RFC7095] arrays). | ||||
Optional jCard [RFC7095] properties SHOULD use the Redaction by | Optional jCard [RFC7095] properties SHOULD use the Redaction by | |||
Removal Method (Section 3.1) to redact the entire property. The | Removal Method (Section 3.1) to redact the entire property. The | |||
required jCard [RFC7095] "fn" property, defined in section 6.2.1 of | required jCard [RFC7095] "fn" property, defined in section 6.2.1 of | |||
vCard [RFC6350], MUST use the Redaction by Empty Value Method to | vCard [RFC6350], MUST use the Redaction by Empty Value Method to | |||
redact the property value. Removing the "fn" property would violate | redact the property value. Removing the "fn" property would violate | |||
vCard [RFC6350] and removing the property value would violate the | vCard [RFC6350] and removing the property value would violate the | |||
fixed array positions defined in jCard [RFC7095]. | fixed array positions defined in jCard [RFC7095]. | |||
An example of the redacted field "fn" jCard property using the | An example of the redacted field "fn" jCard property using the | |||
Redaction by Empty Value Method: | Redaction by Empty Value Method: | |||
skipping to change at page 5, line 7 ¶ | skipping to change at page 5, line 26 ¶ | |||
{}, | {}, | |||
"text", | "text", | |||
"" | "" | |||
] | ] | |||
An example of the "redacted" member for the redacted "fn" jCard | An example of the "redacted" member for the redacted "fn" jCard | |||
property value, which is array position 3: | property value, which is array position 3: | |||
"redacted": [ | "redacted": [ | |||
{ | { | |||
"name": "Registrant Name", | "name": { | |||
"type": "Registrant Name" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='fn')][3]", | vcardArray[1][?(@[0]=='fn')][3]", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "emptyValue" | "method": "emptyValue", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
} | } | |||
] | ] | |||
4. Redacted RDAP Response | 4. Redacted RDAP Response | |||
4.1. RDAP Conformance | 4.1. RDAP Conformance | |||
RDAP responses that contain values described in this document MUST | RDAP lookup responses that contain values described in this document | |||
indicate conformance with this specification by including an | MUST indicate conformance with this specification by including an | |||
rdapConformance ([RFC7483]) value of "redacted_0". The information | rdapConformance ([RFC7483]) value of "redacted_0.1". The information | |||
needed to register this value in the RDAP Extensions Registry is | needed to register this value in the RDAP Extensions Registry is | |||
described in Section 6.1. | described in Section 6.1. | |||
Example rdapConformance member with the redacted extension: | Example rdapConformance member with the redacted extension: | |||
"rdapConformance" : | "rdapConformance": [ | |||
[ | ||||
"rdap_level_0", | "rdap_level_0", | |||
"redacted_0" | "redacted_0" | |||
] | ] | |||
4.2. "redacted" Member | 4.2. "redacted" Member | |||
The "redacted" member MUST be added to the RDAP response when there | The "redacted" member MUST be added to the RDAP lookup response when | |||
are redacted fields. The "redacted" member contains an array of | there are redacted fields. The "redacted" member contains an array | |||
redacted objects with the following child members: | of redacted objects with the following child members: | |||
"name": A logical name for the redacted field. The logical name | "name": A logical name for the redacted field. The logical name | |||
used for the redacted field is up to server policy. Conventions | used for the redacted field is up to server policy. The logical | |||
used for the chosen logical names MAY be defined in other | name is defined using an object with a "type" field denoting a | |||
documents to meet the needs of different RDAP services or | registered redacted name (see Section 6.2) or a "description" | |||
industries. | field denoting an unregistered redacted name. The registered | |||
redacted names and the chosen unregistered names can meet the | ||||
needs of different RDAP services or industries. | ||||
"path": The JSON expression of the redacted field, using the | "path": The JSON expression of the redacted field, using the | |||
expression language defined by the "pathLang" member. The JSON | expression language defined by the "pathLang" member. The JSON | |||
expression references a removed JSON field or an empty field | expression references a removed JSON field or an empty field | |||
value based on Section 3. | value based on Section 3. | |||
"pathLang": OPTIONAL JSON path expression language used, with the | "pathLang": OPTIONAL JSON path expression language used, with the | |||
default value of "jsonpath" for JSONPath | default value of "jsonpath" for JSONPath | |||
([I-D.ietf-jsonpath-base]). Other JSON path expression languages | ([I-D.ietf-jsonpath-base]). Other JSON path expression languages | |||
MAY be used based on server policy. | MAY be used based on server policy. | |||
"method": OPTIONAL redaction method used with "removal" indicating | "method": OPTIONAL redaction method used with "removal" indicating | |||
the Redaction By Removed Method (Section 3.1) and "emptyValue" | the Redaction By Removed Method (Section 3.1) and "emptyValue" | |||
indicating the Redaction by Empty Value Method (Section 3.2), | indicating the Redaction by Empty Value Method (Section 3.2), | |||
with the default value of "removal". | with the default value of "removal". | |||
"reason": OPTIONAL human readable reason(s) for the redacted field | "reason": OPTIONAL human readable reason(s) for the redacted field | |||
in the language defined by the [RFC7483] "lang" member. The | in the language defined by the [RFC7483] "lang" member. The | |||
default language is "en" if the [RFC7483] "lang" member is not | default language is "en" if the [RFC7483] "lang" member is not | |||
specified. The "reason" member is provided for informational | specified. The reason is defined using an object with an | |||
purposes and MUST NOT be a client processing dependency. | OPTIONAL "type" field denoting a registered redacted reason (see | |||
see Section 6.2) and an OPTIONAL "description" field denoting an | ||||
unregistered redacted reason. The "description" field MUST NOT | ||||
be a client processing dependency. | ||||
Example unredacted version of RDAP response: | Example unredacted version of RDAP lookup response: | |||
{ | { | |||
"rdapConformance": [ | "rdapConformance": [ | |||
"rdap_level_0" | "rdap_level_0" | |||
], | ], | |||
"objectClassName": "domain", | "objectClassName": "domain", | |||
"handle": "ABC123", | "handle": "ABC123", | |||
"ldhName": "example.com", | "ldhName": "example.com", | |||
"secureDNS": { | "secureDNS": { | |||
"delegationSigned": false | "delegationSigned": false | |||
skipping to change at page 18, line 47 ¶ | skipping to change at page 19, line 31 ¶ | |||
} | } | |||
], | ], | |||
"status": [ | "status": [ | |||
"server delete prohibited", | "server delete prohibited", | |||
"server update prohibited", | "server update prohibited", | |||
"server transfer prohibited", | "server transfer prohibited", | |||
"client transfer prohibited" | "client transfer prohibited" | |||
], | ], | |||
"redacted": [ | "redacted": [ | |||
{ | { | |||
"name": "Registry Domain ID", | "name": { | |||
"type": "Registry Domain ID" | ||||
}, | ||||
"path": "$.handle", | "path": "$.handle", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant Name", | "name": { | |||
"type": "Registrant Name" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='fn')][3]", | vcardArray[1][?(@[0]=='fn')][3]", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "emptyValue", | "method": "emptyValue", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant Organization", | "name": { | |||
"type": "Registrant Organization" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='org')]", | vcardArray[1][?(@[0]=='org')]", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant Street", | "name": { | |||
"type": "Registrant Street" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='adr')][3][:3]", | vcardArray[1][?(@[0]=='adr')][3][:3]", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "emptyValue", | "method": "emptyValue", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant City", | "name": { | |||
"type": "Registrant City" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='adr')][3][3]", | vcardArray[1][?(@[0]=='adr')][3][3]", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "emptyValue", | "method": "emptyValue", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant Postal Code", | "name": { | |||
"type": "Registrant Postal Code" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='adr')][3][5]", | vcardArray[1][?(@[0]=='adr')][3][5]", | |||
"pathLang": "jsonpath", | "pathLang": "jsonpath", | |||
"method": "emptyValue", | "method": "emptyValue", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant Email", | "name": { | |||
"type": "Registrant Email" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[0]=='email')]", | vcardArray[1][?(@[0]=='email')]", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Registrant Phone", | "name": { | |||
"type": "Registrant Phone" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='registrant')]. | "path": "$.entities[?(@.roles[0]=='registrant')]. | |||
vcardArray[1][?(@[1].type=='voice')]", | vcardArray[1][?(@[1].type=='voice')]", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Technical Name", | "name": { | |||
"type": "Technical Name" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='technical')]. | "path": "$.entities[?(@.roles[0]=='technical')]. | |||
vcardArray[1][?(@[0]=='fn')][3]", | vcardArray[1][?(@[0]=='fn')][3]", | |||
"method": "emptyValue", | "method": "emptyValue", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Technical Email", | "name": { | |||
"type": "Technical Email" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='technical')]. | "path": "$.entities[?(@.roles[0]=='technical')]. | |||
vcardArray[1][?(@[0]=='email')]", | vcardArray[1][?(@[0]=='email')]", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Technical Phone", | "name": { | |||
"type": "Technical Phone" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='technical')]. | "path": "$.entities[?(@.roles[0]=='technical')]. | |||
vcardArray[1][?(@[1].type=='voice')]", | vcardArray[1][?(@[1].type=='voice')]", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Server policy" | "reason": { | |||
"type": "Server policy" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Technical Fax", | "name": { | |||
"description": "Technical Fax" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='technical')]. | "path": "$.entities[?(@.roles[0]=='technical')]. | |||
vcardArray[1][?(@[1].type=='fax')]", | vcardArray[1][?(@[1].type=='fax')]", | |||
"reason": "Client request" | "reason": { | |||
"type": "Client request", | ||||
"description": "Client requested the field redacted" | ||||
} | ||||
}, | }, | |||
{ | { | |||
"name": "Administrative Contact", | "name": { | |||
"type": "Administrative Contact" | ||||
}, | ||||
"path": "$.entities[?(@.roles[0]=='administrative')]", | "path": "$.entities[?(@.roles[0]=='administrative')]", | |||
"method": "removal", | "method": "removal", | |||
"reason": "Client request" | "reason": { | |||
"description": "Refer to the technical contact" | ||||
} | ||||
} | } | |||
] | ] | |||
} | } | |||
5. JSONPath Considerations | 5. JSONPath Considerations | |||
JSONPath [I-D.ietf-jsonpath-base] is the default JSON path expression | JSONPath [I-D.ietf-jsonpath-base] is the default JSON path expression | |||
language. This section covers considerations for servers using | language. This section covers considerations for servers using | |||
[I-D.ietf-jsonpath-base] to identify redacted RDAP fields with the | [I-D.ietf-jsonpath-base] to identify redacted RDAP fields with the | |||
"path" member of redacted objects in the "redacted" member. The list | "path" member of redacted objects in the "redacted" member. The list | |||
of JSONPath considerations include: | of JSONPath considerations include: | |||
1. Use absolute paths with the '$' JSONPath element. An example is | 1. Use absolute paths with the '$' JSONPath element. An example is | |||
"$.handle" for the "Registry Domain ID". | "$.handle" for the "Registry Domain ID". | |||
2. Validate a JSONPath expression using a non-redacted RDAP | 2. Validate a JSONPath expression using a non-redacted RDAP lookup | |||
response, where evaluating the expression results in returning | response, where evaluating the expression results in returning | |||
the redacted field. | the redacted field. | |||
3. Reference the removed object field when redacting an entire | 3. Reference the removed object field when redacting an entire | |||
object by the Redaction by Removal Method (Section 3.1), where | object by the Redaction by Removal Method (Section 3.1), where | |||
all of the object's child fields are explicitly removed. An | all of the object's child fields are explicitly removed. An | |||
example is "$.entities[?(@.roles[0]=='administrative')]" for the | example is "$.entities[?(@.roles[0]=='administrative')]" for the | |||
entire "Administrative Contact". | entire "Administrative Contact". | |||
4. Reference the removed field when using the Redaction by Removal | 4. When an entity has multiple roles, include "redacted" members for | |||
each role using the role index. This will result in duplicate | ||||
"redacted" members, but will enable the client to treat redaction | ||||
consistently when there is a single role per entity or multiple | ||||
roles per entity. An example is when the "roles" member has the | ||||
value '["registrant","administrative"]', redacting the "name" | ||||
member of the entity will result in two "redacted" members with | ||||
the JSONPath expressions "$.entities[?(@.roles[0]=='registrant')] | ||||
.vcardArray[1][?(@[0]=='fn')][3]" and "$.entities[?(@.roles[1]==' | ||||
administrative')].vcardArray[1][?(@[0]=='fn')][3]". | ||||
5. Reference the removed field when using the Redaction by Removal | ||||
Method (Section 3.1). An example is "$.handle" for the "Registry | Method (Section 3.1). An example is "$.handle" for the "Registry | |||
Domain ID". | Domain ID". | |||
5. Reference index 0 of the jCard [RFC7095] property array, which is | 6. Reference index 0 of the jCard [RFC7095] property array, which is | |||
the jCard [RFC7095] "name" property, with a filter expression | the jCard [RFC7095] "name" property, with a filter expression | |||
containing the name of the field, when redacting a jCard | containing the name of the field, when redacting a jCard | |||
[RFC7095] field using the Redaction by Removal Method | [RFC7095] field using the Redaction by Removal Method | |||
(Section 3.1). An example is "$.entities[?(@.roles[0]=='registra | (Section 3.1). An example is "$.entities[?(@.roles[0]=='registra | |||
nt')].vcardArray[1][?(@[0]=='email')]" for the "Registrant | nt')].vcardArray[1][?(@[0]=='email')]" for the "Registrant | |||
Email". | Email". | |||
6. Reference jCard [RFC7095] field value or values redacted by array | 7. Reference jCard [RFC7095] field value or values redacted by array | |||
index 3 and greater, when redacting a jCard [RFC7095] field using | index 3 and greater, when redacting a jCard [RFC7095] field using | |||
the Redaction by Empty Value Method (Section 3.2). The jCard | the Redaction by Empty Value Method (Section 3.2). The jCard | |||
[RFC7095] property array index 3 and greater contain the property | [RFC7095] property array index 3 and greater contain the property | |||
values, where the property values set with an empty value are | values, where the property values set with an empty value are | |||
referenced directly in place of the jCard [RFC7095] property | referenced directly in place of the jCard [RFC7095] property | |||
name. Servers can then systematically redact jCard [RFC7095] | name. Servers can then systematically redact jCard [RFC7095] | |||
field value or values based on the JSONPath expressions and | field value or values based on the JSONPath expressions and | |||
clients will directly know which jCard [RFC7095] property values | clients will directly know which jCard [RFC7095] property values | |||
have been redacted. An example is "$.entities[?(@.roles[0]=='reg | have been redacted. An example is "$.entities[?(@.roles[0]=='reg | |||
istrant')].vcardArray[1][?(@[0]=='fn')][3]" for the "Registrant | istrant')].vcardArray[1][?(@[0]=='fn')][3]" for the "Registrant | |||
Name" or "$.entities[?(@.roles[0]=='registrant')].vcardArray[1][? | Name" or "$.entities[?(@.roles[0]=='registrant')].vcardArray[1][? | |||
(@[0]=='adr')][3][5]" for the "Registrant Postal Code". | (@[0]=='adr')][3][5]" for the "Registrant Postal Code". | |||
8. RDAP extensions should define any special JSONPath considerations | ||||
required to identify redacted RDAP fields if these considerations | ||||
are insufficient. | ||||
6. IANA Considerations | 6. IANA Considerations | |||
6.1. RDAP Extensions Registry | 6.1. RDAP Extensions Registry | |||
IANA is requested to register the following value in the RDAP | IANA is requested to register the following value in the RDAP | |||
Extensions Registry: | Extensions Registry: | |||
Extension identifier: redacted_0 | Extension identifier: redacted_0.1 | |||
Registry operator: Any | Registry operator: Any | |||
Published specification: This document. | Published specification: This document. | |||
Contact: IESG <iesg@ietf.org> | Contact: IESG <iesg@ietf.org> | |||
Intended usage: This extension identifies the redacted fields in an | Intended usage: This extension identifies the redacted fields in an | |||
RDAP response. | RDAP lookup response. | |||
6.2. JSON Values Registry | ||||
Section 10.2 of [RFC9083] defines the JSON Values Registry with pre- | ||||
defined Type field values and the use of the "Expert Review" policy | ||||
defined in [RFC8126]. Two new JSON Values Registry Type field values | ||||
are used to register pre-defined redacted name and reason values: | ||||
"redacted name": Redacted name being registered. The registered | ||||
redacted name is referenced using the "type" field of the | ||||
redacted "name" field. | ||||
"redacted reason": Redacted reason being registered. The registered | ||||
redacted reason is referenced using the "type" field of the | ||||
redacted "reason" field. | ||||
7. Security Considerations | 7. Security Considerations | |||
The server including a redacted signal provides an unauthorized | The server including a redacted signal provides an unauthorized | |||
client additional information related to the existence of data. | client additional information related to the existence of data. | |||
Servers MAY exclude the redacted members for RDAP fields that are | Servers MAY exclude the redacted members for RDAP fields that are | |||
considered a privacy issue in providing a data existence signal. | considered a privacy issue in providing a data existence signal. | |||
8. Acknowledgements | 8. Acknowledgements | |||
The authors wish to thank the following persons for their feedback | The authors wish to thank the following persons for their feedback | |||
and suggestions: Scott Hollenbeck, and Rick Wilhelm. | and suggestions: Marc Blanchet, Scott Hollenbeck, Mario Loffredo, | |||
Gustavo Lozano, and Rick Wilhelm. | ||||
9. References | 9. References | |||
9.1. Normative References | 9.1. Informative References | |||
[I-D.ietf-regext-rdap-jscontact] | ||||
Loffredo, M. and G. Brown, "Using JSContact in | ||||
Registration Data Access Protocol (RDAP) JSON Responses", | ||||
Work in Progress, Internet-Draft, draft-ietf-regext-rdap- | ||||
jscontact-02, 28 May 2021, <https://tools.ietf.org/html/ | ||||
draft-ietf-regext-rdap-jscontact-02>. | ||||
9.2. Normative References | ||||
[I-D.ietf-jsonpath-base] | [I-D.ietf-jsonpath-base] | |||
Gössner, S., Normington, G., and C. Bormann, "JSONPath: | Gössner, S., Normington, G., and C. Bormann, "JSONPath: | |||
Query expressions for JSON", Work in Progress, Internet- | Query expressions for JSON", Work in Progress, Internet- | |||
Draft, draft-ietf-jsonpath-base-01, 8 July 2021, | Draft, draft-ietf-jsonpath-base-01, 8 July 2021, | |||
<https://tools.ietf.org/html/draft-ietf-jsonpath-base-01>. | <https://tools.ietf.org/html/draft-ietf-jsonpath-base-01>. | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, | Requirement Levels", BCP 14, RFC 2119, | |||
DOI 10.17487/RFC2119, March 1997, | DOI 10.17487/RFC2119, March 1997, | |||
<https://www.rfc-editor.org/info/rfc2119>. | <https://www.rfc-editor.org/info/rfc2119>. | |||
[RFC6350] Perreault, S., "vCard Format Specification", RFC 6350, | [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350, | |||
DOI 10.17487/RFC6350, August 2011, | DOI 10.17487/RFC6350, August 2011, | |||
<https://www.rfc-editor.org/info/rfc6350>. | <https://www.rfc-editor.org/info/rfc6350>. | |||
[RFC7095] Kewisch, P., "jCard: The JSON Format for vCard", RFC 7095, | [RFC7095] Kewisch, P., "jCard: The JSON Format for vCard", RFC 7095, | |||
DOI 10.17487/RFC7095, January 2014, | DOI 10.17487/RFC7095, January 2014, | |||
<https://www.rfc-editor.org/info/rfc7095>. | <https://www.rfc-editor.org/info/rfc7095>. | |||
[RFC7482] Newton, A. and S. Hollenbeck, "Registration Data Access | ||||
Protocol (RDAP) Query Format", RFC 7482, | ||||
DOI 10.17487/RFC7482, March 2015, | ||||
<https://www.rfc-editor.org/info/rfc7482>. | ||||
[RFC7483] Newton, A. and S. Hollenbeck, "JSON Responses for the | [RFC7483] Newton, A. and S. Hollenbeck, "JSON Responses for the | |||
Registration Data Access Protocol (RDAP)", RFC 7483, | Registration Data Access Protocol (RDAP)", RFC 7483, | |||
DOI 10.17487/RFC7483, March 2015, | DOI 10.17487/RFC7483, March 2015, | |||
<https://www.rfc-editor.org/info/rfc7483>. | <https://www.rfc-editor.org/info/rfc7483>. | |||
[RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for | ||||
Writing an IANA Considerations Section in RFCs", BCP 26, | ||||
RFC 8126, DOI 10.17487/RFC8126, June 2017, | ||||
<https://www.rfc-editor.org/info/rfc8126>. | ||||
[RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC | |||
2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, | |||
May 2017, <https://www.rfc-editor.org/info/rfc8174>. | May 2017, <https://www.rfc-editor.org/info/rfc8174>. | |||
[RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | [RFC8259] Bray, T., Ed., "The JavaScript Object Notation (JSON) Data | |||
Interchange Format", STD 90, RFC 8259, | Interchange Format", STD 90, RFC 8259, | |||
DOI 10.17487/RFC8259, December 2017, | DOI 10.17487/RFC8259, December 2017, | |||
<https://www.rfc-editor.org/info/rfc8259>. | <https://www.rfc-editor.org/info/rfc8259>. | |||
[RFC9083] Hollenbeck, S. and A. Newton, "JSON Responses for the | ||||
Registration Data Access Protocol (RDAP)", STD 95, | ||||
RFC 9083, DOI 10.17487/RFC9083, June 2021, | ||||
<https://www.rfc-editor.org/info/rfc9083>. | ||||
Appendix A. Change History | ||||
A.1. Change from 00 to 01 | ||||
1. Changed rdapConformance to use pointed "redacted_0.1" value to | ||||
support structural changes of the extension up to the target of | ||||
"redacted_1.0". | ||||
2. Updates based on the Gustavo Lozano feedback: | ||||
1. Updated the language to change the special treatment of jCard | ||||
to be more generic for future RDAP extensions that leverage | ||||
fixed length JSON arrays. | ||||
2. Added "RDAP extensions should define any special JSONPath | ||||
considerations required to identify redacted RDAP fields if | ||||
the these considerations are insufficient." to the JSONPath | ||||
Considerations section to generalize it. | ||||
3. Updates based on the Marc Blanchet feedback: | ||||
1. Added a reference to draft-ietf-regext-rdap-jscontact as an | ||||
example of an RDAP extension that is suited for the Redaction | ||||
by Removal Method based on the lack of dependency on | ||||
positional JSON arrays. | ||||
2. Added support for registered and unregistered (free-form) | ||||
redaction reasons by changing the "reason" property to be a | ||||
JSON object with the "type" and "description" properties. | ||||
The "type" property includes registration in the IANA JSON | ||||
Values Registry. | ||||
3. Added a "JSON Values Registry" section in the IANA | ||||
Considersations section to define the "redaction reason" JSON | ||||
Values Registry Type values to support the registration of | ||||
redaction reasons. | ||||
4. Updates based on the Mario Loffredo feedback: | ||||
1. Added support for registered and unregistered (free-form) | ||||
redaction names by changing the "reason" property to be a | ||||
JSON object with the "type" and "description" properties. | ||||
The "type" property includes registration in the IANA JSON | ||||
Values Registry. | ||||
2. Added a "JSON Values Registry" section in the IANA | ||||
Considersations section to define the "redaction name" JSON | ||||
Values Registry Type values to support the registration of | ||||
redaction names. | ||||
3. Added a JSONPath Considerations item associated with handling | ||||
entities with multiple roles. | ||||
4. Added language to restrict the extension to lookup responses. | ||||
Authors' Addresses | Authors' Addresses | |||
James Gould | James Gould | |||
VeriSign, Inc. | VeriSign, Inc. | |||
12061 Bluemont Way | 12061 Bluemont Way | |||
Reston, VA 20190 | Reston, VA 20190 | |||
United States of America | United States of America | |||
Email: jgould@verisign.com | Email: jgould@verisign.com | |||
URI: http://www.verisigninc.com | URI: http://www.verisigninc.com | |||
End of changes. 64 change blocks. | ||||
96 lines changed or deleted | 275 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |