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