RDAP: Add registrar entity for domains

The RDAP Pilot Program operational profile document indicates that domain
responses should list, in addition to their normal contacts, a special entity
for the registrar.

1.5.12.  The domain object in the RDAP response MUST contain an entity with the registrar role (called registrar entity in this section). The handle of the entity MUST be equal to the IANA Registrar ID. A valid fn member MUST be present in the registrar entity. Other members MAY be present in the entity (as specified in RFC6350, the vCard Format Specification and its corresponding JSON mapping RFC7095). Contracted parties MUST include an entity with the abuse role (called Abuse Entity in this section) within the registrar entity. The Abuse Entity MUST include tel and email members, and MAY include other members.
1.5.13.  The entity with the registrar role in the RDAP response MUST contain a publicIDs member [RFC7483] to identify the IANA Registrar ID from the IANA’s Registrar ID registry (https://www.iana.org/assignments/registrar-ids/registrar-ids.xhtml). The type value of the publicID object MUST be equal to IANA Registrar ID.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=186797360
This commit is contained in:
mountford 2018-02-23 11:26:06 -08:00 committed by jianglai
parent a898413c8c
commit 21313bffda
9 changed files with 650 additions and 5 deletions

View file

@ -543,6 +543,14 @@ public class RdapJsonFormatter {
outputDataType,
authorization))
.collect(toImmutableList());
entities =
addRegistrarEntity(
entities,
domainResource.getCurrentSponsorClientId(),
linkBase,
whoisServer,
now,
outputDataType);
if (!entities.isEmpty()) {
jsonBuilder.put("entities", entities);
}
@ -574,6 +582,38 @@ public class RdapJsonFormatter {
return jsonBuilder.build();
}
/**
* Adds a JSON object for the desired registrar to an existing array of JSON objects.
*
* @param clientId the registrar client ID
* @param linkBase the URL base to be used when creating links
* @param whoisServer the fully-qualified domain name of the WHOIS server to be listed in the
* port43 field; if null, port43 is not added to the object
* @param now the as-date
* @param outputDataType whether to generate full or summary data
*/
ImmutableList<ImmutableMap<String, Object>> addRegistrarEntity(
ImmutableList<ImmutableMap<String, Object>> entities,
@Nullable String clientId,
@Nullable String linkBase,
@Nullable String whoisServer,
DateTime now,
OutputDataType outputDataType) {
if (clientId == null) {
return entities;
}
Optional<Registrar> registrar = Registrar.loadByClientIdCached(clientId);
if (!registrar.isPresent()) {
return entities;
}
ImmutableList.Builder<ImmutableMap<String, Object>> builder = new ImmutableList.Builder<>();
builder.addAll(entities);
builder.add(
makeRdapJsonForRegistrar(
registrar.get(), false /* isTopLevel */, linkBase, whoisServer, now, outputDataType));
return builder.build();
}
/**
* Creates a JSON object for a {@link HostResource}.
*

View file

@ -298,7 +298,8 @@ public class RdapDomainActionTest {
String punycodeName,
String handle,
String expectedOutputFile) {
return generateExpectedJson(name, punycodeName, handle, null, null, null, expectedOutputFile);
return generateExpectedJson(
name, punycodeName, handle, null, null, null, null, expectedOutputFile);
}
private Object generateExpectedJson(
@ -308,6 +309,7 @@ public class RdapDomainActionTest {
@Nullable List<String> contactRoids,
@Nullable List<String> nameserverRoids,
@Nullable List<String> nameserverNames,
@Nullable String registrarName,
String expectedOutputFile) {
ImmutableMap.Builder<String, String> substitutionsBuilder = new ImmutableMap.Builder<>();
substitutionsBuilder.put("NAME", name);
@ -316,6 +318,9 @@ public class RdapDomainActionTest {
substitutionsBuilder.put("TYPE", "domain name");
substitutionsBuilder.put("NAMESERVER1ADDRESS", "1.2.3.4");
substitutionsBuilder.put("NAMESERVER2ADDRESS", "bad:f00d:cafe::15:beef");
if (registrarName != null) {
substitutionsBuilder.put("REGISTRARNAME", registrarName);
}
if (contactRoids != null) {
for (int i = 0; i < contactRoids.size(); i++) {
substitutionsBuilder.put("CONTACT" + (i + 1) + "ROID", contactRoids.get(i));
@ -350,9 +355,17 @@ public class RdapDomainActionTest {
String handle,
@Nullable List<String> contactRoids,
@Nullable List<String> nameserverRoids,
@Nullable String registrarName,
String expectedOutputFile) {
return generateExpectedJsonWithTopLevelEntries(
name, punycodeName, handle, contactRoids, nameserverRoids, null, expectedOutputFile);
name,
punycodeName,
handle,
contactRoids,
nameserverRoids,
null,
registrarName,
expectedOutputFile);
}
private Object generateExpectedJsonWithTopLevelEntries(
String name,
@ -361,6 +374,7 @@ public class RdapDomainActionTest {
@Nullable List<String> contactRoids,
@Nullable List<String> nameserverRoids,
@Nullable List<String> nameserverNames,
@Nullable String registrarName,
String expectedOutputFile) {
Object obj =
generateExpectedJson(
@ -370,6 +384,7 @@ public class RdapDomainActionTest {
contactRoids,
nameserverRoids,
nameserverNames,
registrarName,
expectedOutputFile);
if (obj instanceof Map) {
@SuppressWarnings("unchecked")
@ -412,6 +427,7 @@ public class RdapDomainActionTest {
? ImmutableList.of("4-ROID", "6-ROID", "2-ROID")
: null,
ImmutableList.of("8-ROID", "A-ROID"),
"Yes Virginia <script>",
expectedOutputFile));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -505,6 +521,7 @@ public class RdapDomainActionTest {
"1D-Q9JYB4C",
ImmutableList.of("19-ROID", "1B-ROID", "17-ROID"),
ImmutableList.of("8-ROID", "A-ROID"),
"IDN Registrar",
"rdap_domain_unicode.json"));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -520,6 +537,7 @@ public class RdapDomainActionTest {
"1D-Q9JYB4C",
ImmutableList.of("19-ROID", "1B-ROID", "17-ROID"),
ImmutableList.of("8-ROID", "A-ROID"),
"IDN Registrar",
"rdap_domain_unicode.json"));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -535,6 +553,7 @@ public class RdapDomainActionTest {
"1D-Q9JYB4C",
ImmutableList.of("19-ROID", "1B-ROID", "17-ROID"),
ImmutableList.of("8-ROID", "A-ROID"),
"IDN Registrar",
"rdap_domain_unicode.json"));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -550,6 +569,7 @@ public class RdapDomainActionTest {
"25-1_TLD",
ImmutableList.of("21-ROID", "23-ROID", "1F-ROID"),
ImmutableList.of("8-ROID", "A-ROID"),
"Multilevel Registrar",
"rdap_domain.json"));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -606,6 +626,7 @@ public class RdapDomainActionTest {
ImmutableList.of("11-ROID", "13-ROID", "F-ROID"),
ImmutableList.of("8-ROID", "D-ROID"),
ImmutableList.of("ns1.cat.lol", "ns2.dodo.lol"),
"Yes Virginia <script>",
"rdap_domain_deleted.json"));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -623,6 +644,7 @@ public class RdapDomainActionTest {
ImmutableList.of("11-ROID", "13-ROID", "F-ROID"),
ImmutableList.of("8-ROID", "D-ROID"),
ImmutableList.of("ns1.cat.lol", "ns2.dodo.lol"),
"Yes Virginia <script>",
"rdap_domain_deleted.json"));
assertThat(response.getStatus()).isEqualTo(200);
}

View file

@ -500,7 +500,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
}
private Object generateExpectedJson(String name, String expectedOutputFile) {
return generateExpectedJson(name, null, null, null, null, expectedOutputFile);
return generateExpectedJson(name, null, null, null, null, null, expectedOutputFile);
}
private Object generateExpectedJson(
@ -509,6 +509,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
String handle,
@Nullable List<String> contactRoids,
@Nullable List<String> nameservers,
@Nullable String registrarName,
String expectedOutputFile) {
ImmutableMap.Builder<String, String> substitutionsBuilder = new ImmutableMap.Builder<>();
substitutionsBuilder.put("NAME", name);
@ -532,6 +533,9 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
InetAddresses.toAddrString(host.getInetAddresses().asList().get(0)));
}
}
if (registrarName != null) {
substitutionsBuilder.put("REGISTRARNAME", registrarName);
}
return JSONValue.parse(
loadFile(this.getClass(), expectedOutputFile, substitutionsBuilder.build()));
}
@ -542,10 +546,17 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
String handle,
@Nullable List<String> contactRoids,
@Nullable List<String> nameservers,
@Nullable String registrarName,
String expectedOutputFile) {
Object obj =
generateExpectedJson(
name, punycodeName, handle, contactRoids, nameservers, expectedOutputFile);
name,
punycodeName,
handle,
contactRoids,
nameservers,
registrarName,
expectedOutputFile);
ImmutableMap.Builder<String, Object> builder = new ImmutableMap.Builder<>();
builder.put("domainSearchResults", ImmutableList.of(obj));
builder.put("rdapConformance", ImmutableList.of("rdap_level_0"));
@ -681,6 +692,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"C-LOL",
ImmutableList.of("4-ROID", "6-ROID", "2-ROID"),
ImmutableList.of("ns1.cat.lol", "ns2.cat.lol"),
"Yes Virginia <script>",
fileName);
}
@ -694,6 +706,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"17-LOL",
ImmutableList.of("F-ROID", "11-ROID", "D-ROID"),
ImmutableList.of("ns1.cat.example", "ns2.dog.lol"),
"Yes Virginia <script>",
fileName);
}
@ -705,12 +718,13 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
String handle,
@Nullable List<String> contactRoids,
@Nullable List<String> nameservers,
@Nullable String registrarName,
String fileName) {
rememberWildcardType(queryString);
assertThat(generateActualJson(requestType, queryString))
.isEqualTo(
generateExpectedJsonForDomain(
name, punycodeName, handle, contactRoids, nameservers, fileName));
name, punycodeName, handle, contactRoids, nameservers, registrarName, fileName));
assertThat(response.getStatus()).isEqualTo(200);
}
@ -1008,6 +1022,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"21-EXAMPLE",
null,
ImmutableList.of("ns1.cat.lol", "ns2.external.tld"),
"Yes Virginia <script>",
"rdap_domain_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_DOMAIN_NAME, Optional.of(1L));
}
@ -1022,6 +1037,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"2D-Q9JYB4C",
null,
ImmutableList.of("ns1.cat.xn--q9jyb4c", "ns2.cat.xn--q9jyb4c"),
"Yes Virginia <script>",
"rdap_domain_unicode_no_contacts_with_remark.json");
// The unicode gets translated to ASCII before getting parsed into a search pattern.
metricPrefixLength = 15;
@ -1038,6 +1054,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"2D-Q9JYB4C",
null,
ImmutableList.of("ns1.cat.xn--q9jyb4c", "ns2.cat.xn--q9jyb4c"),
"Yes Virginia <script>",
"rdap_domain_unicode_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_DOMAIN_NAME, Optional.of(1L));
}
@ -1052,6 +1069,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"39-1_TEST",
ImmutableList.of("4-ROID", "6-ROID", "2-ROID"),
ImmutableList.of("ns1.cat.1.test", "ns2.cat.2.test"),
"Yes Virginia <script>",
"rdap_domain_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_DOMAIN_NAME, Optional.of(1L));
}
@ -1066,6 +1084,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"39-1_TEST",
ImmutableList.of("4-ROID", "6-ROID", "2-ROID"),
ImmutableList.of("ns1.cat.1.test", "ns2.cat.2.test"),
"Yes Virginia <script>",
"rdap_domain_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_DOMAIN_NAME, Optional.of(1L));
}
@ -1592,6 +1611,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"2D-Q9JYB4C",
null,
ImmutableList.of("ns1.cat.xn--q9jyb4c", "ns2.cat.xn--q9jyb4c"),
"Yes Virginia <script>",
"rdap_domain_unicode_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_NAMESERVER_NAME, 1, 1);
}
@ -1606,6 +1626,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"39-1_TEST",
ImmutableList.of("4-ROID", "6-ROID", "2-ROID"),
ImmutableList.of("ns1.cat.1.test", "ns2.cat.2.test"),
"Yes Virginia <script>",
"rdap_domain_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_NAMESERVER_NAME, 1, 1);
}
@ -1620,6 +1641,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"39-1_TEST",
ImmutableList.of("4-ROID", "6-ROID", "2-ROID"),
ImmutableList.of("ns1.cat.1.test", "ns2.cat.2.test"),
"Yes Virginia <script>",
"rdap_domain_no_contacts_with_remark.json");
verifyMetrics(SearchType.BY_NAMESERVER_NAME, 1, 1);
}
@ -1983,6 +2005,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"C-LOL",
ImmutableList.of("4-ROID", "6-ROID", "2-ROID"),
ImmutableList.of("ns1.cat.lol", "ns2.cat.lol"),
"Yes Virginia <script>",
"rdap_domain.json"));
assertThat(response.getStatus()).isEqualTo(200);
verifyMetrics(SearchType.BY_NAMESERVER_ADDRESS, 1, 1);

View file

@ -381,6 +381,93 @@
]
]
]
},
{
"objectClassName": "entity",
"status": [ "active" ],
"handle": "1",
"roles": [ "registrar" ],
"links": [
{
"href": "https://example.com/rdap/entity/1",
"type": "application/rdap+json",
"rel": "self",
"value": "https://example.com/rdap/entity/1"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "1",
"eventDate": "2000-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "%REGISTRARNAME%"],
[
"adr",
{},
"text",
[
"",
"",
"123 Example Boulevard <script>",
"Williamsburg <script>",
"NY",
"11211",
"United States"
]
],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551212"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "contact-us@example.com"]
]
],
"publicIds" : [
{
"type": "IANA Registrar ID",
"identifier":"1"
}
],
"entities" : [
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Jane Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551215"],
["tel", {"type":["fax"]}, "uri","tel:+1.2125551216"],
["email", {}, "text", "janedoe@example.com"]
]
],
"roles" : ["administrative"],
"objectClassName" : "entity"
},
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "John Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551213"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "johndoe@example.com"]
]
],
"roles" : ["technical"],
"objectClassName" : "entity"
}
]
}
],
"objectClassName": "domain"

View file

@ -381,6 +381,93 @@
]
]
]
},
{
"objectClassName": "entity",
"status": [ "active" ],
"handle": "1",
"roles": [ "registrar" ],
"links": [
{
"href": "https://example.com/rdap/entity/1",
"type": "application/rdap+json",
"rel": "self",
"value": "https://example.com/rdap/entity/1"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "1",
"eventDate": "2000-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "%REGISTRARNAME%"],
[
"adr",
{},
"text",
[
"",
"",
"123 Example Boulevard <script>",
"Williamsburg <script>",
"NY",
"11211",
"United States"
]
],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551212"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "contact-us@example.com"]
]
],
"publicIds" : [
{
"type": "IANA Registrar ID",
"identifier":"1"
}
],
"entities" : [
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Jane Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551215"],
["tel", {"type":["fax"]}, "uri","tel:+1.2125551216"],
["email", {}, "text", "janedoe@example.com"]
]
],
"roles" : ["administrative"],
"objectClassName" : "entity"
},
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "John Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551213"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "johndoe@example.com"]
]
],
"roles" : ["technical"],
"objectClassName" : "entity"
}
]
}
],
"objectClassName": "domain"

View file

@ -383,6 +383,93 @@
]
]
]
},
{
"objectClassName": "entity",
"status": [ "active" ],
"handle": "1",
"roles": [ "registrar" ],
"links": [
{
"href": "https://example.com/rdap/entity/1",
"type": "application/rdap+json",
"rel": "self",
"value": "https://example.com/rdap/entity/1"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "1",
"eventDate": "2000-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "%REGISTRARNAME%"],
[
"adr",
{},
"text",
[
"",
"",
"123 Example Boulevard <script>",
"Williamsburg <script>",
"NY",
"11211",
"United States"
]
],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551212"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "contact-us@example.com"]
]
],
"publicIds" : [
{
"type": "IANA Registrar ID",
"identifier":"1"
}
],
"entities" : [
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Jane Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551215"],
["tel", {"type":["fax"]}, "uri","tel:+1.2125551216"],
["email", {}, "text", "janedoe@example.com"]
]
],
"roles" : ["administrative"],
"objectClassName" : "entity"
},
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "John Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551213"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "johndoe@example.com"]
]
],
"roles" : ["technical"],
"objectClassName" : "entity"
}
]
}
],
"objectClassName": "domain"

View file

@ -386,6 +386,93 @@
]
]
]
},
{
"objectClassName": "entity",
"status": [ "active" ],
"handle": "1",
"roles": [ "registrar" ],
"links": [
{
"href": "https://example.com/rdap/entity/1",
"type": "application/rdap+json",
"rel": "self",
"value": "https://example.com/rdap/entity/1"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "1",
"eventDate": "2000-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "%REGISTRARNAME%"],
[
"adr",
{},
"text",
[
"",
"",
"123 Example Boulevard <script>",
"Williamsburg <script>",
"NY",
"11211",
"United States"
]
],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551212"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "contact-us@example.com"]
]
],
"publicIds" : [
{
"type": "IANA Registrar ID",
"identifier":"1"
}
],
"entities" : [
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Jane Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551215"],
["tel", {"type":["fax"]}, "uri","tel:+1.2125551216"],
["email", {}, "text", "janedoe@example.com"]
]
],
"roles" : ["administrative"],
"objectClassName" : "entity"
},
{
"status" : ["active"],
"vcardArray" : [
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "John Doe"],
["tel", {"type":["voice"]}, "uri", "tel:+1.2125551213"],
["tel", {"type":["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "johndoe@example.com"]
]
],
"roles" : ["technical"],
"objectClassName" : "entity"
}
]
}
],
"objectClassName": "domain"

View file

@ -240,6 +240,112 @@
["email", {}, "text", "lol@cat.みんな"]
]
]
},
{
"objectClassName" : "entity",
"handle" : "1",
"status" : ["active"],
"roles" : ["registrar"],
"links" :
[
{
"value" : "http://myserver.example.com/entity/1",
"rel" : "self",
"href" : "http://myserver.example.com/entity/1",
"type" : "application/rdap+json"
}
],
"events" :
[
{
"eventAction": "registration",
"eventActor": "1",
"eventDate": "1999-01-01T00:00:00.000Z"
},
{
"eventAction": "last changed",
"eventDate": "2000-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"publicIds" :
[
{
"type" : "IANA Registrar ID",
"identifier" : "1"
}
],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "みんな"],
["adr", {}, "text", [
"",
"",
"123 Example Boulevard <script>",
"Williamsburg <script>",
"NY",
"11211",
"United States"]],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2125551212"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "contact-us@example.com"]
]
],
"entities" :
[
{
"objectClassName" : "entity",
"status" : ["active"],
"roles" : ["administrative"],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Jane Doe"],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2125551215"],
["email", {}, "text", "janedoe@example.com"]
]
],
},
{
"objectClassName" : "entity",
"status" : ["active"],
"roles" : ["technical"],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "John Doe"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "johndoe@example.com"]
]
],
},
{
"objectClassName" : "entity",
"status" : ["active"],
"roles" : ["administrative", "technical"],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Play Doe"],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2125551217"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2125551218"],
["email", {}, "text", "playdoe@example.com"]
]
],
}
]
}
]
}

View file

@ -176,6 +176,112 @@
["email", {}, "text", "lol@cat.みんな"]
]
]
},
{
"objectClassName" : "entity",
"handle" : "1",
"status" : ["active"],
"roles" : ["registrar"],
"links" :
[
{
"value" : "http://myserver.example.com/entity/1",
"rel" : "self",
"href" : "http://myserver.example.com/entity/1",
"type" : "application/rdap+json"
}
],
"events" :
[
{
"eventAction": "registration",
"eventActor": "1",
"eventDate": "1999-01-01T00:00:00.000Z"
},
{
"eventAction": "last changed",
"eventDate": "2000-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"publicIds" :
[
{
"type" : "IANA Registrar ID",
"identifier" : "1"
}
],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "みんな"],
["adr", {}, "text", [
"",
"",
"123 Example Boulevard <script>",
"Williamsburg <script>",
"NY",
"11211",
"United States"]],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2125551212"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "contact-us@example.com"]
]
],
"entities" :
[
{
"objectClassName" : "entity",
"status" : ["active"],
"roles" : ["administrative"],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Jane Doe"],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2125551215"],
["email", {}, "text", "janedoe@example.com"]
]
],
},
{
"objectClassName" : "entity",
"status" : ["active"],
"roles" : ["technical"],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "John Doe"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2125551213"],
["email", {}, "text", "johndoe@example.com"]
]
],
},
{
"objectClassName" : "entity",
"status" : ["active"],
"roles" : ["administrative", "technical"],
"vcardArray" :
[
"vcard",
[
["version", {}, "text", "4.0"],
["fn", {}, "text", "Play Doe"],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2125551217"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2125551218"],
["email", {}, "text", "playdoe@example.com"]
]
],
}
]
}
]
}