Handle LINKED correctly in RDAP

LINKED is a virtual status that needs to be computed on the fly
when creating an RDAP response.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=145583415
This commit is contained in:
cgoldfeder 2017-01-25 12:43:41 -08:00 committed by Ben McIlwain
parent 8071a1bdb5
commit 4a730e0c9e
25 changed files with 306 additions and 60 deletions

View file

@ -15,7 +15,9 @@
package google.registry.rdap; package google.registry.rdap;
import static com.google.common.base.Strings.nullToEmpty; import static com.google.common.base.Strings.nullToEmpty;
import static google.registry.model.EppResourceUtils.isLinked;
import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.model.ofy.ObjectifyService.ofy;
import static google.registry.util.CollectionUtils.union;
import static google.registry.util.DomainNameUtils.ACE_PREFIX; import static google.registry.util.DomainNameUtils.ACE_PREFIX;
import com.google.common.base.Function; import com.google.common.base.Function;
@ -551,7 +553,10 @@ public class RdapJsonFormatter {
if (hasUnicodeComponents(hostResource.getFullyQualifiedHostName())) { if (hasUnicodeComponents(hostResource.getFullyQualifiedHostName())) {
jsonBuilder.put("unicodeName", Idn.toUnicode(hostResource.getFullyQualifiedHostName())); jsonBuilder.put("unicodeName", Idn.toUnicode(hostResource.getFullyQualifiedHostName()));
} }
jsonBuilder.put("status", makeStatusValueList(hostResource.getStatusValues())); jsonBuilder.put("status", makeStatusValueList(
isLinked(Key.create(hostResource), now)
? union(hostResource.getStatusValues(), StatusValue.LINKED)
: hostResource.getStatusValues()));
jsonBuilder.put("links", ImmutableList.of( jsonBuilder.put("links", ImmutableList.of(
makeLink("nameserver", hostResource.getFullyQualifiedHostName(), linkBase))); makeLink("nameserver", hostResource.getFullyQualifiedHostName(), linkBase)));
List<ImmutableMap<String, Object>> remarks; List<ImmutableMap<String, Object>> remarks;
@ -630,7 +635,10 @@ public class RdapJsonFormatter {
ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>(); ImmutableMap.Builder<String, Object> jsonBuilder = new ImmutableMap.Builder<>();
jsonBuilder.put("objectClassName", "entity"); jsonBuilder.put("objectClassName", "entity");
jsonBuilder.put("handle", contactResource.getRepoId()); jsonBuilder.put("handle", contactResource.getRepoId());
jsonBuilder.put("status", makeStatusValueList(contactResource.getStatusValues())); jsonBuilder.put("status", makeStatusValueList(
isLinked(Key.create(contactResource), now)
? union(contactResource.getStatusValues(), StatusValue.LINKED)
: contactResource.getStatusValues()));
if (contactType.isPresent()) { if (contactType.isPresent()) {
jsonBuilder.put("roles", jsonBuilder.put("roles",
ImmutableList.of(convertContactTypeToRdapRole(contactType.get()))); ImmutableList.of(convertContactTypeToRdapRole(contactType.get())));

View file

@ -78,19 +78,19 @@ public class RdapEntityActionTest {
"evilregistrar", "Yes Virginia <script>", Registrar.State.ACTIVE, 101L)); "evilregistrar", "Yes Virginia <script>", Registrar.State.ACTIVE, 101L));
persistSimpleResources(makeRegistrarContacts(registrarLol)); persistSimpleResources(makeRegistrarContacts(registrarLol));
registrant = makeAndPersistContactResource( registrant = makeAndPersistContactResource(
"8372808-ERL", "8372808-REG",
"(◕‿◕)", "(◕‿◕)",
"lol@cat.みんな", "lol@cat.みんな",
ImmutableList.of("1 Smiley Row", "Suite みんな"), ImmutableList.of("1 Smiley Row", "Suite みんな"),
clock.nowUtc()); clock.nowUtc());
adminContact = makeAndPersistContactResource( adminContact = makeAndPersistContactResource(
"8372808-ERL", "8372808-ADM",
"(◕‿◕)", "(◕‿◕)",
"lol@cat.みんな", "lol@cat.みんな",
ImmutableList.of("1 Smiley Row", "Suite みんな"), ImmutableList.of("1 Smiley Row", "Suite みんな"),
clock.nowUtc()); clock.nowUtc());
techContact = makeAndPersistContactResource( techContact = makeAndPersistContactResource(
"8372808-ERL", "8372808-TEC",
"(◕‿◕)", "(◕‿◕)",
"lol@cat.みんな", "lol@cat.みんな",
ImmutableList.of("1 Smiley Row", "Suite みんな"), ImmutableList.of("1 Smiley Row", "Suite みんな"),
@ -130,13 +130,13 @@ public class RdapEntityActionTest {
host2, host2,
registrar1tld)); registrar1tld));
disconnectedContact = makeAndPersistContactResource( disconnectedContact = makeAndPersistContactResource(
"8372808-ERL", "8372808-DIS",
"(◕‿◕)", "(◕‿◕)",
"lol@cat.みんな", "lol@cat.みんな",
ImmutableList.of("1 Smiley Row", "Suite みんな"), ImmutableList.of("1 Smiley Row", "Suite みんな"),
clock.nowUtc()); clock.nowUtc());
deletedContact = persistResource(makeContactResource( deletedContact = persistResource(makeContactResource(
"8372808-ERL", "8372808-DEL",
"(◕‿◕)", "(◕‿◕)",
"lol@cat.みんな", "lol@cat.みんな",
ImmutableList.of("1 Smiley Row", "Suite みんな")) ImmutableList.of("1 Smiley Row", "Suite みんな"))
@ -211,21 +211,24 @@ public class RdapEntityActionTest {
@Test @Test
public void testValidRegistrantContact_works() throws Exception { public void testValidRegistrantContact_works() throws Exception {
assertThat(generateActualJson(registrant.getRepoId())).isEqualTo( assertThat(generateActualJson(registrant.getRepoId())).isEqualTo(
generateExpectedJsonWithTopLevelEntries(registrant.getRepoId(), "rdap_contact.json")); generateExpectedJsonWithTopLevelEntries(
registrant.getRepoId(), "rdap_associated_contact.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
@Test @Test
public void testValidAdminContact_works() throws Exception { public void testValidAdminContact_works() throws Exception {
assertThat(generateActualJson(adminContact.getRepoId())).isEqualTo( assertThat(generateActualJson(adminContact.getRepoId())).isEqualTo(
generateExpectedJsonWithTopLevelEntries(adminContact.getRepoId(), "rdap_contact.json")); generateExpectedJsonWithTopLevelEntries(
adminContact.getRepoId(), "rdap_associated_contact.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
@Test @Test
public void testValidTechContact_works() throws Exception { public void testValidTechContact_works() throws Exception {
assertThat(generateActualJson(techContact.getRepoId())).isEqualTo( assertThat(generateActualJson(techContact.getRepoId())).isEqualTo(
generateExpectedJsonWithTopLevelEntries(techContact.getRepoId(), "rdap_contact.json")); generateExpectedJsonWithTopLevelEntries(
techContact.getRepoId(), "rdap_associated_contact.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
@ -272,7 +275,8 @@ public class RdapEntityActionTest {
@Test @Test
public void testQueryParameter_ignored() throws Exception { public void testQueryParameter_ignored() throws Exception {
assertThat(generateActualJson(techContact.getRepoId() + "?key=value")).isEqualTo( assertThat(generateActualJson(techContact.getRepoId() + "?key=value")).isEqualTo(
generateExpectedJsonWithTopLevelEntries(techContact.getRepoId(), "rdap_contact.json")); generateExpectedJsonWithTopLevelEntries(
techContact.getRepoId(), "rdap_associated_contact.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
} }

View file

@ -74,9 +74,11 @@ public class RdapJsonFormatterTest {
private HostResource hostResourceIpv6; private HostResource hostResourceIpv6;
private HostResource hostResourceBoth; private HostResource hostResourceBoth;
private HostResource hostResourceNoAddresses; private HostResource hostResourceNoAddresses;
private HostResource hostResourceNotLinked;
private ContactResource contactResourceRegistrant; private ContactResource contactResourceRegistrant;
private ContactResource contactResourceAdmin; private ContactResource contactResourceAdmin;
private ContactResource contactResourceTech; private ContactResource contactResourceTech;
private ContactResource contactResourceNotLinked;
private static final String LINK_BASE = "http://myserver.example.com/"; private static final String LINK_BASE = "http://myserver.example.com/";
private static final String LINK_BASE_NO_TRAILING_SLASH = "http://myserver.example.com"; private static final String LINK_BASE_NO_TRAILING_SLASH = "http://myserver.example.com";
@ -116,6 +118,12 @@ public class RdapJsonFormatterTest {
"bog@cat.みんな", "bog@cat.みんな",
ImmutableList.of("Chamber Door", "upper level"), ImmutableList.of("Chamber Door", "upper level"),
clock.nowUtc().minusYears(3)); clock.nowUtc().minusYears(3));
contactResourceNotLinked = makeAndPersistContactResource(
"8372808-QRL",
"The Wizard",
"dog@cat.みんな",
ImmutableList.of("Somewhere", "Over the Rainbow"),
clock.nowUtc().minusYears(4));
hostResourceIpv4 = makeAndPersistHostResource( hostResourceIpv4 = makeAndPersistHostResource(
"ns1.cat.みんな", "1.2.3.4", clock.nowUtc().minusYears(1)); "ns1.cat.みんな", "1.2.3.4", clock.nowUtc().minusYears(1));
hostResourceIpv6 = makeAndPersistHostResource( hostResourceIpv6 = makeAndPersistHostResource(
@ -124,6 +132,8 @@ public class RdapJsonFormatterTest {
"ns3.cat.みんな", "1.2.3.4", "bad:f00d:cafe:0:0:0:15:beef", clock.nowUtc().minusYears(3)); "ns3.cat.みんな", "1.2.3.4", "bad:f00d:cafe:0:0:0:15:beef", clock.nowUtc().minusYears(3));
hostResourceNoAddresses = makeAndPersistHostResource( hostResourceNoAddresses = makeAndPersistHostResource(
"ns4.cat.みんな", null, clock.nowUtc().minusYears(4)); "ns4.cat.みんな", null, clock.nowUtc().minusYears(4));
hostResourceNotLinked = makeAndPersistHostResource(
"ns5.cat.みんな", null, clock.nowUtc().minusYears(5));
domainResourceFull = persistResource( domainResourceFull = persistResource(
makeDomainResource( makeDomainResource(
"cat.みんな", "cat.みんな",
@ -143,6 +153,18 @@ public class RdapJsonFormatterTest {
null, null,
registrar)); registrar));
// Create an unused domain that references hostResourceBoth and hostResourceNoAddresses so that
// they will have "associated" (ie, StatusValue.LINKED) status.
persistResource(
makeDomainResource(
"dog.みんな",
contactResourceRegistrant,
contactResourceAdmin,
contactResourceTech,
hostResourceBoth,
hostResourceNoAddresses,
registrar));
// history entries // history entries
persistResource( persistResource(
makeHistoryEntry( makeHistoryEntry(
@ -223,21 +245,36 @@ public class RdapJsonFormatterTest {
@Test @Test
public void testHost_ipv4() throws Exception { public void testHost_ipv4() throws Exception {
assertThat(rdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceIpv4, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) hostResourceIpv4,
false,
LINK_BASE,
WHOIS_SERVER,
clock.nowUtc(),
OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_ipv4.json")); .isEqualTo(loadJson("rdapjson_host_ipv4.json"));
} }
@Test @Test
public void testHost_ipv6() throws Exception { public void testHost_ipv6() throws Exception {
assertThat(rdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceIpv6, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) hostResourceIpv6,
false,
LINK_BASE,
WHOIS_SERVER,
clock.nowUtc(),
OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_ipv6.json")); .isEqualTo(loadJson("rdapjson_host_ipv6.json"));
} }
@Test @Test
public void testHost_both() throws Exception { public void testHost_both() throws Exception {
assertThat(rdapJsonFormatter.makeRdapJsonForHost( assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceBoth, false, LINK_BASE, WHOIS_SERVER, clock.nowUtc(), OutputDataType.FULL)) hostResourceBoth,
false,
LINK_BASE,
WHOIS_SERVER,
clock.nowUtc(),
OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_both.json")); .isEqualTo(loadJson("rdapjson_host_both.json"));
} }
@ -265,6 +302,18 @@ public class RdapJsonFormatterTest {
.isEqualTo(loadJson("rdapjson_host_no_addresses.json")); .isEqualTo(loadJson("rdapjson_host_no_addresses.json"));
} }
@Test
public void testHost_notLinked() throws Exception {
assertThat(rdapJsonFormatter.makeRdapJsonForHost(
hostResourceNotLinked,
false,
LINK_BASE,
WHOIS_SERVER,
clock.nowUtc(),
OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_host_not_linked.json"));
}
@Test @Test
public void testRegistrant() throws Exception { public void testRegistrant() throws Exception {
assertThat( assertThat(
@ -363,6 +412,20 @@ public class RdapJsonFormatterTest {
.isEqualTo(loadJson("rdapjson_rolelesscontact.json")); .isEqualTo(loadJson("rdapjson_rolelesscontact.json"));
} }
@Test
public void testUnlinkedContact() throws Exception {
assertThat(
rdapJsonFormatter.makeRdapJsonForContact(
contactResourceNotLinked,
false,
Optional.<DesignatedContact.Type>absent(),
LINK_BASE,
WHOIS_SERVER,
clock.nowUtc(),
OutputDataType.FULL))
.isEqualTo(loadJson("rdapjson_unlinkedcontact.json"));
}
@Test @Test
public void testDomain_full() throws Exception { public void testDomain_full() throws Exception {
assertThat(rdapJsonFormatter.makeRdapJsonForDomain( assertThat(rdapJsonFormatter.makeRdapJsonForDomain(

View file

@ -267,16 +267,20 @@ public class RdapNameserverSearchActionTest {
assertThat(generateActualJsonWithName("ns1.cat.lol")) assertThat(generateActualJsonWithName("ns1.cat.lol"))
.isEqualTo( .isEqualTo(
generateExpectedJsonForNameserver( generateExpectedJsonForNameserver(
"ns1.cat.lol", null, "2-ROID", "v4", "1.2.3.4", "rdap_host.json")); "ns1.cat.lol", null, "2-ROID", "v4", "1.2.3.4", "rdap_host_linked.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
@Test @Test
public void testNameMatch_ns2_cat_lol_found() throws Exception { public void testNameMatch_ns2_cat_lol_found() throws Exception {
assertThat(generateActualJsonWithName("ns2.cat.lol")) assertThat(generateActualJsonWithName("ns2.cat.lol"))
.isEqualTo( .isEqualTo(generateExpectedJsonForNameserver(
generateExpectedJsonForNameserver( "ns2.cat.lol",
"ns2.cat.lol", null, "4-ROID", "v6", "bad:f00d:cafe::15:beef", "rdap_host.json")); null,
"4-ROID",
"v6",
"bad:f00d:cafe::15:beef",
"rdap_host_linked.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
@ -392,7 +396,7 @@ public class RdapNameserverSearchActionTest {
"4-ROID", "4-ROID",
"v6", "v6",
"bad:f00d:cafe::15:beef", "bad:f00d:cafe::15:beef",
"rdap_host.json")); "rdap_host_linked.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }
@ -401,7 +405,7 @@ public class RdapNameserverSearchActionTest {
assertThat(generateActualJsonWithIp("1.2.3.4")) assertThat(generateActualJsonWithIp("1.2.3.4"))
.isEqualTo( .isEqualTo(
generateExpectedJsonForNameserver( generateExpectedJsonForNameserver(
"ns1.cat.lol", null, "2-ROID", "v4", "1.2.3.4", "rdap_host.json")); "ns1.cat.lol", null, "2-ROID", "v4", "1.2.3.4", "rdap_host_linked.json"));
assertThat(response.getStatus()).isEqualTo(200); assertThat(response.getStatus()).isEqualTo(200);
} }

View file

@ -0,0 +1,49 @@
{
"objectClassName" : "entity",
"handle" : "%NAME%",
"status" : ["active", "associated"],
"links" :
[
{
"value" : "https://example.com/rdap/entity/%NAME%",
"rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%",
"type" : "application/rdap+json"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "foo",
"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", "%FULLNAME%"],
["org", {}, "text", "GOOGLE INCORPORATED <script>"],
["adr", {}, "text",
[
"",
"",
[ %ADDRESS% ],
"KOKOMO",
"BM",
"31337",
"United States"
]
],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2126660420"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2126660420"],
["email", {}, "text", "%EMAIL%"]
]
]
}

View file

@ -36,7 +36,8 @@
"nameservers": [ "nameservers": [
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "8-ROID", "handle": "8-ROID",
"links": [ "links": [
@ -68,7 +69,8 @@
}, },
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "A-ROID", "handle": "A-ROID",
"links": [ "links": [
@ -103,7 +105,8 @@
"entities": [ "entities": [
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "4-ROID", "handle": "4-ROID",
"roles": [ "roles": [
@ -195,7 +198,8 @@
}, },
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "6-ROID", "handle": "6-ROID",
"roles": [ "roles": [
@ -287,7 +291,8 @@
}, },
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "2-ROID", "handle": "2-ROID",
"roles": [ "roles": [

View file

@ -37,7 +37,8 @@
"nameservers": [ "nameservers": [
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "8-ROID", "handle": "8-ROID",
"links": [ "links": [
@ -69,7 +70,8 @@
}, },
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "A-ROID", "handle": "A-ROID",
"links": [ "links": [
@ -104,7 +106,8 @@
"entities": [ "entities": [
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "4-ROID", "handle": "4-ROID",
"roles": [ "roles": [
@ -196,7 +199,8 @@
}, },
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "6-ROID", "handle": "6-ROID",
"roles": [ "roles": [
@ -288,7 +292,8 @@
}, },
{ {
"status": [ "status": [
"active" "active",
"associated"
], ],
"handle": "2-ROID", "handle": "2-ROID",
"roles": [ "roles": [

View file

@ -0,0 +1,33 @@
{
"status": [
"active",
"associated"
],
"ldhName": "%NAME%",
"handle": "%HANDLE%",
"links": [
{
"href": "https://example.tld/rdap/nameserver/%NAME%",
"type": "application/rdap+json",
"rel": "self",
"value": "https://example.tld/rdap/nameserver/%NAME%"
}
],
"ipAddresses": {
"%ADDRESSTYPE%": [
"%ADDRESS%"
]
},
"events": [
{
"eventAction": "registration",
"eventActor": "foo",
"eventDate": "1999-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
],
"objectClassName": "nameserver"
}

View file

@ -4,7 +4,7 @@
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "4-ROID", "handle" : "4-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"ldhName" : "ns2.cat.lol", "ldhName" : "ns2.cat.lol",
"links" : "links" :
[ [

View file

@ -1,7 +1,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "4-ROID", "handle" : "4-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["administrative"], "roles" : ["administrative"],
"links" : "links" :
[ [

View file

@ -1,6 +1,6 @@
{ {
"objectClassName" : "domain", "objectClassName" : "domain",
"handle" : "10-Q9JYB4C", "handle" : "14-Q9JYB4C",
"ldhName" : "cat.xn--q9jyb4c", "ldhName" : "cat.xn--q9jyb4c",
"unicodeName" : "cat.みんな", "unicodeName" : "cat.みんな",
"status" : "status" :
@ -42,10 +42,10 @@
[ [
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "8-ROID", "handle" : "A-ROID",
"ldhName" : "ns1.cat.xn--q9jyb4c", "ldhName" : "ns1.cat.xn--q9jyb4c",
"unicodeName" : "ns1.cat.みんな", "unicodeName" : "ns1.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {
@ -73,10 +73,10 @@
}, },
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "A-ROID", "handle" : "C-ROID",
"ldhName" : "ns2.cat.xn--q9jyb4c", "ldhName" : "ns2.cat.xn--q9jyb4c",
"unicodeName" : "ns2.cat.みんな", "unicodeName" : "ns2.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {
@ -108,7 +108,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "4-ROID", "handle" : "4-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["administrative"], "roles" : ["administrative"],
"links" : "links" :
[ [
@ -157,7 +157,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "6-ROID", "handle" : "6-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["technical"], "roles" : ["technical"],
"links" : "links" :
[ [
@ -206,7 +206,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "2-ROID", "handle" : "2-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["registrant"], "roles" : ["registrant"],
"links" : "links" :
[ [

View file

@ -1,6 +1,6 @@
{ {
"objectClassName" : "domain", "objectClassName" : "domain",
"handle" : "11-Q9JYB4C", "handle" : "15-Q9JYB4C",
"ldhName" : "fish.xn--q9jyb4c", "ldhName" : "fish.xn--q9jyb4c",
"unicodeName" : "fish.みんな", "unicodeName" : "fish.みんな",
"status" : "status" :
@ -44,7 +44,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "4-ROID", "handle" : "4-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["administrative"], "roles" : ["administrative"],
"links" : "links" :
[ [
@ -93,7 +93,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "6-ROID", "handle" : "6-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["technical"], "roles" : ["technical"],
"links" : "links" :
[ [
@ -142,7 +142,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "2-ROID", "handle" : "2-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["registrant"], "roles" : ["registrant"],
"links" : "links" :
[ [

View file

@ -1,6 +1,6 @@
{ {
"objectClassName" : "domain", "objectClassName" : "domain",
"handle" : "10-Q9JYB4C", "handle" : "14-Q9JYB4C",
"ldhName" : "cat.xn--q9jyb4c", "ldhName" : "cat.xn--q9jyb4c",
"unicodeName" : "cat.みんな", "unicodeName" : "cat.みんな",
"status" : "status" :

View file

@ -1,9 +1,9 @@
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "C-ROID", "handle" : "E-ROID",
"ldhName" : "ns3.cat.xn--q9jyb4c", "ldhName" : "ns3.cat.xn--q9jyb4c",
"unicodeName" : "ns3.cat.みんな", "unicodeName" : "ns3.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {

View file

@ -1,9 +1,9 @@
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "C-ROID", "handle" : "E-ROID",
"ldhName" : "ns3.cat.xn--q9jyb4c", "ldhName" : "ns3.cat.xn--q9jyb4c",
"unicodeName" : "ns3.cat.みんな", "unicodeName" : "ns3.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {

View file

@ -1,9 +1,9 @@
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "8-ROID", "handle" : "A-ROID",
"ldhName" : "ns1.cat.xn--q9jyb4c", "ldhName" : "ns1.cat.xn--q9jyb4c",
"unicodeName" : "ns1.cat.みんな", "unicodeName" : "ns1.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {

View file

@ -1,9 +1,9 @@
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "A-ROID", "handle" : "C-ROID",
"ldhName" : "ns2.cat.xn--q9jyb4c", "ldhName" : "ns2.cat.xn--q9jyb4c",
"unicodeName" : "ns2.cat.みんな", "unicodeName" : "ns2.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {

View file

@ -1,9 +1,9 @@
{ {
"objectClassName" : "nameserver", "objectClassName" : "nameserver",
"handle" : "E-ROID", "handle" : "10-ROID",
"ldhName" : "ns4.cat.xn--q9jyb4c", "ldhName" : "ns4.cat.xn--q9jyb4c",
"unicodeName" : "ns4.cat.みんな", "unicodeName" : "ns4.cat.みんな",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {

View file

@ -0,0 +1,27 @@
{
"objectClassName" : "nameserver",
"handle" : "12-ROID",
"ldhName" : "ns5.cat.xn--q9jyb4c",
"unicodeName" : "ns5.cat.みんな",
"status" : ["active"],
"links" :
[
{
"value" : "http://myserver.example.com/nameserver/ns5.cat.xn--q9jyb4c",
"rel" : "self",
"href" : "http://myserver.example.com/nameserver/ns5.cat.xn--q9jyb4c",
"type" : "application/rdap+json"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "foo",
"eventDate": "1995-01-01T00:00:00.000Z"
},
{
"eventAction": "last update of RDAP database",
"eventDate": "2000-01-01T00:00:00.000Z"
}
]
}

View file

@ -1,7 +1,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "2-ROID", "handle" : "2-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["registrant"], "roles" : ["registrant"],
"links" : "links" :
[ [

View file

@ -1,7 +1,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "2-ROID", "handle" : "2-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["registrant"], "roles" : ["registrant"],
"links" : "links" :
[ [

View file

@ -1,7 +1,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "2-ROID", "handle" : "2-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["registrant"], "roles" : ["registrant"],
"links" : "links" :
[ [

View file

@ -1,7 +1,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "6-ROID", "handle" : "6-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"links" : "links" :
[ [
{ {

View file

@ -1,7 +1,7 @@
{ {
"objectClassName" : "entity", "objectClassName" : "entity",
"handle" : "6-ROID", "handle" : "6-ROID",
"status" : ["active"], "status" : ["active", "associated"],
"roles" : ["technical"], "roles" : ["technical"],
"links" : "links" :
[ [

View file

@ -0,0 +1,48 @@
{
"objectClassName" : "entity",
"handle" : "8-ROID",
"status" : ["active"],
"links" :
[
{
"value" : "http://myserver.example.com/entity/8-ROID",
"rel" : "self",
"href" : "http://myserver.example.com/entity/8-ROID",
"type" : "application/rdap+json"
}
],
"events": [
{
"eventAction": "registration",
"eventActor": "foo",
"eventDate": "1996-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", "The Wizard"],
["org", {}, "text", "GOOGLE INCORPORATED <script>"],
["adr", {}, "text", [
"",
"",
[
"Somewhere",
"Over the Rainbow"
],
"KOKOMO",
"BM",
"31337",
"United States"]],
["tel", {"type" : ["voice"]}, "uri", "tel:+1.2126660420"],
["tel", {"type" : ["fax"]}, "uri", "tel:+1.2126660420"],
["email", {}, "text", "dog@cat.みんな"]
]
]
}