<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="4"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc iprnotified="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" consensus="true" docName="draft-gould-regext-rdap-status-set-00" ipr="trust200902" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" tocDepth="4" sortRefs="true" symRefs="true" version="3">
  <front>
    <title abbrev="RDAP Status Set Extension">Registration Data Access Protocol (RDAP) Extension for Status Set</title>
    <seriesInfo name="Internet-Draft" value="draft-gould-regext-rdap-status-set-00"/>
    <author fullname="James Gould" initials="J." surname="Gould">
      <organization>VeriSign, Inc.</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>United States of America</country>
        </postal>
        <email>jgould@verisign.com</email>
        <uri>http://www.verisign.com</uri>
      </address>
    </author>
    <author fullname="Poonam Garg" initials="P." surname="Garg">
      <organization>VeriSign, Inc.</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>United States of America</country>
        </postal>
        <email>pogarg@verisign.com</email>
        <uri>http://www.verisign.com</uri>
      </address>
    </author>
    <author fullname="Mohammad Suhale Malang Khader" initials="M.S." surname="Malang Khader">
      <organization>VeriSign, Inc.</organization>
      <address>
        <postal>
          <street>12061 Bluemont Way</street>
          <city>Reston</city>
          <region>VA</region>
          <code>20190</code>
          <country>United States of America</country>
        </postal>
        <email>mmalangkhader@verisign.com</email>
        <uri>http://www.verisign.com</uri>
      </address>
    </author>
    <area>General</area>
    <keyword>RDAP</keyword>
    <keyword>Registration Data Access Protocol</keyword>
    <keyword>JSON</keyword>
    <keyword>Status Set</keyword>
    <keyword>Extension</keyword>
    <abstract>
      <t>
      This document describes an Registration Data Access Protocol (RDAP) extension for 
      including status sets assigned to RDAP object classes, such as the Domain Object Class and the Nameserver Object Class 
      in <xref target="RFC9083"/>.  There can be many overlapping reasons for each of the "status" member values, such 
      as implementing a lock service, complying with a court order, or addressing domain abuse.  
      A status set defines an object representing the reason for setting a "status" value, 
      so clients and servers can effectively manage the overlapping reasons of individual "status" values using the status sets.  
      This RDAP extension supports returning the assigned client and server status sets with additional data members, such as the 
      mapped "status" values and when the status set was assigned.    
      </t>
    </abstract>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>
      This document describes an Registration Data Access Protocol (RDAP) extension for 
      including status sets assigned to RDAP object classes, such as the Domain Object Class and the Nameserver Object Class 
      in <xref target="RFC9083"/>.  There can be many overlapping reasons for each of the "status" member values, such 
      as implementing a lock service, complying with a court order, or addressing domain abuse.  
      A status set defines an object representing the reason for setting a "status" value, 
      can effectively manage the overlapping reasons of individual "status" values using the status sets.
      This RDAP extension supports returning the assigned client and server status sets with additional data 
      members, such as the "type", the mapped "status" values, whether the status set is inherited either from the 
      parent object (domain) or to child objects (nameservers), and whether the status set is directly assigned.  
      </t>
      <t>
      This document is complementary to the Extensible Provisioning Protocol (EPP) Status Set Extension [I-D.gould-regext-epp-status-set], 
      but registry operators do not need to implement that extension in their EPP server in order to implement this RDAP extension.
      </t>
   </section>
    <section anchor="conventions" numbered="true" toc="default">
      <name>Conventions Used in This Document</name>
      <t>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 BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/>
      when, and only when, they
      appear in all capitals, as shown here.</t>
      <t>The example RDAP responses don't include all of the RDAP response members, but are only representative of the 
      members that are relavant to this extension.</t>
    </section>
    <section anchor="rdap-conformance" numbered="true" toc="default">
      <name>RDAP Conformance</name>
      <t>Servers implementing this extension MUST include the string &quot;statusSet&quot; in the &quot;rdapConformance&quot; (<xref target="RFC9083" format="default"/>) array of all relevant RDAP responses.
        The registration of the &quot;statusSet&quot; extension identifier is described in <xref target="iana-considerations" format="default"/>.</t>
    </section>
    <section anchor="statusSet_data-member" numbered="true" toc="default">
      <name>"statusSet_data" Member</name>
      <t>The status set information is conveyed via a new top-level object member named &quot;statusSet_data&quot; within the object class that the status sets are assigned to. 
        A status set is an object that defines the reason for the "status" member values for an RDAP object class, such as the Domain Object Class and the Nameserver Object Class 
        in <xref target="RFC9083"/>.  The status set can also be used as a marker status set when 
        there are no mapped "status" member values that can drive additional business logic and publishing use cases. An object can have many assigned status sets, and the status sets can include 
        an overlapping set of "status" member values.  The "status" member value will be assigned to the object if there is at least one set set assigned to the object with the mapped "status" member value.  
        The "status" member value will be unassigned from the object when all status sets are unassigned with the mapped "status" member value.  
        For example, both the "Registrar Lock" status set and the "Auth Token Lock" status set are mapped to the "client update prohibited" "status" member value, 
        where if either of the status sets are assigned to the object, the "client update prohibited" "status" member value will be assigned. The "client update prohibited" "status" member value 
        will be unassigned if both "Registrar Lock" status set and "Auth Token Lock" status sets are unassigned.      
      
      The "statusSet_data" member includes a list of status set objects containing the following members:</t>
      <ul spacing="normal">
        <li>name -- the unique name for the status set that is up to server policy.  
          Example names include "Registrar Lock", "Auth Token Lock", and "Registry Lock".  There is a reserved value 
          of "REDACTED" that is used for a server status set, where the name must be redacted based on server policy.</li>
        <li>type -- indicates whether the status set is a client status set with a value of "client" or the status set 
        is a server status set with a value of "server".  Only servers can set and unset a server status set.</li>
        <li>inherited -- OPTIONAL boolean with a default value of false that indicates inheritable downward to child objects (Nameservers) when applied to Domain Objects, and inherited upward from parent object (Domain) when applied to NameServer object.</li>
        <li>assigned -- OPTIONAL boolean with a default value of true that indicates whether the status set is directly assigned to the object.  The value can 
        be false for an inherited status set.</li>
        <li>created -- OPTIONAL date and time that the status set was assigned to the object.</li>
        <li>status -- An array of "status" values in <xref target="RFC9083"/> that are mapped to the status set.</li>
      </ul>
      <figure anchor="domain-single-statusset-response" align="left" suppress-title="false">
        <name>Domain object including the &quot;statusSet_data&quot; member</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName": "example.com",
  "status": [ 
    "client update prohibited",
    "client delete prohibited", 
    "client transfer prohibited"
  ],
  "rdapConformance": ["rdap_level_0", "statusSet"],
  "statusSet_data": [
    { 
      "name": "Auth Token Lock",
      "type": "client",
      "inherited": true, 
      "assigned": true, 
      "created": "2026-05-03T09:00:00.0Z", 
      "status": [
        "client update prohibited", 
        "client delete prohibited", 
        "client transfer prohibited"
      ]
    }
  ]
}
        </sourcecode>
      </figure>
      <figure anchor="domain-many-statusset-response" align="left" suppress-title="false">
        <name>Domain object including the &quot;statusSet_data&quot; member that 
        includes the assigned Client Status Sets ("Auth Token Lock" and "Registrar Lock") 
        and the assigned Server Status Set ("Registry Lock")</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "domain",
  "handle": "XXX",
  "ldhName" : "example.com",
  "status" : [ 
    "client update prohibited",
    "client delete prohibited", 
    "client transfer prohibited",
    "server update prohibited", 
    "server delete prohibited", 
    "server transfer prohibited"
  ],
  "rdapConformance": ["rdap_level_0", "statusSet"],
  "statusSet_data": [
    {
      "name": "Auth Token Lock",
      "type": "client",
      "inherited": true, 
      "assigned": true, 
      "created": "2026-05-03T09:00:00.0Z", 
      "status": [
        "client update prohibited", 
        "client delete prohibited", 
        "client transfer prohibited"
      ]
    },
    {
      "name": "Registrar Lock",
      "type": "client",
      "inherited": false, 
      "assigned": true, 
      "created": "2026-05-03T09:00:00.0Z", 
      "status": [
        "client update prohibited", 
        "client delete prohibited", 
        "client transfer prohibited"
      ]
    },
    {
      "name": "Registry Lock",
      "type": "server",
      "inherited": false, 
      "assigned": true, 
      "created": "2026-05-03T09:10:00.0Z", 
      "status": [
        "server update prohibited", 
        "server delete prohibited", 
        "server transfer prohibited"
      ]
    }
  ]
}
        </sourcecode>
      </figure>
      <figure anchor="nameserver-statusset-response" align="left" suppress-title="false">
        <name>Nameserver object includes an the inherited Client Status Set ("Auth Token Lock") from 
            the parent domain name</name>
        <sourcecode type="json" markers="false">
{
  "objectClassName": "nameserver",
  "handle": "XXXX",
  "ldhName" : "ns1.xn--fo-5ja.example",
  "status" : [ "active" ],
  "rdapConformance": ["rdap_level_0", "statusSet"],
  "statusSet_data": [
    {
      "name": "Auth Token Lock",
      "type": "client",
      "inherited": true, 
      "assigned": false, 
      "created": "2026-05-03T09:00:00.0Z", 
      "status": [
        "client update prohibited", 
        "client delete prohibited",
        "client transfer prohibited"
      ]
    }
  ]
}
        </sourcecode>
      </figure>      
    </section>
    <section anchor="extension-version-identifier" title="Extension Version Identifier">
      <t>This extension supports the Point Versioning defined in <xref target="I-D.ietf-regext-rdap-versioning"/> with 
      a Point Extension Version Identifier of &quot;statusSet-0.1&quot;.  
      When there are interface changes to the extension, the Point Extension Version Identifier will be incremented, which may not match the draft version number.  
      When the draft becomes a working group document and passes Working Group Last Call (WGLC), the Point Extension Version Identifier will be changed to &quot;statusSet-1.0&quot;.
      </t>
    </section>
    <section anchor="iana-considerations" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="rdap-extensions-registry" numbered="true" toc="default">
        <name>RDAP Extensions Registry</name>
        <t>IANA is requested to register the following value in the RDAP
           Extensions Registry:</t>
        <dl newline="false" spacing="compact">
          <dt>Extension identifier:</dt>
          <dd>statusSet</dd>
          <dt>Registry operator:</dt>
          <dd>Any</dd>
          <dt>Published specification:</dt>
          <dd>This document.</dd>
          <dt>Contact:</dt>
      	  <dd>IETF &lt;iesg@ietf.org&gt;</dd>
          <dt>Intended usage:</dt>
      	  <dd>This extension identifies RDAP extension for status set information.</dd>
        </dl>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>Status set data may include legal and policy implications. Servers MUST ensure that disclosure of this information complies with applicable data protection laws and policies.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9083.xml"/>
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-regext-rdap-versioning.xml"/>
      </references>
      <references>
        <name>Informative References</name>
          <!-- 
          Add once draft-gould-regext-epp-status-set is posted 
          <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.gould-regext-epp-status-set.xml"/>
          --> 
      </references>
    </references>
  </back>
</rfc>
