RFC 4933

Extensible Provisioning Protocol (EPP) Contact Mapping

๐Ÿ“… published May 2007, from ietf

RFC 4933: Extensible Provisioning Protocol (EPP) Contact Mapping ๐ŸŽ€

Okay bestie, this is RFC 4933 (part 1 of 7 ๐Ÿ’–), and it's the EPP contact mapping. It's from the Network Working Group, written by S. Hollenbeck at VeriSign, Inc. It's a Standards Track doc, dated May 2007. It obsoletes RFC 3733, and there's no "Updates" entry to mention. Main character energy ๐Ÿ‘‘

Here's the table of contents, copied exactly:

Network Working Group                                      S. Hollenbeck
Request for Comments: 4933                                VeriSign, Inc.
Obsoletes: 3733                                                 May 2007
Category: Standards Track


         Extensible Provisioning Protocol (EPP) Contact Mapping
1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
  1.1.  Conventions Used in This Document  . . . . . . . . . . . .  3
2.  Object Attributes  . . . . . . . . . . . . . . . . . . . . . .  3
  2.1.  Contact and Client Identifiers . . . . . . . . . . . . . .  3
  2.2.  Status Values  . . . . . . . . . . . . . . . . . . . . . .  4
  2.3.  Individual and Organizational Names  . . . . . . . . . . .  5
  2.4.  Address  . . . . . . . . . . . . . . . . . . . . . . . . .  5
    2.4.1.  Street, City, and State or Province  . . . . . . . . .  6
    2.4.2.  Postal Code  . . . . . . . . . . . . . . . . . . . . .  6
    2.4.3.  Country  . . . . . . . . . . . . . . . . . . . . . . .  6
  2.5.  Telephone Numbers  . . . . . . . . . . . . . . . . . . . .  6
  2.6.  Email Addresses  . . . . . . . . . . . . . . . . . . . . .  6
  2.7.  Dates and Times  . . . . . . . . . . . . . . . . . . . . .  6
  2.8.  Authorization Information  . . . . . . . . . . . . . . . .  7
  2.9.  Disclosure of Data Elements and Attributes . . . . . . . .  7
3.  EPP Command Mapping  . . . . . . . . . . . . . . . . . . . . .  8
  3.1.  EPP Query Commands . . . . . . . . . . . . . . . . . . . .  8
    3.1.1.  EPP <check> Command  . . . . . . . . . . . . . . . . .  9
    3.1.2.  EPP <info> Command . . . . . . . . . . . . . . . . . . 11
    3.1.3.  EPP <transfer> Query Command . . . . . . . . . . . . . 14
  3.2.  EPP Transform Commands . . . . . . . . . . . . . . . . . . 16
    3.2.1.  EPP <create> Command . . . . . . . . . . . . . . . . . 17
    3.2.2.  EPP <delete> Command . . . . . . . . . . . . . . . . . 20
    3.2.3.  EPP <renew> Command  . . . . . . . . . . . . . . . . . 21
    3.2.4.  EPP <transfer> Command . . . . . . . . . . . . . . . . 22
    3.2.5.  EPP <update> Command . . . . . . . . . . . . . . . . . 23
  3.3.  Offline Review of Requested Actions  . . . . . . . . . . . 27
4.  Formal Syntax  . . . . . . . . . . . . . . . . . . . . . . . . 29
5.  Internationalization Considerations  . . . . . . . . . . . . . 38
6.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 38
7.  Security Considerations  . . . . . . . . . . . . . . . . . . . 39
8.  Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 39
9.  References . . . . . . . . . . . . . . . . . . . . . . . . . . 39
  9.1.  Normative References . . . . . . . . . . . . . . . . . . . 39
  9.2.  Informative References . . . . . . . . . . . . . . . . . . 40
Appendix A.  Changes from RFC 3733 . . . . . . . . . . . . . . . . 41

Status of This Memo ๐Ÿ“œ

bestie, this doc is an Internet standards track protocol for the Internet community, and it's basically asking for discussion and suggestions to make it better ๐Ÿซถ For the current standardization state and status, check the "Internet Official Protocol Standards" (STD 1). And yes, distribution is totally unlimited โœจ

Copyright (C) The IETF Trust (2007). Done and dusted ๐Ÿ’…

Abstract ๐ŸŒธ

So this doc describes an EPP mapping for handling contacts, which are the individual or organizational social information identifiers stored in a shared central repository ๐Ÿงš It's written in Extensible Markup Language (XML), and it defines the EPP command syntax and semantics for contacts. Also, this doc obsoletes RFC 3733 ๐Ÿ’€


1. Introduction โœจ

Okay so this doc describes a personal and organizational identifier mapping for version 1.0 of the Extensible Provisioning Protocol (EPP) ๐Ÿ’– The mapping uses the Extensible Markup Language (XML) 1.0 as described in [W3C.REC-xml-20040204], plus XML Schema notation as described in [W3C.REC-xmlschema-1-20041028] and [W3C.REC-xmlschema-2-20041028]. It also obsoletes RFC 3733 [RFC3733].

[RFC4930] gives you the full rundown on EPP command and response structures ๐Ÿฆ‹ You really need to understand the base protocol spec before this mapping makes sense, so go read that first, bestie.

XML is case sensitive, so unless it says otherwise, XML specs and examples in this doc MUST be read in the exact character case shown if you're building a conforming implementation. No vibes-based casing here ๐Ÿ™ˆ

1.1. Conventions Used in This Document ๐ŸŽ€

The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this doc are to be interpreted as described in [RFC2119].

In the examples, "C:" means lines sent by a protocol client, and "S:" means lines sent back by a protocol server ๐Ÿ“ Indentation and whitespace in examples are only there to show how elements relate to each other. They are NOT a REQUIRED feature of this protocol, so don't panic if your formatting looks different ๐Ÿ’…


2. Object Attributes ๐Ÿฆ‹

An EPP contact object has attributes and values that the sponsoring client or the server can view and change โœจ This section breaks down each attribute type. The formal syntax for these values is in the "Formal Syntax" section of this doc, and in the normative references too.

2.1. Contact and Client Identifiers ๐Ÿชช

Every EPP contact gets identified by a server-unique identifier. Contact identifiers are character strings with a minimum length, a maximum length, and a specific format. They use the "clIDType" client identifier syntax described in [RFC4930] ๐ŸŒˆ

2.2. Status Values ๐Ÿšฆ

Okay this one's a big deal, so pay attention ๐Ÿ‘‘

A contact object MUST always have at least one status value attached. Only the client that sponsors the contact object and the server where the object lives can set status values. A client can change a contact object's status using the EPP <update> command. Each status value MAY come with a human-readable string explaining why the status was applied.

A client MUST NOT alter status values that the server set. A server MAY alter or override status values that a client set, but that's subject to local server policies ๐Ÿ’€ The status of an object MAY change because of either a client-initiated transform command or an action from a server operator.

Status values a client can add or remove start with "client". The ones a server can add or remove start with "server". Status values that don't start with either "client" or "server" are server-managed ๐Ÿซถ

Here are the status values and what they mean:

  • clientDeleteProhibited, serverDeleteProhibited

Requests to delete the object MUST be rejected. Not today ๐Ÿšซ

  • clientTransferProhibited, serverTransferProhibited

Requests to transfer the object MUST be rejected. Hard no ๐Ÿ™…โ€โ™€๏ธ

  • clientUpdateProhibited, serverUpdateProhibited

Requests to update the object MUST be rejected, except for requests to remove this status itself ๐Ÿ”’

  • linked

The contact object has at least one active association with another object, like a domain object. Servers SHOULD provide services to figure out existing object associations ๐Ÿ”—

  • ok

This is the normal status for an object with no pending operations or prohibitions. The server sets and removes this one on its own as other status values get added or removed โœจ

  • pendingCreate, pendingDelete, pendingRenew, pendingTransfer, pendingUpdate

A transform command got processed for the object, but the server hasn't finished the action yet. Server operators can delay completion for all sorts of reasons, like human review or third-party action ๐Ÿต A transform command that gets processed but has a pending requested action is marked with response code 1001.

When the requested action is finished, the pendingCreate, pendingDelete, pendingTransfer, or pendingUpdate status MUST be removed ๐ŸŽ‰ Every client involved in the transaction MUST get a service message saying the action is complete and the object's status changed.

Now the combo rules, which are lowkey the most important part ๐Ÿ˜ญ

  • "ok" status MAY only be combined with "linked" status.
  • "linked" status MAY be combined with any status.
  • "pendingDelete" status MUST NOT be combined with either "clientDeleteProhibited" or "serverDeleteProhibited" status.
  • "pendingTransfer" status MUST NOT be combined with either "clientTransferProhibited" or "serverTransferProhibited" status. "pendingUpdate" status MUST NOT be combined with either "clientUpdateProhibited" or "serverUpdateProhibited" status.
  • The pendingCreate, pendingDelete, pendingTransfer, and pendingUpdate statuses MUST NOT be combined with each other.
  • Other status combinations that aren't expressly prohibited MAY be used ๐ŸŒธ

2.3. Individual and Organizational Names ๐Ÿงธ

Individual and organizational names tied to a contact are character strings. They have a minimum length and a maximum length ๐Ÿ’– Names MAY be provided in UTF-8 [RFC3629], and also in a subset of UTF-8 that can be represented in 7-bit ASCII, depending on local needs.

2.4. Address ๐Ÿก

Every contact has postal address info attached. A postal address has OPTIONAL street info, city info, OPTIONAL state/province info, an OPTIONAL postal code, and a country identifier ๐Ÿ—บ๏ธ Address info MAY be provided in both UTF-8 and a subset of UTF-8 that can be represented in 7-bit ASCII, depending on local needs.

2.4.1. Street, City, and State or Province ๐ŸŒ‡

Contact street, city, and state or province info is represented as character strings. These have a minimum length and a maximum length.

2.4.2. Postal Code ๐Ÿ“ฎ

Contact postal codes are character strings too, with a minimum length and a maximum length.

2.4.3. Country ๐ŸŒ

Contact country identifiers are two-character identifiers specified in [ISO.3166.1997].

2.5. Telephone Numbers โ˜Ž๏ธ

The contact telephone number structure comes from structures defined in [ITU.E164.2005]. Telephone numbers in this mapping are character strings that MUST begin with a plus sign ("+", ASCII value 0x002B). After that comes a country code defined in [ITU.E164.2005], then a dot (".", ASCII value 0x002E), then a sequence of digits for the phone number itself ๐Ÿ“ž There's also an OPTIONAL "x" attribute for extension info, if you need it.

2.6. Email Addresses ๐Ÿ“ง

Email address syntax is defined in [RFC0822]. This mapping doesn't set any minimum or maximum lengths for the strings used to represent email addresses โœ‰๏ธ

2.7. Dates and Times โฐ

Okay, dates and times ๐Ÿ˜ญ Date and time attribute values MUST be represented in Universal Coordinated Time (UTC) using the Gregorian calendar. The extended date-time form, using upper case "T" and "Z" characters as defined in [W3C.REC-xmlschema-2-20041028], MUST be used to represent date-time values. XML Schema doesn't support truncated date-time forms or lower case "T" and "Z" characters, so this is the only way that works ๐Ÿซ 

2.8. Authorization Information โœจ

okay so authorization information is the secret handshake attached to contact objects that keeps transfers safe ๐Ÿ” It gets assigned when a contact object is created, and it might get updated later on ๐Ÿ’… This spec describes password-based authorization information, but other mechanisms are possible ๐Ÿฆ‹

2.9. Disclosure of Data Elements and Attributes ๐Ÿ™ˆ

okay this section is all about privacy, and it's giving main character energy ๐Ÿ”’ The EPP core protocol needs a server operator to announce its data collection policies to clients; see Section 2.4 of [RFC4930]. Along with that disclosure rule, this mapping includes data elements that let a client flag the stuff needing exceptional server operator handling, so it can be allowed or restricted from disclosure to third parties ๐Ÿซถ

A server operator announces a default disclosure policy when it sets up a session with a client ๐ŸŽ€ When an object is created or updated, the client can list the contact attributes that need exceptional disclosure handling using an OPTIONAL <contact:disclose> element โœจ Once it's set, disclosure preferences can be reviewed with a contact information query ๐Ÿ‘‘

A server operator MUST reject any transaction that requests disclosure practices that do not conform to the announced data collection policy with a 2308 error response code. ๐Ÿ’€

If it's present, the <contact:disclose> element MUST contain a "flag" attribute ๐Ÿงš The "flag" attribute holds an XML Schema boolean value. A value of "true" or "1" (one) says the client prefers to allow disclosure of the specified elements as an exception to the stated data collection policy ๐ŸŒˆ A value of "false" or "0" (zero) says the client prefers to not allow disclosure of the specified elements as an exception to the stated data collection policy ๐Ÿ™…โ€โ™€๏ธ

The <contact:disclose> element MUST contain at least one of the following child elements:

<contact:name type="int"/>
<contact:name type="loc"/>
<contact:org type="int"/>
<contact:org type="loc"/>
<contact:addr type="int"/>
<contact:addr type="loc"/>
<contact:voice/>
<contact:fax/>
<contact:email/>

Example <contact:disclose> element, flag="0":

<contact:disclose flag="0">
 <contact:email/>
 <contact:voice/>
</contact:disclose>

In this example, the contact email address and voice telephone number cannot be disclosed ๐Ÿ™Š Everything else follows the server's data collection policy, babe ๐Ÿ’–

Example <contact:disclose> element, flag="1":

<contact:disclose flag="1">
 <contact:name type="int"/>
 <contact:org type="int"/>
 <contact:addr type="int"/>
</contact:disclose>

In this example, the internationalized contact name, organization, and address information can be disclosed ๐ŸŒธ All other elements are subject to disclosure in accordance with the server's data collection policy โœจ

Client identification features from the EPP <login> command, plus the contact authorization information, decide whether a client is allowed to run contact information query commands ๐Ÿ”‘ These same features also decide whether a client is allowed to receive data that's otherwise marked for non-disclosure in a query response. iykyk ๐Ÿซฃ


3. EPP Command Mapping ๐Ÿงš

A detailed description of the EPP syntax and semantics lives in [RFC4930] ๐Ÿ“š The command mappings here are specifically for provisioning and managing contact objects via EPP ๐Ÿ’…

3.1. EPP Query Commands ๐Ÿ”

EPP gives you three commands to retrieve contact information: <check> to see if a contact object can be provisioned within a repository, <info> to get detailed information about a contact object, and <transfer> to get contact object transfer status information ๐Ÿฆ‹

3.1.1. EPP <check> Command ๐Ÿ’–

The EPP <check> command tells you if an object can be provisioned within a repository ๐Ÿซถ It's a hint that helps a client anticipate whether provisioning an object with the <create> command will succeed or fail, because provisioning requirements are ultimately a matter of server policy ๐Ÿคทโ€โ™€๏ธ

In addition to the standard EPP command elements, the <check> command MUST contain a <contact:check> element that identifies the contact namespace. The <contact:check> element holds these child elements:

  • One or more <contact:id> elements that contain the server-unique identifier of the contact objects to be queried. ๐ŸŽ€

Example <check> command:

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:      <contact:check
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:        <contact:id>sah8013</contact:id>
C:        <contact:id>8013sah</contact:id>
C:      </contact:check>
C:    </check>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

When a <check> command has been processed successfully, the EPP <resData> element MUST contain a child <contact:chkData> element that identifies the contact namespace ๐ŸŒˆ The <contact:chkData> element contains one or more <contact:cd> elements, and those contain these child elements:

  • A <contact:id> element that identifies the queried object. This element MUST contain an "avail" attribute whose value shows object availability (can it be provisioned or not) at the moment the <check> command was completed. A value of "1" or "true" means the object can be provisioned. A value of "0" or "false" means the object cannot be provisioned. โœ…โŒ
  • An OPTIONAL <contact:reason> element that MAY be provided when an object cannot be provisioned. If it's present, this element holds server-specific text that helps explain why the object can't be provisioned ๐Ÿ™ˆ This text MUST be represented in the response language previously negotiated with the client. An OPTIONAL "lang" attribute MAY be present to identify the language if the negotiated value is something other than the default value of "en" (English) ๐ŸŒ

Example <check> response:

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:      <contact:chkData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:cd>
S:          <contact:id avail="1">sh8013</contact:id>
S:        </contact:cd>
S:        <contact:cd>
S:          <contact:id avail="0">sah8013</contact:id>
S:          <contact:reason>In use</contact:reason>
S:        </contact:cd>
S:        <contact:cd>
S:          <contact:id avail="1">8013sah</contact:id>
S:        </contact:cd>
S:      </contact:chkData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54322-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>
An EPP error response MUST be returned if a <check> command cannot be processed for any reason. ๐Ÿšจ

3.1.2. EPP <info> Command โœจ

okay so the EPP <info> command is how you grab all the juicy details about a contact object ๐Ÿ’… besides the usual EPP command bits, your <info> command MUST have a <contact:info> element that points at the contact namespace ๐ŸŽ€. inside it you put:

  • A <contact:id> element that contains the server-unique identifier of the contact object you wanna query ๐Ÿ“
  • An OPTIONAL <contact:authInfo> element with the authorization information for that contact object. if you leave it out, or the auth info is invalid, server policy decides whether your command gets rejected or whether you still get the response info back ๐Ÿฆ‹

here's a vibe check example <info> command:

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:      <contact:info
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:        <contact:authInfo>
C:          <contact:pw>2fooBAR</contact:pw>
C:        </contact:authInfo>
C:      </contact:info>
C:    </info>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

when an <info> command gets processed successfully, the EPP <resData> element MUST contain a child <contact:infData> element that identifies the contact namespace ๐ŸŒˆ the <contact:infData> element holds these child elements:

  • A <contact:id> element that contains the server-unique identifier of the contact object.
  • A <contact:roid> element that contains the Repository Object IDentifier assigned to the contact object when the object was created.
  • One or more <contact:status> elements that describe the status of the contact object โญ
  • One or two <contact:postalInfo> elements that contain postal address information. there are two so the address can show up in both internationalized and localized forms, and a "type" attribute tells you which is which ๐ŸŒธ if an internationalized form (type="int") is provided, the element content MUST be represented in a subset of UTF-8 that can be represented in the 7-bit US-ASCII character set. if a localized form (type="loc") is provided, the element content MAY be represented in unrestricted UTF-8. the <contact:postalInfo> element contains these child elements:
    • A <contact:name> element that contains the name of the individual or role represented by the contact.
    • An OPTIONAL <contact:org> element that contains the name of the organization the contact is affiliated with.
    • A <contact:addr> element that contains address information associated with the contact. it holds:
      • One, two, or three OPTIONAL <contact:street> elements that contain the contact's street address.
      • A <contact:city> element that contains the contact's city.
      • An OPTIONAL <contact:sp> element that contains the contact's state or province.
      • An OPTIONAL <contact:pc> element that contains the contact's postal code.
      • A <contact:cc> element that contains the contact's country code.
  • An OPTIONAL <contact:voice> element that contains the contact's voice telephone number ๐Ÿ“ž
  • An OPTIONAL <contact:fax> element that contains the contact's facsimile telephone number.
  • A <contact:email> element that contains the contact's email address ๐Ÿ’Œ
  • A <contact:clID> element that contains the identifier of the sponsoring client.
  • A <contact:crID> element that contains the identifier of the client that created the contact object.
  • A <contact:crDate> element that contains the date and time of contact object creation.
  • A <contact:upID> element that contains the identifier of the client that last updated the contact object. this element MUST NOT be present if the contact has never been modified ๐Ÿ™ˆ
  • A <contact:upDate> element that contains the date and time of the most recent contact object modification. this element MUST NOT be present if the contact object has never been modified.
  • A <contact:trDate> element that contains the date and time of the most recent successful contact object transfer. this element MUST NOT be provided if the contact object has never been transferred.
  • A <contact:authInfo> element that contains authorization information associated with the contact object. this element MUST NOT be provided if the querying client is not the current sponsoring client ๐Ÿ”’
  • An OPTIONAL <contact:disclose> element that identifies elements needing exceptional server operator handling to allow or restrict disclosure to third parties. see Section 2.9 for a description of the child elements inside <contact:disclose> ๐Ÿงš

here's an <info> response for an authorized client:

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:      <contact:infData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:id>sh8013</contact:id>
S:        <contact:roid>SH8013-REP</contact:roid>
S:        <contact:status s="linked"/>
S:        <contact:status s="clientDeleteProhibited"/>
S:        <contact:postalInfo type="int">
S:          <contact:name>John Doe</contact:name>
S:          <contact:org>Example Inc.</contact:org>
S:          <contact:addr>
S:            <contact:street>123 Example Dr.</contact:street>
S:            <contact:street>Suite 100</contact:street>
S:            <contact:city>Dulles</contact:city>
S:            <contact:sp>VA</contact:sp>
S:            <contact:pc>20166-6503</contact:pc>
S:            <contact:cc>US</contact:cc>
S:          </contact:addr>
S:        </contact:postalInfo>
S:        <contact:voice x="1234">+1.7035555555</contact:voice>
S:        <contact:fax>+1.7035555556</contact:fax>
S:        <contact:email>jdoe@example.com</contact:email>
S:        <contact:clID>ClientY</contact:clID>
S:        <contact:crID>ClientX</contact:crID>
S:        <contact:crDate>1999-04-03T22:00:00.0Z</contact:crDate>
S:        <contact:upID>ClientX</contact:upID>
S:        <contact:upDate>1999-12-03T09:00:00.0Z</contact:upDate>
S:        <contact:trDate>2000-04-08T09:00:00.0Z</contact:trDate>
S:        <contact:authInfo>
S:          <contact:pw>2fooBAR</contact:pw>
S:        </contact:authInfo>
S:        <contact:disclose flag="0">
S:          <contact:voice/>
S:          <contact:email/>
S:        </contact:disclose>
S:      </contact:infData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54322-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>
if an <info> command can't be processed for any reason, an EPP error response MUST be returned. no exceptions, bestie ๐Ÿšจ

3.1.3. EPP <transfer> Query Command ๐Ÿฆ‹

the EPP <transfer> command gives you a query operation so a client can check the real-time status of pending and completed transfer requests ๐Ÿ‘€ besides the standard EPP command elements, the <transfer> command MUST contain an "op" attribute with the value "query", and a <contact:transfer> element that identifies the contact namespace. the <contact:transfer> element MUST contain these child elements:

  • A <contact:id> element that contains the server-unique identifier of the contact object to be queried.
  • An OPTIONAL <contact:authInfo> element that contains authorization information associated with the contact object. if this element isn't provided, or the authorization information is invalid, server policy determines whether the command is rejected or the response information gets returned to the client ๐Ÿ’…

example <transfer> query command:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <transfer op="query">
C:      <contact:transfer
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:        <contact:authInfo>
C:          <contact:pw>2fooBAR</contact:pw>
C:        </contact:authInfo>
C:      </contact:transfer>
C:    </transfer>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

when a <transfer> query command gets processed successfully, the EPP <resData> element MUST contain a child <contact:trnData> element that identifies the contact namespace โœจ the <contact:trnData> element holds these child elements:

  • A <contact:id> element that contains the server-unique identifier for the queried contact.
  • A <contact:trStatus> element that contains the state of the most recent transfer request.
  • A <contact:reID> element that contains the identifier of the client that requested the object transfer.
  • A <contact:reDate> element that contains the date and time that the transfer was requested.
  • A <contact:acID> element that contains the identifier of the client that SHOULD act upon a PENDING transfer request. for all other status types, the value identifies the client that took the indicated action ๐Ÿซถ
  • A <contact:acDate> element that contains the date and time of a required or completed response. for a pending request, the value identifies the date and time by which a response is required before an automated response action SHOULD be taken by the server. for all other status types, the value identifies the date and time when the request was completed โฐ

here's an example <transfer> query response:

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:      <contact:trnData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:id>sh8013</contact:id>
S:        <contact:trStatus>pending</contact:trStatus>
S:        <contact:reID>ClientX</contact:reID>
S:        <contact:reDate>2000-06-06T22:00:00.0Z</contact:reDate>
S:        <contact:acID>ClientY</contact:acID>
S:        <contact:acDate>2000-06-11T22:00:00.0Z</contact:acDate>
S:      </contact:trnData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54322-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>
if a <transfer> query command can't be processed for any reason, an EPP error response MUST be returned. this one's serious, so don't skip it ๐Ÿ”ฅ

3.2. EPP Transform Commands โœจ

okay so EPP gives us four commands to transform contact object info ๐Ÿ’…: <create> to make a contact object, <delete> to delete one, <transfer> to manage sponsorship changes, and <update> to change the info attached to a contact object. This document does not define a mapping for the EPP <renew> command ๐Ÿ™ˆ

Transform commands are usually processed and completed in real time โšก. Server operators MAY receive and process transform commands, but defer completing the requested action if human or third-party review is required before it can be completed. In that situation, the server MUST return a 1001 response code to the client to note that the command has been received and processed, but the requested action is pending. The server MUST also manage the status of the object that is the subject of the command so it reflects the start and finish of the requested action. Once the action is completed, all clients involved in the transaction MUST be notified with a service message saying the action is done and the object's status has changed ๐Ÿ””

3.2.1. EPP <create> Command

The EPP <create> command is the transform operation that lets a client create a contact object ๐ŸŽ€. On top of the standard EPP command elements, the <create> command MUST contain a <contact:create> element that identifies the contact namespace. The <contact:create> element has these child elements:

  • A <contact:id> element that contains the desired server-unique identifier for the contact to be created.
  • One or two <contact:postalInfo> elements that contain postal address information. Two elements are allowed so address info can be given in both internationalized and localized forms, and a "type" attribute tells the two forms apart. If an internationalized form (type="int") is provided, element content MUST be represented in a subset of UTF-8 that can be represented in the 7-bit US-ASCII character set. If a localized form (type="loc") is provided, element content MAY be represented in unrestricted UTF-8. The <contact:postalInfo> element has these child elements:
    • A <contact:name> element that contains the name of the individual or role represented by the contact.
    • An OPTIONAL <contact:org> element that contains the name of the organization the contact is affiliated with.
    • A <contact:addr> element that contains address info for the contact. It has these child elements:
      • One, two, or three OPTIONAL <contact:street> elements that contain the contact's street address.
      • A <contact:city> element that contains the contact's city.
      • An OPTIONAL <contact:sp> element that contains the contact's state or province.
      • An OPTIONAL <contact:pc> element that contains the contact's postal code.
      • A <contact:cc> element that contains the contact's country code.
  • An OPTIONAL <contact:voice> element that contains the contact's voice telephone number.
  • An OPTIONAL <contact:fax> element that contains the contact's facsimile telephone number.
  • A <contact:email> element that contains the contact's email address.
  • A <contact:authInfo> element that contains authorization information to be associated with the contact object. This mapping includes a password-based authentication mechanism, but the schema allows new mechanisms to be defined in new schemas.
  • An OPTIONAL <contact:disclose> element that lets a client identify elements needing exceptional server operator handling to allow or restrict disclosure to third parties. See Section 2.9 for a description of the child elements contained within <contact:disclose>.

Example <create> command:

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:      <contact:create
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:        <contact:postalInfo type="int">
C:          <contact:name>John Doe</contact:name>
C:          <contact:org>Example Inc.</contact:org>
C:          <contact:addr>
C:            <contact:street>123 Example Dr.</contact:street>
C:            <contact:street>Suite 100</contact:street>
C:            <contact:city>Dulles</contact:city>
C:            <contact:sp>VA</contact:sp>
C:            <contact:pc>20166-6503</contact:pc>
C:            <contact:cc>US</contact:cc>
C:          </contact:addr>
C:        </contact:postalInfo>
C:        <contact:voice x="1234">+1.7035555555</contact:voice>
C:        <contact:fax>+1.7035555556</contact:fax>
C:        <contact:email>jdoe@example.com</contact:email>
C:        <contact:authInfo>
C:          <contact:pw>2fooBAR</contact:pw>
C:        </contact:authInfo>
C:        <contact:disclose flag="0">
C:          <contact:voice/>
C:          <contact:email/>
C:        </contact:disclose>
C:      </contact:create>
C:    </create>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

When a <create> command has been processed successfully, the EPP <resData> element MUST contain a child <contact:creData> element that identifies the contact namespace. The <contact:creData> element has these child elements:

  • A <contact:id> element that contains the server-unique identifier for the created contact.
  • A <contact:crDate> element that contains the date and time the contact object was created.

Example <create> response:

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:      <contact:creData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:id>sh8013</contact:id>
S:        <contact:crDate>1999-04-03T22:00:00.0Z</contact:crDate>
S:      </contact:creData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

An EPP error response MUST be returned if a <create> command cannot be processed for any reason. ๐Ÿ˜ฌ

3.2.2. EPP <delete> Command

The EPP <delete> command is the transform operation that lets a client delete a contact object ๐Ÿ—‘๏ธ. On top of the standard EPP command elements, the <delete> command MUST contain a <contact:delete> element that identifies the contact namespace. The <contact:delete> element MUST contain the following child element:

  • A <contact:id> element that contains the server-unique identifier of the contact object to be deleted.

A contact object SHOULD NOT be deleted if it is associated with other known objects. An associated contact SHOULD NOT be deleted until its associations with other known objects have been broken. A server SHOULD notify clients of object relationships when a <delete> command is attempted and fails because of existing object relationships. ๐Ÿง

Example <delete> command:

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:      <contact:delete
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:      </contact:delete>
C:    </delete>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

When a <delete> command has been processed successfully, a server MUST respond with an EPP response with no <resData> element.

Example <delete> response:

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:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

An EPP error response MUST be returned if a <delete> command cannot be processed for any reason. ๐Ÿ˜ฌ

3.2.3. EPP <renew> Command

Renewal semantics don't apply to contact objects, so there's no mapping defined for the EPP <renew> command ๐Ÿ™…โ€โ™€๏ธ

3.2.4. EPP <transfer> Command

The EPP <transfer> command is the transform operation that lets a client manage requests to transfer sponsorship of a contact object ๐Ÿ”„. On top of the standard EPP command elements, the <transfer> command MUST contain a <contact:transfer> element that identifies the contact namespace. The <contact:transfer> element has these child elements:

  • A <contact:id> element that contains the server-unique identifier of the contact object for which a transfer request is to be created, approved, rejected, or cancelled.
  • A <contact:authInfo> element that contains authorization information associated with the contact object.

Every EPP <transfer> command MUST contain an "op" attribute that identifies the transfer operation to be performed, as defined in [RFC4930]. โœจ

Example <transfer> request command:

C:<?xml version="1.0" encoding="UTF-8" standalone="no"?>
C:<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
C:  <command>
C:    <transfer op="request">
C:      <contact:transfer
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:        <contact:authInfo>
C:          <contact:pw>2fooBAR</contact:pw>
C:        </contact:authInfo>
C:      </contact:transfer>
C:    </transfer>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

When a <transfer> command has been processed successfully, the EPP <resData> element MUST contain a child <contact:trnData> element that identifies the contact namespace. The <contact:trnData> element contains the same child elements defined for a <transfer> query response.

Example <transfer> response:

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:      <contact:trnData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:id>sh8013</contact:id>
S:        <contact:trStatus>pending</contact:trStatus>
S:        <contact:reID>ClientX</contact:reID>
S:        <contact:reDate>2000-06-08T22:00:00.0Z</contact:reDate>
S:        <contact:acID>ClientY</contact:acID>
S:        <contact:acDate>2000-06-13T22:00:00.0Z</contact:acDate>
S:      </contact:trnData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54322-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

An EPP error response MUST be returned if a <transfer> command cannot be processed for any reason. ๐Ÿ˜ฌ

3.2.5. EPP <update> Command โœจ

Okay bestie, the EPP <update> command is the transform operation where a client gets to glow up a contact object ๐Ÿ’… It lets you modify the attributes of a contact. The <update> command MUST contain a <contact:update> element that identifies the contact namespace ๐ŸŽ€ Inside <contact:update>, you'll find these child elements:

  • A <contact:id> element with the server-unique identifier of the contact object you want to update.
  • An OPTIONAL <contact:add> element with the attribute values you want to add to the object.
  • An OPTIONAL <contact:rem> element with the attribute values you want to remove from the object.
  • An OPTIONAL <contact:chg> element with the object attribute values you want to change.

At least one of <contact:add>, <contact:rem>, or <contact:chg> MUST be provided if the command is not being extended. All of these MAY be omitted if an <update> extension is present ๐Ÿซถ

The <contact:add> and <contact:rem> elements hold these child elements:

  • One or more <contact:status> elements with the status values you want to associate with the object or remove from it. When you're removing a value, only the attribute value matters ๐Ÿ’œ The element text doesn't have to match a value for the removal to work.

A <contact:chg> element has OPTIONAL child elements. At least one child element MUST be present ๐ŸŒธ

  • One or two <contact:postalInfo> elements with postal address information. Two elements let you give the address in both internationalized and localized forms, and a "type" attribute tells you which form is which ๐ŸŒˆ If you provide an internationalized form (type="int"), the element content MUST be represented in a subset of UTF-8 that can be represented in the 7-bit US-ASCII character set. If you provide a localized form (type="loc"), the element content MAY be represented in unrestricted UTF-8. The <contact:postalInfo> element has these OPTIONAL child elements:
    • A <contact:name> element with the name of the individual or role the contact represents.
    • A <contact:org> element with the name of the organization the contact is affiliated with.
    • A <contact:addr> element with address information for the contact. A <contact:addr> element has these child elements:
      • One, two, or three OPTIONAL <contact:street> elements with the contact's street address.
      • A <contact:city> element with the contact's city.
      • An OPTIONAL <contact:sp> element with the contact's state or province.
      • An OPTIONAL <contact:pc> element with the contact's postal code.
      • A <contact:cc> element with the contact's country code.
  • A <contact:voice> element with the contact's voice telephone number ๐Ÿ“ž
  • A <contact:fax> element with the contact's facsimile telephone number ๐Ÿ“ 
  • A <contact:email> element with the contact's email address ๐Ÿ’Œ
  • A <contact:authInfo> element with authorization information associated with the contact object. This mapping includes a password-based authentication mechanism, but the schema lets new mechanisms be defined in new schemas ๐Ÿ”
  • A <contact:disclose> element that lets a client flag elements that need exceptional server operator handling to allow or restrict disclosure to third parties. See Section 2.9 for a rundown of the child elements inside <contact:disclose> ๐Ÿ™ˆ

Example <update> command:

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:      <contact:update
C:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
C:        <contact:id>sh8013</contact:id>
C:        <contact:add>
C:          <contact:status s="clientDeleteProhibited"/>
C:        </contact:add>
C:        <contact:chg>
C:          <contact:postalInfo type="int">
C:            <contact:org/>
C:            <contact:addr>
C:              <contact:street>124 Example Dr.</contact:street>
C:              <contact:street>Suite 200</contact:street>
C:              <contact:city>Dulles</contact:city>
C:              <contact:sp>VA</contact:sp>
C:              <contact:pc>20166-6503</contact:pc>
C:              <contact:cc>US</contact:cc>
C:            </contact:addr>
C:          </contact:postalInfo>
C:          <contact:voice>+1.7034444444</contact:voice>
C:          <contact:fax/>
C:          <contact:authInfo>
C:            <contact:pw>2fooBAR</contact:pw>
C:          </contact:authInfo>
C:          <contact:disclose flag="1">
C:            <contact:voice/>
C:            <contact:email/>
C:          </contact:disclose>
C:        </contact:chg>
C:      </contact:update>
C:    </update>
C:    <clTRID>ABC-12345</clTRID>
C:  </command>
C:</epp>

When an <update> command has been processed successfully, the server MUST respond with an EPP response that has no <resData> element ๐Ÿฅฐ

Example <update> response:

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:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

If an <update> command can't be processed for any reason, an EPP error response MUST be returned. No exceptions, no vibes-only excuses ๐Ÿ’€


3.3. Offline Review of Requested Actions ๐Ÿฆ‹

Commands are processed by the server in the order the client sends them ๐Ÿ•ฐ๏ธ The server gives you an immediate response confirming it got and processed your command. But a server operator MAY do an offline review of requested transform commands before finishing the requested action. When that happens, the response from the server MUST clearly say that the transform command was received and processed, but that the requested action is pending โณ The status of the corresponding object MUST clearly reflect that the pending action is being processed. The server MUST notify the client when offline processing of the action has been completed ๐Ÿ””

Here are examples of a <create> command that needs offline review. Peep the result code and message the server sends back for the <create> command ๐Ÿ‘€

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:      <contact:creData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:id>sh8013</contact:id>
S:        <contact:crDate>1999-04-03T22:00:00.0Z</contact:crDate>
S:      </contact:creData>
S:    </resData>
S:    <trID>
S:      <clTRID>ABC-12345</clTRID>
S:      <svTRID>54321-XYZ</svTRID>
S:    </trID>
S:  </response>
S:</epp>

After this response goes back, the status of the contact object MUST include "pendingCreate" ๐Ÿซง The server operator reviews the request offline and lets the client know the outcome, either by queuing a service message to grab with the <poll> command, or by using an out-of-band mechanism to tell the client about the request ๐Ÿ“ฌ

The service message MUST contain text in the <response>, <msgQ>, <msg> element that describes the notification. On top of that, the EPP <resData> element MUST contain a child <contact:panData> element that identifies the contact namespace ๐Ÿ’– The <contact:panData> element has these child elements:

  • A <contact:id> element with the server-unique identifier of the contact object. The <contact:id> element has a REQUIRED "paResult" attribute. A positive boolean value means the request was approved and completed โœ… A negative boolean value means the request was denied and the requested action was not taken โŒ
  • A <contact:paTRID> element with the client transaction identifier and server transaction identifier that came back with the original response to process the command. The client transaction identifier is OPTIONAL and will only be returned if the client gave an identifier with the original <create> command ๐Ÿชช
  • A <contact:paDate> element with the date and time when review of the requested action was completed ๐Ÿ—“๏ธ

Example "review completed" service message:

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>1999-04-04T22:01:00.0Z</qDate>
S:      <msg>Pending action completed successfully.</msg>
S:    </msgQ>
S:    <resData>
S:      <contact:panData
S:       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0">
S:        <contact:id paResult="1">sh8013</contact:id>
S:        <contact:paTRID>
S:          <clTRID>ABC-12345</clTRID>
S:          <svTRID>54321-XYZ</svTRID>
S:        </contact:paTRID>
S:        <contact:paDate>1999-04-04T22:00:00.0Z</contact:paDate>
S:      </contact:panData>
S:    </resData>
S:    <trID>
S:      <clTRID>BCD-23456</clTRID>
S:      <svTRID>65432-WXY</svTRID>
S:    </trID>
S:  </response>
S:</epp>

4. Formal Syntax ๐Ÿงš

An EPP object mapping is specified in XML Schema notation. The schema below is a complete representation of the object mapping, built so you can run automated validation on EPP XML instances, so it's basically the source of truth ๐Ÿ” The BEGIN and END tags aren't part of the schema. They just mark where the schema starts and ends for URI registration purposes ๐Ÿท๏ธ

BEGIN
<?xml version="1.0" encoding="UTF-8"?>

<schema targetNamespace="urn:ietf:params:xml:ns:contact-1.0"
       xmlns:contact="urn:ietf:params:xml:ns:contact-1.0"
       xmlns:epp="urn:ietf:params:xml:ns:epp-1.0"
       xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-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:epp-1.0"/>

 <annotation>
   <documentation>
     Extensible Provisioning Protocol v1.0
     contact provisioning schema.
   </documentation>
 </annotation>

<!--
Child elements found in EPP commands.
-->
 <element name="check" type="contact:mIDType"/>
 <element name="create" type="contact:createType"/>
 <element name="delete" type="contact:sIDType"/>
 <element name="info" type="contact:authIDType"/>
 <element name="transfer" type="contact:authIDType"/>
 <element name="update" type="contact:updateType"/>

<!--
Utility types.
-->
 <simpleType name="ccType">
   <restriction base="token">
     <length value="2"/>
   </restriction>
 </simpleType>

Okay bestie, the schema keeps going and it's giving tidy little building blocks ๐Ÿ’…โœจ

    <complexType name="e164Type">
      <simpleContent>
        <extension base="contact:e164StringType">
          <attribute name="x" type="token"/>
        </extension>
      </simpleContent>
    </complexType>

    <simpleType name="e164StringType">
      <restriction base="token">
        <pattern value="(\+[0-9]{1,3}\.[0-9]{1,14})?"/>
        <maxLength value="17"/>
      </restriction>
    </simpleType>

    <simpleType name="pcType">

      <restriction base="token">
        <maxLength value="16"/>
      </restriction>
    </simpleType>

    <simpleType name="postalLineType">
       <restriction base="normalizedString">
         <minLength value="1"/>
         <maxLength value="255"/>
       </restriction>
    </simpleType>

    <simpleType name="optPostalLineType">
       <restriction base="normalizedString">
         <maxLength value="255"/>
       </restriction>
    </simpleType>

   <!--
   Child elements of the <create> command.
   -->
    <complexType name="createType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
        <element name="postalInfo" type="contact:postalInfoType"
         maxOccurs="2"/>
        <element name="voice" type="contact:e164Type"
         minOccurs="0"/>
        <element name="fax" type="contact:e164Type"
         minOccurs="0"/>
        <element name="email" type="eppcom:minTokenType"/>
        <element name="authInfo" type="contact:authInfoType"/>
        <element name="disclose" type="contact:discloseType"
         minOccurs="0"/>
      </sequence>
    </complexType>

    <complexType name="postalInfoType">
      <sequence>
        <element name="name" type="contact:postalLineType"/>
        <element name="org" type="contact:optPostalLineType"
         minOccurs="0"/>
        <element name="addr" type="contact:addrType"/>
      </sequence>
      <attribute name="type" type="contact:postalInfoEnumType"
       use="required"/>
    </complexType>
    <simpleType name="postalInfoEnumType">
      <restriction base="token">
        <enumeration value="loc"/>
        <enumeration value="int"/>
      </restriction>
    </simpleType>

    <complexType name="addrType">
      <sequence>
        <element name="street" type="contact:optPostalLineType"
         minOccurs="0" maxOccurs="3"/>
        <element name="city" type="contact:postalLineType"/>
        <element name="sp" type="contact:optPostalLineType"
         minOccurs="0"/>
        <element name="pc" type="contact:pcType"
         minOccurs="0"/>
        <element name="cc" type="contact:ccType"/>
      </sequence>
    </complexType>

    <complexType name="authInfoType">
      <choice>
        <element name="pw" type="eppcom:pwAuthInfoType"/>
        <element name="ext" type="eppcom:extAuthInfoType"/>
      </choice>
    </complexType>

    <complexType name="discloseType">
      <sequence>
        <element name="name" type="contact:intLocType"
         minOccurs="0" maxOccurs="2"/>
        <element name="org" type="contact:intLocType"
         minOccurs="0" maxOccurs="2"/>
        <element name="addr" type="contact:intLocType"
         minOccurs="0" maxOccurs="2"/>
        <element name="voice" minOccurs="0"/>
        <element name="fax" minOccurs="0"/>
        <element name="email" minOccurs="0"/>
      </sequence>
      <attribute name="flag" type="boolean" use="required"/>
    </complexType>

    <complexType name="intLocType">
      <attribute name="type" type="contact:postalInfoEnumType"
       use="required"/>
    </complexType>

   <!--
   Child element of commands that require only an identifier.
   -->
    <complexType name="sIDType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
      </sequence>
    </complexType>

   <!--
   Child element of commands that accept multiple identifiers.
   -->
    <complexType name="mIDType">
      <sequence>
        <element name="id" type="eppcom:clIDType"
         maxOccurs="unbounded"/>
      </sequence>
    </complexType>

   <!--
   Child elements of the <info> and <transfer> commands.
   -->
    <complexType name="authIDType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
        <element name="authInfo" type="contact:authInfoType"
         minOccurs="0"/>
      </sequence>
    </complexType>

   <!--
   Child elements of the <update> command.
   -->
    <complexType name="updateType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
        <element name="add" type="contact:addRemType"
         minOccurs="0"/>
        <element name="rem" type="contact:addRemType"
         minOccurs="0"/>
        <element name="chg" type="contact:chgType"
         minOccurs="0"/>
      </sequence>
    </complexType>

   <!--
   Data elements that can be added or removed.
   -->

    <complexType name="addRemType">
      <sequence>
        <element name="status" type="contact:statusType"
         maxOccurs="7"/>
      </sequence>
    </complexType>

   <!--
   Data elements that can be changed.
   -->
    <complexType name="chgType">
      <sequence>
        <element name="postalInfo" type="contact:chgPostalInfoType"
         minOccurs="0" maxOccurs="2"/>
        <element name="voice" type="contact:e164Type"
         minOccurs="0"/>
        <element name="fax" type="contact:e164Type"
         minOccurs="0"/>
        <element name="email" type="eppcom:minTokenType"
         minOccurs="0"/>
        <element name="authInfo" type="contact:authInfoType"
         minOccurs="0"/>
        <element name="disclose" type="contact:discloseType"
         minOccurs="0"/>
      </sequence>
    </complexType>

    <complexType name="chgPostalInfoType">
      <sequence>
        <element name="name" type="contact:postalLineType"
         minOccurs="0"/>
        <element name="org" type="contact:optPostalLineType"
         minOccurs="0"/>
        <element name="addr" type="contact:addrType"
         minOccurs="0"/>
      </sequence>
      <attribute name="type" type="contact:postalInfoEnumType"
       use="required"/>
    </complexType>

   <!--
   Child response elements.
   -->
    <element name="chkData" type="contact:chkDataType"/>
    <element name="creData" type="contact:creDataType"/>
    <element name="infData" type="contact:infDataType"/>
    <element name="panData" type="contact:panDataType"/>
    <element name="trnData" type="contact:trnDataType"/>

   <!--
   <check> response elements.
   -->
    <complexType name="chkDataType">
      <sequence>
        <element name="cd" type="contact:checkType"
         maxOccurs="unbounded"/>
      </sequence>
    </complexType>

    <complexType name="checkType">
      <sequence>
        <element name="id" type="contact:checkIDType"/>
        <element name="reason" type="eppcom:reasonType"
         minOccurs="0"/>
      </sequence>
    </complexType>

    <complexType name="checkIDType">
      <simpleContent>
        <extension base="eppcom:clIDType">
          <attribute name="avail" type="boolean"
           use="required"/>
        </extension>
      </simpleContent>
    </complexType>

   <!--
   <create> response elements.
   -->
    <complexType name="creDataType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
        <element name="crDate" type="dateTime"/>
      </sequence>
    </complexType>

   <!--
   <info> response elements.
   -->
    <complexType name="infDataType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
        <element name="roid" type="eppcom:roidType"/>
        <element name="status" type="contact:statusType"
         maxOccurs="7"/>
        <element name="postalInfo" type="contact:postalInfoType"
         maxOccurs="2"/>

        <element name="voice" type="contact:e164Type"
         minOccurs="0"/>
        <element name="fax" type="contact:e164Type"
         minOccurs="0"/>
        <element name="email" type="eppcom:minTokenType"/>
        <element name="clID" type="eppcom:clIDType"/>
        <element name="crID" type="eppcom:clIDType"/>
        <element name="crDate" type="dateTime"/>
        <element name="upID" type="eppcom:clIDType"
         minOccurs="0"/>
        <element name="upDate" type="dateTime"
         minOccurs="0"/>
        <element name="trDate" type="dateTime"
         minOccurs="0"/>
        <element name="authInfo" type="contact:authInfoType"
         minOccurs="0"/>
        <element name="disclose" type="contact:discloseType"
         minOccurs="0"/>
      </sequence>
    </complexType>

   <!--
   Status is a combination of attributes and an optional human-readable
   message that may be expressed in languages other than English.
   -->
    <complexType name="statusType">
      <simpleContent>
        <extension base="normalizedString">
          <attribute name="s" type="contact:statusValueType"
           use="required"/>
          <attribute name="lang" type="language"
           default="en"/>
        </extension>
      </simpleContent>
    </complexType>

    <simpleType name="statusValueType">
      <restriction base="token">
        <enumeration value="clientDeleteProhibited"/>
        <enumeration value="clientTransferProhibited"/>
        <enumeration value="clientUpdateProhibited"/>
        <enumeration value="linked"/>
        <enumeration value="ok"/>
        <enumeration value="pendingCreate"/>
        <enumeration value="pendingDelete"/>
        <enumeration value="pendingTransfer"/>
        <enumeration value="pendingUpdate"/>
        <enumeration value="serverDeleteProhibited"/>
        <enumeration value="serverTransferProhibited"/>
        <enumeration value="serverUpdateProhibited"/>
      </restriction>
    </simpleType>

   <!--
   Pending action notification response elements.
   -->
    <complexType name="panDataType">
      <sequence>
        <element name="id" type="contact:paCLIDType"/>
        <element name="paTRID" type="epp:trIDType"/>
        <element name="paDate" type="dateTime"/>
      </sequence>
    </complexType>

    <complexType name="paCLIDType">
      <simpleContent>
        <extension base="eppcom:clIDType">
          <attribute name="paResult" type="boolean"
           use="required"/>
        </extension>
      </simpleContent>
    </complexType>

   <!--
   <transfer> response elements.
   -->
    <complexType name="trnDataType">
      <sequence>
        <element name="id" type="eppcom:clIDType"/>
        <element name="trStatus" type="eppcom:trStatusType"/>
        <element name="reID" type="eppcom:clIDType"/>
        <element name="reDate" type="dateTime"/>
        <element name="acID" type="eppcom:clIDType"/>
        <element name="acDate" type="dateTime"/>
      </sequence>
    </complexType>

   <!--
   End of schema.
   -->
   </schema>
   END

5. Internationalization Considerations ๐ŸŒˆ

okay so EPP is written in XML, and XML is literally built for Unicode ๐Ÿซถ It natively handles the Unicode character set, including the compact UTF-8 form. Conformant XML processors recognize both UTF-8 and UTF-16 [RFC2781]. XML does let you pick another encoding with an "encoding" attribute in the <?xml?> declaration, but for this spec, UTF-8 is REQUIRED. no other options ๐Ÿ’…

All date-time values presented via EPP MUST be expressed in Universal Coordinated Time using the Gregorian calendar. XML Schema lets you use time zone identifiers for offsets from the zero meridian, but that option MUST NOT be used with EPP ๐Ÿ™…โ€โ™€๏ธ Instead, the extended date-time form with upper case "T" and "Z" characters, defined in [W3C.REC-xmlschema-2-20041028], MUST be used to represent date-time values. the reason? XML Schema doesn't support truncated date-time forms or lower case "T" and "Z" characters, so we just don't go there โœจ

Humans, organizations, and other entities often need to show social information in a character set everyone can read and in a locally optimized one ๐ŸŒธ This spec gives you both: a subset of UTF-8 for broad readability, and unrestricted UTF-8 for local optimization. main character energy for internationalization ๐Ÿฆ‹

6. IANA Considerations ๐Ÿ“‹

this doc uses URNs to name XML namespaces and XML schemas, following a registry mechanism described in [RFC3688]. two URI assignments were registered with the IANA, and they're giving organized ๐ŸŽ€

Registration request for the contact namespace:

  • URI: urn:ietf:params:xml:ns:contact-1.0
  • Registrant Contact: See the "Author's Address" section of this document.
  • XML: None. Namespace URIs do not represent an XML specification.

Registration request for the contact XML schema:

  • URI: urn:ietf:params:xml:schema:contact-1.0
  • Registrant Contact: See the "Author's Address" section of this document.
  • XML: See the "Formal Syntax" section of this document.

7. Security Considerations ๐Ÿ”

okay this section is the serious one, bestie, so no skipping ๐Ÿ˜ญ

Authorization information as described in Section 2.8 is REQUIRED to create a contact object. this info is used in some query and transfer operations as an extra way to check that a client is authorized to run the command. if authorization information gets inadvertently disclosed, that can lead to unauthorized transfer operations and unauthorized information release ๐Ÿ’€ so both client and server MUST ensure that authorization information is stored and exchanged with high-grade encryption mechanisms to provide privacy services. protect it like it's your diary ๐Ÿ”’

The object mapping described in this document doesn't provide any other security services or add any new considerations beyond what [RFC4930] and the protocol layers used by EPP already cover.

8. Acknowledgements ๐Ÿซถ

this doc started life as an individual submission Internet-Draft. then the PROVREG working group adopted it as a working group document and gave it a ton of invaluable comments and improvements ๐Ÿ™Œ the author wants to thank WG chairs Edward Lewis and Jaap Akkerhuis for their process and editorial help, which was so iconic.

specific suggestions that made it into this document came from Chris Bason, Eric Brunner-Williams, Jordyn Buchanan, Robert Burbidge, Dave Crocker, Ayesha Damaraju, Anthony Eden, Sheer El-Showk, Dipankar Ghosh, Klaus Malorny, Dan Manley, Michael Mealling, Patrick Mevzek, Asbjorn Steira, and Rick Wesson. the real MVPs ๐Ÿ‘‘

9. References ๐Ÿ“š

9.1. Normative References

  • [ISO.3166.1997]: International Organization for Standardization, "Codes for the representation of names of countries and their subdivisions -- Part 1: Country codes", ISO Standard 3166, October 1997.
  • [ITU.E164.2005]: International Telecommunication Union, "The international public telecommunication numbering plan", ITU-T Recommendation E.164, February 2005.
  • [RFC0822]: Crocker, D., "Standard for the format of ARPA Internet text messages", STD 11, RFC 822, August 1982.
  • [RFC2119]: Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, March 1997.
  • [RFC3629]: Yergeau, F., "UTF-8, a transformation format of ISO 10646", STD 63, RFC 3629, November 2003.
  • [RFC3688]: Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688, January 2004.
  • [RFC4930]: Hollenbeck, S., "Extensible Provisioning Protocol (EPP)", RFC 4930, May 2007.
  • [W3C.REC-xml-20040204]: Yergeau, F., Maler, E., Sperberg-McQueen, C., Bray, T., and J. Paoli, "Extensible Markup Language (XML) 1.0 (Third Edition)", World Wide Web Consortium FirstEdition REC-xml-20040204, February 2004, http://www.w3.org/TR/2004/REC-xml-20040204.
  • [W3C.REC-xmlschema-1-20041028]: Thompson, H., Maloney, M., Mendelsohn, N., and D. Beech, "XML Schema Part 1: Structures Second Edition", World Wide Web Consortium Recommendation REC-xmlschema-1-20041028, October 2004, http://www.w3.org/TR/2004/REC-xmlschema-1-20041028.
  • [W3C.REC-xmlschema-2-20041028]: Biron, P. and A. Malhotra, "XML Schema Part 2: Datatypes Second Edition", World Wide Web Consortium Recommendation REC-xmlschema-2-20041028, October 2004, http://www.w3.org/TR/2004/REC-xmlschema-2-20041028.

9.2. Informative References

  • [RFC2781]: Hoffman, P. and F. Yergeau, "UTF-16, an encoding of ISO 10646", RFC 2781, February 2000.
  • [RFC3733]: Hollenbeck, S., "Extensible Provisioning Protocol (EPP) Contact Mapping", RFC 3733, March 2004.

Appendix A. Changes from RFC 3733 ๐Ÿ“

the glow-up log, bestie ๐Ÿ’–

  1. Minor reformatting as a result of converting I-D source format from nroff to XML.
  2. Removed this text from Section 2.2: "With one exception, transform commands MUST be rejected when a pendingCreate, pendingDelete, pendingTransfer, or pendingUpdate status is set. The only exception is that a <transfer> command to approve, reject, or cancel a transfer MAY be processed while an object is in "pendingTransfer" status."
  3. Fixed examples in Section 2.9 (added missing "/" characters).
  4. Changed text in Section 3.1.3 from "A <contact:acID> element that contains the identifier of the client that SHOULD act upon the transfer request" to "A <contact:acID> element that contains the identifier of the client that SHOULD act upon a PENDING transfer request. For all other status types, the value identifies the client that took the indicated action".
  5. Fixed the example response in Section 3.2.4 to use the correct response code and response text.
  6. Changed text in Section 3.2.5 from "At least one <contact:add>, <contact:rem>, or <contact:chg> element MUST be provided." to "At least one <contact:add>, <contact:rem>, or <contact:chg> element MUST be provided if the command is not being extended. All of these elements MAY be omitted if an <update> extension is present."
  7. Changed text in Section 3.3 (old Section 3.2.6) from this: "The server operator reviews the request offline, and informs the client of the outcome of the review by queuing a service message for retrieval via the <poll> command." to this: "The server operator reviews the request offline, and informs the client of the outcome of the review either by queuing a service message for retrieval via the <poll> command or by using an out-of-band mechanism to inform the client of the request."
  8. Removed text describing use of the XML Schema schemaLocation attribute. This is an optional attribute that doesn't need to be mandated for use in EPP.
  9. Updated text describing a requirement to use UTF-8 encoding in the "Internationalization Considerations" section.
  10. Removed references to RFC 3339 and replaced them with references to the W3C XML Schema specification.
  11. Updated the E.164 reference.
  12. Updated EPP and XML references. Updated reference from RFC 2279 to RFC 3629.

Author's Address ๐Ÿ–Š๏ธ

Scott Hollenbeck
VeriSign, Inc.
21345 Ridgetop Circle
Dulles, VA  20166-6503
US

EMail: shollenbeck@verisign.com
Copyright (C) The IETF Trust (2007).

This document is subject to the rights, licenses and restrictions
contained in BCP 78, and except as set forth therein, the authors
retain all their rights.

This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.

Intellectual Property ๐Ÿงพ

The IETF takes no position regarding the validity or scope of any
Intellectual Property Rights or other rights that might be claimed to
pertain to the implementation or use of the technology described in
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights.  Information
on the procedures with respect to rights in RFC documents can be
found in BCP 78 and BCP 79.

Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.

The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard.  Please address the information to the IETF at
ietf-ipr@ietf.org.

Acknowledgement ๐Ÿ’œ

funding for the RFC Editor function is currently provided by the Internet Society ๐Ÿฆ‹


๐Ÿ“ฆ where this page comes from