From a246eeea82626136e324b19f22ecce31f61c6d81 Mon Sep 17 00:00:00 2001 From: Ben McIlwain Date: Thu, 30 Dec 2021 17:23:14 -0500 Subject: [PATCH] Make not logged in errors take precedence over extension errors (#1483) * Make not logged in errors take precedence over extension errors This is the right order to do the checks in, because if the registrar isn't logged in (or their login failed) then they will have an empty set of declared extensions, so any attempt to use an extension will throw a "Service extension(s) must be declared at login" error. This is potentially misleading because the actual error in this situation is that the registrar isn't logged in at all. This also fixes some flows that weren't declared final (but should be), or methods declared final on final classes, which is superfluous. --- .../registry/flows/contact/ContactCheckFlow.java | 4 ++-- .../registry/flows/contact/ContactCreateFlow.java | 4 ++-- .../registry/flows/contact/ContactDeleteFlow.java | 4 ++-- .../registry/flows/contact/ContactInfoFlow.java | 4 ++-- .../flows/contact/ContactTransferApproveFlow.java | 6 +++--- .../flows/contact/ContactTransferCancelFlow.java | 2 +- .../flows/contact/ContactTransferQueryFlow.java | 4 ++-- .../flows/contact/ContactTransferRejectFlow.java | 4 ++-- .../flows/contact/ContactTransferRequestFlow.java | 4 ++-- .../registry/flows/contact/ContactUpdateFlow.java | 4 ++-- .../registry/flows/domain/DomainCheckFlow.java | 2 +- .../flows/domain/DomainClaimsCheckFlow.java | 2 +- .../registry/flows/domain/DomainCreateFlow.java | 6 +++--- .../registry/flows/domain/DomainDeleteFlow.java | 4 ++-- .../registry/flows/domain/DomainInfoFlow.java | 4 ++-- .../registry/flows/domain/DomainRenewFlow.java | 4 ++-- .../flows/domain/DomainRestoreRequestFlow.java | 4 ++-- .../flows/domain/DomainTransferApproveFlow.java | 6 +++--- .../flows/domain/DomainTransferCancelFlow.java | 4 ++-- .../flows/domain/DomainTransferQueryFlow.java | 4 ++-- .../flows/domain/DomainTransferRejectFlow.java | 4 ++-- .../flows/domain/DomainTransferRequestFlow.java | 4 ++-- .../registry/flows/domain/DomainUpdateFlow.java | 2 +- .../google/registry/flows/host/HostCheckFlow.java | 4 ++-- .../google/registry/flows/host/HostCreateFlow.java | 4 ++-- .../google/registry/flows/host/HostDeleteFlow.java | 4 ++-- .../google/registry/flows/host/HostInfoFlow.java | 2 +- .../google/registry/flows/host/HostUpdateFlow.java | 4 ++-- .../google/registry/flows/poll/PollAckFlow.java | 14 +++++++------- .../registry/flows/poll/PollRequestFlow.java | 6 +++--- .../google/registry/flows/session/HelloFlow.java | 2 +- .../google/registry/flows/session/LoginFlow.java | 2 +- .../google/registry/flows/session/LogoutFlow.java | 6 +++--- .../registry/flows/domain/DomainCheckFlowTest.java | 11 +++++++++++ 34 files changed, 80 insertions(+), 69 deletions(-) diff --git a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java index 64d0d5113..ee66602d7 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactCheckFlow.java @@ -56,9 +56,9 @@ public final class ContactCheckFlow implements Flow { @Inject ContactCheckFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. ImmutableList targetIds = ((Check) resourceCommand).getTargetIds(); verifyTargetIdCount(targetIds, maxChecks); ImmutableSet existingIds = diff --git a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java index 5df19aa41..8a6faf9a1 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactCreateFlow.java @@ -70,10 +70,10 @@ public final class ContactCreateFlow implements TransactionalFlow { @Inject ContactCreateFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); Create command = (Create) resourceCommand; DateTime now = tm().getTransactionTime(); verifyResourceDoesNotExist(ContactResource.class, targetId, now, registrarId); diff --git a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java index ba3264a1b..d7a0cb371 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactDeleteFlow.java @@ -90,10 +90,10 @@ public final class ContactDeleteFlow implements TransactionalFlow { ContactDeleteFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); checkLinkedDomains(targetId, now, ContactResource.class, DomainBase::getReferencedContacts); ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now); diff --git a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java index a1a465fa2..b21609c94 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactInfoFlow.java @@ -65,10 +65,10 @@ public final class ContactInfoFlow implements Flow { ContactInfoFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { DateTime now = clock.nowUtc(); - extensionManager.validate(); // There are no legal extensions for this flow. validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. ContactResource contact = loadAndVerifyExistence(ContactResource.class, targetId, now); if (!isSuperuser) { verifyResourceOwnership(registrarId, contact); diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java index 6bfee950a..2a78ff562 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferApproveFlow.java @@ -74,14 +74,14 @@ public final class ContactTransferApproveFlow implements TransactionalFlow { @Inject ContactTransferApproveFlow() {} /** - *

The logic in this flow, which handles client approvals, very closely parallels the logic in + * The logic in this flow, which handles client approvals, very closely parallels the logic in * {@link ContactResource#cloneProjectedAtTime} which handles implicit server approvals. */ @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now); verifyOptionalAuthInfo(authInfo, existingContact); diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java index f403c4aab..dfc43776b 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferCancelFlow.java @@ -76,8 +76,8 @@ public final class ContactTransferCancelFlow implements TransactionalFlow { @Override public final EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now); verifyOptionalAuthInfo(authInfo, existingContact); diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java index b800719d8..d2e47dbd2 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferQueryFlow.java @@ -63,9 +63,9 @@ public final class ContactTransferQueryFlow implements Flow { @Inject ContactTransferQueryFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. ContactResource contact = loadAndVerifyExistence(ContactResource.class, targetId, clock.nowUtc()); verifyOptionalAuthInfo(authInfo, contact); diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java index 3ce701c94..06287eeb2 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRejectFlow.java @@ -72,10 +72,10 @@ public final class ContactTransferRejectFlow implements TransactionalFlow { @Inject ContactTransferRejectFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now); verifyOptionalAuthInfo(authInfo, existingContact); diff --git a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java index 77f84e93f..fd98af00e 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactTransferRequestFlow.java @@ -92,10 +92,10 @@ public final class ContactTransferRequestFlow implements TransactionalFlow { @Inject ContactTransferRequestFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(gainingClientId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now); verifyAuthInfoPresentForResourceTransfer(authInfo); diff --git a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java index 3ae076ff9..1f2d08cc7 100644 --- a/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/contact/ContactUpdateFlow.java @@ -89,10 +89,10 @@ public final class ContactUpdateFlow implements TransactionalFlow { @Inject ContactUpdateFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); Update command = (Update) resourceCommand; DateTime now = tm().getTransactionTime(); ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now); diff --git a/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java b/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java index 434344c1b..64c4016a9 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainCheckFlow.java @@ -135,8 +135,8 @@ public final class DomainCheckFlow implements Flow { extensionManager.register( FeeCheckCommandExtension.class, LaunchCheckExtension.class, AllocationTokenExtension.class); flowCustomLogic.beforeValidation(); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); ImmutableList domainNames = ((Check) resourceCommand).getTargetIds(); verifyTargetIdCount(domainNames, maxChecks); DateTime now = clock.nowUtc(); diff --git a/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java b/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java index 57b62e918..a64a6f000 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainClaimsCheckFlow.java @@ -82,8 +82,8 @@ public final class DomainClaimsCheckFlow implements Flow { @Override public EppResponse run() throws EppException { extensionManager.register(LaunchCheckExtension.class, AllocationTokenExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); if (eppInput.getSingleExtension(AllocationTokenExtension.class).isPresent()) { throw new DomainClaimsCheckNotAllowedWithAllocationTokens(); } diff --git a/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java b/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java index 857b9349e..f3bee2ef2 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java @@ -198,7 +198,7 @@ import org.joda.time.Duration; * @error {@link DomainPricingLogic.AllocationTokenInvalidForPremiumNameException} */ @ReportingSpec(ActivityReportField.DOMAIN_CREATE) -public class DomainCreateFlow implements TransactionalFlow { +public final class DomainCreateFlow implements TransactionalFlow { /** Anchor tenant creates should always be for 2 years, since they get 2 years free. */ private static final int ANCHOR_TENANT_CREATE_VALID_YEARS = 2; @@ -219,7 +219,7 @@ public class DomainCreateFlow implements TransactionalFlow { @Inject DomainCreateFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register( FeeCreateCommandExtension.class, SecDnsCreateExtension.class, @@ -227,9 +227,9 @@ public class DomainCreateFlow implements TransactionalFlow { LaunchCreateExtension.class, AllocationTokenExtension.class); flowCustomLogic.beforeValidation(); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); verifyRegistrarIsActive(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); DomainCommand.Create command = cloneAndLinkReferences((Create) resourceCommand, now); Period period = command.getPeriod(); diff --git a/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java b/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java index a23c24c86..60b673e7f 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java @@ -138,12 +138,12 @@ public final class DomainDeleteFlow implements TransactionalFlow { @Inject DomainDeleteFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register( MetadataExtension.class, SecDnsCreateExtension.class, DomainDeleteSuperuserExtension.class); flowCustomLogic.beforeValidation(); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); // Loads the target resource if it exists DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); diff --git a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java index cd1e17085..0d4d61489 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainInfoFlow.java @@ -91,11 +91,11 @@ public final class DomainInfoFlow implements Flow { DomainInfoFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(FeeInfoCommandExtensionV06.class); flowCustomLogic.beforeValidation(); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = clock.nowUtc(); DomainBase domain = verifyExistence( DomainBase.class, targetId, loadByForeignKey(DomainBase.class, targetId, now)); diff --git a/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java b/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java index 82f04d890..18af352f3 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java @@ -135,12 +135,12 @@ public final class DomainRenewFlow implements TransactionalFlow { @Inject DomainRenewFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(FeeRenewCommandExtension.class, MetadataExtension.class); flowCustomLogic.beforeValidation(); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); verifyRegistrarIsActive(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); Renew command = (Renew) resourceCommand; // Loads the target resource if it exists diff --git a/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java b/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java index be2021c1b..e548cda8f 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java @@ -128,14 +128,14 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow { @Inject DomainRestoreRequestFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register( FeeUpdateCommandExtension.class, MetadataExtension.class, RgpUpdateExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); verifyRegistrarIsActive(registrarId); + extensionManager.validate(); Update command = (Update) resourceCommand; DateTime now = tm().getTransactionTime(); DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java index 80354e1ea..9199fac2f 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java @@ -99,14 +99,14 @@ public final class DomainTransferApproveFlow implements TransactionalFlow { @Inject DomainTransferApproveFlow() {} /** - *

The logic in this flow, which handles client approvals, very closely parallels the logic in + * The logic in this flow, which handles client approvals, very closely parallels the logic in * {@link DomainBase#cloneProjectedAtTime} which handles implicit server approvals. */ @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); verifyOptionalAuthInfo(authInfo, existingDomain); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java index 633e00f53..19d430ea9 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java @@ -86,10 +86,10 @@ public final class DomainTransferCancelFlow implements TransactionalFlow { @Inject DomainTransferCancelFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); verifyOptionalAuthInfo(authInfo, existingDomain); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java index c3456e1ec..cf549fb58 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferQueryFlow.java @@ -67,9 +67,9 @@ public final class DomainTransferQueryFlow implements Flow { @Inject DomainTransferQueryFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. DateTime now = clock.nowUtc(); DomainBase domain = loadAndVerifyExistence(DomainBase.class, targetId, now); verifyOptionalAuthInfo(authInfo, domain); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java index ae6df4163..ed39bf274 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java @@ -88,10 +88,10 @@ public final class DomainTransferRejectFlow implements TransactionalFlow { @Inject DomainTransferRejectFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); Registry registry = Registry.get(existingDomain.getTld()); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java index 08439b436..1f93dc87c 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java @@ -139,14 +139,14 @@ public final class DomainTransferRequestFlow implements TransactionalFlow { @Inject DomainTransferRequestFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register( DomainTransferRequestSuperuserExtension.class, FeeTransferCommandExtension.class, MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(gainingClientId); verifyRegistrarIsActive(gainingClientId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); Optional superuserExtension = diff --git a/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java b/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java index 3bccd51e5..b257b8d9a 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainUpdateFlow.java @@ -168,8 +168,8 @@ public final class DomainUpdateFlow implements TransactionalFlow { SecDnsUpdateExtension.class, DomainUpdateSuperuserExtension.class); flowCustomLogic.beforeValidation(); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); Update command = cloneAndLinkReferences((Update) resourceCommand, now); DomainBase existingDomain = loadAndVerifyExistence(DomainBase.class, targetId, now); diff --git a/core/src/main/java/google/registry/flows/host/HostCheckFlow.java b/core/src/main/java/google/registry/flows/host/HostCheckFlow.java index c3a108690..734325f84 100644 --- a/core/src/main/java/google/registry/flows/host/HostCheckFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostCheckFlow.java @@ -56,9 +56,9 @@ public final class HostCheckFlow implements Flow { @Inject HostCheckFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. ImmutableList hostnames = ((Check) resourceCommand).getTargetIds(); verifyTargetIdCount(hostnames, maxChecks); ImmutableSet existingIds = diff --git a/core/src/main/java/google/registry/flows/host/HostCreateFlow.java b/core/src/main/java/google/registry/flows/host/HostCreateFlow.java index 802e571eb..560c33e54 100644 --- a/core/src/main/java/google/registry/flows/host/HostCreateFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostCreateFlow.java @@ -100,10 +100,10 @@ public final class HostCreateFlow implements TransactionalFlow { HostCreateFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); Create command = (Create) resourceCommand; DateTime now = tm().getTransactionTime(); verifyResourceDoesNotExist(HostResource.class, targetId, now, registrarId); diff --git a/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java b/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java index e154ec29d..67c185f1b 100644 --- a/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java @@ -92,10 +92,10 @@ public final class HostDeleteFlow implements TransactionalFlow { HostDeleteFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); DateTime now = tm().getTransactionTime(); validateHostName(targetId); checkLinkedDomains(targetId, now, HostResource.class, DomainBase::getNameservers); diff --git a/core/src/main/java/google/registry/flows/host/HostInfoFlow.java b/core/src/main/java/google/registry/flows/host/HostInfoFlow.java index c55286ccd..ad0a962ea 100644 --- a/core/src/main/java/google/registry/flows/host/HostInfoFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostInfoFlow.java @@ -62,8 +62,8 @@ public final class HostInfoFlow implements Flow { @Override public EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. validateHostName(targetId); DateTime now = clock.nowUtc(); HostResource host = loadAndVerifyExistence(HostResource.class, targetId, now); diff --git a/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java b/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java index 0991ed97c..6d7566015 100644 --- a/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostUpdateFlow.java @@ -125,10 +125,10 @@ public final class HostUpdateFlow implements TransactionalFlow { @Inject HostUpdateFlow() {} @Override - public final EppResponse run() throws EppException { + public EppResponse run() throws EppException { extensionManager.register(MetadataExtension.class); - extensionManager.validate(); validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); Update command = (Update) resourceCommand; Change change = command.getInnerChange(); String suppliedNewHostName = change.getFullyQualifiedHostName(); diff --git a/core/src/main/java/google/registry/flows/poll/PollAckFlow.java b/core/src/main/java/google/registry/flows/poll/PollAckFlow.java index 07c58d224..b797bdb70 100644 --- a/core/src/main/java/google/registry/flows/poll/PollAckFlow.java +++ b/core/src/main/java/google/registry/flows/poll/PollAckFlow.java @@ -45,17 +45,17 @@ import org.joda.time.DateTime; /** * An EPP flow for acknowledging {@link PollMessage}s. * - *

Registrars refer to poll messages using an externally visible id generated by - * {@link PollMessageExternalKeyConverter}. One-time poll messages are deleted from Datastore once - * they are ACKed, whereas autorenew poll messages are simply marked as read, and won't be delivered - * again until the next year of their recurrence. + *

Registrars refer to poll messages using an externally visible id generated by {@link + * PollMessageExternalKeyConverter}. One-time poll messages are deleted from Datastore once they are + * ACKed, whereas autorenew poll messages are simply marked as read, and won't be delivered again + * until the next year of their recurrence. * * @error {@link PollAckFlow.InvalidMessageIdException} * @error {@link PollAckFlow.MessageDoesNotExistException} * @error {@link PollAckFlow.MissingMessageIdException} * @error {@link PollAckFlow.NotAuthorizedToAckMessageException} */ -public class PollAckFlow implements TransactionalFlow { +public final class PollAckFlow implements TransactionalFlow { @Inject ExtensionManager extensionManager; @Inject @RegistrarId String registrarId; @@ -65,9 +65,9 @@ public class PollAckFlow implements TransactionalFlow { @Inject PollAckFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. if (messageId.isEmpty()) { throw new MissingMessageIdException(); } diff --git a/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java b/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java index 20d6ef832..06c8e3194 100644 --- a/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java +++ b/core/src/main/java/google/registry/flows/poll/PollRequestFlow.java @@ -47,7 +47,7 @@ import org.joda.time.DateTime; * * @error {@link PollRequestFlow.UnexpectedMessageIdException} */ -public class PollRequestFlow implements Flow { +public final class PollRequestFlow implements Flow { @Inject ExtensionManager extensionManager; @Inject @RegistrarId String registrarId; @@ -57,9 +57,9 @@ public class PollRequestFlow implements Flow { @Inject PollRequestFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. if (!messageId.isEmpty()) { throw new UnexpectedMessageIdException(); } diff --git a/core/src/main/java/google/registry/flows/session/HelloFlow.java b/core/src/main/java/google/registry/flows/session/HelloFlow.java index 876fd626c..a3051d8ef 100644 --- a/core/src/main/java/google/registry/flows/session/HelloFlow.java +++ b/core/src/main/java/google/registry/flows/session/HelloFlow.java @@ -27,7 +27,7 @@ import javax.inject.Inject; * * @error {@link google.registry.flows.FlowUtils.GenericXmlSyntaxErrorException} */ -public class HelloFlow implements Flow { +public final class HelloFlow implements Flow { @Inject ExtensionManager extensionManager; @Inject Clock clock; diff --git a/core/src/main/java/google/registry/flows/session/LoginFlow.java b/core/src/main/java/google/registry/flows/session/LoginFlow.java index 89c27031e..0879ee6b0 100644 --- a/core/src/main/java/google/registry/flows/session/LoginFlow.java +++ b/core/src/main/java/google/registry/flows/session/LoginFlow.java @@ -90,7 +90,7 @@ public class LoginFlow implements Flow { } /** Run the flow without bothering to log errors. The {@link #run} method will do that for us. */ - private final EppResponse runWithoutLogging() throws EppException { + private EppResponse runWithoutLogging() throws EppException { extensionManager.validate(); // There are no legal extensions for this flow. Login login = (Login) eppInput.getCommandWrapper().getCommand(); if (!registrarId.isEmpty()) { diff --git a/core/src/main/java/google/registry/flows/session/LogoutFlow.java b/core/src/main/java/google/registry/flows/session/LogoutFlow.java index eb65fc9b9..450e47d5a 100644 --- a/core/src/main/java/google/registry/flows/session/LogoutFlow.java +++ b/core/src/main/java/google/registry/flows/session/LogoutFlow.java @@ -30,7 +30,7 @@ import javax.inject.Inject; * * @error {@link google.registry.flows.FlowUtils.NotLoggedInException} */ -public class LogoutFlow implements Flow { +public final class LogoutFlow implements Flow { @Inject ExtensionManager extensionManager; @Inject @RegistrarId String registrarId; @@ -39,9 +39,9 @@ public class LogoutFlow implements Flow { @Inject LogoutFlow() {} @Override - public final EppResponse run() throws EppException { - extensionManager.validate(); // There are no legal extensions for this flow. + public EppResponse run() throws EppException { validateRegistrarIsLoggedIn(registrarId); + extensionManager.validate(); // There are no legal extensions for this flow. sessionMetadata.invalidate(); return responseBuilder.setResultFromCode(SUCCESS_AND_CLOSE).build(); } diff --git a/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java index 3e9da5b81..dd1b8da45 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainCheckFlowTest.java @@ -130,6 +130,17 @@ class DomainCheckFlowTest extends ResourceCheckFlowTestCase