From 5d2bb892f3c002ca28d5394b3fcae4d2caa81975 Mon Sep 17 00:00:00 2001 From: shicong Date: Thu, 29 Nov 2018 07:47:54 -0800 Subject: [PATCH] Update lastEppUpdateTime and lastEppUpdateClientId when necessary EppResource's lastEppUpdateTime and lastEppUpdateClientId need to be updated whenever the domain is updated, renewed, deleted or transfered. This commit applied the change to the following domain EPP commands: - Update (already implemented) - Renew - Delete - Restore - Transfer request - Transfer approve - Transfer reject - Transfer cancel ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=223344758 --- .../batch/DeleteContactsAndHostsAction.java | 6 ++++-- .../registry/flows/ResourceFlowUtils.java | 12 ++++++++---- .../contact/ContactTransferCancelFlow.java | 2 +- .../contact/ContactTransferRejectFlow.java | 2 +- .../registry/flows/domain/DomainDeleteFlow.java | 4 +++- .../registry/flows/domain/DomainRenewFlow.java | 17 +++++++++++------ .../flows/domain/DomainRestoreRequestFlow.java | 12 +++++++++--- .../flows/domain/DomainTransferApproveFlow.java | 6 +++++- .../flows/domain/DomainTransferCancelFlow.java | 2 +- .../flows/domain/DomainTransferRejectFlow.java | 2 +- .../flows/domain/DomainTransferRequestFlow.java | 12 ++++++++---- .../flows/domain/DomainDeleteFlowTest.java | 6 +++++- .../flows/domain/DomainRenewFlowTest.java | 6 +++++- .../domain/DomainRestoreRequestFlowTest.java | 6 +++++- .../domain/DomainTransferApproveFlowTest.java | 6 +++++- .../domain/DomainTransferCancelFlowTest.java | 6 +++++- .../domain/DomainTransferRejectFlowTest.java | 6 +++++- .../domain/DomainTransferRequestFlowTest.java | 6 +++++- .../flows/domain/DomainUpdateFlowTest.java | 6 +++++- ..._fakesite_3_nameservers_pending_transfer.xml | 4 ++-- ...kesite_3_nameservers_transfer_successful.xml | 4 ++-- ...in_info_response_fakesite_pending_delete.xml | 2 ++ ..._info_response_fakesite_pending_transfer.xml | 2 ++ ...onse_fakesite_pending_transfer_autorenew.xml | 2 ++ ...omain_info_response_fakesite_restored_ok.xml | 2 ++ ...info_response_fakesite_transfer_complete.xml | 2 ++ ...n_info_response_fakesite_transfer_period.xml | 2 ++ .../testdata/domain_info_response_wildcard.xml | 2 ++ 28 files changed, 110 insertions(+), 37 deletions(-) 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