Fix exDate calculation in domain transfer flows (#389)

* Fix exDate calculation in domain transfer flows

* Link ICANN rule for zero-period transfer

* Get rid of some unnecessary method parameters

* Add domain info commands to test case
This commit is contained in:
sarahcaseybot 2020-01-15 16:43:39 -05:00 committed by GitHub
parent 851465a89d
commit ca0d95b066
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
29 changed files with 725 additions and 315 deletions

View file

@ -118,8 +118,7 @@ public class ResaveEntityActionTest extends ShardableTestCase {
DateTime.parse("2017-01-02T10:11:00Z")),
DateTime.parse("2016-02-06T10:00:00Z"),
DateTime.parse("2016-02-11T10:00:00Z"),
DateTime.parse("2017-01-02T10:11:00Z"),
DateTime.parse("2016-02-06T10:00:00Z"));
DateTime.parse("2017-01-02T10:11:00Z"));
clock.advanceOneMilli();
assertThat(domain.getCurrentSponsorClientId()).isEqualTo("TheRegistrar");
runAction(Key.create(domain), DateTime.parse("2016-02-06T10:00:01Z"), ImmutableSortedSet.of());

View file

@ -56,6 +56,12 @@ import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class EppLifecycleDomainTest extends EppTestCase {
private static final ImmutableMap<String, String> DEFAULT_TRANSFER_RESPONSE_PARMS =
ImmutableMap.of(
"REDATE", "2002-05-30T00:00:00Z",
"ACDATE", "2002-06-04T00:00:00Z",
"EXDATE", "2003-06-01T00:04:00Z");
@Rule
public final AppEngineRule appEngine =
AppEngineRule.builder().withDatastore().withTaskQueue().build();
@ -552,7 +558,7 @@ public class EppLifecycleDomainTest extends EppTestCase {
assertThatLoginSucceeds("TheRegistrar", "password2");
assertThatCommand("domain_transfer_request.xml")
.atTime("2002-05-30T00:00:00Z")
.hasResponse("domain_transfer_response.xml");
.hasResponse("domain_transfer_response.xml", DEFAULT_TRANSFER_RESPONSE_PARMS);
assertThatLogoutSucceeds();
// Log back in as the first registrar and verify things.
@ -590,7 +596,7 @@ public class EppLifecycleDomainTest extends EppTestCase {
assertThatLoginSucceeds("TheRegistrar", "password2");
assertThatCommand("domain_transfer_request.xml")
.atTime("2002-05-30T00:00:00Z")
.hasResponse("domain_transfer_response.xml");
.hasResponse("domain_transfer_response.xml", DEFAULT_TRANSFER_RESPONSE_PARMS);
assertThatLogoutSucceeds();
// Log back in as the first registrar and verify domain is pending transfer.
@ -640,7 +646,7 @@ public class EppLifecycleDomainTest extends EppTestCase {
assertThatLoginSucceeds("TheRegistrar", "password2");
assertThatCommand("domain_transfer_request.xml")
.atTime("2002-05-30T00:00:00Z")
.hasResponse("domain_transfer_response.xml");
.hasResponse("domain_transfer_response.xml", DEFAULT_TRANSFER_RESPONSE_PARMS);
assertThatLogoutSucceeds();
// Log back in as the first registrar and delete then restore the domain while the transfer
@ -1027,4 +1033,120 @@ public class EppLifecycleDomainTest extends EppTestCase {
assertThatLogoutSucceeds();
}
@Test
public void testDomainTransfer_duringAutorenewGrace() throws Exception {
// Creation date of fakesite: 2000-06-01T00:04:00.0Z
// Expiration date: 2002-06-01T00:04:00.0Z
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
createFakesite();
// Domain info before transfer is requested and before autorenew grace period begins
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "fakesite.example"))
.atTime("2001-06-01T00:00:00Z")
.hasResponse("domain_info_response_before_transfer_and_argp.xml");
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2001-06-01T00:00:00Z")
.hasResponse("domain_transfer_query_response_wildcard_not_requested.xml");
// Domain info before transfer is requested, but after autorenew grace period begins
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "fakesite.example"))
.atTime("2002-06-02T00:00:00Z")
.hasResponse("domain_info_response_before_transfer_during_argp.xml");
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2002-06-02T00:00:00Z")
.hasResponse("domain_transfer_query_response_wildcard_not_requested.xml");
assertThatLogoutSucceeds();
assertThatLoginSucceeds("TheRegistrar", "password2");
// Request the transfer
assertThatCommand("domain_transfer_request.xml")
.atTime("2002-06-05T00:02:00.0Z")
.hasResponse(
"domain_transfer_response.xml",
ImmutableMap.of(
"REDATE", "2002-06-05T00:02:00Z",
"ACDATE", "2002-06-10T00:02:00Z",
"EXDATE", "2003-06-01T00:04:00Z"));
assertThatLogoutSucceeds();
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
// Domain info right after the transfer is requested
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "fakesite.example"))
.atTime("2002-06-07T00:00:00Z")
.hasResponse("domain_info_response_during_transfer_during_argp.xml");
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2002-06-07T00:00:00Z")
.hasResponse(
"domain_transfer_query_response_wildcard.xml",
ImmutableMap.of(
"STATUS", "pending",
"REDATE", "2002-06-05T00:02:00Z",
"ACDATE", "2002-06-10T00:02:00Z",
"EXDATE", "2003-06-01T00:04:00Z"));
assertThatLogoutSucceeds();
assertThatLoginSucceeds("TheRegistrar", "password2");
// Domain info after transfer is implicitly approved, but autorenew grace period is still
// pending
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "fakesite.example"))
.atTime("2002-06-11T00:00:00Z")
.hasResponse("domain_info_response_after_transfer_during_argp.xml");
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2002-06-11T00:00:00Z")
.hasResponse(
"domain_transfer_query_response_wildcard.xml",
ImmutableMap.of(
"STATUS", "serverApproved",
"REDATE", "2002-06-05T00:02:00Z",
"ACDATE", "2002-06-10T00:02:00Z",
"EXDATE", "2003-06-01T00:04:00Z"));
// Domain info after the end of autorenew grace period
assertThatCommand("domain_info.xml", ImmutableMap.of("DOMAIN", "fakesite.example"))
.atTime("2002-09-11T00:00:00Z")
.hasResponse("domain_info_response_after_transfer_after_argp.xml");
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2002-09-11T00:00:00Z")
.hasResponse(
"domain_transfer_query_response_wildcard.xml",
ImmutableMap.of(
"STATUS", "serverApproved",
"REDATE", "2002-06-05T00:02:00Z",
"ACDATE", "2002-06-10T00:02:00Z",
"EXDATE", "2003-06-01T00:04:00Z"));
}
@Test
public void testDomainTransfer_queryForServerApproved() throws Exception {
// Creation date of fakesite: 2000-06-01T00:04:00.0Z
// Expiration date: 2002-06-01T00:04:00.0Z
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
createFakesite();
assertThatLogoutSucceeds();
assertThatLoginSucceeds("TheRegistrar", "password2");
assertThatCommand("domain_transfer_request.xml")
.atTime("2001-01-01T00:00:00.0Z")
.hasResponse(
"domain_transfer_response.xml",
ImmutableMap.of(
"REDATE", "2001-01-01T00:00:00Z",
"ACDATE", "2001-01-06T00:00:00Z",
"EXDATE", "2003-06-01T00:04:00Z"));
assertThatLogoutSucceeds();
assertThatLoginSucceeds("NewRegistrar", "foo-BAR2");
// Verify that reID is set correctly.
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2001-01-03T00:00:00Z")
.hasResponse("domain_transfer_query_response_fakesite.xml");
assertThatCommand("domain_transfer_query_fakesite.xml")
.atTime("2001-01-08T00:00:00Z")
.hasResponse("domain_transfer_query_response_completed_fakesite.xml");
}
}

View file

@ -101,7 +101,6 @@ public class DomainTransferCancelFlowTest
"NewRegistrar",
TRANSFER_REQUEST_TIME,
TRANSFER_EXPIRATION_TIME,
TRANSFER_REQUEST_TIME,
EXTENDED_REGISTRATION_EXPIRATION_TIME));
assertPollMessages(
"TheRegistrar",
@ -111,7 +110,6 @@ public class DomainTransferCancelFlowTest
"TheRegistrar",
TRANSFER_REQUEST_TIME,
TRANSFER_EXPIRATION_TIME,
TRANSFER_REQUEST_TIME,
EXTENDED_REGISTRATION_EXPIRATION_TIME));
clock.advanceOneMilli();

View file

@ -94,8 +94,7 @@ public class DomainTransferFlowTestCase<F extends Flow, R extends EppResource>
domain,
TRANSFER_REQUEST_TIME,
TRANSFER_EXPIRATION_TIME,
EXTENDED_REGISTRATION_EXPIRATION_TIME,
TRANSFER_REQUEST_TIME);
EXTENDED_REGISTRATION_EXPIRATION_TIME);
}
/** Adds a domain with no pending transfer on it. */

View file

@ -48,8 +48,8 @@ public class DomainTransferQueryFlowTest
setupDomainWithPendingTransfer("example", "tld");
}
private void doSuccessfulTest(String commandFilename, String expectedXmlFilename)
throws Exception {
private void doSuccessfulTest(
String commandFilename, String expectedXmlFilename, int numPollMessages) throws Exception {
setEppInput(commandFilename);
// Replace the ROID in the xml file with the one generated in our test.
eppLoader.replaceAll("JD1234-REP", contact.getRepoId());
@ -65,7 +65,8 @@ public class DomainTransferQueryFlowTest
getGainingClientAutorenewEvent(),
getLosingClientAutorenewEvent());
// Look in the future and make sure the poll messages for implicit ack are there.
assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusYears(1))).hasSize(1);
assertThat(getPollMessages("NewRegistrar", clock.nowUtc().plusYears(1)))
.hasSize(numPollMessages);
assertThat(getPollMessages("TheRegistrar", clock.nowUtc().plusYears(1))).hasSize(1);
}
@ -80,62 +81,62 @@ public class DomainTransferQueryFlowTest
@Test
public void testSuccess() throws Exception {
doSuccessfulTest("domain_transfer_query.xml", "domain_transfer_query_response.xml");
doSuccessfulTest("domain_transfer_query.xml", "domain_transfer_query_response.xml", 1);
}
@Test
public void testSuccess_sponsoringClient() throws Exception {
setClientIdForFlow("TheRegistrar");
doSuccessfulTest("domain_transfer_query.xml", "domain_transfer_query_response.xml");
doSuccessfulTest("domain_transfer_query.xml", "domain_transfer_query_response.xml", 1);
}
@Test
public void testSuccess_domainAuthInfo() throws Exception {
setClientIdForFlow("ClientZ");
doSuccessfulTest(
"domain_transfer_query_domain_authinfo.xml", "domain_transfer_query_response.xml");
"domain_transfer_query_domain_authinfo.xml", "domain_transfer_query_response.xml", 1);
}
@Test
public void testSuccess_contactAuthInfo() throws Exception {
setClientIdForFlow("ClientZ");
doSuccessfulTest(
"domain_transfer_query_contact_authinfo.xml", "domain_transfer_query_response.xml");
"domain_transfer_query_contact_authinfo.xml", "domain_transfer_query_response.xml", 1);
}
@Test
public void testSuccess_clientApproved() throws Exception {
changeTransferStatus(TransferStatus.CLIENT_APPROVED);
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_client_approved.xml");
"domain_transfer_query.xml", "domain_transfer_query_response_client_approved.xml", 1);
}
@Test
public void testSuccess_clientRejected() throws Exception {
changeTransferStatus(TransferStatus.CLIENT_REJECTED);
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_client_rejected.xml");
"domain_transfer_query.xml", "domain_transfer_query_response_client_rejected.xml", 1);
}
@Test
public void testSuccess_clientCancelled() throws Exception {
changeTransferStatus(TransferStatus.CLIENT_CANCELLED);
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_client_cancelled.xml");
"domain_transfer_query.xml", "domain_transfer_query_response_client_cancelled.xml", 1);
}
@Test
public void testSuccess_serverApproved() throws Exception {
changeTransferStatus(TransferStatus.SERVER_APPROVED);
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_server_approved.xml");
"domain_transfer_query.xml", "domain_transfer_query_response_server_approved.xml", 1);
}
@Test
public void testSuccess_serverCancelled() throws Exception {
changeTransferStatus(TransferStatus.SERVER_CANCELLED);
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_server_cancelled.xml");
"domain_transfer_query.xml", "domain_transfer_query_response_server_cancelled.xml", 1);
}
@Test
@ -148,7 +149,7 @@ public class DomainTransferQueryFlowTest
.asBuilder()
.setRegistrationExpirationTime(domain.getRegistrationExpirationTime().plusYears(9))
.build());
doSuccessfulTest("domain_transfer_query.xml", "domain_transfer_query_response_10_years.xml");
doSuccessfulTest("domain_transfer_query.xml", "domain_transfer_query_response_10_years.xml", 1);
}
@Test
@ -157,7 +158,7 @@ public class DomainTransferQueryFlowTest
domain =
persistResource(domain.asBuilder().setDeletionTime(clock.nowUtc().plusDays(1)).build());
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_server_cancelled.xml");
"domain_transfer_query.xml", "domain_transfer_query_response_server_cancelled.xml", 1);
}
@Test
@ -237,4 +238,15 @@ public class DomainTransferQueryFlowTest
assertIcannReportingActivityFieldLogged("srs-dom-transfer-query");
assertTldsFieldLogged("tld");
}
@Test
public void testSuccess_serverApproved_afterAutorenews() throws Exception {
// Set the clock to just past the extended registration time. We'd expect the domain to have
// auto-renewed once, but the transfer query response should be the same.
clock.setTo(EXTENDED_REGISTRATION_EXPIRATION_TIME.plusMillis(1));
assertThat(domain.cloneProjectedAtTime(clock.nowUtc()).getRegistrationExpirationTime())
.isEqualTo(EXTENDED_REGISTRATION_EXPIRATION_TIME.plusYears(1));
doSuccessfulTest(
"domain_transfer_query.xml", "domain_transfer_query_response_server_approved.xml", 2);
}
}

View file

@ -1093,11 +1093,8 @@ public class DomainTransferRequestFlowTest
domain.getAutorenewBillingEvent()))
.build());
clock.advanceOneMilli();
// Since the autorenew grace period will have ended by the automatic transfer time, subsuming
// will not occur in the server-approve case, so the transfer will add 1 year to the current
// expiration time as usual, and no Cancellation will be issued. Note however that if the
// transfer were to be manually approved before the autorenew grace period ends, then the
// DomainTransferApproveFlow will still issue a Cancellation.
// The response from DomainTransferRequestFlow returns exDate based on if the transfer were to
// occur now.
doSuccessfulTest(
"domain_transfer_request.xml",
"domain_transfer_request_response_autorenew_grace_at_request_only.xml",

View file

@ -143,7 +143,6 @@ public class DomainBaseTest extends EntityTestCase {
.setTransferRequestTime(clock.nowUtc().plusDays(1))
.setTransferStatus(TransferStatus.SERVER_APPROVED)
.setTransferRequestTrid(Trid.create("client-trid", "server-trid"))
.setTransferredRegistrationExpirationTime(clock.nowUtc().plusYears(2))
.build())
.setDeletePollMessage(onetimePollKey)
.setAutorenewBillingEvent(recurringBillKey)

View file

@ -238,106 +238,139 @@ public class DomainBaseToXjcConverterTest {
.setBillingTime(DateTime.parse("1910-01-01T00:00:00Z"))
.setParent(historyEntry)
.build());
domain = domain.asBuilder()
.setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("secret")))
.setContacts(ImmutableSet.of(
DesignatedContact.create(DesignatedContact.Type.ADMIN, Key.create(
makeContactResource(clock, "10-Q9JYB4C", "5372808-IRL",
"be that word our sign in parting", "BOFH@cat.みんな"))),
DesignatedContact.create(DesignatedContact.Type.TECH, Key.create(
makeContactResource(clock, "11-Q9JYB4C", "5372808-TRL",
"bird or fiend!? i shrieked upstarting", "bog@cat.みんな")))))
.setCreationClientId("LawyerCat")
.setCreationTimeForTest(DateTime.parse("1900-01-01T00:00:00Z"))
.setPersistedCurrentSponsorClientId("GetTheeBack")
.setDsData(ImmutableSet.of(DelegationSignerData.create(
123, 200, 230, base16().decode("1234567890"))))
.setFullyQualifiedDomainName(Idn.toASCII("love.みんな"))
.setLastTransferTime(DateTime.parse("1910-01-01T00:00:00Z"))
.setLastEppUpdateClientId("IntoTheTempest")
.setLastEppUpdateTime(DateTime.parse("1920-01-01T00:00:00Z"))
.setNameservers(ImmutableSet.of(
Key.create(
makeHostResource(clock, "3-Q9JYB4C", "bird.or.devil.みんな", "1.2.3.4")),
Key.create(
makeHostResource(clock, "4-Q9JYB4C", "ns2.cat.みんな", "bad:f00d:cafe::15:beef"))))
.setRegistrant(Key.create(makeContactResource(
clock, "12-Q9JYB4C", "5372808-ERL", "(◕‿◕) nevermore", "prophet@evil.みんな")))
.setRegistrationExpirationTime(DateTime.parse("1930-01-01T00:00:00Z"))
.setGracePeriods(ImmutableSet.of(
GracePeriod.forBillingEvent(GracePeriodStatus.RENEW,
persistResource(
new BillingEvent.OneTime.Builder()
.setReason(Reason.RENEW)
.setTargetId("love.xn--q9jyb4c")
.setClientId("TheRegistrar")
.setCost(Money.of(USD, 456))
.setPeriodYears(2)
.setEventTime(DateTime.parse("1920-01-01T00:00:00Z"))
.setBillingTime(DateTime.parse("1920-01-01T00:00:00Z"))
.setParent(historyEntry)
.build())),
GracePeriod.create(
GracePeriodStatus.TRANSFER, DateTime.parse("1920-01-01T00:00:00Z"), "foo", null)))
.setSubordinateHosts(ImmutableSet.of("home.by.horror.haunted"))
.setStatusValues(ImmutableSet.of(
StatusValue.CLIENT_DELETE_PROHIBITED,
StatusValue.CLIENT_RENEW_PROHIBITED,
StatusValue.CLIENT_TRANSFER_PROHIBITED,
StatusValue.SERVER_UPDATE_PROHIBITED))
.setAutorenewBillingEvent(
Key.create(persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId("lol")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setAutorenewPollMessage(
Key.create(persistResource(
new PollMessage.Autorenew.Builder()
.setTargetId("lol")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setTransferData(new TransferData.Builder()
.setGainingClientId("gaining")
.setLosingClientId("losing")
.setPendingTransferExpirationTime(DateTime.parse("1925-04-20T00:00:00Z"))
.setServerApproveBillingEvent(Key.create(billingEvent))
.setServerApproveAutorenewEvent(
Key.create(persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId("example.xn--q9jyb4c")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setServerApproveAutorenewPollMessage(Key.create(persistResource(
new Autorenew.Builder()
.setTargetId("example.xn--q9jyb4c")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setServerApproveEntities(ImmutableSet.of(
Key.create(billingEvent)))
.setTransferRequestTime(DateTime.parse("1919-01-01T00:00:00Z"))
.setTransferStatus(TransferStatus.PENDING)
.setTransferRequestTrid(Trid.create("client-trid", "server-trid"))
.build())
.build();
domain =
domain
.asBuilder()
.setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("secret")))
.setContacts(
ImmutableSet.of(
DesignatedContact.create(
DesignatedContact.Type.ADMIN,
Key.create(
makeContactResource(
clock,
"10-Q9JYB4C",
"5372808-IRL",
"be that word our sign in parting",
"BOFH@cat.みんな"))),
DesignatedContact.create(
DesignatedContact.Type.TECH,
Key.create(
makeContactResource(
clock,
"11-Q9JYB4C",
"5372808-TRL",
"bird or fiend!? i shrieked upstarting",
"bog@cat.みんな")))))
.setCreationClientId("LawyerCat")
.setCreationTimeForTest(DateTime.parse("1900-01-01T00:00:00Z"))
.setPersistedCurrentSponsorClientId("GetTheeBack")
.setDsData(
ImmutableSet.of(
DelegationSignerData.create(123, 200, 230, base16().decode("1234567890"))))
.setFullyQualifiedDomainName(Idn.toASCII("love.みんな"))
.setLastTransferTime(DateTime.parse("1910-01-01T00:00:00Z"))
.setLastEppUpdateClientId("IntoTheTempest")
.setLastEppUpdateTime(DateTime.parse("1920-01-01T00:00:00Z"))
.setNameservers(
ImmutableSet.of(
Key.create(
makeHostResource(clock, "3-Q9JYB4C", "bird.or.devil.みんな", "1.2.3.4")),
Key.create(
makeHostResource(
clock, "4-Q9JYB4C", "ns2.cat.みんな", "bad:f00d:cafe::15:beef"))))
.setRegistrant(
Key.create(
makeContactResource(
clock, "12-Q9JYB4C", "5372808-ERL", "(◕‿◕) nevermore", "prophet@evil.みんな")))
.setRegistrationExpirationTime(DateTime.parse("1930-01-01T00:00:00Z"))
.setGracePeriods(
ImmutableSet.of(
GracePeriod.forBillingEvent(
GracePeriodStatus.RENEW,
persistResource(
new BillingEvent.OneTime.Builder()
.setReason(Reason.RENEW)
.setTargetId("love.xn--q9jyb4c")
.setClientId("TheRegistrar")
.setCost(Money.of(USD, 456))
.setPeriodYears(2)
.setEventTime(DateTime.parse("1920-01-01T00:00:00Z"))
.setBillingTime(DateTime.parse("1920-01-01T00:00:00Z"))
.setParent(historyEntry)
.build())),
GracePeriod.create(
GracePeriodStatus.TRANSFER,
DateTime.parse("1920-01-01T00:00:00Z"),
"foo",
null)))
.setSubordinateHosts(ImmutableSet.of("home.by.horror.haunted"))
.setStatusValues(
ImmutableSet.of(
StatusValue.CLIENT_DELETE_PROHIBITED,
StatusValue.CLIENT_RENEW_PROHIBITED,
StatusValue.CLIENT_TRANSFER_PROHIBITED,
StatusValue.SERVER_UPDATE_PROHIBITED))
.setAutorenewBillingEvent(
Key.create(
persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId("lol")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setAutorenewPollMessage(
Key.create(
persistResource(
new PollMessage.Autorenew.Builder()
.setTargetId("lol")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setTransferData(
new TransferData.Builder()
.setGainingClientId("gaining")
.setLosingClientId("losing")
.setPendingTransferExpirationTime(DateTime.parse("1925-04-20T00:00:00Z"))
.setServerApproveBillingEvent(Key.create(billingEvent))
.setServerApproveAutorenewEvent(
Key.create(
persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId("example.xn--q9jyb4c")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setServerApproveAutorenewPollMessage(
Key.create(
persistResource(
new Autorenew.Builder()
.setTargetId("example.xn--q9jyb4c")
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setServerApproveEntities(ImmutableSet.of(Key.create(billingEvent)))
.setTransferRequestTime(DateTime.parse("1919-01-01T00:00:00Z"))
.setTransferStatus(TransferStatus.PENDING)
.setTransferredRegistrationExpirationTime(
DateTime.parse("1931-01-01T00:00:00Z"))
.setTransferRequestTrid(Trid.create("client-trid", "server-trid"))
.build())
.build();
clock.advanceOneMilli();
return persistResource(domain);
}

View file

@ -79,106 +79,131 @@ final class RdeFixtures {
.setBillingTime(DateTime.parse("1990-01-01T00:00:00Z"))
.setParent(historyEntry)
.build());
domain = domain.asBuilder()
.setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("secret")))
.setContacts(ImmutableSet.of(
DesignatedContact.create(DesignatedContact.Type.ADMIN, Key.create(
makeContactResource(clock, "5372808-IRL",
"be that word our sign in parting", "BOFH@cat.みんな"))),
DesignatedContact.create(DesignatedContact.Type.TECH, Key.create(
makeContactResource(clock, "5372808-TRL",
"bird or fiend!? i shrieked upstarting", "bog@cat.みんな")))))
.setCreationClientId("TheRegistrar")
.setPersistedCurrentSponsorClientId("TheRegistrar")
.setCreationTimeForTest(clock.nowUtc())
.setDsData(ImmutableSet.of(DelegationSignerData.create(
123, 200, 230, base16().decode("1234567890"))))
.setFullyQualifiedDomainName(Idn.toASCII("love." + tld))
.setLastTransferTime(DateTime.parse("1990-01-01T00:00:00Z"))
.setLastEppUpdateClientId("IntoTheTempest")
.setLastEppUpdateTime(clock.nowUtc())
.setIdnTableName("extended_latin")
.setNameservers(ImmutableSet.of(
Key.create(
makeHostResource(clock, "bird.or.devil.みんな", "1.2.3.4")),
Key.create(
makeHostResource(
clock, "ns2.cat.みんな", "bad:f00d:cafe::15:beef"))))
.setRegistrationExpirationTime(DateTime.parse("1994-01-01T00:00:00Z"))
.setGracePeriods(ImmutableSet.of(
GracePeriod.forBillingEvent(GracePeriodStatus.RENEW,
persistResource(
new BillingEvent.OneTime.Builder()
.setReason(Reason.RENEW)
.setTargetId("love." + tld)
.setClientId("TheRegistrar")
.setCost(Money.of(USD, 456))
.setPeriodYears(2)
.setEventTime(DateTime.parse("1992-01-01T00:00:00Z"))
.setBillingTime(DateTime.parse("1992-01-01T00:00:00Z"))
.setParent(historyEntry)
.build())),
GracePeriod.create(
GracePeriodStatus.TRANSFER, DateTime.parse("1992-01-01T00:00:00Z"), "foo", null)))
.setSubordinateHosts(ImmutableSet.of("home.by.horror.haunted"))
.setStatusValues(ImmutableSet.of(
StatusValue.CLIENT_DELETE_PROHIBITED,
StatusValue.CLIENT_RENEW_PROHIBITED,
StatusValue.CLIENT_TRANSFER_PROHIBITED,
StatusValue.SERVER_UPDATE_PROHIBITED))
.setAutorenewBillingEvent(
Key.create(persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId(tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setAutorenewPollMessage(
Key.create(persistSimpleResource(
new PollMessage.Autorenew.Builder()
.setTargetId(tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setTransferData(new TransferData.Builder()
.setGainingClientId("gaining")
.setLosingClientId("losing")
.setPendingTransferExpirationTime(DateTime.parse("1993-04-20T00:00:00Z"))
.setServerApproveBillingEvent(Key.create(billingEvent))
.setServerApproveAutorenewEvent(
Key.create(persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId("example." + tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setServerApproveAutorenewPollMessage(Key.create(persistResource(
new Autorenew.Builder()
.setTargetId("example." + tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setServerApproveEntities(ImmutableSet.of(
Key.create(billingEvent)))
.setTransferRequestTime(DateTime.parse("1991-01-01T00:00:00Z"))
.setTransferStatus(TransferStatus.PENDING)
.setTransferRequestTrid(Trid.create("client-trid", "server-trid"))
.build())
.build();
domain =
domain
.asBuilder()
.setAuthInfo(DomainAuthInfo.create(PasswordAuth.create("secret")))
.setContacts(
ImmutableSet.of(
DesignatedContact.create(
DesignatedContact.Type.ADMIN,
Key.create(
makeContactResource(
clock,
"5372808-IRL",
"be that word our sign in parting",
"BOFH@cat.みんな"))),
DesignatedContact.create(
DesignatedContact.Type.TECH,
Key.create(
makeContactResource(
clock,
"5372808-TRL",
"bird or fiend!? i shrieked upstarting",
"bog@cat.みんな")))))
.setCreationClientId("TheRegistrar")
.setPersistedCurrentSponsorClientId("TheRegistrar")
.setCreationTimeForTest(clock.nowUtc())
.setDsData(
ImmutableSet.of(
DelegationSignerData.create(123, 200, 230, base16().decode("1234567890"))))
.setFullyQualifiedDomainName(Idn.toASCII("love." + tld))
.setLastTransferTime(DateTime.parse("1990-01-01T00:00:00Z"))
.setLastEppUpdateClientId("IntoTheTempest")
.setLastEppUpdateTime(clock.nowUtc())
.setIdnTableName("extended_latin")
.setNameservers(
ImmutableSet.of(
Key.create(makeHostResource(clock, "bird.or.devil.みんな", "1.2.3.4")),
Key.create(makeHostResource(clock, "ns2.cat.みんな", "bad:f00d:cafe::15:beef"))))
.setRegistrationExpirationTime(DateTime.parse("1994-01-01T00:00:00Z"))
.setGracePeriods(
ImmutableSet.of(
GracePeriod.forBillingEvent(
GracePeriodStatus.RENEW,
persistResource(
new BillingEvent.OneTime.Builder()
.setReason(Reason.RENEW)
.setTargetId("love." + tld)
.setClientId("TheRegistrar")
.setCost(Money.of(USD, 456))
.setPeriodYears(2)
.setEventTime(DateTime.parse("1992-01-01T00:00:00Z"))
.setBillingTime(DateTime.parse("1992-01-01T00:00:00Z"))
.setParent(historyEntry)
.build())),
GracePeriod.create(
GracePeriodStatus.TRANSFER,
DateTime.parse("1992-01-01T00:00:00Z"),
"foo",
null)))
.setSubordinateHosts(ImmutableSet.of("home.by.horror.haunted"))
.setStatusValues(
ImmutableSet.of(
StatusValue.CLIENT_DELETE_PROHIBITED,
StatusValue.CLIENT_RENEW_PROHIBITED,
StatusValue.CLIENT_TRANSFER_PROHIBITED,
StatusValue.SERVER_UPDATE_PROHIBITED))
.setAutorenewBillingEvent(
Key.create(
persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId(tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setAutorenewPollMessage(
Key.create(
persistSimpleResource(
new PollMessage.Autorenew.Builder()
.setTargetId(tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setTransferData(
new TransferData.Builder()
.setGainingClientId("gaining")
.setLosingClientId("losing")
.setPendingTransferExpirationTime(DateTime.parse("1993-04-20T00:00:00Z"))
.setServerApproveBillingEvent(Key.create(billingEvent))
.setServerApproveAutorenewEvent(
Key.create(
persistResource(
new BillingEvent.Recurring.Builder()
.setReason(Reason.RENEW)
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setTargetId("example." + tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setRecurrenceEndTime(END_OF_TIME)
.setParent(historyEntry)
.build())))
.setServerApproveAutorenewPollMessage(
Key.create(
persistResource(
new Autorenew.Builder()
.setTargetId("example." + tld)
.setClientId("TheRegistrar")
.setEventTime(END_OF_TIME)
.setAutorenewEndTime(END_OF_TIME)
.setMsg("Domain was auto-renewed.")
.setParent(historyEntry)
.build())))
.setServerApproveEntities(ImmutableSet.of(Key.create(billingEvent)))
.setTransferRequestTime(DateTime.parse("1991-01-01T00:00:00Z"))
.setTransferStatus(TransferStatus.PENDING)
.setTransferredRegistrationExpirationTime(
DateTime.parse("1995-01-01T00:00:00.000Z"))
.setTransferRequestTrid(Trid.create("client-trid", "server-trid"))
.build())
.build();
clock.advanceOneMilli();
return persistResourceWithCommitLog(domain);
}

View file

@ -399,7 +399,6 @@ public class DatastoreHelper {
String clientId,
DateTime requestTime,
DateTime expirationTime,
DateTime now,
@Nullable DateTime extendedRegistrationExpirationTime) {
TransferData transferData =
createTransferDataBuilder(requestTime, expirationTime)
@ -409,7 +408,7 @@ public class DatastoreHelper {
.setClientId(clientId)
.setEventTime(expirationTime)
.setMsg("Transfer server approved.")
.setResponseData(ImmutableList.of(createTransferResponse(resource, transferData, now)))
.setResponseData(ImmutableList.of(createTransferResponse(resource, transferData)))
.setParent(historyEntry)
.build();
}
@ -458,7 +457,6 @@ public class DatastoreHelper {
"NewRegistrar",
requestTime,
expirationTime,
now,
null))),
Key.create(persistResource(
createPollMessageForImplicitTransfer(
@ -467,7 +465,6 @@ public class DatastoreHelper {
"TheRegistrar",
requestTime,
expirationTime,
now,
null)))))
.setTransferRequestTrid(Trid.create("transferClient-trid", "transferServer-trid"))
.build())
@ -538,8 +535,7 @@ public class DatastoreHelper {
DomainBase domain,
DateTime requestTime,
DateTime expirationTime,
DateTime extendedRegistrationExpirationTime,
DateTime now) {
DateTime extendedRegistrationExpirationTime) {
HistoryEntry historyEntryDomainTransfer = persistResource(
new HistoryEntry.Builder()
.setType(HistoryEntry.Type.DOMAIN_TRANSFER_REQUEST)
@ -608,7 +604,6 @@ public class DatastoreHelper {
"NewRegistrar",
requestTime,
expirationTime,
now,
extendedRegistrationExpirationTime))),
Key.create(persistResource(
createPollMessageForImplicitTransfer(
@ -617,7 +612,6 @@ public class DatastoreHelper {
"TheRegistrar",
requestTime,
expirationTime,
now,
extendedRegistrationExpirationTime)))))
.setTransferRequestTrid(Trid.create("transferClient-trid", "transferServer-trid"))
.build())

View file

@ -12,7 +12,7 @@
<domain:reDate>2000-06-09T22:00:00.0Z</domain:reDate>
<domain:acID>TheRegistrar</domain:acID>
<domain:acDate>2000-06-14T22:00:00.0Z</domain:acDate>
<domain:exDate>2002-04-26T22:00:00.0Z</domain:exDate>
<domain:exDate>2001-04-26T22:00:00.0Z</domain:exDate>
</domain:trnData>
</resData>
<trID>

View file

@ -12,8 +12,7 @@
<domain:reDate>2000-06-09T22:00:00.0Z</domain:reDate>
<domain:acID>TheRegistrar</domain:acID>
<domain:acDate>2000-06-14T22:00:00.0Z</domain:acDate>
<!-- TODO(b/25084229): Exdate should be 2001; needs fixing. -->
<domain:exDate>2002-06-08T22:00:00.0Z</domain:exDate>
<domain:exDate>2001-06-08T22:00:00.0Z</domain:exDate>
</domain:trnData>
</resData>
<trID>

View file

@ -0,0 +1,36 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<domain:infData
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>fakesite.example</domain:name>
<domain:roid>IGNORED</domain:roid>
<domain:status s="ok"/>
<domain:registrant>jd1234</domain:registrant>
<domain:contact type="admin">sh8013</domain:contact>
<domain:contact type="tech">sh8013</domain:contact>
<domain:ns>
<domain:hostObj>ns1.example.external</domain:hostObj>
<domain:hostObj>ns2.example.external</domain:hostObj>
</domain:ns>
<domain:clID>TheRegistrar</domain:clID>
<domain:crID>NewRegistrar</domain:crID>
<domain:crDate>2000-06-01T00:04:00.0Z</domain:crDate>
<domain:upID>TheRegistrar</domain:upID>
<domain:upDate>2002-06-15T00:02:00.000Z</domain:upDate>
<domain:exDate>2003-06-01T00:04:00.0Z</domain:exDate>
<domain:trDate>2002-06-10T00:02:00.000Z</domain:trDate>
<domain:authInfo>
<domain:pw>2fooBAR</domain:pw>
</domain:authInfo>
</domain:infData>
</resData>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -0,0 +1,40 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<domain:infData
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>fakesite.example</domain:name>
<domain:roid>IGNORED</domain:roid>
<domain:status s="ok"/>
<domain:registrant>jd1234</domain:registrant>
<domain:contact type="admin">sh8013</domain:contact>
<domain:contact type="tech">sh8013</domain:contact>
<domain:ns>
<domain:hostObj>ns1.example.external</domain:hostObj>
<domain:hostObj>ns2.example.external</domain:hostObj>
</domain:ns>
<domain:clID>TheRegistrar</domain:clID>
<domain:crID>NewRegistrar</domain:crID>
<domain:crDate>2000-06-01T00:04:00.0Z</domain:crDate>
<domain:upID>TheRegistrar</domain:upID>
<domain:upDate>2002-06-10T00:02:00.000Z</domain:upDate>
<domain:exDate>2003-06-01T00:04:00.0Z</domain:exDate>
<domain:trDate>2002-06-10T00:02:00.000Z</domain:trDate>
<domain:authInfo>
<domain:pw>2fooBAR</domain:pw>
</domain:authInfo>
</domain:infData>
</resData>
<extension>
<rgp:infData xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0">
<rgp:rgpStatus s="transferPeriod"/>
</rgp:infData>
</extension> <trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -0,0 +1,35 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<domain:infData
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>fakesite.example</domain:name>
<domain:roid>IGNORED</domain:roid>
<domain:status s="ok"/>
<domain:registrant>jd1234</domain:registrant>
<domain:contact type="admin">sh8013</domain:contact>
<domain:contact type="tech">sh8013</domain:contact>
<domain:ns>
<domain:hostObj>ns1.example.external</domain:hostObj>
<domain:hostObj>ns2.example.external</domain:hostObj>
</domain:ns>
<domain:clID>NewRegistrar</domain:clID>
<domain:crID>NewRegistrar</domain:crID>
<domain:crDate>2000-06-01T00:04:00.0Z</domain:crDate>
<domain:upID>NewRegistrar</domain:upID>
<domain:upDate>2000-06-06T00:04:00.000Z</domain:upDate>
<domain:exDate>2002-06-01T00:04:00.0Z</domain:exDate>
<domain:authInfo>
<domain:pw>2fooBAR</domain:pw>
</domain:authInfo>
</domain:infData>
</resData>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -0,0 +1,39 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<domain:infData
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>fakesite.example</domain:name>
<domain:roid>IGNORED</domain:roid>
<domain:status s="ok"/>
<domain:registrant>jd1234</domain:registrant>
<domain:contact type="admin">sh8013</domain:contact>
<domain:contact type="tech">sh8013</domain:contact>
<domain:ns>
<domain:hostObj>ns1.example.external</domain:hostObj>
<domain:hostObj>ns2.example.external</domain:hostObj>
</domain:ns>
<domain:clID>NewRegistrar</domain:clID>
<domain:crID>NewRegistrar</domain:crID>
<domain:crDate>2000-06-01T00:04:00.0Z</domain:crDate>
<domain:upID>NewRegistrar</domain:upID>
<domain:upDate>2002-06-01T00:04:00.000Z</domain:upDate>
<domain:exDate>2003-06-01T00:04:00.0Z</domain:exDate>
<domain:authInfo>
<domain:pw>2fooBAR</domain:pw>
</domain:authInfo>
</domain:infData>
</resData>
<extension>
<rgp:infData xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0">
<rgp:rgpStatus s="autoRenewPeriod"/>
</rgp:infData>
</extension> <trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -0,0 +1,39 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<domain:infData
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>fakesite.example</domain:name>
<domain:roid>IGNORED</domain:roid>
<domain:status s="pendingTransfer"/>
<domain:registrant>jd1234</domain:registrant>
<domain:contact type="admin">sh8013</domain:contact>
<domain:contact type="tech">sh8013</domain:contact>
<domain:ns>
<domain:hostObj>ns1.example.external</domain:hostObj>
<domain:hostObj>ns2.example.external</domain:hostObj>
</domain:ns>
<domain:clID>NewRegistrar</domain:clID>
<domain:crID>NewRegistrar</domain:crID>
<domain:crDate>2000-06-01T00:04:00.0Z</domain:crDate>
<domain:upID>TheRegistrar</domain:upID>
<domain:upDate>2002-06-05T00:02:00.000Z</domain:upDate>
<domain:exDate>2003-06-01T00:04:00.0Z</domain:exDate>
<domain:authInfo>
<domain:pw>2fooBAR</domain:pw>
</domain:authInfo>
</domain:infData>
</resData>
<extension>
<rgp:infData xmlns:rgp="urn:ietf:params:xml:ns:rgp-1.0">
<rgp:rgpStatus s="autoRenewPeriod"/>
</rgp:infData>
</extension> <trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -11,7 +11,7 @@
<domain:reDate>2001-01-01T00:00:00.000Z</domain:reDate>
<domain:acID>NewRegistrar</domain:acID>
<domain:acDate>2001-01-06T00:00:00.000Z</domain:acDate>
<domain:exDate>2004-06-01T00:04:00.000Z</domain:exDate>
<domain:exDate>2003-06-01T00:04:00.000Z</domain:exDate>
</domain:trnData>
</resData>
<trID>

View file

@ -0,0 +1,22 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="1000">
<msg>Command completed successfully</msg>
</result>
<resData>
<domain:trnData xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
<domain:name>fakesite.example</domain:name>
<domain:trStatus>%STATUS%</domain:trStatus>
<domain:reID>TheRegistrar</domain:reID>
<domain:reDate>%REDATE%</domain:reDate>
<domain:acID>NewRegistrar</domain:acID>
<domain:acDate>%ACDATE%</domain:acDate>
<domain:exDate>%EXDATE%</domain:exDate>
</domain:trnData>
</resData>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -0,0 +1,11 @@
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
<response>
<result code="2002">
<msg>Object has no transfer history</msg>
</result>
<trID>
<clTRID>ABC-12345</clTRID>
<svTRID>server-trid</svTRID>
</trID>
</response>
</epp>

View file

@ -8,10 +8,10 @@
<domain:name>fakesite.example</domain:name>
<domain:trStatus>pending</domain:trStatus>
<domain:reID>TheRegistrar</domain:reID>
<domain:reDate>2002-05-30T00:00:00Z</domain:reDate>
<domain:reDate>%REDATE%</domain:reDate>
<domain:acID>NewRegistrar</domain:acID>
<domain:acDate>2002-06-04T00:00:00Z</domain:acDate>
<domain:exDate>2003-06-01T00:04:00Z</domain:exDate>
<domain:acDate>%ACDATE%</domain:acDate>
<domain:exDate>%EXDATE%</domain:exDate>
</domain:trnData>
</resData>
<trID>

View file

@ -167,7 +167,7 @@
<rdeDomain:reDate>1991-01-01T00:00:00Z</rdeDomain:reDate>
<rdeDomain:acRr>losing</rdeDomain:acRr>
<rdeDomain:acDate>1993-04-20T00:00:00Z</rdeDomain:acDate>
<rdeDomain:exDate>2001-01-01T00:00:00Z</rdeDomain:exDate>
<rdeDomain:exDate>1995-01-01T00:00:00Z</rdeDomain:exDate>
</rdeDomain:trnData>
</rdeDomain:domain>