RFC 8334

Launch Phase Mapping for the Extensible Provisioning Protocol (EPP)

πŸ“… published March 2018, from ietf

Launch Phase Mapping for the Extensible Provisioning Protocol (EPP) ✨

Okay bestie, let's get into it πŸ¦‹. This RFC is from the IETF, which is basically the group that writes the rulebook for how the Internet's protocols work. It's a Standards Track document, which means it's officially a real spec and not just a vibe. It's published as RFC 8334 and dated March 2018 πŸŽ€.

The authors are J. Gould (VeriSign, Inc.), W. Tan (Cloud Registry), and G. Brown (CentralNic Ltd) 🫢. They're all giving serious main character energy in the protocol world. The ISSN is 2070-1721, if you're into that kind of thing πŸ’….

This document doesn't obsolete or update any other RFCs, so it's a fresh start, no drama 🌈.

The whole point of this document is to describe an Extensible Provisioning Protocol (EPP) extension mapping for managing domain name registrations and applications during the launch of a domain name registry πŸš€. Basically, it's about how a brand-new registry handles the early rush of people trying to grab domain names πŸ’–.

Abstract

This document describes an Extensible Provisioning Protocol (EPP) extension mapping for the provisioning and management of domain name registrations and applications during the launch of a domain name registry.

Status of This Memo

This is an Internet Standards Track document, so it's the real deal ✨.

It's a product of the IETF and it represents the consensus of the IETF community 🫢. It got public review and was approved for publication by the Internet Engineering Steering Group (IESG). If you want more info on Internet Standards, check out Section 2 of RFC 7841 πŸ’œ.

For the current status, any errata, and feedback, head to https://www.rfc-editor.org/info/rfc8334 πŸ”₯.

Copyright (c) 2018 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. Please actually read these, because they spell out your rights and restrictions πŸ™ˆ. Code Components pulled out of this document must include Simplified BSD License text, as described in Section 4.e of the Trust Legal Provisions, and they come without warranty as described in the Simplified BSD License πŸ“.

Table of Contents

1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
  1.1.  Conventions Used in This Document . . . . . . . . . . . .   3
2.  Object Attributes . . . . . . . . . . . . . . . . . . . . . .   4
  2.1.  Application Identifier  . . . . . . . . . . . . . . . . .   4
  2.2.  Validator Identifier  . . . . . . . . . . . . . . . . . .   5
  2.3.  Launch Phases . . . . . . . . . . . . . . . . . . . . . .   5
    2.3.1.  Trademark Claims Phase  . . . . . . . . . . . . . . .   6
  2.4.  Status Values . . . . . . . . . . . . . . . . . . . . . .   9
    2.4.1.  State Transition  . . . . . . . . . . . . . . . . . .  11
  2.5.  Poll Messaging  . . . . . . . . . . . . . . . . . . . . .  12
  2.6.  Mark Validation Models  . . . . . . . . . . . . . . . . .  14
    2.6.1.  <launch:codeMark> Element . . . . . . . . . . . . . .  15
    2.6.2.  <mark:mark> Element . . . . . . . . . . . . . . . . .  16
    2.6.3.  Digital Signature . . . . . . . . . . . . . . . . . .  16
      2.6.3.1.  <smd:signedMark> Element  . . . . . . . . . . . .  16
      2.6.3.2.  <smd:encodedSignedMark> Element . . . . . . . . .  16
3.  EPP Command Mapping . . . . . . . . . . . . . . . . . . . . .  17
  3.1.  EPP <check> Command . . . . . . . . . . . . . . . . . . .  17
    3.1.1.  Claims Check Form . . . . . . . . . . . . . . . . . .  17
    3.1.2.  Availability Check Form . . . . . . . . . . . . . . .  22
    3.1.3.  Trademark Check Form  . . . . . . . . . . . . . . . .  23
  3.2.  EPP <info> Command  . . . . . . . . . . . . . . . . . . .  26
  3.3.  EPP <create> Command  . . . . . . . . . . . . . . . . . .  30
    3.3.1.  Sunrise Create Form . . . . . . . . . . . . . . . . .  30
    3.3.2.  Claims Create Form  . . . . . . . . . . . . . . . . .  36
    3.3.3.  General Create Form . . . . . . . . . . . . . . . . .  39
    3.3.4.  Mixed Create Form . . . . . . . . . . . . . . . . . .  40
    3.3.5.  Create Response . . . . . . . . . . . . . . . . . . .  42
  3.4.  EPP <update> Command  . . . . . . . . . . . . . . . . . .  43
  3.5.  EPP <delete> Command  . . . . . . . . . . . . . . . . . .  44
  3.6.  EPP <renew> Command . . . . . . . . . . . . . . . . . . .  46
  3.7.  EPP <transfer> Command  . . . . . . . . . . . . . . . . .  46
4.  Formal Syntax . . . . . . . . . . . . . . . . . . . . . . . .  46
  4.1.  Launch Schema . . . . . . . . . . . . . . . . . . . . . .  46
5.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  54
  5.1.  XML Namespace . . . . . . . . . . . . . . . . . . . . . .  54
  5.2.  EPP Extension Registry  . . . . . . . . . . . . . . . . .  55
6.  Security Considerations . . . . . . . . . . . . . . . . . . .  55
7.  References  . . . . . . . . . . . . . . . . . . . . . . . . .  56
  7.1.  Normative References  . . . . . . . . . . . . . . . . . .  56
  7.2.  Informative References  . . . . . . . . . . . . . . . . .  57
Acknowledgements  . . . . . . . . . . . . . . . . . . . . . . . .  57
Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  58

1. Introduction 🌸

This document describes an extension mapping for version 1.0 of the Extensible Provisioning Protocol (EPP) [RFC5730] 🧚. This EPP mapping gives you a flexible schema that can handle several common use cases for provisioning and managing domain name registrations and applications during the launch of a domain name registry. Slay πŸ‘‘.

Registries usually run in special modes when they first start up, so they can hand out domain names in a fair way, often with special rules πŸŽ€. This document uses the term "launch phase" (or just "launch") for that kind of period. A registry can have multiple launch phases and multiple models to make its launch happen. The server policy decides what's supported and validated πŸ’…. The server policy usually gets communicated through an out-of-band mechanism, which this document doesn't specify πŸ™ˆ.

The EPP domain name mapping [RFC5731] is built for the steady-state operation of a registry πŸ¦‹. During a launch, the model might be totally different from what that mapping defines 😭. For example, registries often accept multiple applications for the same domain name during the "sunrise" launch phase, and those are called Launch Applications πŸ”₯. A Launch Registration is a registration made during a launch phase when the server uses a "first-come, first-served" model πŸ’–. Even with "first-come, first-served," extra steps and info might still be needed, like trademark info ✨. Also, RFC 7848 [RFC7848] defines a registry interface for the Trademark Claims (or "claims") launch phase, which includes presenting a Trademark Claims Notice to the registrant 🫢. This document proposes an extension to the domain name mapping so there's one uniform interface for managing Launch Applications and Launch Registrations during launch phases 🌈.

1.1. Conventions Used in This Document

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 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here πŸ’œ.

XML [W3C.REC-xml11-20060816] is case sensitive πŸ™ˆ. Unless it says otherwise, XML specs and examples in this document MUST be interpreted in the character case presented, so you can build a conforming implementation πŸ’….

In examples, "C:" means lines sent by a protocol client and "S:" means lines returned by a protocol server πŸ“. Indentation and whitespace in examples are only there to show how elements relate, and they are not a REQUIRED feature of this protocol ✨. The "..." is shorthand for elements defined outside this document 🧚.

A Launch Registration is a domain name registration during a launch phase when the server uses a "first-come, first-served" model. Only a single registration for a domain name can exist on the server at a time πŸ¦‹.

A Launch Application represents the intent to register a domain name during a launch phase when the server accepts multiple applications for a domain name, and the server later picks one of those applications to allocate as a registration. Many Launch Applications for a domain name can exist on the server at a time πŸ”₯.

The XML namespace prefix "launch" is used for the namespace "urn:ietf:params:xml:ns:launch-1.0", but implementations MUST NOT depend on it. Instead, they employ a proper namespace-aware XML parser and serializer to interpret and output the XML documents πŸŽ€.

The XML namespace prefix "smd" is used for the namespace "urn:ietf:params:xml:ns:signedMark-1.0" [RFC7848], but implementations MUST NOT depend on it. Instead, they employ a proper namespace-aware XML parser and serializer to interpret and output the XML documents 🌈.

The XML namespace prefix "mark" is used for the namespace "urn:ietf:params:xml:ns:mark-1.0" [RFC7848], but implementations MUST NOT depend on it. Instead, they employ a proper namespace-aware XML parser and serializer to interpret and output the XML documents πŸ’–.

2. Object Attributes ⭐

This extension adds extra elements to the EPP domain name mapping [RFC5731]. Only those new elements get described here πŸ’….

2.1. Application Identifier πŸ¦‹

Servers MAY allow multiple applications, called a Launch Application, for the same domain name during its launch phase operations 🌸. When a server gets a valid <domain:create> command to create a Launch Application, it MUST create an application object for that request, assign an application identifier to the Launch Application, set the pendingCreate status [RFC5731], and send the application identifier back to the client in the <launch:applicationID> element 😭. To keep everything correlated, every later launch operation on the Launch Application MUST be qualified by that previously assigned application identifier, using the <launch:applicationID> element 🫢.


Part 1 of 10. Keep your seatbelts on, bestie, more is coming πŸš€πŸ’œ

2.2. Validator Identifier ✨

Okay so the Validator Identifier is unique to the server πŸ’… It's the ID for a Trademark Validator, which checks marks and keeps its own repository of validated marks. The OPTIONAL "validatorID" attribute is how you define the Validator Identifier of the Trademark Validator. Registries MAY support more than one third-party Trademark Validator. Which set of Validator Identifier values the server supports is up to server policy. The Internet Corporation for Assigned Names and Numbers (ICANN) Trademark Clearinghouse (TMCH) is the default Trademark Validator, and it's reserved for the Validator Identifier of "tmch" πŸ‘‘ If the ICANN TMCH isn't used, or multiple Trademark Validators are used, the Validator Identifier MUST be defined using the "validatorID" attribute.

The Validator Identifier MAY be related to one or more issuer identifiers of the <mark:id> and <smd:id> elements defined in [RFC7848]. Both the Validator Identifier and the Issuer Identifier used MUST be unique in the server. If the ICANN TMCH is not used or multiple Trademark Validators are used, the server MUST define the list of supported validator identifiers and MUST make this information available to clients using a mutually acceptable, out-of-band mechanism. 🫢

The Validator Identifier may define a non-Trademark Validator that supports a form of claims, where claims and a Validator Identifier can be used for purposes beyond trademarks. 🌈

2.3. Launch Phases πŸš€

The server MAY support multiple launch phases, either sequentially or simultaneously. The <launch:phase> element MUST be included by the client to define the target launch phase of the command. The server SHOULD validate the phase, and it MAY validate the sub-phase of the <launch:phase> element against the active phase and OPTIONAL sub-phase of the server. If there's a mismatch, it returns an EPP error result code of 2306 [RFC5730]. πŸ™ˆ

These are the launch phase values that are defined:

  • sunrise: The phase during which trademark holders can submit registrations or applications with trademark information that can be validated by the server. 🌸
  • landrush: A post-"sunrise" launch phase when non-trademark holders are allowed to register domain names, with steps taken to address a large volume of initial registrations. πŸ“
  • claims: The phase, as defined in Section 2.3.1, in which a claims notice must be displayed to a prospective registrant of a domain name that matches trademarks. πŸŽ€
  • open: A phase that is also referred to as "steady state". Servers may require additional trademark protection during this phase. πŸ¦‹
  • custom: A custom server launch phase that is defined using the "name" attribute. ✨

For extensibility, the <launch:phase> element includes an OPTIONAL "name" attribute that can define a sub-phase, or the full name of the phase when the <launch:phase> element has the "custom" value. For example, the "claims" launch phase could have two sub-phases, "landrush" and "open". 🧚

Launch phases MAY overlap to support the "claims" launch phase, defined in Section 2.3.1, and to support a traditional "landrush" launch phase. The overlap of the "claims" and "landrush" launch phases SHOULD be handled by setting "claims" as the <launch:phase> value and setting "landrush" as the sub-phase with the "name" attribute. For example, the <launch:phase> element should be <launch:phase name="landrush">claims</launch:phase>. πŸ’œ

2.3.1. Trademark Claims Phase

The Trademark Claims Phase is when a claims notice must be displayed to a prospective registrant of a domain name that matches trademarks. Check [ICANN-TMCH] for the extra details of trademark claims handling. The source of the trademarks is a Trademark Validator, and the source of the claims notice information is a Claims Notice Information Service (CNIS), which may be directly linked to a Trademark Validator. The client talks to 1) the server to find out if a trademark exists for a domain name, 2) a CNIS to get the claims notice information, and 3) the server again to pass the claims notice acceptance information in a create command. This document supports the Trademark Claims Phase in two ways, including:

  • Claims Check Form: Defined in Section 3.1.1, this is used to determine whether or not there are any matching trademarks for a domain name. If at least one matching trademark exists for the domain name, a claims key is returned. The mapping of domain names and claims keys is based on an out-of-band interface between the server and the Trademark Validator. The CNIS associated with the claims key Validator Identifier (Section 2.2) MUST accept the claims key as the basis for retrieving the claims information. πŸ”
  • Claims Create Form: Defined in Section 3.3.2, this is used to pass the claims notice acceptance information in a create command. The notice identifier (<launch:noticeID>) format, validation rules, and server processing are up to the interface between the server and the Trademark Validator. The CNIS associated with the Validator Identifier (Section 2.2) MUST generate a notice identifier compliant with the <launch:noticeID> element. πŸ“

Here's the Trademark Claims Phase registration flow, bestie πŸ‘€

 .------------.     .--------.                   .--------.  .------.
 | Registrant |     | Client |                   | Server |  | CNIS |
 '------------'     '--------'                   '--------'  '------'
        | Request Domain |                            |          |
        |   Registration |                            |          |
        |--------------->| Domain Check               |          |
        |                |--------------------------->|          |
        | Domain         | Domain Unavailable   .------------.   |
        |   Unavailable  |<---------------------( Available? )   |
        |<---------------|                  No  '------------'   |
        |                | Domain Available           | Yes      |
        |                |<---------------------------|          |
        |                | Domain Claims Check        |          |
        |                |--------------------------->|          |
        |                |                       .---------.     |
        |                | Claims Don't Exist   /    Does   \    |
        |                |<--------------------( Domain have )   |
        |                |                   No \  Claims?  /    |
        |                |                       '---------'     |
        |                | Domain Create              |  | Yes   |
        |                |--------------------------->|  |       |
        | Domain         | Domain Registered          |  |       |
        |   Registered   |<---------------------------|  |       |
        |<---------------|                               |       |
        |                                                |       |
        |                | Claims Exist with Claims Keys |       |
        |                |<------------------------------'       |
        |                |                                       |
.-----. |                | Request Claims Info with Claims Key   |
|Abort| | Display        |-------------------------------------->|
'-----' | Claims         | Return Claims Info                    |
 ^      | Notice         |<--------------------------------------|
 | No   |<---------------|                                       |
 |  .------.  Yes        |                                       |
 '-(  Ack?  )----------->| Domain Claims Create Form  |          |
    '------'             |--------------------------->|          |
        | Registration   | Error       .----------------------.  |
        |   Error        |<-----------( Validation Successful? ) |
        |<---------------|          No '----------------------'  |
        |                |                            | Yes      |
        | Domain         | Domain Registered          |          |
        |   Registered   |<---------------------------|          |
        |<---------------|                            |          |

                              Figure 1

2.4. Status Values πŸŽ€

A Launch Application or Launch Registration object MAY have a launch status value. The <launch:status> element is used to convey the launch status pertaining to the object, beyond what is specified in the object mapping. A Launch Application or Launch Registration MUST set the "pendingCreate" status [RFC5731] if a launch status is supported and is not one of the final statuses ("allocated" and "rejected"). πŸ’…

These status values are defined using the required "s" attribute:

  • pendingValidation: The initial state of a newly created application or registration object. The application or registration requires validation, but the validation process has not yet completed. ⏳
  • validated: The application or registration meets relevant registry rules. βœ…
  • invalid: The application or registration does not validate according to registry rules. Server policies permitting, it may transition back into "pendingValidation" for revalidation, after modifications are made to ostensibly correct the attributes that caused the validation failure. πŸ™ƒ
  • pendingAllocation: The allocation of the application or registration is pending based on the results of some out-of-band process (for example, an auction). πŸ”¨
  • allocated: The object corresponding to the application or registration has been provisioned. This is a possible end state of an application or registration object. πŸ‘‘
  • rejected: The application or registration object was not provisioned. This is a possible end state of an application or registration object. πŸ’€
  • custom: A custom status that is defined using the "name" attribute. ✨

Each status value MAY be accompanied by a string of human-readable text that describes the rationale for the status applied to the object. The OPTIONAL "lang" attribute, as defined in [RFC5646], MAY be present to identify the language if the negotiated value is something other than the default value of "en" (English). 🌍

For extensibility, the <launch:status> element includes an OPTIONAL "name" attribute that can define a sub-status, or the full name of the status when the status value is "custom". The server SHOULD use one of the non-"custom" status values. 🧠

Status values MAY be skipped. For example, an application or registration MAY immediately start at the "allocated" status, or an application or registration MAY skip the "pendingAllocation" status. If the launch phase does not require validation of a request, an application or registration MAY immediately skip to "pendingAllocation". πŸ¦‹

2.4.1. State Transition ✨

okay so the way statuses hop between each other is totally up to server policy πŸ’… this diagram is just ONE possible set of allowed moves, not the only vibe.

                   | request
                   |
                   |     +--------------------------+
                   |     |                          |
                   v     v                          |
         +-------------------+                      |
         |                   |                      |
         | pendingValidation +--------------+       |
         |                   |              |       |
         +---------+---------+              |       |
                   |                        |       |
                   |                        |       |
                   v                        v       |
             +-----------+             +---------+  |
             |           |             |         |  |
             | validated |             | invalid +--+
             |           |             |         |
             +-----+-----+             +----+----+
                   |                        |
                   |                        |
                   v                        |
         +-------------------+              |
         |                   |              |
         | pendingAllocation +-----------+  |
         |                   |           |  |
         +---------+---------+           |  |
                   |                     |  |
                   |                     |  |
                   |                     |  |
                   |                     |  |
                   |                     |  |
                   v                     v  v
              +---------+             +--------+
             /           \           /          \
             | allocated |           | rejected |
             \           /           \          /
              +---------+             +--------+


                              Figure 2

2.5. Poll Messaging πŸ“¬

okay bestie, a Launch Application MUST be handled as an EPP domain name object as specified in RFC 5731 [RFC5731], using the "pendingCreate" status and the launch status values from Section 2.4. A Launch Registration MAY be handled the same way, as an EPP domain name object from RFC 5731 [RFC5731], with the "pendingCreate" status and those same launch status values from Section 2.4. πŸŽ€

as a Launch Application or Launch Registration moves between the status values in Section 2.4, the server SHOULD insert poll messages per [RFC5730] for the in-between statuses, like "pendingValidation", "validated", "pendingAllocation", and "invalid". these use the <domain:infData> element with the <launch:infData> extension 🧚 the <domain:infData> element MAY contain non-mandatory info, like contact and name server details. extensions that would normally show up in a <domain:info> response (per [RFC5731]) MAY be included too πŸ’œ

for the final statuses, "allocated" and "rejected", the server MUST insert a <domain:panData> poll message per [RFC5731], with the <launch:infData> extension πŸ”₯

here's an example poll message for a Launch Application that just moved to "pendingAllocation" πŸ‘‘

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1301">
S:      <msg>Command completed successfully; ack to dequeue</msg>
S:    </result>
S:    <msgQ count="5" id="12345">
S:      <qDate>2013-04-04T22:01:00.0Z</qDate>
S:      <msg>Application pendingAllocation.</msg>
S:    </msgQ>
S:    <resData>
S:      <domain:infData
S:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
S:        <domain:name>domain.example</domain:name>
S:        ...
S:      </domain:infData>
S:    </resData>
S:    <extension>
S:      <launch:infData
S:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:        <launch:phase>sunrise</launch:phase>
S:        <launch:applicationID>abc123</launch:applicationID>
S:        <launch:status s="pendingAllocation"/>
S:      </launch:infData>
S:    </extension>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54322-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

next up is an example <domain:panData> poll message for an "allocated" Launch Application πŸ¦‹

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1301">
S:      <msg>Command completed successfully; ack to dequeue</msg>
S:    </result>
S:    <msgQ count="5" id="12345">
S:      <qDate>2013-04-04T22:01:00.0Z</qDate>
S:      <msg>Application successfully allocated.</msg>
S:    </msgQ>
S:    <resData>
S:      <domain:panData
S:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
S:        <domain:name paResult="1">domain.example</domain:name>
S:        <domain:paTRID>
S:          <clTRID>ABC-12345</clTRID>
S:          <svTRID>54321-XYZ</svTRID>
S:        </domain:paTRID>
S:        <domain:paDate>2013-04-04T22:00:00.0Z</domain:paDate>
S:      </domain:panData>
S:    </resData>
S:    <extension>
S:      <launch:infData
S:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:        <launch:phase>sunrise</launch:phase>
S:        <launch:applicationID>abc123</launch:applicationID>
S:        <launch:status s="allocated"/>
S:      </launch:infData>
S:    </extension>
S:    <trID>
S:      <clTRID>BCD-23456</clTRID>
S:      <svTRID>65432-WXY</svTRID>
S:    </trID>
S:  </response>
S:</epp>

and now the same kind of <domain:panData> poll message, but for an "allocated" Launch Registration 🌸

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1301">
S:      <msg>Command completed successfully; ack to dequeue</msg>
S:    </result>
S:    <msgQ count="5" id="12345">
S:      <qDate>2013-04-04T22:01:00.0Z</qDate>
S:      <msg>Registration successfully allocated.</msg>
S:    </msgQ>
S:    <resData>
S:      <domain:panData
S:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
S:        <domain:name paResult="1">domain.example</domain:name>
S:        <domain:paTRID>
S:          <clTRID>ABC-12345</clTRID>
S:          <svTRID>54321-XYZ</svTRID>
S:        </domain:paTRID>
S:        <domain:paDate>2013-04-04T22:00:00.0Z</domain:paDate>
S:      </domain:panData>
S:    </resData>
S:    <extension>
S:      <launch:infData
S:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:        <launch:phase>sunrise</launch:phase>
S:        <launch:status s="allocated"/>
S:      </launch:infData>
S:    </extension>
S:    <trID>
S:      <clTRID>BCD-23456</clTRID>
S:      <svTRID>65432-WXY</svTRID>
S:    </trID>
S:  </response>
S:</epp>

2.6. Mark Validation Models πŸ”

bestie, a server MUST support at least one of these models for validating trademark info:

  • code: just a mark code by itself, used to check that the mark matches the domain name. This model uses the <launch:codeMark> element with only the <launch:code> element inside.
  • mark: the mark info gets passed in with no other validation element. The server runs its own custom validation to confirm the mark info is authentic. This model uses the <launch:codeMark> element with only the <mark:mark> (Section 2.6.2) element inside.
  • code with mark: a code and the mark info are used together, and the server checks them with an external party. The code is a kind of secret that matches the mark info that was passed. This model uses the <launch:codeMark> element containing BOTH the <launch:code> and <mark:mark> (Section 2.6.2) elements.
  • signed mark: the mark info is digitally signed, as described in the Digital Signature section (Section 2.6.3). The server can directly validate the signature using the public key of the external party who made the signed mark with its private key. This model uses the <smd:signedMark> (Section 2.6.3.1) and <smd:encodedSignedMark> (Section 2.6.3.2) elements.

more than one <launch:codeMark>, <smd:signedMark> (Section 2.6.3.1), or <smd:encodedSignedMark> (Section 2.6.3.2) element MAY be specified. how many marks a domain name can have is up to server policy 🌈

2.6.1. <launch:codeMark> Element πŸ“

the <launch:codeMark> element is used by the "code", "mark", and "code with mark" validation models, and it has these child elements:

  • <launch:code>: OPTIONAL mark code used to validate the <mark:mark> (Section 2.6.2) info. The mark code is a mark-specific secret that the server can verify against a third party. The OPTIONAL "validatorID" attribute is the Validator Identifier (Section 2.2), and its value shows which Trademark Validator the code came from. It has no default value.
  • <mark:mark>: OPTIONAL mark info, with child elements defined in the Mark section (Section 2.6.2).

here's an example <launch:codeMark> element with both a <launch:code> and a <mark:mark> (Section 2.6.2) element πŸ’–

<launch:codeMark>
  <launch:code validatorID="sample">
    49FD46E6C4B45C55D4AC</launch:code>
  <mark:mark xmlns:mark="urn:ietf:params:xml:ns:mark-1.0">
    ...
  </mark:mark>
</launch:codeMark>

2.6.2. <mark:mark> Element πŸ’œ

a <mark:mark> element describes an applicant's prior right to a given domain name. it's used with the "mark", "mark with code", and "signed mark" validation models. the <mark:mark> element is defined in [RFC7848]. a new mark format can be supported by making a new XML schema for the mark, with an element that substitutes for the <mark:abstractMark> element from [RFC7848] ✨

2.6.3. Digital Signature πŸ¦‹

digital signatures MAY be used by the server to validate the mark info when using the "signed mark" validation model with the <smd:signedMark> (Section 2.6.3.1) and <smd:encodedSignedMark> (Section 2.6.3.2) elements. when digital signatures are used, the server MUST validate the digital signature πŸ”₯

2.6.3.1. <smd:signedMark> Element πŸŽ€

the <smd:signedMark> element contains the digitally signed mark info. it is defined in [RFC7848]. a new signed mark format can be supported by making a new XML schema for the signed mark, with an element that substitutes for the <smd:abstractSignedMark> element from [RFC7848] 🧚

2.6.3.2. <smd:encodedSignedMark> Element 🫢

the <smd:encodedSignedMark> element contains an encoded form of the digitally signed <smd:signedMark> (Section 2.6.3.1) element. it is defined in [RFC7848]. a new encoded signed mark format can be supported by making a new XML schema for the encoded signed mark, with an element that substitutes for the <smd:encodedSignedMark> element from [RFC7848] πŸ‘‘

3. EPP Command Mapping ✨

okay so bestie, the full EPP syntax and semantics live in the EPP core protocol spec [RFC5730] πŸ’… These command mappings are specifically for the Launch Phase Extension πŸš€

This mapping is built to be flexible, so it only asks for a minimum set of required elements 🧚 It's meant to serve a bunch of use cases, but it doesn't prescribe any interpretation by the client or server. That processing is super policy dependent, so it's specific to each implementation πŸ™ˆ

Operations on application objects happen through one or more of the existing EPP commands from the EPP domain name mapping [RFC5731]. Registries MAY choose to support a subset of the operations πŸŽ€

3.1. EPP <check> Command

there are three forms of the extension to the EPP <check> command, and they're giving variety πŸ¦‹ The Claims Check Form (Section 3.1.1), the Availability Check Form (Section 3.1.2), and the Trademark Check Form (Section 3.1.3). The <launch:check> element's "type" attribute picks the form: "claims" for the Claims Check Form (Section 3.1.1), "avail" for the Availability Check Form (Section 3.1.2), and "trademark" for the Trademark Check Form (Section 3.1.3). If you don't set it, the default is "claims" πŸ’œ Which forms the server supports is decided by server policy. If the server gets a check form it doesn't support, it MUST return an EPP error result code of 2307 [RFC5730] πŸ’€

3.1.1. Claims Check Form

the Claims Check Form defines a brand new command called the Claims Check Command πŸ” It figures out whether there are any matching trademarks in the launch phase you name, for each domain name in the command, that need the "Claims Create Form" on a Domain Create Command. The availability check info from the EPP domain name mapping [RFC5731] MUST NOT be returned for the Claims Check Command, so no availability vibes here πŸ™…β€β™€οΈ This is the default form, and the client MAY explicitly pick it by setting the <launch:check> "type" attribute to "claims" 🌸

Instead of saying whether a domain is available, the Claims Check Command tells you whether at least one matching trademark exists for the domain name, which means the "Claims Create Form" is needed on a Domain Create Command. If there's at least one matching trademark, a <launch:claimKey> element gets returned πŸ—οΈ The client MAY then use that <launch:claimKey> value to grab the info it needs to generate the Trademark Claims Notice from the Trademark Validator, based on the Validator Identifier (Section 2.2). And the unique notice identifier of the Trademark Claims Notice MUST be passed in the <launch:noticeID> element of the extension to the Create Command (Section 3.3) ✨

The <domain:name> elements in the EPP <check> command of the EPP domain name mapping [RFC5731] define which domain names get checked for matching trademarks. The <launch:check> element has this child element:

  • <launch:phase>: contains the value of the server's active launch phase. The server SHOULD validate the value according to Section 2.3 πŸ”Ž

Here's an example Claims Check Command using the <check> domain command and the <launch:check> extension, with "type" explicitly set to "claims". It's checking whether "domain1.example", "domain2.example", and "domain3.example" need claims notices during the "claims" launch phase 🧚

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:   <check>
C:    <domain:check
C:     xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:      <domain:name>domain1.example</domain:name>
C:      <domain:name>domain2.example</domain:name>
C:      <domain:name>domain3.example</domain:name>
C:    </domain:check>
C:   </check>
C:   <extension>
C:    <launch:check
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:     type="claims">
C:      <launch:phase>claims</launch:phase>
C:    </launch:check>
C:   </extension>
C:   <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

If the <check> command gets processed successfully, the EPP <response> MUST contain an <extension> <launch:chkData> element that identifies the launch namespace πŸŽ‰ The <launch:chkData> element has these child elements:

  • <launch:phase>: the phase, mirroring the <launch:phase> element included in the <launch:check> 🌈
  • <launch:cd>: one or more <launch:cd> elements, each containing these child elements:
    • <launch:name>: contains the fully qualified name of the queried domain name. This element MUST contain an "exists" attribute whose value shows whether a matching trademark exists for the domain name that needs the "Claims Create Form" on a Domain Create Command. A value of "1" (or "true") means a matching trademark does exist and the "Claims Create Form" is required on a Domain Create Command. A value of "0" (or "false") means a matching trademark does not exist, or that the "Claims Create Form" is NOT required on a Domain Create Command πŸ™Œ
    • <launch:claimKey>: zero or more OPTIONAL claim keys that MAY be passed to a third-party Trademark Validator, such as the ICANN TMCH, to query the info needed to generate a Trademark Claims Notice. The <launch:claimKey> is used as the key for the query in place of the domain name, so the service gets queried securely without using a well-known value like a domain name πŸ” The OPTIONAL "validatorID" attribute is the Validator Identifier (Section 2.2) that says which Trademark Validator to query for the claims notice info. The default is the ICANN TMCH. The "validatorID" attribute MAY reference a non-trademark claims clearinghouse identifier to support other forms of claims notices πŸ¦‹

Here's an example Claims Check response for a domain where a claims notice in the "claims" launch phase is NOT required for domain1.example, is required for domain2.example in the "tmch", and is required for domain3.example in both the "tmch" and "custom-tmch" πŸ‘‘

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1000">
S:     <msg>Command completed successfully</msg>
S:    </result>
S:    <extension>
S:     <launch:chkData
S:      xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:      <launch:phase>claims</launch:phase>
S:      <launch:cd>
S:        <launch:name exists="0">domain1.example</launch:name>
S:      </launch:cd>
S:      <launch:cd>
S:        <launch:name exists="1">domain2.example</launch:name>
S:        <launch:claimKey validatorID="tmch">
S:        2013041500/2/6/9/rJ1NrDO92vDsAzf7EQzgjX4R0000000001
S:        </launch:claimKey>
S:      </launch:cd>
S:      <launch:cd>
S:        <launch:name exists="1">domain3.example</launch:name>
S:        <launch:claimKey validatorID="tmch">
S:        2013041500/2/6/9/rJ1NrDO92vDsAzf7EQzgjX4R0000000001
S:        </launch:claimKey>
S:        <launch:claimKey validatorID="custom-tmch">
S:        20140423200/1/2/3/rJ1Nr2vDsAzasdff7EasdfgjX4R000000002
S:        </launch:claimKey>
S:      </launch:cd>
S:     </launch:chkData>
S:    </extension>
S:    <trID>
S:     <clTRID>ABC-12345</clTRID>
S:     <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

3.1.2. Availability Check Form

the Availability Check Form adds extra elements to the EPP <check> command from the EPP domain name mapping [RFC5731] πŸ¦„ No extra elements are defined for the EPP <check> response, so this one's chill. This form MUST be identified by setting the <launch:check> "type" attribute to "avail" βœ…

The EPP <check> command is used to figure out whether an object can be provisioned in a repository. Domain names can only be made available in unique launch phases, and they stay unavailable during concurrent launch phases πŸ•°οΈ On top of the elements in <domain:check>, the command gets extended with a <launch:check> element that has this child element:

  • <launch:phase>: the launch phase you want to determine availability for. The server SHOULD validate the value and return an EPP error result code of 2306 [RFC5730] if it's invalid 🚨

Here's an example Availability Check Form Command using the <check> domain command and the <launch:check> extension, with "type" set to "avail". It checks the availability of two domain names in the "idn-release" custom launch phase 🌷

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:   <check>
C:    <domain:check
C:     xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:      <domain:name>domain1.example</domain:name>
C:      <domain:name>domain2.example</domain:name>
C:    </domain:check>
C:   </check>
C:   <extension>
C:    <launch:check
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:     type="avail">
C:      <launch:phase name="idn-release">custom</launch:phase>
C:    </launch:check>
C:   </extension>
C:   <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

The Availability Check Form doesn't define any extension to the response of a <check> domain command 🫢 After processing the command, the server replies with a standard EPP response, as defined in the EPP domain name mapping [RFC5731] πŸ’–

3.1.3. Trademark Check Form

okay so the Trademark Check Form defines a brand new command called the Trademark Check Command πŸ’… Its whole job is to figure out whether there are any matching trademarks for each domain name you pass in, no matter what launch phase the server is in or whether the "Claims Create Form" is needed on a Domain Create Command πŸ¦‹ The availability check info from the EPP domain name mapping [RFC5731] MUST NOT be returned for the Trademark Check Command πŸ’€ This form MUST be identified by setting the <launch:check> "type" attribute to "trademark" πŸŽ€

Instead of telling you whether the domain is available, this command tells you whether at least one matching trademark exists for the domain name 🌸 If there's at least one, a <launch:claimKey> element comes back. The client MAY then use that value to get Trademark Claims Notice information from the Trademark Validator, based on the Validator Identifier (Section 2.2) 🫢

The <domain:name> elements in the EPP <check> command of EPP domain name mapping [RFC5731] are the domain names being checked for matching trademarks. The <launch:check> element does not contain any child elements with the "Trademark Check Form":

The following is an example Trademark Check Command using the <check> domain command and the <launch:check> extension with "type" set to "trademark", to see if "domain1.example", "domain2.example", and "domain3.example" have any matching trademarks πŸ”

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:   <check>
C:    <domain:check
C:     xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:      <domain:name>domain1.example</domain:name>
C:      <domain:name>domain2.example</domain:name>
C:      <domain:name>domain3.example</domain:name>
C:    </domain:check>
C:   </check>
C:   <extension>
C:    <launch:check
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:     type="trademark"/>
C:   </extension>
C:   <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

If the <check> command has been processed successfully, the EPP <response> MUST contain an <extension> <launch:chkData> element that identifies the launch namespace. The <launch:chkData> element contains the following child elements:

  • <launch:cd>: One or more <launch:cd> elements that contain the following child elements:
    • <launch:name>: Contains the fully qualified name of the queried domain name. This element MUST contain an "exists" attribute whose value indicates if a matching trademark exists for the domain name. A value of "1" (or "true") means that a matching trademark does exist. A value of "0" (or "false") means that a matching trademark does not exist.
    • <launch:claimKey>: Zero or more OPTIONAL claim keys that MAY be passed to a third-party Trademark Validator such as the ICANN TMCH for querying the information needed to generate a Trademark Claims Notice. The <launch:claimKey> is used as the key for the query in place of the domain name to securely query the service without using a well-known value like a domain name. The OPTIONAL "validatorID" attribute is the Validator Identifier (Section 2.2) whose value indicates which Trademark Validator to query for the claims notice information, with the default being the ICANN TMCH. The "validatorID" attribute MAY reference a non-trademark claims clearinghouse identifier to support other forms of claims notices.

The following is an example Trademark Check response for the "claims" launch phase when no matching trademarks are found for the domain name domain1.example, matching trademarks are found for the domain name domain2.example in the "tmch", and matching trademarks are found for domain name domain3.example in the "tmch" and "custom-tmch" 🧚

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1000">
S:     <msg>Command completed successfully</msg>
S:    </result>
S:    <extension>
S:     <launch:chkData
S:      xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:      <launch:cd>
S:        <launch:name exists="0">domain1.example</launch:name>
S:      </launch:cd>
S:      <launch:cd>
S:        <launch:name exists="1">domain2.example</launch:name>
S:        <launch:claimKey validatorID="tmch">
S:        2013041500/2/6/9/rJ1NrDO92vDsAzf7EQzgjX4R0000000001
S:        </launch:claimKey>
S:      </launch:cd>
S:      <launch:cd>
S:        <launch:name exists="1">domain3.example</launch:name>
S:        <launch:claimKey validatorID="tmch">
S:        2013041500/2/6/9/rJ1NrDO92vDsAzf7EQzgjX4R0000000001
S:        </launch:claimKey>
S:        <launch:claimKey validatorID="custom-tmch">
S:        20140423200/1/2/3/rJ1Nr2vDsAzasdff7EasdfgjX4R000000002
S:        </launch:claimKey>
S:      </launch:cd>
S:     </launch:chkData>
S:    </extension>
S:    <trID>
S:     <clTRID>ABC-12345</clTRID>
S:     <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

3.2. EPP <info> Command

This extension adds extra elements to the EPP <info> command and response, to be used together with the EPP domain name mapping [RFC5731] ✨

The EPP <info> command is used to retrieve information for a Launch Registration or Launch Application πŸ“‹ The Application Identifier (Section 2.1) returned in the <launch:creData> element of the create response (Section 3.3) can be used to retrieve information for a Launch Application. A <launch:info> element is sent along with the regular <info> domain command. The <launch:info> element includes an OPTIONAL "includeMark" boolean attribute, with a default value of "false", to indicate whether or not to include the mark in the response. The <launch:info> element contains the following child elements:

  • <launch:phase>: The phase during which the application or registration was submitted or is associated with. Server policy defines the phases that are supported. The server SHOULD validate the value and return an EPP error result code of 2306 [RFC5730] if it is invalid.
  • <launch:applicationID>: OPTIONAL application identifier of the Launch Application.

The following is an example <info> domain command with the <launch:info> extension to retrieve information for the sunrise application for domain.example and application identifier "abc123" 🌈

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:   <info>
C:    <domain:info
C:     xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:      <domain:name>domain.example</domain:name>
C:    </domain:info>
C:   </info>
C:   <extension>
C:    <launch:info
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:       includeMark="true">
C:      <launch:phase>sunrise</launch:phase>
C:      <launch:applicationID>abc123</launch:applicationID>
C:    </launch:info>
C:   </extension>
C:   <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

The following is an example <info> domain command with the <launch:info> extension to retrieve information for the sunrise registration for domain.example πŸ¦‹

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:   <info>
C:    <domain:info
C:     xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:      <domain:name>domain.example</domain:name>
C:    </domain:info>
C:   </info>
C:   <extension>
C:    <launch:info
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:      <launch:phase>sunrise</launch:phase>
C:    </launch:info>
C:   </extension>
C:   <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

If the query was successful, the server replies with a <launch:infData> element along with the regular EPP <resData>. The <launch:infData> contains the following child elements:

  • <launch:phase>: The phase during which the application was submitted or is associated with, matching the <launch:phase> of the associated <info> command.
  • <launch:applicationID>: OPTIONAL Application Identifier of the Launch Application.
  • <launch:status>: OPTIONAL status of the Launch Application using one of the supported status values (Section 2.4).
  • <mark:mark>: Zero or more <mark:mark> (Section 2.6.2) elements only if the "includeMark" attribute is "true" in the command.

The following is an example <info> domain response using the <launch:infData> extension with the mark information πŸ’œ

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1000">
S:      <msg>Command completed successfully</msg>
S:    </result>
S:    <resData>
S:      <domain:infData
S:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
S:        <domain:name>domain.example</domain:name>
S:        <domain:roid>EXAMPLE1-REP</domain:roid>
S:        <domain:status s="pendingCreate"/>
S:        <domain:registrant>jd1234</domain:registrant>
S:        <domain:contact type="admin">sh8013</domain:contact>
S:        <domain:contact type="tech">sh8013</domain:contact>
S:        <domain:clID>ClientX</domain:clID>
S:        <domain:crID>ClientY</domain:crID>
S:        <domain:crDate>2012-04-03T22:00:00.0Z</domain:crDate>
S:        <domain:authInfo>
S:          <domain:pw>2fooBAR</domain:pw>
S:        </domain:authInfo>
S:      </domain:infData>
S:    </resData>
S:    <extension>
S:      <launch:infData
S:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:        <launch:phase>sunrise</launch:phase>
S:          <launch:applicationID>abc123</launch:applicationID>
S:          <launch:status s="pendingValidation"/>
S:          <mark:mark
S:            xmlns:mark="urn:ietf:params:xml:ns:mark-1.0">
S:             ...
S:         </mark:mark>
S:      </launch:infData>
S:    </extension>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

3.3. EPP <create> Command ✨

Okay bestie, the EPP <create> command comes in four forms πŸ’–: the Sunrise Create Form (Section 3.3.1), the Claims Create Form (Section 3.3.2), the General Create Form (Section 3.3.3), and the Mixed Create Form (Section 3.3.4). Which one you use depends on the launch phases (Section 2.3) the server supports. Here's the breakdown πŸŽ€

  • sunrise: The EPP <create> command in the "sunrise" launch phase submits a registration with trademark info that the server can verify against the <domain:name> value. The Sunrise Create Form (Section 3.3.1) is used for the "sunrise" launch phase. 🌸
  • landrush: The EPP <create> command in the "landrush" launch phase MAY use the General Create Form (Section 3.3.3) to explicitly specify the phase and optionally define the expected type of object to create. πŸ¦‹
  • claims: The EPP <create> command in the "claims" launch phase carries the info about presenting and accepting the claims notice. The Claims Create Form (Section 3.3.2) is used, and the General Create Form (Section 3.3.3) MAY be used for the "claims" launch phase. πŸ’…
  • open: The EPP <create> command in the "open" launch phase is undefined, so whatever form the server supports is up to server policy. The Claims Create Form (Section 3.3.2) MAY be used to pass the claims notice presentation and acceptance info if it's required for the domain name. 🧚
  • custom: The EPP <create> command in the "custom" launch phase is undefined too, so the form supported is up to server policy. 🌈

3.3.1. Sunrise Create Form πŸ”₯

The Sunrise Create Form is an extension to the EPP domain name mapping [RFC5731]. It carries the verifiable trademark info the server matches against the domain name to authorize the domain create. A server MUST support one of the four models in Mark Validation Models (Section 2.6) to verify the trademark info the client passes in. πŸ‘‘

A <launch:create> element gets sent alongside the regular <create> domain command πŸ’Œ. It has an OPTIONAL "type" attribute that says what kind of object ("application" or "registration") is being created. The server SHOULD check the "type" attribute, when it's passed, against the object that's actually going to be created, and return EPP error result code 2306 [RFC5730] if the type is wrong πŸ™ˆ. The <launch:create> element holds these child elements:

  • <launch:phase>: The identifier for the launch phase. The server SHOULD validate the value according to Section 2.3. ✨
  • <launch:codeMark> or <smd:signedMark> or <smd:encodedSignedMark>:
    • <launch:codeMark>: Zero or more <launch:codeMark> elements. The <launch:codeMark> child elements are defined in "<launch:codeMark> Element" (Section 2.6.1). πŸ“
    • <smd:signedMark>: Zero or more <smd:signedMark> elements. The <smd:signedMark> child elements are defined in "<smd:signedMark> Element" (Section 2.6.3.1). πŸ’œ
    • <smd:encodedSignedMark>: Zero or more <smd:encodedSignedMark> elements. The <smd:encodedSignedMark> child elements are defined in "<smd:encodedSignedMark> Element" (Section 2.6.3.2). 🫢

Here's an example <create> domain command using the <launch:create> extension, following the "code" validation model, with multiple sunrise codes πŸ¦‹:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domain.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:        <launch:phase>sunrise</launch:phase>
C:        <launch:codeMark>
C:          <launch:code validatorID="sample1">
C:            49FD46E6C4B45C55D4AC</launch:code>
C:        </launch:codeMark>
C:        <launch:codeMark>
C:          <launch:code>49FD46E6C4B45C55D4AD</launch:code>
C:        </launch:codeMark>
C:        <launch:codeMark>
C:          <launch:code validatorID="sample2">
C:            49FD46E6C4B45C55D4AE</launch:code>
C:        </launch:codeMark>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

Here's another example, following the "mark" validation model, with the mark info πŸŽ€:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domainone.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:        <launch:phase>sunrise</launch:phase>
C:        <launch:codeMark>
C:          <mark:mark
C:            xmlns:mark="urn:ietf:params:xml:ns:mark-1.0">
C:            ...
C:          </mark:mark>
C:        </launch:codeMark>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

And one following the "code with mark" validation model, with the code and mark info together πŸ’–:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domain.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:        <launch:phase>sunrise</launch:phase>
C:        <launch:codeMark>
C:          <launch:code validatorID="sample">
C:            49FD46E6C4B45C55D4AC</launch:code>
C:          <mark:mark
C:           xmlns:mark="urn:ietf:params:xml:ns:mark-1.0">
C:           ...
C:          </mark:mark>
C:        </launch:codeMark>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

Next up is the "signed mark" validation model, with the signed mark info for a sunrise application πŸ”₯:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domainone.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:       type="application">
C:        <launch:phase>sunrise</launch:phase>
C:        <smd:signedMark id="signedMark"
C:         xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0">
C:         ...
C:        </smd:signedMark>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

Last one in this bit: the "signed mark" model again, but with the base64-encoded signed mark info 🧚:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domainone.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:        <launch:phase>sunrise</launch:phase>
C:        <smd:encodedSignedMark
C:         xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0">
C:         ...
C:        </smd:encodedSignedMark>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

3.3.2. Claims Create Form πŸ’–

okay so this is the form where the registrant basically says "yep, I accept the claims notice" πŸ’… It's the Claims Create Form of the extension to the EPP domain name mapping [RFC5731], and it carries all the info about that acceptance 🫢

A <launch:create> element gets sent along with the regular <create> domain command πŸŽ€ The <launch:create> element has an OPTIONAL "type" attribute that says what kind of object you're creating ("application" or "registration") 🧚 The server SHOULD validate the "type" attribute, when it's passed, against the type of object that will actually be created, and it returns an EPP error result code of 2306 [RFC5730] if the type is wrong ✨ The <launch:create> element has these child elements:

  • <launch:phase>: contains the value of the server's active launch phase 🌸 The server SHOULD validate the value according to Section 2.3.
  • <launch:notice>: one or more <launch:notice> elements, each containing these child elements:
    • <launch:noticeID>: the unique notice identifier for the claims notice πŸ”₯ This element has an OPTIONAL "validatorID" attribute, which is used to define the Validator Identifier (Section 2.2). Its value tells you which Trademark Validator is the source of the claims notice, and the default is the ICANN TMCH πŸ’œ
    • <launch:notAfter>: the expiry of the claims notice ⏳
    • <launch:acceptedDate>: the date and time that the claims notice was accepted πŸ¦‹

Here's an example <create> domain command using the <launch:create> extension, with the <launch:notice> info for the "tmch" and "custom-tmch" validators, for the "claims" launch phase πŸ‘‘

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domain.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:        <launch:phase>claims</launch:phase>
C:        <launch:notice>
C:          <launch:noticeID validatorID="tmch">
C:          370d0b7c9223372036854775807</launch:noticeID>
C:          <launch:notAfter>2014-06-19T10:00:00.0Z
C:          </launch:notAfter>
C:          <launch:acceptedDate>2014-06-19T09:00:00.0Z
C:          </launch:acceptedDate>
C:        </launch:notice>
C:        <launch:notice>
C:          <launch:noticeID validatorID="custom-tmch">
C:          470d0b7c9223654313275808</launch:noticeID>
C:          <launch:notAfter>2014-06-19T10:00:00.0Z
C:          </launch:notAfter>
C:          <launch:acceptedDate>2014-06-19T09:00:30.0Z
C:          </launch:acceptedDate>
C:        </launch:notice>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

3.3.3. General Create Form ✨

The General Create Form of the extension to the EPP domain name mapping [RFC5731] is the simpler glow-up 🌈 It includes the launch phase and, if you want, the object type to create. The OPTIONAL "type" attribute defines the expected type of object ("application" or "registration") to create. The server SHOULD validate the "type" attribute, when it's passed, against the type of object that will be created, and return an EPP error result code of 2306 [RFC5730] if the type is incorrect πŸ’…

A <launch:create> element is sent along with the regular <create> domain command. The <launch:create> element has just this one child element:

  • <launch:phase>: contains the value of the server's active launch phase 🌸 The server SHOULD validate the value according to Section 2.3.

Here's an example <create> domain command using the <launch:create> extension for a "landrush" launch phase application πŸ“

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domain.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:       type="application">
C:        <launch:phase>landrush</launch:phase>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

3.3.4. Mixed Create Form πŸ¦‹

The Mixed Create Form is the mix-and-match one πŸ“ It supports a blend of the create forms where, for example, the Sunrise Create Form (Section 3.3.1) and the Claims Create Form (Section 3.3.2) MAY be supported in a single command, by including both the verified trademark information and the info about the registrant's acceptance of the claims notice πŸŽ€ The server MAY support the Mixed Create Form ✨ When you're using the Mixed Create Form, the "custom" launch phase SHOULD be used πŸ’œ

Here's an example <create> domain command using the <launch:create> extension, with a mix of the Sunrise Create Form (Section 3.3.1) and the Claims Create Form (Section 3.3.2), including both a mark and a notice 🧚

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <create>
C:      <domain:create
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domainone.example</domain:name>
C:        <domain:registrant>jd1234</domain:registrant>
C:        <domain:contact type="admin">sh8013</domain:contact>
C:        <domain:contact type="tech">sh8013</domain:contact>
C:        <domain:authInfo>
C:          <domain:pw>2fooBAR</domain:pw>
C:        </domain:authInfo>
C:      </domain:create>
C:    </create>
C:    <extension>
C:      <launch:create
C:       xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
C:       type="application">
C:        <launch:phase name="non-tmch-sunrise">custom</launch:phase>
C:        <launch:codeMark>
C:          <mark:mark
C:            xmlns:mark="urn:ietf:params:xml:ns:mark-1.0">
C:            ...
C:          </mark:mark>
C:        </launch:codeMark>
C:        <launch:notice>
C:          <launch:noticeID validatorID="tmch">
C:            49FD46E6C4B45C55D4AC
C:          </launch:noticeID>
C:          <launch:notAfter>2012-06-19T10:00:10.0Z
C:          </launch:notAfter>
C:          <launch:acceptedDate>2012-06-19T09:01:30.0Z
C:          </launch:acceptedDate>
C:        </launch:notice>
C:      </launch:create>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

3.3.5. Create Response 🌈

If the create was successful, the server MAY add a <launch:creData> element to the regular EPP <resData> to show that it generated an Application Identifier (Section 2.1). This happens when multiple applications of a given domain name are supported. Otherwise, no extension is included with the regular EPP <resData> 🫢 The <launch:creData> element has these child elements:

  • <launch:phase>: the phase of the application, which mirrors the <launch:phase> element included in the <launch:create> 🌸
  • <launch:applicationID>: the application identifier of the application πŸ”₯

Here's an example response when the server supports multiple overlapping applications πŸ‘‘

S:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
S:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
S:  <response>
S:    <result code="1001">
S:      <msg>Command completed successfully; action pending</msg>
S:    </result>
S:    <resData>
S:      <domain:creData
S:         xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
S:       <domain:name>domain.example</domain:name>
S:       <domain:crDate>2010-08-10T15:38:26.623854Z</domain:crDate>
S:      </domain:creData>
S:    </resData>
S:    <extension>
S:      <launch:creData
S:        xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
S:        <launch:phase>sunrise</launch:phase>
S:        <launch:applicationID>2393-9323-E08C-03B1
S:        </launch:applicationID>
S:      </launch:creData>
S:    </extension>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

3.4. EPP <update> Command πŸ’…

This extension defines extra elements that extend the EPP <update> command for use with the domain name mapping ✨

When an EPP <update> command with the extension is sent to a server that does not support Launch Applications, it will fail πŸ’€ A server that does not support Launch Applications during its launch phase MUST return an EPP error result code of 2102 [RFC5730] when it receives an EPP <update> command with the extension πŸ”₯

Registry policies permitting, clients may update an application object by submitting an EPP <update> command along with a <launch:update> element, which indicates the application object to be updated πŸ¦‹ The <launch:update> element has these child elements:

  • <launch:phase>: the phase during which the application was submitted or is associated with 🌸 The server SHOULD validate the value and return an EPP error result code of 2306 [RFC5730] if it is invalid.
  • <launch:applicationID>: the application identifier that the client wishes to update 🧚

Here's an example <update> domain command with the <launch:update> extension, adding and removing a name server for a sunrise application with the application identifier "abc123" πŸ“

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <update>
C:      <domain:update
C:       xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:        <domain:name>domain.example</domain:name>
C:        <domain:add>
C:            <domain:ns>
C:              <domain:hostObj>ns2.domain.example</domain:hostObj>
C:            </domain:ns>
C:          </domain:add>
C:          <domain:rem>
C:            <domain:ns>
C:              <domain:hostObj>ns1.domain.example</domain:hostObj>
C:            </domain:ns>
C:          </domain:rem>
C:      </domain:update>
C:    </update>
C:    <extension>
C:    <launch:update
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:      <launch:phase>sunrise</launch:phase>
C:      <launch:applicationID>abc123</launch:applicationID>
C:    </launch:update>
C:    </extension>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

This extension doesn't define any extension to the response of an <update> domain command 🌈 After processing the command, the server replies with a standard EPP response, as defined in the EPP domain name mapping [RFC5731] πŸ’œ

3.5. EPP <delete> Command 🧹

okay so this extension adds some extra bits to the EPP <delete> command so it can vibe with the domain name mapping πŸ’…

Here's the big rule, bestie: a client MUST NOT send this extension on an EPP <delete> command to a server that doesn't support Launch Applications πŸ™…β€β™€οΈ. And if a server doesn't support Launch Applications during its launch phase and still gets a <delete> command with the extension, it MUST return EPP error result code 2102 [RFC5730] πŸ’€ not the vibe at all.

Registry policies permitting, clients MAY withdraw an application by sending an EPP <delete> command with a <launch:delete> element, which tells the server exactly which application object to delete ✨ The <launch:delete> element has two child elements:

  • <launch:phase>: the phase during which the application was submitted or is associated with. The server SHOULD validate the value and return EPP error result code 2306 [RFC5730] if it's invalid 🫢
  • <launch:applicationID>: the application identifier that the client wants to delete πŸ¦‹

Here's an example of a domain <delete> command with the <launch:delete> extension, iykyk πŸ‘‘

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:   <delete>
C:    <domain:delete
C:     xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
C:      <domain:name>domain.example</domain:name>
C:    </domain:delete>
C:   </delete>
C:   <extension>
C:    <launch:delete
C:     xmlns:launch="urn:ietf:params:xml:ns:launch-1.0">
C:      <launch:phase>sunrise</launch:phase>
C:      <launch:applicationID>abc123</launch:applicationID>
C:    </launch:delete>
C:   </extension>
C:   <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

This extension does not define any extension to the response of a <delete> domain command 🌸 After processing the command, the server replies with a standard EPP response as defined in the EPP domain name mapping [RFC5731]. Easy peasy 🧚

3.6. EPP <renew> Command πŸ”

This extension does not define any extension to the EPP <renew> command or response described in the EPP domain name mapping [RFC5731]. No notes, no drama πŸ“

3.7. EPP <transfer> Command πŸ¦‹

This extension does not define any extension to the EPP <transfer> command or response described in the EPP domain name mapping [RFC5731]. Same energy as <renew>, literally nothing new here πŸ’œ

4. Formal Syntax πŸ“œ

The EPP Launch Phase Mapping schema is presented in Section 4.1. It's giving official spec. ✨

The formal syntax presented is a complete schema representation of the object mapping, suitable for automated validation of EPP XML instances. The BEGIN and END tags are not part of the schema πŸ™ˆ they're just there to mark where the schema starts and ends for URI registration purposes.

4.1. Launch Schema πŸš€

okay bestie, first up is the legal stuff 🫢 the copyright notice and license terms, kept word for word so nothing gets lost:

Copyright (c) 2018 IETF Trust and the persons identified as authors
of the code.  All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

o  Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.

o  Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in
   the documentation and/or other materials provided with the
   distribution.

o  Neither the name of Internet Society, IETF or IETF Trust, nor the
   names of specific contributors, may be used to endorse or promote
   products derived from this software without specific prior written
   permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Now the good part πŸ’… the actual schema for the launch phase extension. It's the XML that all the launch-phase EPP stuff is built on, and it's giving structure ✨

BEGIN

<?xml version="1.0" encoding="UTF-8"?>
<schema
  targetNamespace="urn:ietf:params:xml:ns:launch-1.0"
  xmlns:launch="urn:ietf:params:xml:ns:launch-1.0"
  xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
  xmlns:mark="urn:ietf:params:xml:ns:mark-1.0"
  xmlns:smd="urn:ietf:params:xml:ns:signedMark-1.0"
  xmlns="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified">

  <!-- Import common element types -->
  <import namespace="urn:ietf:params:xml:ns:eppcom-1.0"/>
  <import namespace="urn:ietf:params:xml:ns:mark-1.0"/>
  <import namespace="urn:ietf:params:xml:ns:signedMark-1.0"/>

  <annotation>
    <documentation>
      Extensible Provisioning Protocol v1.0
      domain name
      extension schema
      for the launch phase processing.
    </documentation>
  </annotation>

  <!-- Child elements found in EPP commands -->
  <element
    name="check"
    type="launch:checkType"/>
  <element
    name="info"
    type="launch:infoType"/>
  <element
    name="create"
    type="launch:createType"/>
  <element
    name="update"
    type="launch:idContainerType"/>
  <element
    name="delete"
    type="launch:idContainerType"/>

  <!-- Common container of id (identifier) element -->
  <complexType name="idContainerType">
    <sequence>
      <element
        name="phase"
        type="launch:phaseType"/>
      <element
        name="applicationID"
        type="launch:applicationIDType"/>
    </sequence>
  </complexType>

  <!-- Definition for application identifier -->
  <simpleType name="applicationIDType">
    <restriction base="token"/>
  </simpleType>

  <!-- Definition for launch phase.  Name is an
       optional attribute used to extend the phase type.
       For example, when using the phase type value
       of "custom", the "name" can be used to specify the
       custom phase. -->
  <complexType name="phaseType">
    <simpleContent>
      <extension base="launch:phaseTypeValue">
        <attribute
          name="name"
          type="token"/>
      </extension>
    </simpleContent>
  </complexType>

  <!-- Enumeration of launch phase values -->
  <simpleType name="phaseTypeValue">
    <restriction base="token">
      <enumeration value="sunrise"/>
      <enumeration value="landrush"/>
      <enumeration value="claims"/>
      <enumeration value="open"/>
      <enumeration value="custom"/>
    </restriction>
  </simpleType>


  <!-- Definition for the sunrise code -->
  <simpleType name="codeValue">

    <restriction base="token">
      <minLength value="1"/>
    </restriction>
  </simpleType>

  <complexType name="codeType">
    <simpleContent>
      <extension base="launch:codeValue">
        <attribute
          name="validatorID"
          type="launch:validatorIDType"
          use="optional"/>
      </extension>
    </simpleContent>
  </complexType>

  <!-- Definition for the notice identifier -->
  <simpleType name="noticeIDValue">
    <restriction base="token">
      <minLength value="1"/>
    </restriction>
  </simpleType>

  <complexType name="noticeIDType">
    <simpleContent>
      <extension base="launch:noticeIDValue">
        <attribute
          name="validatorID"
          type="launch:validatorIDType"
          use="optional"/>
      </extension>
    </simpleContent>
  </complexType>

  <!-- Definition for the validator identifier -->
  <simpleType name="validatorIDType">
    <restriction base="token">
      <minLength value="1"/>
    </restriction>
  </simpleType>

  <!-- Possible status values for sunrise application -->
  <simpleType name="statusValueType">
    <restriction base="token">
      <enumeration value="pendingValidation"/>
      <enumeration value="validated"/>
      <enumeration value="invalid"/>
      <enumeration value="pendingAllocation"/>
      <enumeration value="allocated"/>
      <enumeration value="rejected"/>
      <enumeration value="custom"/>
    </restriction>
  </simpleType>

  <!-- Status type definition -->
  <complexType name="statusType">
    <simpleContent>
      <extension base="normalizedString">
        <attribute
          name="s"
          type="launch:statusValueType"
          use="required"/>
        <attribute
          name="lang"
          type="language"
          default="en"/>
        <attribute
          name="name"
          type="token"/>
      </extension>
    </simpleContent>
  </complexType>

  <!-- codeMark Type that contains an optional
       code with mark information -->
  <complexType name="codeMarkType">
    <sequence>
      <element
        name="code"
        type="launch:codeType"
        minOccurs="0"/>
      <element
        ref="mark:abstractMark"
        minOccurs="0"/>
    </sequence>
  </complexType>

  <!-- Child elements for the create command -->
  <complexType name="createType">
    <sequence>
      <element
        name="phase"
        type="launch:phaseType"/>
      <choice minOccurs="0">
        <element
          name="codeMark"
          type="launch:codeMarkType"
          maxOccurs="unbounded"/>
        <element
          ref="smd:abstractSignedMark"
          maxOccurs="unbounded"/>
        <element
          ref="smd:encodedSignedMark"
          maxOccurs="unbounded"/>
      </choice>
      <element
        name="notice"
        type="launch:createNoticeType"
        minOccurs="0"
        maxOccurs="unbounded"/>
    </sequence>
    <attribute
      name="type"
      type="launch:objectType"/>
  </complexType>

  <!-- Type of launch object -->
  <simpleType name="objectType">
    <restriction base="token">
      <enumeration value="application"/>
      <enumeration value="registration"/>
    </restriction>
  </simpleType>


  <!-- Child elements of the create notice element -->
  <complexType name="createNoticeType">
    <sequence>
      <element
        name="noticeID"
        type="launch:noticeIDType"/>
      <element
        name="notAfter"
        type="dateTime"/>
      <element
        name="acceptedDate"
        type="dateTime"/>
    </sequence>
  </complexType>


  <!-- Child elements of check (Claims Check Command) -->
  <complexType name="checkType">
    <sequence>

      <element
        name="phase"
        type="launch:phaseType"
        minOccurs="0"/>
    </sequence>
    <attribute
      name="type"
      type="launch:checkFormType"
      default="claims"/>
  </complexType>


  <!-- Type of check form (Claims Check or Availability Check) -->
  <simpleType name="checkFormType">
    <restriction base="token">
      <enumeration value="claims"/>
      <enumeration value="avail"/>
      <enumeration value="trademark"/>
    </restriction>
  </simpleType>


  <!-- Child elements of info command -->
  <complexType name="infoType">
    <sequence>
      <element
        name="phase"
        type="launch:phaseType"/>
      <element
        name="applicationID"
        type="launch:applicationIDType"
        minOccurs="0"/>
    </sequence>
    <attribute
      name="includeMark"
      type="boolean"
      default="false"/>
  </complexType>

  <!-- Child response elements -->
  <element
    name="chkData"
    type="launch:chkDataType"/>
  <element
    name="creData"
    type="launch:idContainerType"/>
  <element
    name="infData"
    type="launch:infDataType"/>

  <!-- <check> response elements -->
  <complexType name="chkDataType">
    <sequence>
      <element
        name="phase"
        type="launch:phaseType"
        minOccurs="0"/>
      <element
        name="cd"
        type="launch:cdType"
        maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="cdType">
    <sequence>
      <element
        name="name"
        type="launch:cdNameType"/>
      <element
        name="claimKey"
        type="launch:claimKeyType"
        minOccurs="0"
        maxOccurs="unbounded"/>
    </sequence>
  </complexType>

  <complexType name="cdNameType">
    <simpleContent>
      <extension base="eppcom:labelType">
        <attribute
          name="exists"
          type="boolean"
          use="required"/>
      </extension>
    </simpleContent>
  </complexType>

  <complexType name="claimKeyType">
    <simpleContent>
      <extension base="token">
        <attribute
          name="validatorID"
          type="launch:validatorIDType"
          use="optional"/>
      </extension>

    </simpleContent>
  </complexType>

  <!-- <info> response elements -->
  <complexType name="infDataType">
    <sequence>
      <element
        name="phase"
        type="launch:phaseType"/>
      <element
        name="applicationID"
        type="launch:applicationIDType"
        minOccurs="0"/>
      <element
        name="status"
        type="launch:statusType"
        minOccurs="0"/>
      <element
        ref="mark:abstractMark"
        minOccurs="0"
        maxOccurs="unbounded"/>
    </sequence>
  </complexType>

</schema>

END


5. IANA Considerations ✨

5.1. XML Namespace

okay so this part is all about where the XML namespace and schema live, bestie 🧚 this doc uses URNs to name XML namespaces and XML schemas that follow the registry mechanism from [RFC3688], which is giving organized energy πŸ“

IANA registered the launch namespace like this:

URI: urn:ietf:params:xml:ns:launch-1.0

Registrant Contact: IESG

XML: None.  Namespace URIs do not represent an XML specification.

and the launch XML schema like this:

URI: urn:ietf:params:xml:schema:launch-1.0

Registrant Contact: IESG

XML: See the "Formal Syntax" section of this document.

the namespace is the name tag and the schema is the actual rulebook, so they're separate entries and both are slay πŸ’…

5.2. EPP Extension Registry

okay now the extension gets its own spot in the registry πŸ¦‹ IANA registered this EPP extension in the "Extensions for the Extensible Provisioning Protocol (EPP)" registry from [RFC7451], and the registration details are:

Name of Extension: "Launch Phase Mapping for the Extensible
Provisioning Protocol (EPP)"

Document Status: Standards Track

Reference: RFC 8334

Registrant Name and Email Address: IESG, <iesg@ietf.org>

TLDs: Any

IPR Disclosure: None

Status: Active

Notes: None

so yeah it's official, active, applies to any TLD, and it's giving fully registered πŸŽ€

6. Security Considerations ✨

okay bestie, this part is serious, so read it carefully πŸ”’ The mapping extensions in this document don't give you any security services beyond what [RFC5730], the EPP domain name mapping in [RFC5731], and the protocol layers EPP uses already provide. The security considerations in those other specs apply here too, no cap.

Updating or deleting an application object MUST be restricted to clients that are authorized to do that operation on that object. No exceptions, no vibes-based access control πŸ™…β€β™€οΈ

Here's the tea: the information inside an application, or even the fact that an application exists at all, might be confidential 🀫 So if an unauthorized client tries to operate on an application object, the request MUST be rejected with an EPP 2201 (authorization error) return code. Full stop.

Server policy MAY allow an info operation to return filtered output to clients other than the sponsoring client. If the server does that, the <domain:infData> and <launch:infData> responses SHOULD be filtered so they only include fields that are publicly accessible. (the word is SHOULD, so it's a strong suggestion, but not an absolute must)

7. References

7.1. Normative References

These are the must-read specs the doc leans on πŸ“š

[RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
           Requirement Levels", BCP 14, RFC 2119,
           DOI 10.17487/RFC2119, March 1997,
           <https://www.rfc-editor.org/info/rfc2119>.

[RFC3688]  Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
           DOI 10.17487/RFC3688, January 2004,
           <https://www.rfc-editor.org/info/rfc3688>.

[RFC5646]  Phillips, A., Ed. and M. Davis, Ed., "Tags for Identifying
           Languages", BCP 47, RFC 5646, DOI 10.17487/RFC5646,
           September 2009, <https://www.rfc-editor.org/info/rfc5646>.

[RFC5730]  Hollenbeck, S., "Extensible Provisioning Protocol (EPP)",
           STD 69, RFC 5730, DOI 10.17487/RFC5730, August 2009,
           <https://www.rfc-editor.org/info/rfc5730>.

[RFC5731]  Hollenbeck, S., "Extensible Provisioning Protocol (EPP)
           Domain Name Mapping", STD 69, RFC 5731,
           DOI 10.17487/RFC5731, August 2009,
           <https://www.rfc-editor.org/info/rfc5731>.

[RFC7848]  Lozano, G., "Mark and Signed Mark Objects Mapping",
           RFC 7848, DOI 10.17487/RFC7848, June 2016,
           <https://www.rfc-editor.org/info/rfc7848>.

[RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
           2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
           May 2017, <https://www.rfc-editor.org/info/rfc8174>.

[W3C.REC-xml11-20060816]
           Bray, T., Paoli, J., Sperberg-McQueen, M., Maler, E.,
           Yergeau, F., and J. Cowan, "Extensible Markup Language
           (XML) 1.1 (Second Edition)", World Wide Web Consortium
           Recommendation REC-xml11-20060816, August 2006,
           <http://www.w3.org/TR/2006/REC-xml11-20060816>.

7.2. Informative References

these ones are just for context, not required reading 🌸

[ICANN-TMCH]
           Lozano, G., "ICANN TMCH functional specifications", Work
           in Progress, draft-ietf-regext-tmch-func-spec-03, July
           2017.

[RFC7451]  Hollenbeck, S., "Extension Registry for the Extensible
           Provisioning Protocol", RFC 7451, DOI 10.17487/RFC7451,
           February 2015, <https://www.rfc-editor.org/info/rfc7451>.

Acknowledgements

big thank you energy 🫢 The authors want to shout out the leading participants of the Community TMCH Model, whose work led to a lot of the changes in this doc: Chris Wright, Jeff Neuman, Jeff Eckhaus, and Will Shorter. πŸ‘‘

Special suggestions that made it into the doc came from Harald Alvestrand, Ben Campbell, Spencer Dawkins, Jothan Frakes, Keith Gaughan, Seth Goldman, Scott Hollenbeck, Michael Holloway, Jan Jansen, Rubens Kuhl, Mirja Kuehlewind, Warren Kumari, Ben Levac, Gustavo Lozano, Klaus Malorny, Alexander Mayrhofer, Alexey Melnikov, Patrick Mevzek, James Mitchell, Francisco Obispo, Mike O'Connell, Eric Rescorla, Bernhard Reutner-Fischer, Sabrina Tanamal, Trung Tran, Ulrich Wisser, and Sharon Wodjenski. literally iconic 🌈

Some of the Trademark Claims Phase description was based on Gustavo Lozano's work on the ICANN TMCH functional specifications ✨

Authors' Addresses

meet the authors πŸ’–

James Gould
VeriSign, Inc.
12061 Bluemont Way
Reston, VA  20190
United States of America

Email: jgould@verisign.com
URI:   http://www.verisign.com
Wil Tan
Cloud Registry
Suite 32 Seabridge House
377 Kent St
Sydney, NSW  2000
Australia

Phone: +61 414 710899
Email: wil@cloudregistry.net
URI:   http://www.cloudregistry.net
Gavin Brown
CentralNic Ltd
35-39 Mooregate
London, England  EC2R 6AR
United Kingdom

Phone: +44 20 33 88 0600
Email: gavin.brown@centralnic.com
URI:   https://www.centralnic.com
πŸ“¦ where this page comes from