diff --git a/java/google/registry/batch/DeleteContactsAndHostsAction.java b/java/google/registry/batch/DeleteContactsAndHostsAction.java
index 2bbd1bb88..675221a9e 100644
--- a/java/google/registry/batch/DeleteContactsAndHostsAction.java
+++ b/java/google/registry/batch/DeleteContactsAndHostsAction.java
@@ -39,6 +39,7 @@ import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_DELETE;
import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_DELETE_FAILURE;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_DELETE;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_DELETE_FAILURE;
+import static google.registry.model.transfer.TransferStatus.SERVER_CANCELLED;
import static google.registry.util.PipelineUtils.createJobPath;
import static java.math.RoundingMode.CEILING;
import static java.util.concurrent.TimeUnit.DAYS;
@@ -85,7 +86,6 @@ import google.registry.model.poll.PendingActionNotificationResponse.HostPendingA
import google.registry.model.poll.PollMessage;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.server.Lock;
-import google.registry.model.transfer.TransferStatus;
import google.registry.request.Action;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
@@ -394,7 +394,9 @@ public class DeleteContactsAndHostsAction implements Runnable {
ContactResource contact = (ContactResource) resource;
// Handle pending transfers on contact deletion.
if (contact.getStatusValues().contains(StatusValue.PENDING_TRANSFER)) {
- contact = denyPendingTransfer(contact, TransferStatus.SERVER_CANCELLED, now);
+ contact =
+ denyPendingTransfer(
+ contact, SERVER_CANCELLED, now, deletionRequest.requestingClientId());
}
// Wipe out PII on contact deletion.
resourceToSaveBuilder = contact.asBuilder().wipeOut();
diff --git a/java/google/registry/flows/ResourceFlowUtils.java b/java/google/registry/flows/ResourceFlowUtils.java
index a63501742..bed58fcc1 100644
--- a/java/google/registry/flows/ResourceFlowUtils.java
+++ b/java/google/registry/flows/ResourceFlowUtils.java
@@ -258,13 +258,17 @@ public final class ResourceFlowUtils {
* Resolve a pending transfer by denying it.
*
*
This removes the {@link StatusValue#PENDING_TRANSFER} status, sets the {@link
- * TransferStatus}, clears all the server-approve fields on the {@link TransferData}, and sets the
- * expiration time of the last pending transfer to now.
+ * TransferStatus}, clears all the server-approve fields on the {@link TransferData}, sets the
+ * expiration time of the last pending transfer to now, sets the last EPP update time to now, and
+ * sets the last EPP update client id to the given client id.
*/
public static R denyPendingTransfer(
- R resource, TransferStatus transferStatus, DateTime now) {
+ R resource, TransferStatus transferStatus, DateTime now, String lastEppUpdateClientId) {
checkArgument(transferStatus.isDenied(), "Not a denial transfer status");
- return resolvePendingTransfer(resource, transferStatus, now).build();
+ return resolvePendingTransfer(resource, transferStatus, now)
+ .setLastEppUpdateTime(now)
+ .setLastEppUpdateClientId(lastEppUpdateClientId)
+ .build();
}
public static void verifyHasPendingTransfer(
diff --git a/java/google/registry/flows/contact/ContactTransferCancelFlow.java b/java/google/registry/flows/contact/ContactTransferCancelFlow.java
index e265d6bc3..3dbec6b30 100644
--- a/java/google/registry/flows/contact/ContactTransferCancelFlow.java
+++ b/java/google/registry/flows/contact/ContactTransferCancelFlow.java
@@ -80,7 +80,7 @@ public final class ContactTransferCancelFlow implements TransactionalFlow {
verifyHasPendingTransfer(existingContact);
verifyTransferInitiator(clientId, existingContact);
ContactResource newContact =
- denyPendingTransfer(existingContact, TransferStatus.CLIENT_CANCELLED, now);
+ denyPendingTransfer(existingContact, TransferStatus.CLIENT_CANCELLED, now, clientId);
HistoryEntry historyEntry = historyBuilder
.setType(HistoryEntry.Type.CONTACT_TRANSFER_CANCEL)
.setModificationTime(now)
diff --git a/java/google/registry/flows/contact/ContactTransferRejectFlow.java b/java/google/registry/flows/contact/ContactTransferRejectFlow.java
index 504e08d9b..ccded2b25 100644
--- a/java/google/registry/flows/contact/ContactTransferRejectFlow.java
+++ b/java/google/registry/flows/contact/ContactTransferRejectFlow.java
@@ -78,7 +78,7 @@ public final class ContactTransferRejectFlow implements TransactionalFlow {
verifyHasPendingTransfer(existingContact);
verifyResourceOwnership(clientId, existingContact);
ContactResource newContact =
- denyPendingTransfer(existingContact, TransferStatus.CLIENT_REJECTED, now);
+ denyPendingTransfer(existingContact, TransferStatus.CLIENT_REJECTED, now, clientId);
HistoryEntry historyEntry = historyBuilder
.setType(HistoryEntry.Type.CONTACT_TRANSFER_REJECT)
.setModificationTime(now)
diff --git a/java/google/registry/flows/domain/DomainDeleteFlow.java b/java/google/registry/flows/domain/DomainDeleteFlow.java
index 29056bf77..3e1ce84e1 100644
--- a/java/google/registry/flows/domain/DomainDeleteFlow.java
+++ b/java/google/registry/flows/domain/DomainDeleteFlow.java
@@ -152,10 +152,12 @@ public final class DomainDeleteFlow implements TransactionalFlow {
Builder builder;
if (existingDomain.getStatusValues().contains(StatusValue.PENDING_TRANSFER)) {
builder =
- denyPendingTransfer(existingDomain, TransferStatus.SERVER_CANCELLED, now).asBuilder();
+ denyPendingTransfer(existingDomain, TransferStatus.SERVER_CANCELLED, now, clientId)
+ .asBuilder();
} else {
builder = existingDomain.asBuilder();
}
+ builder.setLastEppUpdateTime(now).setLastEppUpdateClientId(clientId);
Duration redemptionGracePeriodLength = registry.getRedemptionGracePeriodLength();
Duration pendingDeleteLength = registry.getPendingDeleteLength();
Optional domainDeleteSuperuserExtension =
diff --git a/java/google/registry/flows/domain/DomainRenewFlow.java b/java/google/registry/flows/domain/DomainRenewFlow.java
index c71493205..0cf32130b 100644
--- a/java/google/registry/flows/domain/DomainRenewFlow.java
+++ b/java/google/registry/flows/domain/DomainRenewFlow.java
@@ -175,12 +175,17 @@ public final class DomainRenewFlow implements TransactionalFlow {
.build();
// End the old autorenew billing event and poll message now. This may delete the poll message.
updateAutorenewRecurrenceEndTime(existingDomain, now);
- DomainResource newDomain = existingDomain.asBuilder()
- .setRegistrationExpirationTime(newExpirationTime)
- .setAutorenewBillingEvent(Key.create(newAutorenewEvent))
- .setAutorenewPollMessage(Key.create(newAutorenewPollMessage))
- .addGracePeriod(GracePeriod.forBillingEvent(GracePeriodStatus.RENEW, explicitRenewEvent))
- .build();
+ DomainResource newDomain =
+ existingDomain
+ .asBuilder()
+ .setLastEppUpdateTime(now)
+ .setLastEppUpdateClientId(clientId)
+ .setRegistrationExpirationTime(newExpirationTime)
+ .setAutorenewBillingEvent(Key.create(newAutorenewEvent))
+ .setAutorenewPollMessage(Key.create(newAutorenewPollMessage))
+ .addGracePeriod(
+ GracePeriod.forBillingEvent(GracePeriodStatus.RENEW, explicitRenewEvent))
+ .build();
EntityChanges entityChanges =
flowCustomLogic.beforeSave(
BeforeSaveParameters.newBuilder()
diff --git a/java/google/registry/flows/domain/DomainRestoreRequestFlow.java b/java/google/registry/flows/domain/DomainRestoreRequestFlow.java
index 04aac8318..d09613e19 100644
--- a/java/google/registry/flows/domain/DomainRestoreRequestFlow.java
+++ b/java/google/registry/flows/domain/DomainRestoreRequestFlow.java
@@ -161,7 +161,8 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow {
.setParent(historyEntry)
.build();
DomainResource newDomain =
- performRestore(existingDomain, newExpirationTime, autorenewEvent, autorenewPollMessage);
+ performRestore(
+ existingDomain, newExpirationTime, autorenewEvent, autorenewPollMessage, now, clientId);
updateForeignKeyIndexDeletionTime(newDomain);
entitiesToSave.add(newDomain, historyEntry, autorenewEvent, autorenewPollMessage);
ofy().save().entities(entitiesToSave.build());
@@ -227,8 +228,11 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow {
DomainResource existingDomain,
DateTime newExpirationTime,
BillingEvent.Recurring autorenewEvent,
- PollMessage.Autorenew autorenewPollMessage) {
- return existingDomain.asBuilder()
+ PollMessage.Autorenew autorenewPollMessage,
+ DateTime now,
+ String clientId) {
+ return existingDomain
+ .asBuilder()
.setRegistrationExpirationTime(newExpirationTime)
.setDeletionTime(END_OF_TIME)
.setStatusValues(null)
@@ -236,6 +240,8 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow {
.setDeletePollMessage(null)
.setAutorenewBillingEvent(Key.create(autorenewEvent))
.setAutorenewPollMessage(Key.create(autorenewPollMessage))
+ .setLastEppUpdateTime(now)
+ .setLastEppUpdateClientId(clientId)
.build();
}
diff --git a/java/google/registry/flows/domain/DomainTransferApproveFlow.java b/java/google/registry/flows/domain/DomainTransferApproveFlow.java
index 3f5d5da44..d4ae38f32 100644
--- a/java/google/registry/flows/domain/DomainTransferApproveFlow.java
+++ b/java/google/registry/flows/domain/DomainTransferApproveFlow.java
@@ -181,7 +181,9 @@ public final class DomainTransferApproveFlow implements TransactionalFlow {
// Update the transferredRegistrationExpirationTime here since approvePendingTransfer()
// doesn't know what to set it to and leaves it null.
.setTransferData(
- partiallyApprovedDomain.getTransferData().asBuilder()
+ partiallyApprovedDomain
+ .getTransferData()
+ .asBuilder()
.setTransferredRegistrationExpirationTime(newExpirationTime)
.build())
.setRegistrationExpirationTime(newExpirationTime)
@@ -193,6 +195,8 @@ public final class DomainTransferApproveFlow implements TransactionalFlow {
? ImmutableSet.of(
GracePeriod.forBillingEvent(GracePeriodStatus.TRANSFER, billingEvent.get()))
: ImmutableSet.of())
+ .setLastEppUpdateTime(now)
+ .setLastEppUpdateClientId(clientId)
.build();
// Create a poll message for the gaining client.
PollMessage gainingClientPollMessage = createGainingTransferPollMessage(
diff --git a/java/google/registry/flows/domain/DomainTransferCancelFlow.java b/java/google/registry/flows/domain/DomainTransferCancelFlow.java
index a285b00ad..19b3b6c41 100644
--- a/java/google/registry/flows/domain/DomainTransferCancelFlow.java
+++ b/java/google/registry/flows/domain/DomainTransferCancelFlow.java
@@ -98,7 +98,7 @@ public final class DomainTransferCancelFlow implements TransactionalFlow {
Registry registry = Registry.get(existingDomain.getTld());
HistoryEntry historyEntry = buildHistoryEntry(existingDomain, registry, now);
DomainResource newDomain =
- denyPendingTransfer(existingDomain, TransferStatus.CLIENT_CANCELLED, now);
+ denyPendingTransfer(existingDomain, TransferStatus.CLIENT_CANCELLED, now, clientId);
ofy().save().entities(
newDomain,
historyEntry,
diff --git a/java/google/registry/flows/domain/DomainTransferRejectFlow.java b/java/google/registry/flows/domain/DomainTransferRejectFlow.java
index fdf561be6..a74e85a97 100644
--- a/java/google/registry/flows/domain/DomainTransferRejectFlow.java
+++ b/java/google/registry/flows/domain/DomainTransferRejectFlow.java
@@ -100,7 +100,7 @@ public final class DomainTransferRejectFlow implements TransactionalFlow {
checkAllowedAccessToTld(clientId, existingDomain.getTld());
}
DomainResource newDomain =
- denyPendingTransfer(existingDomain, TransferStatus.CLIENT_REJECTED, now);
+ denyPendingTransfer(existingDomain, TransferStatus.CLIENT_REJECTED, now, clientId);
ofy().save().entities(
newDomain,
historyEntry,
diff --git a/java/google/registry/flows/domain/DomainTransferRequestFlow.java b/java/google/registry/flows/domain/DomainTransferRequestFlow.java
index 0c99a9e3f..fb10545dd 100644
--- a/java/google/registry/flows/domain/DomainTransferRequestFlow.java
+++ b/java/google/registry/flows/domain/DomainTransferRequestFlow.java
@@ -225,10 +225,14 @@ public final class DomainTransferRequestFlow implements TransactionalFlow {
// cloneProjectedAtTime() will replace these old autorenew entities with the server approve ones
// that we've created in this flow and stored in pendingTransferData.
updateAutorenewRecurrenceEndTime(existingDomain, automaticTransferTime);
- DomainResource newDomain = existingDomain.asBuilder()
- .setTransferData(pendingTransferData)
- .addStatusValue(StatusValue.PENDING_TRANSFER)
- .build();
+ DomainResource newDomain =
+ existingDomain
+ .asBuilder()
+ .setTransferData(pendingTransferData)
+ .addStatusValue(StatusValue.PENDING_TRANSFER)
+ .setLastEppUpdateTime(now)
+ .setLastEppUpdateClientId(gainingClientId)
+ .build();
asyncFlowEnqueuer.enqueueAsyncResave(newDomain, now, automaticTransferTime);
ofy().save()
.entities(new ImmutableSet.Builder<>()
diff --git a/javatests/google/registry/flows/domain/DomainDeleteFlowTest.java b/javatests/google/registry/flows/domain/DomainDeleteFlowTest.java
index e8530fe59..0795c2bd7 100644
--- a/javatests/google/registry/flows/domain/DomainDeleteFlowTest.java
+++ b/javatests/google/registry/flows/domain/DomainDeleteFlowTest.java
@@ -834,7 +834,11 @@ public class DomainDeleteFlowTest extends ResourceFlowTestCaseNewRegistrar
NewRegistrar
2000-06-01T00:04:00Z
- NewRegistrar
- 2000-06-08T00:00:00Z
+ TheRegistrar
+ 2002-05-30T00:00:00Z
2002-06-01T00:04:00Z
2fooBAR
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_3_nameservers_transfer_successful.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_3_nameservers_transfer_successful.xml
index 8cce591ed..44620d5ff 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_3_nameservers_transfer_successful.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_3_nameservers_transfer_successful.xml
@@ -21,8 +21,8 @@
TheRegistrar
NewRegistrar
2000-06-01T00:04:00Z
- NewRegistrar
- 2000-06-08T00:00:00Z
+ TheRegistrar
+ 2002-05-30T00:00:00Z
2003-06-01T00:04:00Z
2002-06-04T00:00:00Z
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_delete.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_delete.xml
index b2ac294cd..f1f2105bf 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_delete.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_delete.xml
@@ -19,6 +19,8 @@
NewRegistrar
NewRegistrar
2000-06-01T00:04:00Z
+ NewRegistrar
+ 2002-05-30T01:01:00Z
2002-06-01T00:04:00Z
2fooBAR
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer.xml
index 66c33f04f..fc921b478 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer.xml
@@ -19,6 +19,8 @@
NewRegistrar
NewRegistrar
2000-06-01T00:04:00Z
+ TheRegistrar
+ 2002-05-30T00:00:00Z
2002-06-01T00:04:00Z
2fooBAR
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer_autorenew.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer_autorenew.xml
index 9bf0dc051..4a75fe1ec 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer_autorenew.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_pending_transfer_autorenew.xml
@@ -19,6 +19,8 @@
NewRegistrar
NewRegistrar
2000-06-01T00:04:00Z
+ TheRegistrar
+ 2002-05-30T00:00:00Z
2003-06-01T00:04:00Z
2fooBAR
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_restored_ok.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_restored_ok.xml
index c5949a3be..b2cc3b0f6 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_restored_ok.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_restored_ok.xml
@@ -19,6 +19,8 @@
NewRegistrar
NewRegistrar
2000-06-01T00:04:00Z
+ NewRegistrar
+ 2002-05-30T01:03:00Z
2003-05-30T01:03:00Z
2fooBAR
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_complete.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_complete.xml
index 455b6c3cd..31dd15655 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_complete.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_complete.xml
@@ -19,6 +19,8 @@
TheRegistrar
NewRegistrar
2000-06-01T00:04:00Z
+ TheRegistrar
+ 2002-05-30T00:00:00Z
2003-06-01T00:04:00Z
2002-06-04T00:00:00Z
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_period.xml b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_period.xml
index 66ad7d004..1a9e777e6 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_period.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_fakesite_transfer_period.xml
@@ -19,6 +19,8 @@
TheRegistrar
NewRegistrar
2000-06-01T00:04:00Z
+ TheRegistrar
+ 2002-05-30T00:00:00Z
2003-06-01T00:04:00Z
2002-06-04T00:00:00Z
diff --git a/javatests/google/registry/flows/testdata/domain_info_response_wildcard.xml b/javatests/google/registry/flows/testdata/domain_info_response_wildcard.xml
index c10ba4b5e..3e15f24f1 100644
--- a/javatests/google/registry/flows/testdata/domain_info_response_wildcard.xml
+++ b/javatests/google/registry/flows/testdata/domain_info_response_wildcard.xml
@@ -17,6 +17,8 @@
NewRegistrar
NewRegistrar
2000-06-01T00:02:00.0Z
+ NewRegistrar
+ 2000-07-07T00:02:00Z
2002-06-01T00:02:00.0Z
2fooBAR