diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockAction.java index c0ae8c0ed..0c1e7d166 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockAction.java @@ -19,16 +19,13 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.request.Action.Method.GET; import static google.registry.request.Action.Method.POST; -import static google.registry.request.RequestParameters.extractBooleanParameter; -import static google.registry.request.RequestParameters.extractOptionalLongParameter; -import static google.registry.request.RequestParameters.extractOptionalParameter; -import static google.registry.request.RequestParameters.extractRequiredParameter; import static google.registry.ui.server.registrar.RegistryLockPostAction.VERIFICATION_EMAIL_TEMPLATE; import static jakarta.servlet.http.HttpServletResponse.SC_OK; import static jakarta.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; import com.google.common.collect.ImmutableList; import com.google.gson.Gson; +import com.google.gson.annotations.Expose; import google.registry.flows.EppException; import google.registry.flows.domain.DomainFlowUtils; import google.registry.groups.GmailClient; @@ -46,8 +43,8 @@ import google.registry.ui.server.registrar.ConsoleApiParams; import google.registry.util.EmailMessage; import jakarta.mail.internet.AddressException; import jakarta.mail.internet.InternetAddress; -import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; +import javax.annotation.Nullable; import javax.inject.Inject; import org.joda.time.Duration; @@ -69,6 +66,7 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { private final DomainLockUtils domainLockUtils; private final GmailClient gmailClient; private final Gson gson; + private final Optional optionalPostInput; private final String registrarId; @Inject @@ -77,11 +75,14 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { DomainLockUtils domainLockUtils, GmailClient gmailClient, Gson gson, + @Parameter("consoleRegistryLockPostInput") + Optional optionalPostInput, @Parameter("registrarId") String registrarId) { super(consoleApiParams); this.domainLockUtils = domainLockUtils; this.gmailClient = gmailClient; this.gson = gson; + this.optionalPostInput = optionalPostInput; this.registrarId = registrarId; } @@ -94,7 +95,6 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { @Override protected void postHandler(User user) { - HttpServletRequest req = consoleApiParams.request(); Response response = consoleApiParams.response(); // User must have the proper permission on the registrar checkPermission(user, registrarId, ConsolePermission.REGISTRY_LOCK); @@ -107,10 +107,12 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { registrarId); // Retrieve and validate the necessary params - String domainName = extractRequiredParameter(req, "domainName"); - boolean isLock = extractBooleanParameter(req, "isLock"); - Optional maybePassword = extractOptionalParameter(req, "password"); - Optional relockDurationMillis = extractOptionalLongParameter(req, "relockDurationMillis"); + ConsoleRegistryLockPostInput postInput = + optionalPostInput.orElseThrow(() -> new IllegalArgumentException("No POST input provided")); + String domainName = postInput.domainName(); + boolean isLock = postInput.isLock(); + Optional maybePassword = Optional.ofNullable(postInput.password()); + Optional relockDurationMillis = Optional.ofNullable(postInput.relockDurationMillis()); try { DomainFlowUtils.validateDomainName(domainName); @@ -176,4 +178,10 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { .filter(lock -> !lock.isLockRequestExpired(tm().getTransactionTime())) .collect(toImmutableList())); } + + public record ConsoleRegistryLockPostInput( + @Expose String domainName, + @Expose boolean isLock, + @Expose @Nullable String password, + @Expose @Nullable Long relockDurationMillis) {} } diff --git a/core/src/main/java/google/registry/ui/server/registrar/RegistrarConsoleModule.java b/core/src/main/java/google/registry/ui/server/registrar/RegistrarConsoleModule.java index dcffb4fdc..5f0faaabe 100644 --- a/core/src/main/java/google/registry/ui/server/registrar/RegistrarConsoleModule.java +++ b/core/src/main/java/google/registry/ui/server/registrar/RegistrarConsoleModule.java @@ -34,6 +34,7 @@ import google.registry.request.auth.AuthResult; import google.registry.security.XsrfTokenManager; import google.registry.ui.server.SendEmailUtils; import google.registry.ui.server.console.ConsoleEppPasswordAction.EppPasswordData; +import google.registry.ui.server.console.ConsoleRegistryLockAction.ConsoleRegistryLockPostInput; import jakarta.servlet.http.HttpServletRequest; import java.util.Optional; import org.joda.time.DateTime; @@ -242,4 +243,11 @@ public final class RegistrarConsoleModule { Gson gson, @OptionalJsonPayload Optional payload) { return payload.map(s -> gson.fromJson(s, EppPasswordData.class)); } + + @Provides + @Parameter("consoleRegistryLockPostInput") + public static Optional provideRegistryLockPostInput( + Gson gson, @OptionalJsonPayload Optional payload) { + return payload.map(e -> gson.fromJson(e, ConsoleRegistryLockPostInput.class)); + } } diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java index dc973e350..f5f2f0d76 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockActionTest.java @@ -24,6 +24,7 @@ import static google.registry.testing.DatabaseHelper.persistResource; import static google.registry.testing.SqlHelper.getMostRecentRegistryLockByRepoId; import static google.registry.testing.SqlHelper.saveRegistryLock; import static google.registry.tools.LockOrUnlockDomainCommand.REGISTRY_LOCK_STATUSES; +import static google.registry.ui.server.console.ConsoleRegistryLockAction.ConsoleRegistryLockPostInput; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static jakarta.servlet.http.HttpServletResponse.SC_FORBIDDEN; import static jakarta.servlet.http.HttpServletResponse.SC_OK; @@ -309,10 +310,7 @@ public class ConsoleRegistryLockActionTest { persistResource(defaultDomain.asBuilder().setStatusValues(REGISTRY_LOCK_STATUSES).build()); action = createPostAction( - "example.test", - false, - "registryLockPassword", - Optional.of(Duration.standardDays(1).getMillis())); + "example.test", false, "registryLockPassword", Duration.standardDays(1).getMillis()); action.run(); assertThat(response.getStatus()).isEqualTo(SC_OK); verifyEmail(); @@ -348,7 +346,7 @@ public class ConsoleRegistryLockActionTest { .setUserRoles( new UserRoles.Builder().setGlobalRole(GlobalRole.FTE).setIsAdmin(true).build()) .build(); - action = createPostAction("example.test", true, "", Optional.empty()); + action = createPostAction("example.test", true, "", null); action.run(); assertThat(response.getStatus()).isEqualTo(SC_OK); verifyEmail(); @@ -414,8 +412,7 @@ public class ConsoleRegistryLockActionTest { .setCreationRegistrarId("NewRegistrar") .setPersistedCurrentSponsorRegistrarId("NewRegistrar") .build()); - action = - createPostAction("otherregistrar.test", true, "registryLockPassword", Optional.empty()); + action = createPostAction("otherregistrar.test", true, "registryLockPassword", null); action.run(); assertThat(response.getStatus()).isEqualTo(SC_BAD_REQUEST); assertThat(response.getPayload()) @@ -444,7 +441,7 @@ public class ConsoleRegistryLockActionTest { @Test void testPost_failure_badPassword() throws Exception { - action = createPostAction("example.test", true, "badPassword", Optional.empty()); + action = createPostAction("example.test", true, "badPassword", null); action.run(); assertThat(response.getStatus()).isEqualTo(SC_UNAUTHORIZED); } @@ -483,29 +480,25 @@ public class ConsoleRegistryLockActionTest { } private ConsoleRegistryLockAction createDefaultPostAction(boolean isLock) { - return createPostAction("example.test", isLock, "registryLockPassword", Optional.empty()); + return createPostAction("example.test", isLock, "registryLockPassword", null); } private ConsoleRegistryLockAction createPostAction( - String domainName, boolean isLock, String password, Optional relockDurationMillis) { + String domainName, boolean isLock, String password, Long relockDurationMillis) { ConsoleApiParams params = createParams(); - when(params.request().getParameter("domainName")).thenReturn(domainName); - when(params.request().getParameterMap()) - .thenReturn(ImmutableMap.of("isLock", new String[] {String.valueOf(isLock)})); - when(params.request().getParameter("isLock")).thenReturn(String.valueOf(isLock)); - when(params.request().getParameter("password")).thenReturn(password); - relockDurationMillis.ifPresent( - duration -> - when(params.request().getParameter("relockDurationMillis")) - .thenReturn(String.valueOf(duration))); - return createGenericAction(params, "POST"); + ConsoleRegistryLockPostInput postInput = + new ConsoleRegistryLockPostInput(domainName, isLock, password, relockDurationMillis); + return createGenericAction(params, "POST", Optional.of(postInput)); } private ConsoleRegistryLockAction createGetAction() throws IOException { - return createGenericAction(createParams(), "GET"); + return createGenericAction(createParams(), "GET", Optional.empty()); } - private ConsoleRegistryLockAction createGenericAction(ConsoleApiParams params, String method) { + private ConsoleRegistryLockAction createGenericAction( + ConsoleApiParams params, + String method, + Optional optionalPostInput) { when(params.request().getMethod()).thenReturn(method); when(params.request().getServerName()).thenReturn("registrarconsole.tld"); when(params.request().getParameter("registrarId")).thenReturn("TheRegistrar"); @@ -516,7 +509,7 @@ public class ConsoleRegistryLockActionTest { new CloudTasksHelper(fakeClock).getTestCloudTasksUtils()); response = (FakeResponse) params.response(); return new ConsoleRegistryLockAction( - params, domainLockUtils, gmailClient, GSON, "TheRegistrar"); + params, domainLockUtils, gmailClient, GSON, optionalPostInput, "TheRegistrar"); } private ConsoleApiParams createParams() {